Commit da0e5782 by zhoujinhui

新增盘点导出功能接口

parent 6b05f68d
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="EPPlus.Core.Extensions" Version="2.4.0" />
<PackageReference Include="Microsoft.Extensions.Configuration" Version="2.2.0" /> <PackageReference Include="Microsoft.Extensions.Configuration" Version="2.2.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="2.2.0" /> <PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="2.2.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="2.2.0" /> <PackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="2.2.0" />
......
using EPPlus.Core.Extensions;
using OfficeOpenXml;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
namespace Common.Helper
{
public class EPPlusUtils
{
public static ICollection<T> Import<T>(string fileName) where T : class, new()
{
FileInfo file = new FileInfo(fileName);
try
{
using (ExcelPackage package = new ExcelPackage(file))
{
return package.GetWorksheet(0).ToList<T>();
}
}
catch (Exception ex)
{
return null;
}
}
public static ICollection<T> Import<T>(Stream stream) where T : class, new()
{
try
{
using (ExcelPackage package = new ExcelPackage(stream))
{
//return package.GetWorksheet(0).ToList<T>();
var top = package.GetWorksheet(0).ToList<T>();
return top;
}
}
catch (Exception ex)
{
throw ex;
}
}
public static MemoryStream ExportStream(IEnumerable<object> data)
{
MemoryStream ms = new MemoryStream();
using (ExcelPackage package = new ExcelPackage())
{
ExcelWorksheet sheet = package.Workbook.Worksheets.Add("sheet1");
var properties = data?.First().GetType().GetProperties();
for (int c = 0; c < properties.Count(); c++)
{
int r = 0;
foreach (var item in data)
{
var prop = properties[c];
if (r == 0)
sheet.Cells[1, c + 1].Value = prop.Name;
sheet.Cells[r + 2, c + 1].Value = item.GetType().GetProperty(prop.Name).GetValue(item, null);
r++;
}
}
package.SaveAs(ms);
ms.Seek(0, SeekOrigin.Begin);
}
return ms;
}
public static MemoryStream ExportStream<T>(IEnumerable<T> data)
{
MemoryStream ms = new MemoryStream();
using (ExcelPackage package = new ExcelPackage())
{
ExcelWorksheet sheet = package.Workbook.Worksheets.Add("sheet1");
var properties = data?.First().GetType().GetProperties();
for (int c = 0; c < properties.Count(); c++)
{
int r = 0;
foreach (var item in data)
{
var prop = properties[c];
if (r == 0)
sheet.Cells[1, c + 1].Value = prop.Name;
sheet.Cells[r + 2, c + 1].Value = item.GetType().GetProperty(prop.Name).GetValue(item, null);
r++;
}
}
package.SaveAs(ms);
ms.Seek(0, SeekOrigin.Begin);
}
return ms;
}
public static MemoryStream ExportStream(IEnumerable<object> data, Dictionary<string, string> titles, List<ExeclFilterColumnModel> execlFilters = null)
{
MemoryStream ms = new MemoryStream();
using (ExcelPackage package = new ExcelPackage())
{
ExcelWorksheet sheet = package.Workbook.Worksheets.Add("sheet1");
var properties = data.First().GetType().GetProperties();
for (int c = 0; c < properties.Count(); c++)
{
int r = 0;
foreach (var item in data)
{
var prop = properties[c];
if (r == 0)
sheet.Cells[1, c + 1].Value = titles.SingleOrDefault(t => t.Key.Equals(prop.Name)).Value;
sheet.Cells[r + 2, c + 1].Value = item.GetType().GetProperty(prop.Name).GetValue(item, null);
r++;
}
//sheet.Column(c+1).AutoFit();
}
// 将需要的列导出,不需要的列移除
if (execlFilters != null && execlFilters.Count > 0)
{
string[] remArr = execlFilters.Where(t => t.Check == false).Select(t => t.Column).ToArray();
foreach (var item in remArr)
{
sheet.DeleteColumns(item);
}
}
package.SaveAs(ms);
ms.Seek(0, SeekOrigin.Begin);
}
return ms;
}
/// <summary>
/// 保存到磁盘
/// </summary>
/// <param name="bytes">字节数组</param>
/// <param name="saveFullPath">全路径</param>
/// <returns></returns>
public static bool SaveToDisk(byte[] bytes, string saveFullPath)
{
var fullPath = Path.GetDirectoryName(saveFullPath);
//如果没有此文件夹,则新建
if (!Directory.Exists(fullPath))
{
Directory.CreateDirectory(fullPath);
}
//创建文件,返回一个 FileStream,它提供对 path 中指定的文件的读/写访问。
using (FileStream stream = File.Create(saveFullPath))
{
//将字节数组写入流
stream.Write(bytes, 0, bytes.Length);
stream.Close();
}
return true;
}
}
public class ExeclFilterColumnModel
{
public string Column { get; set; }
public bool Check { get; set; }
}
}
...@@ -5,7 +5,7 @@ using System.Threading.Tasks; ...@@ -5,7 +5,7 @@ using System.Threading.Tasks;
namespace Domain namespace Domain
{ {
public interface IRepository<TEntity> where TEntity: class public interface IRepository<TEntity> where TEntity : class
{ {
//// ////
...@@ -428,5 +428,13 @@ namespace Domain ...@@ -428,5 +428,13 @@ namespace Domain
Task<int> UpdateAsync(TEntity entity, params string[] columns); Task<int> UpdateAsync(TEntity entity, params string[] columns);
List<TEntity> PageList<TEntity>(int pageIndex, int pageSize, System.Linq.Expressions.Expression<Func<TEntity, bool>> predicate, out int totalCount, string orderBy = "Id desc"); List<TEntity> PageList<TEntity>(int pageIndex, int pageSize, System.Linq.Expressions.Expression<Func<TEntity, bool>> predicate, out int totalCount, string orderBy = "Id desc");
/// <summary>
/// sql查询
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sql"></param>
/// <returns></returns>
List<T> SqlQuery<T>(string sql, object parameters = null) where T : class, new();
} }
} }
...@@ -94,5 +94,13 @@ namespace IService.TakeStock ...@@ -94,5 +94,13 @@ namespace IService.TakeStock
/// <param name="scheduleIds"></param> /// <param name="scheduleIds"></param>
/// <returns></returns> /// <returns></returns>
Task<ReturnPlanDto> CancelTakeStockSchedule(CancelTakeStockScheduleInPutDto input); Task<ReturnPlanDto> CancelTakeStockSchedule(CancelTakeStockScheduleInPutDto input);
/// <summary>
/// 导出数据
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sql"></param>
/// <returns></returns>
List<T> ExportTakeStockData<T>(string sql, object parameters = null) where T : class, new();
} }
} }
...@@ -940,5 +940,16 @@ namespace Service.TakeStock ...@@ -940,5 +940,16 @@ namespace Service.TakeStock
} }
return result; return result;
} }
/// <summary>
/// 导出数据
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sql"></param>
/// <returns></returns>
public List<T> ExportTakeStockData<T>(string sql, object parameters = null) where T : class, new()
{
return _orderRepository.SqlQuery<T>(sql, parameters);
}
} }
} }
...@@ -109,6 +109,20 @@ namespace TakeStock.API.Controllers ...@@ -109,6 +109,20 @@ namespace TakeStock.API.Controllers
return await takeStockAppService.SearchScheduleByPage(input); return await takeStockAppService.SearchScheduleByPage(input);
} }
/// <summary>
/// 导出盘点数据
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("ExportTakeStockData")]
public FileStreamResult ExportTakeStockData(SearchScheduleByPageInputDto input)
{
var ms = takeStockAppService.ExportTakeStockData(input);
FileStreamResult fileStreamResult = new FileStreamResult(ms, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
fileStreamResult.FileDownloadName = "盘点数据导出.xlsx";
return fileStreamResult;
}
[HttpPost("GetOrderByPage")] [HttpPost("GetOrderByPage")]
public async Task<SearchOrderByPageOutputDto> GetOrderByPage([FromBody] SearchOrderByPageInputDto input) public async Task<SearchOrderByPageOutputDto> GetOrderByPage([FromBody] SearchOrderByPageInputDto input)
{ {
......
using Domain.TakeStock;
using System;
using Common.Extensions;
using static Domain.TakeStock.TakeStockEnum;
namespace TakeStock.Application.TakeStock.Dto
{
/// <summary>
/// 导出盘点数据
/// </summary>
public class ExportTakeStockOutputDto
{
/// <summary>
/// sku
/// </summary>
public string Sku { get; set; }
/// <summary>
/// 盘点前数量
/// </summary>
public int BeforeQuantity { get; set; }
/// <summary>
/// 盘点后数量
/// </summary>
public int AfterQuantity { get; set; }
/// <summary>
/// 计划单号
/// </summary>
public string Code { get; set; }
/// <summary>
/// 审核人姓名
/// </summary>
public string AuditUserName { get; set; }
/// <summary>
/// 审核时间
/// </summary>
public string AuditDateTime { get; set; }
/// <summary>
/// 审核说明
/// </summary>
public string AuditExplain { get; set; }
/// <summary>
/// 仓库名称
/// </summary>
public string WarehouseName { get; set; }
/// <summary>
/// 盘点说明
/// </summary>
public string Description { get; set; }
/// <summary>
/// 盘点类型
/// </summary>
public int TakeStockType { get; set; }
public string TakeStockTypeStr => ((TakeStockType)TakeStockType).GetEnumDes();
/// <summary>
/// 盘点计划时间
/// </summary>
public string CreationTime { get; set; }
/// <summary>
/// 附件下载地址
/// </summary>
public string CredentialsImgUrl { get; set; }
/// <summary>
/// 盘点状态
/// </summary>
public int State { get; set; }
public string StateStr => ((TSScheduleState)State).GetEnumDes();
/// <summary>
/// 盘点人姓名
/// </summary>
public string CreatorUserName { get; set; }
/// <summary>
/// 流水单号
/// </summary>
public string SysSerialNumber { get; set; }
/// <summary>
/// 盘亏类型
/// </summary>
public int? InventoryLossType { get; set; }
public string InventoryLossTypeStr => InventoryLossType.HasValue ? ((InventoryLossType)InventoryLossType).GetEnumDes() : string.Empty;
}
}
...@@ -26,5 +26,10 @@ namespace TakeStock.Application.TakeStock.Dto ...@@ -26,5 +26,10 @@ namespace TakeStock.Application.TakeStock.Dto
public bool? IsAutomation { get; set; } public bool? IsAutomation { get; set; }
public string Skus { get; set; } public string Skus { get; set; }
/// <summary>
/// 盘点时间
/// </summary>
public string[] CreDateTime { get; set; }
} }
} }
using AutoMapper; using AutoMapper;
using Common.Extensions; using Common.Extensions;
using Common.Helper;
using Domain.Dto; using Domain.Dto;
using Domain.TakeStock; using Domain.TakeStock;
using IService.TakeStock; using IService.TakeStock;
...@@ -7,6 +8,7 @@ using Newtonsoft.Json; ...@@ -7,6 +8,7 @@ using Newtonsoft.Json;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO;
using System.Linq; using System.Linq;
using System.Linq.Expressions; using System.Linq.Expressions;
using System.Threading.Tasks; using System.Threading.Tasks;
...@@ -36,7 +38,7 @@ namespace TakeStock.Application.TakeStock ...@@ -36,7 +38,7 @@ namespace TakeStock.Application.TakeStock
{ {
orders.ForEach(x => x.AfterQuantity = null); orders.ForEach(x => x.AfterQuantity = null);
} }
else if(orders.Count(x => !x.AfterQuantity.HasValue)>0) else if (orders.Count(x => !x.AfterQuantity.HasValue) > 0)
{ {
return new ReturnPlanDto { Message = "手动盘点sku的实际数量不能为空!" }; return new ReturnPlanDto { Message = "手动盘点sku的实际数量不能为空!" };
} }
...@@ -145,6 +147,76 @@ namespace TakeStock.Application.TakeStock ...@@ -145,6 +147,76 @@ namespace TakeStock.Application.TakeStock
}; };
} }
/// <summary>
/// 导出盘点数据
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public MemoryStream ExportTakeStockData(SearchScheduleByPageInputDto input)
{
var dataList = QueryExportTakeStockData(input.Search);
var titles = new Dictionary<string, string>()
{
{ "Sku","Sku" },
{ "BeforeQuantity","盘点前数量" },
{ "AfterQuantity","盘点后数量" },
{ "Code","计划单号" },
{ "StateStr","盘点状态" },
{ "TakeStockTypeStr","盘点类型" },
{ "InventoryLossTypeStr","盘亏类型" },
{ "CredentialsImgUrl","附件" },
{ "AuditUserName","审核人" },
{ "AuditDateTime","审核时间" },
{ "AuditExplain","审核说明" },
{ "WarehouseName","仓库名称" },
{ "SysSerialNumber","交易流水号" },
{ "Description","盘点说明" },
{ "CreatorUserName","盘点人" },
{ "CreationTime","盘点时间" }
};
var list = dataList.Select(x => new {
x.Sku,x.BeforeQuantity,x.AfterQuantity,x.Code,x.StateStr,x.TakeStockTypeStr,x.InventoryLossTypeStr,
x.AuditUserName,x.AuditDateTime,x.AuditExplain,x.WarehouseName,x.SysSerialNumber,x.Description,
x.CreatorUserName,x.CreationTime,x.CredentialsImgUrl
}).ToList();
var ms = EPPlusUtils.ExportStream(list, titles);
return ms;
}
/// <summary>
/// 查询
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
private List<ExportTakeStockOutputDto> QueryExportTakeStockData(SearchScheduleInputDto input)
{
System.Text.StringBuilder sqlStr = new System.Text.StringBuilder();
sqlStr.Append(@"
SELECT t1.Sku,t1.AfterQuantity,t1.BeforeQuantity,t2.`Code`,t2.AuditUserName,
t2.AuditDateTime,t2.AuditExplain,t3.`Name` AS WarehouseName,t2.Description,t2.TakeStockType,
t2.CreationTime,t2.CredentialsImgUrl,t2.State,t2.CreatorUserName,t2.SysSerialNumber,t2.InventoryLossType
FROM stock_takestockorder AS t1
INNER JOIN stock_takestockschedule AS t2 ON t2.Id = t1.ScheduleId
LEFT JOIN warehouse_warehouse AS t3 ON t3.`Code` = t2.WarehouseCode
WHERE t1.IsDeleted =0 AND t2.IsDeleted =0 ");
if (!string.IsNullOrWhiteSpace(input.Code))
{
sqlStr.Append(" AND t2.`Code` = @Code");
}
if (!string.IsNullOrWhiteSpace(input.WarehouseCode))
{
sqlStr.Append(" AND t2.`WarehouseCode` = @WarehouseCode");
}
if (input.CreDateTime != null && !string.IsNullOrWhiteSpace(input.CreDateTime[0]))
{
sqlStr.Append(" AND DATE(t2.CreationTime)>=@StartTime AND DATE(t2.CreationTime)<=@EndTime ");
}
sqlStr.Append(" ORDER BY t2.CreationTime DESC ");
var dataList = takeStockService.ExportTakeStockData<ExportTakeStockOutputDto>(sqlStr.ToString(), new { Code = input.Code, WarehouseCode = input.WarehouseCode, StartTime = input.CreDateTime[0], EndTime = input.CreDateTime[1] });
return dataList;
}
private Expression<Func<TakeStockOrder, bool>> OrderQuery(SearchOrderInputDto search) private Expression<Func<TakeStockOrder, bool>> OrderQuery(SearchOrderInputDto search)
{ {
Expression<Func<TakeStockOrder, bool>> expr = s => s.ScheduleId == search.ScheduleId; Expression<Func<TakeStockOrder, bool>> expr = s => s.ScheduleId == search.ScheduleId;
......
...@@ -252,5 +252,17 @@ namespace TakeStock.SqlSugar ...@@ -252,5 +252,17 @@ namespace TakeStock.SqlSugar
return page; return page;
} }
/// <summary>
/// sql查询
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sql"></param>
/// <returns></returns>
public List<T> SqlQuery<T>(string sql, object parameters = null) where T : class, new()
{
var list = client.Ado.SqlQuery<T>(sql, parameters);
return list;
}
} }
} }
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