lxw
2023-03-16 f652e29b4d38f1faffd0388ebe492d7c1a7942f8
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
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
package com.whyc.service;
 
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.whyc.dto.BattTestData;
import com.whyc.dto.Response;
import com.whyc.mapper.BattInfMapper;
import com.whyc.mapper.BattRtstateMapper;
import com.whyc.mapper.BattdischargePlanMapper;
import com.whyc.pojo.*;
import com.whyc.util.ActionUtil;
import com.whyc.util.DateUtil;
import org.springframework.stereotype.Service;
 
import javax.annotation.Resource;
import java.text.ParseException;
import java.util.*;
import java.util.stream.Collectors;
 
@Service
public class BattdischargePlanService {
    @Resource
    private BattdischargePlanMapper mapper;
 
    @Resource
    private BattInfMapper battInfMapper;
 
    @Resource
    private BattRtstateMapper rtstateMapper;
 
    @Resource
    private BatttestdataInfService testInfService;
 
    @Resource
    private BaoJiGroupBattGroupService baoJiGroupBattGroupService;
 
    //查询
    public Response serchByCondition(BattdischargePlan battdischargePlan) {
        PageHelper.startPage(battdischargePlan.getPage().getPageCurr(), battdischargePlan.getPage().getPageSize());
        UserInf uinf = ActionUtil.getUser();
        battdischargePlan.setUId(uinf.getUId().intValue());
        List list = mapper.serchByCondition(battdischargePlan);
        PageInfo pageInfo = new PageInfo(list);
        return new Response().set(1, pageInfo);
    }
    //websocket查询,uId通过前端传递
    public Response searchByConditionOfWebSocket(BattdischargePlan battdischargePlan){
        PageHelper.startPage(battdischargePlan.getPage().getPageCurr(),battdischargePlan.getPage().getPageSize());
        List list=mapper.serchByCondition(battdischargePlan);
        PageInfo pageInfo=new PageInfo(list);
        return new Response().set(1,pageInfo);
    }
 
    //删除
    public Response delete(int num) {
        int flag=mapper.deleteById(num);
        return new Response().set(flag>0?1:0);
    }
    //创建计划-查询
    public Response serchBattPlan(String stationName1,String stationName2,String stationName5,String stationId) {
        UserInf uinf=ActionUtil.getUser();
        List list=battInfMapper.serchBattPlan(stationName1,stationName2,stationName5,stationId,uinf.getUId().intValue());
        PageInfo pageInfo=new PageInfo(list);
        return new Response().set(1,pageInfo);
    }
    //创建计划-创建计划
    public Response getBattSate(int battGroupId) {
        BattRtstate brt=rtstateMapper.getCurrentSate(battGroupId);
        Response response=new Response();
        if(brt != null){
            response.setCode(1);
            Calendar instance = Calendar.getInstance();
            instance.add(Calendar.MINUTE,-1);
            Date time = instance.getTime();
            if(time.compareTo(brt.getRecDatetime())>0){
                response.setMsg("通讯故障");
            }else{
                /**
                 * 0    未知
                 * 1    浮充
                 * 2    充电
                 * 3    放电
                 * 4    均充
                 */
                switch (brt.getBattState()){
                    case 0 : response.setMsg("未进行充放电操作"); break;
                    case 1 : response.setMsg("浮充"); break;
                    case 2 : response.setMsg("充电"); break;
                    case 3 : response.setMsg("放电"); break;
                    case 4 : response.setMsg("均充"); break;
                }
 
            }
        }else{
            response.setMsg("无法查询到该电池当前状态");
        }
        return response;
    }
    //启用/延时/取消放电计划/修改放电参数
    public Response updatePro(List<BattdischargePlan> list) {
        int flag=mapper.updatePro(list);
        return  new Response().set(flag>0?1:0);
    }
    //校验需要添加的计划参数 放电计划处于等待启动0,放电延时1,放电计划进行中3,充电进行中5
    public Response judgePlan(List<BattdischargePlan> bplans) {
        List<BattdischargePlan> list = new ArrayList();//存放满足计划设定条件的可行计划
        if(bplans!=null&&bplans.size()>0){
            for(int i=0;i<bplans.size();i++){
                List flag=mapper.judgePlan(bplans.get(i));
                if(flag!=null&&flag.size()>0){//判断通过是否数据库存在同机房放电计划,满足条件
                    if(list.size()>0){
                        int judge=judgeList(bplans.get(i), list);
                        if(judge==1){////判断通过时间相隔3天,满足条件
                            list.add(bplans.get(i));
                        }else{
                            continue;
                        }
                    }else{
                        list.add(bplans.get(i));
                    }
 
                }
            }
        }
        PageInfo pageInfo = new PageInfo(list);
        return  new Response().set(1,pageInfo);
    }
    //放电计划中添加计划时,有没有出现同机房存在电池组有计划
    public  int judgeList(Object obj1,Object obj2){
        BattdischargePlan bplan=(BattdischargePlan) obj1;
        List<BattdischargePlan> list=(List<BattdischargePlan>) obj2;
        int flag=1;
        if(list!=null&&list.size()>0){
            for(int i=0;i<list.size();i++){
 
                if(bplan.getNote().equals(list.get(i).getNote())){
                    int hours=ActionUtil.HoursBetween(bplan.getDischargeStarttime(), list.get(i).getDischargeStarttime1());
                    if(hours< BattTestData.hoursBetween){
                        flag=0;
                        break;
                    }
                }
            }
        }
        return flag;
    }
 
    //创建计划-创建计划
    public Response addPro(List<BattdischargePlan> list) {
        int flag = mapper.addPro(list);
        return new Response().set(flag > 0 ? 1 : 0);
    }
 
    public List<BattMapInformation> findTimeoutStation() {
        return mapper.findTimeoutStation();
    }
 
    //监控层首页:今日放电任务统计
    public Response getPlanStaticToday(int userId) {
        Response planRes = new Response<>();
        try {
            Map<String, Object> map = new HashMap<>();
            //查询今天所有正在放电的机房总数
            int disNumAll = testInfService.getPlanStaticToday(userId);
 
            //Map<String, Integer> stateNumMap = new HashMap<>();
            Map<String, Object> stateMap = new HashMap<>();
            List<BattdischargePlan> stateList = mapper.getPlanStaticToday(userId);
            Map<Integer, List<BattdischargePlan>> stateDisMap = stateList.stream().collect(Collectors.groupingBy(BattdischargePlan::getDischargeState));
           /* stateNumMap.put("state0", 0);
            stateNumMap.put("state1", 0);
            stateNumMap.put("state3", 0);*/
            stateMap.put("state0", new ArrayList<>());
            stateMap.put("state1", new ArrayList<>());
            stateMap.put("state3", new ArrayList<>());
            for (Integer dischargeState : stateDisMap.keySet()) {
                //stateNumMap.put("state" + String.valueOf(dischargeState), stateDisMap.get(dischargeState).size());
                stateMap.put("state" + String.valueOf(dischargeState), stateDisMap.get(dischargeState));
            }
           /* Map<String, Integer> nodeNumMap = new HashMap<>();
            nodeNumMap.put("node0", 0);
            nodeNumMap.put("node1", 0);*/
            Map<String, Object> nodeMap = new HashMap<>();
            nodeMap.put("node0", new ArrayList<>());
            nodeMap.put("node1", new ArrayList<>());
            Map<Integer, List<BattdischargePlan>> nodeDisMap = stateList.stream().collect(Collectors.groupingBy(BattdischargePlan::getNodeStation));
            for (Integer node : nodeDisMap.keySet()) {
                //nodeNumMap.put("node" + String.valueOf(node), nodeDisMap.get(node).size());
                nodeMap.put("node" + String.valueOf(node), nodeDisMap.get(node));
            }
            //stateNumMap.put("sumNum", stateList.size());
            //map.put("stateNumMap", stateNumMap);
            map.put("stateMap", stateMap);
            // map.put("nodeNumMap", nodeNumMap);
            map.put("nodeMap", nodeMap);
            map.put("disNumAll", disNumAll);
            planRes.setII(1, stateList.size() > 0, map, "今日放电任务统计");
        } catch (Exception e) {
            planRes.set(1, false, "出现异常" + e.getMessage());
        }
 
        return planRes;
    }
    /**
     * 原则:
     * 0.每个站点只取第一组电池参与放电计划
     * 1.每天最多1个节点站,每天最多3个放电站点
     * 2.各班组尽量扁平,尽量保证各个组完全放电完成时间接近
     * @return
     * @param resetCapPercent
     * @param startTimeStr
     */
    public Response generateDischargePlan(Float resetCapPercent, String startTimeStr) throws ParseException {
        Date startTime = DateUtil.YYYY_MM_DD_HH_MM_SS.parse(startTimeStr);
        Calendar planTime = Calendar.getInstance();
        planTime.setTime(startTime);
        //查询所有可用的组以及每个组的站点
        List<BaojiGroupBattGroup> baoJiGroupListWithinBattGroupList = baoJiGroupBattGroupService.getBaoJiGroupListWithinBattGroupList();
        List<BattdischargePlan> planList = new LinkedList<>();
        int planListSize = 1;
        while (planList.size()!= planListSize){ //当相等时,说明每天计划已经为0,计划完结
            List<BattdischargePlan> subPlanList =  getDischargePlanList(baoJiGroupListWithinBattGroupList,planTime);
            //添加到电池放电计划List
            planList.addAll(subPlanList);
            //baoJiGroupListWithinBattGroupList重置为当前baoJiGroupListWithinBattGroupList-battGroupList
 
            //按日递增计划时间
            planTime.add(Calendar.DAY_OF_MONTH,1);
            planListSize = planList.size();
        }
 
        return null;
    }
 
    /**
     * 根据逻辑获取一天的
     * 模型1:
     *        -1: 2组2非节(包含本组情况,只是包含本组情况优先级低)
     *        -2: 1组2非节(包含本组情况,只是包含本组情况优先级低)
     * 1组1节 -3: 1组1非节(包含本组情况,只是包含本组情况优先级低)
     *        -4: 0非节
     *
     * 模型2:
     *
     *       ->3组3非节
     *       ->2组3非节
     * 0组1节->1组3非节
     *       ->2组2非节
     *       ->1组2非节
     *       ->1组1非节
     *
     *
     *
     * @param baoJiGroupListWithinBattGroupList
     * @param planTime
     * @return
     */
    private List<BattdischargePlan> getDischargePlanList(List<BaojiGroupBattGroup> baoJiGroupListWithinBattGroupList, Calendar planTime) {
        List<BattdischargePlan> planList = new LinkedList<>();
        int nodeStationExists = 0;
        for (int i = 0; i < baoJiGroupListWithinBattGroupList.size(); i++) {
            //一条记录就是一组,组内包含了所有性质的站点
            //先确定是否存在节点,存在则加入到计划. 没有则执行没有节点的模型
            BaojiGroupBattGroup groupWithBattStationList = baoJiGroupListWithinBattGroupList.get(i);
            List<Battinf> battStationList = groupWithBattStationList.getBattGroupList();
            for (int j = 0; j < battStationList.size(); j++) {
                Battinf battinf = battStationList.get(j);
                if(battinf.getNodeStation()==1){
                    //找到节点
                    BattdischargePlan plan = new BattdischargePlan();
                    plan.setBattgroupid(battinf.getBattGroupId());
                    plan.setBattGroupName(battinf.getBattGroupName());
                    plan.setNodeStation(1);
                    plan.setNum(groupWithBattStationList.getBaojiGroupId());//记录计划内的组号
                    plan.setNote(String.valueOf(i));//记录计划内的组号对应的索引
                    planList.add(plan);
                    nodeStationExists = 1;
                    break; //当前组当前排站点级别降低,只要其他组能排,不会再选择当前组.
                }
            }
            //判断是否找到节点,找到节点则退出此次遍历
            if(nodeStationExists == 1){
                break;
            }
        }
 
        //判断是否找到节点,找到则执行模型1
        if(nodeStationExists == 1){
            //节点在的组优先级降低
            Integer planedBaoJiGroupId = planList.get(0).getNum();
            //模型1-1是否成立
            for (int i = 0; i < baoJiGroupListWithinBattGroupList.size(); i++) {
                BaojiGroupBattGroup groupWithBattStationList = baoJiGroupListWithinBattGroupList.get(i);
                Integer baojiGroupId = groupWithBattStationList.getBaojiGroupId();
                if(planedBaoJiGroupId.equals(baojiGroupId)){
                    break; //先看能否满足2组2非节(非本组)
                }
                List<Battinf> battStationList = groupWithBattStationList.getBattGroupList();
                for (int j = 0; j < battStationList.size(); j++) {
                    Battinf battinf = battStationList.get(j);
                    if(battinf.getNodeStation()==0){
                        BattdischargePlan plan = new BattdischargePlan();
                        plan.setBattgroupid(battinf.getBattGroupId());
                        plan.setBattGroupName(battinf.getBattGroupName());
                        plan.setNodeStation(0);
                        plan.setNum(groupWithBattStationList.getBaojiGroupId());//记录计划内的组号
                        plan.setNote(String.valueOf(i));//记录计划内的组号对应的索引
                        planList.add(plan);
                        break; //当前组当前排站点级别降低,只要其他组能排,不会再选择当前组.
                    }
                }
                //遍历过程中,查看计划是否满足3个站点,已经满足则提前结束计划分配
                if(planList.size()==3){ //模型1-1成立
                    break;
                }
            }
            //遍历完毕,查看计划是否满足3个站点
            //如果不满足,则把已排组的站点继续允许分配,优先遍历非节点站所在组
            //如果还不满足,则继续分配,允许遍历节点站所在组
            int size = planList.size();
            if(size!=3){
                //如果计划站点数是2,说明计划1为节点站,计划2为非节点站,优先计划2所在非节点站所在组去分配
                int notNodeStationExists = 0;
                if(size==2){
                    int indexNotNode = Integer.parseInt(planList.get(1).getNote());
                    BaojiGroupBattGroup groupWithBattStationList = baoJiGroupListWithinBattGroupList.get(indexNotNode);
                    List<Battinf> battStationList = groupWithBattStationList.getBattGroupList();
                    for (int j = 0; j < battStationList.size(); j++) {
                        Battinf battinf = battStationList.get(j);
                        if(battinf.getNodeStation()==0){
                            BattdischargePlan plan = new BattdischargePlan();
                            plan.setBattgroupid(battinf.getBattGroupId());
                            plan.setBattGroupName(battinf.getBattGroupName());
                            plan.setNodeStation(0);
                            plan.setNum(groupWithBattStationList.getBaojiGroupId());//记录计划内的组号
                            planList.add(plan);
                            notNodeStationExists = 1;
                            break;//找到可分配的,终止
                        }
                    }
                    if(notNodeStationExists != 1){ //在非节点站所在组没找到其他非节点,只能从节点站所在组去分配
                        int indexNode = Integer.parseInt(planList.get(0).getNote());
                        BaojiGroupBattGroup groupHavingNodeWithBattStationList = baoJiGroupListWithinBattGroupList.get(indexNode);
                        List<Battinf> battStationList2 = groupHavingNodeWithBattStationList.getBattGroupList();
                        for (int j = 0; j < battStationList2.size(); j++) {
                            Battinf battinf = battStationList2.get(j);
                            if(battinf.getNodeStation()==0){
                                BattdischargePlan plan = new BattdischargePlan();
                                plan.setBattgroupid(battinf.getBattGroupId());
                                plan.setBattGroupName(battinf.getBattGroupName());
                                plan.setNodeStation(0);
                                plan.setNum(groupHavingNodeWithBattStationList.getBaojiGroupId());//记录计划内的组号
                                planList.add(plan);
                                break;//找到可分配的,终止
                            }
                        }
                    }
                }
                //如果计划站点数是1,说明只有1个节点站,继续从节点站所在组去分配
                else{
                    int indexNode = Integer.parseInt(planList.get(0).getNote());
                    BaojiGroupBattGroup groupHavingNodeWithBattStationList = baoJiGroupListWithinBattGroupList.get(indexNode);
                    List<Battinf> battStationList2 = groupHavingNodeWithBattStationList.getBattGroupList();
                    for (int j = 0; j < battStationList2.size(); j++) {
                        Battinf battinf = battStationList2.get(j);
                        if(battinf.getNodeStation()==0){
                            BattdischargePlan plan = new BattdischargePlan();
                            plan.setBattgroupid(battinf.getBattGroupId());
                            plan.setBattGroupName(battinf.getBattGroupName());
                            plan.setNodeStation(0);
                            plan.setNum(groupHavingNodeWithBattStationList.getBaojiGroupId());//记录计划内的组号
                            planList.add(plan);
                            break;//找到可分配的,终止
                        }
                    }
                }
            }
 
            //模型1-2是否成立
            /*for (int i = 0; i < baoJiGroupListWithinBattGroupList.size(); i++) {
                BaojiGroupBattGroup groupWithBattStationList = baoJiGroupListWithinBattGroupList.get(i);
                List<Battinf> battStationList = groupWithBattStationList.getBattGroupList();
                for (int j = 0; j < battStationList.size(); j++) {
                    Battinf battinf = battStationList.get(j);
                }
            }
            //模型1-3是否成立
            for (int i = 0; i < baoJiGroupListWithinBattGroupList.size(); i++) {
                BaojiGroupBattGroup groupWithBattStationList = baoJiGroupListWithinBattGroupList.get(i);
                List<Battinf> battStationList = groupWithBattStationList.getBattGroupList();
                for (int j = 0; j < battStationList.size(); j++) {
                    Battinf battinf = battStationList.get(j);
                }
            }
            //模型1-4是否成立
            for (int i = 0; i < baoJiGroupListWithinBattGroupList.size(); i++) {
                BaojiGroupBattGroup groupWithBattStationList = baoJiGroupListWithinBattGroupList.get(i);
                List<Battinf> battStationList = groupWithBattStationList.getBattGroupList();
                for (int j = 0; j < battStationList.size(); j++) {
                    Battinf battinf = battStationList.get(j);
                }
            }*/
        }
        //未找到节点,执行模型2
        else{
 
        }
 
        return null;
    }
 
 
}