package com.java110.common.cmd.chargeMachine; import com.alibaba.fastjson.JSONObject; import com.java110.common.charge.IChargeCore; import com.java110.core.annotation.Java110Cmd; import com.java110.core.annotation.Java110Transactional; import com.java110.core.context.ICmdDataFlowContext; import com.java110.core.event.cmd.Cmd; import com.java110.core.event.cmd.CmdEvent; import com.java110.core.factory.GenerateCodeFactory; import com.java110.dto.account.AccountDto; import com.java110.dto.accountDetail.AccountDetailDto; import com.java110.dto.chargeMachine.ChargeMachineDto; import com.java110.dto.chargeMachineOrder.ChargeMachineOrderDto; import com.java110.dto.chargeMachinePort.ChargeMachinePortDto; import com.java110.dto.user.UserDto; import com.java110.intf.acct.IAccountInnerServiceSMO; import com.java110.intf.common.IChargeMachineOrderAcctV1InnerServiceSMO; import com.java110.intf.common.IChargeMachineOrderV1InnerServiceSMO; import com.java110.intf.common.IChargeMachinePortV1InnerServiceSMO; import com.java110.intf.common.IChargeMachineV1InnerServiceSMO; import com.java110.intf.user.IUserV1InnerServiceSMO; import com.java110.po.accountDetail.AccountDetailPo; import com.java110.po.chargeMachineOrder.ChargeMachineOrderPo; import com.java110.po.chargeMachineOrderAcct.ChargeMachineOrderAcctPo; import com.java110.utils.exception.CmdException; import com.java110.utils.util.Assert; import com.java110.utils.util.DateUtil; import com.java110.vo.ResultVo; import org.springframework.beans.factory.annotation.Autowired; import java.math.BigDecimal; import java.text.ParseException; import java.util.Calendar; import java.util.List; /** * 充电桩开始充电 处理类 *

* add by wuxw 2023-03-09 */ @Java110Cmd(serviceCode = "chargeMachine.startCharge") public class StartChargeCmd extends Cmd { @Autowired private IChargeMachineV1InnerServiceSMO chargeMachineV1InnerServiceSMOImpl; @Autowired private IChargeMachinePortV1InnerServiceSMO chargeMachinePortV1InnerServiceSMOImpl; @Autowired private IUserV1InnerServiceSMO userV1InnerServiceSMOImpl; @Autowired private IAccountInnerServiceSMO accountInnerServiceSMOImpl; @Autowired private IChargeCore chargeCoreImpl; @Autowired private IChargeMachineOrderV1InnerServiceSMO chargeMachineOrderV1InnerServiceSMOImpl; @Autowired private IChargeMachineOrderAcctV1InnerServiceSMO chargeMachineOrderAcctV1InnerServiceSMOImpl; @Override public void validate(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) throws CmdException, ParseException { Assert.hasKeyAndValue(reqJson, "communityId", "未包含小区信息"); Assert.hasKeyAndValue(reqJson, "machineId", "未包含充电桩"); Assert.hasKeyAndValue(reqJson, "portId", "未包含插槽"); Assert.hasKeyAndValue(reqJson, "duration", "未包含充电时长"); // 999 为按量充电 String userId = context.getReqHeaders().get("user-id"); Assert.hasLength(userId, "用户不存在"); //查询充电桩设备信息 ChargeMachineDto chargeMachineDto = new ChargeMachineDto(); chargeMachineDto.setCommunityId(reqJson.getString("communityId")); chargeMachineDto.setMachineId(reqJson.getString("machineId")); List chargeMachineDtos = chargeMachineV1InnerServiceSMOImpl.queryChargeMachines(chargeMachineDto); Assert.listOnlyOne(chargeMachineDtos, "充电桩 不存在"); // todo 插槽是否空闲 ChargeMachinePortDto chargeMachinePortDto = new ChargeMachinePortDto(); chargeMachinePortDto.setMachineId(reqJson.getString("machineId")); chargeMachinePortDto.setPortId(reqJson.getString("portId")); chargeMachinePortDto.setState(ChargeMachinePortDto.STATE_FREE); List chargeMachinePortDtos = chargeMachinePortV1InnerServiceSMOImpl.queryChargeMachinePorts(chargeMachinePortDto); Assert.listOnlyOne(chargeMachinePortDtos, "插槽忙线"); double duration = reqJson.getDoubleValue("duration"); if (duration == 999) { duration = 10; } BigDecimal payMoneyDec = new BigDecimal(Double.parseDouble(chargeMachineDtos.get(0).getDurationPrice())); double payMoney = payMoneyDec.multiply(new BigDecimal(duration)).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); UserDto userDto = new UserDto(); userDto.setUserId(userId); List userDtos = userV1InnerServiceSMOImpl.queryUsers(userDto); Assert.listOnlyOne(userDtos, "用户不存在"); AccountDto accountDto = new AccountDto(); accountDto.setLink(userDtos.get(0).getTel()); accountDto.setAcctType(AccountDto.ACCT_TYPE_CASH); List accountDtos = accountInnerServiceSMOImpl.queryAccounts(accountDto); if (accountDtos == null || accountDtos.size() < 1) { throw new CmdException("请先充值,账户金额不足"); } if (Double.parseDouble(accountDtos.get(0).getAmount()) < payMoney) { throw new CmdException("账户金额不足,无法支付" + duration + "小时费用,请先充值"); } reqJson.put("acctId", accountDtos.get(0).getAcctId()); } @Override @Java110Transactional public void doCmd(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) throws CmdException, ParseException { String userId = context.getReqHeaders().get("user-id"); UserDto userDto = new UserDto(); userDto.setUserId(userId); List userDtos = userV1InnerServiceSMOImpl.queryUsers(userDto); Assert.listOnlyOne(userDtos, "用户不存在"); ChargeMachineDto chargeMachineDto = new ChargeMachineDto(); chargeMachineDto.setCommunityId(reqJson.getString("communityId")); chargeMachineDto.setMachineId(reqJson.getString("machineId")); List chargeMachineDtos = chargeMachineV1InnerServiceSMOImpl.queryChargeMachines(chargeMachineDto); double duration = reqJson.getDoubleValue("duration"); String durationType = IChargeCore.CHARGE_TYPE_HOURS; double durationHours = duration; if (duration == 999) { durationType = IChargeCore.CHARGE_TYPE_ENERGY; durationHours = 10; } ChargeMachinePortDto chargeMachinePortDto = new ChargeMachinePortDto(); chargeMachinePortDto.setMachineId(reqJson.getString("machineId")); chargeMachinePortDto.setPortId(reqJson.getString("portId")); chargeMachinePortDto.setState(ChargeMachinePortDto.STATE_FREE); List chargeMachinePortDtos = chargeMachinePortV1InnerServiceSMOImpl.queryChargeMachinePorts(chargeMachinePortDto); String orderId = GenerateCodeFactory.getGeneratorId("11"); //调用充电桩充电 ResultVo resultVo = chargeCoreImpl.startCharge(chargeMachineDtos.get(0), chargeMachinePortDtos.get(0), durationType, durationHours, orderId); if (resultVo.getCode() != ResultVo.CODE_OK) { context.setResponseEntity(ResultVo.createResponseEntity(resultVo)); return; } // todo 生成 充电订单 ChargeMachineOrderPo chargeMachineOrderPo = new ChargeMachineOrderPo(); chargeMachineOrderPo.setAmount("0"); chargeMachineOrderPo.setOrderId(orderId); chargeMachineOrderPo.setPortId(chargeMachinePortDtos.get(0).getPortId()); chargeMachineOrderPo.setPersonName(userDtos.get(0).getName()); chargeMachineOrderPo.setMachineId(chargeMachineDtos.get(0).getMachineId()); chargeMachineOrderPo.setAcctDetailId(reqJson.getString("acctId")); chargeMachineOrderPo.setPersonId(userId); chargeMachineOrderPo.setChargeHours(reqJson.getString("duration")); chargeMachineOrderPo.setStartTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A)); Calendar calendar = Calendar.getInstance(); if (duration == 999) { calendar.add(Calendar.HOUR, 10); } else { calendar.add(Calendar.HOUR, reqJson.getIntValue("duration")); } chargeMachineOrderPo.setEndTime(DateUtil.getFormatTimeString(calendar.getTime(), DateUtil.DATE_FORMATE_STRING_A)); chargeMachineOrderPo.setState(ChargeMachineOrderDto.STATE_DOING); chargeMachineOrderPo.setPersonTel(userDtos.get(0).getTel()); chargeMachineOrderPo.setCommunityId(chargeMachineDtos.get(0).getCommunityId()); chargeMachineOrderPo.setEnergy("1"); int flag = chargeMachineOrderV1InnerServiceSMOImpl.saveChargeMachineOrder(chargeMachineOrderPo); if (flag < 1) { chargeCoreImpl.stopCharge(chargeMachineDtos.get(0), chargeMachinePortDtos.get(0)); throw new CmdException("充电失败"); } //扣款 // todo 3.0 账户扣款 AccountDto accountDto = new AccountDto(); accountDto.setAcctId(reqJson.getString("acctId")); List 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(chargeMachineDtos.get(0).getDurationPrice()); accountDetailPo.setDetailId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_detailId)); accountInnerServiceSMOImpl.withholdAccount(accountDetailPo); ChargeMachineOrderAcctPo chargeMachineOrderAcctPo = new ChargeMachineOrderAcctPo(); chargeMachineOrderAcctPo.setAcctDetailId(accountDetailPo.getDetailId()); chargeMachineOrderAcctPo.setAmount(chargeMachineDtos.get(0).getDurationPrice()); chargeMachineOrderAcctPo.setCmoaId(GenerateCodeFactory.getGeneratorId("11")); chargeMachineOrderAcctPo.setOrderId(orderId); 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(chargeMachineDtos.get(0).getCommunityId()); chargeMachineOrderAcctPo.setEnergy("0"); chargeMachineOrderAcctV1InnerServiceSMOImpl.saveChargeMachineOrderAcct(chargeMachineOrderAcctPo); context.setResponseEntity(ResultVo.createResponseEntity(resultVo)); } }