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
package com.mes.rawglassdetails.service.impl;
 
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.kangaroohy.milo.model.ReadWriteEntity;
import com.kangaroohy.milo.service.MiloService;
import com.mes.common.config.Const;
import com.mes.rawglassdetails.entity.RawGlassStorageDetails;
import com.mes.rawglassdetails.entity.request.RawGlassRequest;
import com.mes.rawglassdetails.mapper.RawGlassStorageDetailsMapper;
import com.mes.rawglassdetails.service.RawGlassStorageDetailsService;
import com.mes.rawglasstask.entity.RawGlassStorageTask;
import com.mes.rawglasstask.service.RawGlassStorageTaskService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
 
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
 
/**
 * @author system
 * @since 2024-07-09 14:51:27
 */
@Service
@Slf4j
public class RawGlassStorageDetailsServiceImpl extends ServiceImpl<RawGlassStorageDetailsMapper, RawGlassStorageDetails> implements RawGlassStorageDetailsService {
 
    @Autowired
    RawGlassStorageTaskService rawGlassStorageTaskService;
 
    @Autowired(required = false)
    MiloService miloService;
 
    @Override
    public boolean deleteRawGlassStorageDetails(String device_id) {
        QueryWrapper<RawGlassStorageDetails> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("device_id", device_id);
        return remove(queryWrapper);//remove才是删除,delete得用另外的依赖,默认方法是remove返回bool
    }
 
    @Override
    //返回类型                    方法名              传输值
    public List<RawGlassStorageDetails> selectDetails() {
//        QueryWrapper<RawGlassStorageDetails>queryWrapper=new QueryWrapper<>();
//         queryWrapper.eq("id",rs.getId());
//        return list(queryWrapper);
        return list();
    }
 
 
    @Override
    public String warehousingRequest(int leftingStation) {
        RawGlassStorageDetails storageDetails = getOne(new LambdaQueryWrapper<RawGlassStorageDetails>()
                .in(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN_ALL));
        if (null != storageDetails) {
            log.info("当前吊装位有架子,结束本地入库请求");
            return "fail";
        }
        List<Integer> shelfList = listBySlotState(Const.RAW_GLASS_DEVICE, Const.RAW_GLASS_STATE_IN_ALL);
        if (CollectionUtils.isEmpty(shelfList)) {
            log.info("当前工位不存在可用的空架子");
            return "fail";
        }
        Integer shelf = shelfList.get(0);
        log.info("生成任务");
        try {
            generateTask(shelf, leftingStation, shelf, 0, Const.RAW_GLASS_TASK_TYPE_IN_REQUEST);
        } catch (Exception e) {
            return "fail";
        }
        //生成一条详情数据  仅记录架子状态
        RawGlassStorageDetails details = new RawGlassStorageDetails();
        details.setSlot(shelf);
        details.setShelf(shelf);
        details.setState(Const.RAW_GLASS_STATE_RUNNING);
        save(details);
        return "success";
    }
 
    @Override
    public String patternWarehousing(RawGlassRequest request) {
        RawGlassStorageDetails glassStorageDetails = getOne(new LambdaQueryWrapper<RawGlassStorageDetails>()
                .eq(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN)
                .eq(RawGlassStorageDetails::getSlot, request.getSlot()));
        if (null == glassStorageDetails) {
            log.info("当前吊装位没有架子");
        }
        //原片信息存入详情表
        BeanUtils.copyProperties(request, glassStorageDetails);
        log.info("覆盖后得到的工位详情信息为:{}", glassStorageDetails);
        updateById(glassStorageDetails);
        return "success";
    }
 
    @Override
    public String UpdateQuantity(RawGlassRequest request) {
        update(
                new LambdaUpdateWrapper<RawGlassStorageDetails>()
                        .set(RawGlassStorageDetails::getRemainQuantity, request.getRemainQuantity())
                        .eq(RawGlassStorageDetails::getSlot, request.getSlot())
                        .eq(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN));
        return "success";
    }
 
    @Override
    public String deleteWarehousing(Long slotId) {
        update(new LambdaUpdateWrapper<RawGlassStorageDetails>().eq(RawGlassStorageDetails::getSlot, slotId)
                .eq(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_OUT)
                .set(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN));
        return "success";
    }
 
    @Override
    public String outWarehousing(Long slotId) {
        update(new LambdaUpdateWrapper<RawGlassStorageDetails>().eq(RawGlassStorageDetails::getSlot, slotId)
                .eq(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN)
                .set(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_WAIT_OUT));
        //生成一条详情数据  仅记录架子状态
        return "success";
    }
 
    @Override
    public List<Integer> listBySlotState(List<Integer> liftingStation, List<Integer> state) {
        return baseMapper.listBySlotState(liftingStation, state);
    }
 
 
    @Override
    public String outWarehousingRequest(int leftingStation) {
        //对应工位是否有空架子
        RawGlassStorageDetails details = getOne(new LambdaQueryWrapper<RawGlassStorageDetails>().eq(RawGlassStorageDetails::getState, Const.GLASS_STATE_IN)
                .eq(RawGlassStorageDetails::getSlot, leftingStation));
        if (null == details) {
            log.info("无空架子,结束本地出片请求");
            return "fail";
        }
        //生成一条详情数据  仅记录架子状态
        update(new LambdaUpdateWrapper<RawGlassStorageDetails>()
                .eq(RawGlassStorageDetails::getSlot, details.getSlot())
                .eq(RawGlassStorageDetails::getState, Const.GLASS_STATE_IN)
                .set(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_RUNNING));
        try {
            generateTask(leftingStation, details.getShelf(), details.getShelf(), details.getRemainQuantity(), Const.RAW_GLASS_TASK_TYPE_OUT_REQUEST);
        } catch (Exception e) {
            return "fail";
        }
        return "success";
    }
 
    /**
     * 生成原片仓储任务
     *
     * @param startSlot
     * @param endSlot
     * @param patternQuantity
     * @param taskType
     * @return
     */
    @Override
    public boolean generateTask(int startSlot, int endSlot, int shelf, int patternQuantity, int taskType) throws Exception {
        RawGlassStorageTask task = RawGlassStorageTask.builder()
                .startSlot(startSlot)
                .endSlot(endSlot)
                .patternQuantity(patternQuantity)
                .taskType(taskType)
                .taskState(Const.RAW_GLASS_TASK_NEW)
                .shelf(shelf)
                .createTime(new Date()).build();
        rawGlassStorageTaskService.save(task);
 
 
        List<ReadWriteEntity> list = new ArrayList<>();
        list.add(generateReadWriteEntity("A01-CC.dev.taskWord", 1));
//        list.add(generateReadWriteEntity("A01-CC.dev.taskSending", 1));
        list.add(generateReadWriteEntity("A01-CC.dev.startSlot", startSlot));
        list.add(generateReadWriteEntity("A01-CC.dev.endSlot", endSlot));
        miloService.writeToOpcWord(list);
        return Boolean.TRUE;
    }
 
    private ReadWriteEntity generateReadWriteEntity(String identifier, int value) {
        ReadWriteEntity readWriteEntity = new ReadWriteEntity();
        readWriteEntity.setIdentifier(identifier);
        readWriteEntity.setValue(value);
        return readWriteEntity;
    }
}