From dfa59fc3bcbcf34974f2e26ffe7e6cff7a2597d2 Mon Sep 17 00:00:00 2001 From: 18942506660 <18942506660@A18942506660> Date: Wed, 16 Oct 2024 11:03:45 +0800 Subject: [PATCH] =?UTF-8?q?=E6=88=90=E5=93=81=E5=8D=B3=E6=97=B6=E5=BA=93?= =?UTF-8?q?=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vs/WMS.Web/DesignTimeBuild/.dtbcache.v2 | Bin 275060 -> 275060 bytes .../Controllers/ProductInventoryController.cs | 101 ++++++++++ src/WMS.Web.Api/wwwroot/WMS.Web.Api.xml | 26 +++ src/WMS.Web.Api/wwwroot/WMS.Web.Core.xml | 172 +++++++++++++++++ src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml | 114 +++++++++++ .../ProductInventoryQueryRequest.cs | 25 +++ .../ProductInventoryQueryResponse.cs | 69 +++++++ .../SingleData/UcStockHeadOfficeResponse.cs | 26 +++ .../Results/ResultPagedNumber2List.cs | 114 +++++++++++ .../Entitys/ProductInventory.cs | 64 +++++++ .../Infrastructure/IBasicsRepositories.cs | 5 + .../IProductInventoryRepositories.cs | 40 ++++ .../Values/FileDownLoadOrderType.cs | 6 + .../Values/ProductInventoryType.cs | 29 +++ .../Values/Single/SysConfigAction.cs | 4 + .../BasicsRepositories.cs | 17 +- .../Configuration/RepositoryDbContext.cs | 8 + .../AppBuilderExtensions.cs | 2 +- .../ProductInventoryRepositories.cs | 177 ++++++++++++++++++ 19 files changed, 996 insertions(+), 3 deletions(-) create mode 100644 src/WMS.Web.Api/Controllers/ProductInventoryController.cs create mode 100644 src/WMS.Web.Core/Dto/ProductInventory/ProductInventoryQueryRequest.cs create mode 100644 src/WMS.Web.Core/Dto/ProductInventory/ProductInventoryQueryResponse.cs create mode 100644 src/WMS.Web.Core/Dto/SingleData/UcStockHeadOfficeResponse.cs create mode 100644 src/WMS.Web.Core/Internal/Results/ResultPagedNumber2List.cs create mode 100644 src/WMS.Web.Domain/Entitys/ProductInventory.cs create mode 100644 src/WMS.Web.Domain/Infrastructure/IProductInventoryRepositories.cs create mode 100644 src/WMS.Web.Domain/Values/ProductInventoryType.cs create mode 100644 src/WMS.Web.Repositories/ProductInventoryRepositories.cs diff --git a/.vs/WMS.Web/DesignTimeBuild/.dtbcache.v2 b/.vs/WMS.Web/DesignTimeBuild/.dtbcache.v2 index 3bcbb831a194ccecd7e19b51633b0fa6016a1f5e..5f18e85ff270641873548dec40f0b21d92454059 100644 GIT binary patch delta 3809 zcmai$d303O9mnUro4nscRz(8{m_oJKL#3ISgfMNjK}6Y-Ko$bXVkVQY1_*0dWCDmF z5CQ@7NPw_|1OZX;$-cUvNK0GmX=&;4fYL%e&adM+@<;XbduM)Osy%JzobTMvZ@Js= z&7J$cy3y{d8|{ow)){-1>GLjbI?`m=L!M46^9G9j=|OKW)9VWc10{igH&hlV@%z$> z(@H~LUvZ#M@1Q^AOHWTPEAjdQfy~mf-s!=TkiU=LpO)@1y*^LCxia7MFYlRcxIMGY z1FCqpQ5^7L*gkG`zUhD1d7{#M(li2YxYGQ*!0&4A%`7FU|7&gjeLePi2s;va?PW!vMagB(cvH=?bF8pO8=?Ph2T z)Cg^bwn5vW9nel_7qlDN19kE^+b)|a8M^4Ve9ss#Pu+GDaXY=FZKnrZIQPZ?K_ZO(z}pej_&gw zq{n(6x(Mn1Cu~pHa}w|Y^dWQ)2GE`VTgOX?Nk@-`+>c=Ei7rEWl3zhO-c=UzYw#=3 z6=)yS1nq}@1L=MT?QpzU|Fcj?d>c9neSa6n;A>ux-bfovtRJX;z?-1|`!G8qsrhN@ zGV5|Bq5ZAf`HDHm|AXJb)}JqOJf4VWX~bYw5yk&dkz|glJ1OqrB=t#7xT@-7No>si zPT~*?iP_ejlt}wpV=ez(>F+K0{%1SRu?9u);ap2M(TEx4p;nZKS)3=4{6wSxkwS}y zOQa|f8DT}8wgqa`Q#;k&amFKig2fXhduH<8$RtE2TRcS~A1C^hBQn+bv_N$UPm}2M z#4Htv&ailHW+@Y`(<{B(^s(+d@R1w|LQiju*CiM7hf1 z#S&VQm})6HylEo+D6sEx7o_#9?+vuJ0pwlg|>hj zp{>w1Xgjn6+6nEl+@p0xMKKsPT>H;DI7?5I!0RHWgl!STd<1t$<65}ZhUKyVWA5y8pC*9E5#e;UJZD=sJgOx#n6r%8dP6W{D<(aSO9$Jb450z+|WI zE_Hu+qfAgw+#tA#xTSR3Onk547UK4Tjl>TKZY6FlxQ)22;CA8;f;)%@%g%P<_z3PI z?i@?N4`Mg*8QIz%94g7!OPnf0yh7Yna366u!6xD#3hu}05`2~TT^Z~EPNfWX5QkFm z5OKcXYs7_N;lsp5g0JHt%V=*9zbQpILj0DXi++;uHt|vM9wR<3c!GG040e+Elz2}Q zua|CTh|k8o1Na>AdC9ndU#MifgMEniJsf7ii#W`J9}-^@{0L{6oTvAwtX?6R_K(D6 zf>((r2>uC2MEYDKo|Nn~?op{7Z;0zN;?D(d691Ll+j~?S(@EQ>dKm+par=~i$Ur;( z4l>Brw?*t7WUw9OAvR}ABqtHcMP#VW!z7ZIh~y(u;9T3MriBab94@qZxQ%aI9z`~f zuz94-qmTmsvo?>md5nzSQ(+7xz^dlpC|9(6IAkcAoRl4Rzd{WVLTI-RfKF zF{@J@;Wa^5a-#-asRj)V9`6YbueJx^ zg+>>lT2r;AHJa8qN55A7v>IDK$oM-&9>rcJ*4nXVUA(D{H|yig2B*s%^|0GvkV;kV Kvai*bKl>M;=cIT5 delta 4648 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 pI4f?{2W$oUn + /// 成品仓即时库存 + /// + [Route("api/[controller]")] + [ApiController] + public class ProductInventoryController : ControllerBase + { + private readonly ILoginService _loginService; + private readonly IBasicsRepositories _basicsRepositories; + private readonly IProductInventoryRepositories _repositories; + private readonly QiniuOptions _option; + private readonly IExportExcelService _exportExcelService; + public ProductInventoryController(ILoginService loginService, IBasicsRepositories basicsRepositories, + IProductInventoryRepositories repositories, IOptions option, IExportExcelService exportExcelServic) { + _loginService = loginService; + _basicsRepositories = basicsRepositories; + _repositories = repositories; + _option = option?.Value; + _exportExcelService = exportExcelServic; + } + + /// + /// 获取仓库 + /// + /// 仓库模糊匹配 不必填 + /// + [HttpGet] + [Route("GetUcStock")] + public async Task> GetUcStock([FromQuery] string name) + { + var loginInfo = _loginService.GetLoginInfo(this.HttpContext.Request.Headers["Authorization"]); + if (loginInfo == null || loginInfo.UserInfo == null) + return ResultList.ReFailure(ResultCodes.Token_Invalid_Error); + var r = await _basicsRepositories.GetUcStockByHeadOfficeAsync(name, loginInfo.UserInfo.CompanyId); + return ResultList.ReSuccess(r); + } + + /// + /// 列表 + /// + /// + /// + [HttpPost] + [Route("GetList")] + public async Task> GetPagedList([FromBody] ProductInventoryQueryRequest dto) + { + var loginInfo = _loginService.GetLoginInfo(this.HttpContext.Request.Headers["Authorization"]); + if (loginInfo == null || loginInfo.UserInfo == null) + return ResultPagedNumber2List.ReFailure(ResultCodes.Token_Invalid_Error); + + var (list, count, details) = await _repositories.GetListAsync(dto); + var result = ResultPagedNumber2List.ReSuccess(list,count,details); + return result; + } + /// + /// 导出 + /// + /// + /// + [HttpPost] + [Route("Export")] + public Task> Export([FromBody] OutStockQueryRequest dto) + { + var loginInfo = _loginService.GetLoginInfo(this.HttpContext.Request.Headers["Authorization"]); + if (loginInfo == null) + return Task.FromResult(Result.ReFailure(ResultCodes.Token_Invalid_Error)); + string fileName = FileDownLoadOrderType.ProductInventory.GetRemark() + loginInfo.UserInfo.CompanyId + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xlsx"; + string res = _option.Url + fileName; + + Task.Run(async () => + { + await _exportExcelService.ExportList(dto, fileName, loginInfo.UserInfo.StaffId, loginInfo.UserInfo.CompanyId, FileDownLoadOrderType.OutStock); + }); + + return Task.FromResult(Result.ReSuccess(res)); + } + } +} diff --git a/src/WMS.Web.Api/wwwroot/WMS.Web.Api.xml b/src/WMS.Web.Api/wwwroot/WMS.Web.Api.xml index 3dc39c57..4a712d9a 100644 --- a/src/WMS.Web.Api/wwwroot/WMS.Web.Api.xml +++ b/src/WMS.Web.Api/wwwroot/WMS.Web.Api.xml @@ -560,6 +560,32 @@ + + + 成品仓即时库存 + + + + + 获取仓库 + + 仓库模糊匹配 不必填 + + + + + 列表 + + + + + + + 导出 + + + + 获取序列号信息 diff --git a/src/WMS.Web.Api/wwwroot/WMS.Web.Core.xml b/src/WMS.Web.Api/wwwroot/WMS.Web.Core.xml index f000040e..c53adb3b 100644 --- a/src/WMS.Web.Api/wwwroot/WMS.Web.Core.xml +++ b/src/WMS.Web.Api/wwwroot/WMS.Web.Core.xml @@ -5534,6 +5534,86 @@ 每页条数 不传默认每页10 条 + + + 成品即时库存列表 + + + + + 物料编码 + + + + + 仓库编码 + + + + + 客户/店铺 + + + + + 成品即时库存 + + + + + 单据Id + + + + + 单据类型 + + + + + 物料编码 + + + + + 物料规格型号 + + + + + 物料名称 + + + + + 仓库 + + + + + 组织 + + + + + 客户/店铺 + + + + + 批号 + + + + + 可用量 + + + + + 库存量 + + 客户编码 @@ -5824,6 +5904,26 @@ 仓库名称 + + + 根据总公司查仓库 + + + + + 领星仓库编码 + + + + + 聚水潭仓库编码 + + + + + 用途 + + 仓库响应 @@ -6817,6 +6917,78 @@ + + + 实体分页集合结果 + + + + + 实体分页集合结果 + + 实体集合 + 总条数 + + + + 实体分页集合结果 + + + + + + + + Total count of Items. + + + + + 总数量 + + + + + 创建成功的返回消息 + + 实体集合 + 总条数 + + + + + 创建成功的返回消息 + + + + + + 创建返回信息(返回处理失败) + + 结果消息 + 结果状态 + + + + + 创建返回信息(返回处理失败) + + 结果消息 + + + + + 创建返回信息(返回处理失败) + + 结果 + + + + + 转换为 task + + + 分页列表结果对象 diff --git a/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml b/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml index 18545ba5..43b9bb7b 100644 --- a/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml +++ b/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml @@ -2075,6 +2075,56 @@ 已出库数量 + + + 成品仓即时库存 + + + + + 主键 订单编号 + + + + + 物料编码 + + + + + 单据类型 + + + + + 组织编码 + + + + + 仓库 + + + + + 客户/店铺 + + + + + 批号 + + + + + 可用量 + + + + + 库存量 + + 短信和邮箱发送日志表 @@ -2676,6 +2726,12 @@ + + + 获取仓库总公司 + + + 获取事务 用来处理即时库存 @@ -3364,6 +3420,34 @@ 删除实体集合 + + + 成品仓即时库存 + + + + + 添加 + + + + + + + + 删除 + + + + + + + 列表-分页 + + + + + 批量添加 @@ -6918,6 +7002,11 @@ 出库信息 + + + 成品即时库存 + + 入库状态 @@ -7163,6 +7252,26 @@ 组装拆卸出库 + + + 成品即时库存类型 + + + + + 金蝶 + + + + + 领星 + + + + + 聚水潭 + + 错误提示信息 @@ -7713,6 +7822,11 @@ 获取仓位详情:根据仓位Codes集合和公司ID + + + 获取仓库::根据总公司标记获取仓库 + + 同步金蝶状态 diff --git a/src/WMS.Web.Core/Dto/ProductInventory/ProductInventoryQueryRequest.cs b/src/WMS.Web.Core/Dto/ProductInventory/ProductInventoryQueryRequest.cs new file mode 100644 index 00000000..51a4edcd --- /dev/null +++ b/src/WMS.Web.Core/Dto/ProductInventory/ProductInventoryQueryRequest.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace WMS.Web.Core.Dto.ProductInventory +{ + /// + /// 成品即时库存列表 + /// + public class ProductInventoryQueryRequest : PaginationBaseRequestDto + { + /// + /// 物料编码 + /// + public string MaterialNumber { get; set; } + /// + /// 仓库编码 + /// + public string StockCode { get; set; } + /// + /// 客户/店铺 + /// + public string Customer { get; set; } + } +} diff --git a/src/WMS.Web.Core/Dto/ProductInventory/ProductInventoryQueryResponse.cs b/src/WMS.Web.Core/Dto/ProductInventory/ProductInventoryQueryResponse.cs new file mode 100644 index 00000000..ae55748d --- /dev/null +++ b/src/WMS.Web.Core/Dto/ProductInventory/ProductInventoryQueryResponse.cs @@ -0,0 +1,69 @@ +using Npoi.Mapper.Attributes; +using System; +using System.Collections.Generic; +using System.Text; + +namespace WMS.Web.Core.Dto.ProductInventory +{ + /// + /// 成品即时库存 + /// + public class ProductInventoryQueryResponse + { + /// + /// 单据Id + /// + [Ignore] + public int Id { get; set; } + /// + /// 单据类型 + /// + [Ignore] + public string Type { get; set; } + /// + /// 物料编码 + /// + [Column("物料编码")] + public string MaterialNumber { get; set; } + /// + /// 物料规格型号 + /// + [Column("规格型号")] + public string Specifications { get; set; } + /// + /// 物料名称 + /// + [Column("物料名称")] + public string MaterialName { get; set; } + /// + /// 仓库 + /// + [Column("仓库")] + public string Stock { get; set; } + /// + /// 组织 + /// + [Column("组织")] + public string Org { get; set; } + /// + /// 客户/店铺 + /// + [Column("客户/店铺")] + public string Customer { get; set; } + /// + /// 批号 + /// + [Column("批号")] + public string Batch { get; set; } + /// + /// 可用量 + /// + [Column("可用量")] + public decimal Qty { get; set; } = 0; + /// + /// 库存量 + /// + [Column("库存量")] + public decimal BeforeQty { get; set; } = 0; + } +} diff --git a/src/WMS.Web.Core/Dto/SingleData/UcStockHeadOfficeResponse.cs b/src/WMS.Web.Core/Dto/SingleData/UcStockHeadOfficeResponse.cs new file mode 100644 index 00000000..b36d5e5a --- /dev/null +++ b/src/WMS.Web.Core/Dto/SingleData/UcStockHeadOfficeResponse.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; +using System.Text; + +namespace WMS.Web.Core.Dto.SingleData +{ + /// + /// 根据总公司查仓库 + /// + public class UcStockHeadOfficeResponse: UcStockResponse + { + /// + /// 领星仓库编码 + /// + public string WarehouseCodeOfLingxing { get; set; } + /// + /// 聚水潭仓库编码 + /// + public string WarehouseCodeOfJushuitan { get; set; } + /// + /// 用途 + /// + public int? WarehouseUseTo { get; set; } + } +} diff --git a/src/WMS.Web.Core/Internal/Results/ResultPagedNumber2List.cs b/src/WMS.Web.Core/Internal/Results/ResultPagedNumber2List.cs new file mode 100644 index 00000000..589557d5 --- /dev/null +++ b/src/WMS.Web.Core/Internal/Results/ResultPagedNumber2List.cs @@ -0,0 +1,114 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; + +namespace WMS.Web.Core.Internal.Results +{ + public class ResultPagedNumber2List : ResultList + { + /// + /// 实体分页集合结果 + /// + public ResultPagedNumber2List() + { + } + + /// + /// 实体分页集合结果 + /// + /// 实体集合 + /// 总条数 + public ResultPagedNumber2List(IList data, int totalCount, List details) : base(data) + { + TotalCount = totalCount; + Details = details; + } + + /// + /// 实体分页集合结果 + /// + /// + /// + /// + public ResultPagedNumber2List(IList data, int totalCount, ValueTuple result) : base(data, result) + { + TotalCount = totalCount; + } + + /// + /// Total count of Items. + /// + public int TotalCount { get; set; } + /// + /// 总数量 + /// + public List Details { get; set; } + + /// + /// 创建成功的返回消息 + /// + /// 实体集合 + /// 总条数 + /// + public static ResultPagedNumber2List ReSuccess(IList data, int totalCount, List details) + { + return new ResultPagedNumber2List(data, totalCount, details); + } + + /// + /// 创建成功的返回消息 + /// + /// + public new static ResultPagedNumber2List ReSuccess() + { + return new ResultPagedNumber2List(new List(), 0, new List()); + } + + /// + /// 创建返回信息(返回处理失败) + /// + /// 结果消息 + /// 结果状态 + /// + public new static ResultPagedNumber2List ReFailure(string message, int status) + { + var result = new ResultPagedNumber2List(); + result.To(message, status); + return result; + } + + /// + /// 创建返回信息(返回处理失败) + /// + /// 结果消息 + /// + public new static ResultPagedNumber2List ReFailure(ValueTuple result) + { + var res = new ResultPagedNumber2List(); + res.To(result); + return res; + } + + /// + /// 创建返回信息(返回处理失败) + /// + /// 结果 + /// + public new static ResultPagedNumber2List ReFailure(Result result) + { + var re = new ResultPagedNumber2List(); + re.To(result); + return re; + } + + /// + /// 转换为 task + /// + /// + public new Task> AsTask() + { + return Task.FromResult(this); + } + } +} diff --git a/src/WMS.Web.Domain/Entitys/ProductInventory.cs b/src/WMS.Web.Domain/Entitys/ProductInventory.cs new file mode 100644 index 00000000..c5e98db4 --- /dev/null +++ b/src/WMS.Web.Domain/Entitys/ProductInventory.cs @@ -0,0 +1,64 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; +using System.Text; +using WMS.Web.Core; +using WMS.Web.Domain.Values; + +namespace WMS.Web.Domain.Entitys +{ + /// + /// 成品仓即时库存 + /// + [Serializable] + [Table("t_wms_product_inventory")] + public class ProductInventory : EntityBase + { + public ProductInventory() { } + /// + /// 主键 订单编号 + /// + [Column("Id")] + public override int Id { get; set; } + /// + /// 物料编码 + /// + [Column("MaterialNumber")] + public string MaterialNumber { get; set; } + /// + /// 单据类型 + /// + [Column("Type")] + public ProductInventoryType Type { get; set; } = ProductInventoryType.JinDie; + /// + /// 组织编码 + /// + [Column("OrgCode")] + public string OrgCode { get; set; } + /// + /// 仓库 + /// + [Column("StockCode")] + public string StockCode { get; set; } + /// + /// 客户/店铺 + /// + [Column("Customer")] + public string Customer { get; set; } + /// + /// 批号 + /// + [Column("Batch")] + public string Batch { get; set; } + /// + /// 可用量 + /// + [Column("Qty")] + public decimal Qty { get; set; } = 0; + /// + /// 库存量 + /// + [Column("BeforeQty")] + public decimal BeforeQty { get; set; } = 0; + } +} diff --git a/src/WMS.Web.Domain/Infrastructure/IBasicsRepositories.cs b/src/WMS.Web.Domain/Infrastructure/IBasicsRepositories.cs index 070d45f1..d4ee6000 100644 --- a/src/WMS.Web.Domain/Infrastructure/IBasicsRepositories.cs +++ b/src/WMS.Web.Domain/Infrastructure/IBasicsRepositories.cs @@ -71,6 +71,11 @@ namespace WMS.Web.Domain.Infrastructure /// /// Task> GetUcStockAsync(string systemCode,string name, int companyId); + /// + /// 获取仓库总公司 + /// + /// + Task> GetUcStockByHeadOfficeAsync(string name, int companyId); /// /// 获取事务 用来处理即时库存 diff --git a/src/WMS.Web.Domain/Infrastructure/IProductInventoryRepositories.cs b/src/WMS.Web.Domain/Infrastructure/IProductInventoryRepositories.cs new file mode 100644 index 00000000..99021660 --- /dev/null +++ b/src/WMS.Web.Domain/Infrastructure/IProductInventoryRepositories.cs @@ -0,0 +1,40 @@ +using AutoMapper; +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; +using WMS.Web.Core.Dto.Inventory; +using WMS.Web.Core.Dto.ProductInventory; +using WMS.Web.Domain.Entitys; +using WMS.Web.Domain.IService.Public; +using WMS.Web.Domain.Values; + +namespace WMS.Web.Domain.Infrastructure +{ + /// + /// 成品仓即时库存 + /// + public interface IProductInventoryRepositories + { + /// + /// 添加 + /// + /// + /// + /// + Task AddRange(List entitys, bool isTransaction = true); + /// + /// 删除 + /// + /// + /// + Task Delete(ProductInventoryType type, bool isTransaction = true); + /// + /// 列表-分页 + /// + /// + /// + /// + Task<(List list, int total, List details)> GetListAsync(ProductInventoryQueryRequest dto, int companyId = 0); + } +} diff --git a/src/WMS.Web.Domain/Values/FileDownLoadOrderType.cs b/src/WMS.Web.Domain/Values/FileDownLoadOrderType.cs index 33b56314..cfb78d15 100644 --- a/src/WMS.Web.Domain/Values/FileDownLoadOrderType.cs +++ b/src/WMS.Web.Domain/Values/FileDownLoadOrderType.cs @@ -70,5 +70,11 @@ namespace WMS.Web.Domain.Values /// [EnumRemark("出库信息")] OutStockTaskInfo = 12, + /// + /// 成品即时库存 + /// + [EnumRemark("成品即时库存")] + ProductInventory = 13, + } } diff --git a/src/WMS.Web.Domain/Values/ProductInventoryType.cs b/src/WMS.Web.Domain/Values/ProductInventoryType.cs new file mode 100644 index 00000000..6a355305 --- /dev/null +++ b/src/WMS.Web.Domain/Values/ProductInventoryType.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Text; +using WMS.Web.Core; + +namespace WMS.Web.Domain.Values +{ + /// + /// 成品即时库存类型 + /// + public enum ProductInventoryType + { + /// + /// 金蝶 + /// + [EnumRemark("金蝶")] + JinDie = 0, + /// + /// 领星 + /// + [EnumRemark("领星")] + LingXing = 1, + /// + /// 聚水潭 + /// + [EnumRemark("聚水潭")] + JushuiTan = 2, + } +} diff --git a/src/WMS.Web.Domain/Values/Single/SysConfigAction.cs b/src/WMS.Web.Domain/Values/Single/SysConfigAction.cs index c68861fd..04a0d128 100644 --- a/src/WMS.Web.Domain/Values/Single/SysConfigAction.cs +++ b/src/WMS.Web.Domain/Values/Single/SysConfigAction.cs @@ -211,5 +211,9 @@ namespace WMS.Web.Domain.Values.Single /// 获取仓位详情:根据仓位Codes集合和公司ID /// GetWmsSubWarehouseByCodesAndCompany = 48, + /// + /// 获取仓库::根据总公司标记获取仓库 + /// + GetWmsWarehouseByHeadOfficeAndNameAndCompany = 49, } } diff --git a/src/WMS.Web.Repositories/BasicsRepositories.cs b/src/WMS.Web.Repositories/BasicsRepositories.cs index 80212a37..6e645372 100644 --- a/src/WMS.Web.Repositories/BasicsRepositories.cs +++ b/src/WMS.Web.Repositories/BasicsRepositories.cs @@ -168,7 +168,20 @@ namespace WMS.Web.Repositories } return true; } - - + /// + /// 根据总公司获取仓位 + /// + /// + /// + /// + public async Task> GetUcStockByHeadOfficeAsync(string name, int companyId) + { + var result = await _singleDataService.GetSysConfigData, SystemCodeRequest> + (new SystemCodeRequest("", name, companyId), + SysConfigAction.GetWmsWarehouseByHeadOfficeAndNameAndCompany); + if (!result.Success) + return null; + return result.Data.ToList(); + } } } diff --git a/src/WMS.Web.Repositories/Configuration/RepositoryDbContext.cs b/src/WMS.Web.Repositories/Configuration/RepositoryDbContext.cs index bfdfd3f1..5ffd3a6c 100644 --- a/src/WMS.Web.Repositories/Configuration/RepositoryDbContext.cs +++ b/src/WMS.Web.Repositories/Configuration/RepositoryDbContext.cs @@ -414,8 +414,16 @@ namespace WMS.Web.Repositories.Configuration .SetValueComparer(valueComparer); ; }); + //成品即时库存 + builder.Entity(ent => + { + ent.ToTable("t_wms_product_inventory"); + ent.HasKey(x => x.Id); + }); + base.OnModelCreating(builder); } + public DbSet ProductInventory { get; set; } public DbSet Materials { get; set; } public DbSet BoxMarkBillNo { get; set; } public DbSet BoxMark { get; set; } diff --git a/src/WMS.Web.Repositories/DependencyInjection/AppBuilderExtensions.cs b/src/WMS.Web.Repositories/DependencyInjection/AppBuilderExtensions.cs index 00475c06..f9cfa174 100644 --- a/src/WMS.Web.Repositories/DependencyInjection/AppBuilderExtensions.cs +++ b/src/WMS.Web.Repositories/DependencyInjection/AppBuilderExtensions.cs @@ -81,7 +81,7 @@ namespace Microsoft.Extensions.DependencyInjection services.AddTransient(); services.AddTransient(); - + services.AddTransient(); } } } diff --git a/src/WMS.Web.Repositories/ProductInventoryRepositories.cs b/src/WMS.Web.Repositories/ProductInventoryRepositories.cs new file mode 100644 index 00000000..f97e08ec --- /dev/null +++ b/src/WMS.Web.Repositories/ProductInventoryRepositories.cs @@ -0,0 +1,177 @@ +using AutoMapper; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Storage; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using WMS.Web.Core.Dto.Erp.Customer; +using WMS.Web.Core.Dto.Erp.Org; +using WMS.Web.Core.Dto.Erp; +using WMS.Web.Core.Dto.ProductInventory; +using WMS.Web.Domain.Entitys; +using WMS.Web.Domain.Infrastructure; +using WMS.Web.Domain.IService.Public; +using WMS.Web.Domain.Values; +using WMS.Web.Repositories.Configuration; +using WMS.Web.Core.Dto.OutStockTask; +using WMS.Web.Domain.Values.Single; +using WMS.Web.Core; +using NPOI.SS.Formula.Functions; + +namespace WMS.Web.Repositories +{ + /// + /// 成品仓即时库存 + /// + public class ProductInventoryRepositories : IAllFielRepositories, IProductInventoryRepositories + { + private readonly IMapper _mapper; + private readonly IServiceProvider _serviceProvider; + private readonly ILoginRepositories _loginRepositories; + private readonly IBasicsRepositories _basicsRepositories; + private readonly RepositoryDbContext _context; + private readonly IErpService _erpService; + private readonly ISingleDataService _singleDataService; + private readonly IErpBasicDataExtendService _erpBasicDataExtendService; + + public ProductInventoryRepositories(RepositoryDbContext context, + IMapper mapper, + IErpService erpService, + IBasicsRepositories basicsRepositories, + ILoginRepositories loginRepositories, + IServiceProvider serviceProvider, + ISingleDataService singleDataService, + IErpBasicDataExtendService erpBasicDataExtendService) + { + _erpService = erpService; + _context = context; + _mapper = mapper; + _basicsRepositories = basicsRepositories; + _serviceProvider = serviceProvider; + _loginRepositories = loginRepositories; + _singleDataService = singleDataService; + _erpBasicDataExtendService = erpBasicDataExtendService; + } + + public async Task AddRange(List entitys, bool isTransaction = true) + { + IDbContextTransaction _transaction = null; + if (isTransaction) + _transaction = _context.Database.BeginTransaction(); + try + { + if (entitys != null && entitys.Count != 0) + { + await _context.ProductInventory.AddRangeAsync(entitys); + await _context.SaveChangesAsync(); + } + if (_transaction != null) + _transaction.Commit(); + return true; + } + catch + { + if (_transaction != null) + _transaction.Rollback(); + return false; + } + } + + public async Task Delete(ProductInventoryType type, bool isTransaction = true) + { + IDbContextTransaction _transaction = null; + if (isTransaction) + _transaction = _context.Database.BeginTransaction(); + try + { + var list = await _context.ProductInventory.Where(w => w.Type == type).ToListAsync(); + _context.RemoveRange(list); + + if (_transaction != null) + _transaction.Commit(); + return true; + } + catch + { + if (_transaction != null) + _transaction.Rollback(); + return false; + } + } + + public async Task<(List list, int total, List details)> GetListAsync(ProductInventoryQueryRequest dto, int companyId = 0) + { + if (companyId == 0) + companyId = _loginRepositories.CompanyId; + #region erp基础资料 + List mNumber = new List(); + var materials_result = await _erpService.BillQueryForMaterial(); + List materials = new List(); + if (materials_result.IsSuccess) + materials = materials_result.Data.ToList(); + //物料集合;模糊查询后的物料集合 + if (!string.IsNullOrEmpty(dto.MaterialNumber)) + { + if (materials != null) + mNumber = materials.Where(w => w.MaterialNumber.Contains(dto.MaterialNumber) + || w.MaterialName.Contains(dto.MaterialNumber) + || w.Specifications.Contains(dto.MaterialNumber) + ).Select(s => s.MaterialNumber).ToList(); + } + + //取组织 + var org_result = await _erpService.BillQueryForOrg(); + List orgs = new List(); + if (org_result.IsSuccess) + orgs = org_result.Data.ToList(); + + + #endregion + + var query = _context.ProductInventory + .OrderByDescending(o => o.Id) + .Where(adv => 1 == 1); + + if (!string.IsNullOrEmpty(dto.MaterialNumber)) + query = query.Where(w => mNumber.Contains(w.MaterialNumber)); + if (!string.IsNullOrEmpty(dto.Customer)) + query = query.Where(w => dto.Customer.Contains(w.MaterialNumber)); + if (!string.IsNullOrEmpty(dto.StockCode)) + query = query.Where(w => dto.StockCode.Contains(w.StockCode)); + + //组装 + int total = await query.CountAsync(); + decimal qty = await query.SumAsync(s => s.Qty); + decimal beforeQty = await query.SumAsync(s => s.BeforeQty); + List details = new List(); + details.Add(qty); + details.Add(beforeQty); + var list = await query.Select(s => new ProductInventoryQueryResponse() + { + #region dto组装 + Id = s.Id, + Type = s.Type.GetRemark(), + Stock = _singleDataService.GetSingleData(SingleAction.StocksJoinOrgCode, companyId, s.StockCode + s.OrgCode), + Org = _erpBasicDataExtendService.GetOrgName(orgs, s.OrgCode), + MaterialName = _erpBasicDataExtendService.GetMaterialName(materials, s.MaterialNumber), + MaterialNumber = s.MaterialNumber, + Specifications = _erpBasicDataExtendService.GetMaterialSpecifications(materials, s.MaterialNumber), + Batch = s.Batch, + Customer = s.Customer, + Qty = s.Qty, + BeforeQty = s.BeforeQty + #endregion + + }).Skip((dto.PageNo - 1) * dto.PageSize).Take(dto.PageSize).ToListAsync(); + return (list, total, details); + } + + public async Task<(object obj, int total)> GetListField(ProductInventoryQueryRequest dto, int companyId) + { + var (list, count, qty) = await GetListAsync(dto, companyId); + return (list, count); + } + } +}