Commit f22c60fe by guanzhenshan

增加自动下载服务;增加任务模版新增和列表功能;增加任务列表报表;增加根据模版规则生成任务的功能;

parent c149eb68
using System;
using System.Collections.Generic;
using System.Text;
namespace Bailun.DC.Models
{
public class taskcenter_accounts
{
/// <summary>
///
/// </summary>
public int id { get; set; }
/// <summary>
/// 平台
/// </summary>
public string platform { get; set; }
/// <summary>
/// 站点
/// </summary>
public string website { get; set; }
/// <summary>
/// 和taskcenter_template的字段download_type值对应;数据类型,1:物流账单
/// </summary>
public int data_type { get; set; }
/// <summary>
/// 帐号
/// </summary>
public string account { get; set; }
/// <summary>
///
/// </summary>
public string pwd { get; set; }
/// <summary>
///
/// </summary>
public string token { get; set; }
/// <summary>
/// url
/// </summary>
public string apiurl { get; set; }
/// <summary>
/// 频率
/// </summary>
public string frequency { get; set; }
/// <summary>
/// 1、启用,0:禁用
/// </summary>
public int status { get; set; }
/// <summary>
/// 备注
/// </summary>
public string note { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace Bailun.DC.Models
{
public class taskcenter_tasklist
{
/// <summary>
///
/// </summary>
public int id { get; set; }
/// <summary>
///
/// </summary>
public int task_template_id { get; set; }
/// <summary>
///
/// </summary>
public string platform_type { get; set; }
public int datatype { get; set; }
/// <summary>
///
/// </summary>
public string account { get; set; }
/// <summary>
///
/// </summary>
public string website { get; set; }
/// <summary>
///
/// </summary>
public string urlpath { get; set; }
/// <summary>
///
/// </summary>
public DateTime createtime { get; set; }
/// <summary>
///
/// </summary>
public DateTime lastupdatetime { get; set; }
/// <summary>
///
/// </summary>
public int status { get; set; }
/// <summary>
/// 文件下载地址
/// </summary>
public string fileurl { get; set; }
}
/// <summary>
/// 自动下载任务状态
/// </summary>
public enum Enum_TaskStatus
{
未认领 = 0,
任务执行失败 = 1,
已认领 = 2,
执行成功 = 3
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace Bailun.DC.Models
{
public class taskcenter_template
{
/// <summary>
///
/// </summary>
public int id { get; set; }
/// <summary>
/// 下载类型,1:物流发货明细
/// </summary>
public int download_type { get; set; }
/// <summary>
/// 启动频率 指定月份启动,如果是每天启动的则填0即可
/// </summary>
public int start_frequency_month { get; set; }
/// <summary>
/// 启动频率 每月的几号启动,如果是每小时启动则填0即可
/// </summary>
public int start_frequency_day { get; set; }
/// <summary>
/// 启动频率 每天的几点启动
/// </summary>
public int start_frequency_hour { get; set; }
/// <summary>
/// 任务启动规则,cron规则
/// </summary>
public string cron { get; set; }
/// <summary>
/// 是否启动模版,1:启用,0:停止
/// </summary>
public int status { get; set; }
/// <summary>
/// 备注
/// </summary>
public string note { get; set; }
public DateTime lastupdatetime { get; set; }
public int lastupdateuserid { get; set; }
public string lastupdateusername { get; set; }
}
/// <summary>
/// 自动下载模版的下载类型
/// </summary>
public enum Enum_download_type
{
物流账单=1
}
}
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.1</TargetFramework>
<LangVersion>latest</LangVersion>
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Dapper" Version="2.0.35" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="3.1.6" />
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.10.13" />
<PackageReference Include="MySql.Data" Version="8.0.20" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Bailun.DC.Models\Bailun.DC.Models.csproj" />
<ProjectReference Include="..\Bailun.DC.Services\Bailun.DC.Services.csproj" />
</ItemGroup>
</Project>
#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.
FROM mcr.microsoft.com/dotnet/runtime:3.1 AS base
WORKDIR /app
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
FROM mcr.microsoft.com/dotnet/sdk:3.1 AS build
WORKDIR /src
COPY ["Bailun.DC.TaskCenter/Bailun.DC.TaskCenter.csproj", "Bailun.DC.TaskCenter/"]
COPY ["Bailun.DC.Services/Bailun.DC.Services.csproj", "Bailun.DC.Services/"]
COPY ["Bailun.DC.Common/Bailun.DC.Common.csproj", "Bailun.DC.Common/"]
COPY ["Bailun.DC.DB/Bailun.DC.DB.csproj", "Bailun.DC.DB/"]
COPY ["Bailun.DC.Models/Bailun.DC.Models.csproj", "Bailun.DC.Models/"]
RUN dotnet restore "Bailun.DC.TaskCenter/Bailun.DC.TaskCenter.csproj"
COPY . .
WORKDIR "/src/Bailun.DC.TaskCenter"
RUN dotnet build "Bailun.DC.TaskCenter.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "Bailun.DC.TaskCenter.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "Bailun.DC.TaskCenter.dll"]
\ No newline at end of file
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System;
using System.Threading.Tasks;
namespace Bailun.DC.TaskCenter
{
class Program
{
/// <summary>
/// 根据模版生成自动下载任务列表
/// </summary>
/// <param name="args"></param>
static async Task Main(string[] args)
{
Console.WriteLine("启动服务 " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
var builder = new HostBuilder().ConfigureServices((hostContext, services) =>
{
services.AddHostedService<Services>();
});
await builder.RunConsoleAsync();
//new Services().Init();
}
}
}
using Microsoft.Extensions.Hosting;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace Bailun.DC.TaskCenter
{
public class Services : BackgroundService
{
private Timer _timer;
protected override Task ExecuteAsync(CancellationToken stoppingToken)
{
_timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromMinutes(1));
return Task.CompletedTask;
}
private void DoWork(object state)
{
try
{
var now = DateTime.Now;
if (now.Minute == 12 && now.Second==3) //
{
Console.WriteLine("开始启动 " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
Init();
Console.WriteLine("任务运行完成 " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
public void Init()
{
new DC.Services.TaskCenterServices().CreateTaskAll();
}
}
}
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Bailun.DC.Services;
using Bailun.DC.Models;
using Bailun.DC.Common;
using Bailun.ServiceFabric.Authorize;
using Bailun.ServiceFabric.Core.Extension.HttpContext;
using Bailun.ServiceFabric.Core.Extension;
namespace Bailun.DC.Web.Areas.TaskCenter.Controllers
{
[Area("TaskCenter")]
public class HomeController : Controller
{
public IActionResult Index()
{
return View();
}
#region 任务模版
public IActionResult Templates()
{
return View();
}
/// <summary>
/// 获取任务模版列表
/// </summary>
/// <param name="parameter"></param>
/// <param name="status"></param>
/// <param name="datatype"></param>
/// <returns></returns>
public string TemplatesJson(BtTableParameter parameter,int? status,int? datatype)
{
var total = 0;
var obj = new Services.TaskCenterServices().List(parameter, status, datatype, ref total);
var list = obj.Select(a => new {
download_type = Enum.GetName(typeof(Enum_download_type), a.download_type),
lastupdatetime = a.lastupdatetime.ToString("yyyy-MM-dd HH:mm:ss"),
a.start_frequency_day,
a.start_frequency_hour,
a.start_frequency_month,
status = a.status==1?"启用":"禁用",
a.note,
a.id,
});
return Newtonsoft.Json.JsonConvert.SerializeObject(new {
rows = list,
total = total
});
}
public ActionResult AddTaskTemplate(int? id)
{
var obj = new Services.TaskCenterServices().GetTaskTemplate(id ?? 0);
if(obj==null)
{
obj = new taskcenter_template();
}
ViewBag.m = obj;
return View();
}
[BailunAuthentication(LoginMode.Enforce)]
[HttpPost]
public JsonResult SaveTaskTemplate(taskcenter_template m)
{
var user = HttpContextHelper.Current?.User;
m.lastupdateuserid = user != null ? user.GetUid() : 0;
m.lastupdateusername = user != null ? user.GetUserName() : "";
m.cron = "";
var result = new Services.TaskCenterServices().SaveTaskTemplate(m);
return Json(new {
success = string.IsNullOrEmpty(result),
msg = result
});
}
#endregion
#region 任务列表
public IActionResult ListTask()
{
return View();
}
/// <summary>
/// 获取任务列表
/// </summary>
/// <param name="parameter"></param>
/// <param name="datatype"></param>
/// <param name="status"></param>
/// <returns></returns>
public string ListTaskJson(BtTableParameter parameter, int? datatype, int? status)
{
var total = 0;
var obj = new Services.TaskCenterServices().ListTask(parameter, status, datatype, ref total);
var list = obj.Select(a => new {
a.account,
createtime = a.createtime.ToString("yyyy-MM-dd HH:mm:ss"),
datatype = Enum.GetName(typeof(Enum_download_type),a.datatype),
lastupdatetime = a.lastupdatetime.ToString("yyyy-MM-dd HH:mm:ss"),
a.platform_type,
status = Enum.GetName(typeof(Enum_TaskStatus),a.status),
a.task_template_id,
a.urlpath,
a.website,
a.id,
a.fileurl
});
return Newtonsoft.Json.JsonConvert.SerializeObject(new {
rows = list,
total=total,
});
}
#endregion
}
}
@{
ViewData["Title"] = "自动下载模版设置";
Layout = "~/Pages/Shared/_MainLayout.cshtml";
ViewBag.Nav = new string[] { "自动下载中心", "自动下载模版设置", "模版详情" };
}
<div class="row">
<div class="col-sm-12">
<div class="ibox-content m-b-sm border-bottom">
<div class="" style="margin-bottom:10px;"><span style="color:red;">*</span>启动频率必须至少要设置一个</div>
<form id="toolbar">
<div style="line-height:40px;">
<input id="id" name="id" type="hidden" value="@ViewBag.m.id" />
<div class="row">
<div class="col-sm-12">
<label style="width:110px">下载类型:</label>
<select id="download_type" name="download_type" class="form-control" style="width:130px;display:inline">
<option value="">请选择下载类型</option>
<option value="1">物流账单</option>
</select>
</div>
</div>
<div class="row">
<div class="col-sm-12">
<label style="width:110px">启动频率-月:</label>
<input id="start_frequency_month" name="start_frequency_month" type="number" class="form-control" placeholder="" value="@ViewBag.m.start_frequency_month" style="width:80px;display:inline;" />
<span style="color:#ccc;font-size:13px;">说明:月,如果指定月份启动,则填写对应的月份,0则不指定</span>
</div>
<div class="col-sm-12">
<label style="width:110px">启动频率-日:</label>
<input id="start_frequency_day" name="start_frequency_day" type="number" class="form-control" placeholder="" value="@ViewBag.m.start_frequency_day" style="width:80px;display:inline;" />
<span style="color:#ccc;font-size:13px;">说明:日,如果指定每个月的哪天启动,则填写对应的每月的几号,0则不指定</span>
</div>
<div class="col-sm-12">
<label style="width:110px">启动频率-小时:</label>
<input id="start_frequency_hour" name="start_frequency_hour" type="number" class="form-control" placeholder="" value="@ViewBag.m.start_frequency_hour" style="width:80px;display:inline;" />
<span style="color:#ccc;font-size:13px;">说明:时,如果指定每个天的某个小时启动,则填写对应的每天的几点,0则不指定</span>
</div>
</div>
<div class="row">
<div class="col-sm-12">
<label style="width:130px">状态:</label>
<select id="status" name="status" class="form-control" style="width:130px;display:inline">
<option value="1">启用</option>
<option value="0">禁用</option>
</select>
</div>
</div>
<div class="row">
<div class="col-sm-12">
<label style="width:130px">备注:</label>
<input id="note" name="note" class="form-control" placeholder="模版备注说明" value="@ViewBag.m.note" />
</div>
</div>
</div>
</form>
<div style="margin-top:10px;text-align:center;">
<button class="btn btn-primary" onclick="Save();">保存</button>
</div>
</div>
</div>
</div>
@section scripts{
<script>
$(document).ready(function () {
if ('@ViewBag.m.id' > 0) {
$('#download_type').val('@ViewBag.m.download_type');
}
})
function Save() {
var download_type = $('#download_type').val();
var start_frequency_month = $('#start_frequency_month').val();
var start_frequency_day = $('#start_frequency_day').val();
var start_frequency_hour = $('#start_frequency_hour').val();
if (download_type == '') {
alert('请选择下载类型');
return false;
}
if ((start_frequency_month == '' || start_frequency_month == '0') && (start_frequency_day == '' || start_frequency_day == '0') && (start_frequency_hour == '' || start_frequency_hour == '0')) {
alert('请设置启动频率');
return false;
}
$.submit({
url: '@Url.Content("~/TaskCenter/Home/SaveTaskTemplate")',
paramData: $('#toolbar').serialize(),
type:'Post',
func: function (result) {
if (result.success) {
alert('提交成功!');
window.location = window.location;
}
else {
alert(result.msg);
}
}
})
}
</script>
}
\ No newline at end of file
@{
ViewData["Title"] = "自动下载模版设置";
Layout = "~/Pages/Shared/_MainLayout.cshtml";
ViewBag.Nav = new string[] { "自动下载中心", "任务列表" };
}
<div class="row">
<div class="col-sm-12">
<div class="ibox-content m-b-sm border-bottom">
<form id="toolbar">
<div class="form-inline" style="line-height:40px;">
<div class="form-group">
<label>下载类型</label>
<select id="datatype" name="datatype" class="form-control" style="width:120px">
<option value="">请选择下载类型</option>
<option value="1">物流账单</option>
</select>
</div>
<div class="form-group">
<label></label>
<select id="status" name="status" class="form-control" style="width:130px">
<option value="">请选择任务状态</option>
<option value="1">启用</option>
<option value="0">停用</option>
</select>
</div>
<div class="form-group">
<button type="button" class="btn btn-primary" onclick="list();">查询</button>
</div>
</div>
</form>
</div>
<div class="ibox-content m-b-sm border-bottom">
<table id="roletable" style="table-layout:fixed;"></table>
</div>
</div>
</div>
@section scripts{
<script>
var tb;
$(document).ready(function () {
var height = document.body.clientHeight;
$("#roletable").attr("data-height", (height - 170));
list();
})
function list() {
var columns = [
{ field: 'datatype', title: '数据类型', width: '130'},
{ field: 'platform_type', title: '平台', width: '130' },
{ field: 'website', title: '站点', width: '130'},
{ field: 'account', title: '帐号', width: '130' },
{ field: 'status', title: '任务状态', width: '80' },
{ field: 'createtime', title: '创建时间', width: '130' },
{ field: 'lastupdatetime', title: '最后时间', width: '130' },
{ field: 'fileurl', title: '文件下载', width: '200' }
];
var url = '@Url.Content("~/TaskCenter/Home/ListTaskJson")' + '?' + $('#toolbar').serialize();
if (tb == undefined) {
tb = OnlyTable("roletable", columns, url, "");
}
else {
tb.bootstrapTable('refresh', { url: url });
}
}
function Add() {
layer_show('新增模版', '@Url.Content("~/TaskCenter/Home/AddTaskTemplate?id=0")', '90%', '90%');
}
</script>
}
@{
ViewData["Title"] = "自动下载模版设置";
Layout = "~/Pages/Shared/_MainLayout.cshtml";
ViewBag.Nav = new string[] { "自动下载中心", "自动下载模版设置" };
}
<div class="row">
<div class="col-sm-12">
<div class="ibox-content m-b-sm border-bottom">
<form id="toolbar">
<div class="form-inline" style="line-height:40px;">
<div class="form-group">
<label>&nbsp;</label>
<button type="button" class="btn btn-warning" onclick="Add();">新增模版</button>
</div>
<div class="form-group">
<label>下载类型</label>
<select id="datatype" name="datatype" class="form-control" style="width:120px">
<option value="">请选择下载类型</option>
<option value="1">物流账单</option>
</select>
</div>
<div class="form-group">
<label></label>
<select id="status" name="status" class="form-control" style="width:130px">
<option value="">请选择模版状态</option>
<option value="1">启用</option>
<option value="0">停用</option>
</select>
</div>
<div class="form-group">
<button type="button" class="btn btn-primary" onclick="list();">查询</button>
</div>
</div>
</form>
</div>
<div class="ibox-content m-b-sm border-bottom">
<table id="roletable" style="table-layout:fixed;"></table>
</div>
</div>
</div>
@section scripts{
<script>
var tb;
$(document).ready(function () {
var height = document.body.clientHeight;
$("#roletable").attr("data-height", (height - 170));
list();
})
function list() {
var columns = [
{ field: 'download_type', title: '数据类型', width: '130'},
{ field: 'start_frequency_month', title: '启动频率-月', width: '130' },
{ field: 'start_frequency_day', title: '启动频率-天', width: '130'},
{ field: 'start_frequency_hour', title: '启动频率-小时', width: '130' },
{ field: 'status', title: '状态', width: '80' },
{ field: 'lastupdatetime', title: '最后更新时间', width: '130' },
{ field: 'note', title: '备注', width: '200' }
];
var url = '@Url.Content("~/TaskCenter/Home/TemplatesJson")' + '?' + $('#toolbar').serialize();
if (tb == undefined) {
tb = OnlyTable("roletable", columns, url, "");
}
else {
tb.bootstrapTable('refresh', { url: url });
}
}
function Add() {
layer_show('新增模版', '@Url.Content("~/TaskCenter/Home/AddTaskTemplate?id=0")', '90%', '90%');
}
</script>
}
......@@ -47,6 +47,8 @@
<Folder Include="Areas\Reports\Models\" />
<Folder Include="Areas\Supplier\Data\" />
<Folder Include="Areas\Supplier\Models\" />
<Folder Include="Areas\TaskCenter\Data\" />
<Folder Include="Areas\TaskCenter\Models\" />
<Folder Include="Areas\Users\Data\" />
<Folder Include="Areas\Users\Models\" />
<Folder Include="Views\Api\" />
......
var baseUrl = 'http://data.bailuntec.com'; //'http://localhost:59628/';//
var baseUrl = 'http://localhost:59628/';//'http://data.bailuntec.com'; //
var globalOrderSort='';
var globalOrderType = '';
......
......@@ -81,7 +81,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bailun.DC.MonthShippingInco
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bailun.DC.SyncFBAShippingInfo", "Bailun.DC.SyncFBAShippingInfo\Bailun.DC.SyncFBAShippingInfo.csproj", "{56375C2F-C51D-481C-9668-208BD0330067}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bailun.DC.DailyStockAge", "Bailun.DC.DailyStockAge\Bailun.DC.DailyStockAge.csproj", "{09E1882E-CF92-449C-8C70-5BD4E33EB355}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bailun.DC.DailyStockAge", "Bailun.DC.DailyStockAge\Bailun.DC.DailyStockAge.csproj", "{09E1882E-CF92-449C-8C70-5BD4E33EB355}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bailun.DC.TaskCenter", "Bailun.DC.TaskCenter\Bailun.DC.TaskCenter.csproj", "{2215D072-9F97-45DD-AD4D-2691581B5305}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
......@@ -245,6 +247,10 @@ Global
{09E1882E-CF92-449C-8C70-5BD4E33EB355}.Debug|Any CPU.Build.0 = Debug|Any CPU
{09E1882E-CF92-449C-8C70-5BD4E33EB355}.Release|Any CPU.ActiveCfg = Release|Any CPU
{09E1882E-CF92-449C-8C70-5BD4E33EB355}.Release|Any CPU.Build.0 = Release|Any CPU
{2215D072-9F97-45DD-AD4D-2691581B5305}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2215D072-9F97-45DD-AD4D-2691581B5305}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2215D072-9F97-45DD-AD4D-2691581B5305}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2215D072-9F97-45DD-AD4D-2691581B5305}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
......@@ -283,6 +289,7 @@ Global
{22B454F8-2315-4013-8170-F8FB5AD51BB8} = {AE2CE86A-8538-4142-920F-684DCF47C064}
{56375C2F-C51D-481C-9668-208BD0330067} = {AE2CE86A-8538-4142-920F-684DCF47C064}
{09E1882E-CF92-449C-8C70-5BD4E33EB355} = {AE2CE86A-8538-4142-920F-684DCF47C064}
{2215D072-9F97-45DD-AD4D-2691581B5305} = {AE2CE86A-8538-4142-920F-684DCF47C064}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {6E53AF28-A282-4FB0-A769-EAEA9769C02A}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment