zs
2025-05-16 edca9fd026f88d4edad94b528694d95d62246c67
添加记录
已添加2个文件
已修改11个文件
483 ■■■■■ 文件已修改
HIAWms/hiawms_web/src/widgets/WmsMaterialStock/Controllers/WmsMaterialStockDrawer.tsx 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Dtos/CommonDto/LMesCallMaterialInput.cs 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Dtos/CommonDto/MoveStockInput.cs 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Dtos/CommonDto/ReduceStockInput{.cs 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Dtos/WmsMaterialStocks/WmsMaterialStockCreateDto.cs 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Services/IWmsBindInStockAppService.cs 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Services/IWmsCommonAppService.cs 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/server/src/CMS.Plugin.HIAWms.Application/Implements/LMesOperateAppService.cs 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/server/src/CMS.Plugin.HIAWms.Application/Implements/WmsBindInStockAppService.cs 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/server/src/CMS.Plugin.HIAWms.Application/Implements/WmsCommonAppService.cs 186 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/server/src/CMS.Plugin.HIAWms.Application/Implements/WmsMaterialStockAppService.cs 62 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/server/src/CMS.Plugin.HIAWms.Domain.Shared/Enums/StockTypeEnum.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/server/src/CMS.Plugin.HIAWms/Controller/WmsMaterialStockController.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/hiawms_web/src/widgets/WmsMaterialStock/Controllers/WmsMaterialStockDrawer.tsx
@@ -68,12 +68,12 @@
  const formItems = reactive([
    // åŸºç¡€ä¿¡æ¯
    {
      label: '物料编号',
      prop: 'materialNo',
      label: '物料型号',
      prop: 'materialModel',
      el: 'input',
      placeholder: '请输入物料编号',
      placeholder: '请输入物料型号',
      rules: [
        { required: true, message: '物料编号不能为空', trigger: 'blur' },
        { required: true, message: '物料型号不能为空', trigger: 'blur' },
        { max: 50, message: '长度不能超过50个字符', trigger: 'blur' },
      ],
    },
@@ -210,7 +210,7 @@
  const onConfirm = async () => {
    await formRef.value?.validate()
    const data = {
      materialNo: formData.value.materialNo,
      materialModel: formData.value.materialModel,
      materialName: formData.value.materialName,
      containerNo: formData.value.containerNo,
      stockNumber: formData.value.stockNumber,
@@ -302,7 +302,7 @@
      )
      const res = data?.items[0]
      formData.value = {
        materialNo: res.materialNo,
        materialModel: res.materialModel,
        materialName: res.materialName,
        containerNo: res.containerNo,
        stockNumber: res.stockNumber,
HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Dtos/CommonDto/LMesCallMaterialInput.cs
@@ -26,4 +26,15 @@
        /// </summary>
        public string? MaterialMode { get; set; }
    }
    /// <summary>
    /// æ‰£å‡åº“å­˜
    /// </summary>
    public class ReduceInput: LMesCallMaterialInput
    {
        /// <summary>
        /// åº“位号
        /// </summary>
        public string PlaceNo { get; set; }
    }
}
HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Dtos/CommonDto/MoveStockInput.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,63 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CMS.Plugin.HIAWms.Application.Contracts.Dtos.CommonDto
{
    /// <summary>
    /// åº“存转移参数
    /// </summary>
    public class MoveStockInput
    {
        /// <summary>
        /// ä»»åŠ¡å·
        /// </summary>
        public string TaskNo { get; set; }
        /// <summary>
        /// å•据号
        /// </summary>
        public string OrderNo { get; set; }
        /// <summary>
        /// ç‰©æ–™åç§°
        /// </summary>
        public string MaterialName { get; set; }
        /// <summary>
        /// å®¹å™¨ç¼–号
        /// </summary>
        public string? ContainerNo { get; set; }
        /// <summary>
        /// ç‰©æ–™ç¼–号
        /// </summary>
        public string MaterialNo { get; set; }
        /// <summary>
        /// åº“存数量
        /// </summary>
        public int StockNumber { get; set; }
        /// <summary>
        /// ç‰©æ–™æ‰¹æ¬¡
        /// </summary>
        public string? MaterialBatch { get; set; }
        /// <summary>
        /// æœºåž‹/规格
        /// </summary>
        public string? MaterialModel { get; set; }
        /// <summary>
        /// èµ·å§‹åº“位
        /// </summary>
        public string SourcePlace { get; set; }
        /// <summary>
        /// ç›®æ ‡åº“位
        /// </summary>
        public string ToPlace { get; set; }
    }
}
HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Dtos/CommonDto/ReduceStockInput{.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,59 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CMS.Plugin.HIAWms.Application.Contracts.Dtos.CommonDto
{
    /// <summary>
    /// æ‰£å‡åº“存入库
    /// </summary>
    public class ReduceStockInput
    {
        /// <summary>
        /// ä»»åŠ¡å·
        /// </summary>
        public string TaskNo { get; set; }
        /// <summary>
        /// å•据号
        /// </summary>
        public string OrderNo { get; set; }
        /// <summary>
        /// ç‰©æ–™åç§°
        /// </summary>
        public string MaterialName { get; set; }
        /// <summary>
        /// å®¹å™¨ç¼–号
        /// </summary>
        public string? ContainerNo { get; set; }
        /// <summary>
        /// ç‰©æ–™ç¼–号
        /// </summary>
        public string MaterialNo { get; set; }
        /// <summary>
        /// åº“存数量
        /// </summary>
        public int StockNumber { get; set; }
        /// <summary>
        /// ç‰©æ–™æ‰¹æ¬¡
        /// </summary>
        public string? MaterialBatch { get; set; }
        /// <summary>
        /// æœºåž‹/规格
        /// </summary>
        public string? MaterialModel { get; set; }
        /// <summary>
        /// åº“位编号
        /// </summary>
        public string? PlaceNo { get; set; }
    }
}
HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Dtos/WmsMaterialStocks/WmsMaterialStockCreateDto.cs
@@ -15,5 +15,15 @@
    /// <summary> 
    /// æ˜¯å¦ç¦ç”¨ 
    /// </summary> 
    public bool? IsDisabled { get; set; } = false;
    public bool? IsDisabled { get; set; } = false;
    /// <summary>
    /// ä»»åŠ¡å·
    /// </summary>
    public string TaskNo { get; set; }
    /// <summary>
    /// å•据编号
    /// </summary>
    public string OrderNo { get; set; }
HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Services/IWmsBindInStockAppService.cs
@@ -1,4 +1,5 @@
using CMS.Plugin.HIAWms.Application.Contracts.Dtos.BindInstockDto;
using CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsMaterialStocks;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -17,7 +18,7 @@
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        Task BindMaterialContaienrAsync(BindInstockInput input);
        Task<WmsMaterialStockDto> BindMaterialContaienrAsync(BindInstockInput input);
        /// <summary>
        /// ç»„盘入库
HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Services/IWmsCommonAppService.cs
@@ -1,5 +1,7 @@
using CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsMaterialStocks;
using CMS.Plugin.HIAWms.Application.Contracts.Dtos.CommonDto;
using CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsMaterialStocks;
using CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsPlace;
using CMS.Plugin.HIAWms.Domain.Shared.Enums;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -26,6 +28,19 @@
        /// <param name="requiredNum"></param>
        /// <param name="materialNo"></param>
        /// <returns></returns>
        Task<Dictionary<WmsMaterialStockDto, int>> FindStockAsync(string materialModel, int requiredNum, string materialNo = "");
        Task<Dictionary<WmsMaterialStockDto, int>> FindStockAsync(string materialModel, int requiredNum, string placeNo = "", PlaceTypeEnum placeType = PlaceTypeEnum.YUANLIAOKUWEI, string materialNo = "");
        /// <summary>
        /// æ‰£å‡åº“å­˜
        /// </summary>
        /// <returns></returns>
        Task<List<WmsMaterialStockDto>> ReduceMaterialStockAsync(ReduceStockInput input);
        /// <summary>
        /// åº“存转移
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        Task<List<WmsMaterialStockDto>> MoveMaterialStock(MoveStockInput input);
    }
}
HIAWms/server/src/CMS.Plugin.HIAWms.Application/Implements/LMesOperateAppService.cs
@@ -2,6 +2,7 @@
using CMS.Plugin.HIAWms.Application.Contracts.Dtos.OutStockDto;
using CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsInOutStockOrder;
using CMS.Plugin.HIAWms.Application.Contracts.Services;
using CMS.Plugin.HIAWms.Domain.Shared.Enums;
using CMS.Plugin.HIAWms.Domain.WmsMaterials;
using CMS.Plugin.HIAWms.Domain.WmsTask;
using Microsoft.Extensions.DependencyInjection;
@@ -22,6 +23,7 @@
    {
        private readonly IWmsTaskRepository _wmsTaskRepository;
        private readonly IWmsMaterialRepository _wmsMaterialRepository;
        private readonly IWmsCommonAppService _wmsCommonAppService;
        private readonly IWmsInOutStockOrderAppService _wmsInOutStockOrderAppService;
        private readonly IWmsOutStockAppService _wmsOutStockOrderAppService;
        private readonly IServiceProvider _serviceProvider;
@@ -31,13 +33,15 @@
            IWmsInOutStockOrderAppService wmsInOutStockOrderAppService,
            IWmsOutStockAppService wmsOutStockOrderAppService
,
            IServiceProvider serviceProvider)
            IServiceProvider serviceProvider,
            IWmsCommonAppService wmsCommonAppService)
        {
            _wmsTaskRepository = wmsTaskRepository;
            _wmsMaterialRepository = wmsMaterialRepository;
            _wmsInOutStockOrderAppService = wmsInOutStockOrderAppService;
            _wmsOutStockOrderAppService = wmsOutStockOrderAppService;
            _serviceProvider = serviceProvider;
            _wmsCommonAppService = wmsCommonAppService;
        }
        /// <summary>
@@ -116,5 +120,34 @@
            return result;
        }
        /// <summary>
        /// LMes出库
        /// </summary>
        /// <returns></returns>
        public async Task LMesOutStockAsync(ReduceInput input)
        {
            if (input == null)
            {
                throw new UserFriendlyException("出库参数错误");
            }
            using var scope = _serviceProvider.CreateScope();
            var unitOfWorkManager = scope.ServiceProvider.GetRequiredService<IUnitOfWorkManager>();
            using var uow = unitOfWorkManager.Begin(requiresNew: true);
            if (string.IsNullOrEmpty(input.MaterialMode))
            {
                throw new UserFriendlyException("出库型号不能为空");
            }
            var reduceInput = new ReduceStockInput
            {
                MaterialModel = input.MaterialMode,
                StockNumber = input.Quantity,
                PlaceNo = input.PlaceNo,
            };
            await _wmsCommonAppService.ReduceMaterialStockAsync(reduceInput);
            await uow.SaveChangesAsync();
        }
    }
}
HIAWms/server/src/CMS.Plugin.HIAWms.Application/Implements/WmsBindInStockAppService.cs
@@ -64,7 +64,7 @@
            _serviceProvider = serviceProvider;
        }
        public async Task BindMaterialContaienrAsync(BindInstockInput input)
        public async Task<WmsMaterialStockDto> BindMaterialContaienrAsync(BindInstockInput input)
        {
            using var scope = _serviceProvider.CreateScope();
            var unitOfWorkManager = scope.ServiceProvider.GetRequiredService<IUnitOfWorkManager>();
@@ -134,16 +134,19 @@
                MaterialName = material.MaterialName,
                MaterialBatch = input.MaterialBatch,
                StockNumber = input.StockNumber,
                CheckStatus = Domain.Shared.Enums.MaterialCheckStatusEnum.HEGE,
                IsLock = Domain.Shared.Enums.YesNoEnum.N,
                CheckStatus = MaterialCheckStatusEnum.HEGE,
                IsLock = YesNoEnum.N,
                PlaceNo = input.PlaceNo,
                ContainerNo = containerNo,
                EmptyContainer = Domain.Shared.Enums.YesNoEnum.N,
                MaterialModel = input.MaterialModel,
                EmptyContainer = YesNoEnum.N,
            };
            await _wmsMaterialStockAppService.CreateAsync(materialStock);
            var result = await _wmsMaterialStockAppService.CreateAsync(materialStock);
            await uow.SaveChangesAsync();
            await uow.CompleteAsync();
            return result;
        }
HIAWms/server/src/CMS.Plugin.HIAWms.Application/Implements/WmsCommonAppService.cs
@@ -2,10 +2,13 @@
using CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsMaterialStocks;
using CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsPlace;
using CMS.Plugin.HIAWms.Application.Contracts.Services;
using CMS.Plugin.HIAWms.Domain.Shared.Enums;
using CMS.Plugin.HIAWms.Domain.WmsInOutStockRecord;
using CMS.Plugin.HIAWms.Domain.WmsMaterials;
using CMS.Plugin.HIAWms.Domain.WmsMaterialStocks;
using CMS.Plugin.HIAWms.Domain.WmsPlaces;
using CmsQueryExtensions.Extension;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -13,26 +16,33 @@
using System.Text;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Uow;
namespace CMS.Plugin.HIAWms.Application.Implements
{
    /// <summary>
    /// å…¬å…±æ“ä½œæœåŠ¡
    /// </summary>
    public class WmsCommonAppService : CMSPluginAppService,IWmsCommonAppService
    public class WmsCommonAppService : CMSPluginAppService, IWmsCommonAppService
    {
        private readonly IWmsMaterialRepository _wmsMaterialRepository;
        private readonly IWmsPlaceRepository _wmsPlaceRepository;
        private readonly IWmsMaterialStockRepository _wmsMaterialStockRepository;
        private readonly IWmsInOutStockRecordRepository _wmsInOutStockRecordRepository;
        private readonly IServiceProvider _serviceProvider;
        public WmsCommonAppService(IWmsMaterialRepository wmsMaterialRepository,
            IWmsPlaceRepository wmsPlaceRepository,
            IWmsMaterialStockRepository wmsMaterialStockRepository
            )
,
            IServiceProvider serviceProvider,
            IWmsInOutStockRecordRepository wmsInOutStockRecordRepository)
        {
            _wmsMaterialRepository = wmsMaterialRepository;
            _wmsPlaceRepository = wmsPlaceRepository;
            _wmsMaterialStockRepository = wmsMaterialStockRepository;
            _serviceProvider = serviceProvider;
            _wmsInOutStockRecordRepository = wmsInOutStockRecordRepository;
        }
@@ -44,14 +54,14 @@
        /// <param name="requiredNum"></param>
        /// <returns></returns>
        /// <exception cref="UserFriendlyException"></exception>
        public async Task<Dictionary<WmsPlaceDto, int>> FindAvailablePlacesAsync(string materialModel,int requiredNum, string materialNo="" )
        public async Task<Dictionary<WmsPlaceDto, int>> FindAvailablePlacesAsync(string materialModel, int requiredNum, string materialNo = "")
        {
            var whereConditions = DynamicGetQueryParams(new GetWmsMaterialStockInput { StorageTypeNo = Domain.Shared.Enums.PlaceTypeEnum.YUANLIAOKUWEI });
            // 1. èŽ·å–æ‰€æœ‰åº“å­˜å’Œåº“ä½ä¿¡æ¯
            var stockList = await _wmsMaterialStockRepository.GetListAsync(whereConditions);
            var placeList = await _wmsPlaceRepository.GetListAsync(new WmsPlace { StorageTypeNo = Domain.Shared.Enums.PlaceTypeEnum.YUANLIAOKUWEI});
            var placeList = await _wmsPlaceRepository.GetListAsync(new WmsPlace { StorageTypeNo = Domain.Shared.Enums.PlaceTypeEnum.YUANLIAOKUWEI });
            var allPlaceList = ObjectMapper.Map<List<WmsPlace>, List<WmsPlaceDto>>(placeList.Where(x => !x.IsDisabled).ToList());
            // 2. æŸ¥æ‰¾ç›¸åŒç‰©æ–™åž‹å·å’Œç¼–号的库存(按库存量降序)
@@ -114,14 +124,28 @@
        /// <param name="requiredNum"></param>
        /// <param name="materialNo"></param>
        /// <returns></returns>
        public async Task<Dictionary<WmsMaterialStockDto, int>> FindStockAsync(string materialModel, int requiredNum, string materialNo = "")
        public async Task<Dictionary<WmsMaterialStockDto, int>> FindStockAsync(string materialModel, int requiredNum, string placeNo = "", PlaceTypeEnum placeType = PlaceTypeEnum.YUANLIAOKUWEI, string materialNo = "")
        {
            var allocation = new Dictionary<WmsMaterialStockDto, int>(); // <库位号, å‡ºåº“æ•°>
            // 1. èŽ·å–æ‰€æœ‰åº“å­˜ï¼ˆæŽ’é™¤é”å®šåº“å­˜ï¼‰
            var input = new GetWmsMaterialStockInput();
            var whereConditions = DynamicGetQueryParams(new GetWmsMaterialStockInput());
            var stockList = (await _wmsMaterialStockRepository.GetListAsync(whereConditions))
                .Where(x => x.IsLock == Domain.Shared.Enums.YesNoEnum.N)
                .Where(x=>x.StorageTypeNo == Domain.Shared.Enums.PlaceTypeEnum.YUANLIAOKUWEI)
                .Where(x => x.StorageTypeNo == placeType)
                .ToList();
            if (!string.IsNullOrEmpty(placeNo))
            {
                var stock = stockList.Where(x => x.PlaceNo == placeNo).FirstOrDefault();
                if (stock.StockNumber < requiredNum)
                {
                    throw new UserFriendlyException($"库位{placeNo}库存不足,可用: {stock.StockNumber}, ç¼º: {requiredNum - stock.StockNumber}");
                }
                allocation.Add(ObjectMapper.Map<WmsMaterialStock, WmsMaterialStockDto>(stock), requiredNum);
                return allocation;
            }
            // 2. ç­›é€‰åŒ¹é…ç‰©æ–™
            var availableStocklist = stockList
@@ -141,7 +165,6 @@
            }
            // 4. è®¡ç®—各库位出库数量
            var allocation = new Dictionary<WmsMaterialStockDto, int>(); // <库位号, å‡ºåº“æ•°>
            int remaining = requiredNum;
            foreach (var stock in availableStocks)
@@ -173,5 +196,154 @@
            return whereConditions;
        }
        /// <summary>
        /// æ‰£å‡åº“å­˜
        /// </summary>
        /// <returns></returns>
        public async Task<List<WmsMaterialStockDto>> ReduceMaterialStockAsync(ReduceStockInput input)
        {
            using var scope = _serviceProvider.CreateScope();
            var unitOfWorkManager = scope.ServiceProvider.GetRequiredService<IUnitOfWorkManager>();
            using var uow = unitOfWorkManager.Begin(requiresNew: true);
            var materialModel = await _wmsMaterialRepository.FindByModelAsync(input.MaterialModel);
            if (materialModel == null)
            {
                throw new UserFriendlyException("物料型号不存在");
            }
            var placeInfo = await _wmsPlaceRepository.FindByNameAsync(input.PlaceNo);
            if (placeInfo == null)
            {
                throw new UserFriendlyException("库位信息不存在");
            }
            var stockresult = await FindStockAsync(input.MaterialModel, input.StockNumber, input.PlaceNo, placeInfo.StorageTypeNo);
            if (stockresult == null)
            {
                throw new UserFriendlyException("当前无库存");
            }
            var recordList = new List<WmsInOutStockRecord>();
            var delStock = new List<WmsMaterialStock>();
            foreach (var kvp in stockresult)
            {
                var stock = kvp.Key;    // WmsPlace对象
                var quantity = kvp.Value; // åˆ†é…æ•°é‡
                // æ‰£å‡åº“å­˜
                var stockList = await _wmsMaterialStockRepository.GetStockListAsync(new WmsMaterialStock { MaterialModel = input.MaterialModel, PlaceNo = stock.PlaceNo });
                var reduceStockList = stockList.OrderBy(x => x.InStockTime).Take(quantity).ToList();
                delStock.AddRange(reduceStockList);
                // å‡ºå…¥åº“记录
                foreach (var item in reduceStockList)
                {
                    var record = new WmsInOutStockRecord
                    {
                        TaskNo = input.TaskNo,
                        OrderNo = input.OrderNo,
                        StockType = StockTypeEnum.Move,
                        ContainerNo = item.ContainerNo,
                        MaterialId = item.MaterialId,
                        MaterialModel = item.MaterialModel,
                        MaterialName = item.MaterialName,
                        MaterialNo = item.MaterialNo,
                        MaterialBatch = item.MaterialBatch,
                        SourcePlace = item.PlaceNo,
                        ToPlace = "出库",
                        OperateTime = DateTime.Now,
                        Remark = "出库扣减",
                    };
                    recordList.Add(record);
                }
            }
            await _wmsMaterialStockRepository.DeleteManyAsync(delStock);
            await _wmsInOutStockRecordRepository.InsertManyAsync(recordList);
            await uow.SaveChangesAsync();
            await uow.CompleteAsync();
            var result = ObjectMapper.Map<List<WmsMaterialStock>, List<WmsMaterialStockDto>>(delStock);
            return result;
        }
        /// <summary>
        /// åº“存转移
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public async Task<List<WmsMaterialStockDto>> MoveMaterialStock(MoveStockInput input)
        {
            using var scope = _serviceProvider.CreateScope();
            var unitOfWorkManager = scope.ServiceProvider.GetRequiredService<IUnitOfWorkManager>();
            using var uow = unitOfWorkManager.Begin(requiresNew: true);
            var materialModel = await _wmsMaterialRepository.FindByModelAsync(input.MaterialModel);
            if (materialModel == null)
            {
                throw new UserFriendlyException("物料型号不存在");
            }
            var placeInfo = await _wmsPlaceRepository.FindByNameAsync(input.SourcePlace);
            if (placeInfo == null)
            {
                throw new UserFriendlyException("来源库位信息不存在");
            }
            var toPlace = await _wmsPlaceRepository.FindByNameAsync(input.ToPlace);
            if (toPlace == null)
            {
                throw new UserFriendlyException("目标库位信息不存在");
            }
            var stockresult = await FindStockAsync(input.MaterialModel, input.StockNumber, input.SourcePlace, placeInfo.StorageTypeNo);
            if (stockresult == null)
            {
                throw new UserFriendlyException("当前无库存");
            }
            var recordList = new List<WmsInOutStockRecord>();
            var result = new List<WmsMaterialStockDto>();
            foreach (var kvp in stockresult)
            {
                var stock = kvp.Key;    // WmsPlace对象
                var quantity = kvp.Value; // åˆ†é…æ•°é‡
                // æ‰£å‡è½¬ç§»
                var stockList = await _wmsMaterialStockRepository.GetStockListAsync(new WmsMaterialStock { MaterialModel = input.MaterialModel, PlaceNo = stock.PlaceNo });
                var reduceStockList = stockList.OrderBy(x => x.InStockTime).Take(quantity).ToList();
                // å‡ºå…¥åº“记录
                foreach (var item in reduceStockList)
                {
                    var record = new WmsInOutStockRecord
                    {
                        TaskNo = input.TaskNo,
                        OrderNo = input.OrderNo,
                        StockType = StockTypeEnum.Move,
                        ContainerNo = item.ContainerNo,
                        MaterialId = item.MaterialId,
                        MaterialModel = item.MaterialModel,
                        MaterialName = item.MaterialName,
                        MaterialNo = item.MaterialNo,
                        MaterialBatch = item.MaterialBatch,
                        SourcePlace = item.PlaceNo,
                        ToPlace = input.ToPlace,
                        OperateTime = DateTime.Now,
                        Remark = "出库扣减",
                    };
                    recordList.Add(record);
                    item.PlaceNo = input.ToPlace;
                }
                await _wmsMaterialStockRepository.UpdateManyAsync(reduceStockList);
                await _wmsInOutStockRecordRepository.InsertManyAsync(recordList);
                result.AddRange(ObjectMapper.Map<List<WmsMaterialStock>, List<WmsMaterialStockDto>>(reduceStockList));
            }
            await uow.SaveChangesAsync();
            await uow.CompleteAsync();
            return result;
        }
    }
}
HIAWms/server/src/CMS.Plugin.HIAWms.Application/Implements/WmsMaterialStockAppService.cs
@@ -1,9 +1,13 @@
using CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsInOutStockOrderDetail;
using CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsInOutStockRecord;
using CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsMaterialStocks;
using CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsTask;
using CMS.Plugin.HIAWms.Application.Contracts.Services;
using CMS.Plugin.HIAWms.Domain.Shared.Enums;
using CMS.Plugin.HIAWms.Domain.Shared.WmsMaterialStocks;
using CMS.Plugin.HIAWms.Domain.WmsAreas;
using CMS.Plugin.HIAWms.Domain.WmsContainers;
using CMS.Plugin.HIAWms.Domain.WmsInOutStockRecord;
using CMS.Plugin.HIAWms.Domain.WmsMaterials;
using CMS.Plugin.HIAWms.Domain.WmsMaterialStocks;
using CMS.Plugin.HIAWms.Domain.WmsPlaces;
@@ -11,8 +15,10 @@
using CmsQueryExtensions;
using CmsQueryExtensions.Extension;
using Microsoft.Extensions.DependencyInjection;
using SqlKata;
using System.Linq.Expressions;
using System.Text.Json;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Data;
@@ -29,6 +35,8 @@
    private readonly IWmsContainerRepository _wmscontainerRepository;
    private readonly IWmsPlaceRepository _wmsplaceRepository;
    private readonly IWmsAreaRepository _wmsareaRepository;
    private readonly IWmsInOutStockRecordAppService _wmspInOutStockRecordAppService;
    private readonly IWmsInOutStockRecordRepository _wmsInOutStockRecordRepository;
    private readonly IServiceProvider _serviceProvider;
    /// <summary>
@@ -41,7 +49,10 @@
        IWmsPlaceRepository wmsplaceRepository,
        IWmsAreaRepository wmsareaRepository
,
        IServiceProvider serviceProvider)
        IServiceProvider serviceProvider,
        IWmsInOutStockRecordAppService wmspInOutStockRecordAppService,
        IWmsInOutStockRecordRepository wmsInOutStockRecordRepository
        )
    {
        _wmsmaterialstockRepository = wmsmaterialstockRepository;
        _wmsMaterialRepository = wmsMaterialRepository;
@@ -49,6 +60,8 @@
        _wmsplaceRepository = wmsplaceRepository;
        _wmsareaRepository = wmsareaRepository;
        _serviceProvider = serviceProvider;
        _wmspInOutStockRecordAppService = wmspInOutStockRecordAppService;
        _wmsInOutStockRecordRepository = wmsInOutStockRecordRepository;
    }
    /// <inheritdoc />
@@ -162,12 +175,13 @@
        using var uow = unitOfWorkManager.Begin(requiresNew: true);
        await CheckCreateOrUpdateDtoAsync(input);
        //var exist = await _wmsmaterialstockRepository.NameExistAsync(input.MaterialNo);
        //if (exist)
        //{
        //    throw new UserFriendlyException(L[CMSPluginDomainErrorCodes.NameAlreadyExists, input.MaterialNo]);
        //}
        var material = await _wmsMaterialRepository.FindByNameAsync(input.MaterialNo);
        var materialModel = await _wmsMaterialRepository.FindByModelAsync(input.MaterialModel);
        if(materialModel == null)
        {
            throw new UserFriendlyException("物料型号不存在");
        }
        var material = await _wmsMaterialRepository.FindByNameAsync(materialModel.MaterialNo);
        if (material == null)
        {
            throw new UserFriendlyException("物料信息不存在");
@@ -183,10 +197,10 @@
        wmsmaterialstock.MaterialId = Guid.NewGuid().ToString("N");
        wmsmaterialstock.MaterialName = material.MaterialName;
        wmsmaterialstock.ContainerStatus = Domain.Shared.Enums.ContainerStatusEnum.KUWEI;
        wmsmaterialstock.ContainerType = container == null ? Domain.Shared.Enums.ContainerTypeEnum.XUNI : container.ContainerType;
        wmsmaterialstock.StorageTypeNo = Domain.Shared.Enums.PlaceTypeEnum.XUNIKUWEI;
        wmsmaterialstock.PlaceStatus = Domain.Shared.Enums.PlaceStatusEnum.DAIRU;
        wmsmaterialstock.ContainerStatus = ContainerStatusEnum.KUWEI;
        wmsmaterialstock.ContainerType = container == null ? ContainerTypeEnum.XUNI : container.ContainerType;
        wmsmaterialstock.StorageTypeNo = PlaceTypeEnum.XUNIKUWEI;
        wmsmaterialstock.PlaceStatus = PlaceStatusEnum.DAIRU;
        if (!string.IsNullOrEmpty(input.PlaceNo))
        {
            var place = await _wmsplaceRepository.FindByNameAsync(input.PlaceNo);
@@ -200,12 +214,12 @@
                throw new UserFriendlyException("库位库区信息不存在");
            }
            wmsmaterialstock.PlaceStatus = Domain.Shared.Enums.PlaceStatusEnum.CUNHUO;
            wmsmaterialstock.PlaceStatus = PlaceStatusEnum.CUNHUO;
            wmsmaterialstock.StorageTypeNo = place.StorageTypeNo;
            wmsmaterialstock.AreaCode = place.AreaCode;
            wmsmaterialstock.AreaName = area.AreaName;
            place.PlaceStatus = Domain.Shared.Enums.PlaceStatusEnum.CUNHUO;
            place.PlaceStatus = PlaceStatusEnum.CUNHUO;
            place.Islock = input.IsLock;
            await _wmsplaceRepository.UpdateAsync(place);
@@ -229,6 +243,7 @@
        wmsmaterialstock.InStockTime = DateTime.Now;
        var stockList = new List<WmsMaterialStock>();
        var recordList = new List<WmsInOutStockRecord>();
        for (int i = 0; i < input.StockNumber; i++)
        {
            var stock = new WmsMaterialStock();
@@ -237,8 +252,27 @@
            stock.MaterialId = Guid.NewGuid().ToString("N");
            stock.StockNumber = 1;
            stockList.Add(stock);
        }
            // æ·»åŠ åº“å­˜è®°å½•
            var record = new WmsInOutStockRecord
            {
                TaskNo = input.TaskNo,
                OrderNo = input.OrderNo,
                StockType = StockTypeEnum.InBound,
                ContainerNo = stock.ContainerNo,
                MaterialId = stock.MaterialId,
                MaterialModel = stock.MaterialModel,
                MaterialName = stock.MaterialName,
                MaterialNo = stock.MaterialNo,
                MaterialBatch = stock.MaterialBatch,
                SourcePlace = "添加库存",
                ToPlace = stock.PlaceNo,
                OperateTime = DateTime.Now,
                Remark = "入库",
            };
            recordList.Add(record);
        }
        await _wmsInOutStockRecordRepository.InsertManyAsync(recordList);
        await _wmsmaterialstockRepository.InsertManyAsync(stockList);
        if (container == null)
HIAWms/server/src/CMS.Plugin.HIAWms.Domain.Shared/Enums/StockTypeEnum.cs
@@ -24,5 +24,11 @@
        /// </summary>
        [Description("出库")]
        OutBound = 2,
        /// <summary>
        /// è½¬ç§»
        /// </summary>
        [Description("转移")]
        Move = 3,
    }
}
HIAWms/server/src/CMS.Plugin.HIAWms/Controller/WmsMaterialStockController.cs
@@ -58,7 +58,7 @@
        }
        /// <summary>
        /// å“­å‡ºæ¥æ˜Žç»†
        /// åº“存明细
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>