From bae138de5796e6746beb50d97a16387390895835 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=85=A8=E6=A0=88=E5=B0=8F=E5=AD=A6=E7=94=9F?= <1518079521@qq.com> Date: Thu, 31 Oct 2024 15:29:27 +0800 Subject: [PATCH] update --- .../app/adminapi/controller/sys/Schedule.php | 15 ++ .../adminapi/controller/sys/ScheduleLog.php | 65 +++++++ niucloud/app/adminapi/route/sys.php | 10 ++ niucloud/app/api/controller/login/Config.php | 5 +- niucloud/app/api/controller/sys/Config.php | 26 +++ niucloud/app/api/route/route.php | 7 +- niucloud/app/dict/diy/ComponentDict.php | 159 +++++++++++++++-- niucloud/app/dict/menu/admin.php | 14 ++ .../app/dict/schedule/ScheduleLogDict.php | 32 ++++ niucloud/app/event.php | 1 - niucloud/app/install/source/database.sql | 24 ++- niucloud/app/lang/zh-cn/dict.php | 5 + .../listener/member/MemberLoginListener.php | 2 + .../member/MemberRegisterListener.php | 2 + .../notice_template/RechargeSuccess.php | 45 ----- .../app/listener/pay/PayCreateListener.php | 22 --- .../app/listener/pay/PaySuccessListener.php | 5 - .../listener/pay/RefundSuccessListener.php | 7 - .../system/BottomNavigationListener.php | 1 + niucloud/app/model/sys/SysScheduleLog.php | 112 ++++++++++++ niucloud/app/model/sys/SysUserRole.php | 2 +- .../admin/schedule/ScheduleLogService.php | 74 ++++++++ .../admin/schedule/ScheduleService.php | 9 + .../service/admin/site/SiteGroupService.php | 3 - .../app/service/admin/site/SiteService.php | 12 +- .../app/service/admin/sys/SystemService.php | 11 +- .../service/admin/upgrade/UpgradeService.php | 2 +- .../admin/weapp/WeappConfigService.php | 1 + .../app/service/api/diy/DiyConfigService.php | 11 ++ .../app/service/api/member/AddressService.php | 2 +- .../api/member/MemberConfigService.php | 18 +- .../app/service/api/member/MemberService.php | 9 + .../service/api/member/MemberSignService.php | 52 ++++-- .../service/core/member/CoreMemberService.php | 22 ++- .../recharge/CoreRechargeOrderService.php | 163 ------------------ .../recharge/CoreRechargeRefundService.php | 142 --------------- .../service/core/poster/CorePosterService.php | 11 ++ .../core/schedule/CoreScheduleLogService.php | 84 +++++++++ .../core/schedule/CoreScheduleService.php | 34 ++++ .../service/core/sys/CoreSysConfigService.php | 5 +- .../service/core/weapp/CoreWeappService.php | 7 +- .../core/wechat/CoreWechatConfigService.php | 4 +- niucloud/app/upgrade/v052/upgrade.sql | 3 +- niucloud/app/upgrade/v053/Upgrade.php | 75 ++++++++ niucloud/app/upgrade/v053/upgrade.sql | 19 ++ 45 files changed, 881 insertions(+), 453 deletions(-) create mode 100644 niucloud/app/adminapi/controller/sys/ScheduleLog.php create mode 100644 niucloud/app/dict/schedule/ScheduleLogDict.php delete mode 100644 niucloud/app/listener/notice_template/RechargeSuccess.php create mode 100644 niucloud/app/model/sys/SysScheduleLog.php create mode 100644 niucloud/app/service/admin/schedule/ScheduleLogService.php delete mode 100644 niucloud/app/service/core/order/recharge/CoreRechargeOrderService.php delete mode 100644 niucloud/app/service/core/order/recharge/CoreRechargeRefundService.php create mode 100644 niucloud/app/service/core/schedule/CoreScheduleLogService.php create mode 100644 niucloud/app/upgrade/v053/Upgrade.php create mode 100644 niucloud/app/upgrade/v053/upgrade.sql diff --git a/niucloud/app/adminapi/controller/sys/Schedule.php b/niucloud/app/adminapi/controller/sys/Schedule.php index f547a139b..747cc424d 100644 --- a/niucloud/app/adminapi/controller/sys/Schedule.php +++ b/niucloud/app/adminapi/controller/sys/Schedule.php @@ -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'); + } + } } diff --git a/niucloud/app/adminapi/controller/sys/ScheduleLog.php b/niucloud/app/adminapi/controller/sys/ScheduleLog.php new file mode 100644 index 000000000..7eee9c31b --- /dev/null +++ b/niucloud/app/adminapi/controller/sys/ScheduleLog.php @@ -0,0 +1,65 @@ +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'); + } + +} diff --git a/niucloud/app/adminapi/route/sys.php b/niucloud/app/adminapi/route/sys.php index 8898f87e0..1f06a5f48 100644 --- a/niucloud/app/adminapi/route/sys.php +++ b/niucloud/app/adminapi/route/sys.php @@ -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'); diff --git a/niucloud/app/api/controller/login/Config.php b/niucloud/app/api/controller/login/Config.php index 22115b543..782415ad4 100644 --- a/niucloud/app/api/controller/login/Config.php +++ b/niucloud/app/api/controller/login/Config.php @@ -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' ])); } } diff --git a/niucloud/app/api/controller/sys/Config.php b/niucloud/app/api/controller/sys/Config.php index 980adad9b..9d1ff4900 100644 --- a/niucloud/app/api/controller/sys/Config.php +++ b/niucloud/app/api/controller/sys/Config.php @@ -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); + } } diff --git a/niucloud/app/api/route/route.php b/niucloud/app/api/route/route.php index de7faa7d2..5f5af22c2 100644 --- a/niucloud/app/api/route/route.php +++ b/niucloud/app/api/route/route.php @@ -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'); diff --git a/niucloud/app/dict/diy/ComponentDict.php b/niucloud/app/dict/diy/ComponentDict.php index abd3706c6..44de42596 100644 --- a/niucloud/app/dict/diy/ComponentDict.php +++ b/niucloud/app/dict/diy/ComponentDict.php @@ -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 // 左右边距 + ], + ] + ], + ] ], ], ]; diff --git a/niucloud/app/dict/menu/admin.php b/niucloud/app/dict/menu/admin.php index 67be103f2..a74754b9d 100644 --- a/niucloud/app/dict/menu/admin.php +++ b/niucloud/app/dict/menu/admin.php @@ -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', diff --git a/niucloud/app/dict/schedule/ScheduleLogDict.php b/niucloud/app/dict/schedule/ScheduleLogDict.php new file mode 100644 index 000000000..4f61bb12e --- /dev/null +++ b/niucloud/app/dict/schedule/ScheduleLogDict.php @@ -0,0 +1,32 @@ + get_lang('dict_schedule_log.success'),//执行成功 + self::ERROR => get_lang('dict_schedule_log.error'),//执行失败 + ]; + } + +} \ No newline at end of file diff --git a/niucloud/app/event.php b/niucloud/app/event.php index 13a54d8e3..8b41f9c14 100644 --- a/niucloud/app/event.php +++ b/niucloud/app/event.php @@ -66,7 +66,6 @@ $system_event = [ 'NoticeData' => [ 'app\listener\notice_template\VerifyCode',//手机验证码 'app\listener\notice_template\MemberVerifySuccess', - 'app\listener\notice_template\RechargeSuccess', ], //全场景消息发送 'Notice' => [ diff --git a/niucloud/app/install/source/database.sql b/niucloud/app/install/source/database.sql index 59fb95c6d..928837fd2 100644 --- a/niucloud/app/install/source/database.sql +++ b/niucloud/app/install/source/database.sql @@ -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 diff --git a/niucloud/app/lang/zh-cn/dict.php b/niucloud/app/lang/zh-cn/dict.php index f721c7f87..39f519fcc 100644 --- a/niucloud/app/lang/zh-cn/dict.php +++ b/niucloud/app/lang/zh-cn/dict.php @@ -165,6 +165,11 @@ return [ 'month' => '每月', ], + //计划任务执行记录 + 'dict_schedule_log' => [ + 'success' => '成功', + 'error' => '失败', + ], //支付相关 'dict_pay' => [ 'type_wechatpay' => '微信支付', diff --git a/niucloud/app/listener/member/MemberLoginListener.php b/niucloud/app/listener/member/MemberLoginListener.php index 5a23d4424..507003453 100644 --- a/niucloud/app/listener/member/MemberLoginListener.php +++ b/niucloud/app/listener/member/MemberLoginListener.php @@ -24,6 +24,8 @@ class MemberLoginListener */ public function handle(object $member) { + // 新人专享活动 + event("MemberLoginAfter", ['site_id' => $member['site_id'], 'member_id' => $member['member_id']]); return; } diff --git a/niucloud/app/listener/member/MemberRegisterListener.php b/niucloud/app/listener/member/MemberRegisterListener.php index 522487f55..d5813d781 100644 --- a/niucloud/app/listener/member/MemberRegisterListener.php +++ b/niucloud/app/listener/member/MemberRegisterListener.php @@ -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; } } diff --git a/niucloud/app/listener/notice_template/RechargeSuccess.php b/niucloud/app/listener/notice_template/RechargeSuccess.php deleted file mode 100644 index 41d9d20cd..000000000 --- a/niucloud/app/listener/notice_template/RechargeSuccess.php +++ /dev/null @@ -1,45 +0,0 @@ -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' ], - ] - ); - } - - } - - } - -} \ No newline at end of file diff --git a/niucloud/app/listener/pay/PayCreateListener.php b/niucloud/app/listener/pay/PayCreateListener.php index a81f7862f..9024b15e4 100644 --- a/niucloud/app/listener/pay/PayCreateListener.php +++ b/niucloud/app/listener/pay/PayCreateListener.php @@ -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") - ]; - } - - } } \ No newline at end of file diff --git a/niucloud/app/listener/pay/PaySuccessListener.php b/niucloud/app/listener/pay/PaySuccessListener.php index 1d733b453..61bc26cab 100644 --- a/niucloud/app/listener/pay/PaySuccessListener.php +++ b/niucloud/app/listener/pay/PaySuccessListener.php @@ -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); diff --git a/niucloud/app/listener/pay/RefundSuccessListener.php b/niucloud/app/listener/pay/RefundSuccessListener.php index 57d05978c..0b224d23f 100644 --- a/niucloud/app/listener/pay/RefundSuccessListener.php +++ b/niucloud/app/listener/pay/RefundSuccessListener.php @@ -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']); - } - } } \ No newline at end of file diff --git a/niucloud/app/listener/system/BottomNavigationListener.php b/niucloud/app/listener/system/BottomNavigationListener.php index 813e94861..cfc0880da 100644 --- a/niucloud/app/listener/system/BottomNavigationListener.php +++ b/niucloud/app/listener/system/BottomNavigationListener.php @@ -29,6 +29,7 @@ class BottomNavigationListener $addon_info = [ 'title' => '系统', + 'type' => 'app' ]; return [ 'key' => $key, diff --git a/niucloud/app/model/sys/SysScheduleLog.php b/niucloud/app/model/sys/SysScheduleLog.php new file mode 100644 index 000000000..f422bb569 --- /dev/null +++ b/niucloud/app/model/sys/SysScheduleLog.php @@ -0,0 +1,112 @@ + '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]]); + } + } + +} diff --git a/niucloud/app/model/sys/SysUserRole.php b/niucloud/app/model/sys/SysUserRole.php index 31daff6da..f5c11301a 100644 --- a/niucloud/app/model/sys/SysUserRole.php +++ b/niucloud/app/model/sys/SysUserRole.php @@ -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']); } /** diff --git a/niucloud/app/service/admin/schedule/ScheduleLogService.php b/niucloud/app/service/admin/schedule/ScheduleLogService.php new file mode 100644 index 000000000..59b20c417 --- /dev/null +++ b/niucloud/app/service/admin/schedule/ScheduleLogService.php @@ -0,0 +1,74 @@ +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); + } + +} \ No newline at end of file diff --git a/niucloud/app/service/admin/schedule/ScheduleService.php b/niucloud/app/service/admin/schedule/ScheduleService.php index c1a6f18ed..6d677369a 100644 --- a/niucloud/app/service/admin/schedule/ScheduleService.php +++ b/niucloud/app/service/admin/schedule/ScheduleService.php @@ -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); + } } \ No newline at end of file diff --git a/niucloud/app/service/admin/site/SiteGroupService.php b/niucloud/app/service/admin/site/SiteGroupService.php index c82da7771..d68fbf274 100644 --- a/niucloud/app/service/admin/site/SiteGroupService.php +++ b/niucloud/app/service/admin/site/SiteGroupService.php @@ -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; diff --git a/niucloud/app/service/admin/site/SiteService.php b/niucloud/app/service/admin/site/SiteService.php index e9599d668..93455a561 100644 --- a/niucloud/app/service/admin/site/SiteService.php +++ b/niucloud/app/service/admin/site/SiteService.php @@ -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) { } } diff --git a/niucloud/app/service/admin/sys/SystemService.php b/niucloud/app/service/admin/sys/SystemService.php index ab686df1d..4cb79855e 100644 --- a/niucloud/app/service/admin/sys/SystemService.php +++ b/niucloud/app/service/admin/sys/SystemService.php @@ -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); } /** diff --git a/niucloud/app/service/admin/upgrade/UpgradeService.php b/niucloud/app/service/admin/upgrade/UpgradeService.php index c21716285..e267cc8cc 100644 --- a/niucloud/app/service/admin/upgrade/UpgradeService.php +++ b/niucloud/app/service/admin/upgrade/UpgradeService.php @@ -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')) { diff --git a/niucloud/app/service/admin/weapp/WeappConfigService.php b/niucloud/app/service/admin/weapp/WeappConfigService.php index 82eebe8cb..fabc63983 100644 --- a/niucloud/app/service/admin/weapp/WeappConfigService.php +++ b/niucloud/app/service/admin/weapp/WeappConfigService.php @@ -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, diff --git a/niucloud/app/service/api/diy/DiyConfigService.php b/niucloud/app/service/api/diy/DiyConfigService.php index 198247e4f..823fa569b 100644 --- a/niucloud/app/service/api/diy/DiyConfigService.php +++ b/niucloud/app/service/api/diy/DiyConfigService.php @@ -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' ]; } diff --git a/niucloud/app/service/api/member/AddressService.php b/niucloud/app/service/api/member/AddressService.php index 33424ca03..1b75a0858 100644 --- a/niucloud/app/service/api/member/AddressService.php +++ b/niucloud/app/service/api/member/AddressService.php @@ -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(); diff --git a/niucloud/app/service/api/member/MemberConfigService.php b/niucloud/app/service/api/member/MemberConfigService.php index 33a290ba4..e5bfef0b0 100644 --- a/niucloud/app/service/api/member/MemberConfigService.php +++ b/niucloud/app/service/api/member/MemberConfigService.php @@ -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; } } \ No newline at end of file diff --git a/niucloud/app/service/api/member/MemberService.php b/niucloud/app/service/api/member/MemberService.php index 7a41829e5..4c27afb90 100644 --- a/niucloud/app/service/api/member/MemberService.php +++ b/niucloud/app/service/api/member/MemberService.php @@ -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]); + } + } } diff --git a/niucloud/app/service/api/member/MemberSignService.php b/niucloud/app/service/api/member/MemberSignService.php index 9289796d2..ef34345e0 100644 --- a/niucloud/app/service/api/member/MemberSignService.php +++ b/niucloud/app/service/api/member/MemberSignService.php @@ -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'); diff --git a/niucloud/app/service/core/member/CoreMemberService.php b/niucloud/app/service/core/member/CoreMemberService.php index 70ced5911..ef7d5133d 100644 --- a/niucloud/app/service/core/member/CoreMemberService.php +++ b/niucloud/app/service/core/member/CoreMemberService.php @@ -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, diff --git a/niucloud/app/service/core/order/recharge/CoreRechargeOrderService.php b/niucloud/app/service/core/order/recharge/CoreRechargeOrderService.php deleted file mode 100644 index 7896311d1..000000000 --- a/niucloud/app/service/core/order/recharge/CoreRechargeOrderService.php +++ /dev/null @@ -1,163 +0,0 @@ - 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(); - } - -} - diff --git a/niucloud/app/service/core/order/recharge/CoreRechargeRefundService.php b/niucloud/app/service/core/order/recharge/CoreRechargeRefundService.php deleted file mode 100644 index 18677929e..000000000 --- a/niucloud/app/service/core/order/recharge/CoreRechargeRefundService.php +++ /dev/null @@ -1,142 +0,0 @@ -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()); - } - } -} - diff --git a/niucloud/app/service/core/poster/CorePosterService.php b/niucloud/app/service/core/poster/CorePosterService.php index 737fa977b..161fd0b14 100644 --- a/niucloud/app/service/core/poster/CorePosterService.php +++ b/niucloud/app/service/core/poster/CorePosterService.php @@ -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 diff --git a/niucloud/app/service/core/schedule/CoreScheduleLogService.php b/niucloud/app/service/core/schedule/CoreScheduleLogService.php new file mode 100644 index 000000000..5c27071e5 --- /dev/null +++ b/niucloud/app/service/core/schedule/CoreScheduleLogService.php @@ -0,0 +1,84 @@ +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; + } + +} diff --git a/niucloud/app/service/core/schedule/CoreScheduleService.php b/niucloud/app/service/core/schedule/CoreScheduleService.php index 5aa2537e1..008739181 100644 --- a/niucloud/app/service/core/schedule/CoreScheduleService.php +++ b/niucloud/app/service/core/schedule/CoreScheduleService.php @@ -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; } } diff --git a/niucloud/app/service/core/sys/CoreSysConfigService.php b/niucloud/app/service/core/sys/CoreSysConfigService.php index 3e7ea76d4..98e526693 100644 --- a/niucloud/app/service/core/sys/CoreSysConfigService.php +++ b/niucloud/app/service/core/sys/CoreSysConfigService.php @@ -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 ]; } diff --git a/niucloud/app/service/core/weapp/CoreWeappService.php b/niucloud/app/service/core/weapp/CoreWeappService.php index 35fc84e55..f2e341670 100644 --- a/niucloud/app/service/core/weapp/CoreWeappService.php +++ b/niucloud/app/service/core/weapp/CoreWeappService.php @@ -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(); + } } /** diff --git a/niucloud/app/service/core/wechat/CoreWechatConfigService.php b/niucloud/app/service/core/wechat/CoreWechatConfigService.php index fb991052b..ca082f3c9 100644 --- a/niucloud/app/service/core/wechat/CoreWechatConfigService.php +++ b/niucloud/app/service/core/wechat/CoreWechatConfigService.php @@ -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, diff --git a/niucloud/app/upgrade/v052/upgrade.sql b/niucloud/app/upgrade/v052/upgrade.sql index 6fd8848c9..3546eadc8 100644 --- a/niucloud/app/upgrade/v052/upgrade.sql +++ b/niucloud/app/upgrade/v052/upgrade.sql @@ -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 '删除时间'; diff --git a/niucloud/app/upgrade/v053/Upgrade.php b/niucloud/app/upgrade/v053/Upgrade.php new file mode 100644 index 000000000..d5ea4ec98 --- /dev/null +++ b/niucloud/app/upgrade/v053/Upgrade.php @@ -0,0 +1,75 @@ +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 ]); + } + } + + } + +} \ No newline at end of file diff --git a/niucloud/app/upgrade/v053/upgrade.sql b/niucloud/app/upgrade/v053/upgrade.sql new file mode 100644 index 000000000..f9e85f75a --- /dev/null +++ b/niucloud/app/upgrade/v053/upgrade.sql @@ -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(正方形)';