zs
2025-05-19 1225fbcf6dd197c39853e2cb0f70c7318836abcb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
using CMS.Plugin.HIAWms.Application.Contracts.Dtos.CommonDto;
using CMS.Plugin.HIAWms.Application.Contracts.Dtos.OutStockDto;
using CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsMaterialStocks;
using CMS.Plugin.HIAWms.Application.Contracts.Services;
using CMS.Plugin.HIAWms.Domain.Shared.Enums;
using CMS.Plugin.HIAWms.Domain.WmsInOutStockOrder;
using CMS.Plugin.HIAWms.Domain.WmsMaterialStocks;
using CMS.Plugin.HIAWms.Domain.WmsTask;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Uow;
 
namespace CMS.Plugin.HIAWms.Application.Implements
{
    /// <summary>
    /// 出库服务
    /// </summary>
    public class WmsOutStockAppService : CMSPluginAppService, IWmsOutStockAppService
    {
        private readonly IWmsMaterialStockRepository _wmsMaterialStockRepository;
        private readonly IWmsCommonAppService _wmsCommonAppService;
        private readonly IWmsTaskRepository _wmsTaskRepository;
        private readonly IWmsInOutStockOrderRepository _wmsInOutStockOrderRepository;
        private readonly IServiceProvider _serviceProvider;
        public WmsOutStockAppService(IWmsMaterialStockRepository wmsMaterialStockRepository,
            IWmsCommonAppService wmsCommonAppService, IWmsTaskRepository wmsTaskRepository,
            IWmsInOutStockOrderRepository wmsInOutStockOrderRepository, IServiceProvider serviceProvider
            )
        {
            _wmsMaterialStockRepository = wmsMaterialStockRepository;
            _wmsCommonAppService = wmsCommonAppService;
            _wmsTaskRepository = wmsTaskRepository;
            _wmsInOutStockOrderRepository = wmsInOutStockOrderRepository;
            _serviceProvider = serviceProvider;
        }
 
        public async Task<List<CallMaterialOutput>> CallMaterialAsync(List<CallMaterialInput> input)
        {
            using var scope = _serviceProvider.CreateScope();
            var unitOfWorkManager = scope.ServiceProvider.GetRequiredService<IUnitOfWorkManager>();
            using var uow = unitOfWorkManager.Begin(requiresNew: true);
 
            var distinctModels = input.Select(x => x.MaterialModel).Distinct().ToList();
            if (distinctModels.Count > 1)
            {
                throw new UserFriendlyException("一次叫料只能针对同一型号的物料!");
            }
            var callOutput = new List<CallMaterialOutput>();
            foreach (var inputItem in input)
            {
                if (inputItem.MaterialNumber <= 0)
                {
                    throw new UserFriendlyException("叫料数量必须大于0");
                }
                if (!inputItem.IgnoreOrder)
                {
                    var order = await _wmsInOutStockOrderRepository.FindByNameAsync(inputItem.OrderNo);
                    if (order == null)
                    {
                        throw new UserFriendlyException("出库单据不存在");
                    }
                    if (order.OrderType == OrderTypeEnum.SelfMadeParts || order.OrderType == OrderTypeEnum.PERSONIN)
                    {
                        throw new UserFriendlyException("入库单不允许叫料");
                    }
                    if (order.OrderStatus == OrderStatusEnum.Finish)
                    {
                        throw new UserFriendlyException("已完成单据不允许叫料");
                    }
                    if (order.MaterialNumber < inputItem.MaterialNumber + order.DistributeNumber)
                    {
                        throw new UserFriendlyException("叫料数量不能大于单据数量");
                    }
                    order.OrderStatus = OrderStatusEnum.Executing;
                    order.DistributeNumber = inputItem.MaterialNumber;
                    order.OperateTime = DateTime.Now;
 
                    await _wmsInOutStockOrderRepository.UpdateAsync(order);
                }
 
                var stockresult = await _wmsCommonAppService.FindStockAsync(inputItem.MaterialModel, inputItem.MaterialNumber);
                if (stockresult == null)
                {
                    throw new UserFriendlyException("当前无库存");
                }
                var taskList = new List<WmsTask>();
                foreach (var kvp in stockresult)
                {
                    var stock = kvp.Key;    // WmsPlace对象
                    var quantity = kvp.Value; // 分配数量
 
                    for (int i = 0; i < quantity; i++)
                    {
                        var task = new WmsTask
                        {
                            TaskNo = $"CK_{DateTime.Now:yyyyMMddHHmmss}_{Guid.NewGuid().ToString("N").Substring(0, 6)}",
                            ContainerNo = stock.ContainerNo,
                            SourcePlace = stock.PlaceNo,
                            ToPlace = "201",// place.PlaceNo,
                            TaskType = TaskTypeEnum.CHUKU,
                            SonTaskType = inputItem.OrderType == OrderTypeEnum.PRODUCTCALL ? SonTaskTypeEnum.ZDCHUKU : SonTaskTypeEnum.RGRUKU,
                            TaskStatus = WmsTaskStatus.WEIZHIXING,
                            TaskLevel = inputItem.Priority,
                            Aisle = 1,
                            DodeviceId = 0,
                            Dodevicetype = DodevicetypeEnum.Srm,
                            TaskDodeviceStatus = TaskDodeviceStatus.SrmNoStart,
                            IsNextTask = (int)YesNoEnum.Y,
                            IsRead = true,
                            PlcTaskId = new Random(Guid.NewGuid().GetHashCode()).Next(101, 99999),
                            SourceOrderNo = inputItem.OrderNo,
                            MutableParam1 = inputItem.MaterialModel,
                            MutableParam2 = inputItem.DataIdentifier
                        };
                        taskList.Add(task);
 
                        var output = ObjectMapper.Map<WmsMaterialStockDto, CallMaterialOutput>(stock);
                        output.TaskNo = task.TaskNo;
                        output.PlcTaskId = task.PlcTaskId;
                        output.SourceOrderNo = task.SourceOrderNo;
                        callOutput.Add(output);
                    }
                }
                await _wmsTaskRepository.InsertManyAsync(taskList);
            }
 
            await uow.SaveChangesAsync();
            await uow.CompleteAsync();
 
            return callOutput;
        }
    }
}