This commit is contained in:
全栈小学生 2024-10-31 15:29:27 +08:00
parent ede5f226e0
commit bae138de57
45 changed files with 881 additions and 453 deletions

View File

@ -128,4 +128,19 @@ class Schedule extends BaseAdminController
{
return success(data: ScheduleDict::getDateType());
}
/**
* 执行一次任务
* @param int $id
* @return Response
*/
public function doSchedule(int $id)
{
$res = (new ScheduleService())->doSchedule($id);
if ($res) {
return success('SUCCESS');
} else {
return fail('FAIL');
}
}
}

View File

@ -0,0 +1,65 @@
<?php
// +----------------------------------------------------------------------
// | Niucloud-admin 企业快速开发的saas管理平台
// +----------------------------------------------------------------------
// | 官方网址https://www.niucloud.com
// +----------------------------------------------------------------------
// | niucloud团队 版权所有 开源版本可自由商用
// +----------------------------------------------------------------------
// | Author: Niucloud Team
// +----------------------------------------------------------------------
namespace app\adminapi\controller\sys;
use app\service\admin\schedule\ScheduleLogService;
use core\base\BaseAdminController;
use think\Response;
/**
* 计划任务执行记录
*/
class ScheduleLog extends BaseAdminController
{
/**
* 任务执行记录列表
* @return Response
*/
public function lists()
{
$data = $this->request->params([
['schedule_id', ''],
['key', ''],
['status', 'all'],
['execute_time', []]
]);
return success(data: (new ScheduleLogService())->getPage($data));
}
/**
* 删除计划任务执行记录
* @return Response
*/
public function del()
{
$data = $this->request->params([
[ 'ids', '' ],
]);
(new ScheduleLogService())->del($data[ 'ids' ]);
return success('DELETE_SUCCESS');
}
/**
* 清空计划任务执行记录
* @return Response
*/
public function clear()
{
$data = $this->request->params([
[ 'schedule_id', '' ],
]);
(new ScheduleLogService())->clear($data);
return success('SUCCESS');
}
}

View File

@ -188,6 +188,16 @@ Route::group('sys', function() {
Route::get('schedule/template', 'sys.Schedule/template');
//任务时间间隔
Route::get('schedule/datetype', 'sys.Schedule/getDateType');
//执行一次任务
Route::put('schedule/do/:id', 'sys.Schedule/doSchedule');
//任务执行记录列表
Route::get('schedule/log/list', 'sys.ScheduleLog/lists');
//删除执行记录
Route::put('schedule/log/delete', 'sys.ScheduleLog/del');
//清空执行记录
Route::put('schedule/log/clear', 'sys.ScheduleLog/clear');
/***************************************************** 应用管理 ****************************************************/
Route::get('applist', 'sys.App/getAppList');

View File

@ -23,7 +23,10 @@ class Config extends BaseController
*/
public function getLoginConfig()
{
return success(( new MemberConfigService() )->getLoginConfig());
$data = $this->request->params([
[ 'url', '' ],
]);
return success(( new MemberConfigService() )->getLoginConfig($data[ 'url' ]));
}
}

View File

@ -11,8 +11,13 @@
namespace app\api\controller\sys;
use app\service\api\diy\DiyConfigService;
use app\service\api\member\MemberConfigService;
use app\service\api\member\MemberLevelService;
use app\service\api\member\MemberService;
use app\service\api\site\SiteService;
use app\service\api\sys\ConfigService;
use app\service\api\wechat\WechatAuthService;
use core\base\BaseApiController;
use think\Response;
@ -66,4 +71,25 @@ class Config extends BaseApiController
{
return success(( new ConfigService() )->getMap());
}
/**
* 获取初始化数据信息
* @return Response
*/
public function init()
{
$data = $this->request->params([
[ 'url', '' ],
]);
$res = [];
$res[ 'tabbar_list' ] = ( new DiyConfigService() )->getBottomList();
$res[ 'map_config' ] = ( new ConfigService() )->getMap();
$res[ 'site_info' ] = ( new SiteService() )->getSiteCache();
$res[ 'member_level' ] = ( new MemberLevelService() )->getList();
$res[ 'login_config' ] = ( new MemberConfigService() )->getLoginConfig($data[ 'url' ]);
( new MemberService() )->initMemberData();
return success($res);
}
}

View File

@ -30,8 +30,8 @@ Route::any('weapp/serve/:site_id', 'weapp.Serve/serve')
->middleware(ApiLog::class);
Route::group(function() {
Route::post('niucloud/notify', function(){
return (new CoreNotifyService())->notify();
Route::post('niucloud/notify', function() {
return ( new CoreNotifyService() )->notify();
});
});
@ -106,6 +106,9 @@ Route::group(function() {
// 获取地图设置
Route::get('map', 'sys.Config/getMap');
// 获取初始化数据信息
Route::get('init', 'sys.Config/init');
/***************************************************** 地区管理 ****************************************************/
//通过pid获取列表
Route::get('area/list_by_pid/:pid', 'sys.Area/listByPid');

View File

@ -261,7 +261,28 @@ class ComponentDict
'value' => [
"style" => "style-1",
"styleName" => "风格1"
],
],// 组件属性
'template' => [
"textColor" => "#303133", // 文字颜色
'pageStartBgColor' => '', // 底部背景颜色(开始)
'pageEndBgColor' => '', // 底部背景颜色(结束)
'pageGradientAngle' => 'to bottom', // 渐变角度从上到下to bottom、从左到右to right
'componentBgUrl' => '', // 组件背景图片
'componentBgAlpha' => 2, // 组件背景图片的透明度0~10
"componentStartBgColor" => '', // 组件背景颜色(开始)
"componentEndBgColor" => '', // 组件背景颜色(结束)
"componentGradientAngle" => 'to bottom', // 渐变角度上下to bottom、左右to right
"topRounded" => 12, // 组件上圆角
"bottomRounded" => 0, // 组件下圆角
"elementBgColor" => '', // 元素背景颜色
"topElementRounded" => 0,// 元素上圆角
"bottomElementRounded" => 0, // 元素下圆角
"margin" => [
"top" => 0, // 上边距
"bottom" => 0, // 下边距
"both" => 10 // 左右边距
]
]
],
'Notice' => [
'title' => '公告',
@ -314,6 +335,7 @@ class ComponentDict
'value' => 'style-1'
],
'text' => '超值爆款',
'textImg' => 'static/resource/images/diy/active_cube/journalism.png',
"textLink" => [
"name" => ""
],
@ -330,7 +352,8 @@ class ComponentDict
"blockStyle" => [
'title' => '风格1',
'value' => 'style-1',
'fontWeight' => 'normal'
'fontWeight' => 'normal',
'btnText' => 'normal'
],
'list' => [
[
@ -350,8 +373,8 @@ class ComponentDict
"endColor" => "#FE1E00",
],
"listFrame" => [
"startColor" => "#FEA715",
"endColor" => "#FE1E00",
"startColor" => "#FFFAF5",
"endColor" => "#FFFFFF"
],
"link" => [
"name" => ""
@ -375,8 +398,8 @@ class ComponentDict
"endColor" => "#FF9E03",
],
"listFrame" => [
"startColor" => "#FFBF50",
"endColor" => "#FF9E03",
"startColor" => "#FFFAF5",
"endColor" => "#FFFFFF"
],
"link" => [
"name" => ""
@ -400,8 +423,8 @@ class ComponentDict
"endColor" => "#49CD2D",
],
"listFrame" => [
"startColor" => "#A2E792",
"endColor" => "#49CD2D",
"startColor" => "#FFFAF5",
"endColor" => "#FFFFFF"
],
"link" => [
"name" => ""
@ -425,8 +448,8 @@ class ComponentDict
"endColor" => "#1D7CFF",
],
"listFrame" => [
"startColor" => "#4AC1FF",
"endColor" => "#1D7CFF",
"startColor" => "#FFFAF5",
"endColor" => "#FFFFFF"
],
"link" => [
"name" => ""
@ -480,7 +503,11 @@ class ComponentDict
'hotWord' => [
"interval" => 3,
'list' => []
]
],
'color' => '#999999',
'btnColor' => '#ffffff',
'bgColor' => '#ffffff',
'btnBgColor' => '#ff3434'
],
// 选项卡设置
'tab' => [
@ -590,7 +617,115 @@ class ComponentDict
'borderStyle' => 'solid'
],
],
'PictureShow' => [
'title' => '图片展播',
'icon' => 'iconfont icona-tupianzhanbopc302',
'path' => 'edit-picture-show',
'support_page' => [],
'uses' => 0,
'sort' => 10017,
'value' => [
'moduleOne' => [
'head' => [
'textImg' => 'addon/shop/diy/index/style3/picture_show_head_text3.png',
"subText" => "最高补1200元",
"subTextColor" => "#666666"
],
'list' => [
[
"btnTitle" => [
"text" => "全网低价",
"color" => "#ffffff",
"startColor" => "#F5443E",
"endColor" => "#F5443E"
],
"link" => [
"name" => ""
],
"imageUrl" => "addon/shop/diy/index/style3/picture_show_goods5.png"
],
[
"btnTitle" => [
"text" => "大牌特惠",
"color" => "#ffffff",
"startColor" => "#F5443E",
"endColor" => "#F5443E"
],
"link" => [
"name" => ""
],
"imageUrl" => "addon/shop/diy/index/style3/picture_show_goods6.png"
]
],
"listFrame" => [
"startColor" => "#D4EFFF",
"endColor" => "#EBF4FA"
]
],
'moduleTwo' => [
'head' => [
'textImg' => 'addon/shop/diy/index/style3/picture_show_head_text4.png',
"subText" => "每日上新",
"subTextColor" => "#666666"
],
'list' => [
[
"btnTitle" => [
"text" => "人气爆款",
"color" => "#ffffff",
"startColor" => "#F5443E",
"endColor" => "#F5443E"
],
"link" => [
"name" => ""
],
"imageUrl" => "addon/shop/diy/index/style3/picture_show_goods7.png",
],
[
"btnTitle" => [
"text" => "官方正品",
"color" => "#ffffff",
"startColor" => "#F5443E",
"endColor" => "#F5443E"
],
"link" => [
"name" => ""
],
"imageUrl" => "addon/shop/diy/index/style3/picture_show_goods8.png"
]
],
"listFrame" => [
"startColor" => "#FFF1D4",
"endColor" => "#F9F2E5"
]
],
"moduleRounded" => [
"topRounded" => 10,
"bottomRounded" => 10
],// 组件属性
'template' => [
"textColor" => "#303133", // 文字颜色
'pageStartBgColor' => '', // 底部背景颜色(开始)
'pageEndBgColor' => '', // 底部背景颜色(结束)
'pageGradientAngle' => 'to bottom', // 渐变角度从上到下to bottom、从左到右to right
'componentBgUrl' => '', // 组件背景图片
'componentBgAlpha' => 2, // 组件背景图片的透明度0~10
"componentStartBgColor" => '', // 组件背景颜色(开始)
"componentEndBgColor" => '', // 组件背景颜色(结束)
"componentGradientAngle" => 'to bottom', // 渐变角度上下to bottom、左右to right
"topRounded" => 0, // 组件上圆角
"bottomRounded" => 0, // 组件下圆角
"elementBgColor" => '', // 元素背景颜色
"topElementRounded" => 0,// 元素上圆角
"bottomElementRounded" => 0, // 元素下圆角
"margin" => [
"top" => 0, // 上边距
"bottom" => 0, // 下边距
"both" => 10 // 左右边距
],
]
],
]
],
],
];

View File

@ -1547,6 +1547,20 @@ return [
],
],
],
[
'menu_name' => '执行日志',
'menu_key' => 'tools_schedule_log',
'menu_short_name' => '执行日志',
'menu_type' => '1',
'icon' => 'iconfont iconjihuarenwu',
'api_url' => 'sys/schedule/log/list',
'router_path' => 'tools/schedule_log',
'view_path' => 'tools/schedule_log',
'methods' => '',
'sort' => '40',
'status' => '1',
'is_show' => '0'
],
[
'menu_name' => '授权信息',
'menu_key' => 'app_auth',

View File

@ -0,0 +1,32 @@
<?php
// +----------------------------------------------------------------------
// | Niucloud-admin 企业快速开发的saas管理平台
// +----------------------------------------------------------------------
// | 官方网址https://www.niucloud.com
// +----------------------------------------------------------------------
// | niucloud团队 版权所有 开源版本可自由商用
// +----------------------------------------------------------------------
// | Author: Niucloud Team
// +----------------------------------------------------------------------
namespace app\dict\schedule;
class ScheduleLogDict
{
public const SUCCESS = 'success';//执行成功
public const ERROR = 'error';//执行失败
/**
* 任务执行状态
* @return array
*/
public static function getStatus()
{
return [
self::SUCCESS => get_lang('dict_schedule_log.success'),//执行成功
self::ERROR => get_lang('dict_schedule_log.error'),//执行失败
];
}
}

View File

@ -66,7 +66,6 @@ $system_event = [
'NoticeData' => [
'app\listener\notice_template\VerifyCode',//手机验证码
'app\listener\notice_template\MemberVerifySuccess',
'app\listener\notice_template\RechargeSuccess',
],
//全场景消息发送
'Notice' => [

View File

@ -427,7 +427,7 @@ CREATE TABLE `pay_refund` (
`main_id` int NOT NULL DEFAULT 0 COMMENT '操作人',
`pay_refund_no` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '外部支付方式的退款单号',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '退款记录表' ROW_FORMAT = Dynamic;
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '支付退款记录表' ROW_FORMAT = Dynamic;
DROP TABLE IF EXISTS `pay_transfer`;
@ -480,8 +480,8 @@ CREATE TABLE `site` (
`create_time` int(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
`expire_time` bigint(20) NOT NULL DEFAULT 0 COMMENT '到期时间如果是0 无限期)',
`front_end_name` varchar(50) NOT NULL DEFAULT '' COMMENT '前台名称',
`front_end_logo` varchar(255) NOT NULL DEFAULT '' COMMENT '前台logo',
`front_end_icon` varchar(255) NOT NULL DEFAULT '' COMMENT '前台icon',
`front_end_logo` varchar(255) NOT NULL DEFAULT '' COMMENT '前台logo(长方形)',
`front_end_icon` varchar(255) NOT NULL DEFAULT '' COMMENT '前台icon(正方形)',
`icon` varchar(255) NOT NULL DEFAULT '' COMMENT '网站图标',
`member_no` varchar(255) NOT NULL DEFAULT '0' COMMENT '最大会员码值',
`app` text NOT NULL COMMENT '站点应用',
@ -879,6 +879,22 @@ CREATE TABLE `sys_schedule` (
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '系统任务' ROW_FORMAT = Dynamic;
DROP TABLE IF EXISTS `sys_schedule_log`;
CREATE TABLE `sys_schedule_log` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '执行记录id',
`schedule_id` int NOT NULL DEFAULT 0 COMMENT '任务id',
`addon` varchar(255) NOT NULL DEFAULT '' COMMENT '所属插件',
`key` varchar(255) NOT NULL DEFAULT '' COMMENT '计划任务模板key',
`name` varchar(50) NOT NULL DEFAULT '' COMMENT '计划任务名称',
`execute_time` int NOT NULL COMMENT '执行时间',
`execute_result` text DEFAULT NULL COMMENT '日志信息',
`status` varchar(255) NOT NULL DEFAULT '' COMMENT '执行状态',
`class` varchar(255) NOT NULL DEFAULT '',
`job` varchar(255) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '计划任务执行记录' ROW_FORMAT = Dynamic;
DROP TABLE IF EXISTS `sys_user`;
CREATE TABLE `sys_user` (
`uid` smallint(5) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '系统用户ID',
@ -892,7 +908,7 @@ CREATE TABLE `sys_user` (
`login_count` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '登录次数',
`status` tinyint(3) UNSIGNED NOT NULL DEFAULT 1 COMMENT '后台管理员状态 1有效0无效',
`is_del` tinyint(3) UNSIGNED NOT NULL DEFAULT 0,
`delete_time` tinyint(4) NOT NULL DEFAULT 0 COMMENT '删除时间',
`delete_time` int(11) NOT NULL DEFAULT 0 COMMENT '删除时间',
`update_time` int(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
PRIMARY KEY (`uid`) USING BTREE,
INDEX `uid`(`uid` ASC) USING BTREE

View File

@ -165,6 +165,11 @@ return [
'month' => '每月',
],
//计划任务执行记录
'dict_schedule_log' => [
'success' => '成功',
'error' => '失败',
],
//支付相关
'dict_pay' => [
'type_wechatpay' => '微信支付',

View File

@ -24,6 +24,8 @@ class MemberLoginListener
*/
public function handle(object $member)
{
// 新人专享活动
event("MemberLoginAfter", ['site_id' => $member['site_id'], 'member_id' => $member['member_id']]);
return;
}

View File

@ -30,6 +30,8 @@ class MemberRegisterListener
CoreMemberService::sendGrowth($member['site_id'], $member['member_id'], 'member_register', ['from_type' => 'member_register']);
// 注册发放积分
CoreMemberService::sendPoint($member['site_id'], $member['member_id'], 'member_register', ['from_type' => 'member_register']);
// 新人专享活动
event("MemberLoginAfter", ['site_id' => $member['site_id'], 'member_id' => $member['member_id']]);
return;
}
}

View File

@ -1,45 +0,0 @@
<?php
namespace app\listener\notice_template;
use app\service\core\member\CoreMemberService;
use app\service\core\order\recharge\CoreRechargeOrderService;
class RechargeSuccess extends BaseNoticeTemplate
{
private $key = 'recharge_success';
public function handle(array $params)
{
if ($this->key == $params[ 'key' ]) {
$data = $params[ 'data' ];
$site_id = $params[ 'site_id' ];
$order_id = $data[ '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查询订单信息
return $this->toReturn(
[
'__wechat_page' => '',//模板消息链接
'__miniprogram' => '',//模板消息小程序
'__weapp_page' => '',//小程序链接
'balance' => $member[ 'balance' ],//充值后的余额
'price' => $order[ 'order_item_money' ],//订单项总价
'time' => $order[ 'create_time' ],//创建时间
'trade_no' => $order[ 'out_trade_no' ],//交易流水号
],
[
'member_id' => $order[ 'member_id' ],
]
);
}
}
}
}

View File

@ -11,9 +11,6 @@
namespace app\listener\pay;
use app\dict\order\RechargeOrderDict;
use app\dict\pay\PayDict;
use app\service\core\order\recharge\CoreRechargeOrderService;
/**
* 支付单据创建事件
@ -22,24 +19,5 @@ class PayCreateListener
{
public function handle(array $params)
{
$trade_type = $params['trade_type'] ?? '';
if ($trade_type == 'recharge') {
$trade_id = $params['trade_id'];
$site_id = $params['site_id'];
$order_info = (new CoreRechargeOrderService())->orderInfo($site_id, $trade_id);
if ($order_info['order_status'] != RechargeOrderDict::WAIT_PAY) throw new CommonException('ONLY_PAYING_CAN_PAY');
//添加订单支付表
return [
'site_id' => $order_info['site_id'],
'main_type' => PayDict::MEMBER,
'main_id' => $order_info['member_id'],//买家id
'money' => $order_info['order_money'],//订单金额
'trade_type' => 'recharge',//业务类型
'trade_id' => $trade_id,
'body' => get_lang("dict_order.trade_type_recharge")
];
}
}
}

View File

@ -11,7 +11,6 @@
namespace app\listener\pay;
use app\service\core\order\recharge\CoreRechargeOrderService;
use app\service\core\site\CoreSiteAccountService;
/**
@ -21,10 +20,6 @@ class PaySuccessListener
{
public function handle(array $pay_info)
{
// $trade_type = $pay_info['trade_type'] ?? '';
// if ($trade_type == 'recharge') {
// (new CoreRechargeOrderService())->pay($pay_info);
// }
//账单记录添加
(new CoreSiteAccountService())->addPayLog($pay_info);

View File

@ -11,7 +11,6 @@
namespace app\listener\pay;
use app\service\core\order\recharge\CoreRechargeRefundService;
use app\service\core\site\CoreSiteAccountService;
/**
@ -23,11 +22,5 @@ class RefundSuccessListener
{
//添加账单记录
(new CoreSiteAccountService())->addRefundLog($refund_info['site_id'], $refund_info['refund_no']);
//交易单据处理
$trade_type = $refund_info['trade_type'] ?? '';
if ($trade_type == 'recharge') {
(new CoreRechargeRefundService())->refundComplete($refund_info['refund_no']);
}
}
}

View File

@ -29,6 +29,7 @@ class BottomNavigationListener
$addon_info = [
'title' => '系统',
'type' => 'app'
];
return [
'key' => $key,

View File

@ -0,0 +1,112 @@
<?php
// +----------------------------------------------------------------------
// | Niucloud-admin 企业快速开发的saas管理平台
// +----------------------------------------------------------------------
// | 官方网址https://www.niucloud.com
// +----------------------------------------------------------------------
// | niucloud团队 版权所有 开源版本可自由商用
// +----------------------------------------------------------------------
// | Author: Niucloud Team
// +----------------------------------------------------------------------
namespace app\model\sys;
use app\dict\schedule\ScheduleLogDict;
use core\base\BaseModel;
use think\db\Query;
/**
* 计划任务执行记录模型
*/
class SysScheduleLog extends BaseModel
{
/**
* 数据表主键
* @var string
*/
protected $pk = 'id';
/**
* 模型名称
* @var string
*/
protected $name = 'sys_schedule_log';
protected $type = [
'execute_time' => 'timestamp',
];
/**
* 启用状态
* @param $value
* @param $data
* @return mixed
*/
public function getStatusNameAttr($value, $data)
{
if (empty($data['status'])) return '';
return ScheduleLogDict::getStatus()[$data['status']] ?? '';
}
/**
* 任务id搜索器
* @param Query $query
* @param $value
* @param $data
*/
public function searchScheduleIdAttr(Query $query, $value, $data)
{
if ($value) {
$query->where('schedule_id', $value);
}
}
/**
* 任务类型搜索器
* @param Query $query
* @param $value
* @param $data
*/
public function searchKeyAttr(Query $query, $value, $data)
{
if ($value) {
$query->where('key', $value);
}
}
/**
* 状态搜索
* @param Query $query
* @param $value
* @param $data
* @return void
*/
public function searchStatusAttr(Query $query, $value, $data)
{
if ($value != 'all') {
$query->where('status', $value);
}
}
/**
* 执行时间搜索器
* @param $query
* @param $value
* @param $data
*/
public function searchExecuteTimeAttr($query, $value, $data)
{
$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('execute_time', $start_time, $end_time);
} else if ($start_time > 0 && $end_time == 0) {
$query->where([['execute_time', '>=', $start_time]]);
} else if ($start_time == 0 && $end_time > 0) {
$query->where([['execute_time', '<=', $end_time]]);
}
}
}

View File

@ -75,7 +75,7 @@ class SysUserRole extends BaseModel
{
return $this->hasOne(Site::class, 'site_id', 'site_id')->joinType('inner')
->withField('site_id, site_name, app_type, status, expire_time')
->bind(['site_name', 'app_type', 'expire_time', 'status_name', 'site_status_name'])->append(['status_name', 'site_status_name']);
->bind(['site_name', 'app_type', 'expire_time', 'status_name', 'site_status_name', 'site_status' => 'status'])->append(['status_name', 'site_status_name']);
}
/**

View File

@ -0,0 +1,74 @@
<?php
// +----------------------------------------------------------------------
// | Niucloud-admin 企业快速开发的saas管理平台
// +----------------------------------------------------------------------
// | 官方网址https://www.niucloud.com
// +----------------------------------------------------------------------
// | niucloud团队 版权所有 开源版本可自由商用
// +----------------------------------------------------------------------
// | Author: Niucloud Team
// +----------------------------------------------------------------------
namespace app\service\admin\schedule;
use app\service\core\schedule\CoreScheduleLogService;
use core\base\BaseAdminService;
/**
* 计划任务执行记录服务层
* Class CoreCronService
* @package app\service\core\cron
*/
class ScheduleLogService extends BaseAdminService
{
public function __construct()
{
parent::__construct();
}
/**
* 获取自动任务列表
* @param array $data
* @return array
*/
public function getPage(array $data = [])
{
return (new CoreScheduleLogService())->getPage($data);
}
/**
* 添加
* @param array $data
* @return true
*/
public function add(array $data)
{
$res = (new CoreScheduleLogService())->add($data);
return true;
}
/**
* 删除计划任务执行记录
* @param $ids
* @return bool
*/
public function del($ids)
{
return (new CoreScheduleLogService())->del($ids);
}
/**
* 清空计划任务执行记录
* @param $data
* @return bool
*/
public function clear($data)
{
return (new CoreScheduleLogService())->clear($data);
}
}

View File

@ -102,4 +102,13 @@ class ScheduleService extends BaseAdminService
public function getTemplateList(){
return (new CoreScheduleService())->getTemplateList();
}
/**
* 执行一次计划任务
* @return true
*/
public function doSchedule(int $id)
{
return (new CoreScheduleService())->doSchedule($id);
}
}

View File

@ -11,12 +11,9 @@
namespace app\service\admin\site;
use app\model\addon\Addon;
use app\model\site\Site;
use app\model\site\SiteGroup;
use app\model\sys\SysMenu;
use app\service\admin\diy\DiyService;
use app\service\admin\sys\ConfigService;
use app\service\admin\sys\MenuService;
use app\service\core\addon\CoreAddonService;
use app\service\core\site\CoreSiteService;

View File

@ -188,6 +188,7 @@ class SiteService extends BaseAdminService
$site->save($data);
Cache::tag(self::$cache_tag_name . $site_id)->clear();
Cache::tag(MenuService::$cache_tag_name)->clear();
Db::commit();
return true;
} catch (Exception $e) {
@ -216,11 +217,14 @@ class SiteService extends BaseAdminService
$models = array_merge($sys_models, ...$addon_models);
foreach ($models as $model) {
$name = "\\$model";
$class = new $name();
if (in_array('site_id', $class->getTableFields())) {
$class->where([ [ 'site_id', '=', $site[ 'site_id' ] ] ])->delete();
try {
$name = "\\$model";
$class = new $name();
if (in_array('site_id', $class->getTableFields())) {
$class->where([ [ 'site_id', '=', $site[ 'site_id' ] ] ])->delete();
}
} catch (\Exception $e) {
}
}

View File

@ -13,6 +13,7 @@ namespace app\service\admin\sys;
use app\job\sys\CheckJob;
use app\service\core\site\CoreSiteService;
use app\service\core\sys\CoreSysConfigService;
use core\base\BaseAdminService;
use think\facade\Db;
use Throwable;
@ -48,15 +49,7 @@ class SystemService extends BaseAdminService
*/
public function getUrl()
{
$wap_domain = !empty(env("system.wap_domain")) ? preg_replace('#/$#', '', env("system.wap_domain")) : request()->domain();
$web_domain = !empty(env("system.web_domain")) ? preg_replace('#/$#', '', env("system.web_domain")) : request()->domain();
$site_domain = (new CoreSiteService())->getSiteCache($this->site_id)['site_domain'] ?? '';
return [
'wap_domain' => env("system.wap_domain"),
'wap_url' => $site_domain ? (request()->isSsl() ? "https://" : "http://") . $site_domain . "/wap" : $wap_domain . "/wap/" . $this->site_id,
'web_url' => $site_domain ? (request()->isSsl() ? "https://" : "http://") . $site_domain . "/web" : $web_domain . "/web/" . $this->site_id,
];
return (new CoreSysConfigService())->getSceneDomain($this->site_id);
}
/**

View File

@ -252,7 +252,7 @@ class UpgradeService extends BaseAdminService
$version_item = $version_list[$index];
$version_no = $version_item['version_no'];
$to_dir = $addon == AddonDict::FRAMEWORK_KEY ? $this->root_path : $this->root_path . 'niucloud' . DIRECTORY_SEPARATOR . 'addon' . DIRECTORY_SEPARATOR . $addon;
$to_dir = $addon == AddonDict::FRAMEWORK_KEY ? rtrim($this->root_path, DIRECTORY_SEPARATOR) : $this->root_path . 'niucloud' . DIRECTORY_SEPARATOR . 'addon' . DIRECTORY_SEPARATOR . $addon;
// 获取文件变更记录
if (file_exists($code_dir . $version_no . '.txt')) {

View File

@ -61,6 +61,7 @@ class WeappConfigService extends BaseAdminService
*/
public function getWeappStaticInfo(){
$domain = request()->domain();
$domain = str_replace('http://', 'https://', $domain);
return [
'serve_url' => (string)url('/api/weapp/serve/'.$this->site_id, [],'',true),
'request_url' => $domain,

View File

@ -34,12 +34,14 @@ class DiyConfigService extends BaseApiService
$site_addon = ( new CoreSiteService() )->getSiteCache($this->site_id);
$bottom_list_keys = array_column($list, 'key');
// 排除没有底部导航的应用
foreach ($site_addon[ 'apps' ] as $k => $v) {
if (!in_array($v[ 'key' ], $bottom_list_keys)) {
unset($site_addon[ 'apps' ][ $k ]);
}
}
// 单应用,排除 系统 底部导航设置
if (count($list) > 1 && count($site_addon[ 'apps' ]) == 1) {
foreach ($list as $k => $v) {
@ -68,6 +70,15 @@ class DiyConfigService extends BaseApiService
// 检测当前站点是多应用还是单应用
if ($key == 'app') {
$site_addon = ( new CoreSiteService() )->getSiteCache($this->site_id);
$list = ( new CoreDiyConfigService() )->getBottomList();
$bottom_list_keys = array_column($list, 'key');
// 排除没有底部导航的应用
foreach ($site_addon[ 'apps' ] as $k => $v) {
if (!in_array($v[ 'key' ], $bottom_list_keys)) {
unset($site_addon[ 'apps' ][ $k ]);
}
}
if (count($site_addon[ 'apps' ]) == 1) {
$key = $site_addon[ 'apps' ][ 0 ][ 'key' ];
}

View File

@ -35,7 +35,7 @@ class AddressService extends BaseApiService
*/
public function getList(array $where = [])
{
$field = 'id,member_id,name,mobile,address,address_name,full_address,is_default,lng,lat';
$field = 'id, member_id, name, mobile, province_id, city_id, district_id, address, address_name, full_address, lng, lat, is_default';
$order = 'is_default desc, id desc';
$list = $this->model->where([ ['site_id', '=', $this->site_id],['member_id', '=', $this->member_id ] ])->field($field)->order($order)->select()->toArray();

View File

@ -11,6 +11,7 @@
namespace app\service\api\member;
use app\service\api\wechat\WechatAuthService;
use app\service\core\member\CoreMemberConfigService;
use core\base\BaseApiService;
@ -23,10 +24,21 @@ class MemberConfigService extends BaseApiService
{
/**
* 获取注册与登录设置
* @param $url
* @return array
*/
public function getLoginConfig(){
return (new CoreMemberConfigService())->getLoginConfig($this->site_id);
public function getLoginConfig($url = '')
{
$res = ( new CoreMemberConfigService() )->getLoginConfig($this->site_id);
if (!empty($url)) {
try {
// 检测公众号配置是否成功
$wechat_auth = ( new WechatAuthService() )->jssdkConfig($url);
} catch (\Exception $e) {
$res[ 'is_auth_register' ] = 0;
}
}
return $res;
}
}

View File

@ -142,4 +142,13 @@ class MemberService extends BaseApiService
$detail['verify_code_barcode'] = image_to_base64($barcode_path);
return $detail;
}
/**
* 初始化会员数据
*/
public function initMemberData(){
if ($this->member_id) {
event("MemberLoginAfter", ['site_id' => $this->site_id, 'member_id' => $this->member_id]);
}
}
}

View File

@ -11,6 +11,7 @@
namespace app\service\api\member;
use app\job\member\MemberGiftGrantJob;
use app\model\member\MemberSign;
use app\service\core\member\CoreMemberService;
use app\service\core\sys\CoreConfigService;
@ -111,19 +112,19 @@ class MemberSignService extends BaseApiService
$res = $this->model->create($data);
if ($res) {
//日签奖励发放
$param = [
'from_type' => 'day_sign_award',
'memo' => '日签奖励'
];
(new CoreMemberService())->memberGiftGrant($this->site_id, $this->member_id, $sign_config['day_award'], $param);
MemberGiftGrantJob::dispatch([
'site_id' => $this->site_id,
'member_id' => $this->member_id,
'gift' => $sign_config['day_award'],
'param' => [
'from_type' => 'day_sign_award',
'memo' => '日签奖励'
]
]);
$awards['day_award'] = $sign_config['day_award'];
//签到成功后判断连签天数是否满足连签奖励发放条件
if (!empty($sign_config['continue_award'])) {
$param = [
'from_type' => 'continue_sign_award',
'memo' => '连签奖励'
];
foreach ($sign_config['continue_award'] as $key => $value) {
$continue_sign = intval($value['continue_sign']);//连续签到天数要求
//如果连签天数满足配置条件,发放连签奖励
@ -144,7 +145,15 @@ class MemberSignService extends BaseApiService
->whereBetweenTime('create_time', $period_start_time, $period_end_time)->count('sign_id');
if ($receive_count < $value['receive_num']) {
//连签奖励发放
(new CoreMemberService())->memberGiftGrant($this->site_id, $this->member_id, $gifts, $param);
MemberGiftGrantJob::dispatch([
'site_id' => $this->site_id,
'member_id' => $this->member_id,
'gift' => $gifts,
'param' => [
'from_type' => 'continue_sign_award',
'memo' => '连签奖励'
]
]);
$awards['continue_award'] = $gifts;
$continue_text = get_lang('CONTINUE_SIGN').$res->days.get_lang('DAYS');
//更新连签发放记录
@ -152,7 +161,15 @@ class MemberSignService extends BaseApiService
}
} else { //不限制
//连签奖励发放
(new CoreMemberService())->memberGiftGrant($this->site_id, $this->member_id, $gifts, $param);
MemberGiftGrantJob::dispatch([
'site_id' => $this->site_id,
'member_id' => $this->member_id,
'gift' => $gifts,
'param' => [
'from_type' => 'continue_sign_award',
'memo' => '连签奖励'
]
]);
$awards['continue_award'] = $gifts;
$continue_text = get_lang('CONTINUE_SIGN').$res->days.get_lang('DAYS');
//更新连签发放记录
@ -409,6 +426,15 @@ class MemberSignService extends BaseApiService
$is_use_point = ($is_use_point_day || $is_use_point_continue) ? 1 : 0;
$is_use_balance = ($is_use_balance_day || $is_use_balance_continue) ? 1 : 0;
$is_use_coupon = ($is_use_coupon_day || $is_use_coupon_continue) ? 1 : 0;
$coupon_check_data = array_filter(event('CouponCheck', ['site_id' => $this->site_id, 'is_use_coupon' => $is_use_coupon, 'coupon_id' => $coupon_id, 'coupon_list' => $coupon_list]))[0] ?? [];
if (empty($coupon_check_data)) {
$is_use_coupon = false;
$coupon_check_data = [
'coupon_id' => [],
'coupon_list' => []
];
}
$is_use_coupon = empty($coupon_check_data['coupon_id']) ? false : $is_use_coupon;
//相同奖励合并
$awards_total = [
'point' => [
@ -421,8 +447,8 @@ class MemberSignService extends BaseApiService
],
'shop_coupon' => [
'is_use' => $is_use_coupon,
'coupon_id' => $coupon_id,
'coupon_list' => $coupon_list,
'coupon_id' => $coupon_check_data['coupon_id'],
'coupon_list' => $coupon_check_data['coupon_list'],
]
];
return (new CoreMemberService())->getGiftContent($this->site_id, $awards_total, 'member_sign');

View File

@ -16,6 +16,7 @@ use app\model\member\Member;
use app\model\site\Site;
use core\base\BaseCoreService;
use core\dict\DictLoader;
use core\exception\CommonException;
use think\db\exception\DataNotFoundException;
use think\db\exception\DbException;
use think\db\exception\ModelNotFoundException;
@ -119,7 +120,7 @@ class CoreMemberService extends BaseCoreService
* @throws ModelNotFoundException
*/
public static function createMemberNo(int $site_id) {
$site = (new Site())->where([ ['site_id', '=', $site_id] ])->find();
$site = (new Site())->where([ ['site_id', '=', $site_id] ])->lock(true)->find();
$config = (new CoreMemberConfigService())->getMemberConfig($site_id);
$no = $site->member_no + 1;
@ -146,7 +147,7 @@ class CoreMemberService extends BaseCoreService
* @throws ModelNotFoundException
*/
public static function setMemberNo(int $site_id, int $member_id) {
$site = (new Site())->where([ ['site_id', '=', $site_id] ])->find();
$site = (new Site())->where([ ['site_id', '=', $site_id] ])->lock(true)->find();
$config = (new CoreMemberConfigService())->getMemberConfig($site_id);
$no = $site->member_no + 1;
@ -245,16 +246,19 @@ class CoreMemberService extends BaseCoreService
foreach ($gifts as $key => $item) {
if (!$item['is_use'] || !isset($dict[$key]) || !isset($dict[$key]['grant']) || empty($dict[$key]['grant'])) continue;
$grant = $dict[$key]['grant'];
if ($grant instanceof \Closure) {
$grant($site_id, $member_id, $item, $param);
} else if (class_exists($grant)) {
(new $grant())->handle($site_id, $member_id, $item, $param);
try {
$grant = $dict[$key]['grant'];
if ($grant instanceof \Closure) {
$grant($site_id, $member_id, $item, $param);
} else if (class_exists($grant)) {
(new $grant())->handle($site_id, $member_id, $item, $param);
}
} catch (CommonException $e) {
Log::write('会员礼包'.$key.'发放失败,错误原因:'. $e->getMessage().$e->getFile().$e->getLine());
}
}
return true;
} catch (\Exception $e) {
} catch (CommonException $e) {
Log::write('会员礼包发放失败,错误原因:'. $e->getMessage().$e->getFile().$e->getLine());
Log::write('参数:'. json_encode([
'site_id' => $site_id,

View File

@ -1,163 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | Niucloud-admin 企业快速开发的saas管理平台
// +----------------------------------------------------------------------
// | 官方网址https://www.niucloud.com
// +----------------------------------------------------------------------
// | niucloud团队 版权所有 开源版本可自由商用
// +----------------------------------------------------------------------
// | Author: Niucloud Team
// +----------------------------------------------------------------------
namespace app\service\core\order\recharge;
use app\dict\member\MemberAccountTypeDict;
use app\dict\order\RechargeOrderDict;
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\pay\CorePayService;
use core\base\BaseCoreService;
use core\exception\CommonException;
use Exception;
use think\db\exception\DataNotFoundException;
use think\db\exception\DbException;
use think\db\exception\ModelNotFoundException;
use think\facade\Db;
/**
* 充值订单流程
* Class CoreRechargeOrderService
* @package app\service\core\order
*/
class CoreRechargeOrderService extends BaseCoreService
{
/**
* 充值订单创建
* @param array $data //['site_id' => 1, member_id => 1 'order_from' => 'h5', 'member_message' => '','recharge_money' => 12.00]
* @return array
*/
public function create(array $data)
{
$order_data = [
'site_id' => $data['site_id'],
'order_from' => $data['order_from'] ?? 'h5',
'order_type' => 'recharge',
'order_status' => RechargeOrderDict::WAIT_PAY,
'member_id' => $data['member_id'],
'ip' => request()->ip() ?? '',
'member_message' => $data['member_message'] ?? '',
'order_item_money' => $data['recharge_money'],
'order_discount_money' => 0,
'order_money' => $data['recharge_money'],
];
$order_items = [
[
'site_id' => $data['site_id'],
'member_id' => $data['member_id'],
'item_id' => 0,
'item_type' => 'recharge', //项目类型 recharge, goods
'item_name' => '会员充值',
'item_image' => '/static/image/recharge.png',
'price' => $data['recharge_money'],
'num' => 1,
'item_money' => $data['recharge_money'],
'is_refund' => 0
]
];
Db::startTrans();
try{
//添加订单表
$order_data['order_no'] = create_no();
$create_order = (new RechargeOrder())->create($order_data);
$order_id = $create_order->order_id;
//添加订单支付表
(new CorePayService())->create($data['site_id'], PayDict::MEMBER, $order_data['member_id'], $order_data['order_money'], $order_data['order_type'], $order_id, get_lang("dict_order.trade_type_recharge"));
//添加订单项目表
$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 [
'trade_type' => $order_data['order_type'],
'trade_id' => $order_id
];
}catch ( Exception $e)
{
Db::rollback();
throw new CommonException($e->getMessage());
}
}
/**
* 订单支付
* @param array $pay_info
* @return true
*/
public function pay(array $pay_info)
{
try {
$trade_id = $pay_info['trade_id'] ?? 0;
$order_model = new RechargeOrder();
$order_info = $order_model->where([['site_id', '=', $pay_info['site_id']], ['order_id', '=', $trade_id]])->findOrEmpty()->toArray();
if (empty($order_info))
throw new CommonException('ORDER_NOT_EXIST');
$order_data = [
'pay_time' => time(),
'order_status' => RechargeOrderDict::FINISH,
'is_enable_refund' => 1, // 是否允许退款
'out_trade_no' => $pay_info['out_trade_no']//支付后的交易流水号
];
$order_model->where([['site_id', '=', $pay_info['site_id']], ['order_id', '=', $trade_id]])->update($order_data);
//会员余额
(new CoreMemberAccountService())->addLog($order_info['site_id'], $order_info['member_id'], MemberAccountTypeDict::BALANCE, $order_info['order_item_money'], 'recharge', '会员充值', $order_info['order_id']);
return true;
}catch ( Exception $e)
{
throw new CommonException($e->getMessage());
}
}
/**
* 关闭订单
* @param int $site_id
* @param int $order_id
* @return true
* @throws DataNotFoundException
* @throws DbException
* @throws ModelNotFoundException
*/
public function close(int $site_id, int $order_id){
$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');
//关闭支付单据
if ($order->order_status == RechargeOrderDict::WAIT_PAY)
(new CorePayService())->closeByTrade($site_id,'recharge', $order_id);
$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

@ -1,142 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | Niucloud-admin 企业快速开发的saas管理平台
// +----------------------------------------------------------------------
// | 官方网址https://www.niucloud.com
// +----------------------------------------------------------------------
// | niucloud团队 版权所有 开源版本可自由商用
// +----------------------------------------------------------------------
// | Author: Niucloud Team
// +----------------------------------------------------------------------
namespace app\service\core\order\recharge;
use app\dict\order\RechargeOrderDict;
use app\model\member\Member;
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\pay\CoreRefundService;
use core\base\BaseCoreService;
use core\exception\CommonException;
use Exception;
use think\db\exception\DataNotFoundException;
use think\db\exception\DbException;
use think\db\exception\ModelNotFoundException;
use think\facade\Db;
/**
* 充值订单流程
* Class CoreRechargeOrderService
* @package app\service\core\order
*/
class CoreRechargeRefundService extends BaseCoreService
{
protected $order_type = 'recharge';
/**
* 创建充值订单退款
* @param int $site_id
* @param int $order_id
* @return true
* @throws DataNotFoundException
* @throws DbException
* @throws ModelNotFoundException
*/
public function create(int $site_id, int $order_id) {
$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 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 ($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();
try {
// 查询会员账户余额
$member_info = (new Member())->where([
[ 'member_id', '=', $order['member_id'] ],
[ 'site_id', '=', $order['site_id'] ]
])->field('balance')->find();
if ($member_info['balance'] == 0) throw new CommonException('NO_REFUNDABLE_AMOUNT');
$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'];
$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' => $refund_no,
'refund_status' => RechargeOrderDict::REFUNDING
]);
$order_model->ordermain->save([
'refund_status' => RechargeOrderDict::REFUNDING
]);
(new RechargeOrderItemRefund())->update(['status' => RechargeOrderDict::REFUNDING], [ ['refund_no', '=', $refund_no ] ]);
// 执行退款
$this->refund($order, $refund_no);
Db::commit();
return true;
} catch ( Exception $e) {
Db::rollback();
throw new CommonException($e->getMessage());
}
}
/**
* 退款
* @param array $order
* @param string $refund_no
* @return void
*/
public function refund(array $order, string $refund_no){
(new CoreMemberAccountService())->addLog($order['site_id'], $order['member_id'], 'balance', -$order['money'], 'recharge_refund', '充值订单退款', $order['order_id']);
// 调用支付退款
(new CoreRefundService())->refund($order['site_id'], $refund_no);
}
/**
* 退款完成
* @param $refund_no
* @return true
* @throws DataNotFoundException
* @throws DbException
* @throws ModelNotFoundException
*/
public function refundComplete($refund_no){
$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');
Db::startTrans();
try {
$model->save(['status' => RechargeOrderDict::REFUND_COMPLETED]);
$model->item()->save([ 'refund_status' => RechargeOrderDict::REFUND_COMPLETED ]);
(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;
} catch ( Exception $e) {
Db::rollback();
throw new CommonException($e->getMessage());
}
}
}

View File

@ -42,6 +42,17 @@ class CorePosterService extends BaseCoreService
return true;
}
/**
* 删除
* @param $condition
* @return \think\Response
*/
public function del($condition)
{
( new Poster() )->delete($condition);
return true;
}
/**
* 海报类型
* @param string $type

View File

@ -0,0 +1,84 @@
<?php
// +----------------------------------------------------------------------
// | Niucloud-admin 企业快速开发的saas管理平台
// +----------------------------------------------------------------------
// | 官方网址https://www.niucloud.com
// +----------------------------------------------------------------------
// | niucloud团队 版权所有 开源版本可自由商用
// +----------------------------------------------------------------------
// | Author: Niucloud Team
// +----------------------------------------------------------------------
namespace app\service\core\schedule;
use app\model\sys\SysScheduleLog;
use core\base\BaseCoreService;
/**
* 计划任务执行记录服务层
*/
class CoreScheduleLogService extends BaseCoreService
{
public function __construct()
{
parent::__construct();
$this->model = new SysScheduleLog();
}
/**
* 计划任务执行记录分页列表
* @param array $where
* @return array
*/
public function getPage(array $where = [])
{
$field = 'id, addon, key, name, status, execute_time, execute_result, class, job';
$search_model = $this->model->withSearch(['schedule_id', 'key', 'status', 'execute_time'],$where)->field($field)->order('id desc')->append(['status_name']);
return $this->pageQuery($search_model);
}
/**
* 添加计划任务执行记录
* @param array $data
* @return true
*/
public function add(array $data)
{
$data[ 'execute_time' ] = time();
$this->model->create($data);
return true;
}
/**
* 删除计划任务执行记录
* @param $ids
* @return bool
*/
public function del($ids)
{
$res = $this->model::destroy(function($query) use ($ids) {
$query->where([ [ 'id', 'in', $ids ] ]);
});
return $res;
}
/**
* 清空计划任务执行记录
* @param $data
* @return bool
*/
public function clear($data)
{
$where = [];
if ($data[ 'schedule_id' ]) {
$where[] = [ 'schedule_id', '=', $data[ 'schedule_id' ] ];
}
$res = $this->model::destroy(function($query) use ($where) {
$query->where($where);
});
return $res;
}
}

View File

@ -11,11 +11,13 @@
namespace app\service\core\schedule;
use app\dict\schedule\ScheduleLogDict;
use app\dict\sys\DateDict;
use app\model\sys\SysSchedule;
use core\base\BaseCoreService;
use core\dict\DictLoader;
use core\exception\CommonException;
use think\console\Output;
use think\Container;
use think\db\exception\DataNotFoundException;
use think\db\exception\DbException;
@ -201,6 +203,20 @@ class CoreScheduleService extends BaseCoreService
return $this->model->where([ [ 'id', '=', $id ]])->delete();
}
/**
* 执行一次计划任务
* @return bool
*/
public function doSchedule(int $id)
{
$info = $this->getInfo($id);
$result = false;
if (!empty($info[ 'class' ])) {
$result = $this->execute($info, '');
}
return $result;
}
/**
* 执行任务
* @param array $schedule
@ -215,7 +231,11 @@ class CoreScheduleService extends BaseCoreService
try {
$result = Container::getInstance()->invoke([$class, $function ?? 'doJob']);
if(!empty($output)) $output->writeln('[Schedule]['.date('Y-m-d H:i:s').']'." Processed:" . $job.'('.$name.')');
$status = ScheduleLogDict::SUCCESS;
if ($result == 1) $result = '计划任务:'.$name.'执行成功';
}catch( Throwable $e){
$result = '计划任务:'.$name.'发生错误, 错误原因_' . $e->getMessage() . '_' . $e->getFile() . '_' . $e->getLine();
$status = ScheduleLogDict::ERROR;
$error = $e->getMessage();
if(!empty($output)) $output->writeln('[Schedule]['.date('Y-m-d H:i:s').']'." Error:" . $job.'('.$name.') ,'.$error);
Log::write('计划任务:'.$name.'发生错误, 错误原因:'.$error);
@ -227,6 +247,20 @@ class CoreScheduleService extends BaseCoreService
'count' => $schedule['count'] + 1,
]);
}
//记录执行日志
$core_schedule_log_service = new CoreScheduleLogService();
$core_schedule_log_service->add([
'schedule_id' => $schedule['id'],
'addon' => $schedule['addon'],
'key' => $schedule['key'],
'name' => $name,
'status' => $status,
'execute_result' => $result ?? '',
'class' => $class,
'job' => $job
]);
return true;
}
}

View File

@ -37,10 +37,13 @@ class CoreSysConfigService extends BaseCoreService
$wap_domain = !empty(env("system.wap_domain")) ? preg_replace('#/$#', '', env("system.wap_domain")) : request()->domain();
$web_domain = !empty(env("system.web_domain")) ? preg_replace('#/$#', '', env("system.web_domain")) : request()->domain();
$site_domain = ( new CoreSiteService() )->getSiteCache($site_id)[ 'site_domain' ] ?? '';
$service_domain = request()->domain();
return [
'wap_domain' => $site_domain ? ( request()->isSsl() ? "https://" : "http://" ) . $site_domain : $wap_domain,
'wap_url' => $site_domain ? ( request()->isSsl() ? "https://" : "http://" ) . $site_domain . "/wap" : $wap_domain . "/wap/" . $site_id,
'web_url' => $site_domain ? ( request()->isSsl() ? "https://" : "http://" ) . $site_domain . "/web" : $web_domain . "/web/" . $site_id
'web_url' => $site_domain ? ( request()->isSsl() ? "https://" : "http://" ) . $site_domain . "/web" : $web_domain . "/web/" . $site_id,
'service_domain' => $service_domain
];
}

View File

@ -78,7 +78,12 @@ class CoreWeappService extends BaseCoreService
*/
public static function refreshToken(int $site_id)
{
self::app($site_id)->getAccessToken()->refresh();
$core_weapp_service = new CoreWeappConfigService();
$weapp_config = $core_weapp_service->getWeappConfig($site_id);
if (!$weapp_config[ 'is_authorization' ]) {
self::app($site_id)->getAccessToken()->refresh();
}
}
/**

View File

@ -76,7 +76,9 @@ class CoreWechatConfigService extends BaseCoreService
*/
public function getWechatStaticInfo($site_id)
{
$wap_domain = ( new CoreSysConfigService() )->getSceneDomain($site_id)[ 'wap_url' ] ?? '';
$wap_domain = ( new CoreSysConfigService() )->getSceneDomain($site_id)[ 'wap_domain' ] ?? '';
$wap_domain = str_replace('http://', '', $wap_domain);
$wap_domain = str_replace('https://', '', $wap_domain);
return [
'serve_url' => (string) url('/api/wechat/serve/' . $site_id, [], '', true),
'business_domain' => $wap_domain,

View File

@ -1,3 +1,2 @@
ALTER TABLE `sys_user_role`
ADD COLUMN delete_time INT(11) NOT NULL DEFAULT 0 COMMENT '删除时间';
ALTER TABLE `sys_user_role`ADD COLUMN delete_time INT(11) NOT NULL DEFAULT 0 COMMENT '删除时间';

View File

@ -0,0 +1,75 @@
<?php
namespace app\upgrade\v050;
use app\model\diy\Diy;
class Upgrade
{
public function handle()
{
$this->handleDiyData();
}
/**
* 处理自定义数据
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
private function handleDiyData()
{
$diy_model = new Diy();
$where = [
[ 'value', '<>', '' ]
];
$field = 'id,site_id,name,title,template,value';
$list = $diy_model->where($where)->field($field)->select()->toArray();
if (!empty($list)) {
foreach ($list as $k => $v) {
$diy_data = json_decode($v[ 'value' ], true);
foreach ($diy_data[ 'value' ] as $ck => $cv) {
// 轮播搜索 组件
if ($cv[ 'componentName' ] == 'CarouselSearch') {
if (!isset($diy_data[ 'value' ][ $ck ][ 'search' ][ 'color' ])) {
$diy_data[ 'value' ][ $ck ][ 'search' ][ 'color' ] = '#999999';
}
if (!isset($diy_data[ 'value' ][ $ck ][ 'search' ][ 'btnColor' ])) {
$diy_data[ 'value' ][ $ck ][ 'search' ][ 'btnColor' ] = '#FFFFFF';
}
if (!isset($diy_data[ 'value' ][ $ck ][ 'search' ][ 'bgColor' ])) {
$diy_data[ 'value' ][ $ck ][ 'search' ][ 'bgColor' ] = '#FFFFFF';
}
if (!isset($diy_data[ 'value' ][ $ck ][ 'search' ][ 'btnBgColor' ])) {
$diy_data[ 'value' ][ $ck ][ 'search' ][ 'btnBgColor' ] = '#FF3434';
}
}
// 活动魔方 组件
if ($cv[ 'componentName' ] == 'ActiveCube') {
if (!isset($diy_data[ 'value' ][ $ck ][ 'textImg' ])) {
$diy_data[ 'value' ][ $ck ][ 'textImg' ] = 'static/resource/images/diy/active_cube/journalism.png';
}
if (!isset($diy_data[ 'value' ][ $ck ][ 'blockStyle' ][ 'btnText' ])) {
$diy_data[ 'value' ][ $ck ][ 'blockStyle' ] [ 'btnText' ] = 'normal';
}
}
}
unset($diy_data[ 'global' ][ 'topStatusBar' ][ 'isTransparent' ]);
$diy_data = json_encode($diy_data);
$diy_model->where([ [ 'id', '=', $v[ 'id' ] ] ])->update([ 'value' => $diy_data ]);
}
}
}
}

View File

@ -0,0 +1,19 @@
DROP TABLE IF EXISTS `sys_schedule_log`;
CREATE TABLE `sys_schedule_log` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '执行记录id',
`schedule_id` int NOT NULL DEFAULT 0 COMMENT '任务id',
`addon` varchar(255) NOT NULL DEFAULT '' COMMENT '所属插件',
`key` varchar(255) NOT NULL DEFAULT '' COMMENT '计划任务模板key',
`name` varchar(50) NOT NULL DEFAULT '' COMMENT '计划任务名称',
`execute_time` int NOT NULL COMMENT '执行时间',
`execute_result` text DEFAULT NULL COMMENT '日志信息',
`status` varchar(255) NOT NULL DEFAULT '' COMMENT '执行状态',
`class` varchar(255) NOT NULL DEFAULT '',
`job` varchar(255) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '计划任务执行记录' ROW_FORMAT = Dynamic;
ALTER TABLE `site` CHANGE COLUMN `front_end_logo` `front_end_logo` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '前台logo长方形';
ALTER TABLE `site` CHANGE COLUMN `front_end_icon` `front_end_icon` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '前台icon正方形';