Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
T
TakeStock
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
pengjinyang
TakeStock
Commits
da0e5782
Commit
da0e5782
authored
Jun 23, 2021
by
zhoujinhui
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
新增盘点导出功能接口
parent
6b05f68d
Show whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
405 additions
and
2 deletions
+405
-2
Common.csproj
Common/Common.csproj
+1
-0
EPPlusUtils.cs
Common/Helper/EPPlusUtils.cs
+172
-0
IRepository.cs
Domain/IRepository.cs
+9
-1
ITakeStockService.cs
IService/TakeStock/ITakeStockService.cs
+8
-0
TakeStockService.cs
Service/TakeStock/TakeStockService.cs
+11
-0
TakeStockController.cs
TakeStock.API/Controllers/TakeStockController.cs
+14
-0
ExportTakeStockOutputDto.cs
...ock.Application/TakeStock/Dto/ExportTakeStockOutputDto.cs
+100
-0
SearchScheduleInputDto.cs
...Stock.Application/TakeStock/Dto/SearchScheduleInputDto.cs
+5
-0
TakeStockAppService.cs
TakeStock.Application/TakeStock/TakeStockAppService.cs
+73
-1
Repository.cs
TakeStock.SqlSugar/Repository.cs
+12
-0
No files found.
Common/Common.csproj
View file @
da0e5782
...
@@ -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" />
...
...
Common/Helper/EPPlusUtils.cs
0 → 100644
View file @
da0e5782
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
;
}
}
}
Domain/IRepository.cs
View file @
da0e5782
...
@@ -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
();
}
}
}
}
IService/TakeStock/ITakeStockService.cs
View file @
da0e5782
...
@@ -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
();
}
}
}
}
Service/TakeStock/TakeStockService.cs
View file @
da0e5782
...
@@ -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
);
}
}
}
}
}
TakeStock.API/Controllers/TakeStockController.cs
View file @
da0e5782
...
@@ -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
)
{
{
...
...
TakeStock.Application/TakeStock/Dto/ExportTakeStockOutputDto.cs
0 → 100644
View file @
da0e5782
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
;
}
}
TakeStock.Application/TakeStock/Dto/SearchScheduleInputDto.cs
View file @
da0e5782
...
@@ -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
;
}
}
}
}
}
TakeStock.Application/TakeStock/TakeStockAppService.cs
View file @
da0e5782
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
;
...
...
TakeStock.SqlSugar/Repository.cs
View file @
da0e5782
...
@@ -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
;
}
}
}
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment