刘磊
2024-12-21 a6ea79849f0142b5280f0c5d4b15ecc83f0d015a
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
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
using Masuit.Tools;
using WIDESEA_Core.Const;
using WIDESEA_DTO.MOM;
using WIDESEA_DTO.WMS;
 
namespace WIDESEA_StorageTaskServices;
 
public partial class Dt_TaskService : ServiceBase<Dt_Task, IDt_TaskRepository>, IDt_TaskService
{
    /// <summary>
    /// 根据当前工序判断下一工序,送至对应工序
    /// </summary>
    /// <param name="boxing">组盘</param>
    /// <param name="area">区域</param>
    /// <param name="input">请求参数</param>
    /// <param name="resultTray">托盘电芯</param>
    /// <returns></returns>
    private async Task<WebResponseContent> ProcessBasedOnProcessCode(DtBoxingInfo boxing, Dt_AreaInfo area, RequestTaskDto input, ResultTrayCellsStatus resultTray)
    {
        if (boxing.ProcessCode == "OCVB")
        {
            return await ProcessOCVB(boxing, area, input);
        }
        else
        {
            return await ProcessOtherProcessCode(boxing, area, input, resultTray);
        }
    }
 
    /// <summary>
    /// OCVB特殊逻辑
    /// </summary>
    /// <param name="boxing">组盘信息</param>
    /// <param name="area">区域</param>
    /// <param name="input">请求信息</param>
    /// <returns></returns>
    /// <exception cref="InvalidOperationException"></exception>
    private async Task<WebResponseContent> ProcessOCVB(DtBoxingInfo boxing, Dt_AreaInfo area, RequestTaskDto input)
    {
        WebResponseContent content = new WebResponseContent();
        // 判断需不需要去包装,不需要就去常温三
        var stationManagers = _stationManagerRepository.QueryData(x => x.stationPLC == "1018" && x.stationArea == "Cache" && x.productLine == input.ProductionLine);
 
        //var station = stationManagers.Select(x => x.stationChildCode).ToList();
 
        //// 获取WCSip地址相关配置
        //var wcsIpAddrss = GetWCSIpAddress();
        //if (wcsIpAddrss == null)
        //{
        //    throw new InvalidOperationException("WCS IP 未配置");
        //}
 
        //var abc = HttpHelper.PostAsync(wcsIpAddrss, station.ToJsonString()).Result;
        //content = JsonConvert.DeserializeObject<WebResponseContent>(abc);
        //var num = content.Data.ObjToInt();
 
 
        // TODO 判断在途数量
        var count = BaseDal.QueryData(x => x.TargetAddress == stationManagers[0].Roadway).Count;
        if (count <= 10)
        {
            // 送至包装
            List<string> strings = stationManagers.Where(x => x.stationType == 0).Select(x => x.Roadway).ToList();
            return await CreateNewTask(input, strings, 3);
        }
        else
        {
            var config = _configService.GetByConfigKey("SYS_InStacker", "CW3InStacker");
            var strings = config.ConfigValue.Split(',').ToList();
            // 入库送至常温3
            var resultContent = await CreateNewTask(input, strings);
            if (resultContent.Status)
            {
                await _boxingInfoRepository.AddDataNavAsync(boxing);
            }
            return resultContent;
        }
    }
 
    /// <summary>
    /// 正常入库请求流程
    /// </summary>
    /// <param name="boxing">组盘信息</param>
    /// <param name="area">区域</param>
    /// <param name="input">请求信息</param>
    /// <param name="result">整盘电芯数据</param>
    /// <returns></returns>
    /// <exception cref="Exception"></exception>
    private async Task<WebResponseContent> ProcessOtherProcessCode(DtBoxingInfo boxing, Dt_AreaInfo area, RequestTaskDto input, ResultTrayCellsStatus result)
    {
        WebResponseContent content = new WebResponseContent();
        // 获取工艺路线
        ProcessApplyDto process = await GetProcessApplyAsync(result);
        if (process == null) return content;
 
        // 赋值上位软件名称和设备编码
        process.Software = area.Spare3;
        process.EquipmentCode = area.Spare2;
 
        content = await _processApplyService.GetProcessApplyAsync(process);
        if (!content.Status) return content.Error("工艺申请失败");
 
        var resultProcessApply = JsonConvert.DeserializeObject<ResultProcessApply>(content.Data.ToString());
        if (!resultProcessApply.Success) return content.Error("工艺申请失败");
 
        var number = resultProcessApply.ProcessInfo.Where(x => x.ProcessCode.Contains(boxing.ProcessCode)).FirstOrDefault().Number.ToInt32();
        foreach (var item in resultProcessApply.ProcessInfo)
        {
            if (item.Number.ToInt32() == number + 1)
            {
                boxing.NextProcessCode = item.ProcessCode;
            }
        }
 
        var areaIn = GetAreaInByNextProcessCode(boxing.NextProcessCode);
        var stationManagers = _stationManagerRepository.QueryData(x => x.stationType == 1 && x.stationChildCode == input.Position && x.stationArea.Contains(areaIn)).FirstOrDefault();
        if (stationManagers == null)
        {
            throw new Exception("未找到入库站台配置");
        }
        List<string> strings = stationManagers.Roadway.Split(',').ToList();
 
        var resultContent = await CreateNewTask(input, strings);
        if (resultContent.Status)
        {
            var isBox = await _boxingInfoRepository.AddDataNavAsync(boxing);
        }
        return resultContent;
    }
 
    private string GetAreaInByNextProcessCode(string nextProcessCode)
    {
        switch (nextProcessCode)
        {
            case "CH01":
                return "CH001";
 
            case "JZ01":
                return "JZ001";
 
            case "GW01":
                return "GWSC1";
 
            case "CW01":
                return "CWSC1";
 
            case "CW02":
                return "CWSC2";
 
            default:
                return string.Empty;
        }
    }
 
    private string GetWCSIpAddress()
    {
        var configz = _configService.GetConfigsByCategory(CateGoryConst.CONFIG_SYS_IPAddress);
        var wcsBasez = configz.Where(x => x.ConfigKey == SysConfigConst.WCSIPAddress).FirstOrDefault()?.ConfigValue;
        var address = configz.Where(x => x.ConfigKey == SysConfigConst.GetStation).FirstOrDefault()?.ConfigValue;
        if (wcsBasez == null || address == null)
        {
            return null;
        }
        return wcsBasez + address;
    }
 
    /// <summary>
    /// 电芯NG送至NG口
    /// </summary>
    private async Task<WebResponseContent> HandleErrorCells(RequestTaskDto input, Dt_AreaInfo area, List<SerialNoDto> serialNosError = null)
    {
        WebResponseContent content = new WebResponseContent();
        // TODO 创建任务送至NG排出口
        var stationManagers = _stationManagerRepository.QueryData(x => x.stationType == 1 && x.stationChildCode == input.Position && x.stationArea == area.AreaCode).FirstOrDefault();
        if (stationManagers == null)
        {
            throw new Exception("未找到NG入库站台配置");
        }
        //List<string> NGStation = stationManagers.Roadway.Split(',').ToList();
        //if (NGStation.Count <= 0)
        //{
        //    NGStation = stationManagers.stationNGChildCode.Split(',').ToList();
        //}
        List<string> NGStation = stationManagers.stationNGChildCode.Split(',').ToList();
        content = await CreateNewTask(input, NGStation, 2);
        return content.Error("存在异常电芯");
    }
 
    /// <summary>
    /// 创建并获取整盘电芯
    /// </summary>
    private TrayCellsStatusDto CreateTrayCellsStatusDto(Dt_AreaInfo area, string palletCode)
    {
        return new TrayCellsStatusDto()
        {
            Software = area.Spare3,
            TrayBarcode = palletCode,
            EquipmentCode = area.Spare2,
            SceneType = area.Spare4
        };
    }
 
    private WebResponseContent CreateAndReturnWMSTaskDTO(Dt_Task task)
    {
        WMSTaskDTO taskDTO = new WMSTaskDTO()
        {
            TaskNum = task.TaskNum.Value,
            Grade = 1,
            PalletCode = task.PalletCode,
            RoadWay = task.Roadway,
            SourceAddress = task.SourceAddress,
            TargetAddress = task.Roadway,
            TaskState = task.TaskState.Value,
            Id = 0,
            TaskType = task.TaskType
        };
        return new WebResponseContent().OK(data: taskDTO);
    }
 
    /// <summary>
    /// 查询任务
    /// </summary>
    private async Task<Dt_Task> QueryTaskByPalletCode(string palletCode)
    {
        return await BaseDal.QueryFirstAsync(x => x.PalletCode == palletCode);
    }
 
    /// <summary>
    /// 查询库存信息
    /// </summary>
    private async Task<DtStockInfo> QueryStockInfo(string palletCode)
    {
        return await _stockInfoRepository.QueryFirstNavAsync(x => x.PalletCode == palletCode && x.IsFull);
    }
 
    /// <summary>
    /// 根据位置查询区域信息
    /// </summary>
    private async Task<Dt_AreaInfo> QueryAreaInfoByPosition(string position)
    {
        return await _areaInfoRepository.QueryFirstAsync(x => x.Spare1.Contains(position));
    }
}