| | |
| | | package com.java110.common.cmd.chargeMachine; |
| | | |
| | | import com.alibaba.fastjson.JSONArray; |
| | | 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.dto.chargeMachine.ChargeMachineDto; |
| | | import com.java110.dto.chargeMachineOrder.ChargeMachineOrderDto; |
| | | import com.java110.dto.chargeMachinePort.ChargeMachinePortDto; |
| | | import com.java110.dto.couponPropertyPoolConfig.CouponPropertyPoolConfigDto; |
| | | import com.java110.dto.couponPropertyUser.CouponPropertyUserDto; |
| | | import com.java110.dto.user.UserDto; |
| | | import com.java110.intf.acct.IAccountInnerServiceSMO; |
| | | import com.java110.intf.acct.ICouponPropertyPoolConfigV1InnerServiceSMO; |
| | | import com.java110.intf.acct.ICouponPropertyUserDetailV1InnerServiceSMO; |
| | | import com.java110.intf.acct.ICouponPropertyUserV1InnerServiceSMO; |
| | | 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.po.chargeMachinePort.ChargeMachinePortPo; |
| | | import com.java110.po.couponPropertyUser.CouponPropertyUserPo; |
| | | import com.java110.utils.exception.CmdException; |
| | | import com.java110.utils.lock.DistributedLock; |
| | | import com.java110.utils.util.Assert; |
| | | import com.java110.utils.util.DateUtil; |
| | | import com.java110.utils.util.StringUtil; |
| | | import com.java110.vo.ResultVo; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | |
| | |
| | | |
| | | @Autowired |
| | | private IChargeMachineOrderV1InnerServiceSMO chargeMachineOrderV1InnerServiceSMOImpl; |
| | | |
| | | @Autowired |
| | | private IChargeMachineOrderAcctV1InnerServiceSMO chargeMachineOrderAcctV1InnerServiceSMOImpl; |
| | | @Autowired |
| | | private ICouponPropertyUserV1InnerServiceSMO couponPropertyUserV1InnerServiceSMOImpl; |
| | | |
| | | @Autowired |
| | | private ICouponPropertyUserDetailV1InnerServiceSMO couponPropertyUserDetailV1InnerServiceSMOImpl; |
| | | |
| | | @Autowired |
| | | private ICouponPropertyPoolConfigV1InnerServiceSMO couponPropertyPoolConfigV1InnerServiceSMOImpl; |
| | | |
| | | @Override |
| | | public void validate(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) throws CmdException, ParseException { |
| | |
| | | AccountDto accountDto = new AccountDto(); |
| | | accountDto.setLink(userDtos.get(0).getTel()); |
| | | accountDto.setAcctType(AccountDto.ACCT_TYPE_CASH); |
| | | accountDto.setObjType(AccountDto.OBJ_TYPE_PERSON); |
| | | List<AccountDto> accountDtos = accountInnerServiceSMOImpl.queryAccounts(accountDto); |
| | | |
| | | if (accountDtos == null || accountDtos.size() < 1) { |
| | |
| | | |
| | | reqJson.put("acctId", accountDtos.get(0).getAcctId()); |
| | | |
| | | if (!reqJson.containsKey("couponIds") || StringUtil.isEmpty(reqJson.getString("couponIds"))) { |
| | | return; |
| | | } |
| | | |
| | | for (String couponId : reqJson.getString("couponIds").split(",")) { |
| | | CouponPropertyUserDto couponPropertyUserDto = new CouponPropertyUserDto(); |
| | | couponPropertyUserDto.setCouponId(couponId); |
| | | couponPropertyUserDto.setToType(CouponPropertyUserDto.TO_TYPE_CHARGE); |
| | | couponPropertyUserDto.setState(CouponPropertyUserDto.STATE_WAIT); |
| | | |
| | | List<CouponPropertyUserDto> couponPropertyUserDtos = couponPropertyUserV1InnerServiceSMOImpl.queryCouponPropertyUsers(couponPropertyUserDto); |
| | | |
| | | if (couponPropertyUserDtos == null || couponPropertyUserDtos.size() < 1) { |
| | | throw new CmdException("优惠券不存在"); |
| | | } |
| | | if (!"Y".equals(couponPropertyUserDtos.get(0).getIsExpire())) { |
| | | throw new CmdException("优惠券已过期"); |
| | | } |
| | | } |
| | | |
| | | } |
| | | |
| | | @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(); |
| | |
| | | return; |
| | | } |
| | | |
| | | // todo 修改端口状态 |
| | | ChargeMachinePortPo chargeMachinePortPo = new ChargeMachinePortPo(); |
| | | chargeMachinePortPo.setPortId(chargeMachinePortDtos.get(0).getPortId()); |
| | | chargeMachinePortPo.setCommunityId(chargeMachinePortDtos.get(0).getCommunityId()); |
| | | chargeMachinePortPo.setState(ChargeMachinePortDto.STATE_WORKING); |
| | | chargeMachinePortV1InnerServiceSMOImpl.updateChargeMachinePort(chargeMachinePortPo); |
| | | |
| | | // todo 生成 充电订单 |
| | | ChargeMachineOrderPo chargeMachineOrderPo = new ChargeMachineOrderPo(); |
| | | chargeMachineOrderPo.setAmount("0"); |
| | |
| | | chargeCoreImpl.stopCharge(chargeMachineDtos.get(0), chargeMachinePortDtos.get(0)); |
| | | throw new CmdException("充电失败"); |
| | | } |
| | | resultVo.setData(orderId); |
| | | |
| | | double couponDurationHours = 0.0; |
| | | //扣款 |
| | | if (reqJson.containsKey("couponIds") && !StringUtil.isEmpty(reqJson.getString("couponIds"))) { |
| | | //todo 优惠券抵扣 |
| | | couponDurationHours = withholdCoupon(reqJson, chargeMachineDtos, orderId); |
| | | } |
| | | |
| | | if(durationHours - couponDurationHours >0) { |
| | | // todo 3.0 账户扣款 |
| | | withholdAccount(reqJson, chargeMachineDtos, orderId,durationHours,couponDurationHours); |
| | | } |
| | | |
| | | context.setResponseEntity(ResultVo.createResponseEntity(resultVo)); |
| | | } |
| | | |
| | | /** |
| | | * 优惠券抵扣 |
| | | * |
| | | * @param reqJson |
| | | * @param chargeMachineDtos |
| | | * @param orderId |
| | | */ |
| | | private double withholdCoupon(JSONObject reqJson, List<ChargeMachineDto> chargeMachineDtos, String orderId) { |
| | | int flag; |
| | | double hours = 0; |
| | | String couponNames = ""; |
| | | for (String couponId : reqJson.getString("couponIds").split(",")) { |
| | | String requestId = DistributedLock.getLockUUID(); |
| | | String key = this.getClass().getSimpleName() + reqJson.getString("couponId"); |
| | | try { |
| | | CouponPropertyUserDto couponPropertyUserDto = new CouponPropertyUserDto(); |
| | | couponPropertyUserDto.setCouponId(couponId); |
| | | couponPropertyUserDto.setToType(CouponPropertyUserDto.TO_TYPE_CHARGE); |
| | | couponPropertyUserDto.setState(CouponPropertyUserDto.STATE_WAIT); |
| | | |
| | | List<CouponPropertyUserDto> couponPropertyUserDtos = couponPropertyUserV1InnerServiceSMOImpl.queryCouponPropertyUsers(couponPropertyUserDto); |
| | | int stock = Integer.parseInt(couponPropertyUserDtos.get(0).getStock()); |
| | | CouponPropertyUserPo couponPropertyUserPo = new CouponPropertyUserPo(); |
| | | couponPropertyUserPo.setCouponId(couponPropertyUserDtos.get(0).getCouponId()); |
| | | couponPropertyUserPo.setCommunityId(couponPropertyUserDtos.get(0).getCommunityId()); |
| | | couponPropertyUserPo.setStock((stock - 1) + ""); |
| | | if (stock == 1) { |
| | | couponPropertyUserPo.setState(CouponPropertyUserDto.STATE_FINISH); |
| | | } |
| | | flag = couponPropertyUserV1InnerServiceSMOImpl.updateCouponPropertyUser(couponPropertyUserPo); |
| | | if (flag < 1) { |
| | | throw new CmdException("核销失败"); |
| | | } |
| | | |
| | | couponNames += ("优惠券名称:" + couponPropertyUserDtos.get(0).getCouponName() + ",优惠券编号:" + couponId + ";"); |
| | | |
| | | CouponPropertyPoolConfigDto couponPropertyPoolConfigDto = new CouponPropertyPoolConfigDto(); |
| | | couponPropertyPoolConfigDto.setCouponId(couponPropertyUserDtos.get(0).getCppId()); |
| | | couponPropertyPoolConfigDto.setColumnKey("hours"); |
| | | List<CouponPropertyPoolConfigDto> couponPropertyPoolConfigDtos = couponPropertyPoolConfigV1InnerServiceSMOImpl.queryCouponPropertyPoolConfigs(couponPropertyPoolConfigDto); |
| | | |
| | | Assert.listOnlyOne(couponPropertyPoolConfigDtos, "未包含优惠券配置信息"); |
| | | |
| | | double value = Double.parseDouble(couponPropertyPoolConfigDtos.get(0).getColumnValue()); |
| | | hours += value; |
| | | } finally { |
| | | DistributedLock.releaseDistributedLock(requestId, key); |
| | | } |
| | | } |
| | | |
| | | hours = Math.ceil(hours); |
| | | |
| | | ChargeMachineOrderAcctPo chargeMachineOrderAcctPo = new ChargeMachineOrderAcctPo(); |
| | | chargeMachineOrderAcctPo.setAcctDetailId("-1"); |
| | | chargeMachineOrderAcctPo.setAmount(chargeMachineDtos.get(0).getDurationPrice()); |
| | | chargeMachineOrderAcctPo.setCmoaId(GenerateCodeFactory.getGeneratorId("11")); |
| | | chargeMachineOrderAcctPo.setOrderId(orderId); |
| | | chargeMachineOrderAcctPo.setAcctId(reqJson.getString("acctId")); |
| | | chargeMachineOrderAcctPo.setStartTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A)); |
| | | chargeMachineOrderAcctPo.setEndTime(DateUtil.getAddHoursStringA(DateUtil.getCurrentDate(), new Double(hours).intValue())); |
| | | chargeMachineOrderAcctPo.setRemark("优惠券抵扣," + couponNames); |
| | | chargeMachineOrderAcctPo.setCommunityId(chargeMachineDtos.get(0).getCommunityId()); |
| | | chargeMachineOrderAcctPo.setEnergy("0"); |
| | | |
| | | chargeMachineOrderAcctV1InnerServiceSMOImpl.saveChargeMachineOrderAcct(chargeMachineOrderAcctPo); |
| | | |
| | | return hours; |
| | | } |
| | | |
| | | /** |
| | | * 账户抵扣 |
| | | * |
| | | * @param reqJson |
| | | * @param chargeMachineDtos |
| | | * @param orderId |
| | | */ |
| | | private void withholdAccount(JSONObject reqJson, List<ChargeMachineDto> chargeMachineDtos, String orderId ,double durationHours,double couponDurationHours) { |
| | | AccountDto accountDto = new AccountDto(); |
| | | accountDto.setAcctId(reqJson.getString("acctId")); |
| | | List<AccountDto> accountDtos = accountInnerServiceSMOImpl.queryAccounts(accountDto); |
| | | |
| | | double amount = 0.0; |
| | | BigDecimal durationPrice = new BigDecimal(Double.parseDouble(chargeMachineDtos.get(0).getDurationPrice())); |
| | | if(couponDurationHours >0) { |
| | | durationPrice = durationPrice.multiply(new BigDecimal(durationHours - couponDurationHours)).setScale(2,BigDecimal.ROUND_HALF_UP); |
| | | amount = durationPrice.doubleValue(); |
| | | }else{ |
| | | durationPrice = durationPrice.multiply(new BigDecimal(durationHours)).setScale(2,BigDecimal.ROUND_HALF_UP); |
| | | amount = durationPrice.doubleValue(); |
| | | } |
| | | |
| | | AccountDetailPo accountDetailPo = new AccountDetailPo(); |
| | | accountDetailPo.setAcctId(accountDtos.get(0).getAcctId()); |
| | | accountDetailPo.setObjId(accountDtos.get(0).getObjId()); |
| | | accountDetailPo.setObjType(accountDtos.get(0).getObjType()); |
| | | accountDetailPo.setAmount(amount+""); |
| | | accountDetailPo.setDetailId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_detailId)); |
| | | accountInnerServiceSMOImpl.withholdAccount(accountDetailPo); |
| | | ChargeMachineOrderAcctPo chargeMachineOrderAcctPo = new ChargeMachineOrderAcctPo(); |
| | | chargeMachineOrderAcctPo.setAcctDetailId(accountDetailPo.getDetailId()); |
| | | chargeMachineOrderAcctPo.setAmount(amount+""); |
| | | |
| | | chargeMachineOrderAcctPo.setCmoaId(GenerateCodeFactory.getGeneratorId("11")); |
| | | chargeMachineOrderAcctPo.setOrderId(orderId); |
| | | chargeMachineOrderAcctPo.setAcctId(accountDtos.get(0).getAcctId()); |
| | | if(couponDurationHours >0) { |
| | | chargeMachineOrderAcctPo.setStartTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A)); |
| | | }else{ |
| | | chargeMachineOrderAcctPo.setStartTime(DateUtil.getAddHoursStringA(DateUtil.getCurrentDate(), new Double(Math.ceil(couponDurationHours)).intValue())); |
| | | } |
| | | chargeMachineOrderAcctPo.setEndTime(DateUtil.getAddHoursStringA(DateUtil.getCurrentDate(), new Double(Math.ceil(durationHours)).intValue())); |
| | | chargeMachineOrderAcctPo.setRemark("账户扣款"); |
| | | chargeMachineOrderAcctPo.setCommunityId(chargeMachineDtos.get(0).getCommunityId()); |
| | | chargeMachineOrderAcctPo.setEnergy("0"); |
| | | |
| | | chargeMachineOrderAcctV1InnerServiceSMOImpl.saveChargeMachineOrderAcct(chargeMachineOrderAcctPo); |
| | | } |
| | | } |