liulin
2025-07-09 512ddb42f73f1560661865225dd03870e021e1d2
src/main/java/com/lunhan/water/service/PaymentRecordsService.java
@@ -46,6 +46,7 @@
import java.lang.reflect.Type;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
import java.util.stream.Collectors;
@@ -77,6 +78,10 @@
    private HeartbeatDataMapperImpl heartbeatDataMapper;
    @Autowired
    private FacilityAlarmRecordMapperImpl facilityAlarmRecordMapper;
    @Autowired
    private WaterFacilityRecordsMapperImpl waterFacilityRecordsMapper;
    @Autowired
    private AlarmHistoryMapperImpl alarmHistoryMapper;
    public ExecutedResult<Long> create(ReqCreatePaymentRecords request) {
        // 转换po
@@ -230,11 +235,10 @@
            return ExecutedResult.failed("余额水量不足!");
        }
        //发送mqtt取水指令
        String topic = "zundong/" + facilityPO.getFacilityCode() + "/switch";
        String topic = "zundong/" + facilityPO.getFacilityCode() + "/send";
        JsonObject data = new JsonObject();
        data.addProperty(facilityPO.getFacilityCode() + "_amount", request.getAmount().multiply(BigDecimal.valueOf(100)));
        data.addProperty(facilityPO.getFacilityCode() + "_user", userLoginPO.getUserCode());
        data.addProperty(facilityPO.getFacilityCode() + "_state", 1);
        data.addProperty(facilityPO.getFacilityCode() + "_count2", request.getAmount().multiply(BigDecimal.valueOf(100)));
        data.addProperty(facilityPO.getFacilityCode() + "_state2", 1);
        boolean send=false;
        if (Objects.nonNull(mqttServer)) {
            send = mqttServer.send(topic, data.toString());
@@ -252,6 +256,35 @@
        if(!send){
            ExecutedResult.failed("通讯断开!");
        }
        //扣除余额
        //创建消费记录
        PaymentRecordsPO recordsPO=new PaymentRecordsPO();
        recordsPO.setUserId(userLoginPO.getId());
        recordsPO.setUserName(userLoginPO.getUserName());
        recordsPO.setFacilityCode(facilityPO.getFacilityCode());
        recordsPO.setPaymentAmount(request.getAmount());
        recordsPO.setWaterAmount(request.getAmount());
        recordsPO.setPayTime(LocalDateTimeUtil.nowDateTimeStr());
        recordsPO.setPayStatus(EBillPayStatus.PAID.getValue());
        recordsPO.setComment("取水");
        recordsPO.setCreateTime(LocalDateTimeUtil.nowTimeStamp());
        mapper.insert(recordsPO);
        //修改余额
        BigDecimal beforeMoney=userLoginPO.getBalance();
        BigDecimal subtract = beforeMoney.subtract(request.getAmount());
        userLoginPO.setBalance(subtract);
        userLoginMapper.updateById(userLoginPO);
        //生成余额变动记录
        UserCapitalChangePO changePO=new UserCapitalChangePO();
        changePO.setUserId(userLoginPO.getId());
        changePO.setBusiness(ECapitalChange.WATER_BILL_COUNTER_PAY.getValue());
        changePO.setBusinessName("取水");
        changePO.setBusinessCode("QS"+SnowFlakeUtil.getId());
        changePO.setChangeMoney(request.getAmount());
        changePO.setBeforeMoney(beforeMoney);
        changePO.setAfterMoney(subtract);
        changePO.setCreateTime(LocalDateTimeUtil.nowTimeStamp());
        userCapitalChangeMapper.insert(changePO);
        return ExecutedResult.success("请点击设备取水按钮取水");
    }
@@ -279,23 +312,6 @@
            DEBUG_LOGGER.error("设备数据未找到!");
            return;
        }
//        数据上报格式:
//        主题格式:zundong/QS001/data
//        数据格式:{"Data":
//          [
//              {"name":"QS001_state","value":1}, //状态
//              {"name":"QS001_fault","value":0}, //是否故障
//              {"name":"QS001_count","value":10000} //总水量
//          ],"time":"2025-07-02 15:19:17"
//        }
//        心跳上报格式:
//        主题格式:zundong/QS001/state
//        数据格式:{"Data":
//              [
//               {"name":"QS001_heartbeat","value":1} //心跳
//              ],"time":"2025-07-02 15:19:17"
//          }
        //消息解析
        Gson gson = new Gson();
        JsonObject object = gson.fromJson(msg, JsonObject.class);
@@ -309,92 +325,95 @@
            case "data":
                uploadData(time,facilityPO,listVo);
                break;
            case "state":
                uploadState(time,facilityPO,listVo);
                break;
//            case "state":
//                uploadState(time,facilityPO,listVo);
//                break;
        }
    }
    public void uploadData(String time,WaterFacilityPO facilityPO, List<CountVO> listVo) {
        CountVO stateVo = listVo.stream().filter(x -> x.getName().equals(facilityPO.getFacilityCode() + "_state")).findFirst().orElse(null);
        CountVO faultVo = listVo.stream().filter(x -> x.getName().equals(facilityPO.getFacilityCode() + "_fault")).findFirst().orElse(null);
        CountVO countVO = listVo.stream().filter(x -> x.getName().equals(facilityPO.getFacilityCode() + "_count")).findFirst().orElse(null);
        CountVO userVo = listVo.stream().filter(x -> x.getName().equals(facilityPO.getFacilityCode() + "_user")).findFirst().orElse(null);
        CountVO stateVo = listVo.stream().filter(x -> x.getName().equals(facilityPO.getFacilityCode() + "_state1")).findFirst().orElse(null);
        CountVO heartbeat = listVo.stream().filter(x -> x.getName().equals(facilityPO.getFacilityCode() + "_heartbeat")).findFirst().orElse(null);
        CountVO countVO = listVo.stream().filter(x -> x.getName().equals(facilityPO.getFacilityCode() + "_count1")).findFirst().orElse(null);
        AlarmHistoryPO alarmHistoryPO=new AlarmHistoryPO();
        alarmHistoryPO.setFacilityId(facilityPO.getId());
        switch (stateVo.getValue()) {
            case "0"://取水完成
                //扣除余额
                UserLoginPO user = userLoginMapper.get4UserCode(userVo.getValue());
               //创建消费记录
                PaymentRecordsPO recordsPO=new PaymentRecordsPO();
                recordsPO.setUserId(user.getId());
                recordsPO.setUserName(user.getUserName());
                recordsPO.setFacilityCode(facilityPO.getFacilityCode());
                BigDecimal bigDecimal = new BigDecimal(countVO.getValue()).divide(new BigDecimal(100)).setScale(2, BigDecimal.ROUND_DOWN);
                recordsPO.setPaymentAmount(bigDecimal);
                recordsPO.setWaterAmount(bigDecimal);
                recordsPO.setPayTime(time);
                recordsPO.setPayStatus(EBillPayStatus.PAID.getValue());
                recordsPO.setComment("取水");
                recordsPO.setCreateTime(LocalDateTimeUtil.nowTimeStamp());
                mapper.insert(recordsPO);
                //修改余额
                BigDecimal beforeMoney=user.getBalance();
                BigDecimal subtract = beforeMoney.subtract(bigDecimal);
                user.setBalance(subtract);
                userLoginMapper.updateById(user);
                //生成余额变动记录
                UserCapitalChangePO changePO=new UserCapitalChangePO();
                changePO.setUserId(user.getId());
                changePO.setBusiness(ECapitalChange.WATER_BILL_COUNTER_PAY.getValue());
                changePO.setBusinessName("取水");
                changePO.setBusinessCode("QS"+SnowFlakeUtil.getId());
                changePO.setChangeMoney(bigDecimal);
                changePO.setBeforeMoney(beforeMoney);
                changePO.setAfterMoney(subtract);
                changePO.setCreateTime(LocalDateTimeUtil.nowTimeStamp());
                userCapitalChangeMapper.insert(changePO);
                BigDecimal divide = new BigDecimal(countVO.getValue()).setScale(2,RoundingMode.DOWN);
                BigDecimal subtract=divide.subtract(facilityPO.getWaterCount());
                if(subtract.compareTo(BigDecimal.ZERO)>0){
                    facilityPO.setWaterCount(divide);
                    int i = waterFacilityMapper.updateById(facilityPO);
                    if(i>0){
                        WaterFacilityRecordsPO recordsPO=new WaterFacilityRecordsPO();
                        recordsPO.setFacilityId(facilityPO.getId());
                        recordsPO.setFacilityName(facilityPO.getFacilityName());
                        recordsPO.setWaterValue(subtract);
                        recordsPO.setUseDate(time);
                        recordsPO.setCreateTime(LocalDateTimeUtil.nowTimeStamp());
                        recordsPO.setRemark("设备供水记录");
                        waterFacilityRecordsMapper.insert(recordsPO);
                    }
                }
                break;
            case "1"://运行
                facilityPO.setState(1);
                waterFacilityMapper.updateById(facilityPO);
                break;
            case "2"://停止
                facilityPO.setState(2);
                waterFacilityMapper.updateById(facilityPO);
                break;
            case "3"://故障
            case "10"://故障
                alarmHistoryPO.setCode("500");
                alarmHistoryPO.setDescription("管道缺水");
                break;
            case "11"://故障
                alarmHistoryPO.setCode("501");
                alarmHistoryPO.setDescription("流量计故障");
                break;
            case "12"://故障
                alarmHistoryPO.setCode("502");
                alarmHistoryPO.setDescription("阀门故障");
                break;
            case "13"://故障
                alarmHistoryPO.setCode("503");
                alarmHistoryPO.setDescription("柜内温度过低");
                break;
            case "14"://故障
                alarmHistoryPO.setCode("504");
                alarmHistoryPO.setDescription("柜内温度过高");
                break;
        }
    }
    public void uploadState(String time,WaterFacilityPO facilityPO, List<CountVO> listVo){
        CountVO heartbeatVO = listVo.stream().filter(x -> x.getName().equals(facilityPO.getFacilityCode() + "_heartbeat")).findFirst().orElse(null);
        if(StringUtil.isNotNullOrEmpty(alarmHistoryPO.getCode())){
            AlarmHistoryPO historyPO = alarmHistoryMapper.getByCode(facilityPO.getId(), alarmHistoryPO.getCode());
            if(Objects.nonNull(historyPO)){
                historyPO.setLastTime(LocalDateTimeUtil.nowDateTimeStr());
                historyPO.setCount(historyPO.getCount()+1);
                alarmHistoryMapper.updateById(historyPO);
            }else {
                alarmHistoryPO.setLastTime(LocalDateTimeUtil.nowDateTimeStr());
                alarmHistoryPO.setCreateTime(LocalDateTimeUtil.nowTimeStamp());
                alarmHistoryMapper.insert(alarmHistoryPO);
            }
        }else {
            alarmHistoryMapper.deleteByFacilityId(facilityPO.getId());
        }
        HeartbeatDataPO heartbeatDataPO = heartbeatDataMapper.getByKey(facilityPO.getFacilityCode());
        if(Objects.nonNull(heartbeatDataPO)){
            heartbeatDataPO.setDataValue(Integer.valueOf(heartbeatVO.getValue()));
            heartbeatDataPO.setDataValue(Integer.valueOf(heartbeat.getValue()));
            heartbeatDataPO.setSendValue(heartbeatDataPO.getSendValue()==0?1:0);
            heartbeatDataPO.setRemark(time);
            heartbeatDataMapper.updateById(heartbeatDataPO);
        }else {
            HeartbeatDataPO dataPO=new HeartbeatDataPO();
            dataPO.setDataKey(facilityPO.getFacilityCode());
            dataPO.setSendValue(0);
            dataPO.setDataValue(Integer.valueOf(heartbeatVO.getValue()));
            dataPO.setDataValue(Integer.valueOf(heartbeat.getValue()));
            dataPO.setCreateTime(LocalDateTimeUtil.nowTimeStamp());
            dataPO.setRemark(LocalDateTimeUtil.nowDateTimeStr());
            heartbeatDataMapper.insert(dataPO);
        }
        //发送心跳数据
        // 发送心跳
        String topic = "zundong/"+facilityPO.getFacilityCode()+"/remotecontrol/";
        JsonObject data = new JsonObject();
        data.addProperty(facilityPO.getFacilityCode()+"_heartbeat", heartbeatDataPO.getSendValue()==0?1:0);
        if (Objects.nonNull(mqttServer)) {
            mqttServer.send(topic, data.toString());
        } else {
            try {
                System.out.println("mqttServer bean尚未初始化...");
                mqttServer = SpringUtil.getBean(MQTTServer.class);
                System.out.println("mqttServer 初始化bean成功!");
            } catch (Exception ignored) {
            }
            if (Objects.nonNull(mqttServer)) {
                mqttServer.send(topic, data.toString());
            }
        }
    }
    public ExecutedResult<List<PaymentRecordsVO>> getList(List<Long> listId) {