| | |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | |
| | | /** |
| | |
| | | |
| | | @Autowired |
| | | private IChargeMachineOrderAcctV1InnerServiceSMO chargeMachineOrderAcctV1InnerServiceSMOImpl; |
| | | |
| | | |
| | | @Override |
| | | public ResultVo startCharge(ChargeMachineDto chargeMachineDto, ChargeMachinePortDto chargeMachinePortDto, String chargeType, double duration, String orderId) { |
| | |
| | | throw new CmdException("厂家接口未实现"); |
| | | } |
| | | |
| | | return chargeFactoryAdapt.stopCharge(chargeMachineDto, chargeMachinePortDto); |
| | | ResultVo resultVo = chargeFactoryAdapt.stopCharge(chargeMachineDto, chargeMachinePortDto); |
| | | if (resultVo.getCode() != ResultVo.CODE_OK) { |
| | | return resultVo; |
| | | } |
| | | |
| | | |
| | | //订单退款 |
| | | returnOrderMoney(chargeMachineDto, chargeMachinePortDto, "用户手工结束"); |
| | | |
| | | |
| | | return resultVo; |
| | | } |
| | | |
| | | /** |
| | | * 订单退款 |
| | | * |
| | | * @param chargeMachineDto |
| | | * @param chargeMachinePortDto |
| | | */ |
| | | private void returnOrderMoney(ChargeMachineDto chargeMachineDto, ChargeMachinePortDto chargeMachinePortDto, String remark) { |
| | | // 退款 |
| | | ChargeMachineOrderDto chargeMachineOrderDto = new ChargeMachineOrderDto(); |
| | | chargeMachineOrderDto.setMachineId(chargeMachineDto.getMachineId()); |
| | | chargeMachineOrderDto.setPortId(chargeMachinePortDto.getPortId()); |
| | | chargeMachineOrderDto.setState(ChargeMachineOrderDto.STATE_DOING); |
| | | List<ChargeMachineOrderDto> chargeMachineOrderDtos = chargeMachineOrderV1InnerServiceSMOImpl.queryChargeMachineOrders(chargeMachineOrderDto); |
| | | |
| | | if (chargeMachineOrderDtos == null || chargeMachineOrderDtos.size() < 1) { |
| | | return; |
| | | } |
| | | |
| | | String chargeHours = chargeMachineOrderDtos.get(0).getChargeHours(); |
| | | double cHours = Double.parseDouble(chargeHours); |
| | | if (999 == cHours) { |
| | | cHours = 10; |
| | | } |
| | | |
| | | Date startTime = DateUtil.getDateFromStringA(chargeMachineOrderDtos.get(0).getStartTime()); |
| | | |
| | | double usedHours = Math.ceil((DateUtil.getCurrentDate().getTime() - startTime.getTime()) / (60 * 60 * 1000.00)); |
| | | |
| | | BigDecimal freeHours = new BigDecimal(cHours).subtract(new BigDecimal(usedHours)); |
| | | |
| | | double returnMoney = freeHours.multiply(new BigDecimal(Double.parseDouble(chargeMachineDto.getDurationPrice()))).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); |
| | | |
| | | |
| | | ChargeMachineOrderPo chargeMachineOrderPo = new ChargeMachineOrderPo(); |
| | | chargeMachineOrderPo.setOrderId(chargeMachineOrderDtos.get(0).getOrderId()); |
| | | chargeMachineOrderPo.setRemark(remark); |
| | | chargeMachineOrderPo.setState(ChargeMachineOrderDto.STATE_FINISH); |
| | | BigDecimal amount = new BigDecimal(Double.parseDouble(chargeMachineOrderDtos.get(0).getAmount())).subtract(new BigDecimal(returnMoney)).setScale(2, BigDecimal.ROUND_HALF_UP); |
| | | chargeMachineOrderPo.setAmount(amount.doubleValue() + ""); |
| | | chargeMachineOrderPo.setEndTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A)); |
| | | chargeMachineOrderPo.setCommunityId(chargeMachineOrderDtos.get(0).getCommunityId()); |
| | | int flag = chargeMachineOrderV1InnerServiceSMOImpl.updateChargeMachineOrder(chargeMachineOrderPo); |
| | | if (flag < 1) { |
| | | throw new IllegalArgumentException("修改订单失败"); |
| | | } |
| | | |
| | | |
| | | AccountDto accountDto = new AccountDto(); |
| | | accountDto.setAcctId(chargeMachineOrderDtos.get(0).getAcctDetailId()); |
| | | List<AccountDto> accountDtos = accountInnerServiceSMOImpl.queryAccounts(accountDto); |
| | | |
| | | AccountDetailPo accountDetailPo = new AccountDetailPo(); |
| | | accountDetailPo.setAcctId(accountDtos.get(0).getAcctId()); |
| | | accountDetailPo.setObjId(accountDtos.get(0).getObjId()); |
| | | accountDetailPo.setObjType(accountDtos.get(0).getObjType()); |
| | | accountDetailPo.setAmount(returnMoney + ""); |
| | | accountDetailPo.setDetailId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_detailId)); |
| | | accountInnerServiceSMOImpl.prestoreAccount(accountDetailPo); |
| | | |
| | | //充电表中加入退款金额 |
| | | |
| | | ChargeMachineOrderAcctPo chargeMachineOrderAcctPo = new ChargeMachineOrderAcctPo(); |
| | | chargeMachineOrderAcctPo.setAcctDetailId(accountDetailPo.getDetailId()); |
| | | chargeMachineOrderAcctPo.setAmount((-1 * returnMoney) + ""); |
| | | |
| | | chargeMachineOrderAcctPo.setCmoaId(GenerateCodeFactory.getGeneratorId("11")); |
| | | chargeMachineOrderAcctPo.setOrderId(chargeMachineOrderDtos.get(0).getOrderId()); |
| | | chargeMachineOrderAcctPo.setAcctId(accountDtos.get(0).getAcctId()); |
| | | chargeMachineOrderAcctPo.setStartTime(chargeMachineOrderDtos.get(0).getStartTime()); |
| | | |
| | | chargeMachineOrderAcctPo.setEndTime(chargeMachineOrderDtos.get(0).getEndTime()); |
| | | chargeMachineOrderAcctPo.setRemark("账户退款-" + remark); |
| | | chargeMachineOrderAcctPo.setCommunityId(chargeMachineOrderDtos.get(0).getCommunityId()); |
| | | chargeMachineOrderAcctPo.setEnergy("0"); |
| | | |
| | | chargeMachineOrderAcctV1InnerServiceSMOImpl.saveChargeMachineOrderAcct(chargeMachineOrderAcctPo); |
| | | } |
| | | |
| | | @Override |
| | |
| | | return chargeFactoryAdapt.getChargePortState(chargeMachineDto, chargeMachinePortDto); |
| | | } |
| | | |
| | | /** |
| | | * 完成充电 |
| | | * |
| | | * @param notifyChargeOrderDto |
| | | * @return |
| | | */ |
| | | @Override |
| | | public ResponseEntity<String> finishCharge(NotifyChargeOrderDto notifyChargeOrderDto) { |
| | | public ResultVo finishCharge(NotifyChargeOrderDto notifyChargeOrderDto) { |
| | | |
| | | // todo 生成 充电订单 |
| | | ChargeMachineOrderPo chargeMachineOrderPo = new ChargeMachineOrderPo(); |
| | | chargeMachineOrderPo.setEndTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A)); |
| | | chargeMachineOrderPo.setState(ChargeMachineOrderDto.STATE_FINISH); |
| | | chargeMachineOrderPo.setOrderId(notifyChargeOrderDto.getOrderId()); |
| | | chargeMachineOrderV1InnerServiceSMOImpl.updateChargeMachineOrder(chargeMachineOrderPo); |
| | | // // todo 生成 充电订单 |
| | | // ChargeMachineOrderPo chargeMachineOrderPo = new ChargeMachineOrderPo(); |
| | | // chargeMachineOrderPo.setEndTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A)); |
| | | // chargeMachineOrderPo.setState(ChargeMachineOrderDto.STATE_FINISH); |
| | | // chargeMachineOrderPo.setOrderId(notifyChargeOrderDto.getOrderId()); |
| | | // chargeMachineOrderV1InnerServiceSMOImpl.updateChargeMachineOrder(chargeMachineOrderPo); |
| | | |
| | | ChargeMachineDto chargeMachineDto = new ChargeMachineDto(); |
| | | chargeMachineDto.setMachineCode(notifyChargeOrderDto.getMachineCode()); |
| | | List<ChargeMachineDto> chargeMachineDtos = chargeMachineV1InnerServiceSMOImpl.queryChargeMachines(chargeMachineDto); |
| | | |
| | | Assert.listOnlyOne(chargeMachineDtos, "充电桩 不存在"); |
| | | //Assert.listOnlyOne(chargeMachineDtos, "充电桩 不存在"); |
| | | |
| | | if(chargeMachineDtos == null || chargeMachineDtos.size() < 1){ |
| | | return new ResultVo(ResultVo.CODE_OK, "成功"); |
| | | } |
| | | |
| | | // todo 插槽是否空闲 |
| | | |
| | | ChargeMachinePortDto chargeMachinePortDto = new ChargeMachinePortDto(); |
| | | chargeMachinePortDto.setMachineId(chargeMachineDtos.get(0).getMachineId()); |
| | | chargeMachinePortDto.setPortCode(notifyChargeOrderDto.getPortCode()); |
| | | chargeMachinePortDto.setState(ChargeMachinePortDto.STATE_FREE); |
| | | chargeMachinePortDto.setState(ChargeMachinePortDto.STATE_WORKING); |
| | | List<ChargeMachinePortDto> chargeMachinePortDtos = chargeMachinePortV1InnerServiceSMOImpl.queryChargeMachinePorts(chargeMachinePortDto); |
| | | Assert.listOnlyOne(chargeMachinePortDtos, "插槽忙线"); |
| | | //Assert.listOnlyOne(chargeMachinePortDtos, "插槽空闲"); |
| | | if(chargeMachinePortDtos == null || chargeMachinePortDtos.size() < 1){ |
| | | return new ResultVo(ResultVo.CODE_OK, "成功"); |
| | | } |
| | | |
| | | ChargeMachinePortPo chargeMachinePortPo = new ChargeMachinePortPo(); |
| | | chargeMachinePortPo.setPortId(chargeMachinePortDtos.get(0).getPortId()); |
| | | chargeMachinePortPo.setState(ChargeMachinePortDto.STATE_FREE); |
| | | chargeMachinePortV1InnerServiceSMOImpl.updateChargeMachinePort(chargeMachinePortPo); |
| | | |
| | | return new ResponseEntity<>("{\n" + |
| | | "\"code\" : 200,\n" + |
| | | "\"msg\" : \"success\"\n" + |
| | | "}", HttpStatus.OK); |
| | | returnOrderMoney(chargeMachineDtos.get(0), chargeMachinePortDtos.get(0), notifyChargeOrderDto.getReason()); |
| | | |
| | | return new ResultVo(ResultVo.CODE_OK, "成功"); |
| | | } |
| | | |
| | | @Override |
| | |
| | | } |
| | | |
| | | @Override |
| | | public ResponseEntity<String> chargeHeartBeat(NotifyChargeOrderDto notifyChargeOrderDto) { |
| | | ChargeMachineDto chargeMachineDto = new ChargeMachineDto(); |
| | | chargeMachineDto.setMachineCode(notifyChargeOrderDto.getMachineCode()); |
| | | List<ChargeMachineDto> chargeMachineDtos = chargeMachineV1InnerServiceSMOImpl.queryChargeMachines(chargeMachineDto); |
| | | public void queryChargeMachineState(List<ChargeMachineDto> chargeMachineDtos) { |
| | | |
| | | Assert.listOnlyOne(chargeMachineDtos, "充电桩 不存在"); |
| | | for(ChargeMachineDto chargeMachineDto : chargeMachineDtos) { |
| | | try { |
| | | ChargeMachineFactoryDto chargeMachineFactoryDto = new ChargeMachineFactoryDto(); |
| | | chargeMachineFactoryDto.setFactoryId(chargeMachineDto.getImplBean()); |
| | | List<ChargeMachineFactoryDto> chargeMachineFactoryDtos = chargeMachineFactoryV1InnerServiceSMOImpl.queryChargeMachineFactorys(chargeMachineFactoryDto); |
| | | |
| | | ChargeMachineFactoryDto chargeMachineFactoryDto = new ChargeMachineFactoryDto(); |
| | | chargeMachineFactoryDto.setFactoryId(chargeMachineDtos.get(0).getImplBean()); |
| | | List<ChargeMachineFactoryDto> chargeMachineFactoryDtos = chargeMachineFactoryV1InnerServiceSMOImpl.queryChargeMachineFactorys(chargeMachineFactoryDto); |
| | | Assert.listOnlyOne(chargeMachineFactoryDtos, "充电桩厂家不存在"); |
| | | |
| | | Assert.listOnlyOne(chargeMachineFactoryDtos, "充电桩厂家不存在"); |
| | | |
| | | IChargeFactoryAdapt chargeFactoryAdapt = ApplicationContextFactory.getBean(chargeMachineFactoryDtos.get(0).getBeanImpl(), IChargeFactoryAdapt.class); |
| | | if (chargeFactoryAdapt == null) { |
| | | throw new CmdException("厂家接口未实现"); |
| | | } |
| | | |
| | | List<NotifyChargePortDto> portDtos = chargeFactoryAdapt.getChargeHeartBeatParam(notifyChargeOrderDto); |
| | | |
| | | for (NotifyChargePortDto notifyChargePortDto : portDtos) { |
| | | doDealChargePort(notifyChargePortDto, notifyChargeOrderDto, chargeMachineDtos.get(0), chargeFactoryAdapt); |
| | | } |
| | | |
| | | return new ResponseEntity<>("{\n" + |
| | | "\"code\" : 200,\n" + |
| | | "\"msg\" : \"success\"\n" + |
| | | "}", HttpStatus.OK); |
| | | } |
| | | |
| | | /** |
| | | * 处理充电 扣款问题 |
| | | * |
| | | * @param notifyChargePortDto |
| | | * @param notifyChargeOrderDto |
| | | */ |
| | | private void doDealChargePort(NotifyChargePortDto notifyChargePortDto, |
| | | NotifyChargeOrderDto notifyChargeOrderDto, |
| | | ChargeMachineDto chargeMachineDto, |
| | | IChargeFactoryAdapt chargeFactoryAdapt) { |
| | | |
| | | String preEnergy = "0"; |
| | | ChargeMachineOrderDto chargeMachineOrderDto = new ChargeMachineOrderDto(); |
| | | chargeMachineOrderDto.setOrderId(notifyChargePortDto.getOrderId()); |
| | | List<ChargeMachineOrderDto> orderDtos = chargeMachineOrderV1InnerServiceSMOImpl.queryChargeMachineOrders(chargeMachineOrderDto); |
| | | |
| | | Assert.listOnlyOne(orderDtos, "订单不存在"); |
| | | String state = ChargeMachineOrderDto.STATE_DOING; |
| | | if (preEnergy.equals(notifyChargePortDto.getEnergy())) { |
| | | state = ChargeMachineOrderDto.STATE_FINISH; |
| | | } |
| | | updateOrderState(notifyChargePortDto, state); |
| | | |
| | | //todo 主动调用关闭 |
| | | if (preEnergy.equals(notifyChargePortDto.getEnergy())) { |
| | | customStopCharge(notifyChargePortDto, chargeMachineDto, chargeFactoryAdapt, orderDtos); |
| | | } |
| | | |
| | | // todo 1.0 查询上报时间是否已经 扣款,如果扣款过,那么更新 充电电量 后返回 |
| | | |
| | | String powerTime = DateUtil.getFormatTimeString(notifyChargePortDto.getPowerTime(), DateUtil.DATE_FORMATE_STRING_A); |
| | | |
| | | ChargeMachineOrderAcctDto chargeMachineOrderAcctDto = new ChargeMachineOrderAcctDto(); |
| | | chargeMachineOrderAcctDto.setOrderId(notifyChargeOrderDto.getOrderId()); |
| | | chargeMachineOrderAcctDto.setPowerTime(powerTime); |
| | | List<ChargeMachineOrderAcctDto> chargeMachineOrderAcctDtos = chargeMachineOrderAcctV1InnerServiceSMOImpl.queryChargeMachineOrderAccts(chargeMachineOrderAcctDto); |
| | | |
| | | if (chargeMachineOrderAcctDtos != null && chargeMachineOrderAcctDtos.size() > 0) { |
| | | return; |
| | | } |
| | | |
| | | // todo 2.0 检查账户是否余额充足,如果余额不足,则 调用停止充电 将充电订单 修改成充电完成,并且修改备注 |
| | | |
| | | double price = Double.parseDouble(chargeMachineDto.getDurationPrice()); |
| | | |
| | | AccountDto accountDto = new AccountDto(); |
| | | accountDto.setAcctId(orderDtos.get(0).getAcctDetailId()); |
| | | accountDto.setAcctType(AccountDto.ACCT_TYPE_CASH); |
| | | List<AccountDto> accountDtos = accountInnerServiceSMOImpl.queryAccounts(accountDto); |
| | | |
| | | if (accountDtos == null || accountDtos.size() < 1) { |
| | | throw new CmdException("请先充值,账户金额不足"); |
| | | } |
| | | |
| | | //todo 账户金额不足,无法支付小时费用,停止充电 |
| | | if (Double.parseDouble(accountDtos.get(0).getAmount()) < price) { |
| | | customStopCharge(notifyChargePortDto, chargeMachineDto, chargeFactoryAdapt, orderDtos); |
| | | updateOrderState(notifyChargePortDto, ChargeMachineOrderDto.STATE_FINISH); |
| | | return; |
| | | } |
| | | |
| | | |
| | | // todo 3.0 账户扣款 |
| | | AccountDetailPo accountDetailPo = new AccountDetailPo(); |
| | | accountDetailPo.setAcctId(accountDtos.get(0).getAcctId()); |
| | | accountDetailPo.setObjId(accountDtos.get(0).getObjId()); |
| | | accountDetailPo.setObjType(accountDtos.get(0).getObjType()); |
| | | accountDetailPo.setAmount(price + ""); |
| | | accountDetailPo.setDetailId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_detailId)); |
| | | accountInnerServiceSMOImpl.withholdAccount(accountDetailPo); |
| | | |
| | | ChargeMachineOrderAcctPo chargeMachineOrderAcctPo = new ChargeMachineOrderAcctPo(); |
| | | chargeMachineOrderAcctPo.setAcctDetailId(accountDetailPo.getDetailId()); |
| | | chargeMachineOrderAcctPo.setAmount(price + ""); |
| | | chargeMachineOrderAcctPo.setCmoaId(GenerateCodeFactory.getGeneratorId("11")); |
| | | chargeMachineOrderAcctPo.setOrderId(notifyChargePortDto.getOrderId()); |
| | | chargeMachineOrderAcctPo.setAcctId(accountDtos.get(0).getAcctId()); |
| | | chargeMachineOrderAcctPo.setStartTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A)); |
| | | chargeMachineOrderAcctPo.setEndTime(DateUtil.getAddHoursStringA(DateUtil.getCurrentDate(), 1)); |
| | | chargeMachineOrderAcctPo.setRemark("一小时定时扣款"); |
| | | chargeMachineOrderAcctPo.setCommunityId(orderDtos.get(0).getCommunityId()); |
| | | chargeMachineOrderAcctPo.setEnergy(notifyChargePortDto.getEnergy()); |
| | | |
| | | chargeMachineOrderAcctV1InnerServiceSMOImpl.saveChargeMachineOrderAcct(chargeMachineOrderAcctPo); |
| | | |
| | | } |
| | | |
| | | private void updateOrderState(NotifyChargePortDto notifyChargePortDto, String state) { |
| | | ChargeMachineOrderPo chargeMachineOrderPo = new ChargeMachineOrderPo(); |
| | | chargeMachineOrderPo.setOrderId(notifyChargePortDto.getOrderId()); |
| | | chargeMachineOrderPo.setEnergy(notifyChargePortDto.getEnergy()); |
| | | chargeMachineOrderPo.setState(state); |
| | | |
| | | chargeMachineOrderV1InnerServiceSMOImpl.updateChargeMachineOrder(chargeMachineOrderPo); |
| | | } |
| | | |
| | | private void customStopCharge(NotifyChargePortDto notifyChargePortDto, ChargeMachineDto chargeMachineDto, IChargeFactoryAdapt chargeFactoryAdapt, List<ChargeMachineOrderDto> orderDtos) { |
| | | ChargeMachinePortDto chargeMachinePortDto = new ChargeMachinePortDto(); |
| | | chargeMachinePortDto.setMachineId(orderDtos.get(0).getMachineId()); |
| | | chargeMachinePortDto.setPortCode(notifyChargePortDto.getPortCode()); |
| | | List<ChargeMachinePortDto> chargeMachinePortDtos = chargeMachinePortV1InnerServiceSMOImpl.queryChargeMachinePorts(chargeMachinePortDto); |
| | | if (chargeMachinePortDtos != null && chargeMachinePortDtos.size() > 0) { |
| | | chargeFactoryAdapt.stopCharge(chargeMachineDto, chargeMachinePortDtos.get(0)); |
| | | IChargeFactoryAdapt chargeFactoryAdapt = ApplicationContextFactory.getBean(chargeMachineFactoryDtos.get(0).getBeanImpl(), IChargeFactoryAdapt.class); |
| | | if (chargeFactoryAdapt == null) { |
| | | throw new CmdException("厂家接口未实现"); |
| | | } |
| | | chargeFactoryAdapt.queryChargeMachineState(chargeMachineDto); |
| | | }catch (Exception e){ |
| | | e.printStackTrace(); |
| | | chargeMachineDto.setState(ChargeMachineDto.STATE_OFFLINE); |
| | | chargeMachineDto.setStateName("离线"); |
| | | } |
| | | } |
| | | } |
| | | } |