package com.java110.api.listener.fee;
|
|
import com.alibaba.fastjson.JSONArray;
|
import com.alibaba.fastjson.JSONObject;
|
import com.java110.api.bmo.fee.IFeeBMO;
|
import com.java110.api.bmo.payFeeDetailDiscount.IPayFeeDetailDiscountBMO;
|
import com.java110.api.listener.AbstractServiceApiDataFlowListener;
|
import com.java110.core.annotation.Java110Listener;
|
import com.java110.core.context.DataFlowContext;
|
import com.java110.core.event.service.api.ServiceDataFlowEvent;
|
import com.java110.core.factory.GenerateCodeFactory;
|
import com.java110.core.log.LoggerFactory;
|
import com.java110.dto.app.AppDto;
|
import com.java110.dto.community.CommunityDto;
|
import com.java110.dto.fee.FeeAttrDto;
|
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.repair.RepairDto;
|
import com.java110.dto.repair.RepairUserDto;
|
import com.java110.entity.center.AppService;
|
import com.java110.entity.order.Orders;
|
import com.java110.intf.community.ICommunityV1InnerServiceSMO;
|
import com.java110.intf.community.IRepairUserInnerServiceSMO;
|
import com.java110.intf.community.IRoomInnerServiceSMO;
|
import com.java110.intf.fee.*;
|
import com.java110.intf.user.IOwnerCarInnerServiceSMO;
|
import com.java110.po.applyRoomDiscount.ApplyRoomDiscountPo;
|
import com.java110.po.car.OwnerCarPo;
|
import com.java110.po.owner.RepairPoolPo;
|
import com.java110.po.owner.RepairUserPo;
|
import com.java110.utils.constant.BusinessTypeConstant;
|
import com.java110.utils.constant.CommonConstant;
|
import com.java110.utils.constant.ServiceCodeConstant;
|
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 org.slf4j.Logger;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.http.HttpMethod;
|
import org.springframework.http.HttpStatus;
|
import org.springframework.http.ResponseEntity;
|
|
import java.math.BigDecimal;
|
import java.text.DecimalFormat;
|
import java.text.ParseException;
|
import java.text.SimpleDateFormat;
|
import java.util.Date;
|
import java.util.List;
|
|
/**
|
* @ClassName PayFeeListener
|
* @Description TODO 预交费侦听
|
* @Author wuxw
|
* @Date 2019/6/3 13:46
|
* @Version 1.0
|
* add by wuxw 2019/6/3
|
**/
|
@Java110Listener("payFeePreListener")
|
public class PayFeePreListener extends AbstractServiceApiDataFlowListener {
|
|
private static Logger logger = LoggerFactory.getLogger(PayFeePreListener.class);
|
|
@Autowired
|
private IFeeBMO feeBMOImpl;
|
|
@Autowired
|
private IFeeInnerServiceSMO feeInnerServiceSMOImpl;
|
|
@Autowired
|
private IRoomInnerServiceSMO roomInnerServiceSMOImpl;
|
|
@Autowired
|
private IFeeConfigInnerServiceSMO feeConfigInnerServiceSMOImpl;
|
|
@Autowired
|
private IFeeDiscountInnerServiceSMO feeDiscountInnerServiceSMOImpl;
|
|
@Autowired
|
private IPayFeeDetailDiscountBMO payFeeDetailDiscountBMOImpl;
|
|
@Autowired
|
private IFeeAttrInnerServiceSMO feeAttrInnerServiceSMOImpl;
|
|
@Autowired
|
private IRepairUserInnerServiceSMO repairUserInnerServiceSMO;
|
|
@Autowired
|
private IOwnerCarInnerServiceSMO ownerCarInnerServiceSMOImpl;
|
|
@Autowired
|
private IApplyRoomDiscountInnerServiceSMO applyRoomDiscountInnerServiceSMOImpl;
|
|
@Autowired
|
private IFeeDetailInnerServiceSMO iFeeDetailInnerServiceSMO;
|
|
@Override
|
public String getServiceCode() {
|
return ServiceCodeConstant.SERVICE_CODE_PAY_FEE_PRE;
|
}
|
|
@Override
|
public HttpMethod getHttpMethod() {
|
return HttpMethod.POST;
|
}
|
|
@Autowired
|
private ICommunityV1InnerServiceSMO communityV1InnerServiceSMOImpl;
|
|
@Override
|
public void soService(ServiceDataFlowEvent event) throws ParseException {
|
|
logger.debug("ServiceDataFlowEvent : {}", event);
|
|
DataFlowContext dataFlowContext = event.getDataFlowContext();
|
AppService service = event.getAppService();
|
|
String paramIn = dataFlowContext.getReqData();
|
|
//校验数据
|
validate(paramIn);
|
JSONObject paramObj = JSONObject.parseObject(paramIn);
|
|
dataFlowContext.getRequestCurrentHeaders().put(CommonConstant.HTTP_ORDER_TYPE_CD, "D");
|
JSONArray businesses = new JSONArray();
|
//判断是否有折扣情况
|
judgeDiscount(paramObj);
|
|
String appId = event.getDataFlowContext().getAppId();
|
|
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", "线上小程序支付");
|
}
|
|
//添加单元信息
|
businesses.add(feeBMOImpl.addFeePreDetail(paramObj, dataFlowContext));
|
businesses.add(feeBMOImpl.modifyPreFee(paramObj, dataFlowContext));
|
|
double discountPrice = paramObj.getDouble("discountPrice");
|
if (discountPrice > 0) {
|
addDiscount(paramObj, businesses, dataFlowContext);
|
}
|
|
dealOwnerCartEndTime(paramObj, businesses);
|
|
//判断是否有派单属性ID
|
FeeAttrDto feeAttrDto = new FeeAttrDto();
|
feeAttrDto.setCommunityId(paramObj.getString("communityId"));
|
feeAttrDto.setFeeId(paramObj.getString("feeId"));
|
feeAttrDto.setSpecCd(FeeAttrDto.SPEC_CD_REPAIR);
|
List<FeeAttrDto> feeAttrDtos = feeAttrInnerServiceSMOImpl.queryFeeAttrs(feeAttrDto);
|
//修改 派单状态
|
if (feeAttrDtos != null && feeAttrDtos.size() > 0) {
|
JSONObject business = JSONObject.parseObject("{\"datas\":{}}");
|
business.put(CommonConstant.HTTP_BUSINESS_TYPE_CD, BusinessTypeConstant.BUSINESS_TYPE_UPDATE_REPAIR);
|
business.put(CommonConstant.HTTP_SEQ, DEFAULT_SEQ + 2);
|
business.put(CommonConstant.HTTP_INVOKE_MODEL, CommonConstant.HTTP_INVOKE_MODEL_S);
|
RepairPoolPo repairPoolPo = new RepairPoolPo();
|
repairPoolPo.setRepairId(feeAttrDtos.get(0).getValue());
|
repairPoolPo.setCommunityId(paramObj.getString("communityId"));
|
repairPoolPo.setState(RepairDto.STATE_APPRAISE);
|
business.getJSONObject(CommonConstant.HTTP_BUSINESS_DATAS).put(RepairPoolPo.class.getSimpleName(), BeanConvertUtil.beanCovertMap(repairPoolPo));
|
businesses.add(business);
|
}
|
//修改报修派单状态
|
if (feeAttrDtos != null && feeAttrDtos.size() > 0) {
|
JSONObject business = JSONObject.parseObject("{\"datas\":{}}");
|
business.put(CommonConstant.HTTP_BUSINESS_TYPE_CD, BusinessTypeConstant.BUSINESS_TYPE_UPDATE_REPAIR_USER);
|
business.put(CommonConstant.HTTP_SEQ, DEFAULT_SEQ + 3);
|
business.put(CommonConstant.HTTP_INVOKE_MODEL, CommonConstant.HTTP_INVOKE_MODEL_S);
|
RepairUserDto repairUserDto = new RepairUserDto();
|
repairUserDto.setRepairId(feeAttrDtos.get(0).getValue());
|
repairUserDto.setState(RepairUserDto.STATE_PAY_FEE);
|
//查询待支付状态的记录
|
List<RepairUserDto> 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) + "元");
|
//新增待评价状态
|
JSONObject object = JSONObject.parseObject("{\"datas\":{}}");
|
object.put(CommonConstant.HTTP_BUSINESS_TYPE_CD, BusinessTypeConstant.BUSINESS_TYPE_SAVE_REPAIR_USER);
|
object.put(CommonConstant.HTTP_SEQ, DEFAULT_SEQ + 3);
|
object.put(CommonConstant.HTTP_INVOKE_MODEL, CommonConstant.HTTP_INVOKE_MODEL_S);
|
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");
|
object.getJSONObject(CommonConstant.HTTP_BUSINESS_DATAS).put(RepairUserPo.class.getSimpleName(), BeanConvertUtil.beanCovertMap(repairUser));
|
business.getJSONObject(CommonConstant.HTTP_BUSINESS_DATAS).put(RepairUserPo.class.getSimpleName(), BeanConvertUtil.beanCovertMap(repairUserPo));
|
businesses.add(object);
|
businesses.add(business);
|
}
|
|
dataFlowContext.getRequestCurrentHeaders().put(CommonConstant.ORDER_PROCESS, Orders.ORDER_PROCESS_ORDER_PRE_SUBMIT);
|
ResponseEntity<String> responseEntity = feeBMOImpl.callService(dataFlowContext, service.getServiceCode(), businesses);
|
//查询 pay_fee_detail 是否缴费
|
FeeDetailDto feeDetailDto = new FeeDetailDto();
|
feeDetailDto.setDetailId(paramObj.getString("detailId"));
|
List<FeeDetailDto> feeDetailDtoList = iFeeDetailInnerServiceSMO.queryBusinessFeeDetails(feeDetailDto);
|
if (feeDetailDtoList != null && feeDetailDtoList.size() == 1) {
|
//获取bId
|
String bId = feeDetailDtoList.get(0).getbId();
|
//获取优惠
|
List<ComputeDiscountDto> computeDiscountDtos = (List<ComputeDiscountDto>) paramObj.get("computeDiscountDtos");
|
if (computeDiscountDtos != null) {
|
for (ComputeDiscountDto computeDiscountDto : computeDiscountDtos) {
|
if (!StringUtil.isEmpty(computeDiscountDto.getArdId())) {
|
ApplyRoomDiscountPo applyRoomDiscountPo = new ApplyRoomDiscountPo();
|
//将业务id更新到空置房优惠里面
|
applyRoomDiscountPo.setbId(bId);
|
applyRoomDiscountPo.setArdId(computeDiscountDto.getArdId());
|
applyRoomDiscountInnerServiceSMOImpl.updateApplyRoomDiscount(applyRoomDiscountPo);
|
}
|
}
|
}
|
|
}
|
if (responseEntity.getStatusCode() != HttpStatus.OK) {
|
dataFlowContext.setResponseEntity(responseEntity);
|
return;
|
}
|
|
JSONObject paramOut = JSONObject.parseObject(responseEntity.getBody());
|
//这里调整为实收金额
|
paramOut.put("receivableAmount", paramObj.getString("receivableAmount"));
|
paramOut.put("receivedAmount", paramObj.getString("receivedAmount"));
|
|
FeeDto feeDto = (FeeDto) paramObj.get("feeInfo");
|
String feeName = getObjName(feeDto);
|
paramOut.put("feeName", feeName);
|
|
responseEntity = new ResponseEntity<>(paramOut.toJSONString(), HttpStatus.OK);
|
dataFlowContext.setResponseEntity(responseEntity);
|
}
|
|
|
private String getObjName(FeeDto feeDto) {
|
//查询小区名称
|
CommunityDto communityDto = new CommunityDto();
|
communityDto.setCommunityId(feeDto.getCommunityId());
|
List<CommunityDto> communityDtos = communityV1InnerServiceSMOImpl.queryCommunitys(communityDto);
|
|
Assert.listOnlyOne(communityDtos, "小区不存在");
|
|
List<FeeAttrDto> feeAttrDtos = feeDto.getFeeAttrDtos();
|
if (feeAttrDtos == null || feeAttrDtos.size() < 1) {
|
return communityDtos.get(0).getName() + "-" + feeDto.getFeeName();
|
}
|
|
for (FeeAttrDto feeAttrDto : feeAttrDtos) {
|
if (FeeAttrDto.SPEC_CD_PAY_OBJECT_NAME.equals(feeAttrDto.getSpecCd())) {
|
return communityDtos.get(0).getName() + "-" + feeAttrDto.getValue() + "-" + feeDto.getFeeName();
|
}
|
}
|
|
return communityDtos.get(0).getName() + "-" + feeDto.getFeeName();
|
}
|
|
private void dealOwnerCartEndTime(JSONObject paramObj, JSONArray businesses) {
|
//为停车费单独处理
|
if (paramObj.containsKey("carPayerObjType")
|
&& FeeDto.PAYER_OBJ_TYPE_CAR.equals(paramObj.getString("carPayerObjType"))) {
|
Date feeEndTime = (Date) paramObj.get("carFeeEndTime");
|
OwnerCarDto ownerCarDto = new OwnerCarDto();
|
ownerCarDto.setCommunityId(paramObj.getString("communityId"));
|
ownerCarDto.setCarId(paramObj.getString("carPayerObjId"));
|
List<OwnerCarDto> ownerCarDtos = ownerCarInnerServiceSMOImpl.queryOwnerCars(ownerCarDto);
|
//车位费用续租
|
if (ownerCarDtos != null) {
|
for (OwnerCarDto tmpOwnerCarDto : ownerCarDtos) {
|
if (tmpOwnerCarDto.getEndTime().getTime() < feeEndTime.getTime()) {
|
JSONObject business = JSONObject.parseObject("{\"datas\":{}}");
|
business.put(CommonConstant.HTTP_BUSINESS_TYPE_CD, BusinessTypeConstant.BUSINESS_TYPE_UPDATE_OWNER_CAR);
|
business.put(CommonConstant.HTTP_SEQ, DEFAULT_SEQ + 1);
|
business.put(CommonConstant.HTTP_INVOKE_MODEL, CommonConstant.HTTP_INVOKE_MODEL_S);
|
OwnerCarPo ownerCarPo = new OwnerCarPo();
|
ownerCarPo.setMemberId(tmpOwnerCarDto.getMemberId());
|
ownerCarPo.setEndTime(DateUtil.getFormatTimeString(feeEndTime, DateUtil.DATE_FORMATE_STRING_A));
|
business.getJSONObject(CommonConstant.HTTP_BUSINESS_DATAS).put(OwnerCarPo.class.getSimpleName(), BeanConvertUtil.beanCovertMap(ownerCarPo));
|
businesses.add(business);
|
}
|
}
|
}
|
}
|
}
|
|
private void judgeDiscount(JSONObject paramObj) throws ParseException {
|
FeeDetailDto feeDetailDto = new FeeDetailDto();
|
feeDetailDto.setCommunityId(paramObj.getString("communityId"));
|
feeDetailDto.setFeeId(paramObj.getString("feeId"));
|
feeDetailDto.setCycles(paramObj.getString("cycles"));
|
feeDetailDto.setPayerObjId(paramObj.getString("payerObjId"));
|
feeDetailDto.setPayerObjType(paramObj.getString("payerObjType"));
|
String endTime = paramObj.getString("endTime"); //获取缴费到期时间
|
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
feeDetailDto.setStartTime(simpleDateFormat.parse(endTime));
|
|
feeDetailDto.setRow(20);
|
feeDetailDto.setPage(1);
|
List<ComputeDiscountDto> computeDiscountDtos = feeDiscountInnerServiceSMOImpl.computeDiscount(feeDetailDto);
|
|
if (computeDiscountDtos == null || computeDiscountDtos.size() < 1) {
|
paramObj.put("discountPrice", 0.0);
|
return;
|
}
|
BigDecimal discountPrice = new BigDecimal(0);
|
for (ComputeDiscountDto computeDiscountDto : computeDiscountDtos) {
|
discountPrice = discountPrice.add(new BigDecimal(computeDiscountDto.getDiscountPrice()));
|
}
|
paramObj.put("discountPrice", discountPrice);
|
paramObj.put("computeDiscountDtos", computeDiscountDtos);
|
}
|
|
private void addDiscount(JSONObject paramObj, JSONArray businesses, DataFlowContext dataFlowContext) {
|
List<ComputeDiscountDto> computeDiscountDtos = (List<ComputeDiscountDto>) paramObj.get("computeDiscountDtos");
|
JSONObject discountBusiness = null;
|
for (ComputeDiscountDto computeDiscountDto : computeDiscountDtos) {
|
if (computeDiscountDto.getDiscountPrice() <= 0) {
|
continue;
|
}
|
JSONObject paramIn = new JSONObject();
|
paramIn.put("discountPrice", computeDiscountDto.getDiscountPrice());
|
paramIn.put("discountId", computeDiscountDto.getDiscountId());
|
paramIn.put("detailId", paramObj.getString("detailId"));
|
paramIn.put("communityId", paramObj.getString("communityId"));
|
paramIn.put("feeId", paramObj.getString("feeId"));
|
discountBusiness = payFeeDetailDiscountBMOImpl.addPayFeeDetailDiscount(paramObj,
|
paramIn, dataFlowContext);
|
if (discountBusiness != null) {
|
businesses.add(discountBusiness);
|
}
|
}
|
}
|
|
/**
|
* 数据校验
|
*
|
* @param paramIn "communityId": "7020181217000001",
|
* "memberId": "3456789",
|
* "memberTypeCd": "390001200001"
|
*/
|
private void validate(String paramIn) {
|
Assert.jsonObjectHaveKey(paramIn, "communityId", "请求报文中未包含communityId节点");
|
Assert.jsonObjectHaveKey(paramIn, "cycles", "请求报文中未包含cycles节点");
|
Assert.jsonObjectHaveKey(paramIn, "receivedAmount", "请求报文中未包含receivedAmount节点");
|
Assert.jsonObjectHaveKey(paramIn, "feeId", "请求报文中未包含feeId节点");
|
Assert.jsonObjectHaveKey(paramIn, "appId", "请求报文中未包含appId节点");
|
|
JSONObject paramInObj = JSONObject.parseObject(paramIn);
|
Assert.hasLength(paramInObj.getString("communityId"), "小区ID不能为空");
|
Assert.hasLength(paramInObj.getString("cycles"), "周期不能为空");
|
Assert.hasLength(paramInObj.getString("receivedAmount"), "实收金额不能为空");
|
Assert.hasLength(paramInObj.getString("feeId"), "费用ID不能为空");
|
Assert.hasLength(paramInObj.getString("appId"), "appId不能为空");
|
|
|
}
|
|
@Override
|
public int getOrder() {
|
return DEFAULT_ORDER;
|
}
|
|
|
public IFeeInnerServiceSMO getFeeInnerServiceSMOImpl() {
|
return feeInnerServiceSMOImpl;
|
}
|
|
public void setFeeInnerServiceSMOImpl(IFeeInnerServiceSMO feeInnerServiceSMOImpl) {
|
this.feeInnerServiceSMOImpl = feeInnerServiceSMOImpl;
|
}
|
|
public IFeeConfigInnerServiceSMO getFeeConfigInnerServiceSMOImpl() {
|
return feeConfigInnerServiceSMOImpl;
|
}
|
|
public void setFeeConfigInnerServiceSMOImpl(IFeeConfigInnerServiceSMO feeConfigInnerServiceSMOImpl) {
|
this.feeConfigInnerServiceSMOImpl = feeConfigInnerServiceSMOImpl;
|
}
|
|
public IRoomInnerServiceSMO getRoomInnerServiceSMOImpl() {
|
return roomInnerServiceSMOImpl;
|
}
|
|
public void setRoomInnerServiceSMOImpl(IRoomInnerServiceSMO roomInnerServiceSMOImpl) {
|
this.roomInnerServiceSMOImpl = roomInnerServiceSMOImpl;
|
}
|
}
|