package com.java110.fee.cmd.fee; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; 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.app.AppDto; import com.java110.dto.couponPool.CouponUserDto; import com.java110.dto.fee.FeeAttrDto; import com.java110.dto.fee.FeeConfigDto; import com.java110.dto.fee.FeeDetailDto; import com.java110.dto.fee.FeeDto; import com.java110.dto.feeDiscount.ComputeDiscountDto; import com.java110.dto.owner.OwnerCarDto; import com.java110.dto.parkingSpaceApply.ParkingSpaceApplyDto; import com.java110.dto.repair.RepairDto; import com.java110.dto.repair.RepairUserDto; import com.java110.fee.bmo.fee.IFeeBMO; import com.java110.intf.acct.IAccountInnerServiceSMO; import com.java110.intf.acct.ICouponUserDetailV1InnerServiceSMO; import com.java110.intf.acct.ICouponUserV1InnerServiceSMO; import com.java110.intf.community.*; import com.java110.intf.fee.*; import com.java110.intf.user.IOwnerCarInnerServiceSMO; import com.java110.po.accountDetail.AccountDetailPo; import com.java110.po.applyRoomDiscount.ApplyRoomDiscountPo; import com.java110.po.car.OwnerCarPo; import com.java110.po.couponUser.CouponUserPo; import com.java110.po.couponUserDetail.CouponUserDetailPo; import com.java110.po.feeAccountDetail.FeeAccountDetailPo; import com.java110.po.owner.RepairPoolPo; import com.java110.po.owner.RepairUserPo; import com.java110.po.parkingSpaceApply.ParkingSpaceApplyPo; import com.java110.po.payFeeDetailDiscount.PayFeeDetailDiscountPo; import com.java110.utils.cache.CommonCache; import com.java110.utils.exception.CmdException; import com.java110.utils.util.Assert; import com.java110.utils.util.BeanConvertUtil; import com.java110.utils.util.DateUtil; import com.java110.utils.util.StringUtil; import com.java110.vo.ResultVo; import org.springframework.beans.factory.annotation.Autowired; import java.math.BigDecimal; import java.text.DecimalFormat; import java.util.Calendar; import java.util.Date; import java.util.List; @Java110Cmd(serviceCode = "fee.payFeeConfirm") public class PayFeeConfirmCmd extends Cmd { @Autowired private IFeeBMO feeBMOImpl; @Autowired private IFeeInnerServiceSMO feeInnerServiceSMOImpl; @Autowired private IRoomInnerServiceSMO roomInnerServiceSMOImpl; @Autowired private IFeeConfigInnerServiceSMO feeConfigInnerServiceSMOImpl; @Autowired private IFeeDiscountInnerServiceSMO feeDiscountInnerServiceSMOImpl; @Autowired private IFeeAttrInnerServiceSMO feeAttrInnerServiceSMOImpl; @Autowired private IRepairUserInnerServiceSMO repairUserInnerServiceSMO; @Autowired private IOwnerCarInnerServiceSMO ownerCarInnerServiceSMOImpl; @Autowired private IOwnerCarNewV1InnerServiceSMO ownerCarNewV1InnerServiceSMOImpl; @Autowired private IApplyRoomDiscountInnerServiceSMO applyRoomDiscountInnerServiceSMOImpl; @Autowired private IFeeDetailInnerServiceSMO iFeeDetailInnerServiceSMO; @Autowired private IPayFeeDetailDiscountInnerServiceSMO payFeeDetailDiscountInnerServiceSMOImpl; @Autowired private IPayFeeDetailDiscountNewV1InnerServiceSMO payFeeDetailDiscountNewV1InnerServiceSMOImpl; @Autowired private IRepairPoolV1InnerServiceSMO repairPoolNewV1InnerServiceSMOImpl; @Autowired private IRepairUserV1InnerServiceSMO repairUserNewV1InnerServiceSMOImpl; @Autowired private ICouponUserV1InnerServiceSMO couponUserV1InnerServiceSMOImpl; @Autowired private ICouponUserDetailV1InnerServiceSMO couponUserDetailV1InnerServiceSMOImpl; @Autowired private IParkingSpaceApplyV1InnerServiceSMO parkingSpaceApplyV1InnerServiceSMOImpl; @Autowired private IAccountInnerServiceSMO accountInnerServiceSMOImpl; @Autowired private IFeeAccountDetailServiceSMO feeAccountDetailServiceSMOImpl; //默认序列 protected static final int DEFAULT_SEQ = 1; @Override public void validate(CmdEvent event, ICmdDataFlowContext cmdDataFlowContext, JSONObject reqJson) { Assert.hasKeyAndValue(reqJson, "oId", "是否包含订单信息"); } @Override @Java110Transactional public void doCmd(CmdEvent event, ICmdDataFlowContext cmdDataFlowContext, JSONObject reqJson) throws CmdException { String paramIn = CommonCache.getAndRemoveValue("payFeePre" + reqJson.getString("oId")); JSONObject paramObj = JSONObject.parseObject(paramIn); String appId = paramObj.getString("appId"); if (AppDto.WECHAT_MINA_OWNER_APP_ID.equals(appId)) { //微信小程序支付 paramObj.put("primeRate", "6"); paramObj.put("remark", "线上小程序支付"); } else if (AppDto.WECHAT_OWNER_APP_ID.equals(appId)) { //微信公众号支付 paramObj.put("primeRate", "5"); paramObj.put("remark", "线上公众号支付"); } else { paramObj.put("primeRate", "6"); paramObj.put("remark", "线上小程序支付"); } paramObj.put("detailId", GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_detailId)); //处理现金账户 dealAccount(paramObj); //处理 优惠折扣 addDiscount(paramObj); //修改已使用优惠卷信息 modifyCouponUser(paramObj); //添加单元信息 feeBMOImpl.addFeePreDetail(paramObj); feeBMOImpl.modifyPreFee(paramObj); dealOwnerCartEndTime(paramObj); //判断是否有派单属性ID FeeAttrDto feeAttrDto = new FeeAttrDto(); feeAttrDto.setCommunityId(paramObj.getString("communityId")); feeAttrDto.setFeeId(paramObj.getString("feeId")); feeAttrDto.setSpecCd(FeeAttrDto.SPEC_CD_REPAIR); List feeAttrDtos = feeAttrInnerServiceSMOImpl.queryFeeAttrs(feeAttrDto); //修改 派单状态 if (feeAttrDtos != null && feeAttrDtos.size() > 0) { RepairPoolPo repairPoolPo = new RepairPoolPo(); repairPoolPo.setRepairId(feeAttrDtos.get(0).getValue()); repairPoolPo.setCommunityId(paramObj.getString("communityId")); repairPoolPo.setState(RepairDto.STATE_APPRAISE); int flag = repairPoolNewV1InnerServiceSMOImpl.updateRepairPoolNew(repairPoolPo); if (flag < 1) { throw new CmdException("更新微信派单池信息失败"); } RepairUserDto repairUserDto = new RepairUserDto(); repairUserDto.setRepairId(feeAttrDtos.get(0).getValue()); repairUserDto.setState(RepairUserDto.STATE_PAY_FEE); //查询待支付状态的记录 List repairUserDtoList = repairUserInnerServiceSMO.queryRepairUsers(repairUserDto); Assert.listOnlyOne(repairUserDtoList, "信息错误!"); RepairUserPo repairUserPo = new RepairUserPo(); repairUserPo.setRuId(repairUserDtoList.get(0).getRuId()); repairUserPo.setState(RepairUserDto.STATE_FINISH_PAY_FEE); //如果是待评价状态,就更新结束时间 repairUserPo.setEndTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A)); DecimalFormat df = new DecimalFormat("0.00"); BigDecimal payment_amount = new BigDecimal(paramObj.getString("receivableAmount")); repairUserPo.setContext("已支付" + df.format(payment_amount) + "元"); flag = repairUserNewV1InnerServiceSMOImpl.updateRepairUserNew(repairUserPo); if (flag < 1) { throw new CmdException("更新微信派单池信息失败"); } //新增待评价状态 RepairUserPo repairUser = new RepairUserPo(); repairUser.setRuId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_ruId)); repairUser.setStartTime(repairUserPo.getEndTime()); repairUser.setState(RepairUserDto.STATE_EVALUATE); repairUser.setContext("待评价"); repairUser.setCommunityId(paramObj.getString("communityId")); repairUser.setCreateTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A)); repairUser.setRepairId(repairUserDtoList.get(0).getRepairId()); repairUser.setStaffId(repairUserDtoList.get(0).getStaffId()); repairUser.setStaffName(repairUserDtoList.get(0).getStaffName()); repairUser.setPreStaffId(repairUserDtoList.get(0).getStaffId()); repairUser.setPreStaffName(repairUserDtoList.get(0).getStaffName()); repairUser.setPreRuId(repairUserDtoList.get(0).getRuId()); repairUser.setRepairEvent("auditUser"); repairUser.setbId("-1"); flag = repairUserNewV1InnerServiceSMOImpl.saveRepairUserNew(repairUser); if (flag < 1) { throw new CmdException("更新微信派单池信息失败"); } } //查询 pay_fee_detail 是否缴费 FeeDetailDto feeDetailDto = new FeeDetailDto(); feeDetailDto.setDetailId(paramObj.getString("detailId")); List feeDetailDtoList = iFeeDetailInnerServiceSMO.queryBusinessFeeDetails(feeDetailDto); if (feeDetailDtoList != null && feeDetailDtoList.size() == 1) { //获取bId String bId = feeDetailDtoList.get(0).getbId(); //获取优惠 //List computeDiscountDtos = (List) paramObj.get("computeDiscountDtos"); JSONArray computeDiscountDtos = paramObj.getJSONArray("computeDiscountDtos"); ComputeDiscountDto computeDiscountDto = null; if (computeDiscountDtos != null && computeDiscountDtos.size() > 0) { for (int accountIndex = 0; accountIndex < computeDiscountDtos.size(); accountIndex++) { computeDiscountDto = BeanConvertUtil.covertBean(computeDiscountDtos.getJSONObject(accountIndex), ComputeDiscountDto.class); if (!StringUtil.isEmpty(computeDiscountDto.getArdId())) { ApplyRoomDiscountPo applyRoomDiscountPo = new ApplyRoomDiscountPo(); //将业务id更新到空置房优惠里面 applyRoomDiscountPo.setbId(bId); applyRoomDiscountPo.setArdId(computeDiscountDto.getArdId()); int flag = applyRoomDiscountInnerServiceSMOImpl.updateApplyRoomDiscount(applyRoomDiscountPo); if (flag < 1) { throw new CmdException("更新微信派单池信息失败"); } } } } } //回调判断 车位申请表是否有数据,有数据则刷新申请表状态为 3003 完成状态即可 //判断车辆是否已经有申请单 ParkingSpaceApplyDto parkingSpaceApplyDto = new ParkingSpaceApplyDto(); parkingSpaceApplyDto.setFeeId(paramObj.getString("feeId")); parkingSpaceApplyDto.setState("2002");//审核中 List parkingSpaceApplyDtos = parkingSpaceApplyV1InnerServiceSMOImpl.queryParkingSpaceApplys(parkingSpaceApplyDto); if (parkingSpaceApplyDtos != null && parkingSpaceApplyDtos.size() > 0) { ParkingSpaceApplyPo parkingSpaceApplyPo = new ParkingSpaceApplyPo(); parkingSpaceApplyPo.setApplyId(parkingSpaceApplyDtos.get(0).getApplyId()); parkingSpaceApplyPo.setState("3003"); int flag = parkingSpaceApplyV1InnerServiceSMOImpl.updateParkingSpaceApply(parkingSpaceApplyPo); if (flag < 1) { throw new CmdException("更新车位申请表状态失败"); } } cmdDataFlowContext.setResponseEntity(ResultVo.success()); } private void dealAccount(JSONObject paramObj) { if (!paramObj.containsKey("deductionAmount") || paramObj.getDouble("deductionAmount") <= 0) { return; } BigDecimal deductionAmount = new BigDecimal(paramObj.getDouble("deductionAmount")); JSONArray accountDtos = paramObj.getJSONArray("selectUserAccount"); BigDecimal amount = null; AccountDto accountDto = null; for (int accountIndex = 0; accountIndex < accountDtos.size(); accountIndex++) { accountDto = BeanConvertUtil.covertBean(accountDtos.getJSONObject(accountIndex), AccountDto.class); amount = new BigDecimal(Double.parseDouble(accountDto.getAmount())); AccountDetailPo accountDetailPo = new AccountDetailPo(); accountDetailPo.setAcctId(accountDto.getAcctId()); accountDetailPo.setObjId(accountDto.getObjId()); accountDetailPo.setObjType(accountDto.getObjType()); if (amount.doubleValue() < deductionAmount.doubleValue()) { accountDetailPo.setAmount(amount.doubleValue() + ""); deductionAmount = deductionAmount.subtract(amount).setScale(2, BigDecimal.ROUND_HALF_UP); } else { accountDetailPo.setAmount(deductionAmount.doubleValue() + ""); deductionAmount = deductionAmount.subtract(deductionAmount).setScale(2, BigDecimal.ROUND_HALF_UP); } int flag = accountInnerServiceSMOImpl.withholdAccount(accountDetailPo); if (flag < 1) { throw new CmdException("扣款失败"); } } if (deductionAmount.doubleValue() > 0) { throw new CmdException("账户金额不足"); } // 现金账户扣款记录,生成抵扣明细记录 FeeAccountDetailPo feeAccountDetailPo = new FeeAccountDetailPo(); feeAccountDetailPo.setFadId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_fadId)); feeAccountDetailPo.setDetailId(paramObj.getString("detailId")); feeAccountDetailPo.setCommunityId(paramObj.getString("communityId")); feeAccountDetailPo.setState("1002"); //1001 无抵扣 1002 现金账户抵扣 1003 积分账户抵扣 1004 优惠券抵扣 feeAccountDetailPo.setAmount(paramObj.getDouble("deductionAmount") + ""); //现金抵扣金额 feeAccountDetailServiceSMOImpl.saveFeeAccountDetail(feeAccountDetailPo); // BigDecimal receivedAmountDec = new BigDecimal(payFeeDetailPo.getReceivedAmount()); // receivedAmountDec = receivedAmountDec.subtract(cashSum); // payFeeDetailPo.setReceivedAmount(receivedAmountDec.doubleValue() + ""); paramObj.put("remark", paramObj.getString("remark") + "-现金账户抵扣" + paramObj.getDouble("deductionAmount") + "元"); } private void modifyCouponUser(JSONObject paramObj) { if (!paramObj.containsKey("couponPrice") || paramObj.getDouble("couponPrice") <= 0) { return; } //FeeDto feeInfo = (FeeDto) paramObj.get("feeInfo"); CouponUserDto couponUserDto = null; JSONArray couponUserDtos = paramObj.getJSONArray("couponUserDtos"); CouponUserDto couponUser = null; for (int accountIndex = 0; accountIndex < couponUserDtos.size(); accountIndex++) { couponUser = BeanConvertUtil.covertBean(couponUserDtos.getJSONObject(accountIndex), CouponUserDto.class); couponUserDto = new CouponUserDto(); couponUserDto.setCouponId(couponUser.getCouponId()); couponUserDto.setState(CouponUserDto.COUPON_STATE_RUN); List couponUserDtos1 = couponUserV1InnerServiceSMOImpl.queryCouponUsers(couponUserDto); if (couponUserDtos1 == null || couponUserDtos1.size() < 1) { throw new CmdException("优惠券被使用"); } CouponUserPo couponUserPo = new CouponUserPo(); couponUserPo.setState(CouponUserDto.COUPON_STATE_STOP); couponUserPo.setCouponId(couponUser.getCouponId()); int fage = couponUserV1InnerServiceSMOImpl.updateCouponUser(couponUserPo); if (fage < 1) { throw new CmdException("更新优惠卷信息失败"); } CouponUserDetailPo couponUserDetailPo = new CouponUserDetailPo(); couponUserDetailPo.setUoId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_usId)); couponUserDetailPo.setCouponId(couponUser.getCouponId()); couponUserDetailPo.setUserId(couponUser.getUserId()); couponUserDetailPo.setCouponName(couponUser.getCouponName()); couponUserDetailPo.setUserName(couponUser.getUserName()); couponUserDetailPo.setObjId(paramObj.getString("feeId")); couponUserDetailPo.setObjType(paramObj.getString("feeTypeCd")); couponUserDetailPo.setOrderId(paramObj.getString("oId")); fage = couponUserDetailV1InnerServiceSMOImpl.saveCouponUserDetail(couponUserDetailPo); if (fage < 1) { throw new CmdException("新增优惠卷使用记录信息失败"); } } paramObj.put("remark", paramObj.getString("remark") + "-优惠劵抵扣" + paramObj.getDouble("couponPrice") + "元"); } private void addDiscount(JSONObject paramObj) { if (!paramObj.containsKey("discountPrice") || paramObj.getDouble("discountPrice") <= 0) { return; } JSONArray computeDiscountDtos = paramObj.getJSONArray("computeDiscountDtos"); ComputeDiscountDto computeDiscountDto = null; for (int accountIndex = 0; accountIndex < computeDiscountDtos.size(); accountIndex++) { computeDiscountDto = BeanConvertUtil.covertBean(computeDiscountDtos.getJSONObject(accountIndex), ComputeDiscountDto.class); if (computeDiscountDto.getDiscountPrice() <= 0) { continue; } JSONObject businessFee = new JSONObject(); businessFee.put("discountPrice", computeDiscountDto.getDiscountPrice()); businessFee.put("discountId", computeDiscountDto.getDiscountId()); businessFee.put("detailId", paramObj.getString("detailId")); businessFee.put("communityId", paramObj.getString("communityId")); businessFee.put("feeId", paramObj.getString("feeId")); PayFeeDetailDiscountPo payFeeDetailDiscount = BeanConvertUtil.covertBean(businessFee, PayFeeDetailDiscountPo.class); payFeeDetailDiscount.setbId("-1"); payFeeDetailDiscount.setDetailDiscountId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_dataId)); int fage = payFeeDetailDiscountNewV1InnerServiceSMOImpl.savePayFeeDetailDiscountNew(payFeeDetailDiscount); if (fage < 1) { throw new CmdException("更新费用信息失败"); } } } private void dealOwnerCartEndTime(JSONObject paramObj) { FeeDto feeDto = new FeeDto(); feeDto.setFeeId(paramObj.getString("feeId")); feeDto.setCommunityId(paramObj.getString("communityId")); List feeDtos = feeInnerServiceSMOImpl.queryFees(feeDto); if (feeDtos == null || feeDtos.size() < 1) { return; } //为停车费单独处理 if (!FeeDto.PAYER_OBJ_TYPE_CAR.equals(feeDtos.get(0).getPayerObjType())) { return; } Date feeEndTime = feeDtos.get(0).getEndTime(); OwnerCarDto ownerCarDto = new OwnerCarDto(); ownerCarDto.setCommunityId(paramObj.getString("communityId")); ownerCarDto.setCarId(feeDtos.get(0).getPayerObjId()); List ownerCarDtos = ownerCarInnerServiceSMOImpl.queryOwnerCars(ownerCarDto); Calendar endTimeCalendar = null; //车位费用续租 if (ownerCarDtos == null || ownerCarDtos.size() < 1) { return; } for (OwnerCarDto tmpOwnerCarDto : ownerCarDtos) { //后付费 或者信用期车辆 加一个月 if (FeeConfigDto.PAYMENT_CD_AFTER.equals(feeDtos.get(0).getPaymentCd()) || OwnerCarDto.CAR_TYPE_CREDIT.equals(tmpOwnerCarDto.getCarType())) { endTimeCalendar = Calendar.getInstance(); endTimeCalendar.setTime(feeEndTime); endTimeCalendar.add(Calendar.MONTH, 1); feeEndTime = endTimeCalendar.getTime(); } if (tmpOwnerCarDto.getEndTime().getTime() < feeEndTime.getTime()) { OwnerCarPo ownerCarPo = new OwnerCarPo(); ownerCarPo.setMemberId(tmpOwnerCarDto.getMemberId()); ownerCarPo.setEndTime(DateUtil.getFormatTimeString(feeEndTime, DateUtil.DATE_FORMATE_STRING_A)); int fage = ownerCarNewV1InnerServiceSMOImpl.updateOwnerCarNew(ownerCarPo); if (fage < 1) { throw new CmdException("更新费用信息失败"); } } } } }