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;
use app\service\admin\auth\ConfigService;
use app\service\core\upload\CoreImageService;
use core\base\BaseAdminController;
use think\Response;

View File

@ -72,5 +72,50 @@ class Recharge extends BaseAdminController
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(){
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
// 全局中间件定义文件
use app\adminapi\middleware\AllowCrossDomain;
use think\middleware\LoadLangPack;
return [
//跨域请求中间件
AllowCrossDomain::class,
//语言中间件
LoadLangPack::class,
];

View File

@ -30,6 +30,14 @@ Route::group('order', function () {
Route::get('recharge/stat', 'order.Recharge/stat');
// 订单发起退款
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([
AdminCheckToken::class,
AdminCheckRole::class,

View File

@ -19,13 +19,7 @@ use think\facade\Route;
* 支付相关路由
*/
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');

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/map', 'sys.Config/setMap');
//地图设置
Route::get('config/map', 'sys.Config/getMap');
//登录注册设置
Route::get('config/login', 'login.Config/getConfig');
//登录注册设置

View File

@ -1,7 +1,10 @@
<?php
// 全局中间件定义文件
use app\api\middleware\AllowCrossDomain;
use think\middleware\LoadLangPack;
return [
//跨域请求中间件
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)
{
$lang_config = config('lang') ?? [];
$range = cookie($lang_config['cookie_var']) ?? 'zh-cn';
return Lang::get($str, [], $range);
return Lang::get($str);
}

View File

@ -67,7 +67,7 @@
'is_show' => 1,
],
[
'menu_name' => '站点用户',
'menu_name' => '站点管理员',
'menu_key' => 'site_user',
'menu_type' => 1,
'icon' => 'element-User',
@ -245,7 +245,7 @@
],
[
'menu_name' => '管理员',
'menu_name' => '平台管理员',
'menu_key' => 'auth_user',
'menu_type' => 1,
'icon' => 'iconfont-iconyonghu',
@ -515,7 +515,7 @@
],
[
'menu_name' => '环境检测',
'menu_key' => 'iconfont-iconsixingjiance',
'menu_key' => 'tools_check_environment',
'menu_type' => 1,
'icon' => 'element-SetUp',
'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_key' => 'finance',
@ -373,47 +472,6 @@ return
'status' => 1,
'is_show' => 1,
'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_key' => 'cash_out_list',
@ -426,35 +484,6 @@ return
'sort' => 99,
'status' => 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,
],
]
]
]
],
@ -1140,6 +1169,19 @@ return
]
]
],
[
'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' ],
'AddSiteAfter' => [ 'app\listener\site\AddSiteAfterListener' ],
/**
* 消息相关事件
*/
/**
* 支付相关事件
*/
//支付成功
'PaySuccess' => [ 'app\listener\pay\PaySuccessListener' ],
//退款成功
'RefundSuccess' => [ 'app\listener\pay\RefundSuccessListener' ],
//转账成功
'TransferSuccess' => [ 'app\listener\pay\TransferSuccessListener' ],
/**
* 订单相关事件
*/
// 任务失败统一回调,有四种定义方式
'queue_failed'=> [

View File

@ -1359,7 +1359,7 @@ CREATE TABLE article (
author varchar(255) NOT NULL DEFAULT '' COMMENT '作者',
content text DEFAULT NULL 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-否',
sort 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_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;
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;
use app\service\core\member\CoreMemberService;
use app\service\core\order\CoreOrderService;
use app\service\core\order\recharge\CoreRechargeOrderService;
class RechargeSuccess extends BaseNoticeTemplate
{
@ -17,8 +17,8 @@ class RechargeSuccess extends BaseNoticeTemplate
$site_id = $params['site_id'];
$order_id = $data['order_id'];
$core_order_service = new CoreOrderService();
$order = $core_order_service->getOrderInfo($site_id, $order_id);
$core_order_service = new CoreRechargeOrderService();
$order = $core_order_service->orderInfo($site_id, $order_id);
if (!empty($order)){
$member = (new CoreMemberService())->getInfoByMemberId($site_id, $order['member_id']);
//通过订单id查询订单信息

View File

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

View File

@ -9,24 +9,22 @@
// | 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
{
/**
* 查询订单适配的支付方式
* @param $type
* @return void
*/
public static function getAllowPayType($type){
/** @var RechargeOrderDict $class */
$class = __NAMESPACE__ . '\\' . ucfirst(strtolower($type)).'OrderDict';
return $class::ALLOW_PAY;
public function handle(array $refund_info)
{
$trade_type = $refund_info['trade_type'] ?? '';
if($trade_type == 'recharge')
{
(new CoreRechargeRefundService())->refundComplete($refund_info['refund_no']);
}
}
}

View File

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

View File

@ -99,7 +99,7 @@ class Article extends BaseModel
}
public function getArticleUrlAttr($value, $data) {
$site_tag = '/s' . $data['site_id'];
$site_tag = $data['site_id'] == 1 ? '' : '/s' . $data['site_id'];
$data = [
'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']}"

View File

@ -17,11 +17,11 @@ use app\model\pay\Pay;
use core\base\BaseModel;
/**
* 订单模型
* Class Order
* 充值订单模型
* Class RechargeOrder
* @package app\model\order
*/
class Order extends BaseModel
class RechargeOrder extends BaseModel
{
/**
@ -34,7 +34,7 @@ class Order extends BaseModel
* 模型名称
* @var string
*/
protected $name = 'order';
protected $name = 'recharge_order';
//类型
protected $type = [
@ -42,37 +42,6 @@ class Order extends BaseModel
'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()
{
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
* @package app\model\order
*/
class OrderItem extends BaseModel
class RechargeOrderItem extends BaseModel
{
/**
@ -31,14 +31,14 @@ class OrderItem extends BaseModel
* 模型名称
* @var string
*/
protected $name = 'order_item';
protected $name = 'recharge_order_item';
/**
* @return HasOne
*/
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
*/
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;
use app\dict\order\RechargeOrderDict;
use app\model\member\Member;
use app\model\pay\Refund;
use core\base\BaseModel;
@ -20,7 +21,7 @@ use core\base\BaseModel;
* Class OrderItem
* @package app\model\order
*/
class OrderItemRefund extends BaseModel
class RechargeOrderItemRefund extends BaseModel
{
//类型
protected $type = [
@ -39,7 +40,7 @@ class OrderItemRefund extends BaseModel
* 模型名称
* @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)
{
$class = "\\app\\dict\\order\\" . ucfirst($data['item_type']). "OrderDict";
if (!class_exists($class)) return '';
return $class::getRefundStatus()[$data['status'] ?? '']['name'] ?? '';
return RechargeOrderDict::getRefundStatus()[$data['status'] ?? '']['name'] ?? '';
}
/**
@ -58,7 +57,7 @@ class OrderItemRefund extends BaseModel
* @return \think\model\relation\HasOne
*/
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)
{
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)
{
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)
{
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]) ;
$end_time = empty($value[1]) ? 0 : strtotime($value[1]) ;
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){
$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){
$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
* @package app\model\order
*/
class OrderLog extends BaseModel
class RechargeOrderLog extends BaseModel
{
/**
@ -31,7 +31,7 @@ class OrderLog extends BaseModel
* 模型名称
* @var string
*/
protected $name = 'order_log';
protected $name = 'recharge_order_log';
}

View File

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

View File

@ -12,6 +12,7 @@
namespace app\service\admin\file;
use app\dict\sys\FileDict;
use app\dict\sys\StorageDict;
use app\service\core\upload\CoreUploadService;
use core\base\BaseAdminService;
use core\exception\UploadFileException;
@ -62,6 +63,6 @@ class UploadService extends BaseAdminService
throw new UploadFileException('CERT_TYPE_ERROR');
$dir = $this->root_path.'/document/'.$type.'/'.$this->site_id.'/'.date('Ym').'/'.date('d');
$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>
<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-form :model="formData" label-width="90px" ref="formRef" :rules="formRules" class="page-form">
{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 { useRoute } from 'vue-router'
const router = useRoute()
const id:number = parseInt(router.query.id);
const route = useRoute()
const id:number = parseInt(route.query.id);
const loading = ref(false)
const pageName = route.meta.title
/**
* 表单数据

View File

@ -11,6 +11,8 @@
namespace app\service\admin\order;
use app\dict\order\RechargeOrderDict;
use app\model\order\RechargeOrderItemRefund;
use app\service\core\order\recharge\CoreRechargeRefundService;
use core\base\BaseAdminService;
@ -24,6 +26,7 @@ class RechargeOrderRefundService extends BaseAdminService
public function __construct()
{
parent::__construct();
$this->model = new RechargeOrderItemRefund();
}
public function create($order_id) {
@ -34,4 +37,88 @@ class RechargeOrderRefundService extends BaseAdminService
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;
use app\dict\order\RechargeOrderDict;
use app\model\order\Order;
use app\model\order\RechargeOrder;
use core\base\BaseAdminService;
/**
@ -25,7 +25,7 @@ class RechargeOrderService extends BaseAdminService
public function __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');
}, 'pay' => function($query) {
$query->field('');
} ])->order($order)->append(['order_status_info', 'order_from_name', 'refund_status_name' ]);
return $this->pageQuery($search_model);
} ])->order($order)->append(['order_from_name' ]);
$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');
}, 'pay' => function($query) {
$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;
}

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
{
@ -142,7 +140,6 @@ class PayChannelService extends BaseAdminService
];
break;
}
// $config['status'] = $data['status'] ?? '0';//是否启用
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;
use app\model\order\Order;
use app\model\order\RechargeOrder;
use app\service\admin\member\MemberService;
use app\service\admin\site\SiteService;
use app\service\admin\sys\SystemService;
@ -115,7 +115,7 @@ class SiteStatService extends BaseAdminService
['order_status', '>', 0],
['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;
}
@ -131,7 +131,7 @@ class SiteStatService extends BaseAdminService
['order_status', '>', 0],
['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;
}

View File

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

View File

@ -123,4 +123,34 @@ class ConfigService extends BaseAdminService
$res = $this->core_config_service->setConfig(0,'SERVICE_INFO', $data);
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);
$cache_name = 'menu' . md5(implode("_", $menu_keys)) . $is_tree;
return cache_remember(
$menu_list = cache_remember(
$cache_name,
function () use ($menu_keys, $app_type, $is_tree) {
$where = [
@ -128,23 +128,24 @@ class MenuService extends BaseAdminService
$where[] = ['app_type', '=', $app_type];
}
$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
);
// return Cache::tag(self::$cache_tag_name)->remember($cache_name, function () use ($menu_keys, $app_type, $is_tree) {
// $where = [
// ['menu_key', 'in', $menu_keys],
//// ['menu_type', 'in', [0,1]]
// ];
// if(!empty($app_type)){
// $where[] = ['app_type', '=', $app_type];
// }
// $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;
//
// });
foreach ($menu_list as $k => $v)
{
$lang_menu_key = "dict_menu_". $v['app_type']. '.'. $v['menu_key'];
$lang_menu_name = get_lang("dict_menu_". $v['app_type']. '.'. $v['menu_key']);
//语言已定义
if($lang_menu_key != $lang_menu_name)
{
$menu_list[$k]['menu_name'] = $lang_menu_name;
}
}
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)
{
$cache_name = 'menu_api_' .$app_type.'_'. $status . '_' . $is_tree . '_' . $is_button;
return cache_remember(
$menu_list = cache_remember(
$cache_name,
function () use ($status, $is_tree, $is_button, $app_type) {
$where = [
@ -312,21 +313,22 @@ class MenuService extends BaseAdminService
$where[] = ['status', '=', $status];
}
$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
);
// return Cache::tag(self::$cache_tag_name)->remember($cache_name, function () use ($status, $is_tree, $is_button, $app_type) {
// $where = [
//// ['menu_type', 'in', [0,1]]
// ['app_type', '=', $app_type],
// ];
// if ($status != 'all') {
// $where[] = ['status', '=', $status];
// }
// $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;
// });
foreach ($menu_list as $k => $v)
{
$lang_menu_key = "dict_menu_". $v['app_type']. '.'. $v['menu_key'];
$lang_menu_name = get_lang("dict_menu_". $v['app_type']. '.'. $v['menu_key']);
//语言已定义
if($lang_menu_key != $lang_menu_name)
{
$menu_list[$k]['menu_name'] = $lang_menu_name;
}
}
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;
$data = [
'wap_domain' => env("system.wap_domain"),
'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,
];

View File

@ -12,7 +12,7 @@
namespace app\service\api\order;
use app\dict\order\RechargeOrderDict;
use app\model\order\Order;
use app\model\order\RechargeOrder;
use app\service\core\order\recharge\CoreRechargeOrderService;
use core\base\BaseApiService;
@ -26,7 +26,7 @@ class RechargeOrderService extends BaseApiService
public function __construct()
{
parent::__construct();
$this->model = new Order();
$this->model = new RechargeOrder();
}
/**
@ -54,8 +54,16 @@ class RechargeOrderService extends BaseApiService
$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) {
$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']);
return $this->pageQuery($search_model);
}])->order($order)->append(['order_from_name']);
$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';
$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');
}])->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;
}

View File

@ -11,6 +11,7 @@
namespace app\service\api\upload;
use app\dict\sys\StorageDict;
use app\service\core\upload\CoreUploadService;
use core\base\BaseApiService;
@ -60,6 +61,6 @@ class UploadService extends BaseApiService
{
$dir = $this->root_path . '/' . 'document' . '/' . $this->site_id . '/' . date('Ym') . '/' . date('d');
$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;
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\order\CoreOrderCreateService;
use app\service\core\pay\CorePayService;
use core\base\BaseCoreService;
use core\exception\CommonException;
use think\facade\Cache;
use think\facade\Db;
/**
* 充值订单流程
@ -25,9 +29,6 @@ use core\exception\CommonException;
*/
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]
@ -61,8 +62,52 @@ class CoreRechargeOrderService extends BaseCoreService
'is_refund' => 0
]
];
$res = (new CoreOrderCreateService())->create($data['site_id'], $order_data, $order_items);
return $res;
Db::startTrans();
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)
{
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();
if (empty($order_info))
throw new CommonException('ORDER_NOT_EXIST');
@ -97,12 +142,27 @@ class CoreRechargeOrderService extends BaseCoreService
* @return void
*/
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->order_status == RechargeOrderDict::CLOSE) throw new CommonException('ORDER_CLOSED');
$order->save(['order_status' => RechargeOrderDict::CLOSE]);
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\model\member\Member;
use app\model\order\Order;
use app\model\order\OrderItem;
use app\model\order\OrderItemRefund;
use app\model\order\RechargeOrder;
use app\model\order\RechargeOrderItem;
use app\model\order\RechargeOrderItemRefund;
use app\service\core\member\CoreMemberAccountService;
use app\service\core\order\CoreOrderRefundService;
use app\service\core\pay\CoreRefundService;
use core\base\BaseCoreService;
use core\exception\CommonException;
@ -39,12 +38,12 @@ class CoreRechargeRefundService extends BaseCoreService
* @return void
*/
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_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 (!$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');
Db::startTrans();
@ -60,20 +59,30 @@ class CoreRechargeRefundService extends BaseCoreService
$order['out_trade_no'] = $order['ordermain']['out_trade_no'];
$order['money'] = $order['item_money'] > $member_info['balance'] ? $member_info['balance'] : $order['item_money'];
$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([
'refund_no' => $creat_res['refund_no'],
'refund_no' => $refund_no,
'refund_status' => RechargeOrderDict::REFUNDING
]);
$order_model->ordermain->save([
'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();
@ -101,7 +110,7 @@ class CoreRechargeRefundService extends BaseCoreService
* @return void
*/
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->status != RechargeOrderDict::REFUNDING) throw new CommonException('REFUND_STATUS_ABNORMAL');
@ -109,7 +118,7 @@ class CoreRechargeRefundService extends BaseCoreService
try {
$model->save(['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);
Db::commit();
return true;

View File

@ -14,6 +14,8 @@ namespace app\service\core\pay;
use app\dict\pay\PayDict;
use app\model\pay\PayChannel;
use app\service\core\weapp\CoreWeappConfigService;
use app\service\core\wechat\CoreWechatConfigService;
use core\base\BaseCoreService;
use think\Model;
@ -39,24 +41,28 @@ class CorePayChannelService extends BaseCoreService
$where['site_id'] = $site_id;
return $this->model->where($where)->findOrEmpty();
}
/**
* 通过渠道获取支持的支付方式(专属用于支付业务)
* @param int $site_id
* @param string $channel
* @param array $pay_type_list 外部业务支付类型限制
* @return array
* @param string $trade_type
* @return array|array[]
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @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();
if(!empty($channel_pay_list)){
$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);
}
//充值订单不支持余额支付
if(!empty($pay_type_list) && $trade_type == 'recharge'){
unset($pay_type_list[PayDict::BALANCEPAY]);
}
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();
if(!$pay_channel->isEmpty()){
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 [];
}
/**
* 获取完整的微信支付配置(根据场景)
* @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;
use app\dict\order\OrderTypeDict;
use app\dict\pay\OnlinePayDict;
use app\dict\pay\PayDict;
use app\job\pay\PayReturnTo;
@ -71,7 +70,7 @@ class CorePayService extends BaseCoreService
['site_id', '=', $site_id],
['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],
['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)){
//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;
}
@ -111,11 +110,9 @@ class CorePayService extends BaseCoreService
$money = $pay['money'];
$body = $pay['body'];
$trade_type = $pay['trade_type'];
// $allow_type = OrderTypeDict::getAllowPayType($trade_type);//当前支付允许使用的支付方式
// if(!in_array($type, $allow_type)){
// 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');//场景不支持
if(!in_array($type, array_column((new CorePayChannelService())->getAllowPayTypeByChannel($site_id, $channel, $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 ?? '');
//todo 特殊支付方式会直接返回支付状态,状态如果为已支付会直接支付
if(!empty($pay_result['status']) && $pay_result['status'] == PayDict::STATUS_ED){

View File

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

View File

@ -52,16 +52,6 @@ class CoreSiteService extends BaseCoreService
},
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 static $storage_type;
/**
* 实例化上传引擎
* @param int $site_id
* @param bool $is_local
* @return FileDriver
* @return UploadLoader
* @throws \Exception
*/
public function driver(int $site_id, bool $is_local = false){
if($is_local){
self::$storage_type = FileDict::LOCAL;
public function driver(int $site_id, string $storage_type = ''){
if(!empty($storage_type)){
self::$storage_type = $storage_type;
$core_storage_service = new CoreStorageService();
$storage_config = $core_storage_service->getStorageByType($site_id, $storage_type);
}else{
$core_storage_service = new CoreStorageService();
$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

View File

@ -12,6 +12,7 @@
namespace app\service\core\upload;
use app\dict\sys\FileDict;
use app\dict\sys\StorageDict;
use app\service\core\sys\CoreAttachmentService;
/**
@ -29,36 +30,33 @@ class CoreUploadService extends CoreFileService
/**
* 图片上传
* @param $site_id
* @param $cate_id
* @param $app_type
* @param $file_path
* @param string $file
* @param int $site_id
* @param string $file_dir
* @param int $cate_id
* @return array
*/
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->read($file);
//生成缩略图....
return $this->after($site_id, $file_dir, FileDict::IMAGE, $cate_id);
}
/**
* 视频上传
* @param $file
* @param $site_id
* @param $cate_id
* @param $file_dir
* @param string $file
* @param int $site_id
* @param string $file_dir
* @param int $cate_id
* @return array
*/
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);
//读取上传附件的信息用于后续得校验和数据写入
@ -77,13 +75,10 @@ class CoreUploadService extends CoreFileService
* @param bool $is_rename 是否重命名
* @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);

View File

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

View File

@ -19,7 +19,7 @@ return [
'bucket' => ''
],
//腾讯云
'qcloud' => [
'tencent' => [
'access_key' => '',
'secret_key' => '',
'region' => '',
@ -30,12 +30,12 @@ return [
'rules' => [
'image' => [
'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
],
'video' => [
'ext' => ['mp4'],
'mime' => [ 'video/mp4'],
'mime' => ['video/mp4'],
'size' => 2097152
],
'wechat' => [
@ -54,5 +54,23 @@ return [
],
'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
*/
public function mp(array $params){
return $this->returnFormat(Pay::wechat()->mp([
$result = $this->returnFormat(Pay::wechat()->mp([
'out_trade_no' => $params['out_trade_no'],
'description' => $params['boby'],
'amount' => [
@ -54,6 +54,10 @@ class Wechatpay extends BasePay
'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(){
// true为开启CNAME。CNAME是指将自定义域名绑定到存储空间上。
$is_cname = true;
// $is_cname = false;
$access_key_id = $this->config['access_key'];
$access_key_secret = $this->config['secret_key'];
$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;
}
@ -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);
/**
* 缩略图
* @param string $file_path
* @param $type
* @return mixed
*/
abstract protected function thumb(string $file_path, $thumb_type);
/**
* 读取文件
* @param $name

View File

@ -3,12 +3,28 @@ namespace core\upload;
use core\exception\UploadFileException;
use Exception;
use Grafika\Grafika;
use Intervention\Image\Image;
use Symfony\Component\HttpFoundation\File\Exception\UploadException;
/**
* 文件管理驱动类
*/
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 = [])
{
parent::initialize($config);
@ -77,4 +93,43 @@ class Local extends BaseUpload
}
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());
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
namespace core\upload;
use core\exception\UploadFileException;
@ -8,17 +9,19 @@ use Qcloud\Cos\Client;
/**
* 腾讯云存储引擎 (COS)
*/
class Qcloud extends BaseUpload
class Tencent extends BaseUpload
{
protected function initialize(array $config = [])
{
parent::initialize($config);
}
/**
* 获取服务主体
* @return Client
*/
public function client(){
public function client()
{
$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
$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 array fetch(string $url, ?string $key) 抓取远程附件
* @method mixed delete(string $file_name) 附件删除
* @method mixed thumb(string $file_path, $thumb_type) 附件删除
*/
class UploadLoader extends Loader
{