using AutoMapper; 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; using WMS.Web.Core.Dto.Erp.TakeStock; using WMS.Web.Core.Dto.Login; using WMS.Web.Core.Dto.TakeStock; 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; using WMS.Web.Domain.Values.Erp; using WMS.Web.Domain.Values.Single; namespace WMS.Web.Domain.Services { /// /// 盘点单服务 /// public class TakeStockService : ITakeStockService { private readonly IMapper _mapper; private readonly ILoginService _loginService; public readonly IBasicsRepositories _transactionRepositories; private readonly ITakeStockRepositories _takeStockRepositories; private readonly ILoginRepositories _loginRepositories; private readonly ISingleDataService _singleDataService; private readonly IErpService _erpService; public TakeStockService(IMapper mapper, ILoginService loginService, IBasicsRepositories transactionRepositories, ITakeStockRepositories takeStockRepositories, ILoginRepositories loginRepositories, ISingleDataService singleDataService, IErpService erpService) { _mapper = mapper; _loginService = loginService; _transactionRepositories = transactionRepositories; _takeStockRepositories = takeStockRepositories; _loginRepositories = loginRepositories; _singleDataService = singleDataService; _erpService = erpService; } /// /// 保存 /// /// /// /// public async Task Save(List dto, LoginInDto loginInfo) { List list = _mapper.Map>(dto); foreach (var entity in list) entity.Create(loginInfo.UserInfo.StaffId); //需要填写序列号 //需要修改库存 IDbContextTransaction _transaction = _transactionRepositories.GetTransaction(); bool isRollback = false; bool isSuccess = true; isSuccess = await _takeStockRepositories.AddRange(list, false); if (!isSuccess) isRollback = true; //提交事务 isSuccess = _transactionRepositories.CommitTransaction(isRollback, _transaction); if (!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError); //同步金蝶 foreach (var entity in list) await Loss_Profit(entity); return Result.ReSuccess(); } /// /// 同步金蝶 /// /// /// public async Task Sync(OperateRequest dto) { var list = await _takeStockRepositories.GetEntityList(dto.Ids); list = list.Where(w => w.SuccessSync == false).ToList(); foreach (var entity in list) await Loss_Profit(entity); return Result.ReSuccess(); } /// /// 作废 /// /// /// public async Task Profit(TakeStock entity) { //获取金蝶仓库仓位编码 //var stockCode = _singleDataService.GetSingleDataCode(SingleAction.Stocks, _loginRepositories.CompanyId, entity.StockCode); //var subStockCode = _singleDataService.GetSingleDataCode(SingleAction.Stocks, _loginRepositories.CompanyId, entity.SubStockCode); var res = await _erpService.BillQueryForStock(); var stock = res.Data.FirstOrDefault(f => f.Code == entity.StockCode);//需要根据单点code搜索 var subStock = res.Data.FirstOrDefault(f => f.Code == entity.SubStockCode);//需要根据单点code搜索 if (stock == null || subStock == null) return Result.ReFailure(ResultCodes.ErpStockNoData); //组装dto #region 组装dto List detils = new List(); detils.Add(new ErpTakeStockDetailsSaveDto() { FOwnerid = stock.OrgId.ToString(), FKeeperId = stock.OrgId.ToString(), MaterialId = entity.MaterialId.ToString(), UnitId = "",//物料带出来 StockId = stock.Id.ToString(), SubStockId = subStock.Id.ToString(), BeforeQty = entity.BeforeQty, AfterQty = entity.AfterQty, FinalQty = entity.FinalQty, Fnote = "" }); ErpTakeStockSaveDto dto = new ErpTakeStockSaveDto() { BillNo = entity.BillNo, StockOrgId = stock.OrgId.ToString(), Type = "PY01_SYS", Date = entity.Date, Details = detils }; #endregion var resSync = await _erpService.Sync(dto, FormIdParam.STK_StockCountGain.ToString()); entity.Sync(resSync.IsSuccess, resSync.Message); await _takeStockRepositories.Edit(entity, true); return res; } /// /// 盘盈盘亏同步金蝶 /// /// /// public async Task Loss_Profit(TakeStock entity) { //获取金蝶仓库仓位编码 //var stockCode = _singleDataService.GetSingleDataCode(SingleAction.Stocks, _loginRepositories.CompanyId, entity.StockId); //var subStockCode = _singleDataService.GetSingleDataCode(SingleAction.Stocks, _loginRepositories.CompanyId, entity.SubStockId); var res = await _erpService.BillQueryForStock(); var stock = res.Data.FirstOrDefault(f => f.Code == entity.StockCode);//需要根据单点code搜索 var subStock = res.Data.FirstOrDefault(f => f.Code == entity.SubStockCode);//需要根据单点code搜索 if (stock == null || subStock == null) return Result.ReFailure(ResultCodes.ErpStockNoData); //组装dto #region 组装dto List detils = new List(); detils.Add(new ErpTakeStockDetailsSaveDto() { FOwnerid = stock.OrgId.ToString(), FKeeperId = stock.OrgId.ToString(), MaterialId = entity.MaterialId.ToString(), UnitId = "", //物料带出来 StockId = stock.Id.ToString(), SubStockId = subStock.Id.ToString(), BeforeQty = entity.BeforeQty, AfterQty = entity.AfterQty, FinalQty = entity.FinalQty, Fnote = "" }); ErpTakeStockSaveDto dto = new ErpTakeStockSaveDto() { BillNo = entity.BillNo, StockOrgId = stock.OrgId.ToString(), Type = entity.ResultType == TakeStockType.Loss ? "PK01_SYS" : "PY01_SYS", Date = entity.Date, Details = detils }; #endregion //判断盘盈盘亏 string formId = entity.ResultType == TakeStockType.Loss ? FormIdParam.STK_StockCountLoss.ToString() : FormIdParam.STK_StockCountGain.ToString(); var resSync = await _erpService.Sync(dto, formId); entity.Sync(resSync.IsSuccess, resSync.Message); await _takeStockRepositories.Edit(entity, true); return res; } } }