diff --git a/src/WMS.Web.Api/Controllers/InStockController.cs b/src/WMS.Web.Api/Controllers/InStockController.cs index e29572ef..d2cad974 100644 --- a/src/WMS.Web.Api/Controllers/InStockController.cs +++ b/src/WMS.Web.Api/Controllers/InStockController.cs @@ -5,8 +5,10 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using WMS.Web.Core.Dto; +using WMS.Web.Core.Dto.InStock; using WMS.Web.Core.Internal.Results; using WMS.Web.Domain.Infrastructure; +using WMS.Web.Domain.IService; using WMS.Web.Domain.IService.Public; using WMS.Web.Domain.Values; @@ -20,10 +22,12 @@ namespace WMS.Web.Api.Controllers public class InStockController : ControllerBase { private readonly ILoginService _loginService; + private readonly IInStockService _inStockService; private readonly IInStockRepositories _inStockRepositories; - public InStockController(ILoginService loginService, IInStockRepositories inStockRepositories) + public InStockController(ILoginService loginService, IInStockRepositories inStockRepositories, IInStockService inStockService) { this._loginService = loginService; + this._inStockService = inStockService; this._inStockRepositories = inStockRepositories; } @@ -42,5 +46,37 @@ namespace WMS.Web.Api.Controllers var result= await _inStockRepositories.GetPagedList(dto); return result; } + + /// + /// 保存 + /// + /// + /// + [HttpPost] + [Route("Save")] + public async Task Save(List dto) + { + var loginInfo = _loginService.GetLoginInfo(this.HttpContext.Request.Headers["Authorization"]); + if (loginInfo == null || loginInfo.UserInfo == null) + return Result.ReFailure(ResultCodes.Token_Invalid_Error); + + return await _inStockService.Save(dto, loginInfo); + } + + /// + /// 同步金蝶 + /// + /// + /// + [HttpPost] + [Route("Sync")] + public async Task Sync(OperateRequest dto) + { + var loginInfo = _loginService.GetLoginInfo(this.HttpContext.Request.Headers["Authorization"]); + if (loginInfo == null || loginInfo.UserInfo == null) + return Result.ReFailure(ResultCodes.Token_Invalid_Error); + + return await _inStockService.Sync(dto); + } } } diff --git a/src/WMS.Web.Api/Controllers/SysConfigController.cs b/src/WMS.Web.Api/Controllers/SysConfigController.cs index 48c80262..5fd87e7d 100644 --- a/src/WMS.Web.Api/Controllers/SysConfigController.cs +++ b/src/WMS.Web.Api/Controllers/SysConfigController.cs @@ -43,6 +43,10 @@ namespace WMS.Web.Api.Controllers { response.TakeStockType.Add(enumv.ToString(), enumv.GetRemark()); } + foreach (InstockType enumv in Enum.GetValues(typeof(InstockType))) + { + response.InstockType.Add(enumv.ToString(), enumv.GetRemark()); + } //2 //1 return Task.FromResult(Result.ReSuccess(response)); diff --git a/src/WMS.Web.Api/wwwroot/WMS.Web.Api.xml b/src/WMS.Web.Api/wwwroot/WMS.Web.Api.xml index aaec77b2..17126da2 100644 --- a/src/WMS.Web.Api/wwwroot/WMS.Web.Api.xml +++ b/src/WMS.Web.Api/wwwroot/WMS.Web.Api.xml @@ -35,6 +35,20 @@ + + + 保存 + + + + + + + 同步金蝶 + + + + 入库任务单-接口 diff --git a/src/WMS.Web.Api/wwwroot/WMS.Web.Core.xml b/src/WMS.Web.Api/wwwroot/WMS.Web.Core.xml index e73963dc..ea66dc7e 100644 --- a/src/WMS.Web.Api/wwwroot/WMS.Web.Core.xml +++ b/src/WMS.Web.Api/wwwroot/WMS.Web.Core.xml @@ -475,6 +475,51 @@ 同步成功或者失败 + + + 保存入库单-请求对象 + + + + + 入库类型 + + + + + 来源单号 + + + + + 供应商 + + + + + 组织 + + + + + 物料Id + + + + + 仓库ID + + + + + 仓位ID + + + + + 入库数量 + + 授权token -- 给前端用的验证token @@ -980,6 +1025,11 @@ 单据Id + + + 明细Id + + 单据编号 @@ -1070,6 +1120,11 @@ 出库单任务 + + + 刷新 明细Id + + 单据类型(出库单下拉列表) diff --git a/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml b/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml index ebd1347f..b7d0800d 100644 --- a/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml +++ b/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml @@ -300,6 +300,17 @@ 明细 + + + 创建 + + + + + + 生成单据号 + + wms入库单明细 @@ -964,6 +975,14 @@ + + + 添加 + + + + + 入库任务-仓储接口 @@ -1045,6 +1064,26 @@ 改箱 移箱服务 + + + 入库单服务接口 + + + + + 保存 + + + + + + + + 同步金蝶 + + + + 出库服务 @@ -1538,6 +1577,26 @@ + + + 入库单服务 + + + + + 出库单 + + + + + + + + 同步金蝶 + + + + 出库服务 diff --git a/src/WMS.Web.Core/Dto/EnumStatusResponse.cs b/src/WMS.Web.Core/Dto/EnumStatusResponse.cs index 0a0711f6..d5e4b112 100644 --- a/src/WMS.Web.Core/Dto/EnumStatusResponse.cs +++ b/src/WMS.Web.Core/Dto/EnumStatusResponse.cs @@ -22,6 +22,12 @@ namespace WMS.Web.Core.Dto /// 盘点结果类型 /// public Dictionary TakeStockType { get; set; } = new Dictionary(); + /// + /// 入库单类型 + /// + public Dictionary InstockType { get; set; } = new Dictionary(); + + } } diff --git a/src/WMS.Web.Core/Dto/InStock/SaveInStockRequest.cs b/src/WMS.Web.Core/Dto/InStock/SaveInStockRequest.cs new file mode 100644 index 00000000..35c15bc2 --- /dev/null +++ b/src/WMS.Web.Core/Dto/InStock/SaveInStockRequest.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Text; + +namespace WMS.Web.Core.Dto.InStock +{ + /// + /// 保存入库单-请求对象 + /// + public class SaveInStockRequest + { + + /// + /// 入库类型 + /// + [Required(ErrorMessage = "入库类型不能为空")] + public int Type { get; set; } + + /// + /// 来源单号 + /// + [Required(ErrorMessage = "来源单号不能为空")] + public string SourceBillNo { get; set; } + + /// + /// 供应商 + /// + [Required(ErrorMessage = "供应商不能为空")] + public int SupplierId { get; set; } + /// + /// 组织 + /// + [Required(ErrorMessage = "组织不能为空")] + public int OrgId { get; set; } + + /// + /// 物料Id + /// + [Required(ErrorMessage = "物料不能为空")] + public int MaterialId { get; set; } + + /// + /// 仓库ID + /// + [Required(ErrorMessage = "仓库不能为空")] + public int StockId { get; set; } + /// + /// 仓位ID + /// + [Required(ErrorMessage = " 仓位不能为空")] + public int SubStockId { get; set; } + + /// + /// 入库数量 + /// + [Required(ErrorMessage = "入库数量不能为空")] + public decimal Qty { get; set; } + } +} diff --git a/src/WMS.Web.Domain/Entitys/InStock.cs b/src/WMS.Web.Domain/Entitys/InStock.cs index 6ad4c909..a9ec4518 100644 --- a/src/WMS.Web.Domain/Entitys/InStock.cs +++ b/src/WMS.Web.Domain/Entitys/InStock.cs @@ -43,5 +43,38 @@ namespace WMS.Web.Domain.Entitys /// [NotMapped] public List Details = new List(); + + /// + /// 创建 + /// + /// + public void Create(int creatorId) + { + this.CreatorId = creatorId; + this.CreateTime = DateTime.Now; + } + + /// + /// 生成单据号 + /// + public void GenerateNo() + { + //用户手动输入了 就不自动生成了 + if (!string.IsNullOrEmpty(this.BillNo)) return; + + if (this.Id.ToString().Length >= 8) + { + this.BillNo = "RK" + this.Id.ToString(); + return; + } + + string idStr = this.Id.ToString(); + while (true) + { + idStr = "0" + idStr; + if (idStr.Length >= 8) break; + } + this.BillNo = "RK" + idStr; + } } } diff --git a/src/WMS.Web.Domain/IService/IInStockService.cs b/src/WMS.Web.Domain/IService/IInStockService.cs new file mode 100644 index 00000000..5f7d1caf --- /dev/null +++ b/src/WMS.Web.Domain/IService/IInStockService.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; +using WMS.Web.Core.Dto; +using WMS.Web.Core.Dto.InStock; +using WMS.Web.Core.Dto.Login; +using WMS.Web.Core.Internal.Results; + +namespace WMS.Web.Domain.IService +{ + /// + /// 入库单服务接口 + /// + public interface IInStockService + { + /// + /// 保存 + /// + /// + /// + /// + Task Save(List dto, LoginInDto loginInfo); + + /// + /// 同步金蝶 + /// + /// + /// + Task Sync(OperateRequest dto); + } +} diff --git a/src/WMS.Web.Domain/Infrastructure/IInStockRepositories.cs b/src/WMS.Web.Domain/Infrastructure/IInStockRepositories.cs index 885a7d4a..355383c2 100644 --- a/src/WMS.Web.Domain/Infrastructure/IInStockRepositories.cs +++ b/src/WMS.Web.Domain/Infrastructure/IInStockRepositories.cs @@ -4,6 +4,7 @@ using System.Text; using System.Threading.Tasks; using WMS.Web.Core.Dto; using WMS.Web.Core.Internal.Results; +using WMS.Web.Domain.Entitys; namespace WMS.Web.Domain.Infrastructure { @@ -18,5 +19,13 @@ namespace WMS.Web.Domain.Infrastructure /// /// Task> GetPagedList(InStockQueryRequest dto); + + /// + /// 添加 + /// + /// + /// + /// + Task Add(InStock entity, bool isTransaction = true); } } diff --git a/src/WMS.Web.Domain/Services/InStockService.cs b/src/WMS.Web.Domain/Services/InStockService.cs new file mode 100644 index 00000000..dee56fd8 --- /dev/null +++ b/src/WMS.Web.Domain/Services/InStockService.cs @@ -0,0 +1,82 @@ +using AutoMapper; +using Microsoft.EntityFrameworkCore.Storage; +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; +using WMS.Web.Core.Dto; +using WMS.Web.Core.Dto.InStock; +using WMS.Web.Core.Dto.Login; +using WMS.Web.Core.Internal.Results; +using WMS.Web.Domain.Entitys; +using WMS.Web.Domain.Infrastructure; +using WMS.Web.Domain.IService; +using WMS.Web.Domain.IService.Public; +using WMS.Web.Domain.Values; + +namespace WMS.Web.Domain.Services +{ + /// + /// 入库单服务 + /// + public class InStockService: IInStockService + { + private readonly IMapper _mapper; + private readonly ILoginService _loginService; + public readonly ITransactionRepositories _transactionRepositories; + private readonly IInStockRepositories _inStockRepositories; + private readonly IInStockTaskRepositories _inStockTaskRepositories; + public InStockService(IMapper mapper, ILoginService loginService, + ITransactionRepositories transactionRepositories, + IInStockRepositories inStockRepositories, IInStockTaskRepositories inStockTaskRepositories) + { + _mapper = mapper; + _loginService = loginService; + _transactionRepositories = transactionRepositories; + _inStockRepositories = inStockRepositories; + _inStockTaskRepositories = inStockTaskRepositories; + } + + /// + /// 出库单 + /// + /// + /// + /// + public async Task Save(List dto, LoginInDto loginInfo) + { + var entity = new InStock(); + entity.Details = _mapper.Map>(dto); + entity.Create(loginInfo.UserInfo.StaffId); + + //需要填写序列号 + //需要修改库存 + //需要同步金蝶 + + IDbContextTransaction _transaction = _transactionRepositories.GetTransaction(); + bool isRollback = false; + bool isSuccess = true; + entity = await _inStockRepositories.Add(entity, true); + if (entity == null) isRollback = true; + + //提交事务 + isSuccess = _transactionRepositories.CommitTransaction(isRollback, _transaction); + if (!isSuccess) + return Result.ReFailure(ResultCodes.DateWriteError); + + return Result.ReSuccess(); + } + + /// + /// 同步金蝶 + /// + /// + /// + public Task Sync(OperateRequest dto) + { + //调用同步服务方法 + + return Task.FromResult(Result.ReSuccess()); + } + } +} diff --git a/src/WMS.Web.Repositories/DependencyInjection/AppBuilder.cs b/src/WMS.Web.Repositories/DependencyInjection/AppBuilder.cs index 6aa71384..bb5e8c89 100644 --- a/src/WMS.Web.Repositories/DependencyInjection/AppBuilder.cs +++ b/src/WMS.Web.Repositories/DependencyInjection/AppBuilder.cs @@ -237,7 +237,8 @@ namespace WMS.Web.Repositories.DependencyInjection Services.AddTransient(); Services.AddTransient(); Services.AddTransient(); - + Services.AddTransient(); + } } } diff --git a/src/WMS.Web.Repositories/InStockRepositories.cs b/src/WMS.Web.Repositories/InStockRepositories.cs index af3a5970..2a60da38 100644 --- a/src/WMS.Web.Repositories/InStockRepositories.cs +++ b/src/WMS.Web.Repositories/InStockRepositories.cs @@ -1,5 +1,6 @@ using AutoMapper; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Storage; using System; using System.Collections.Generic; using System.Linq; @@ -8,6 +9,7 @@ using System.Threading.Tasks; using WMS.Web.Core; using WMS.Web.Core.Dto; using WMS.Web.Core.Internal.Results; +using WMS.Web.Domain.Entitys; using WMS.Web.Domain.Infrastructure; using WMS.Web.Domain.IService.Public; using WMS.Web.Domain.Values.Single; @@ -77,5 +79,40 @@ namespace WMS.Web.Repositories response.Data = list; return response; } + + /// + /// 新增 + /// + /// + /// + /// + public async Task Add(InStock entity, bool isTransaction = true) + { + IDbContextTransaction _transaction = null; + if (isTransaction) + _transaction = _context.Database.BeginTransaction(); + try + { + await _context.Instock.AddAsync(entity); + await _context.SaveChangesAsync(); + + if (string.IsNullOrEmpty(entity.BillNo)) + { + entity.GenerateNo(); + await _context.SaveChangesAsync(); + } + + if (_transaction != null) + _transaction.Commit(); + return entity; + } + catch (Exception ex) + { + if (_transaction != null) + _transaction.Rollback(); + return null; + } + + } } }