@@ -0,0 +1,25 @@ | |||
**/.classpath | |||
**/.dockerignore | |||
**/.env | |||
**/.git | |||
**/.gitignore | |||
**/.project | |||
**/.settings | |||
**/.toolstarget | |||
**/.vs | |||
**/.vscode | |||
**/*.*proj.user | |||
**/*.dbmdl | |||
**/*.jfm | |||
**/azds.yaml | |||
**/bin | |||
**/charts | |||
**/docker-compose* | |||
**/Dockerfile* | |||
**/node_modules | |||
**/npm-debug.log | |||
**/obj | |||
**/secrets.dev.yaml | |||
**/values.dev.yaml | |||
LICENSE | |||
README.md |
@@ -0,0 +1,25 @@ | |||
| |||
Microsoft Visual Studio Solution File, Format Version 12.00 | |||
# Visual Studio Version 16 | |||
VisualStudioVersion = 16.0.32126.315 | |||
MinimumVisualStudioVersion = 10.0.40219.1 | |||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DataV", "DataV\DataV.csproj", "{DF0C496F-1683-4B82-A6B9-63B961A17067}" | |||
EndProject | |||
Global | |||
GlobalSection(SolutionConfigurationPlatforms) = preSolution | |||
Debug|Any CPU = Debug|Any CPU | |||
Release|Any CPU = Release|Any CPU | |||
EndGlobalSection | |||
GlobalSection(ProjectConfigurationPlatforms) = postSolution | |||
{DF0C496F-1683-4B82-A6B9-63B961A17067}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | |||
{DF0C496F-1683-4B82-A6B9-63B961A17067}.Debug|Any CPU.Build.0 = Debug|Any CPU | |||
{DF0C496F-1683-4B82-A6B9-63B961A17067}.Release|Any CPU.ActiveCfg = Release|Any CPU | |||
{DF0C496F-1683-4B82-A6B9-63B961A17067}.Release|Any CPU.Build.0 = Release|Any CPU | |||
EndGlobalSection | |||
GlobalSection(SolutionProperties) = preSolution | |||
HideSolutionNode = FALSE | |||
EndGlobalSection | |||
GlobalSection(ExtensibilityGlobals) = postSolution | |||
SolutionGuid = {DBDD0A53-9FC4-486D-890D-0BDA45DE92B8} | |||
EndGlobalSection | |||
EndGlobal |
@@ -0,0 +1,52 @@ | |||
using DataV.Service; | |||
using DataV.Service.Dto; | |||
using Furion.DynamicApiController; | |||
using Microsoft.AspNetCore.Mvc; | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Linq; | |||
using System.Threading.Tasks; | |||
namespace DataV.App | |||
{ | |||
[ApiDescriptionSettings("DataV", Tag = "大屏服务", SplitCamelCase = false), Route("/screen"), NonUnify] | |||
public class DataVApplication : IDynamicApiController | |||
{ | |||
private IDataVService DataV; | |||
public DataVApplication(IDataVService DataV) | |||
{ | |||
this.DataV = DataV; | |||
} | |||
/// <summary> | |||
/// 统计订单 | |||
/// </summary> | |||
/// <returns></returns> | |||
[HttpPost] | |||
public Result<object> GetAllOrderDataState(DataVDto input) => DataV.GetAllOrderDataState(input.AutoKey); | |||
/// <summary> | |||
/// 订单日活 | |||
/// </summary> | |||
/// <returns></returns> | |||
[HttpPost] | |||
public Result<object> OrderLine(DataVDto input) => DataV.OrderLine(input.AutoKey); | |||
/// <summary> | |||
/// 顶数量 | |||
/// </summary> | |||
/// <returns></returns> | |||
[HttpPost] | |||
public Result<object> OrderNumber(DataVDto input) => DataV.OrderNumber(input.AutoKey); | |||
/// <summary> | |||
/// 获取加盟商设备列表 | |||
/// </summary> | |||
/// <returns></returns> | |||
[HttpGet] | |||
public Result<Dictionary<string, List<int>>> OnlineDevice() => DataV.OnlineDevice(); | |||
/// <summary> | |||
/// 区域饼状图统计 | |||
/// </summary> | |||
/// <returns></returns> | |||
[HttpGet] | |||
public Result<object> GetLocSale() => DataV.GetLocSale(); | |||
} | |||
} |
@@ -0,0 +1,19 @@ | |||
<Project Sdk="Microsoft.NET.Sdk.Web"> | |||
<PropertyGroup> | |||
<TargetFramework>net6.0</TargetFramework> | |||
</PropertyGroup> | |||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'"> | |||
<DocumentationFile>D:\Codes\DataV\DataV\DataV.xml</DocumentationFile> | |||
</PropertyGroup> | |||
<ItemGroup> | |||
<PackageReference Include="BPA.ApolloClient" Version="1.0.9" /> | |||
<PackageReference Include="Furion" Version="3.1.4" /> | |||
<PackageReference Include="Furion.Extras.ObjectMapper.Mapster" Version="3.1.4" /> | |||
<PackageReference Include="SqlSugarCore" Version="5.0.7.5" /> | |||
<PackageReference Include="XExten.Advance" Version="1.1.3.3" /> | |||
</ItemGroup> | |||
</Project> |
@@ -0,0 +1,314 @@ | |||
<?xml version="1.0"?> | |||
<doc> | |||
<assembly> | |||
<name>DataV</name> | |||
</assembly> | |||
<members> | |||
<member name="M:DataV.App.DataVApplication.GetAllOrderDataState(DataV.Service.Dto.DataVDto)"> | |||
<summary> | |||
统计订单 | |||
</summary> | |||
<returns></returns> | |||
</member> | |||
<member name="M:DataV.App.DataVApplication.OrderLine(DataV.Service.Dto.DataVDto)"> | |||
<summary> | |||
订单日活 | |||
</summary> | |||
<returns></returns> | |||
</member> | |||
<member name="M:DataV.App.DataVApplication.OrderNumber(DataV.Service.Dto.DataVDto)"> | |||
<summary> | |||
顶数量 | |||
</summary> | |||
<returns></returns> | |||
</member> | |||
<member name="M:DataV.App.DataVApplication.OnlineDevice"> | |||
<summary> | |||
获取加盟商设备列表 | |||
</summary> | |||
<returns></returns> | |||
</member> | |||
<member name="M:DataV.App.DataVApplication.GetLocSale"> | |||
<summary> | |||
区域饼状图统计 | |||
</summary> | |||
<returns></returns> | |||
</member> | |||
<member name="F:DataV.Enums.AfterEnum.Cancel"> | |||
<summary> | |||
取消售后 | |||
</summary> | |||
</member> | |||
<member name="F:DataV.Enums.AfterEnum.Apply"> | |||
<summary> | |||
申请售后 | |||
</summary> | |||
</member> | |||
<member name="F:DataV.Enums.AfterEnum.Wait"> | |||
<summary> | |||
等待处理 | |||
</summary> | |||
</member> | |||
<member name="F:DataV.Enums.AfterEnum.Ok"> | |||
<summary> | |||
处理完成 | |||
</summary> | |||
</member> | |||
<member name="F:DataV.Enums.CookEnum.WaitMake"> | |||
<summary> | |||
等待制作 | |||
</summary> | |||
</member> | |||
<member name="F:DataV.Enums.CookEnum.Making"> | |||
<summary> | |||
制作中 | |||
</summary> | |||
</member> | |||
<member name="F:DataV.Enums.CookEnum.WaitTake"> | |||
<summary> | |||
等待取餐 | |||
</summary> | |||
</member> | |||
<member name="F:DataV.Enums.CookEnum.TakeCompleted"> | |||
取餐完成 | |||
</member> | |||
<member name="F:DataV.Enums.CookEnum.Normal"> | |||
<summary> | |||
正常订单 | |||
</summary> | |||
</member> | |||
<member name="F:DataV.Enums.CookEnum.Error"> | |||
<summary> | |||
异常订单数据不会放入redis | |||
</summary> | |||
</member> | |||
<member name="F:DataV.Enums.OrderTypeEnum.Normal"> | |||
<summary> | |||
正常 | |||
</summary> | |||
</member> | |||
<member name="F:DataV.Enums.OrderTypeEnum.RightNow"> | |||
<summary> | |||
立即吃面2 | |||
</summary> | |||
</member> | |||
<member name="F:DataV.Enums.OrderTypeEnum.Box"> | |||
<summary> | |||
盲盒 | |||
</summary> | |||
</member> | |||
<member name="F:DataV.Enums.OrderTypeEnum.Other"> | |||
<summary> | |||
其他 | |||
</summary> | |||
</member> | |||
<member name="F:DataV.Enums.PayEnum.NoPay"> | |||
<summary> | |||
未支付 | |||
</summary> | |||
</member> | |||
<member name="F:DataV.Enums.PayEnum.PayOk"> | |||
<summary> | |||
已支付 | |||
</summary> | |||
</member> | |||
<member name="F:DataV.Enums.PayEnum.PayCancel"> | |||
<summary> | |||
支付取消 | |||
</summary> | |||
</member> | |||
<member name="F:DataV.Enums.PayEnum.Refund"> | |||
<summary> | |||
已退单 | |||
</summary> | |||
</member> | |||
<member name="F:DataV.Enums.PayModelEnum.WeiXin"> | |||
<summary> | |||
微信 | |||
</summary> | |||
</member> | |||
<member name="F:DataV.Enums.PayModelEnum.AliPay"> | |||
<summary> | |||
支付宝 | |||
</summary> | |||
</member> | |||
<member name="F:DataV.Enums.PayModelEnum.Wallet"> | |||
<summary> | |||
钱包 | |||
</summary> | |||
</member> | |||
<member name="F:DataV.Enums.PayModelEnum.UnionPay"> | |||
<summary> | |||
银联 | |||
</summary> | |||
</member> | |||
<member name="F:DataV.Enums.PayModelEnum.Other"> | |||
<summary> | |||
其他 | |||
</summary> | |||
</member> | |||
<member name="P:DataV.Model.BPA_Order.SortId"> | |||
<summary> | |||
排序号 | |||
</summary> | |||
</member> | |||
<member name="P:DataV.Model.BPA_Order.CustomerId"> | |||
<summary> | |||
用户Id | |||
</summary> | |||
</member> | |||
<member name="P:DataV.Model.BPA_Order.OrderStatus"> | |||
<summary> | |||
支付状态<see cref="T:DataV.Enums.PayEnum"/> | |||
</summary> | |||
</member> | |||
<member name="P:DataV.Model.BPA_Order.AfterStatus"> | |||
<summary> | |||
售后状态<see cref="T:DataV.Enums.AfterEnum"/> | |||
</summary> | |||
</member> | |||
<member name="P:DataV.Model.BPA_Order.OrderCount"> | |||
<summary> | |||
数量 | |||
</summary> | |||
</member> | |||
<member name="P:DataV.Model.BPA_Order.OrderOriginalMoney"> | |||
<summary> | |||
商品总价 | |||
</summary> | |||
</member> | |||
<member name="P:DataV.Model.BPA_Order.DiscountMoney"> | |||
<summary> | |||
折扣价格 | |||
</summary> | |||
</member> | |||
<member name="P:DataV.Model.BPA_Order.OrderRealMoney"> | |||
<summary> | |||
实际支付价格 | |||
</summary> | |||
</member> | |||
<member name="P:DataV.Model.BPA_Order.PayMode"> | |||
<summary> | |||
支付方式<see cref="T:DataV.Enums.PayModelEnum"/> | |||
</summary> | |||
</member> | |||
<member name="P:DataV.Model.BPA_Order.OrderNumber"> | |||
<summary> | |||
订单号 | |||
</summary> | |||
</member> | |||
<member name="P:DataV.Model.BPA_Order.TradeNo"> | |||
<summary> | |||
订单号(第三方) | |||
</summary> | |||
</member> | |||
<member name="P:DataV.Model.BPA_Order.TransactionId"> | |||
<summary> | |||
流水号 | |||
</summary> | |||
</member> | |||
<member name="P:DataV.Model.BPA_Order.OrderType"> | |||
<summary> | |||
订单类型 <see cref="T:DataV.Enums.OrderTypeEnum"/> | |||
</summary> | |||
</member> | |||
<member name="P:DataV.Model.BPA_Order.TroikaId"> | |||
<summary> | |||
OpenId | |||
</summary> | |||
</member> | |||
<member name="P:DataV.Model.BPA_Order.OrderSourceFrom"> | |||
<summary> | |||
订单 | |||
</summary> | |||
</member> | |||
<member name="P:DataV.Model.BPA_StoreInfo.AutoKey"> | |||
<summary> | |||
与上位机映射ID | |||
</summary> | |||
</member> | |||
<member name="P:DataV.Model.BPA_StoreInfo.CheckStock"> | |||
<summary> | |||
校验库存 | |||
</summary> | |||
</member> | |||
<member name="P:DataV.Model.BPA_StoreInfo.Store_Name"> | |||
<summary> | |||
店铺名称 | |||
</summary> | |||
</member> | |||
<member name="P:DataV.Model.BPA_StoreInfo.Store_TypeId"> | |||
<summary> | |||
店铺类型 | |||
</summary> | |||
</member> | |||
<member name="P:DataV.Model.BPA_SubOrder.GooodOriginPrice"> | |||
<summary> | |||
原价 | |||
</summary> | |||
</member> | |||
<member name="P:DataV.Model.BPA_SubOrder.GoodsRealPrice"> | |||
<summary> | |||
实际金额 | |||
</summary> | |||
</member> | |||
<member name="P:DataV.Model.BPA_SubOrder.Remark"> | |||
<summary> | |||
备注 | |||
</summary> | |||
</member> | |||
<member name="P:DataV.Model.BPA_SubOrder.CookingStatus"> | |||
<summary> | |||
订单状态<see cref="T:DataV.Enums.CookEnum"/> | |||
</summary> | |||
</member> | |||
<member name="P:DataV.Model.BPA_SubOrder.IsVaild"> | |||
<summary> | |||
废弃状态 0 正常 1 废弃 | |||
</summary> | |||
</member> | |||
<member name="P:DataV.Model.BPA_SubOrder.VaildTime"> | |||
<summary> | |||
废弃时间 | |||
</summary> | |||
</member> | |||
<member name="P:DataV.Model.BPA_SubOrder.SortNumber"> | |||
<summary> | |||
订单序号 | |||
</summary> | |||
</member> | |||
<member name="M:DataV.Service.DataVService.GetAllOrderDataState(System.Nullable{System.Int32})"> | |||
<summary> | |||
大屏数据 | |||
</summary> | |||
<param name="autokey"></param> | |||
<returns></returns> | |||
</member> | |||
<member name="M:DataV.Service.DataVService.OnlineDevice"> | |||
<summary> | |||
设备 | |||
</summary> | |||
<returns></returns> | |||
</member> | |||
<member name="M:DataV.Service.DataVService.OrderLine(System.Nullable{System.Int32})"> | |||
<summary> | |||
折线图 | |||
</summary> | |||
<param name="autokey"></param> | |||
<returns></returns> | |||
</member> | |||
<member name="M:DataV.Service.DataVService.OrderNumber(System.Nullable{System.Int32})"> | |||
<summary> | |||
下单数量 | |||
</summary> | |||
<param name="autokey"></param> | |||
<returns></returns> | |||
</member> | |||
<member name="M:DataV.Service.DataVService.GetLocSale"> | |||
<summary> | |||
区域销售 | |||
</summary> | |||
<returns></returns> | |||
</member> | |||
</members> | |||
</doc> |
@@ -0,0 +1,27 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Linq; | |||
using System.Threading.Tasks; | |||
namespace DataV.Enums | |||
{ | |||
public enum AfterEnum | |||
{ | |||
/// <summary> | |||
/// 取消售后 | |||
/// </summary> | |||
Cancel, | |||
/// <summary> | |||
/// 申请售后 | |||
/// </summary> | |||
Apply, | |||
/// <summary> | |||
/// 等待处理 | |||
/// </summary> | |||
Wait, | |||
/// <summary> | |||
/// 处理完成 | |||
/// </summary> | |||
Ok | |||
} | |||
} |
@@ -0,0 +1,33 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Linq; | |||
using System.Threading.Tasks; | |||
namespace DataV.Enums | |||
{ | |||
public enum CookEnum | |||
{ | |||
/// <summary> | |||
/// 等待制作 | |||
/// </summary> | |||
WaitMake, | |||
/// <summary> | |||
/// 制作中 | |||
/// </summary> | |||
Making, | |||
/// <summary> | |||
/// 等待取餐 | |||
/// </summary> | |||
WaitTake, | |||
///取餐完成 | |||
TakeCompleted, | |||
/// <summary> | |||
/// 正常订单 | |||
/// </summary> | |||
Normal = 99998, | |||
/// <summary> | |||
/// 异常订单数据不会放入redis | |||
/// </summary> | |||
Error = 99999 | |||
} | |||
} |
@@ -0,0 +1,27 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Linq; | |||
using System.Threading.Tasks; | |||
namespace DataV.Enums | |||
{ | |||
public enum OrderTypeEnum | |||
{ | |||
/// <summary> | |||
/// 正常 | |||
/// </summary> | |||
Normal, | |||
/// <summary> | |||
/// 立即吃面2 | |||
/// </summary> | |||
RightNow, | |||
/// <summary> | |||
/// 盲盒 | |||
/// </summary> | |||
Box, | |||
/// <summary> | |||
/// 其他 | |||
/// </summary> | |||
Other | |||
} | |||
} |
@@ -0,0 +1,27 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Linq; | |||
using System.Threading.Tasks; | |||
namespace DataV.Enums | |||
{ | |||
public enum PayEnum | |||
{ | |||
/// <summary> | |||
/// 未支付 | |||
/// </summary> | |||
NoPay, | |||
/// <summary> | |||
/// 已支付 | |||
/// </summary> | |||
PayOk, | |||
/// <summary> | |||
/// 支付取消 | |||
/// </summary> | |||
PayCancel, | |||
/// <summary> | |||
/// 已退单 | |||
/// </summary> | |||
Refund | |||
} | |||
} |
@@ -0,0 +1,31 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Linq; | |||
using System.Threading.Tasks; | |||
namespace DataV.Enums | |||
{ | |||
public enum PayModelEnum | |||
{ | |||
/// <summary> | |||
/// 微信 | |||
/// </summary> | |||
WeiXin, | |||
/// <summary> | |||
/// 支付宝 | |||
/// </summary> | |||
AliPay, | |||
/// <summary> | |||
/// 钱包 | |||
/// </summary> | |||
Wallet, | |||
/// <summary> | |||
/// 银联 | |||
/// </summary> | |||
UnionPay, | |||
/// <summary> | |||
/// 其他 | |||
/// </summary> | |||
Other, | |||
} | |||
} |
@@ -0,0 +1,75 @@ | |||
using DataV.Enums; | |||
using SqlSugar; | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Linq; | |||
using System.Threading.Tasks; | |||
namespace DataV.Model | |||
{ | |||
[SugarTable("BPA_Order")] | |||
public class BPA_Order : BasicEntity | |||
{ | |||
/// <summary> | |||
/// 排序号 | |||
/// </summary> | |||
public string SortId { get; set; } | |||
/// <summary> | |||
/// 用户Id | |||
/// </summary> | |||
public string CustomerId { get; set; } | |||
/// <summary> | |||
/// 支付状态<see cref="PayEnum"/> | |||
/// </summary> | |||
public PayEnum OrderStatus { get; set; } | |||
/// <summary> | |||
/// 售后状态<see cref="AfterEnum"/> | |||
/// </summary> | |||
public AfterEnum AfterStatus { get; set; } | |||
/// <summary> | |||
/// 数量 | |||
/// </summary> | |||
public int OrderCount { get; set; } | |||
/// <summary> | |||
/// 商品总价 | |||
/// </summary> | |||
public decimal OrderOriginalMoney { get; set; } | |||
/// <summary> | |||
/// 折扣价格 | |||
/// </summary> | |||
public decimal DiscountMoney { get; set; } | |||
/// <summary> | |||
/// 实际支付价格 | |||
/// </summary> | |||
public decimal OrderRealMoney { get; set; } | |||
/// <summary> | |||
/// 支付方式<see cref="PayModelEnum"/> | |||
/// </summary> | |||
public PayModelEnum PayMode { get; set; } | |||
/// <summary> | |||
/// 订单号 | |||
/// </summary> | |||
public string OrderNumber { get; set; } | |||
/// <summary> | |||
/// 订单号(第三方) | |||
/// </summary> | |||
public string TradeNo { get; set; } | |||
/// <summary> | |||
/// 流水号 | |||
/// </summary> | |||
public string TransactionId { get; set; } | |||
/// <summary> | |||
/// 订单类型 <see cref="OrderTypeEnum"/> | |||
/// </summary> | |||
public OrderTypeEnum OrderType { get; set; } | |||
/// <summary> | |||
/// OpenId | |||
/// </summary> | |||
public string TroikaId { get; set; } | |||
/// <summary> | |||
/// 订单 | |||
/// </summary> | |||
public int OrderSourceFrom { get; set; } | |||
public string Remark { get; set; } | |||
} | |||
} |
@@ -0,0 +1,29 @@ | |||
using SqlSugar; | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Linq; | |||
using System.Threading.Tasks; | |||
namespace DataV.Model | |||
{ | |||
[SugarTable("BPA_StoreInfo")] | |||
public class BPA_StoreInfo : BasicEntityRead | |||
{ | |||
/// <summary> | |||
/// 与上位机映射ID | |||
/// </summary> | |||
public int AutoKey { get; set; } | |||
/// <summary> | |||
/// 校验库存 | |||
/// </summary> | |||
public bool CheckStock { get; set; } | |||
/// <summary> | |||
/// 店铺名称 | |||
/// </summary> | |||
public string Store_Name { get; set; } | |||
/// <summary> | |||
/// 店铺类型 | |||
/// </summary> | |||
public string Store_TypeId { get; set; } | |||
} | |||
} |
@@ -0,0 +1,48 @@ | |||
using DataV.Enums; | |||
using SqlSugar; | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Linq; | |||
using System.Threading.Tasks; | |||
namespace DataV.Model | |||
{ | |||
[SugarTable("BPA_SubOrder")] | |||
public class BPA_SubOrder : BasicEntity | |||
{ | |||
public string OrderId { get; set; } | |||
public string GoodId { get; set; } | |||
public string StoreId { get; set; } | |||
/// <summary> | |||
/// 原价 | |||
/// </summary> | |||
public decimal GooodOriginPrice { get; set; } | |||
/// <summary> | |||
/// 实际金额 | |||
/// </summary> | |||
public decimal GoodsRealPrice { get; set; } | |||
/// <summary> | |||
/// 备注 | |||
/// </summary> | |||
public string Remark { get; set; } | |||
/// <summary> | |||
/// 订单状态<see cref="CookEnum"/> | |||
/// </summary> | |||
public CookEnum CookingStatus { get; set; } | |||
/// <summary> | |||
/// 废弃状态 0 正常 1 废弃 | |||
/// </summary> | |||
public int IsVaild { get; set; } | |||
/// <summary> | |||
/// 废弃时间 | |||
/// </summary> | |||
public DateTime? VaildTime { get; set; } | |||
public DateTime? StartCookingTime { get; set; } | |||
public DateTime? EndCookingTime { get; set; } | |||
public DateTime? CompleteTakeTime { get; set; } | |||
/// <summary> | |||
/// 订单序号 | |||
/// </summary> | |||
public string SortNumber { get; set; } | |||
} | |||
} |
@@ -0,0 +1,15 @@ | |||
using SqlSugar; | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Linq; | |||
using System.Threading.Tasks; | |||
namespace DataV.Model | |||
{ | |||
public class BasicEntity | |||
{ | |||
[SugarColumn(IsPrimaryKey = true)] | |||
public string Id { get; set; } | |||
public DateTime? CreatedAt { get; set; } | |||
} | |||
} |
@@ -0,0 +1,22 @@ | |||
using SqlSugar; | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Linq; | |||
using System.Threading.Tasks; | |||
namespace DataV.Model | |||
{ | |||
public class BasicEntityRead | |||
{ | |||
[SugarColumn(IsPrimaryKey = true)] | |||
public string Id { get; set; } | |||
public string GroupId { get; set; } | |||
public DateTime? UpdateAt { get; set; } | |||
public string UpdateBy { get; set; } | |||
public string DeleteBy { get; set; } | |||
public DateTime? DeleteAt { get; set; } | |||
public int IsDeleted { get; set; } | |||
public DateTime? CreateAt { get; set; } | |||
public string CreateBy { get; set; } | |||
} | |||
} |
@@ -0,0 +1,27 @@ | |||
using BPA.ApolloClient; | |||
using BPA.ApolloClient.Options; | |||
using Microsoft.AspNetCore.Builder; | |||
using Microsoft.AspNetCore.Hosting; | |||
using Microsoft.Extensions.Configuration; | |||
using Microsoft.Extensions.Hosting; | |||
namespace DataV | |||
{ | |||
public class Program | |||
{ | |||
public static void Main(string[] args) | |||
{ | |||
WebApplicationBuilder builder = WebApplication.CreateBuilder(args); | |||
builder.Inject().WebHost.ConfigureAppConfiguration((context, build) => | |||
{ | |||
builder.Configuration.AddApolloConfiguration(opt => | |||
{ | |||
builder.Configuration.GetSection(nameof(ApolloOptions)).Bind(opt); | |||
}); | |||
}); | |||
var app = builder.Build(); | |||
app.Run(); | |||
} | |||
} | |||
} |
@@ -0,0 +1,28 @@ | |||
{ | |||
"iisSettings": { | |||
"windowsAuthentication": false, | |||
"anonymousAuthentication": true, | |||
"iisExpress": { | |||
"applicationUrl": "http://localhost:49839", | |||
"sslPort": 0 | |||
} | |||
}, | |||
"profiles": { | |||
"IIS Express": { | |||
"commandName": "IISExpress", | |||
"launchBrowser": true, | |||
"environmentVariables": { | |||
"ASPNETCORE_ENVIRONMENT": "Development" | |||
} | |||
}, | |||
"DataV": { | |||
"commandName": "Project", | |||
"dotnetRunMessages": "true", | |||
"launchBrowser": true, | |||
"applicationUrl": "http://localhost:5000", | |||
"environmentVariables": { | |||
"ASPNETCORE_ENVIRONMENT": "Development" | |||
} | |||
} | |||
} | |||
} |
@@ -0,0 +1,14 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Linq; | |||
using System.Threading.Tasks; | |||
namespace DataV | |||
{ | |||
public class Result<T> | |||
{ | |||
public bool IsSuccess { get; set; } | |||
public T Data { get; set; } | |||
public string Msg { get; set; } | |||
} | |||
} |
@@ -0,0 +1,259 @@ | |||
using DataV.Enums; | |||
using DataV.Model; | |||
using DataV.Service.Dto; | |||
using Furion.DependencyInjection; | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Linq; | |||
using System.Threading.Tasks; | |||
using System.Xml; | |||
using XExten.Advance.HttpFramework.MultiFactory; | |||
namespace DataV.Service | |||
{ | |||
public class DataVService : IDataVService, ITransient | |||
{ | |||
private SqlDbContext Db; | |||
public DataVService() | |||
{ | |||
Db = new SqlDbContext(); | |||
} | |||
/// <summary> | |||
/// 大屏数据 | |||
/// </summary> | |||
/// <param name="autokey"></param> | |||
/// <returns></returns> | |||
public Result<object> GetAllOrderDataState(int? autokey) | |||
{ | |||
var db = Db.DbContext(); | |||
List<string> OrderIds = new List<string>(); | |||
if (autokey != null) | |||
{ | |||
OrderIds = db.Queryable<BPA_StoreInfo>().LeftJoin<BPA_SubOrder>((t, x) => t.Id == x.StoreId) | |||
.Where(t => t.AutoKey == autokey.Value).Select((t, x) => x.OrderId).ToList(); | |||
} | |||
var data = db.Queryable<BPA_Order>().Where(t => t.AfterStatus == 0) | |||
.Where(t => t.OrderStatus == PayEnum.PayOk || t.PayMode == PayModelEnum.Other) | |||
.Where(t => !string.IsNullOrEmpty(t.TransactionId)) | |||
.Where(t => !string.IsNullOrEmpty(t.TradeNo)) | |||
.WhereIF(OrderIds.Count > 0, t => OrderIds.Contains(t.Id)) | |||
.Select(t => new { t.OrderRealMoney, t.CreatedAt }).ToList(); | |||
return new Result<object> | |||
{ | |||
Data = new | |||
{ | |||
Total = data.Sum(t => t.OrderRealMoney).ToString(), | |||
OrderCount = data.Count().ToString(), | |||
MoneyM = data.Where(t => t.CreatedAt.Value.Month == DateTime.Now.Month).Sum(t => t.OrderRealMoney).ToString(), | |||
MoneyD = data.Where(t => t.CreatedAt.Value >= DateTime.Parse(DateTime.Now.ToShortDateString()) && t.CreatedAt < DateTime.Parse(DateTime.Now.ToShortDateString()).AddDays(1)).Sum(t => t.OrderRealMoney).ToString(), | |||
}, | |||
IsSuccess = true, | |||
Msg = String.Empty | |||
}; | |||
} | |||
/// <summary> | |||
/// 设备 | |||
/// </summary> | |||
/// <returns></returns> | |||
public Result<Dictionary<string, List<int>>> OnlineDevice() | |||
{ | |||
string sql = $@"SELECT | |||
a.AutoKey, | |||
b.Name | |||
FROM | |||
BPA_StoreInfo AS a | |||
LEFT JOIN BPA_Company AS b ON a.GroupId= b.Id | |||
"; | |||
var data = Db.DbContext().SqlQueryable<DataVDto>(sql).ToList().GroupBy(t => t.Name).Select(t => new | |||
{ | |||
Key = t.Key, | |||
Value = t.Select(x => x.AutoKey).ToList() | |||
}).ToDictionary(t => t.Key, t => t.Value); | |||
return new Result<Dictionary<string, List<int>>> | |||
{ | |||
Data = data, | |||
IsSuccess = true, | |||
Msg = String.Empty | |||
}; | |||
} | |||
/// <summary> | |||
/// 折线图 | |||
/// </summary> | |||
/// <param name="autokey"></param> | |||
/// <returns></returns> | |||
public Result<object> OrderLine(int? autokey) | |||
{ | |||
var db = Db.DbContext(); | |||
List<string> OrderIds = new List<string>(); | |||
if (autokey != null) | |||
{ | |||
OrderIds = db.Queryable<BPA_StoreInfo>().LeftJoin<BPA_SubOrder>((t, x) => t.Id == x.StoreId) | |||
.Where(t => t.AutoKey == autokey.Value).Select((t, x) => x.OrderId).ToList(); | |||
} | |||
var data = db.Queryable<BPA_Order>() | |||
.Where(t => !string.IsNullOrEmpty(t.TransactionId)) | |||
.WhereIF(OrderIds.Count > 0, t => OrderIds.Contains(t.Id)) | |||
.Where(t => !string.IsNullOrEmpty(t.TradeNo)).Select(t => new | |||
{ | |||
t.OrderStatus, | |||
t.AfterStatus, | |||
t.CreatedAt, | |||
t.PayMode | |||
}).ToList(); | |||
List<object> res = new List<object>(); | |||
for (int index = 0; index < 10; index++) | |||
{ | |||
var temp = DateTime.Now.AddDays(-index); | |||
var end = DateTime.Parse(temp.ToString("yyyy-MM-dd 23:59:59")); | |||
var start = DateTime.Parse(temp.ToString("yyyy-MM-dd 00:00:00")); | |||
var NO = data.Where(t => t.CreatedAt.Value < end && t.CreatedAt.Value >= start).Where(t => t.AfterStatus != 0 && (t.OrderStatus == PayEnum.PayOk || t.PayMode == PayModelEnum.Other)).Count(); | |||
var OK = data.Where(t => t.CreatedAt.Value < end && t.CreatedAt.Value >= start).Where(t => t.AfterStatus == 0 && (t.OrderStatus == PayEnum.PayOk || t.PayMode == PayModelEnum.Other)).Count(); | |||
var Date = temp.ToString("MM/dd"); | |||
res.Add(new | |||
{ | |||
NO, | |||
OK, | |||
Date | |||
}); | |||
} | |||
return new Result<object> | |||
{ | |||
Data = res, | |||
IsSuccess = true, | |||
Msg = String.Empty, | |||
}; | |||
} | |||
/// <summary> | |||
/// 下单数量 | |||
/// </summary> | |||
/// <param name="autokey"></param> | |||
/// <returns></returns> | |||
public Result<object> OrderNumber(int? autokey) | |||
{ | |||
var db = Db.DbContext(); | |||
List<string> OrderIds = new List<string>(); | |||
if (autokey != null) | |||
{ | |||
OrderIds = db.Queryable<BPA_StoreInfo>().LeftJoin<BPA_SubOrder>((t, x) => t.Id == x.StoreId) | |||
.Where(t => t.AutoKey == autokey.Value).Select((t, x) => x.OrderId).ToList(); | |||
} | |||
var data = db.Queryable<BPA_Order>().Where(t => t.AfterStatus == 0) | |||
.Where(t => t.OrderStatus == PayEnum.PayOk || t.PayMode == PayModelEnum.Other) | |||
.Where(t => !string.IsNullOrEmpty(t.TransactionId)) | |||
.Where(t => !string.IsNullOrEmpty(t.TradeNo)) | |||
.WhereIF(OrderIds.Count > 0, t => OrderIds.Contains(t.Id)) | |||
.Select(t => t.CreatedAt).ToList(); | |||
return new Result<object> | |||
{ | |||
IsSuccess = true, | |||
Msg = String.Empty, | |||
Data = new | |||
{ | |||
Year = data.Where(t => t.Value.Year == DateTime.Now.Year).Count(), | |||
Month = data.Where(t => t.Value.Month == DateTime.Now.Month).Count(), | |||
Day = data.Where(t => t.Value.Day == DateTime.Now.Day).Count(), | |||
} | |||
}; | |||
} | |||
/// <summary> | |||
/// 区域销售 | |||
/// </summary> | |||
/// <returns></returns> | |||
public Result<object> GetLocSale() | |||
{ | |||
var db = Db.DbContext(); | |||
var baiduMap = "http://api.map.baidu.com/geocoder/v2/?ak=3ce7ddfda60046708248ea55e10b1435&callback=renderReverse&location={0}&output=xml"; | |||
List<LocDto> loc = new List<LocDto>(); | |||
var data = db.SqlQueryable<dynamic>(@"SELECT | |||
a.Store_Loc AS Loc, | |||
( | |||
SELECT COUNT | |||
( b.Id ) | |||
FROM | |||
BPA_Order AS b | |||
JOIN BPA_SubOrder AS c ON b.Id= c.OrderId | |||
WHERE | |||
c.StoreId= a.Id | |||
AND ( b.OrderStatus= 1 OR b.OrderStatus = 4 ) | |||
AND b.TradeNo IS NOT NULL | |||
AND b.TransactionId IS NOT NULL | |||
) AS Counts | |||
FROM | |||
BPA_StoreInfo AS a | |||
WHERE | |||
a.Store_Status = 0 | |||
AND a.IsDeleted = 0 | |||
AND a.Store_Loc LIKE '%,%'").ToList(); | |||
IHttpMultiClient http = null; | |||
data.ForEach(item => | |||
{ | |||
if (http == null) | |||
http = IHttpMultiClient.HttpMulti.AddNode(opt => | |||
{ | |||
opt.NodePath = String.Format(baiduMap, item.Loc); | |||
}); | |||
else | |||
http = http.AddNode(opt => | |||
{ | |||
opt.NodePath = String.Format(baiduMap, item.Loc); | |||
}); | |||
}); | |||
XmlDocument doc = new XmlDocument(); | |||
var Temps = http.Build().RunString(); | |||
for (int i = 0; i < Temps.Count; i++) | |||
{ | |||
doc.LoadXml(Temps[i]); | |||
loc.Add(new LocDto | |||
{ | |||
Count = data[i].Counts, | |||
City = doc.SelectSingleNode("//province")?.InnerText + doc.SelectSingleNode("//city")?.InnerText | |||
}); | |||
} | |||
return new Result<object> | |||
{ | |||
Data = new | |||
{ | |||
Data = loc.GroupBy(t => t.City).Select(t => new LocDto | |||
{ | |||
City = t.Key, | |||
Count = t.Sum(t => t.Count) | |||
}) | |||
}, | |||
IsSuccess = true, | |||
Msg = "" | |||
}; | |||
} | |||
} | |||
} |
@@ -0,0 +1,13 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Linq; | |||
using System.Threading.Tasks; | |||
namespace DataV.Service.Dto | |||
{ | |||
public class DataVDto | |||
{ | |||
public int AutoKey { get; set; } | |||
public string Name { get; set; } | |||
} | |||
} |
@@ -0,0 +1,8 @@ | |||
namespace DataV.Service.Dto | |||
{ | |||
public class LocDto | |||
{ | |||
public string City { get; set; } | |||
public int Count { get; set; } | |||
} | |||
} |
@@ -0,0 +1,22 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Linq; | |||
using System.Threading.Tasks; | |||
namespace DataV.Service | |||
{ | |||
public interface IDataVService | |||
{ | |||
Result<object> GetAllOrderDataState(int? autokey); | |||
Result<object> OrderLine(int? autokey); | |||
Result<object> OrderNumber(int? autokey); | |||
Result<Dictionary<string, List<int>>> OnlineDevice(); | |||
Result<object> GetLocSale(); | |||
} | |||
} |
@@ -0,0 +1,27 @@ | |||
using SqlSugar; | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Linq; | |||
using System.Threading.Tasks; | |||
namespace DataV | |||
{ | |||
public class SqlDbContext | |||
{ | |||
public SqlSugarScope DbContext() | |||
{ | |||
SqlSugarScope client = new SqlSugarScope(new ConnectionConfig | |||
{ | |||
ConnectionString = Furion.App.Configuration["DbConnectionstring"], | |||
DbType = DbType.SqlServer, | |||
InitKeyType = InitKeyType.Attribute, | |||
IsAutoCloseConnection = true | |||
}); | |||
client.Aop.OnLogExecuting = (sql, pars) => | |||
{ | |||
Console.WriteLine($"当前SQL语句:【{sql}】,参数:【{string.Join(",", pars.Select(t => t.Value))}】"); | |||
}; | |||
return client; | |||
} | |||
} | |||
} |
@@ -0,0 +1,48 @@ | |||
using Furion; | |||
using Microsoft.AspNetCore.Builder; | |||
using Microsoft.AspNetCore.Hosting; | |||
using Microsoft.Extensions.Configuration; | |||
using Microsoft.Extensions.DependencyInjection; | |||
using Microsoft.Extensions.Hosting; | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Linq; | |||
using System.Threading.Tasks; | |||
namespace DataV | |||
{ | |||
public class Startup: AppStartup | |||
{ | |||
// This method gets called by the runtime. Use this method to add services to the container. | |||
public void ConfigureServices(IServiceCollection services) | |||
{ | |||
services.AddControllers().AddInjectWithUnifyResult(); | |||
services.AddCorsAccessor(); | |||
services.AddRemoteRequest(); | |||
} | |||
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. | |||
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) | |||
{ | |||
app.UseStaticFiles(); | |||
app.UseRouting(); | |||
app.UseCorsAccessor(); | |||
app.UseAuthentication(); | |||
app.UseAuthorization(); | |||
app.UseInject(string.Empty); | |||
app.UseEndpoints(endpoints => | |||
{ | |||
endpoints.MapControllers(); | |||
}); | |||
} | |||
} | |||
} |
@@ -0,0 +1,17 @@ | |||
{ | |||
"Logging": { | |||
"LogLevel": { | |||
"Default": "Information", | |||
"Microsoft": "Warning", | |||
"Microsoft.Hosting.Lifetime": "Information" | |||
} | |||
}, | |||
"AllowedHosts": "*", | |||
"ApolloOptions": { | |||
"MetaServer": "http://10.2.1.21:28080", //Meta server地址不用修改 | |||
"Namespaces": [ | |||
"data_v" | |||
], | |||
"AppId": "dev1_data_v" //根据自己创建应用修改 | |||
} | |||
} |
@@ -0,0 +1,32 @@ | |||
#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/aspnet:5.0 AS base | |||
RUN sed -i 's/DEFAULT@SECLEVEL=2/DEFAULT@SECLEVEL=1/g' /etc/ssl/openssl.cnf | |||
RUN sed -i 's/MinProtocol = TLSv1.2/MinProtocol = TLSv1/g' /etc/ssl/openssl.cnf | |||
RUN sed -i 's/DEFAULT@SECLEVEL=2/DEFAULT@SECLEVEL=1/g' /usr/lib/ssl/openssl.cnf | |||
RUN sed -i 's/MinProtocol = TLSv1.2/MinProtocol = TLSv1/g' /usr/lib/ssl/openssl.cnf | |||
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime | |||
RUN echo Asia/Shanghai > /etc/timezone | |||
RUN cat /etc/localtime | |||
ENV TZ=Asia/Shanghai | |||
WORKDIR /app | |||
EXPOSE 9000 | |||
FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build | |||
WORKDIR /src | |||
COPY . . | |||
WORKDIR "/src/DataV" | |||
RUN dotnet build "DataV.csproj" -c Release -o /app/build | |||
FROM build AS publish | |||
RUN dotnet publish "DataV.csproj" -c Release -o /app/publish | |||
FROM base AS final | |||
WORKDIR /app | |||
COPY --from=publish /app/publish . | |||
ENV ASPNETCORE_URLS http://+:9000 | |||
ENTRYPOINT ["dotnet", "DataV.dll"] |
@@ -0,0 +1,7 @@ | |||
<?xml version="1.0" encoding="utf-8"?> | |||
<configuration> | |||
<packageSources> | |||
<add key="nuget.org" value="https://api.nuget.org/v3/index.json"/> | |||
<add key="bpa" value="http://10.2.1.25:10243/repository/bpa/index.json"/> | |||
</packageSources> | |||
</configuration> |