update niucloud

This commit is contained in:
全栈小学生 2023-06-08 18:19:04 +08:00
parent 5139129e29
commit 5d94d8ebdc
67 changed files with 956 additions and 1222 deletions

View File

@ -12,6 +12,7 @@
namespace app\adminapi\controller\login; namespace app\adminapi\controller\login;
use app\service\admin\auth\ConfigService; use app\service\admin\auth\ConfigService;
use app\service\core\upload\CoreImageService;
use core\base\BaseAdminController; use core\base\BaseAdminController;
use think\Response; use think\Response;

View File

@ -72,5 +72,50 @@ class Recharge extends BaseAdminController
return success($res); return success($res);
} }
/**
* 退款列表
* @return Response
*/
public function refundLists()
{
$data = $this->request->params([
['create_time', []],
['member_id', ''],
['refund_no', ''],
['status', ''],
['keywords', ''],
['order_no', ''],
]);
return success((new RechargeOrderRefundService())->getPage($data));
}
/**
* 退款详情
* @param int $order_id
* @return Response
*/
public function refundDetail(int $refund_id)
{
return success((new RechargeOrderRefundService())->getDetail($refund_id));
}
/**
* 查询退款状态
* @param $type
* @return Response
*/
public function refundStatus()
{
return success((new RechargeOrderRefundService())->getStatus());
}
/**
* 退款统计
*/
public function refundStat()
{
return success((new RechargeOrderRefundService())->stat());
}
} }

View File

@ -1,67 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | Niucloud-admin 企业快速开发的saas管理平台
// +----------------------------------------------------------------------
// | 官方网址https://www.niucloud-admin.com
// +----------------------------------------------------------------------
// | niucloud团队 版权所有 开源版本可自由商用
// +----------------------------------------------------------------------
// | Author: Niucloud Team
// +----------------------------------------------------------------------
namespace app\adminapi\controller\order;
use app\service\admin\order\RefundService;
use core\base\BaseAdminController;
use think\Response;
class Refund extends BaseAdminController
{
/**
* 退款列表
* @return Response
*/
public function lists()
{
$data = $this->request->params([
['create_time', []],
['member_id', ''],
['refund_no', ''],
['status', ''],
['keywords', ''],
['order_no', ''],
]);
return success((new RefundService())->getPage($data));
}
/**
* 退款详情
* @param int $order_id
* @return Response
*/
public function detail(int $refund_id)
{
return success((new RefundService())->getDetail($refund_id));
}
/**
* 查询退款状态
* @param $type
* @return Response
*/
public function status($type = 'recharge')
{
$data = $this->request->params([
['type', 'recharge']
]);
return success((new RefundService())->getStatus($data['type']));
}
/**
* 退款统计
*/
public function stat()
{
return success((new RefundService())->stat());
}
}

View File

@ -1,64 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | Niucloud-admin 企业快速开发的saas管理平台
// +----------------------------------------------------------------------
// | 官方网址https://www.niucloud-admin.com
// +----------------------------------------------------------------------
// | niucloud团队 版权所有 开源版本可自由商用
// +----------------------------------------------------------------------
// | Author: Niucloud Team
// +----------------------------------------------------------------------
namespace app\adminapi\controller\pay;
use app\service\admin\pay\PayConfigService;
use core\base\BaseAdminController;
use think\Response;
class Config extends BaseAdminController
{
/**
* 获取支付设置
* @return Response
*/
public function get($type){
return success((new PayConfigService())->getConfigByType($type));
}
/**
* 支付设置
* @return Response
*/
public function set($type){
$data = $this->request->params([
['status', 0],
//支付宝配置
['app_id', ''],
['app_secret_cert', ''],
['app_public_cert_path', ''],
['alipay_public_cert_path', ''],
['alipay_root_cert_path', ''],
//微信配置
['mch_id', ''],
['mch_secret_key', ''],
['mch_secret_cert', ''],
['mch_public_cert_path', ''],
]);
$this->validate(array_merge($data, ['type' => $type]), 'app\validate\pay\Pay.set');
(new PayConfigService())->setConfigByType($type, $data);
return success();
}
/**
* 支付方式列表
* @return Response
*/
public function lists(){
return success((new PayConfigService())->getPayConfigList());
}
}

View File

@ -104,4 +104,23 @@ class Config extends BaseAdminController
public function getServiceInfo(){ public function getServiceInfo(){
return success((new ConfigService())->getService()); return success((new ConfigService())->getService());
} }
/**设置版权信息
* @return Response
*/
public function setMap(){
$data = $this->request->params([
['key', ''],
]);
(new ConfigService())->setMap($data);
return success();
}
/**
* 获取地图设置
* @return Response
*/
public function getMap(){
return success((new ConfigService())->getMap());
}
} }

View File

@ -1,8 +1,11 @@
<?php <?php
// 全局中间件定义文件 // 全局中间件定义文件
use app\adminapi\middleware\AllowCrossDomain; use app\adminapi\middleware\AllowCrossDomain;
use think\middleware\LoadLangPack;
return [ return [
//跨域请求中间件 //跨域请求中间件
AllowCrossDomain::class, AllowCrossDomain::class,
//语言中间件
LoadLangPack::class,
]; ];

View File

@ -30,6 +30,14 @@ Route::group('order', function () {
Route::get('recharge/stat', 'order.Recharge/stat'); Route::get('recharge/stat', 'order.Recharge/stat');
// 订单发起退款 // 订单发起退款
Route::put('recharge/refund/:order_id', 'order.Recharge/refund'); Route::put('recharge/refund/:order_id', 'order.Recharge/refund');
//退款订单列表
Route::get('recharge/refund', 'order.Recharge/refundLists');
//退款订单详情
Route::get('recharge/refund/:refund_id', 'order.Recharge/refundDetail');
//退款订单状态
Route::get('recharge/refund/status', 'order.Recharge/refundStatus');
//退款订单统计
Route::get('recharge/refund/stat', 'order.Recharge/refundStat');
})->middleware([ })->middleware([
AdminCheckToken::class, AdminCheckToken::class,
AdminCheckRole::class, AdminCheckRole::class,

View File

@ -19,13 +19,7 @@ use think\facade\Route;
* 支付相关路由 * 支付相关路由
*/ */
Route::group('pay', function () { Route::group('pay', function () {
/***************************************************** 系统整体信息 *************************************************/
//设置支付配置
Route::put('config/:type', 'pay.Config/set');
//获取支付配置
Route::get('config/:type', 'pay.Config/get');
//获取支付方式列表
Route::get('lists', 'pay.Config/lists');
/***************************************************** 支付渠道 *************************************************/ /***************************************************** 支付渠道 *************************************************/
//渠道列表 //渠道列表
Route::get('channel/lists', 'pay.PayChannel/lists'); Route::get('channel/lists', 'pay.PayChannel/lists');

View File

@ -1,35 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | Niucloud-admin 企业快速开发的saas管理平台
// +----------------------------------------------------------------------
// | 官方网址https://www.niucloud-admin.com
// +----------------------------------------------------------------------
// | niucloud团队 版权所有 开源版本可自由商用
// +----------------------------------------------------------------------
// | Author: Niucloud Team
// +----------------------------------------------------------------------
use app\adminapi\middleware\AdminCheckRole;
use app\adminapi\middleware\AdminCheckToken;
use app\adminapi\middleware\AdminLog;
use think\facade\Route;
/**
* 退款相关路由
*/
Route::group('refund', function () {
/***************************************************** 退款 *************************************************/
//退款列表
Route::get('refund', 'order.Refund/lists');
//退款详情
Route::get('refund/:refund_id', 'order.Refund/detail');
//退款状态
Route::get('status', 'order.Refund/status');
//退款状态
Route::get('stat', 'order.Refund/stat');
})->middleware([
AdminCheckToken::class,
AdminCheckRole::class,
AdminLog::class
]);

View File

@ -67,6 +67,11 @@ Route::group('sys', function () {
//版权设置 //版权设置
Route::put('config/copyright', 'sys.Config/setCopyright'); Route::put('config/copyright', 'sys.Config/setCopyright');
//地图设置
Route::put('config/map', 'sys.Config/setMap');
//地图设置
Route::get('config/map', 'sys.Config/getMap');
//登录注册设置 //登录注册设置
Route::get('config/login', 'login.Config/getConfig'); Route::get('config/login', 'login.Config/getConfig');
//登录注册设置 //登录注册设置

View File

@ -1,7 +1,10 @@
<?php <?php
// 全局中间件定义文件 // 全局中间件定义文件
use app\api\middleware\AllowCrossDomain; use app\api\middleware\AllowCrossDomain;
use think\middleware\LoadLangPack;
return [ return [
//跨域请求中间件 //跨域请求中间件
AllowCrossDomain::class, AllowCrossDomain::class,
//语言中间件
LoadLangPack::class,
]; ];

View File

@ -42,9 +42,7 @@ function fail($msg = 'FAIL', ?array $data = [], int $code = 0, int $http_code =
*/ */
function get_lang($str) function get_lang($str)
{ {
$lang_config = config('lang') ?? []; return Lang::get($str);
$range = cookie($lang_config['cookie_var']) ?? 'zh-cn';
return Lang::get($str, [], $range);
} }

View File

@ -67,7 +67,7 @@
'is_show' => 1, 'is_show' => 1,
], ],
[ [
'menu_name' => '站点用户', 'menu_name' => '站点管理员',
'menu_key' => 'site_user', 'menu_key' => 'site_user',
'menu_type' => 1, 'menu_type' => 1,
'icon' => 'element-User', 'icon' => 'element-User',
@ -245,7 +245,7 @@
], ],
[ [
'menu_name' => '管理员', 'menu_name' => '平台管理员',
'menu_key' => 'auth_user', 'menu_key' => 'auth_user',
'menu_type' => 1, 'menu_type' => 1,
'icon' => 'iconfont-iconyonghu', 'icon' => 'iconfont-iconyonghu',
@ -515,7 +515,7 @@
], ],
[ [
'menu_name' => '环境检测', 'menu_name' => '环境检测',
'menu_key' => 'iconfont-iconsixingjiance', 'menu_key' => 'tools_check_environment',
'menu_type' => 1, 'menu_type' => 1,
'icon' => 'element-SetUp', 'icon' => 'element-SetUp',
'api_url' => '', 'api_url' => '',

View File

@ -360,6 +360,105 @@ return
], ],
], ],
], ],
[
'menu_name' => '订单管理',
'menu_key' => 'order',
'menu_type' => 0,
'icon' => 'iconfont-icondingdan',
'api_url' => '',
'router_path' => 'order',
'view_path' => '',
'methods' => '',
'sort' => 65,
'status' => 1,
'is_show' => 1,
'children' => [
[
'menu_name' => '充值订单',
'menu_key' => 'recharge_order',
'menu_type' => 0,
'icon' => 'element-Help',
'api_url' => 'recharge',
'router_path' => 'recharge',
'view_path' => '',
'methods' => 'get',
'sort' => 100,
'status' => 1,
'is_show' => 1,
'children' => [
[
'menu_name' => '订单列表',
'menu_key' => 'recharge_order_list',
'menu_type' => 1,
'icon' => '',
'api_url' => 'recharge',
'router_path' => 'order',
'view_path' => 'order/recharge/list',
'methods' => 'get',
'sort' => 100,
'status' => 1,
'is_show' => 1,
'children' => [
[
'menu_name' => '退款',
'menu_key' => 'recharge_refund',
'menu_type' => 2,
'icon' => '',
'api_url' => 'order/refund/<id>',
'router_path' => '',
'view_path' => '',
'methods' => 'put',
'sort' => 100,
'status' => 1,
'is_show' => 0,
],
]
],
[
'menu_name' => '订单详情',
'menu_key' => 'recharge_order_detail',
'menu_type' => 1,
'icon' => '',
'api_url' => 'order/recharge/<order_id>',
'router_path' => 'detail',
'view_path' => 'order/recharge/detail',
'methods' => 'get',
'sort' => 90,
'status' => 1,
'is_show' => 0,
],
[
'menu_name' => '退款记录',
'menu_key' => 'recharge_refund_list',
'menu_type' => 1,
'icon' => 'iconfont-icontuikuanjilu',
'api_url' => 'order/refund',
'router_path' => 'refund',
'view_path' => 'order/recharge/refund',
'methods' => 'get',
'sort' => 90,
'status' => 1,
'is_show' => 1,
'children' => [
[
'menu_name' => '退款详情',
'menu_key' => 'recharge_refund_detail',
'menu_type' => 2,
'icon' => '',
'api_url' => 'order/refund/<id>',
'router_path' => '',
'view_path' => '',
'methods' => 'get',
'sort' => 100,
'status' => 1,
'is_show' => 0,
]
]
]
]
]
]
],
[ [
'menu_name' => '财务管理', 'menu_name' => '财务管理',
'menu_key' => 'finance', 'menu_key' => 'finance',
@ -373,47 +472,6 @@ return
'status' => 1, 'status' => 1,
'is_show' => 1, 'is_show' => 1,
'children' => [ 'children' => [
[
'menu_name' => '会员充值',
'menu_key' => 'recharge_list',
'menu_type' => 1,
'icon' => 'element-Help',
'api_url' => 'order/recharge',
'router_path' => 'recharge',
'view_path' => 'finance/recharge/list',
'methods' => 'get',
'sort' => 100,
'status' => 1,
'is_show' => 1,
'children' => [
[
'menu_name' => '退款',
'menu_key' => 'refund',
'menu_type' => 2,
'icon' => '',
'api_url' => 'order/refund/<id>',
'router_path' => '',
'view_path' => '',
'methods' => 'put',
'sort' => 100,
'status' => 1,
'is_show' => 0,
],
]
],
[
'menu_name' => '充值详情',
'menu_key' => 'recharge_order_info',
'menu_type' => 1,
'icon' => '',
'api_url' => 'order/recharge/<order_id>',
'router_path' => 'recharge/detail',
'view_path' => 'finance/recharge/detail',
'methods' => 'get',
'sort' => 90,
'status' => 1,
'is_show' => 0,
],
[ [
'menu_name' => '会员提现', 'menu_name' => '会员提现',
'menu_key' => 'cash_out_list', 'menu_key' => 'cash_out_list',
@ -426,35 +484,6 @@ return
'sort' => 99, 'sort' => 99,
'status' => 1, 'status' => 1,
'is_show' => 1, 'is_show' => 1,
],
[
'menu_name' => '退款记录',
'menu_key' => 'refund_list',
'menu_type' => 1,
'icon' => 'iconfont-icontuikuanjilu',
'api_url' => 'order/refund',
'router_path' => 'refund',
'view_path' => 'order/refund',
'methods' => 'get',
'sort' => 90,
'status' => 1,
'is_show' => 1,
'children' => [
[
'menu_name' => '退款详情',
'menu_key' => 'refund_detail',
'menu_type' => 2,
'icon' => '',
'api_url' => 'order/refund/<id>',
'router_path' => '',
'view_path' => '',
'methods' => 'get',
'sort' => 100,
'status' => 1,
'is_show' => 0,
],
]
] ]
] ]
], ],
@ -1136,10 +1165,23 @@ return
'sort' => 11, 'sort' => 11,
'status' => 1, 'status' => 1,
'is_show' => 1, 'is_show' => 1,
] ]
] ]
], ],
[
'menu_name' => '地图设置',
'menu_key' => 'map_setting',
'menu_type' => 1,
'icon' => 'element-Message',
'api_url' => 'sys/config/map',
'router_path' => 'map',
'view_path' => 'setting/map',
'methods' => 'get',
'sort' => 99,
'status' => 1,
'is_show' => 1,
]
] ]
] ]
]; ];

View File

@ -1,57 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | Niucloud-admin 企业快速开发的saas管理平台
// +----------------------------------------------------------------------
// | 官方网址https://www.niucloud-admin.com
// +----------------------------------------------------------------------
// | niucloud团队 版权所有 开源版本可自由商用
// +----------------------------------------------------------------------
// | Author: Niucloud Team
// +----------------------------------------------------------------------
namespace app\dict\order;
/**
* 订单类型整体功能
* Class OrderRefundDict
* @package app\dict\order
*/
class OrderRefundDict
{
const WAIT = '1';//待审核
const WAIT_TRANSFER = '2';//待退款
const SUCCESS = '3';//退款成功
const FAIL = '-1';//退款失败
/**
* 退款状态
* @param $status
* @return mixed
*/
public static function getStatus($status = []){
$list = [
self::WAIT => [
'name' => get_lang('dict_refund.wait'),
'key' => self::WAIT,
],
self::WAIT_TRANSFER => [
'name' => get_lang('dict_refund.wait_transfer'),
'key' => self::WAIT,
],
self::SUCCESS => [
'name' => get_lang('dict_refund.success'),
'key' => self::WAIT,
],
self::FAIL => [
'name' => get_lang('dict_refund.fail'),
'key' => self::FAIL,
]
];
foreach($list as $k => $v){
if(!empty($status) && !in_array($k, $status)) unset($list[$k]);
}
return $list;
}
}

View File

@ -31,18 +31,16 @@ $system_event = [
'Scan' => [ 'app\listener\scan\ScanListener' ], 'Scan' => [ 'app\listener\scan\ScanListener' ],
'AddSiteAfter' => [ 'app\listener\site\AddSiteAfterListener' ], 'AddSiteAfter' => [ 'app\listener\site\AddSiteAfterListener' ],
/**
* 消息相关事件
*/
/** /**
* 支付相关事件 * 支付相关事件
*/ */
//支付成功
'PaySuccess' => [ 'app\listener\pay\PaySuccessListener' ], 'PaySuccess' => [ 'app\listener\pay\PaySuccessListener' ],
//退款成功
'RefundSuccess' => [ 'app\listener\pay\RefundSuccessListener' ],
//转账成功
'TransferSuccess' => [ 'app\listener\pay\TransferSuccessListener' ], 'TransferSuccess' => [ 'app\listener\pay\TransferSuccessListener' ],
/**
* 订单相关事件
*/
// 任务失败统一回调,有四种定义方式 // 任务失败统一回调,有四种定义方式
'queue_failed'=> [ 'queue_failed'=> [

View File

@ -1359,7 +1359,7 @@ CREATE TABLE article (
author varchar(255) NOT NULL DEFAULT '' COMMENT '作者', author varchar(255) NOT NULL DEFAULT '' COMMENT '作者',
content text DEFAULT NULL COMMENT '文章内容', content text DEFAULT NULL COMMENT '文章内容',
visit int(11) NOT NULL DEFAULT 0 COMMENT '实际浏览量', visit int(11) NOT NULL DEFAULT 0 COMMENT '实际浏览量',
visit_virtual int(11) NOT NULL DEFAULT 0 COMMENT '虚拟浏览量', visit_virtual int(11) NOT NULL DEFAULT 0 COMMENT '初始浏览量',
is_show tinyint(4) NOT NULL DEFAULT 1 COMMENT '是否显示:1-是.0-否', is_show tinyint(4) NOT NULL DEFAULT 1 COMMENT '是否显示:1-是.0-否',
sort int(11) NOT NULL DEFAULT 0 COMMENT '排序', sort int(11) NOT NULL DEFAULT 0 COMMENT '排序',
create_time int(11) NOT NULL DEFAULT 0 COMMENT '创建时间', create_time int(11) NOT NULL DEFAULT 0 COMMENT '创建时间',

View File

@ -144,4 +144,130 @@ return [
'status_success' => 'success', 'status_success' => 'success',
'status_fail' => 'fail', 'status_fail' => 'fail',
], ],
'dict_menu_admin' => [
'overview' => 'overview',
'site' => 'site',
'site_list' => 'site list',
'site_info' => 'site info',
'site_group' => 'site package',
'site_user' => 'site user',
'auth' => 'auth',
'menu_list' => 'menu manage',
'auth_menu' => 'admin menu',
'auth_menu_add' => 'add',
'auth_menu_update' => 'edit',
'auth_menu_del' => 'delete',
'auth_menu_info' => 'info',
'auth_site_menu' => 'site menu',
'auth_site_menu_add' => 'add',
'auth_site_menu_update' => 'edit',
'auth_site_menu_del' => 'delete',
'auth_site_menu_info' => 'info',
'auth_user' => 'manager',
'auth_user_add' => 'add',
'auth_user_update' => 'edit',
'auth_user_del' => 'delete',
'auth_user_info' => 'info',
'auth_role' => 'role manage',
'auth_role_add' => 'add',
'auth_role_update' => 'edit',
'auth_role_del' => 'delete',
'auth_log' => 'log',
'setting' => 'system config',
'setting_system' => 'web config',
'setting_copyright' => 'copyright config',
'setting_login' => 'login config',
'setting_storage' => 'storage config',
'setting_oplatform' => 'wechat platform',
'tool' => 'develop tools',
'code' => 'generator',
'code_edit' => 'table edit',
'tools_Update_cache' => 'update cache',
'tools_check_environment' => 'check environment',
'app_store' => 'app market'
],
'dict_menu_site' => [
'overview' => 'overview',
'diy' => 'diy manage',
'diy_page_index' => 'diy index',
'diy_page_member' => 'diy member',
'diy_page_update' => 'save',
'diy_page_list' => 'page manage',
'diy_bottom' => 'bottom config',
'diy_tabbar_update' => 'save',
'attachment' => 'attachment',
'decorate' => 'decorate',
'page_decorate' => 'page decorate',
'article' => 'article',
'article_list' => 'article list',
'article_edit' => 'article edit',
'article_category' => 'article category',
'member' => 'member',
'member_list' => 'member list',
'member_update' => 'edit',
'member_info' => 'member detail',
'member_label' => 'member label',
'member_label_update' => 'edit label',
'member_label_add' => 'add label',
'member_label_delete' => 'delete label',
'member_point' => 'member point',
'member_balance' => 'member balance',
'member_commission' => 'member commission',
'order' => 'order',
'recharge_order' => 'recharge order',
'recharge_order_list' => 'order list',
'recharge_refund' => 'refund',
'recharge_order_detail' => 'order detail',
'recharge_refund_list' => 'refund list',
'recharge_refund_detail' => 'refund detail',
'finance' => 'finance manage',
'cash_out_list' => 'member cashout',
'addon' => 'app manage',
'addon_list' => 'addon list',
'channel' => 'channel manage',
'channel_pc' => 'pc manage',
'pc_config' => 'pc config',
'channel_h5' => 'h5 manage',
'h5_config' => 'h5 config',
'channel_wechat' => 'wechat manage',
'wechat_config' => 'wechat config',
'wechat_menu' => 'wechat menu',
'wechat_template_message' => 'template manage',
'channel_weapp' => 'weapp manage',
'weapp_config' => 'weapp config',
'weapp_template_message' => 'weapp message',
'channel_aliapp' => 'aliapp manage',
'aliapp_config' => 'aliapp config',
'auth' => 'auth manage',
'auth_user' => 'manager',
'auth_user_add' => 'add',
'auth_user_update' => 'edit',
'auth_user_del' => 'delete',
'auth_user_info' => 'detail',
'auth_role' => 'role manage',
'auth_role_add' => 'add',
'auth_role_update' => 'edit',
'auth_role_del' => 'delete',
'auth_log' => 'log',
'setting' => 'system config',
'setting_system' => 'web config',
'system_agreement' => 'agreement manage',
'system_agreement_edit' => 'edit agreement',
'setting_login_register' => 'login config',
'setting_member' => 'member config',
'setting_pay' => 'pay manage',
'setting_pay_channel' => 'pay config',
'setting_pay_channel_set' => 'config',
'setting_pay_transfer' => 'transfer config',
'setting_pay_transfer_set' => 'config',
'cash_out_config' => 'cashout config',
'setting_notice' => 'notice manage',
'setting_notice_template' => 'notice template',
'setting_notice_records' => 'send log',
'sms_notice' => 'sms manage',
'sms_setting' => 'sms config',
'sms_notice_records' => 'send log',
'map_setting' => 'map config',
],
]; ];

View File

@ -2,9 +2,6 @@
namespace app\listener\notice_template; namespace app\listener\notice_template;
use app\service\core\order\CoreOrderRefundService;
use app\service\core\order\CoreOrderService;
use core\exception\NoticeException;
/** /**
* 会员验证码 * 会员验证码

View File

@ -3,7 +3,7 @@
namespace app\listener\notice_template; namespace app\listener\notice_template;
use app\service\core\member\CoreMemberService; use app\service\core\member\CoreMemberService;
use app\service\core\order\CoreOrderService; use app\service\core\order\recharge\CoreRechargeOrderService;
class RechargeSuccess extends BaseNoticeTemplate class RechargeSuccess extends BaseNoticeTemplate
{ {
@ -17,8 +17,8 @@ class RechargeSuccess extends BaseNoticeTemplate
$site_id = $params['site_id']; $site_id = $params['site_id'];
$order_id = $data['order_id']; $order_id = $data['order_id'];
$core_order_service = new CoreOrderService(); $core_order_service = new CoreRechargeOrderService();
$order = $core_order_service->getOrderInfo($site_id, $order_id); $order = $core_order_service->orderInfo($site_id, $order_id);
if (!empty($order)){ if (!empty($order)){
$member = (new CoreMemberService())->getInfoByMemberId($site_id, $order['member_id']); $member = (new CoreMemberService())->getInfoByMemberId($site_id, $order['member_id']);
//通过订单id查询订单信息 //通过订单id查询订单信息

View File

@ -11,8 +11,6 @@
namespace app\listener\pay; namespace app\listener\pay;
use app\dict\order\RechargeOrderDict;
use app\service\core\order\recharge\CoreRechargeOrderService; use app\service\core\order\recharge\CoreRechargeOrderService;
/** /**
@ -23,10 +21,9 @@ class PaySuccessListener
public function handle(array $pay_info) public function handle(array $pay_info)
{ {
$trade_type = $pay_info['trade_type'] ?? ''; $trade_type = $pay_info['trade_type'] ?? '';
switch($trade_type){ if($trade_type == 'recharge')
case RechargeOrderDict::getOrderType()['type']: {
return (new CoreRechargeOrderService())->pay($pay_info); (new CoreRechargeOrderService())->pay($pay_info);
break;
} }
} }
} }

View File

@ -9,24 +9,22 @@
// | Author: Niucloud Team // | Author: Niucloud Team
// +---------------------------------------------------------------------- // +----------------------------------------------------------------------
namespace app\dict\order; namespace app\listener\pay;
use app\service\core\order\recharge\CoreRechargeOrderService;
use app\service\core\order\recharge\CoreRechargeRefundService;
/** /**
* 订单类型整体功能 * 退款成功事件
* Class OrderTypeDict
* @package app\dict\member
*/ */
class OrderTypeDict class RefundSuccessListener
{ {
public function handle(array $refund_info)
/** {
* 查询订单适配的支付方式 $trade_type = $refund_info['trade_type'] ?? '';
* @param $type if($trade_type == 'recharge')
* @return void {
*/ (new CoreRechargeRefundService())->refundComplete($refund_info['refund_no']);
public static function getAllowPayType($type){ }
/** @var RechargeOrderDict $class */
$class = __NAMESPACE__ . '\\' . ucfirst(strtolower($type)).'OrderDict';
return $class::ALLOW_PAY;
} }
} }

View File

@ -1,6 +1,5 @@
<?php <?php
// 全局中间件定义文件 // 全局中间件定义文件
use app\middleware\AllowCrossDomain;
use think\middleware\LoadLangPack; use think\middleware\LoadLangPack;
return [ return [

View File

@ -99,7 +99,7 @@ class Article extends BaseModel
} }
public function getArticleUrlAttr($value, $data) { public function getArticleUrlAttr($value, $data) {
$site_tag = '/s' . $data['site_id']; $site_tag = $data['site_id'] == 1 ? '' : '/s' . $data['site_id'];
$data = [ $data = [
'wap_url' => ( !empty(env("system.wap_domain")) ? env("system.wap_domain") : request()->domain() ) . "/wap" . $site_tag . "/pages/article/detail?id={$data['id']}", 'wap_url' => ( !empty(env("system.wap_domain")) ? env("system.wap_domain") : request()->domain() ) . "/wap" . $site_tag . "/pages/article/detail?id={$data['id']}",
'web_url' => ( !empty(env("system.web_domain")) ? env("system.web_domain") : request()->domain() ) . "/web" . $site_tag . "/article/detail?id={$data['id']}" 'web_url' => ( !empty(env("system.web_domain")) ? env("system.web_domain") : request()->domain() ) . "/web" . $site_tag . "/article/detail?id={$data['id']}"

View File

@ -17,11 +17,11 @@ use app\model\pay\Pay;
use core\base\BaseModel; use core\base\BaseModel;
/** /**
* 订单模型 * 充值订单模型
* Class Order * Class RechargeOrder
* @package app\model\order * @package app\model\order
*/ */
class Order extends BaseModel class RechargeOrder extends BaseModel
{ {
/** /**
@ -34,7 +34,7 @@ class Order extends BaseModel
* 模型名称 * 模型名称
* @var string * @var string
*/ */
protected $name = 'order'; protected $name = 'recharge_order';
//类型 //类型
protected $type = [ protected $type = [
@ -42,37 +42,6 @@ class Order extends BaseModel
'close_time' => 'timestamp', 'close_time' => 'timestamp',
]; ];
/**
* 订单状态名称
* @param $value
* @param $data
* @return mixed|string
*/
public function getOrderStatusInfoAttr($value, $data)
{
if(isset($data['order_type']) && isset($data['order_status']))
{
$class = "app\\dict\\order\\". ucfirst($data['order_type']).'OrderDict';
return $class::getStatus($data['order_status']);
}else
return [];
}
/**
* 获取退款状态
* @param $value
* @param $data
* @return void
*/
public function getRefundStatusNameAttr($value, $data) {
if(isset($data['order_type']) && isset($data['refund_status']))
{
$class = "app\\dict\\order\\". ucfirst($data['order_type']).'OrderDict';
return $class::getRefundStatus($data['refund_status'])['name'] ?? '';
} else {
return '';
}
}
/** /**
* 登录渠道字段转化 * 登录渠道字段转化
@ -228,7 +197,7 @@ class Order extends BaseModel
*/ */
public function item() public function item()
{ {
return $this->hasMany(OrderItem::class,'order_id', 'order_id'); return $this->hasMany(RechargeOrderItem::class,'order_id', 'order_id');
} }
/** /**

View File

@ -18,7 +18,7 @@ use core\base\BaseModel;
* Class OrderItem * Class OrderItem
* @package app\model\order * @package app\model\order
*/ */
class OrderItem extends BaseModel class RechargeOrderItem extends BaseModel
{ {
/** /**
@ -31,14 +31,14 @@ class OrderItem extends BaseModel
* 模型名称 * 模型名称
* @var string * @var string
*/ */
protected $name = 'order_item'; protected $name = 'recharge_order_item';
/** /**
* @return HasOne * @return HasOne
*/ */
public function orderNo() public function orderNo()
{ {
return $this->hasOne(Order::class, 'order_id', 'order_id')->joinType('left')->withField('order_id, order_no')->bind(['order_no' => 'order_no']); return $this->hasOne(RechargeOrder::class, 'order_id', 'order_id')->joinType('left')->withField('order_id, order_no')->bind(['order_no' => 'order_no']);
} }
/** /**
* 数量字段处理 * 数量字段处理
@ -58,6 +58,6 @@ class OrderItem extends BaseModel
* @return void * @return void
*/ */
public function ordermain(){ public function ordermain(){
return $this->hasOne(Order::class, 'order_id')->joinType('inner'); return $this->hasOne(RechargeOrder::class, 'order_id')->joinType('inner');
} }
} }

View File

@ -11,6 +11,7 @@
namespace app\model\order; namespace app\model\order;
use app\dict\order\RechargeOrderDict;
use app\model\member\Member; use app\model\member\Member;
use app\model\pay\Refund; use app\model\pay\Refund;
use core\base\BaseModel; use core\base\BaseModel;
@ -20,7 +21,7 @@ use core\base\BaseModel;
* Class OrderItem * Class OrderItem
* @package app\model\order * @package app\model\order
*/ */
class OrderItemRefund extends BaseModel class RechargeOrderItemRefund extends BaseModel
{ {
//类型 //类型
protected $type = [ protected $type = [
@ -39,7 +40,7 @@ class OrderItemRefund extends BaseModel
* 模型名称 * 模型名称
* @var string * @var string
*/ */
protected $name = 'order_item_refund'; protected $name = 'recharge_order_item_refund';
/** /**
* 退款状态字段处理 * 退款状态字段处理
@ -48,9 +49,7 @@ class OrderItemRefund extends BaseModel
*/ */
public function getStatusNameAttr($value, $data) public function getStatusNameAttr($value, $data)
{ {
$class = "\\app\\dict\\order\\" . ucfirst($data['item_type']). "OrderDict"; return RechargeOrderDict::getRefundStatus()[$data['status'] ?? '']['name'] ?? '';
if (!class_exists($class)) return '';
return $class::getRefundStatus()[$data['status'] ?? '']['name'] ?? '';
} }
/** /**
@ -58,7 +57,7 @@ class OrderItemRefund extends BaseModel
* @return \think\model\relation\HasOne * @return \think\model\relation\HasOne
*/ */
public function item() { public function item() {
return $this->hasOne(OrderItem::class, 'order_item_id', 'order_item_id')->joinType('inner'); return $this->hasOne(RechargeOrderItem::class, 'order_item_id', 'order_item_id')->joinType('inner');
} }
/** /**
@ -114,7 +113,7 @@ class OrderItemRefund extends BaseModel
public function searchJoinOrderNoAttr($query, $value, $data) public function searchJoinOrderNoAttr($query, $value, $data)
{ {
if ($value) { if ($value) {
$query->where('order_item_refund.order_no', '=', $value); $query->where('recharge_order_item_refund.order_no', '=', $value);
} }
} }
@ -140,7 +139,7 @@ class OrderItemRefund extends BaseModel
public function searchJoinMemberIdAttr($query, $value, $data) public function searchJoinMemberIdAttr($query, $value, $data)
{ {
if ($value) { if ($value) {
$query->where('order_item_refund.member_id', '=', $value); $query->where('recharge_order_item_refund.member_id', '=', $value);
} }
} }
@ -166,7 +165,7 @@ class OrderItemRefund extends BaseModel
public function searchJoinStatusAttr($query, $value, $data) public function searchJoinStatusAttr($query, $value, $data)
{ {
if ($value != '') { if ($value != '') {
$query->where('order_item_refund.status', '=', $value); $query->where('recharge_order_item_refund.status', '=', $value);
} }
} }
@ -196,11 +195,11 @@ class OrderItemRefund extends BaseModel
$start_time = empty($value[0]) ? 0 : strtotime($value[0]) ; $start_time = empty($value[0]) ? 0 : strtotime($value[0]) ;
$end_time = empty($value[1]) ? 0 : strtotime($value[1]) ; $end_time = empty($value[1]) ? 0 : strtotime($value[1]) ;
if($start_time > 0 && $end_time > 0){ if($start_time > 0 && $end_time > 0){
$query->whereBetweenTime('order_item_refund.create_time', $start_time, $end_time); $query->whereBetweenTime('recharge_order_item_refund.create_time', $start_time, $end_time);
}else if($start_time > 0 && $end_time == 0){ }else if($start_time > 0 && $end_time == 0){
$query->where([['order_item_refund.create_time', '>=', $start_time]]); $query->where([['recharge_order_item_refund.create_time', '>=', $start_time]]);
}else if($start_time == 0 && $end_time > 0){ }else if($start_time == 0 && $end_time > 0){
$query->where([['order_item_refund.create_time', '<=', $end_time]]); $query->where([['recharge_order_item_refund.create_time', '<=', $end_time]]);
} }
} }
} }

View File

@ -18,7 +18,7 @@ use core\base\BaseModel;
* Class OrderLog * Class OrderLog
* @package app\model\order * @package app\model\order
*/ */
class OrderLog extends BaseModel class RechargeOrderLog extends BaseModel
{ {
/** /**
@ -31,7 +31,7 @@ class OrderLog extends BaseModel
* 模型名称 * 模型名称
* @var string * @var string
*/ */
protected $name = 'order_log'; protected $name = 'recharge_order_log';
} }

View File

@ -11,7 +11,6 @@
namespace app\model\pay; namespace app\model\pay;
use app\dict\order\OrderTypeDict;
use app\dict\pay\PayDict; use app\dict\pay\PayDict;
use core\base\BaseModel; use core\base\BaseModel;
@ -56,16 +55,6 @@ class Pay extends BaseModel
{ {
return PayDict::getStatus()[$data['status'] ?? ''] ?? ''; return PayDict::getStatus()[$data['status'] ?? ''] ?? '';
} }
/**
* 支持的支付方式
* @param $value
* @param $data
* @return void
*/
public function getPayTypeListAttr($value, $data){
return OrderTypeDict::getAllowPayType($data['trade_type']);
}
/** /**
* 支付方式字段转化 * 支付方式字段转化
* @param $value * @param $value

View File

@ -12,6 +12,7 @@
namespace app\service\admin\file; namespace app\service\admin\file;
use app\dict\sys\FileDict; use app\dict\sys\FileDict;
use app\dict\sys\StorageDict;
use app\service\core\upload\CoreUploadService; use app\service\core\upload\CoreUploadService;
use core\base\BaseAdminService; use core\base\BaseAdminService;
use core\exception\UploadFileException; use core\exception\UploadFileException;
@ -62,6 +63,6 @@ class UploadService extends BaseAdminService
throw new UploadFileException('CERT_TYPE_ERROR'); throw new UploadFileException('CERT_TYPE_ERROR');
$dir = $this->root_path.'/document/'.$type.'/'.$this->site_id.'/'.date('Ym').'/'.date('d'); $dir = $this->root_path.'/document/'.$type.'/'.$this->site_id.'/'.date('Ym').'/'.date('d');
$core_upload_service = new CoreUploadService(); $core_upload_service = new CoreUploadService();
return $core_upload_service->document($file, $this->site_id, $type, $dir, true, true); return $core_upload_service->document($file, $this->site_id, $type, $dir, StorageDict::LOCAL, true);
} }
} }

View File

@ -1,5 +1,13 @@
<template> <template>
<div class="main-container"> <div class="main-container">
<div class="detail-head">
<div class="left" @click="back()">
<span class="iconfont iconxiangzuojiantou !text-xs"></span>
<span class="ml-[1px]">{{t('returnToPreviousPage')}}</span>
</div>
<span class="adorn">|</span>
<span class="right">{{ pageName }}</span>
</div>
<el-card class="box-card !border-none" shadow="never"> <el-card class="box-card !border-none" shadow="never">
<el-form :model="formData" label-width="90px" ref="formRef" :rules="formRules" class="page-form"> <el-form :model="formData" label-width="90px" ref="formRef" :rules="formRules" class="page-form">
{FORM_VIEW} {FORM_VIEW}
@ -21,9 +29,10 @@ import type { FormInstance } from 'element-plus'
import { get{UCASE_NAME}Info,add{UCASE_NAME},edit{UCASE_NAME} } from '@/api/{MODULE_NAME}'; import { get{UCASE_NAME}Info,add{UCASE_NAME},edit{UCASE_NAME} } from '@/api/{MODULE_NAME}';
import { useRoute } from 'vue-router' import { useRoute } from 'vue-router'
const router = useRoute() const route = useRoute()
const id:number = parseInt(router.query.id); const id:number = parseInt(route.query.id);
const loading = ref(false) const loading = ref(false)
const pageName = route.meta.title
/** /**
* 表单数据 * 表单数据

View File

@ -11,6 +11,8 @@
namespace app\service\admin\order; namespace app\service\admin\order;
use app\dict\order\RechargeOrderDict;
use app\model\order\RechargeOrderItemRefund;
use app\service\core\order\recharge\CoreRechargeRefundService; use app\service\core\order\recharge\CoreRechargeRefundService;
use core\base\BaseAdminService; use core\base\BaseAdminService;
@ -24,6 +26,7 @@ class RechargeOrderRefundService extends BaseAdminService
public function __construct() public function __construct()
{ {
parent::__construct(); parent::__construct();
$this->model = new RechargeOrderItemRefund();
} }
public function create($order_id) { public function create($order_id) {
@ -34,4 +37,88 @@ class RechargeOrderRefundService extends BaseAdminService
return $e->getMessage(); return $e->getMessage();
} }
} }
/**
* 查询退款列表
* @param array $where
* @return mixed
*/
public function getPage(array $where) {
$field = 'recharge_order_item_refund.refund_id,recharge_order_item_refund.num,recharge_order_item_refund.money,recharge_order_item_refund.refund_no,recharge_order_item_refund.status,recharge_order_item_refund.create_time,recharge_order_item_refund.audit_time,recharge_order_item_refund.transfer_time,recharge_order_item_refund.item_type,recharge_order_item_refund.order_item_id, recharge_order_item_refund.order_id,recharge_order_item_refund.member_id,recharge_order_item_refund.order_no';
$member_where = [];
if(!empty($where['keywords']))
{
$member_where[] = ["member.member_id|member.nickname|member.mobile", '=', $where['keywords']];
}
$search_model = $this->model->where([['recharge_order_item_refund.site_id', '=', $this->site_id]])->with(['item' => function($query) {
$query->with('orderNo')->field('order_id, order_item_id, item_name, item_image');
}])->withSearch(['join_order_no' => 'order_no', 'join_status' => 'status', 'join_member_id' => 'member_id', 'refund_no' => 'refund_no', 'join_create_time' => 'create_time'],$where)->withJoin(['member' => function($query){
$query->field("member.nickname, member.headimg, member.mobile, member.member_id");
}
])->where($member_where)->field($field)->order('create_time desc')->append(['status_name', 'payrefund.type_name']);
return $this->pageQuery($search_model);
}
/**
* 查询退款详情
* @param int $refund_id
* @return void
*/
public function getDetail(int $refund_id) {
$field = 'refund_id,num,money,refund_no,status,create_time,audit_time,transfer_time,item_type,order_item_id, order_id,member_id';
$detail = $this->model->where([ ['site_id', '=', $this->site_id], ['refund_id', '=', $refund_id]])->field($field)->with(['item' => function($query) {
$query->field('order_item_id, item_name, item_image');
}, 'member' => function($query) {
$query->field('member_id, nickname, mobile, headimg');
}, 'payrefund' => function($query) {
$query->field('refund_no');
}])->append(['status_name', 'payrefund.type_name'])->findOrEmpty()->toArray();
return $detail;
}
/**
* 获取退款状态
* @return void
*/
public function getStatus(){
$status = RechargeOrderDict::getRefundStatus();
return $status;
}
/**
* 退款统计数据(根据状态查询)
*/
public function stat()
{
$status = RechargeOrderDict::getRefundStatus();
$all = 0;
$have = 0;
foreach ($status as $k => $v)
{
$money = $this->model->where([['status', '=', $v['status']], ['site_id', '=', $this->site_id]])->sum("money");
if($money == null)
{
$money = 0;
}
if($k == 1 || $k == 2){
$have = $have + $money;
}
$status[$k]['money'] = number_format($money, 2);
$all = $all + $money;
}
$status['all'] = [
'name' => get_lang('dict_refund.all'),
'key' => 'all',
'money' => number_format($all, 2)
];
$status['have'] = [
'name' => get_lang('dict_refund.have'),
'key' => 'all',
'money' => number_format($have, 2)
];
return $status;
}
} }

View File

@ -12,7 +12,7 @@
namespace app\service\admin\order; namespace app\service\admin\order;
use app\dict\order\RechargeOrderDict; use app\dict\order\RechargeOrderDict;
use app\model\order\Order; use app\model\order\RechargeOrder;
use core\base\BaseAdminService; use core\base\BaseAdminService;
/** /**
@ -25,7 +25,7 @@ class RechargeOrderService extends BaseAdminService
public function __construct() public function __construct()
{ {
parent::__construct(); parent::__construct();
$this->model = new Order(); $this->model = new RechargeOrder();
} }
/** /**
@ -44,8 +44,16 @@ class RechargeOrderService extends BaseAdminService
$query->field('member_id, nickname, mobile, headimg'); $query->field('member_id, nickname, mobile, headimg');
}, 'pay' => function($query) { }, 'pay' => function($query) {
$query->field(''); $query->field('');
} ])->order($order)->append(['order_status_info', 'order_from_name', 'refund_status_name' ]); } ])->order($order)->append(['order_from_name' ]);
return $this->pageQuery($search_model); $list = $this->pageQuery($search_model);
$order_status = RechargeOrderDict::getStatus();
$refund_status = RechargeOrderDict::getRefundStatus();
foreach ($list['data'] as $k => $v)
{
$list['data'][$k]['order_status_info'] = $order_status[$v['order_status']] ?? [];
$list['data'][$k]['refund_status_name'] = $refund_status[$v['refund_status']]['name'] ?? '';
}
return $list;
} }
/** /**
@ -62,7 +70,11 @@ class RechargeOrderService extends BaseAdminService
$query->field('member_id, nickname, mobile, headimg'); $query->field('member_id, nickname, mobile, headimg');
}, 'pay' => function($query) { }, 'pay' => function($query) {
$query->field(''); $query->field('');
} ])->append(['order_status_info', 'order_from_name'])->findOrEmpty()->toArray(); } ])->append(['order_from_name'])->findOrEmpty()->toArray();
if(!empty($detail))
{
$detail['order_status_info'] = RechargeOrderDict::getStatus($detail['order_status']) ?? [];
}
return $detail; return $detail;
} }

View File

@ -1,114 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | Niucloud-admin 企业快速开发的saas管理平台
// +----------------------------------------------------------------------
// | 官方网址https://www.niucloud-admin.com
// +----------------------------------------------------------------------
// | niucloud团队 版权所有 开源版本可自由商用
// +----------------------------------------------------------------------
// | Author: Niucloud Team
// +----------------------------------------------------------------------
namespace app\service\admin\order;
use app\dict\order\OrderRefundDict;
use app\model\order\OrderItemRefund;
use core\base\BaseAdminService;
/**
* 充值订单
* Class RechargeOrderService
* @package app\service\admin\order
*/
class RefundService extends BaseAdminService
{
public function __construct()
{
parent::__construct();
$this->model = new OrderItemRefund();
}
/**
* 查询退款列表
* @param array $where
* @return mixed
*/
public function getPage(array $where) {
$field = 'order_item_refund.refund_id,order_item_refund.num,order_item_refund.money,order_item_refund.refund_no,order_item_refund.status,order_item_refund.create_time,order_item_refund.audit_time,order_item_refund.transfer_time,order_item_refund.item_type,order_item_refund.order_item_id, order_item_refund.order_id,order_item_refund.member_id,order_item_refund.order_no';
$member_where = [];
if(!empty($where['keywords']))
{
$member_where[] = ["member.member_id|member.nickname|member.mobile", '=', $where['keywords']];
}
$search_model = $this->model->where([['order_item_refund.site_id', '=', $this->site_id]])->with(['item' => function($query) {
$query->with('orderNo')->field('order_id, order_item_id, item_name, item_image');
}])->withSearch(['join_order_no' => 'order_no', 'join_status' => 'status', 'join_member_id' => 'member_id', 'refund_no' => 'refund_no', 'join_create_time' => 'create_time'],$where)->withJoin(['member' => function($query){
$query->field("member.nickname, member.headimg, member.mobile, member.member_id");
}
])->where($member_where)->field($field)->order('create_time desc')->append(['status_name', 'payrefund.type_name']);
return $this->pageQuery($search_model);
}
/**
* 查询退款详情
* @param int $refund_id
* @return void
*/
public function getDetail(int $refund_id) {
$field = 'refund_id,num,money,refund_no,status,create_time,audit_time,transfer_time,item_type,order_item_id, order_id,member_id';
$detail = $this->model->where([ ['site_id', '=', $this->site_id], ['refund_id', '=', $refund_id]])->field($field)->with(['item' => function($query) {
$query->field('order_item_id, item_name, item_image');
}, 'member' => function($query) {
$query->field('member_id, nickname, mobile, headimg');
}, 'payrefund' => function($query) {
$query->field('refund_no');
}])->append(['status_name', 'payrefund.type_name'])->findOrEmpty()->toArray();
return $detail;
}
/**
* 获取退款状态
* @return void
*/
public function getStatus($type){
$status = OrderRefundDict::getStatus();
return $status;
}
/**
* 退款统计数据(根据状态查询)
*/
public function stat()
{
$status = OrderRefundDict::getStatus();
$all = 0;
$have = 0;
foreach ($status as $k => $v)
{
$money = $this->model->where([['status', '=', $v['key']], ['site_id', '=', $this->site_id]])->sum("money");
if($money == null)
{
$money = 0;
}
if($k == 1 || $k == 2){
$have = $have + $money;
}
$status[$k]['money'] = number_format($money, 2);
$all = $all + $money;
}
$status['all'] = [
'name' => get_lang('dict_refund.all'),
'key' => 'all',
'money' => number_format($all, 2)
];
$status['have'] = [
'name' => get_lang('dict_refund.have'),
'key' => 'all',
'money' => number_format($have, 2)
];
return $status;
}
}

View File

@ -21,8 +21,6 @@ use core\exception\PayException;
/** /**
* 支付配置服务层 * 支付配置服务层
* Class PayConfigService
* @package app\service\admin\pay
*/ */
class PayChannelService extends BaseAdminService class PayChannelService extends BaseAdminService
{ {
@ -142,7 +140,6 @@ class PayChannelService extends BaseAdminService
]; ];
break; break;
} }
// $config['status'] = $data['status'] ?? '0';//是否启用
return $config; return $config;
} }

View File

@ -1,62 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | Niucloud-admin 企业快速开发的saas管理平台
// +----------------------------------------------------------------------
// | 官方网址https://www.niucloud-admin.com
// +----------------------------------------------------------------------
// | niucloud团队 版权所有 开源版本可自由商用
// +----------------------------------------------------------------------
// | Author: Niucloud Team
// +----------------------------------------------------------------------
namespace app\service\admin\pay;
use app\service\core\pay\CorePayConfigService;
use core\base\BaseAdminService;
/**
* 支付配置服务层
* Class PayConfigService
* @package app\service\admin\pay
*/
class PayConfigService extends BaseAdminService
{
public $core_pay_config_service;
public function __construct()
{
parent::__construct();
$this->core_pay_config_service = new CorePayConfigService();
}
/**
* 获取配置
* @param string $key
* @param string $value
* @param int $site_id
*/
public function getConfigByType(string $type){
return $this->core_pay_config_service->getConfigByType($this->site_id, $type);
}
/**
* 设置配置信息
* @param string $key
* @param int $site_id
* @return mixed
*/
public function setConfigByType(string $type, array $data)
{
return $this->core_pay_config_service->setConfigByType($this->site_id, $type, $data);
}
/**
* 获取支付方式配置列表
* @return array|null
*/
public function getPayConfigList(){
return $this->core_pay_config_service->getPayConfigList($this->site_id);
}
}

View File

@ -11,7 +11,7 @@
namespace app\service\admin\stat; namespace app\service\admin\stat;
use app\model\order\Order; use app\model\order\RechargeOrder;
use app\service\admin\member\MemberService; use app\service\admin\member\MemberService;
use app\service\admin\site\SiteService; use app\service\admin\site\SiteService;
use app\service\admin\sys\SystemService; use app\service\admin\sys\SystemService;
@ -115,7 +115,7 @@ class SiteStatService extends BaseAdminService
['order_status', '>', 0], ['order_status', '>', 0],
['create_time', 'between', [$start_time, $end_time]] ['create_time', 'between', [$start_time, $end_time]]
]; ];
$money = (new Order())->where($where)->sum('order_money'); $money = (new RechargeOrder())->where($where)->sum('order_money');
return $money; return $money;
} }
@ -131,7 +131,7 @@ class SiteStatService extends BaseAdminService
['order_status', '>', 0], ['order_status', '>', 0],
['create_time', 'between', [$start_time, $end_time]] ['create_time', 'between', [$start_time, $end_time]]
]; ];
$money = (new Order())->where($where)->count('order_id'); $money = (new RechargeOrder())->where($where)->count('order_id');
return $money; return $money;
} }

View File

@ -174,7 +174,7 @@ class AttachmentService extends BaseAdminService
['id', '=', $id] ['id', '=', $id]
); );
$category_model = new SysAttachmentCategory(); $category_model = new SysAttachmentCategory();
$res = $category_model->edit($data, $where); $res = $category_model->where($where)->update($data);
return $res; return $res;
} }

View File

@ -123,4 +123,34 @@ class ConfigService extends BaseAdminService
$res = $this->core_config_service->setConfig(0,'SERVICE_INFO', $data); $res = $this->core_config_service->setConfig(0,'SERVICE_INFO', $data);
return $res; return $res;
} }
/**
* 设置地图key
* @param array $value
* @return bool
*/
public function setMap(array $value)
{
$data = [
'key' => $value['key'],
];
$res = $this->core_config_service->setConfig($this->site_id,'MAPKEY', $data);
return $res;
}
/**
* 获取地图key
*/
public function getMap()
{
$info = (new CoreConfigService())->getConfig($this->site_id, 'MAPKEY');
if(empty($info))
{
$info = [];
$info['value'] = [
'key' => '',
];
}
return $info['value'];
}
} }

View File

@ -117,7 +117,7 @@ class MenuService extends BaseAdminService
{ {
sort($menu_keys); sort($menu_keys);
$cache_name = 'menu' . md5(implode("_", $menu_keys)) . $is_tree; $cache_name = 'menu' . md5(implode("_", $menu_keys)) . $is_tree;
return cache_remember( $menu_list = cache_remember(
$cache_name, $cache_name,
function () use ($menu_keys, $app_type, $is_tree) { function () use ($menu_keys, $app_type, $is_tree) {
$where = [ $where = [
@ -128,23 +128,24 @@ class MenuService extends BaseAdminService
$where[] = ['app_type', '=', $app_type]; $where[] = ['app_type', '=', $app_type];
} }
$menu_list = $this->model->where($where)->order('sort', 'desc')->select()->toArray(); $menu_list = $this->model->where($where)->order('sort', 'desc')->select()->toArray();
return $is_tree ? $this->menuToTree($menu_list, 'menu_key', 'parent_key', 'children', 'auth', '', 1) : $menu_list; return $menu_list;
}, },
self::$cache_tag_name self::$cache_tag_name
); );
// return Cache::tag(self::$cache_tag_name)->remember($cache_name, function () use ($menu_keys, $app_type, $is_tree) { foreach ($menu_list as $k => $v)
// $where = [ {
// ['menu_key', 'in', $menu_keys], $lang_menu_key = "dict_menu_". $v['app_type']. '.'. $v['menu_key'];
//// ['menu_type', 'in', [0,1]] $lang_menu_name = get_lang("dict_menu_". $v['app_type']. '.'. $v['menu_key']);
// ]; //语言已定义
// if(!empty($app_type)){ if($lang_menu_key != $lang_menu_name)
// $where[] = ['app_type', '=', $app_type]; {
// } $menu_list[$k]['menu_name'] = $lang_menu_name;
// $menu_list = $this->model->where($where)->order('sort', 'desc')->select()->toArray(); }
// return $is_tree ? $this->menuToTree($menu_list, 'menu_key', 'parent_key', 'children', 'auth', '', 1) : $menu_list; }
//
// }); return $is_tree ? $this->menuToTree($menu_list, 'menu_key', 'parent_key', 'children', 'auth', '', 1) : $menu_list;
} }
/** /**
@ -301,7 +302,7 @@ class MenuService extends BaseAdminService
public function getAllMenuList($app_type = '', $status = 'all', $is_tree = 0, $is_button = 0) public function getAllMenuList($app_type = '', $status = 'all', $is_tree = 0, $is_button = 0)
{ {
$cache_name = 'menu_api_' .$app_type.'_'. $status . '_' . $is_tree . '_' . $is_button; $cache_name = 'menu_api_' .$app_type.'_'. $status . '_' . $is_tree . '_' . $is_button;
return cache_remember( $menu_list = cache_remember(
$cache_name, $cache_name,
function () use ($status, $is_tree, $is_button, $app_type) { function () use ($status, $is_tree, $is_button, $app_type) {
$where = [ $where = [
@ -312,21 +313,22 @@ class MenuService extends BaseAdminService
$where[] = ['status', '=', $status]; $where[] = ['status', '=', $status];
} }
$menu_list = $this->model->where($where)->order('sort desc')->select()->toArray(); $menu_list = $this->model->where($where)->order('sort desc')->select()->toArray();
return $is_tree ? $this->menuToTree($menu_list, 'menu_key', 'parent_key', 'children', 'auth', '', $is_button) : $menu_list; return $menu_list;
}, },
self::$cache_tag_name self::$cache_tag_name
); );
// return Cache::tag(self::$cache_tag_name)->remember($cache_name, function () use ($status, $is_tree, $is_button, $app_type) { foreach ($menu_list as $k => $v)
// $where = [ {
//// ['menu_type', 'in', [0,1]] $lang_menu_key = "dict_menu_". $v['app_type']. '.'. $v['menu_key'];
// ['app_type', '=', $app_type], $lang_menu_name = get_lang("dict_menu_". $v['app_type']. '.'. $v['menu_key']);
// ]; //语言已定义
// if ($status != 'all') { if($lang_menu_key != $lang_menu_name)
// $where[] = ['status', '=', $status]; {
// } $menu_list[$k]['menu_name'] = $lang_menu_name;
// $menu_list = $this->model->where($where)->order('sort desc')->select()->toArray(); }
// return $is_tree ? $this->menuToTree($menu_list, 'menu_key', 'parent_key', 'children', 'auth', '', $is_button) : $menu_list; }
// });
return $is_tree ? $this->menuToTree($menu_list, 'menu_key', 'parent_key', 'children', 'auth', '', $is_button) : $menu_list;;
} }

View File

@ -49,6 +49,7 @@ class SystemService extends BaseAdminService
{ {
$site_tag = $this->site_id == 1 ? '' : '/s' . $this->site_id; $site_tag = $this->site_id == 1 ? '' : '/s' . $this->site_id;
$data = [ $data = [
'wap_domain' => env("system.wap_domain"),
'wap_url' => ( !empty(env("system.wap_domain")) ? env("system.wap_domain") : request()->domain() ) . "/wap" . $site_tag, 'wap_url' => ( !empty(env("system.wap_domain")) ? env("system.wap_domain") : request()->domain() ) . "/wap" . $site_tag,
'web_url' => ( !empty(env("system.web_domain")) ? env("system.web_domain") : request()->domain() ) . "/web" . $site_tag, 'web_url' => ( !empty(env("system.web_domain")) ? env("system.web_domain") : request()->domain() ) . "/web" . $site_tag,
]; ];

View File

@ -12,7 +12,7 @@
namespace app\service\api\order; namespace app\service\api\order;
use app\dict\order\RechargeOrderDict; use app\dict\order\RechargeOrderDict;
use app\model\order\Order; use app\model\order\RechargeOrder;
use app\service\core\order\recharge\CoreRechargeOrderService; use app\service\core\order\recharge\CoreRechargeOrderService;
use core\base\BaseApiService; use core\base\BaseApiService;
@ -26,7 +26,7 @@ class RechargeOrderService extends BaseApiService
public function __construct() public function __construct()
{ {
parent::__construct(); parent::__construct();
$this->model = new Order(); $this->model = new RechargeOrder();
} }
/** /**
@ -54,8 +54,16 @@ class RechargeOrderService extends BaseApiService
$where['order_type'] = 'recharge'; $where['order_type'] = 'recharge';
$search_model = $this->model->where([ ['site_id', '=', $this->site_id], ['member_id', '=', $this->member_id] ])->withSearch(['order_status'], $where)->field($field)->with(['item' => function($query) { $search_model = $this->model->where([ ['site_id', '=', $this->site_id], ['member_id', '=', $this->member_id] ])->withSearch(['order_status'], $where)->field($field)->with(['item' => function($query) {
$query->field('order_item_id, order_id, member_id, item_id, item_type, item_name, item_image, price, num, item_money, is_refund, refund_no, refund_status, create_time'); $query->field('order_item_id, order_id, member_id, item_id, item_type, item_name, item_image, price, num, item_money, is_refund, refund_no, refund_status, create_time');
}])->order($order)->append(['order_status_info', 'order_from_name']); }])->order($order)->append(['order_from_name']);
return $this->pageQuery($search_model); $list = $this->pageQuery($search_model);
$order_status = RechargeOrderDict::getStatus();
//$refund_status = RechargeOrderDict::getRefundStatus();
foreach ($list['data'] as $k => $v)
{
$list['data'][$k]['order_status_info'] = $order_status[$v['order_status']] ?? [];
// $list['data'][$k]['refund_status_name'] = $refund_status[$v['refund_status']]['name'] ?? '';
}
return $list;
} }
/** /**
@ -68,7 +76,11 @@ class RechargeOrderService extends BaseApiService
$field = 'order_id, site_id, order_no, order_from, order_type, out_trade_no, order_status, refund_status, member_id, ip, member_message, order_item_money, order_discount_money, order_money, create_time, pay_time, close_time, is_delete, is_enable_refund, remark, invoice_id, close_reason'; $field = 'order_id, site_id, order_no, order_from, order_type, out_trade_no, order_status, refund_status, member_id, ip, member_message, order_item_money, order_discount_money, order_money, create_time, pay_time, close_time, is_delete, is_enable_refund, remark, invoice_id, close_reason';
$detail = $this->model->where([['order_type', '=', 'recharge'], ['site_id', '=', $this->site_id], ['member_id', '=', $this->member_id], ['order_id', '=', $order_id]])->field($field)->with(['item' => function($query) { $detail = $this->model->where([['order_type', '=', 'recharge'], ['site_id', '=', $this->site_id], ['member_id', '=', $this->member_id], ['order_id', '=', $order_id]])->field($field)->with(['item' => function($query) {
$query->field('order_item_id, order_id, member_id, item_id, item_type, item_name, item_image, price, num, item_money, is_refund, refund_no, refund_status, create_time'); $query->field('order_item_id, order_id, member_id, item_id, item_type, item_name, item_image, price, num, item_money, is_refund, refund_no, refund_status, create_time');
}])->append(['order_status_info', 'order_from_name'])->findOrEmpty()->toArray(); }])->append(['order_from_name'])->findOrEmpty()->toArray();
if(!empty($detail))
{
$detail['order_status_info'] = RechargeOrderDict::getStatus($detail['order_status']) ?? [];
}
return $detail; return $detail;
} }

View File

@ -11,6 +11,7 @@
namespace app\service\api\upload; namespace app\service\api\upload;
use app\dict\sys\StorageDict;
use app\service\core\upload\CoreUploadService; use app\service\core\upload\CoreUploadService;
use core\base\BaseApiService; use core\base\BaseApiService;
@ -60,6 +61,6 @@ class UploadService extends BaseApiService
{ {
$dir = $this->root_path . '/' . 'document' . '/' . $this->site_id . '/' . date('Ym') . '/' . date('d'); $dir = $this->root_path . '/' . 'document' . '/' . $this->site_id . '/' . date('Ym') . '/' . date('d');
$core_upload_service = new CoreUploadService(); $core_upload_service = new CoreUploadService();
return $core_upload_service->document($file, $this->site_id, '', $dir, $is_local); return $core_upload_service->document($file, $this->site_id, '', $dir, StorageDict::LOCAL);
} }
} }

View File

@ -1,95 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | Niucloud-admin 企业快速开发的saas管理平台
// +----------------------------------------------------------------------
// | 官方网址https://www.niucloud-admin.com
// +----------------------------------------------------------------------
// | niucloud团队 版权所有 开源版本可自由商用
// +----------------------------------------------------------------------
// | Author: Niucloud Team
// +----------------------------------------------------------------------
namespace app\service\core\order;
use app\dict\pay\PayDict;
use app\model\order\Order;
use app\model\order\OrderItem;
use app\service\core\pay\CorePayService;
use core\base\BaseCoreService;
use core\exception\CommonException;
use think\facade\Cache;
use think\facade\Db;
/**
* 基础订单创建
* Class CoreOrderCreateService
* @package app\service\core\order
*/
class CoreOrderCreateService extends BaseCoreService
{
/**
* 订单创建
* @param int $site_id
* @param array $order_data
* @param array $order_items
* @return array
*/
public function create(int $site_id, array $order_data, array $order_items)
{
Db::startTrans();
try{
//添加订单支付表
$order_data['out_trade_no'] = (new CorePayService())->create($site_id, PayDict::MEMBER, $order_data['member_id'], $order_data['order_money'], $order_data['order_type'], get_lang("dict_order.trade_type_recharge"));
//添加订单表
$order_data['order_no'] = $this->createOrderNo($site_id);
$create_order = (new Order())->create($order_data);
$order_id = $create_order->order_id;
//添加订单项目表
$order_item_model = new OrderItem();
foreach ($order_items as $k => $order_item)
{
$order_item['order_id'] = $order_id;
$order_item_model->create($order_item);
}
//订单创建执行事件
event("orderCreateAfter");
if($order_data['order_money'] == 0){
(new CorePayService())->finish($site_id, $order_data['out_trade_no'], PayDict::BALANCEPAY);
}
Db::commit();
//返回订单信息
return [
'order_id' => $order_id,
'out_trade_no' => $order_data['out_trade_no']
];
}catch (\Exception $e)
{
Db::rollback();
throw new CommonException($e->getMessage());
}
}
/**
* 创建订单编号
* @param int $site_id
* @return string
*/
public function createOrderNo(int $site_id)
{
$time_str = date('YmdHi');
$max_no = Cache::get("order_no_".$site_id."_".$time_str);
if (!isset($max_no) || empty($max_no)) {
$max_no = 1;
} else {
$max_no = $max_no + 1;
}
$order_no = $time_str . $site_id .sprintf('%03d', $max_no);
Cache::set("order_no_".$site_id."_".$time_str, $max_no);
return $order_no;
}
}

View File

@ -1,84 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | Niucloud-admin 企业快速开发的saas管理平台
// +----------------------------------------------------------------------
// | 官方网址https://www.niucloud-admin.com
// +----------------------------------------------------------------------
// | niucloud团队 版权所有 开源版本可自由商用
// +----------------------------------------------------------------------
// | Author: Niucloud Team
// +----------------------------------------------------------------------
namespace app\service\core\order;
use app\model\order\OrderItemRefund;
use app\service\core\pay\CoreRefundService;
use core\base\BaseCoreService;
use core\exception\CommonException;
use think\facade\Db;
/**
* 退款创建
* Class CoreOrderCreateService
* @package app\service\core\order
*/
class CoreOrderRefundService extends BaseCoreService
{
public function __construct()
{
parent::__construct();
$this->model = new OrderItemRefund();
}
/**
* 退款创建
* @param array $data
*/
public function create(array $data)
{
$refund_no = (new CoreRefundService())->create($data['site_id'], $data['out_trade_no'], $data['money'], $data['reason'] ?? '');
$create = $this->model->create([
'order_item_id' => $data['order_item_id'],
'order_id' => $data['order_id'],
'site_id' => $data['site_id'],
'member_id' => $data['member_id'],
'num' => $data['num'],
'money' => $data['money'],
'refund_no' => $refund_no,
'item_type' => $data['item_type'],
'create_time' => time()
]);
return [
'refund_no' => $refund_no,
'refund_id' => $create->refund_id
];
}
/**
* 退款转账完成
* @param string $refund_no
* @return void
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function refundComplete(string $refund_no) {
$model = $this->model->where([ ['refund_no', '=', $refund_no] ])->find();
if ($model->isEmpty()) throw new CommonException('ITEM_REFUND_NOT_EXIST');
Db::startTrans();
try {
event('refundComplete', $model->toArray());
Db::commit();
return true;
} catch(\Exception $e) {
Db::rollback();
throw new CommonException($e->getMessage());
}
}
}

View File

@ -1,42 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | Niucloud-admin 企业快速开发的saas管理平台
// +----------------------------------------------------------------------
// | 官方网址https://www.niucloud-admin.com
// +----------------------------------------------------------------------
// | niucloud团队 版权所有 开源版本可自由商用
// +----------------------------------------------------------------------
// | Author: Niucloud Team
// +----------------------------------------------------------------------
namespace app\service\core\order;
use app\model\order\Order;
use core\base\BaseCoreService;
/**
* 订单
*/
class CoreOrderService extends BaseCoreService
{
public function __construct()
{
parent::__construct();
$this->model = new Order();
}
/**
* 获取订单信息
* @param int $site_id
* @param int $order_id
* @return Order|array|mixed|\think\Model
*/
public function getOrderInfo(int $site_id, int $order_id){
return $this->model->where([
['site_id', '=', $site_id],
['order_id', '=', $order_id]
])->field('*')->findOrEmpty()->toArray();
}
}

View File

@ -12,11 +12,15 @@
namespace app\service\core\order\recharge; namespace app\service\core\order\recharge;
use app\dict\order\RechargeOrderDict; use app\dict\order\RechargeOrderDict;
use app\model\order\Order; use app\dict\pay\PayDict;
use app\model\order\RechargeOrder;
use app\model\order\RechargeOrderItem;
use app\service\core\member\CoreMemberAccountService; use app\service\core\member\CoreMemberAccountService;
use app\service\core\order\CoreOrderCreateService; use app\service\core\pay\CorePayService;
use core\base\BaseCoreService; use core\base\BaseCoreService;
use core\exception\CommonException; use core\exception\CommonException;
use think\facade\Cache;
use think\facade\Db;
/** /**
* 充值订单流程 * 充值订单流程
@ -25,9 +29,6 @@ use core\exception\CommonException;
*/ */
class CoreRechargeOrderService extends BaseCoreService class CoreRechargeOrderService extends BaseCoreService
{ {
public $order_type = 'recharge';
/** /**
* 充值订单创建 * 充值订单创建
* @param array $data //['site_id' => 1, member_id => 1 'order_from' => 'h5', 'member_message' => '','recharge_money' => 12.00] * @param array $data //['site_id' => 1, member_id => 1 'order_from' => 'h5', 'member_message' => '','recharge_money' => 12.00]
@ -61,8 +62,52 @@ class CoreRechargeOrderService extends BaseCoreService
'is_refund' => 0 'is_refund' => 0
] ]
]; ];
$res = (new CoreOrderCreateService())->create($data['site_id'], $order_data, $order_items); Db::startTrans();
return $res; try{
//添加订单支付表
$order_data['out_trade_no'] = (new CorePayService())->create($data['site_id'], PayDict::MEMBER, $order_data['member_id'], $order_data['order_money'], $order_data['order_type'], get_lang("dict_order.trade_type_recharge"));
//添加订单表
$order_data['order_no'] = $this->createOrderNo($data['site_id']);
$create_order = (new RechargeOrder())->create($order_data);
$order_id = $create_order->order_id;
//添加订单项目表
$order_item_model = new RechargeOrderItem();
foreach ($order_items as $k => $order_item)
{
$order_item['order_id'] = $order_id;
$order_item_model->create($order_item);
}
Db::commit();
//返回订单信息
return [
'order_id' => $order_id,
'out_trade_no' => $order_data['out_trade_no']
];
}catch (\Exception $e)
{
Db::rollback();
throw new CommonException($e->getMessage());
}
}
/**
* 创建订单编号
* @param int $site_id
* @return string
*/
public function createOrderNo(int $site_id)
{
$time_str = date('YmdHi');
$max_no = Cache::get("recharge_order_no_".$site_id."_".$time_str);
if (!isset($max_no) || empty($max_no)) {
$max_no = 1;
} else {
$max_no = $max_no + 1;
}
$order_no = $time_str . $site_id .sprintf('%03d', $max_no);
Cache::set("recharge_order_no_".$site_id."_".$time_str, $max_no);
return $order_no;
} }
/** /**
@ -72,7 +117,7 @@ class CoreRechargeOrderService extends BaseCoreService
public function pay(array $pay_info) public function pay(array $pay_info)
{ {
try { try {
$order_model = new Order(); $order_model = new RechargeOrder();
$order_info = $order_model->where([['site_id', '=', $pay_info['site_id']], ['out_trade_no', '=', $pay_info['out_trade_no']]])->findOrEmpty()->toArray(); $order_info = $order_model->where([['site_id', '=', $pay_info['site_id']], ['out_trade_no', '=', $pay_info['out_trade_no']]])->findOrEmpty()->toArray();
if (empty($order_info)) if (empty($order_info))
throw new CommonException('ORDER_NOT_EXIST'); throw new CommonException('ORDER_NOT_EXIST');
@ -97,12 +142,27 @@ class CoreRechargeOrderService extends BaseCoreService
* @return void * @return void
*/ */
public function close(int $site_id, int $order_id){ public function close(int $site_id, int $order_id){
$order = (new Order())->where([ ['site_id', '=', $site_id ],['order_id', '=', $order_id ], ])->find(); $order = (new RechargeOrder())->where([ ['site_id', '=', $site_id ],['order_id', '=', $order_id ], ])->find();
if ($order->isEmpty()) throw new CommonException('ORDER_NOT_EXIST'); if ($order->isEmpty()) throw new CommonException('ORDER_NOT_EXIST');
if ($order->order_status == RechargeOrderDict::CLOSE) throw new CommonException('ORDER_CLOSED'); if ($order->order_status == RechargeOrderDict::CLOSE) throw new CommonException('ORDER_CLOSED');
$order->save(['order_status' => RechargeOrderDict::CLOSE]); $order->save(['order_status' => RechargeOrderDict::CLOSE]);
return true; return true;
} }
/**
* 获取订单信息
* @param int $site_id
* @param int $order_id
* @return array
*/
public function orderInfo(int $site_id, int $order_id)
{
return (new RechargeOrder())->where([
['site_id', '=', $site_id],
['order_id', '=', $order_id]
])->field('*')->findOrEmpty()->toArray();
}
} }

View File

@ -13,11 +13,10 @@ namespace app\service\core\order\recharge;
use app\dict\order\RechargeOrderDict; use app\dict\order\RechargeOrderDict;
use app\model\member\Member; use app\model\member\Member;
use app\model\order\Order; use app\model\order\RechargeOrder;
use app\model\order\OrderItem; use app\model\order\RechargeOrderItem;
use app\model\order\OrderItemRefund; use app\model\order\RechargeOrderItemRefund;
use app\service\core\member\CoreMemberAccountService; use app\service\core\member\CoreMemberAccountService;
use app\service\core\order\CoreOrderRefundService;
use app\service\core\pay\CoreRefundService; use app\service\core\pay\CoreRefundService;
use core\base\BaseCoreService; use core\base\BaseCoreService;
use core\exception\CommonException; use core\exception\CommonException;
@ -39,12 +38,12 @@ class CoreRechargeRefundService extends BaseCoreService
* @return void * @return void
*/ */
public function create(int $site_id, int $order_id) { public function create(int $site_id, int $order_id) {
$order_model = (new OrderItem())->where([ ['site_id', '=', $site_id], ['order_id', '=', $order_id], ['item_type', '=', $this->order_type ] ])->with('ordermain')->find(); $order_model = (new RechargeOrderItem())->where([ ['site_id', '=', $site_id], ['order_id', '=', $order_id], ['item_type', '=', $this->order_type ] ])->with('ordermain')->find();
$order = $order_model->toArray(); $order = $order_model->toArray();
$order_info = (new Order())->where([ ['site_id', '=', $site_id], ['order_id', '=', $order_id] ])->field("order_no")->find(); $order_info = (new RechargeOrder())->where([ ['site_id', '=', $site_id], ['order_id', '=', $order_id] ])->field("order_no")->find();
if (empty($order)) throw new CommonException('ORDER_NOT_EXIST'); if (empty($order)) throw new CommonException('ORDER_NOT_EXIST');
if (!$order['ordermain']['is_enable_refund']) throw new CommonException('NOT_ALLOW_APPLY_REFUND'); if (!$order['ordermain']['is_enable_refund']) throw new CommonException('NOT_ALLOW_APPLY_REFUND');
if (!in_array($order['ordermain']['order_status'], [RechargeOrderDict::PAY, RechargeOrderDict::FINISH])) throw new CommonException('ORDER_UNPAID_NOT_ALLOW_APPLY_REFUND'); if (!in_array($order['ordermain']['order_status'], [RechargeOrderDict::FINISH])) throw new CommonException('ORDER_UNPAID_NOT_ALLOW_APPLY_REFUND');
if ($order['refund_status'] != RechargeOrderDict::NOT_APPLAY) throw new CommonException('REFUND_HAD_APPLIED'); if ($order['refund_status'] != RechargeOrderDict::NOT_APPLAY) throw new CommonException('REFUND_HAD_APPLIED');
Db::startTrans(); Db::startTrans();
@ -60,20 +59,30 @@ class CoreRechargeRefundService extends BaseCoreService
$order['out_trade_no'] = $order['ordermain']['out_trade_no']; $order['out_trade_no'] = $order['ordermain']['out_trade_no'];
$order['money'] = $order['item_money'] > $member_info['balance'] ? $member_info['balance'] : $order['item_money']; $order['money'] = $order['item_money'] > $member_info['balance'] ? $member_info['balance'] : $order['item_money'];
$order['order_no'] = $order_info['order_no']; $order['order_no'] = $order_info['order_no'];
$creat_res = (new CoreOrderRefundService())->create($order); $refund_no = (new CoreRefundService())->create($order['site_id'], $order['out_trade_no'], $order['money'], $order['reason'] ?? '');
(new RechargeOrderItemRefund())->create([
'order_item_id' => $order['order_item_id'],
'order_id' => $order['order_id'],
'site_id' => $order['site_id'],
'member_id' => $order['member_id'],
'num' => $order['num'],
'money' => $order['money'],
'refund_no' => $refund_no,
'item_type' => $order['item_type'],
'create_time' => time()
]);
$order_model->save([ $order_model->save([
'refund_no' => $creat_res['refund_no'], 'refund_no' => $refund_no,
'refund_status' => RechargeOrderDict::REFUNDING 'refund_status' => RechargeOrderDict::REFUNDING
]); ]);
$order_model->ordermain->save([ $order_model->ordermain->save([
'refund_status' => RechargeOrderDict::REFUNDING 'refund_status' => RechargeOrderDict::REFUNDING
]); ]);
(new OrderItemRefund())->update(['status' => RechargeOrderDict::REFUNDING], [ ['refund_no', '=', $creat_res['refund_no'] ] ]); (new RechargeOrderItemRefund())->update(['status' => RechargeOrderDict::REFUNDING], [ ['refund_no', '=', $refund_no ] ]);
// 执行退款 // 执行退款
$this->refund($order, $creat_res['refund_no']); $this->refund($order, $refund_no);
Db::commit(); Db::commit();
@ -101,7 +110,7 @@ class CoreRechargeRefundService extends BaseCoreService
* @return void * @return void
*/ */
public function refundComplete($refund_no){ public function refundComplete($refund_no){
$model = (new OrderItemRefund())->where([ ['refund_no', '=', $refund_no ] ])->find(); $model = (new RechargeOrderItemRefund())->where([ ['refund_no', '=', $refund_no ] ])->find();
if ($model->isEmpty()) throw new CommonException('ORDER_NOT_EXIST'); if ($model->isEmpty()) throw new CommonException('ORDER_NOT_EXIST');
if ($model->status != RechargeOrderDict::REFUNDING) throw new CommonException('REFUND_STATUS_ABNORMAL'); if ($model->status != RechargeOrderDict::REFUNDING) throw new CommonException('REFUND_STATUS_ABNORMAL');
@ -109,7 +118,7 @@ class CoreRechargeRefundService extends BaseCoreService
try { try {
$model->save(['status' => RechargeOrderDict::REFUND_COMPLETED]); $model->save(['status' => RechargeOrderDict::REFUND_COMPLETED]);
$model->item()->save([ 'refund_status' => RechargeOrderDict::REFUND_COMPLETED ]); $model->item()->save([ 'refund_status' => RechargeOrderDict::REFUND_COMPLETED ]);
(new Order())->update(['refund_status' => RechargeOrderDict::REFUND_COMPLETED], [ ['order_id', '=', $model->order_id ] ]); (new RechargeOrder())->update(['refund_status' => RechargeOrderDict::REFUND_COMPLETED], [ ['order_id', '=', $model->order_id ] ]);
(new CoreRechargeOrderService())->close($model->site_id, $model->order_id); (new CoreRechargeOrderService())->close($model->site_id, $model->order_id);
Db::commit(); Db::commit();
return true; return true;

View File

@ -14,6 +14,8 @@ namespace app\service\core\pay;
use app\dict\pay\PayDict; use app\dict\pay\PayDict;
use app\model\pay\PayChannel; use app\model\pay\PayChannel;
use app\service\core\weapp\CoreWeappConfigService;
use app\service\core\wechat\CoreWechatConfigService;
use core\base\BaseCoreService; use core\base\BaseCoreService;
use think\Model; use think\Model;
@ -39,24 +41,28 @@ class CorePayChannelService extends BaseCoreService
$where['site_id'] = $site_id; $where['site_id'] = $site_id;
return $this->model->where($where)->findOrEmpty(); return $this->model->where($where)->findOrEmpty();
} }
/** /**
* 通过渠道获取支持的支付方式(专属用于支付业务) * 通过渠道获取支持的支付方式(专属用于支付业务)
* @param int $site_id * @param int $site_id
* @param string $channel * @param string $channel
* @param array $pay_type_list 外部业务支付类型限制 * @param string $trade_type
* @return array * @return array|array[]
* @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException * @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException * @throws \think\db\exception\ModelNotFoundException
*/ */
public function getAllowPayTypeByCahnnel(int $site_id, string $channel, array $pay_type_limit_list = []){ public function getAllowPayTypeByChannel(int $site_id, string $channel, string $trade_type = ''){
$channel_pay_list = $this->model->where([['site_id', '=', $site_id], ['channel', '=', $channel], ['status', '=', 1]])->field('type')->order('sort asc')->select()->toArray(); $channel_pay_list = $this->model->where([['site_id', '=', $site_id], ['channel', '=', $channel], ['status', '=', 1]])->field('type')->order('sort asc')->select()->toArray();
if(!empty($channel_pay_list)){ if(!empty($channel_pay_list)){
$temp_channel_pay_list = array_column($channel_pay_list, 'type'); $temp_channel_pay_list = array_column($channel_pay_list, 'type');
if($pay_type_limit_list) $temp_channel_pay_list = array_intersect($temp_channel_pay_list, $pay_type_limit_list);
$pay_type_list = PayDict::getPayType($temp_channel_pay_list); $pay_type_list = PayDict::getPayType($temp_channel_pay_list);
} }
//充值订单不支持余额支付
if(!empty($pay_type_list) && $trade_type == 'recharge'){
unset($pay_type_list[PayDict::BALANCEPAY]);
}
return $pay_type_list ?? []; return $pay_type_list ?? [];
} }
@ -72,10 +78,32 @@ class CorePayChannelService extends BaseCoreService
$pay_channel = $this->model->where([['site_id', '=', $site_id], ['channel', '=', $channel], ['type', '=', $type]])->field('config')->findOrEmpty(); $pay_channel = $this->model->where([['site_id', '=', $site_id], ['channel', '=', $channel], ['type', '=', $type]])->field('config')->findOrEmpty();
if(!$pay_channel->isEmpty()){ if(!$pay_channel->isEmpty()){
if($type == PayDict::WECHATPAY){ if($type == PayDict::WECHATPAY){
$pay_channel->config = array_merge($pay_channel->config, (new CorePayConfigService())->getWechatPayFullConfig($site_id)); $pay_channel->config = array_merge($pay_channel->config, $this->getWechatPayFullConfig($site_id));
} }
return $pay_channel->config; return $pay_channel->config;
} }
return []; return [];
} }
/**
* 获取完整的微信支付配置(根据场景)
* @param $site_id
* @return void
*/
public function getWechatPayFullConfig(int $site_id){
//TODO 先判断是否是开放平台授权,然后再决定使用什么appid
//查询公众号配置
$core_wechat_config_service = new CoreWechatConfigService();
$mp_app_id = $core_wechat_config_service->getWechatConfig($site_id)['app_id'];//公众号appid
//查询公众号配置
$core_weapp_config_service = new CoreWeappConfigService();
$mini_app_id = $core_weapp_config_service->getWeappConfig($site_id)['app_id'];//小程序appid
//todo 查询微信小程序 appid . 应用appid.....
return [
'mp_app_id' => $mp_app_id,
'mini_app_id' => $mini_app_id
//............
];
}
} }

View File

@ -1,287 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | Niucloud-admin 企业快速开发的saas管理平台
// +----------------------------------------------------------------------
// | 官方网址https://www.niucloud-admin.com
// +----------------------------------------------------------------------
// | niucloud团队 版权所有 开源版本可自由商用
// +----------------------------------------------------------------------
// | Author: Niucloud Team
// +----------------------------------------------------------------------
namespace app\service\core\pay;
use app\dict\pay\PayDict;
use app\dict\sys\ConfigKeyDict;
use app\model\sys\SysConfig;
use app\service\core\sys\CoreConfigService;
use app\service\core\weapp\CoreWeappConfigService;
use app\service\core\wechat\CoreWechatConfigService;
use core\base\BaseCoreService;
use core\exception\CommonException;
use think\Model;
/**
* 支付配置服务层
* Class CorePayConfigService
* @package app\service\core\pay
*/
class CorePayConfigService extends BaseCoreService
{
/**
* 获取启用的支付方式
* @param $site_id
* @return void
*/
public function getPayList(int $site_id, array $allow_type = [])
{
$pay_list = [];
foreach(PayDict::getPayType($allow_type) as $k => $v){
switch($k){
case PayDict::WECHATPAY:
$config = $this->getWechatpayConfig($site_id);
break;
case PayDict::ALIPAY:
$config = $this->getAlipayConfig($site_id);
break;
case PayDict::OFFLINEPAY:
$config = $this->getOfflinepayConfig($site_id);
break;
}
if($config['status'] == PayDict::ON){
$pay_list[] = [
'key' => $k,
'name' => $v['name'],
'icon' => $v['icon']
];
}
}
return $pay_list;
}
/**
* 获取支付方式列表的配置
* @param $site_id
* @return void
*/
public function getPayConfigList(int $site_id)
{
$pay_config_list = [];
foreach(PayDict::getPayType() as $k => $v){
switch($k){
case PayDict::WECHATPAY:
$config = self::getWechatpayConfig($site_id);
break;
case PayDict::ALIPAY:
$config = self::getAlipayConfig($site_id);
break;
case PayDict::OFFLINEPAY:
$config = self::getOfflinepayConfig($site_id);
break;
}
$pay_config_list[] = [
'key' => $k,
'name' => $v['name'],
'icon' => $v['icon'],
'config' => $config
];
}
return $pay_config_list;
}
/**
* 微信支付配置
* @param $site_id
* @return array|mixed|string[]
*/
public function getWechatpayConfig(int $site_id){
$config = (new CoreConfigService())->getConfig($site_id, ConfigKeyDict::WECHAT_PAY)['value'] ?? [];
if(empty($config)){
$config = array(
'status' => PayDict::OFF,
'icon' => path_to_url(PayDict::WECHATPAY_ICON),
'mch_id' => '',//商户号
'mch_secret_key' => '',//商户秘钥 现在默认认为是v3版
'mch_secret_cert' => '',//商户私钥 字符串或路径
'mch_public_cert_path' => '',//商户公钥证书路径
);
}
return $config;
}
/**
* 阿里云支付配置
* @param $site_id
* @return array|mixed|string[]
*/
public function getAlipayConfig(int $site_id){
$config = (new CoreConfigService())->getConfig($site_id, ConfigKeyDict::ALIPAY)['value'] ?? [];
if(empty($config)){
$config = array(
'status' => PayDict::OFF,
'app_id' => path_to_url(PayDict::ALIPAY_ICON),// 必填-支付宝分配的 app_id
'app_secret_cert' => '',// 必填-应用私钥 字符串或路径
'app_public_cert_path' => '',//必填-应用公钥证书 路径
'alipay_public_cert_path' => '',//必填-支付宝公钥证书 路径
'alipay_root_cert_path' => '',// 必填-支付宝根证书 路径
);
}
return $config;
}
/**
* 线下支付
* @param $site_id
* @return array|mixed|string[]
*/
public function getOfflinepayConfig(int $site_id){
$config = (new CoreConfigService())->getConfig($site_id, ConfigKeyDict::OFFLINE_PAY)['value'] ?? [];
if(empty($config)){
$config = array(
'status' => PayDict::OFF,
);
}
return $config;
}
/**
* 通过支付方式查询支付配置(todo 注意: 用于支付 用于支付 用于支付)
* @param $site_id
* @param $type
* @return void
*/
public function getPayConfigByType(int $site_id, string $type){
switch($type){
case PayDict::WECHATPAY:
$config = self::getWechatpayConfig($site_id);
$config = array_merge($config, $this->getWechatPayFullConfig($site_id));//一般来说,微信支付商户号不能完整的进行支付活动,需要我们主动完善支付信息, 例如公众号appid
break;
case PayDict::ALIPAY:
$config = self::getAlipayConfig($site_id);
break;
case PayDict::OFFLINEPAY:
$config = self::getOfflinepayConfig($site_id);
break;
}
if($config['status'] != PayDict::ON)
throw new CommonException('PAYMENT_METHOD_NOT_EXIST');
return $config;
}
/**
* 通过支付方式获取配置(用于配置查询)
* @param $site_id
* @param $type
* @return array|array[]|mixed|string[]
*/
public function getConfigByType(int $site_id, string $type){
switch($type){
case PayDict::WECHATPAY:
$config = self::getWechatpayConfig($site_id);
break;
case PayDict::ALIPAY:
$config = self::getAlipayConfig($site_id);
break;
case PayDict::OFFLINEPAY:
$config = self::getOfflinepayConfig($site_id);
break;
}
return $config;
}
/**
* 获取完整的微信支付配置
* @param $site_id
* @return void
*/
public function getWechatPayFullConfig(int $site_id){
//TODO 先判断是否是开放平台授权,然后再决定使用什么appid
//查询公众号配置
$core_wechat_config_service = new CoreWechatConfigService();
$mp_app_id = $core_wechat_config_service->getWechatConfig($site_id)['app_id'];//公众号appid
//查询公众号配置
$core_weapp_config_service = new CoreWeappConfigService();
$mini_app_id = $core_weapp_config_service->getWeappConfig($site_id)['app_id'];//公众号appid
//todo 查询微信小程序 appid . 应用appid.....
return [
'mp_app_id' => $mp_app_id,
'mini_app_id' => $mini_app_id
//............
];
}
/**
* 设置线下支付
* @param $site_id
* @param $data
* @return SysConfig|bool|Model
*/
public function setOfflinepayConfig(int $site_id, array $data){
$config = [
'status' => $data['status'],
];
return (new CoreConfigService())->setConfig($site_id, ConfigKeyDict::OFFLINE_PAY, $config);
}
/**
* 设置线下支付
* @param $site_id
* @param $data
* @return SysConfig|bool|Model
*/
public function setWechatpayConfig(int $site_id, array $data){
$config = [
'status' => $data['status'],
'mch_id' => $data['mch_id'],//商户号
'mch_secret_key' => $data['mch_secret_key'],//商户秘钥 现在默认认为是v3版
'mch_secret_cert' => $data['mch_secret_cert'],//商户私钥 字符串或路径
'mch_public_cert_path' => $data['mch_public_cert_path'],//商户公钥证书路径
];
return (new CoreConfigService())->setConfig($site_id, ConfigKeyDict::WECHAT_PAY, $config);
}
/**
* 设置线下支付
* @param $site_id
* @param $data
* @return SysConfig|bool|Model
*/
public function setAlipayConfig(int $site_id, array $data){
$config = [
'status' => $data['status'],
'app_id' => $data['app_id'],// 必填-支付宝分配的 app_id
'app_secret_cert' => $data['app_secret_cert'],// 必填-应用私钥 字符串或路径
'app_public_cert_path' => $data['app_public_cert_path'],//必填-应用公钥证书 路径
'alipay_public_cert_path' => $data['alipay_public_cert_path'],//必填-支付宝公钥证书 路径
'alipay_root_cert_path' => $data['alipay_root_cert_path'],// 必填-支付宝根证书 路径
];
return (new CoreConfigService())->setConfig($site_id, ConfigKeyDict::ALIPAY, $config);
}
/**
* 通过支付方式设置支付配置
* @param $site_id
* @param $type
* @param $data
* @return array|mixed|string[]
*/
public function setConfigByType(int $site_id, string $type, array $data){
switch($type){
case PayDict::WECHATPAY:
$result = $this->setWechatpayConfig($site_id, $data);
break;
case PayDict::ALIPAY:
$result = $this->setAlipayConfig($site_id, $data);
break;
case PayDict::OFFLINEPAY:
$result = $this->setOfflinepayConfig($site_id, $data);
break;
}
return $result;
}
}

View File

@ -11,7 +11,6 @@
namespace app\service\core\pay; namespace app\service\core\pay;
use app\dict\order\OrderTypeDict;
use app\dict\pay\OnlinePayDict; use app\dict\pay\OnlinePayDict;
use app\dict\pay\PayDict; use app\dict\pay\PayDict;
use app\job\pay\PayReturnTo; use app\job\pay\PayReturnTo;
@ -71,7 +70,7 @@ class CorePayService extends BaseCoreService
['site_id', '=', $site_id], ['site_id', '=', $site_id],
['out_trade_no', '=', $out_trade_no] ['out_trade_no', '=', $out_trade_no]
); );
return $this->model->where($where)->append(['pay_type_list', 'type_name', 'status_name'])->findOrEmpty(); return $this->model->where($where)->append([ 'type_name', 'status_name'])->findOrEmpty();
} }
/** /**
@ -85,10 +84,10 @@ class CorePayService extends BaseCoreService
['site_id', '=', $site_id], ['site_id', '=', $site_id],
['out_trade_no', '=', $out_trade_no] ['out_trade_no', '=', $out_trade_no]
); );
$pay = $this->model->where($where)->append(['pay_type_list', 'type_name', 'status_name'])->findOrEmpty()->toArray(); $pay = $this->model->where($where)->append(['type_name', 'status_name'])->findOrEmpty()->toArray();
if(!empty($pay)){ if(!empty($pay)){
//todo 校验场景控制支付方式 //todo 校验场景控制支付方式
$pay['pay_type_list'] = array_values((new CorePayChannelService())->getAllowPayTypeByCahnnel($site_id, $channel, $pay['pay_type_list'])); $pay['pay_type_list'] = array_values((new CorePayChannelService())->getAllowPayTypeByChannel($site_id, $channel, $pay->trade_type));
} }
return $pay; return $pay;
} }
@ -111,11 +110,9 @@ class CorePayService extends BaseCoreService
$money = $pay['money']; $money = $pay['money'];
$body = $pay['body']; $body = $pay['body'];
$trade_type = $pay['trade_type']; $trade_type = $pay['trade_type'];
// $allow_type = OrderTypeDict::getAllowPayType($trade_type);//当前支付允许使用的支付方式
// if(!in_array($type, $allow_type)){ if(!in_array($type, array_column((new CorePayChannelService())->getAllowPayTypeByChannel($site_id, $channel, $trade_type), 'key'))) throw new PayException('PAYMENT_METHOD_NOT_SCENE');//场景不支持
// throw new PayException('PAYMENT_METHOD_NOT_SUPPORT');//业务不支持
// }
if(!in_array($type, array_column((new CorePayChannelService())->getAllowPayTypeByCahnnel($site_id, $channel, OrderTypeDict::getAllowPayType($trade_type)), 'key'))) throw new PayException('PAYMENT_METHOD_NOT_SCENE');//场景不支持
$pay_result = $this->pay_event->init($site_id, $channel, $type)->pay($out_trade_no, $money, $body, $return_url, $quit_url, $buyer_id, $openid ?? ''); $pay_result = $this->pay_event->init($site_id, $channel, $type)->pay($out_trade_no, $money, $body, $return_url, $quit_url, $buyer_id, $openid ?? '');
//todo 特殊支付方式会直接返回支付状态,状态如果为已支付会直接支付 //todo 特殊支付方式会直接返回支付状态,状态如果为已支付会直接支付
if(!empty($pay_result['status']) && $pay_result['status'] == PayDict::STATUS_ED){ if(!empty($pay_result['status']) && $pay_result['status'] == PayDict::STATUS_ED){

View File

@ -212,7 +212,6 @@ class CoreRefundService extends BaseCoreService
* @return void * @return void
*/ */
public function refundFail(int $site_id, array $data){ public function refundFail(int $site_id, array $data){
$out_trade_no = $data['out_trade_no'];
$refund_no = $data['refund_no']; $refund_no = $data['refund_no'];
$this->model->where([ $this->model->where([
['site_id', '=', $site_id], ['site_id', '=', $site_id],

View File

@ -52,16 +52,6 @@ class CoreSiteService extends BaseCoreService
}, },
self::$cache_tag_name.$site_id self::$cache_tag_name.$site_id
); );
// return Cache::tag(self::$cache_tag_name.$site_id)->remember($cache_name.$site_id, function () use ($site_id) {
// $where = [
// ['site_id', '=', $site_id],
// ];
// $site = $this->model->where($where)->field('app_type,site_name,logo,group_id, status, expire_time')->findOrEmpty();
// if(!$site->isEmpty()){
// $site->append(['status_name']);
// }
// return $site->toArray();
// });
} }
/** /**

View File

@ -36,15 +36,19 @@ class CoreFileService extends BaseCoreService
*/ */
protected $upload_driver; protected $upload_driver;
protected static $storage_type; protected static $storage_type;
/** /**
* 实例化上传引擎 * 实例化上传引擎
* @param int $site_id * @param int $site_id
* @param bool $is_local * @param bool $is_local
* @return FileDriver * @return UploadLoader
* @throws \Exception
*/ */
public function driver(int $site_id, bool $is_local = false){ public function driver(int $site_id, string $storage_type = ''){
if($is_local){ if(!empty($storage_type)){
self::$storage_type = FileDict::LOCAL; self::$storage_type = $storage_type;
$core_storage_service = new CoreStorageService();
$storage_config = $core_storage_service->getStorageByType($site_id, $storage_type);
}else{ }else{
$core_storage_service = new CoreStorageService(); $core_storage_service = new CoreStorageService();
$storage_config = $core_storage_service->getDefaultStorage($this->request->defaultSiteId()); $storage_config = $core_storage_service->getDefaultStorage($this->request->defaultSiteId());

View File

@ -0,0 +1,62 @@
<?php
// +----------------------------------------------------------------------
// | Niucloud-admin 企业快速开发的saas管理平台
// +----------------------------------------------------------------------
// | 官方网址https://www.niucloud-admin.com
// +----------------------------------------------------------------------
// | niucloud团队 版权所有 开源版本可自由商用
// +----------------------------------------------------------------------
// | Author: Niucloud Team
// +----------------------------------------------------------------------
namespace app\service\core\upload;
use app\dict\sys\FileDict;
use app\dict\sys\StorageDict;
use app\service\core\sys\CoreAttachmentService;
use core\exception\UploadFileException;
/**
* 图片服务层
* Class CoreUploadService
* @package app\service\core\file
*/
class CoreImageService extends CoreFileService
{
/**
* @param int $site_id
* @param string $file_path
* @param $thumb_type 裁剪的图片规格
* @return mixed
* @throws \Exception
*/
public function thumb(int $site_id, string $file_path, $thumb_type = 'all')
{
$file_parse = parse_url($file_path);
$file_domain = $file_parse['scheme'] . '://' . $file_parse['host'];
//判断是哪个云上传的实例
$storage_type_list = (new CoreStorageService())->getStorageConfigList();
foreach($storage_type_list as $k => $v){
$item_params = $v['params'] ?? [];
$item_domain = $item_params['domain'] ?? '';
if($item_domain == $file_domain){
$this->upload_driver = $this->driver($site_id, $v['storage_type']);
}
}
//没有云上传就用本地上传
if(empty($this->upload_driver)){
$this->upload_driver = $this->driver($site_id, StorageDict::LOCAL);
}
//如果是网络图片,可以将网络图片拉取到本地
try {
$thumb_list = $this->upload_driver->thumb($file_path, $thumb_type);
return $thumb_list;
} catch (\Throwable $e) {
throw new UploadFileException($e->getMessage());
}
}
}

View File

@ -38,6 +38,23 @@ class CoreStorageService extends BaseCoreService
} }
} }
/**
* 通过存储方式获取配置
* @param int $site_id
* @param string $type
* @return array|mixed|void
*/
public function getStorageByType(int $site_id, string $type){
$storage_list = $this->getStorageConfigList($site_id);
foreach($storage_list as $k => $v){
if($k == $type){
$item_storage = $v['params'] ?? [];
$item_storage['storage_type'] = $v['storage_type'];
return $item_storage;
}
}
}
/** /**
* 获取存储配置 * 获取存储配置
* @param $site_id * @param $site_id

View File

@ -12,6 +12,7 @@
namespace app\service\core\upload; namespace app\service\core\upload;
use app\dict\sys\FileDict; use app\dict\sys\FileDict;
use app\dict\sys\StorageDict;
use app\service\core\sys\CoreAttachmentService; use app\service\core\sys\CoreAttachmentService;
/** /**
@ -29,36 +30,33 @@ class CoreUploadService extends CoreFileService
/** /**
* 图片上传 * 图片上传
* @param $site_id * @param string $file
* @param $cate_id * @param int $site_id
* @param $app_type * @param string $file_dir
* @param $file_path * @param int $cate_id
* @return array * @return array
*/ */
public function image(string $file, int $site_id, string $file_dir, int $cate_id = 0) public function image(string $file, int $site_id, string $file_dir, int $cate_id = 0)
{ {
//校验上传设置
// $this->checkFile($site_id, $file, FileDict::IMAGE);
//实例化上传引擎 //实例化上传引擎
$this->upload_driver = $this->driver($site_id); $this->upload_driver = $this->driver($site_id);
//读取上传附件的信息用于后续得校验和数据写入 //读取上传附件的信息用于后续得校验和数据写入
$this->upload_driver->read($file); $this->upload_driver->read($file);
//生成缩略图....
return $this->after($site_id, $file_dir, FileDict::IMAGE, $cate_id); return $this->after($site_id, $file_dir, FileDict::IMAGE, $cate_id);
} }
/** /**
* 视频上传 * 视频上传
* @param $file * @param string $file
* @param $site_id * @param int $site_id
* @param $cate_id * @param string $file_dir
* @param $file_dir * @param int $cate_id
* @return array * @return array
*/ */
public function video(string $file, int $site_id, string $file_dir, int $cate_id) public function video(string $file, int $site_id, string $file_dir, int $cate_id)
{ {
//校验上传设置
// $this->checkFile($site_id, $file, FileDict::VIDEO);
//实例化上传引擎 //实例化上传引擎
$this->upload_driver = $this->driver($site_id); $this->upload_driver = $this->driver($site_id);
//读取上传附件的信息用于后续得校验和数据写入 //读取上传附件的信息用于后续得校验和数据写入
@ -77,13 +75,10 @@ class CoreUploadService extends CoreFileService
* @param bool $is_rename 是否重命名 * @param bool $is_rename 是否重命名
* @return array * @return array
*/ */
public function document(string $file, int $site_id, string $type, string $file_dir, bool $is_local = false, bool $is_rename = true) public function document(string $file, int $site_id, string $type, string $file_dir, bool $storage_type, bool $is_rename = true)
{ {
//校验上传设置(todo 文件暂时不校验,后补安全性校验)
// $this->checkFile($site_id, $file, $type ?: FileDict::DOCUMENT);
//实例化上传引擎 //实例化上传引擎
$this->upload_driver = $this->driver($site_id, $is_local); $this->upload_driver = $this->driver($site_id, $storage_type);
//读取上传附件的信息用于后续得校验和数据写入 //读取上传附件的信息用于后续得校验和数据写入
$this->upload_driver->read($file, $is_rename); $this->upload_driver->read($file, $is_rename);

View File

@ -11,7 +11,7 @@ return [
// 多语言自动侦测变量名 // 多语言自动侦测变量名
'detect_var' => 'lang', 'detect_var' => 'lang',
// 是否使用Cookie记录 // 是否使用Cookie记录
'use_cookie' => true, 'use_cookie' => false,
// 多语言cookie变量 // 多语言cookie变量
'cookie_var' => 'lang', 'cookie_var' => 'lang',
// 多语言header变量 // 多语言header变量

View File

@ -19,7 +19,7 @@ return [
'bucket' => '' 'bucket' => ''
], ],
//腾讯云 //腾讯云
'qcloud' => [ 'tencent' => [
'access_key' => '', 'access_key' => '',
'secret_key' => '', 'secret_key' => '',
'region' => '', 'region' => '',
@ -30,12 +30,12 @@ return [
'rules' => [ 'rules' => [
'image' => [ 'image' => [
'ext' => ['jpg', 'jpeg', 'webp', 'png', 'gif'], 'ext' => ['jpg', 'jpeg', 'webp', 'png', 'gif'],
'mime' => [ 'image/jpeg','image/gif','image/png','image/webp'], 'mime' => ['image/jpeg', 'image/gif', 'image/png', 'image/webp'],
'size' => 2097152 'size' => 2097152
], ],
'video' => [ 'video' => [
'ext' => ['mp4'], 'ext' => ['mp4'],
'mime' => [ 'video/mp4'], 'mime' => ['video/mp4'],
'size' => 2097152 'size' => 2097152
], ],
'wechat' => [ 'wechat' => [
@ -54,5 +54,23 @@ return [
], ],
'size' => 2097152 'size' => 2097152
], ],
],
'thumb' => [
'thumb_type' => [
'big' => [
'width' => 400,
'height' => 400,
],
'mid' => [
'width' => 100,
'height' => 100,
],
'small' => [
'width' => 50,
'height' => 50,
],
]
] ]
]; ];

View File

@ -44,7 +44,7 @@ class Wechatpay extends BasePay
* @return mixed|Collection * @return mixed|Collection
*/ */
public function mp(array $params){ public function mp(array $params){
return $this->returnFormat(Pay::wechat()->mp([ $result = $this->returnFormat(Pay::wechat()->mp([
'out_trade_no' => $params['out_trade_no'], 'out_trade_no' => $params['out_trade_no'],
'description' => $params['boby'], 'description' => $params['boby'],
'amount' => [ 'amount' => [
@ -54,6 +54,10 @@ class Wechatpay extends BasePay
'openid' => $params['openid'], 'openid' => $params['openid'],
], ],
])); ]));
$code = $result['code'] ?? 0;
if($code == 0) return $result;
//支付错误抛出
throw new PayException($result['message']);
} }

View File

@ -19,12 +19,12 @@ class Aliyun extends BaseUpload
public function client(){ public function client(){
// true为开启CNAME。CNAME是指将自定义域名绑定到存储空间上。 // true为开启CNAME。CNAME是指将自定义域名绑定到存储空间上。
$is_cname = true; // $is_cname = false;
$access_key_id = $this->config['access_key']; $access_key_id = $this->config['access_key'];
$access_key_secret = $this->config['secret_key']; $access_key_secret = $this->config['secret_key'];
$endpoint = $this->config['endpoint'];// yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1杭州为例Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。 $endpoint = $this->config['endpoint'];// yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1杭州为例Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
$oss_client = new OssClient($access_key_id, $access_key_secret, $endpoint, $is_cname); $oss_client = new OssClient($access_key_id, $access_key_secret, $endpoint);
return $oss_client; return $oss_client;
} }
@ -90,5 +90,20 @@ class Aliyun extends BaseUpload
} }
public function thumb($file_path, $thumb_type){
$thumb_config = config('upload.thumb.thumb_type');
$thumb_data = [];
foreach($thumb_config as $k => $v){
if($thumb_type == 'all' || $thumb_type == $k){
$width = $v['width'];
$height = $v['height'];
//拼装缩略路径
$item_thumb = $file_path. '?x-oss-process=image/resize,h_' . $height . ',w_' . $width;
$thumb_data[] = $item_thumb;
}
}
return $thumb_data;
}
} }

View File

@ -62,8 +62,13 @@ abstract class BaseUpload extends Storage
*/ */
abstract protected function delete(string $file_name); abstract protected function delete(string $file_name);
/**
* 缩略图
* @param string $file_path
* @param $type
* @return mixed
*/
abstract protected function thumb(string $file_path, $thumb_type);
/** /**
* 读取文件 * 读取文件
* @param $name * @param $name

View File

@ -3,12 +3,28 @@ namespace core\upload;
use core\exception\UploadFileException; use core\exception\UploadFileException;
use Exception; use Exception;
use Grafika\Grafika;
use Intervention\Image\Image;
use Symfony\Component\HttpFoundation\File\Exception\UploadException;
/** /**
* 文件管理驱动类 * 文件管理驱动类
*/ */
class Local extends BaseUpload class Local extends BaseUpload
{ {
//位置
private $position = array(
0 => 'top-left',
1 => 'op-center',
2 => 'top-right',
3 => 'center-left',
4 => 'center',
5 => 'center-right',
6 => 'bottom-left',
7 => 'bottom-center',
8 => 'bottom-right',
9 => 'smart'
);
protected function initialize(array $config = []) protected function initialize(array $config = [])
{ {
parent::initialize($config); parent::initialize($config);
@ -77,4 +93,43 @@ class Local extends BaseUpload
} }
return unlink($file_path); return unlink($file_path);
} }
/**
* 缩略图
* @param $file_path
* @param array $type
* @return array
* @throws Exception
*/
public function thumb($file_path, $thumb_type){
//todo 判断缩略图是否存在
$thumb_config = config('upload.thumb.thumb_type');
// ……
//获取文件原名 获取
$file_arr = explode(DIRECTORY_SEPARATOR, $file_path);
$file_name = end($file_arr);
$thumb_list = [];
//获取文件后缀
foreach($thumb_config as $k => $v){
if($thumb_type == 'all' || $thumb_type == $k){
$new_thumb_path = str_replace($file_name, $k.'_'.$file_name, $file_path);
if(!file_exists($new_thumb_path)){
$editor = Grafika::createEditor();
$editor->open( $image, $file_path);
$new_width = $v['width'];
$new_height = $v['height'];
$editor->resizeFit( $image, $new_width,$new_height );
//新缩略图文件名称
$editor->save($image, $new_thumb_path, null, null, false, 0777);
}
$thumb_list[$k] = $new_thumb_path;
}
}
return $thumb_list;
}
public function water(){
}
} }

View File

@ -84,4 +84,22 @@ class Qiniu extends BaseUpload
throw new UploadFileException($err->message()); throw new UploadFileException($err->message());
return true; return true;
} }
public function thumb($file_path, $thumb_type){
// http://examples-1251000004.cos.ap-shanghai.myqcloud.com/sample.jpeg?imageView2/1/w/400/h/600/q/85
$thumb_config = config('upload.thumb.thumb_type');
$thumb_data = [];
foreach($thumb_config as $k => $v){
if($thumb_type == 'all' || $thumb_type == $k){
// ?x-oss-process=image/resize,m_fill,w_200,h_600,quality,q_60
$width = $v['width'];
$height = $v['height'];
//拼装缩略路径
$item_thumb = $file_path.'?imageView2/2/w/' . $width . '/h/' . $height;
$thumb_data[] = $item_thumb;
}
}
return $thumb_data;
}
} }

View File

@ -1,4 +1,5 @@
<?php <?php
namespace core\upload; namespace core\upload;
use core\exception\UploadFileException; use core\exception\UploadFileException;
@ -8,17 +9,19 @@ use Qcloud\Cos\Client;
/** /**
* 腾讯云存储引擎 (COS) * 腾讯云存储引擎 (COS)
*/ */
class Qcloud extends BaseUpload class Tencent extends BaseUpload
{ {
protected function initialize(array $config = []) protected function initialize(array $config = [])
{ {
parent::initialize($config); parent::initialize($config);
} }
/** /**
* 获取服务主体 * 获取服务主体
* @return Client * @return Client
*/ */
public function client(){ public function client()
{
$secret_id = $this->config['access_key']; //替换为用户的 secretId请登录访问管理控制台进行查看和管理https://console.tencentcloud.com/cam/capi $secret_id = $this->config['access_key']; //替换为用户的 secretId请登录访问管理控制台进行查看和管理https://console.tencentcloud.com/cam/capi
$secret_key = $this->config['secret_key']; //替换为用户的 secretKey请登录访问管理控制台进行查看和管理https://console.tencentcloud.com/cam/capi $secret_key = $this->config['secret_key']; //替换为用户的 secretKey请登录访问管理控制台进行查看和管理https://console.tencentcloud.com/cam/capi
$region = $this->config['region']; //替换为用户的 region已创建桶归属的region可以在控制台查看https://console.tencentcloud.com/cos5/bucket $region = $this->config['region']; //替换为用户的 region已创建桶归属的region可以在控制台查看https://console.tencentcloud.com/cos5/bucket
@ -99,4 +102,23 @@ class Qcloud extends BaseUpload
} }
} }
public function thumb($file_path, $thumb_type)
{
//腾讯云缩略图地址
$thumb_config = config('upload.thumb.thumb_type');
$thumb_data = [];
foreach($thumb_config as $k => $v){
if($thumb_type == 'all' || $thumb_type == $k){
// ?x-oss-process=image/resize,m_fill,w_200,h_600,quality,q_60
$width = $v['width'];
$height = $v['height'];
//拼装缩略路径
$item_thumb = $file_path.'?imageMogr2/thumbnail/' . $width . 'x' . $height;
$thumb_data[] = $item_thumb;
}
}
return $thumb_data;
}
} }

View File

@ -20,6 +20,7 @@ use core\loader\Loader;
* @method string|null upload(string $dir) 附件上传 * @method string|null upload(string $dir) 附件上传
* @method array fetch(string $url, ?string $key) 抓取远程附件 * @method array fetch(string $url, ?string $key) 抓取远程附件
* @method mixed delete(string $file_name) 附件删除 * @method mixed delete(string $file_name) 附件删除
* @method mixed thumb(string $file_path, $thumb_type) 附件删除
*/ */
class UploadLoader extends Loader class UploadLoader extends Loader
{ {