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));
}
}