严智鑫
2024-03-25 5fb507ab11cf9ac3d1bceae718bcb9bb50c37651
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
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
package com.example.springboot.service;
 
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.example.springboot.component.S7control;
import com.example.springboot.entity.StorageCage;
import com.example.springboot.entity.north_glass_buffer1;
import com.example.springboot.mapper.SpianMapper;
import com.google.common.primitives.Bytes;
 
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
 
@Service
public class SpianService {
    @Autowired
    private SpianMapper spianMapper;
 
    // @GetMapping("/all")
    public Short selectAll(String glassid) {
 
        int cage1 = 0;
        int cells;
        int ids;
        int prcid;
        int tiers;
        int prctier;
        double width;
        double minwidth = 0;
 
        north_glass_buffer1 glasslist = spianMapper.selectGlass(glassid); // 获取玻璃参数
        // 如果没有此id时
        if (glasslist == null) {
            return (300);
        }
 
        double widths = glasslist.getglasslengthmm();
        String orderids = glasslist.getordernumber();
        String FrameBarcode = glasslist.getFrameBarcode();
 
        List<String> adddresslist = new ArrayList<>();
        adddresslist.add("DB105.0");// 进片车起始位置
        adddresslist.add("DB105.2");// 进片车目标位置
        adddresslist.add("DB105.4");// 进片玻璃宽
        adddresslist.add("DB105.8");// 进片笼内已有玻璃数
        adddresslist.add("DB105.16");// 进片车启动 1为启动
 
        List<Short> datas = new ArrayList<>();
 
        // String orderid="A001";
        // 获取铝框相关度最高的笼子排序
        List<StorageCage> storageCage = spianMapper.selectAllFbarcode(FrameBarcode, widths, 400);
        // 判断铝框指定空格是否需要间隔空间
 
        if (storageCage.size() == 0) {
            storageCage = spianMapper.selectAll(orderids, FrameBarcode);
        }
 
        if (storageCage == null) {
            return (400);
        }
        for (StorageCage storageCage2 : storageCage) {
            // 保存订单优先顺序笼子号
            cage1 = storageCage2.getCage();
            // 判断该笼子号相邻最大的空格数
            int cages = spianMapper.selectCage(cage1);
 
            // 如果相邻笼子没有空格,或者有正在执行的出片任务时返回400
            if (cages == 0) {
                return (400);
            }
            StorageCage cages1;
            // 判断是否是第二片需要加间隔物
            prctier = spianMapper.selectsum(cage1, storageCage2.getCell());// 传给prc的格子内玻璃数
            if (prctier > 0) {
                cages1 = spianMapper.selectCage1(cage1, storageCage2.getCell(), widths + 400);
            } else {
                cages1 = spianMapper.selectCage1(cage1, storageCage2.getCell(), widths);
            }
            // 判断选中笼子是否有合适宽度空格
            // 有合适空格时进片
            if (cages1 != null && cages >= 1 && storageCage2.getDisabled() == 0) {
                ids = cages1.getId();// 数据库ID
                tiers = cages1.getTier();// 内外片
                cells = cages1.getCell();// 格子号
                //prcid = cages1.getPrcId();// 传给prc的目标地id
                width = cages1.getWidth();// 格子剩余宽度
                widths = glasslist.getglasslengthmm();
 
                // 执行进片
                datas.add((short) 1000);// 起始位置
                datas.add((short) 1);// 目标位置
                datas.add((short) widths);// 进片玻璃宽
                datas.add((short) prctier); // 玻璃数
                datas.add((short) 1);// 任务启动
                // 获取该格子内是否有玻璃
                int cellint = spianMapper.selectcell(cage1, cells);
                if (cellint == 1) {
                    // 将外片玻璃的数据更新到内片
                    spianMapper.UpdateDBCage(ids, cage1, cells, 1);
                    // 将新入的玻璃存入外片
 
                    spianMapper.UpdataAddCage2(orderids, glassid, glasslist, cage1, cells, ids - 1, 2);
                    spianMapper.UpdataAddCage1(widths, cage1, cells);// 减少格子宽度
 
                    S7control.getinstance().WriteWord(adddresslist, datas);
                    boolean qidong = listbool("DB105.16");
                    int qidong2 = 0;
                    if (qidong == true) {
                        qidong2 = 1;
                    }else{
                        while (qidong) {
                            S7control.getinstance().WriteWord("DB105.16", (short) 1);// 出片任务发送字改为1
                            qidong = listbool("DB105.16");
                        }
                    }
                    spianMapper.Inserttask(0, 0, 1000, ids, glassid.toString(), prctier,qidong2);// 新增任务
                    System.out.println("进片任务|" + datas);
 
                } else {
                    // 数据库修改笼子表新增一条玻璃
 
                    spianMapper.UpdataAddCage2(orderids, glassid, glasslist, cage1, cells, ids, 2);
                    spianMapper.UpdataAddCage1(widths, cage1, cells);// 减少格子宽度
 
                    S7control.getinstance().WriteWord(adddresslist, datas);
                    boolean qidong = listbool("DB105.16");
                    int qidong2 = 0;
                    if (qidong == true) {
                        qidong2 = 1;
                    }
                    spianMapper.Inserttask(0, 0, 1000, ids, glassid.toString(), prctier,qidong2);// 新增任务
                    System.out.println("进片任务|" + datas);
 
                }
                outmesid(glassid, "DB105.20");
                return (200);
 
            }
 
        }
        return (400);
 
    }
 
    public Short selectout2(String glassid) {
        // 定义PRC数据传送数组
        List<String> adddresslist = new ArrayList<>();
        char[] a = glassid.toCharArray();
 
        adddresslist.add("DB105.10");// 出片车起始位置
        adddresslist.add("DB105.12");// 出片车目标位置
        adddresslist.add("DB105.14");// 出片笼玻璃数
        adddresslist.add("DB105.18");// 出片车启动 1为启动
        List<Short> datas = new ArrayList<>();
        // 获取优先出片的位置
        StorageCage cageout = spianMapper.selectOut2(glassid);
        if (cageout == null) {
            return (300);
        }
 
        int cage = cageout.getCage(); // 储存出片位置,笼子格子几号玻璃
        int cell = cageout.getCell();// 出片格号
        int tier = cageout.getTier();// 出片内外片
        //int prcid = cageout.getPrcId();// prcid
        int prcid2;
        int ids;
        int cages;
        int cells;
        double glasswidth = cageout.getGlassWidth();
 
        // 判断玻璃内外片
        if (tier == 2) {
            int state = spianMapper.selectGlassState(cage, cell);// 获取格子数量
            // 判断玻璃可直接出片时
            // 修改数据库笼子表(出片)
            datas.add((short) 1);
            datas.add((short) 1000);
            datas.add((short) state);
            datas.add((short) 1);
            spianMapper.OverOutSlice(glassid.toString(), 1, 0);// 更新出片队列任务状态为进行中
            spianMapper.UpdataOutCage1(glasswidth, cage, cell);// 增加原格子宽度
            spianMapper.UpdataGlassCageState(glassid.toString(), 3);// 更改笼子表的玻璃状态
 
            System.out.println("出片任务|" + datas);
            S7control.getinstance().WriteWord(adddresslist, datas);// 派发出片车任务
            S7control.getinstance().WriteWord("DB105.18", (short) 1);// 出片任务发送字改为1
            boolean qidong = listbool("DB105.18");
            int qidong2 = 0;
            if (qidong == true) {
                qidong2 = 1;
            }else{
                while (qidong) {
                    S7control.getinstance().WriteWord("DB105.18", (short) 1);// 出片任务发送字改为1
                    qidong = listbool("DB105.18");
                }
            }
            spianMapper.Inserttask(1, 0, cageout.getId(), 1000, glassid, state, qidong2);// 新增任务
            outmesid(glassid, "DB105.34");// 派发出片ID
 
            return (200);// 结束
        } else {
            // 获取格子的玻璃数量
            int state = spianMapper.selectGlassState(cage, cell);
            // 判断内片是否需要调拨
            if (state == 1) {
                // spianMapper.UpdataGlassCage("", "", glasswidth, cage, cell, tier, 3);
                datas.add((short) 1);
                datas.add((short) 1000);
                datas.add((short) 1);
                datas.add((short) 1);
                spianMapper.OverOutSlice(glassid.toString(), 1, 0);// 更新出片队列任务状态为进行中
 
                spianMapper.UpdataOutCage1(glasswidth, cage, cell);// 增加原格子宽度
                spianMapper.UpdataGlassCageState(glassid, 3);// 更改笼子表的玻璃状态
 
                System.out.println("出片任务|" + datas);
                outmesid(glassid, "DB105.34");// 派发出片ID
                S7control.getinstance().WriteWord(adddresslist, datas);// 派发出片车任务
                S7control.getinstance().WriteWord("DB105.18", (short) 1);// 出片任务发送字改为1
                boolean qidong = listbool("DB105.18");
                int qidong2 = 0;
                if (qidong == true) {
                    qidong2 = 1;
                }else{
                    while (qidong) {
                        S7control.getinstance().WriteWord("DB105.18", (short) 1);// 出片任务发送字改为1
                        qidong = listbool("DB105.18");
                    }
                }
                spianMapper.Inserttask(1, 0, cageout.getId(), 1000, glassid, 1, qidong2);// 新增任务
                return (200);// 结束
 
            } else {
                // 玻璃需要调拨时,判断属于哪个半区的笼子
                if (cage < 6) {
                    StorageCage cagecell = spianMapper.selectGlassCage(cage, glasswidth, 0, 6, cell);
                    if (cagecell == null) {
                        return (300);
                    }
                    // 获取调拨位置进行调拨
                    //prcid2 = cagecell.getPrcId();// 调拨目标位PRCID
                    ids = cagecell.getId();// 调拨目标位ID
                    cages = cagecell.getCage();// 调拨目标位笼子
                    cells = cagecell.getCell();// 调拨目标位格子
 
                    // 填入调拨数据
                    datas.add((short) 1);// 调拨外片起始位置
                    datas.add((short) 1);
                    datas.add((short) 2);
                    datas.add((short) 1);
                    // 更换玻璃的笼子
                    String glassids = spianMapper.SelectGlassid(cage, cell); // 获取被调拨的玻璃id
                    spianMapper.UpdataGlassCageState(glassids, 3);// 更改笼子表的玻璃状态
                    spianMapper.UpdateDBCage(ids, cage, cell, 2);// 将原格子数据更新到新格子里
                    spianMapper.UpdataAddCage1(glasswidth, cages, cells);// 减少新格子宽度
                    spianMapper.UpdataOutCage1(glasswidth, cage, cell);// 增加原格子宽度
                    // 传输mes数据,坐标,数据
                    System.out.println("出片任务|" + datas);
                    S7control.getinstance().WriteWord(adddresslist, datas);// 派发出片车任务
                    S7control.getinstance().WriteWord("DB105.18", (short) 1);// 出片任务发送字改为1
                    outmesid(glassids, "DB105.34");// 派发调拨玻璃ID
 
                    boolean qidong = listbool("DB105.18");
                    int qidong2 = 0;
                    if (qidong == true) {
                        qidong2 = 1;
                    }else{
                        while (qidong) {
                            S7control.getinstance().WriteWord("DB105.18", (short) 1);// 出片任务发送字改为1
                            qidong = listbool("DB105.18");
                        }
                    }
                    spianMapper.Inserttask(2, 0, cageout.getId(), ids, glassids, 2, qidong2);// 新增调度任务
 
                    return (200); // 结束
 
                } else {// 笼子号大于5时
                    StorageCage cagecell = spianMapper.selectGlassCage(cage, glasswidth, 5, 11, cell);
                    if (cagecell == null) {
                        return (300);
                    }
                    // 获取调拨位置进行调拨
                    //prcid2 = cagecell.getPrcId();// 调拨目标位prcID
                    ids = cagecell.getId();// 调拨目标位ID
                    cages = cagecell.getCage();// 调拨目标位笼子
                    cells = cagecell.getCell();// 调拨目标位格子
                    // 填入调拨数据
                    datas.add((short) 1);
                    datas.add((short) 1);
                    datas.add((short) 2);
                    datas.add((short) 1);
                    String glassids = spianMapper.SelectGlassid(cage, cell); // 获取被调拨的玻璃id
                    // 传输mes数据,坐标,数据
                    System.out.println("出片任务|" + datas);
                    S7control.getinstance().WriteWord(adddresslist, datas);// 派发出片车任务
                    S7control.getinstance().WriteWord("DB105.18", (short) 1);// 出片任务发送字改为1
 
                    outmesid(glassids, "DB105.34");// 派发调拨玻璃ID
                    spianMapper.UpdataGlassCageState(glassids, 3);// 更改笼子表的玻璃状态
                    boolean qidong = listbool("DB105.18");
                    int qidong2 = 2;
                    if (qidong == true) {
                        qidong2 = 1;
                    }else{
                        while (qidong) {
                            S7control.getinstance().WriteWord("DB105.18", (short) 1);// 出片任务发送字改为1
                            qidong = listbool("DB105.18");
                        }
                    }
                    spianMapper.Inserttask(2, 0, cageout.getId() + 1, ids, glassids, 2, qidong2);// 新增调度任务
                    spianMapper.UpdateDBCage(ids, cage, cell, 2);// 将原格子数据更新到新格子里
                    spianMapper.UpdataAddCage1(glasswidth, cages, cells);// 减少新格子宽度
                    spianMapper.UpdataOutCage1(glasswidth, cage, cell);// 增加原格子宽度
 
                    return (200);// 结束
 
                }
            }
        }
 
    }
 
    // 派发任务玻璃id
    public void outmesid(String glassid, String address) {
        // System.out.println("outmesid:" + glassid);
        List<Byte> glassidlist = new ArrayList();
        char ds[] = glassid.toCharArray();
        for (char iditem : ds) {
            glassidlist.add((byte) iditem);
        }
        byte[] bytes = Bytes.toArray(glassidlist);
        System.out.println("outmesidbytes:" + bytes.length);
        S7control.getinstance().WriteByte(address, bytes);// 派发出片id
 
    }
 
    // 获取地址内的玻璃id转字符串
    public StringBuilder queGlassid(String address, int count) {
        StringBuilder writedstrIdOut = new StringBuilder();
        byte[] writedglassidbytesOut = S7control.getinstance().ReadByte(address, count);
        if (writedglassidbytesOut != null) {
            // 获取玻璃id
            for (byte iditem : writedglassidbytesOut) {
                writedstrIdOut.append((char) iditem);
            }
        }
        return writedstrIdOut;
    }
 
    // char数组转化成bit数组
    public static byte[] toBytes(char[] chars) {
        String s = new String(chars);
        return s.getBytes(StandardCharsets.UTF_8);
    }
 
    // bit数组转化成char数组
    public static char[] toChars(byte[] bytes) {
        String s = new String(bytes, StandardCharsets.UTF_8);
        return s.toCharArray();
    }
 
    // 判断集合里是否为1
    public boolean listbool(String address) {
        List<Short> list = S7control.getinstance().ReadWord(address, 1);// 返回为ture时为1
        boolean listbool = list.contains((short) 1);
        return listbool;
    }
 
    // 根据玻璃id完成在进行中的任务
    public void overtask(String glassid) {
 
        spianMapper.UpdatetaskOut(glassid.toString());// 完成上一次 出片或者进片任务
        spianMapper.OverOutSlice(glassid.toString(), 2, 1);// 完成出片队列任务
        spianMapper.UpdataGlassCage(glassid.toString(), 0);// 清除出片格子玻璃信息
        spianMapper.UpdateCageOver(glassid.toString(), 0);// 更改笼子表出片状态
        spianMapper.UpdateCageadd(glassid.toString(), 1);// 更改笼子表进片状态
        String barcode = spianMapper.SelectBarcode(glassid.toString());// 获取该玻璃的铝框id
        spianMapper.UpdateAddQueue(glassid.toString());// 把进片的玻璃更新到出片队列中
        // if (barcode != null) {
        // int barcodeState = spianMapper.SelectOverState(barcode);// 获取该铝框的状态
        // if (barcodeState == 0) {// 当该铝框所有的玻璃都是完成状态时删除在出片队列的数据
        // spianMapper.DeleteQueue(barcode);
        // }
        // }
 
    }
 
}