huangxiaoqiang
2025-04-25 a8f4641741af34ffbe5fd565003cc5d55bbec119
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
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
using Masuit.Tools;
using SqlSugar;
using WIDESEA_Core.Const;
using WIDESEA_DTO.MOM;
using WIDESEA_DTO.WMS;
using WIDESEA_StorageTaskRepository;
 
//using WIDESEAWCS_Model.Models;
 
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();
        try
        {
            // 判断需不需要去包装,不需要就去常温三
            var stationManagers = _stationManagerRepository.QueryData(x => x.stationPLC == "1018" && x.stationArea == "Cache" && x.productLine == input.ProductionLine);
 
            var STATION = _stationManagerRepository.QueryFirst(x => x.stationChildCode == input.Position);
 
            //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();
 
            //如果当前库内存在比当前时间的对应产线的料 则入库至常温3
            DtStockInfo stockInfo = _stockInfoRepository.QueryFirst(x => x.AreaCode == "CWSC3" && x.IsFull == true && x.ProductionLine == STATION.productLine && x.OutboundTime < DateTime.Now);
            if (stockInfo != null)
            {
                var config = _configService.GetByConfigKey("SYS_InStacker", "CW3InStacker");
                var strings = config.ConfigValue.Split(',').ToList();
                // 入库送至常温3
                var resultContent = await CreateNewTask(input, input.ProductionLine, boxing.ProcessCode, strings);
                if (resultContent.Status)
                {
                    await _boxingInfoRepository.AddDataNavAsync(boxing);
                }
                return resultContent;
            }
 
            // TODO 判断在途数量
 
            var needBarcode = await SqlSugarHelper.DbWCS.Queryable<dt_needBarcode>().FirstAsync(x => x.productLine == STATION.productLine && x.fromArea == "CW");
            var needCount = needBarcode.inLineNum = BaseDal.QueryData(x => x.TargetAddress == STATION.stationChildCode).Count();
            //var count = BaseDal.QueryData(x => x.TargetAddress == stationManagers[0].Roadway).Count;
            if (needCount < needBarcode.cacheNum)
            {
                // 送至包装
                List<string> strings = stationManagers.Where(x => x.stationType == 0 && x.productLine == input.ProductionLine).Select(x => x.Roadway).ToList();
                var x = await SqlSugarHelper.DbWCS.Updateable<dt_needBarcode>()
                    .SetColumns(x => x.inLineNum == x.inLineNum + 1)
                    .Where(x => x.id == needBarcode.id).ExecuteCommandHasChangeAsync();
                ConsoleHelper.WriteSuccessLine($"在途数量添加{(x ? "成功" : "失败")}数量+1,当前工序{boxing.ProcessCode},产线{input.ProductionLine}");
                LogFactory.GetLog("OCVB").InfoFormat(true, $"在途数量添加{(x ? "成功" : "失败")}数量+1,当前工序{boxing.ProcessCode},产线{input.ProductionLine}", "无参数");
                return await CreateNewTask(input, input.ProductionLine, boxing.ProcessCode, strings, 3);
            }
            else
            {
                var config = _configService.GetByConfigKey("SYS_InStacker", "CW3InStacker");
                var strings = config.ConfigValue.Split(',').ToList();
                // 入库送至常温3
                var resultContent = await CreateNewTask(input, input.ProductionLine, boxing.ProcessCode, strings);
                if (resultContent.Status)
                {
                    await _boxingInfoRepository.AddDataNavAsync(boxing);
                }
                return resultContent;
            }
        }
        catch (Exception ex)
        {
            ConsoleHelper.WriteErrorLine(ex.Message);
            LogFactory.GetLog("OCVB").InfoFormat(true, $",异常信息:{ex.Message},{ex.StackTrace}", "无参数");
            return content.Error(ex.Message);
        }
    }
 
    /// <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 await HandleErrorCells(input, area);
            //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;
        //if (areaIn == "GWSC1")
        //{
        //    strings = new List<string>
        //    {
        //        (boxing.ProductionLine != null && boxing.ProductionLine == "ZJ-7") ? "GWSC1" : "GWSC2"
        //    };
        //}
        //else
        //{
        //    strings = stationManagers.Roadway.Split(',').ToList();
        //}
 
        List<string> strings = stationManagers.Roadway.Split(',').ToList();
 
        var resultContent = await CreateNewTask(input, result.ProductionLine, boxing.ProcessCode, 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, input.ProductionLine, "", 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,
            ProductionLine = task.ProductionLine,
        };
        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));
    }
}