pjb
2025-03-13 19e6e3559842d23fc5bd4f28a688dd8c2c747d4b
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
package com.zy.asrs.wms.asrs.timer;
 
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.plugins.IgnoreStrategy;
import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper;
import com.zy.asrs.framework.exception.CoolException;
import com.zy.asrs.wms.asrs.entity.*;
import com.zy.asrs.wms.asrs.entity.enums.CacheSiteStatusType;
import com.zy.asrs.wms.asrs.entity.enums.OrderSettleType;
import com.zy.asrs.wms.asrs.entity.enums.TaskStsType;
import com.zy.asrs.wms.asrs.service.*;
import com.zy.asrs.wms.system.entity.Dict;
import com.zy.asrs.wms.system.service.DictService;
import com.zy.asrs.wms.utils.OrderUtils;
import com.zy.asrs.wms.utils.Utils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
 
import java.util.*;
import java.util.stream.Collectors;
 
@Component
public class TaskWaveTimer {
 
    @Autowired
    private TaskService taskService;
    @Autowired
    private TaskDetlService taskDetlService;
    @Autowired
    private OrderService orderService;
    @Autowired
    private OrderDetlService orderDetlService;
    @Autowired
    private OrderUtils orderUtils;
    @Autowired
    private CacheSiteService cacheSiteService;
    @Autowired
    private WaveSeedService waveSeedService;
    @Autowired
    private DictService dictService;
 
    /**
     * modifty:
     * original : fetch datasource of task type on WCS_EXECUTE_OUT_TASK_DONE
     * now: Fetch datasource of task type  on WCS_EXECUTE_OUT_ARRIVED, After completing the task and for setting  the task type equal to GENERATE_WAVE_SEED
     */
    @Scheduled(cron = "0/3 * * * * ? ")
    @Transactional(rollbackFor = Exception.class)
    public void taskWave() {
        InterceptorIgnoreHelper.handle(IgnoreStrategy.builder().tenantLine(true).build());
        try {
            Dict dict = dictService.getOne(new LambdaQueryWrapper<Dict>().eq(Dict::getFlag, "autoCreateWaveSeed").eq(Dict::getStatus, 1));
            if (dict == null) {
                return;
            }
            String autoCreateWaveSeed = dict.getValue();
            if (!autoCreateWaveSeed.equals("true")) {
                return;
            }
            //查询状态为RCS任务完成所有任务单据
//            List<Task> taskList = taskService.list(new LambdaQueryWrapper<Task>().eq(Task::getTaskSts, TaskStsType.WAVE_SEED.id));
            List<Task> taskList = taskService.list(new LambdaQueryWrapper<Task>().eq(Task::getTaskSts, TaskStsType.WCS_EXECUTE_OUT.id));            HashSet<String> sycMatnrs = new HashSet<>();
            if (taskList.isEmpty()) {
//                throw new CoolException("没有可播种任务!!");
            } else {
                for (Task task : taskList) {
                    Long hostId = task.getHostId();
 
                    List<TaskDetl> taskDetls = taskDetlService.list(new LambdaQueryWrapper<TaskDetl>().eq(TaskDetl::getTaskId, task.getId()).eq(TaskDetl::getHostId, hostId));
                    if (taskDetls.isEmpty()) {
                        continue;
                    }
                    // 过滤已经生成波次播种数据的任务  该任务的任务明细号不能在播种数据表里面
                    long count = waveSeedService.count(new LambdaQueryWrapper<WaveSeed>().in(WaveSeed::getTaskDetlId, taskDetls.stream().map(TaskDetl::getId).collect(Collectors.toList())).eq(WaveSeed::getHostId, hostId));
                    if (count > 0) {
                        continue;
                    }
 
                    for (TaskDetl taskDetl : taskDetls) {
                        //分配订单
                        Long waveId = taskDetl.getWaveId();
                        //同一个物料只添加一次播种任务
                        if(sycMatnrs.contains(taskDetl.getMatnr())) {
                            continue;
                        }
                        sycMatnrs.add(taskDetl.getMatnr());
 
                        List<Order> list = orderService.list(new LambdaQueryWrapper<Order>().eq(Order::getWaveId, waveId));
                        if (list.isEmpty()) {
                            continue;
                        }
 
                        ArrayList<Long> orderIds = new ArrayList<>();
                        for (Order order : list) {
                            orderIds.add(order.getId());
                        }
 
                        String matUniqueKey = Utils.getMatUniqueKey(taskDetl.getMatnr(), taskDetl.getBatch(), taskDetl.getUniqueField());
                        List<OrderDetl> orderDetls = orderDetlService.list(new LambdaQueryWrapper<OrderDetl>()
                                .in(OrderDetl::getOrderId, orderIds)
                                .eq(OrderDetl::getStockIndex, matUniqueKey)
                                .eq(OrderDetl::getHostId, hostId));
                        if(orderDetls.isEmpty()){
                            throw new CoolException("订单明细不存在");
                        }
 
                        Double anfme = taskDetl.getAnfme();
                        for (OrderDetl orderDetl : orderDetls) {
                            //fixme 作业中数量调整放至,生成出库任务成功后
                            double issued = Optional.of(orderDetl.getAnfme() - orderDetl.getQty() - orderDetl.getWorkQty()).orElse(0.0D);
                            if (issued <= 0.0D) { continue; }
                            if (anfme <= 0.0D) { break; }
 
                            double workQty = issued;
                            if(anfme - issued < 0){
                                workQty = anfme;
                            }
                            anfme -= workQty;
 
                            orderUtils.updateWorkQty(orderDetl.getId(), workQty, true);
//
                            //fixme 生成波次播种数据时,不自动添加站点绑定,站点绑定调整至出库绑定播种库位时更新
//                            CacheSite cacheSite = cacheSiteService.getOne(new LambdaQueryWrapper<CacheSite>().eq(CacheSite::getOrderId, orderDetl.getOrderId()).eq(CacheSite::getHostId, hostId));
//                            if (cacheSite == null) {
//                                throw new CoolException("缓存站空间不存在");
//                            }
 
                            WaveSeed waveSeed = new WaveSeed();
//                            waveSeed.setSiteId(cacheSite.getId());
//                            waveSeed.setSiteNo(cacheSite.getSiteNo());
                            waveSeed.setOrderNo(orderDetl.getOrderNo());
                            waveSeed.setOrderId(orderDetl.getOrderId());
                            waveSeed.setOrderDetlId(orderDetl.getId());
                            waveSeed.setWaveId(taskDetl.getWaveId()).setWaveNo(taskDetl.getWaveNo());
                            waveSeed.setTaskDetlId(taskDetl.getId());
                            //为满足当前需求,经确认,改成订单数量
                            waveSeed.setAnfme(orderDetl.getAnfme());
                            waveSeed.setWorkQty(0D);
                            waveSeed.setMatnr(taskDetl.getMatnr());
                            waveSeed.setBatch(taskDetl.getBatch());
                            waveSeed.setFieldParams(JSON.toJSONString(taskDetl.getUniqueField()));
                            waveSeed.setHostId(hostId);
                            if (!waveSeedService.save(waveSeed)) {
                                throw new CoolException("波次播种创建失败");
                            }
//                            cacheSite.setOrderId(orderDetl.getOrderId());
//                            cacheSite.setOrderNo(orderDetl.getOrderNo());
//                            cacheSite.setSiteStatus(CacheSiteStatusType.R.id);
//                            cacheSite.setUpdateTime(new Date());
//                            if (!cacheSiteService.updateById(cacheSite)) {
//                                throw new CoolException("缓存站更新失败");
//                            }
 
                        }
                    }
 
//                    task.setTaskSts(TaskStsType.GENERATE_WAVE_SEED.id);
//                    task.setUpdateTime(new Date());
//                    if (!taskService.updateById(task)) {
//                        throw new CoolException("任务更新失败");
//                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }finally {
            InterceptorIgnoreHelper.clearIgnoreStrategy();
        }
    }
 
}