修改定时任务。

This commit is contained in:
zpc 2025-10-25 02:09:56 +08:00
parent 48709faa88
commit 3eaef44538
17 changed files with 289 additions and 40 deletions

View File

@ -405,6 +405,21 @@ namespace CoreCms.Net.Configuration
/// </summary>
public const string Kuaidi100Key = "kuaidi100Key";
/// <summary>
/// 客服H5地址
/// </summary>
public const string CustomerServiceH5Url = "customerServiceH5Url";
/// <summary>
/// 客服后台管理地址
/// </summary>
public const string CustomerServiceAdminUrl = "customerServiceAdminUrl";
/// <summary>
/// 客服后台地址
/// </summary>
public const string CustomerServiceBackendUrl = "customerServiceBackendUrl";
//搜索发现关键字============================================================================
/// <summary>

View File

@ -158,6 +158,11 @@ namespace CoreCms.Net.Configuration
di.Add(SystemSettingConstVars.Kuaidi100Customer, new DictionaryKeyValues() { sKey = "公司编号", sValue = "" });
di.Add(SystemSettingConstVars.Kuaidi100Key, new DictionaryKeyValues() { sKey = "授权key", sValue = "" });
// 客服配置
di.Add(SystemSettingConstVars.CustomerServiceH5Url, new DictionaryKeyValues() { sKey = "客服H5地址", sValue = "" });
di.Add(SystemSettingConstVars.CustomerServiceAdminUrl, new DictionaryKeyValues() { sKey = "客服后台管理地址", sValue = "" });
di.Add(SystemSettingConstVars.CustomerServiceBackendUrl, new DictionaryKeyValues() { sKey = "客服后台地址", sValue = "" });
//统计代码
di.Add(SystemSettingConstVars.StatisticsCode, new DictionaryKeyValues() { sKey = "百度统计代码", sValue = "" });
//发票开关

View File

@ -142,5 +142,15 @@ namespace CoreCms.Net.Model.Entities
[SugarColumn(ColumnDescription = "删除标志 有数据就是删除")]
[Required(ErrorMessage = "请输入{0}")]
public System.Boolean isDelete { get; set; }
/// <summary>
/// 重置余额
/// </summary>
[Display(Name = "重置余额")]
[SugarColumn(ColumnDescription = "重置余额")]
[Required(ErrorMessage = "请输入{0}")]
public System.Decimal reBalance { get; set; }
}
}

View File

@ -133,6 +133,7 @@ namespace CoreCms.Net.Repository
isDelete = p.isDelete,
type = (int)sWeChatInfo.type,
parentNickName = sParentUser.nickName,
reBalance= p.reBalance,
childNum = SqlFunc.Subqueryable<CoreCmsUser>().Where(o => o.parentId == p.id).Count()
})
.MergeTable().With(SqlWith.Null)

View File

@ -65,6 +65,9 @@ namespace CoreCms.Net.Task
//定时刷新获取微信AccessToken
RecurringJob.AddOrUpdate<RefreshWeChatAccessTokenJob>(s => s.Execute(), "0 0/4 * * * ? ", TimeZoneInfo.Local); // 每2分钟刷新获取微信AccessToken
//每天5点定时刷新用户余额
RecurringJob.AddOrUpdate<RefreshUserBalanceJob>(s => s.Execute(), "0 0 5 * * ?", TimeZoneInfo.Local);
}
#endregion

View File

@ -0,0 +1,96 @@
using CoreCms.Net.Caching.AutoMate.RedisCache;
using CoreCms.Net.Configuration;
using CoreCms.Net.IServices;
using CoreCms.Net.Model.Entities;
using CoreCms.Net.WeChat.Service.HttpClients;
using CoreCms.Net.WeChat.Service.Options;
using Microsoft.Extensions.Options;
using Newtonsoft.Json;
using SKIT.FlurlHttpClient.Wechat.Api.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CoreCms.Net.Task
{
/// <summary>
/// 定时重置用户余额当用户刷新余额大于0的时候每天会将用户余额数量设置为刷新余额数量。
/// </summary>
public class RefreshUserBalanceJob
{
private readonly ISysTaskLogServices _taskLogServices;
private readonly ICoreCmsUserServices _userServices;
public RefreshUserBalanceJob(IRedisOperationRepository redisOperationRepository, ISysTaskLogServices taskLogServices, IOptions<WeChatOptions> weChatOptions, IWeChatApiHttpClientFactory weChatApiHttpClientFactory, IWeChatAccessTokenServices weChatAccessTokenServices, ICoreCmsUserServices userServices)
{
_taskLogServices = taskLogServices;
_userServices = userServices;
}
public async System.Threading.Tasks.Task Execute()
{
try
{
// 查询所有需要刷新余额的用户reBalance > 0
var users = await _userServices.QueryListByClauseAsync(p => p.reBalance > 0);
if (users == null || users.Count == 0)
{
var emptyLog = new SysTaskLog
{
createTime = DateTime.Now,
isSuccess = true,
name = "刷新用户余额",
parameters = JsonConvert.SerializeObject(new { total = 0, updated = 0, skipped = 0 })
};
await _taskLogServices.InsertAsync(emptyLog);
return;
}
int total = users.Count;
int updated = 0;
int skipped = 0;
foreach (var u in users)
{
var delta = u.reBalance - u.balance;
if (delta == 0)
{
skipped++;
continue;
}
var res = await _userServices.UpdateBalance(u.id, delta);
if (res != null && res.code == 0)
{
updated++;
}
}
var log = new SysTaskLog
{
createTime = DateTime.Now,
isSuccess = true,
name = "刷新用户余额",
parameters = JsonConvert.SerializeObject(new { total, updated, skipped })
};
await _taskLogServices.InsertAsync(log);
}
catch (Exception ex)
{
//插入日志
var model = new SysTaskLog
{
createTime = DateTime.Now,
isSuccess = false,
name = "刷新用户余额",
parameters = JsonConvert.SerializeObject(ex)
};
await _taskLogServices.InsertAsync(model);
}
}
}
}

View File

@ -1583,5 +1583,34 @@ namespace CoreCms.Net.Web.Admin.Controllers
#endregion
#region ============================================================
/// <summary>
/// 获取客服后台管理与客服后台地址
/// </summary>
/// <returns></returns>
[HttpPost]
[Description("获取客服后台地址")]
public async Task<AdminUiCallBack> GetCustomerServiceUrls()
{
var jm = new AdminUiCallBack();
var allConfigs = await _settingServices.GetConfigDictionaries();
var adminUrl = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.CustomerServiceAdminUrl);
var backendUrl = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.CustomerServiceBackendUrl);
jm.code = 0;
jm.msg = "数据获取正常";
jm.data = new
{
adminUrl,
backendUrl
};
return jm;
}
#endregion
}
}

View File

@ -422,6 +422,7 @@ namespace CoreCms.Net.Web.Admin.Controllers
oldModel.grade = entity.grade;
oldModel.updataTime = DateTime.Now;
oldModel.status = entity.status;
oldModel.reBalance = entity.reBalance;
//事物处理过程结束
var bl = await _coreCmsUserServices.UpdateAsync(oldModel);
jm.code = bl ? 0 : 1;

View File

@ -759,6 +759,12 @@
</summary>
<returns></returns>
</member>
<member name="M:CoreCms.Net.Web.Admin.Controllers.ToolsController.GetCustomerServiceUrls">
<summary>
获取客服后台管理与客服后台地址
</summary>
<returns></returns>
</member>
<member name="T:CoreCms.Net.Web.Admin.Controllers.CoreCmsDistributionController">
<summary>
分销商表

View File

@ -40,16 +40,16 @@
<cite>促销</cite>
</a>
</li>
<li class="layui-col-xs3">
<a href="javascript:;" lay-href="/shop/ship/">
<li class="layui-col-xs3" id="customerServiceAdminItem" style="display:none;">
<a href="javascript:;" id="customerServiceAdminLink">
<i class="layui-icon layui-icon-release"></i>
<cite>配送</cite>
<cite>客服后台管理</cite>
</a>
</li>
<li class="layui-col-xs3">
<a href="javascript:;" lay-href="/distribution/distributor/">
<li class="layui-col-xs3" id="customerServiceBackendItem" style="display:none;">
<a href="javascript:;" id="customerServiceBackendLink">
<i class="layui-icon layui-icon-snowflake"></i>
<cite>分销商</cite>
<cite>客服后台</cite>
</a>
</li>
<li class="layui-col-xs3">
@ -207,6 +207,37 @@
var util = layui.util;
var laytpl = layui.laytpl;
var carousel = layui.carousel;
var csAdminUrl = '';
var csBackendUrl = '';
// 获取客服后台地址并绑定点击事件(未配置则隐藏入口)
coreHelper.Post("Api/Tools/GetCustomerServiceUrls", {}, function (res) {
if (res && res.code === 0 && res.data) {
csAdminUrl = res.data.adminUrl || '';
csBackendUrl = res.data.backendUrl || '';
if (csAdminUrl) {
$('#customerServiceAdminItem').show();
}
if (csBackendUrl) {
$('#customerServiceBackendItem').show();
}
}
});
$('#customerServiceAdminLink').on('click', function () {
if (csAdminUrl) {
window.open(csAdminUrl, '_blank');
} else {
layui.layer.msg('未配置客服后台管理地址');
}
});
$('#customerServiceBackendLink').on('click', function () {
if (csBackendUrl) {
window.open(csBackendUrl, '_blank');
} else {
layui.layer.msg('未配置客服后台地址');
}
});
getBackLog();
ordersEcharts();

View File

@ -42,6 +42,7 @@
<li lay-id="inviteFriends">邀请好友设置</li>
<li lay-id="filesStorage">附件设置</li>
<li lay-id="other">其他设置</li>
<li lay-id="customerService">客服配置</li>
</ul>
<div class="layui-tab-content">
<div class="layui-tab-item layui-show">
@ -706,6 +707,34 @@
</div>
</div>
</div>
<div class="layui-tab-item">
<div class="layui-form coreshop-form">
<div class="layui-form-item">
<label class="layui-form-label">{{d.data.configs['customerServiceH5Url']['sKey']}}</label>
<div class="layui-input-inline layui-inline-8">
<input type="text" name="customerServiceH5Url" value="{{d.data.configs['customerServiceH5Url']['sValue']}}" lay-verify="title" autocomplete="off" placeholder="可为空" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">{{d.data.configs['customerServiceAdminUrl']['sKey']}}</label>
<div class="layui-input-inline layui-inline-8">
<input type="text" name="customerServiceAdminUrl" value="{{d.data.configs['customerServiceAdminUrl']['sValue']}}" lay-verify="title" autocomplete="off" placeholder="可为空" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">{{d.data.configs['customerServiceBackendUrl']['sKey']}}</label>
<div class="layui-input-inline layui-inline-8">
<input type="text" name="customerServiceBackendUrl" value="{{d.data.configs['customerServiceBackendUrl']['sValue']}}" lay-verify="title" autocomplete="off" placeholder="可为空" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">&nbsp;</label>
<div class="layui-input-block">
<button class="layui-btn" lay-submit="" lay-filter="save">保存更改</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@ -1,24 +1,8 @@
<div class="layui-card-header">版本信息</div>
<div class="layui-card-body layui-text layadmin-about">
<script type="text/html" template>
<p>当前版本:{{ layui.setter.version }}</p>
</script>
<div class="layui-btn-container">
<a href="http://www.coreshop.cn/" target="_blank" class="layui-btn layui-btn-sm layui-btn-danger">官网下载</a>
<a href="https://github.com/CoreUnion/CoreShop" target="_blank" class="layui-btn layui-btn-sm">GitHub下载</a>
<a href="https://gitee.com/CoreUnion/CoreShop" target="_blank" class="layui-btn layui-btn-sm">Gitee下载</a>
</div>
</div>
<div class="layui-card-header">关于版权</div>
<div class="layui-card-body layui-text layadmin-about">
<blockquote class="layui-elem-quote" style="border: none;">
允许个人学习研究使用,支持二次开发。<br />
允许商业用途,但仅限自运营,如果商用必须保留版权信息,望自觉遵守。<br />
不允许对程序代码以任何形式、任何目的的再发行或出售,否则将追究侵权者法律责任。<br />
软件受国家计算机软件著作权保护(登记号:<a href="https://files.cdn.coreshop.cn/images/coreshopcopyright.jpeg" target="_blank">2020SR1224749</a>)。<br />
我们的团队水平有限也是在探索中学习、改进。开源是为了让认可我们的用户能自由的使用、学习软件的内部架构让更多的人有机会阅读并发现Bug、对软件项目提出改进意见。
</blockquote>
<p>© 2021 <a href="http://www.coreshop.cn/" target="_blank">coreshop.cn</a> 版权所有</p>
</div>

View File

@ -7,19 +7,25 @@
<div class="col-lg-7 d-none d-md-flex justify-content-center align-items-center gradient-brand-color vh-100">
<figure class="figure pattern-svg">
<svg xmlns=http://www.w3.org/2000/svg xmlns:xlink=http://www.w3.org/1999/xlink width=690px height=519px>
<path fill-rule=evenodd opacity=0.412 fill="rgb(255, 255, 255)" d="M0.010,293.142 L7.857,289.009 L11.990,296.857 L4.142,300.989 L0.010,293.142 Z" />
<path fill-rule=evenodd opacity=0.6 fill="rgb(255, 255, 255)" d="M680.839,148.992 L689.997,154.833 L684.156,163.991 L674.998,158.149 L680.839,148.992 Z" />
<path fill-rule=evenodd opacity=0.2 fill="rgb(255, 255, 255)" d="M145.500,508.000 C148.538,508.000 151.000,510.462 151.000,513.500 C151.000,516.538 148.538,519.000 145.500,519.000 C142.462,519.000 140.000,516.538 140.000,513.500 C140.000,510.462 142.462,508.000 145.500,508.000 Z" />
<path fill-rule=evenodd opacity=0.302 fill="rgb(255, 255, 255)" d="M633.500,357.000 C635.985,357.000 638.000,359.015 638.000,361.500 C638.000,363.985 635.985,366.000 633.500,366.000 C631.015,366.000 629.000,363.985 629.000,361.500 C629.000,359.015 631.015,357.000 633.500,357.000 Z" />
<path fill-rule=evenodd opacity=0.8 fill="rgb(255, 255, 255)" d="M574.672,8.047 L583.310,0.211 L585.650,11.982 L574.672,8.047 Z" />
<path fill-rule=evenodd opacity=0.6 fill="rgb(255, 255, 255)" d="M140.000,18.000 C141.657,18.000 143.000,19.343 143.000,21.000 C143.000,22.657 141.657,24.000 140.000,24.000 C138.343,24.000 137.000,22.657 137.000,21.000 C137.000,19.343 138.343,18.000 140.000,18.000 Z" />
<path fill-rule=evenodd opacity=0.412 fill="rgb(255, 255, 255)"
d="M0.010,293.142 L7.857,289.009 L11.990,296.857 L4.142,300.989 L0.010,293.142 Z" />
<path fill-rule=evenodd opacity=0.6 fill="rgb(255, 255, 255)"
d="M680.839,148.992 L689.997,154.833 L684.156,163.991 L674.998,158.149 L680.839,148.992 Z" />
<path fill-rule=evenodd opacity=0.2 fill="rgb(255, 255, 255)"
d="M145.500,508.000 C148.538,508.000 151.000,510.462 151.000,513.500 C151.000,516.538 148.538,519.000 145.500,519.000 C142.462,519.000 140.000,516.538 140.000,513.500 C140.000,510.462 142.462,508.000 145.500,508.000 Z" />
<path fill-rule=evenodd opacity=0.302 fill="rgb(255, 255, 255)"
d="M633.500,357.000 C635.985,357.000 638.000,359.015 638.000,361.500 C638.000,363.985 635.985,366.000 633.500,366.000 C631.015,366.000 629.000,363.985 629.000,361.500 C629.000,359.015 631.015,357.000 633.500,357.000 Z" />
<path fill-rule=evenodd opacity=0.8 fill="rgb(255, 255, 255)"
d="M574.672,8.047 L583.310,0.211 L585.650,11.982 L574.672,8.047 Z" />
<path fill-rule=evenodd opacity=0.6 fill="rgb(255, 255, 255)"
d="M140.000,18.000 C141.657,18.000 143.000,19.343 143.000,21.000 C143.000,22.657 141.657,24.000 140.000,24.000 C138.343,24.000 137.000,22.657 137.000,21.000 C137.000,19.343 138.343,18.000 140.000,18.000 Z" />
</svg>
</figure>
<div class="w-75 px-4">
<div class="swiper-container pt-5 pb-5">
<div class="swiper-wrapper text-center">
<div class="swiper-slide testimony__slide">
<p class=mb-5><strong class="super-lead color--white">是否有核心,由你来确定。</strong>
<p class=mb-5><strong class="super-lead color--white">雨宝庄严</strong>
</div>
</div>
</div>
@ -28,36 +34,46 @@
<div class="col-lg-5 d-flex align-items-md-baseline py-5 background--light vh-md-100 overflow-auto">
<div class="w-75 mt-3 mt-md-5 mx-auto overflow-hidden px-md-5 px-lg-3">
<header class="mb-5">
<img src='/static/images/common/logo.png' style="height: 80px;">
<!-- <img src='/static/images/common/logo.png' style="height: 80px;"> -->
<h1>后台管理</h1>
</header>
<main class="main">
<div class="form-validate layui-form">
<div class="row">
<div class="col-sm-12 mb-2">
<div class=form-group>
<input type="text" name="username" id="LAY-user-login-username" lay-verType="tips" lay-verify="required" placeholder="用户名" class="form-control">
<input type="text" name="username" id="LAY-user-login-username" lay-verType="tips"
lay-verify="required" placeholder="用户名" class="form-control">
</div>
</div>
<div class="col-sm-12 mb-2">
<div class=form-group>
<input type="password" name="password" id="LAY-user-login-password" lay-verType="tips" lay-verify="required" placeholder="密码" class="form-control">
<input type="password" name="password" id="LAY-user-login-password"
lay-verType="tips" lay-verify="required" placeholder="密码" class="form-control">
</div>
</div>
<div class="col-sm-12 mb-2">
<button type="button" class="btn btn-info w-100" lay-submit lay-filter="LAY-user-login-submit" id="loginSubmit">登录</button>
<button type="button" class="btn btn-info w-100" lay-submit
lay-filter="LAY-user-login-submit" id="loginSubmit">
登录
</button>
</div>
</div>
</div>
</main>
<footer class=mt-5>
<small>©2020 - <a href="http://www.coreshop.cn/" target="_blank">CoreShop.Cn</a> All rights reserved. <br><span>推荐使用 <a href="//www.microsoft.com/zh-cn/edge" target=_blank>新版 Microsoft Edge 浏览器</a> 访问本系统</span></small>
<!-- <small>©2020 - <a href="http://www.coreshop.cn/" target="_blank">CoreShop.Cn</a> All rights reserved. <br><span>推荐使用 <a href="//www.microsoft.com/zh-cn/edge" target=_blank>新版 Microsoft Edge 浏览器</a> 访问本系统</span></small> -->
</footer>
</div>
</div>
</div>
</div>
<style>
body { font-family: 'Inter',sans-serif; line-height: 1.5; color: #4f5464; }
body {
font-family: 'Inter', sans-serif;
line-height: 1.5;
color: #4f5464;
}
</style>
<script>
layui.use(['admin', 'form', 'coreHelper'], function () {

View File

@ -79,6 +79,17 @@
</div>
</div>
</div>
<div class="layui-form-item">
<div class="layui-inline layui-input-wrap layui-input-wrap-prefix">
<label class="layui-form-label">重置余额:</label>
<div class="layui-input-inline">
<div class="layui-input-prefix">
<i class="layui-icon layui-icon-rmb"></i>
</div>
<input type="number" step="0.01" name="reBalance" class="layui-input" lay-verify="number" placeholder="0.00" value="0.00">
</div>
</div>
</div>
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label" for="avatarImage">头像:</label>

View File

@ -72,6 +72,14 @@
</div>
</div>
</div>
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">重置余额:</label>
<div class="layui-input-inline">
<input type="number" step="0.01" name="reBalance" class="layui-input" lay-verify="number" value="{{ d.params.data.model.reBalance || 0 }}">
</div>
</div>
</div>
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label" for="avatarImage">头像:</label>

View File

@ -210,6 +210,7 @@
return html;
}
},
{ field: 'reBalance', title: '重置余额', sort: false, width: 90 },
{
field: 'point', title: '积分', sort: false, width: 70, templet: function (data) {
var html = '<a class="link-hot option-show point" data-id="' + data.id + '">' + data.point + '</a>';

View File

@ -132,6 +132,7 @@ namespace CoreCms.Net.Web.WebApi.Controllers
var shareImage = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.ShareImage); //分享图片
var aboutArticleId = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.AboutArticleId).ObjectToInt(2); //关于我们文章
var entId = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.EntId); //客服ID
var customerServiceH5Url = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.CustomerServiceH5Url); //客服H5地址
var userAgreementId = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.UserAgreementId).ObjectToInt(3); //用户协议
var privacyPolicyId = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.PrivacyPolicyId).ObjectToInt(4); //隐私政策
@ -187,6 +188,7 @@ namespace CoreCms.Net.Web.WebApi.Controllers
shareImage,
aboutArticleId,
entId,
customerServiceH5Url,
userAgreementId,
privacyPolicyId,
reshipName,
@ -203,6 +205,7 @@ namespace CoreCms.Net.Web.WebApi.Controllers
jm.data = model;
return jm;
}
#endregion
#region =============================================================================