java110
2020-08-04 27ac059511b957d5533c40afa007d821f79ed9ae
优化欠费缴费功能
11个文件已修改
2个文件已添加
348 ■■■■■ 已修改文件
java110-bean/src/main/java/com/java110/vo/ResultVo.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
java110-db/src/main/resources/mapper/fee/FeeDetailServiceDaoImplMapper.xml 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
java110-interface/src/main/java/com/java110/intf/community/IRepairInnerServiceSMO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
java110-interface/src/main/java/com/java110/intf/fee/IFeeDetailInnerServiceSMO.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
java110-interface/src/main/java/com/java110/intf/fee/IFeeInnerServiceSMO.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-community/src/main/java/com/java110/community/smo/impl/RepairInnerServiceSMOImpl.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-fee/src/main/java/com/java110/fee/api/FeeApi.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-fee/src/main/java/com/java110/fee/bmo/IPayOweFee.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-fee/src/main/java/com/java110/fee/bmo/impl/PayOweFeeImpl.java 209 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-fee/src/main/java/com/java110/fee/dao/IFeeDetailServiceDao.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-fee/src/main/java/com/java110/fee/dao/impl/FeeDetailServiceDaoImpl.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-fee/src/main/java/com/java110/fee/smo/impl/FeeDetailInnerServiceSMOImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-fee/src/main/java/com/java110/fee/smo/impl/FeeInnerServiceSMOImpl.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
java110-bean/src/main/java/com/java110/vo/ResultVo.java
@@ -172,6 +172,16 @@
    }
    /**
     * 成功通用回复
     * @return
     */
    public static ResponseEntity<String> success() {
        ResultVo resultVo = new ResultVo(CODE_OK, MSG_OK);
        ResponseEntity<String> responseEntity = new ResponseEntity<String>(resultVo.toString(), HttpStatus.OK);
        return responseEntity;
    }
    /**
     * 创建ResponseEntity对象
     *
     * @param records 页数
java110-db/src/main/resources/mapper/fee/FeeDetailServiceDaoImplMapper.xml
@@ -242,4 +242,13 @@
    </select>
    <!-- 保存费用明细信息至 instance表中 add by wuxw 2018-07-03 -->
    <insert id="saveFeeDetail" parameterType="Map">
        insert into
        pay_fee_detail(
        prime_rate,detail_id,receivable_amount,cycles,remark,status_cd,received_amount,community_id,b_id,fee_id,state)
        values(#{primeRate},#{detailId},#{receivableAmount},#{cycles},#{remark},'0',#{receivedAmount},#{communityId},'-1',#{feeId},#{state})
    </insert>
</mapper>
java110-interface/src/main/java/com/java110/intf/community/IRepairInnerServiceSMO.java
@@ -2,6 +2,7 @@
import com.java110.config.feign.FeignConfiguration;
import com.java110.dto.repair.RepairDto;
import com.java110.po.owner.RepairPoolPo;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
@@ -81,4 +82,7 @@
     */
    @RequestMapping(value = "/queryStaffFinishRepairsCount", method = RequestMethod.POST)
    int queryStaffFinishRepairsCount(@RequestBody RepairDto repairDto);
    @RequestMapping(value = "/updateRepair", method = RequestMethod.POST)
    int updateRepair(@RequestBody RepairPoolPo repairPoolPo);
}
java110-interface/src/main/java/com/java110/intf/fee/IFeeDetailInnerServiceSMO.java
@@ -2,6 +2,7 @@
import com.java110.config.feign.FeignConfiguration;
import com.java110.dto.fee.FeeDetailDto;
import com.java110.po.fee.PayFeeDetailPo;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
@@ -39,4 +40,12 @@
     */
    @RequestMapping(value = "/queryFeeDetailsCount", method = RequestMethod.POST)
    int queryFeeDetailsCount(@RequestBody FeeDetailDto feeDetailDto);
    /**
     * 保存费用明细
     * @param payFeeDetailPo
     * @return
     */
    @RequestMapping(value = "/saveFeeDetail")
    int saveFeeDetail(@RequestBody PayFeeDetailPo payFeeDetailPo);
}
java110-interface/src/main/java/com/java110/intf/fee/IFeeInnerServiceSMO.java
@@ -5,6 +5,7 @@
import com.java110.dto.fee.BillOweFeeDto;
import com.java110.dto.fee.FeeAttrDto;
import com.java110.dto.fee.FeeDto;
import com.java110.po.fee.PayFeePo;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
@@ -126,4 +127,8 @@
     */
    @RequestMapping(value = "/insertBill", method = RequestMethod.POST)
    public int insertBill(@RequestBody BillDto billDto);
    @RequestMapping(value = "/updateFee", method = RequestMethod.POST)
    public int updateFee(@RequestBody PayFeePo payFeePo);
}
service-community/src/main/java/com/java110/community/smo/impl/RepairInnerServiceSMOImpl.java
@@ -3,10 +3,11 @@
import com.java110.community.dao.IRepairServiceDao;
import com.java110.core.base.smo.BaseServiceSMO;
import com.java110.intf.community.IRepairInnerServiceSMO;
import com.java110.intf.user.IUserInnerServiceSMO;
import com.java110.dto.PageDto;
import com.java110.dto.repair.RepairDto;
import com.java110.intf.community.IRepairInnerServiceSMO;
import com.java110.intf.user.IUserInnerServiceSMO;
import com.java110.po.owner.RepairPoolPo;
import com.java110.utils.util.BeanConvertUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
@@ -95,6 +96,12 @@
        return repairServiceDaoImpl.queryStaffFinishRepairsCount(BeanConvertUtil.beanCovertMap(repairDto));
    }
    @Override
    public int updateRepair(@RequestBody RepairPoolPo repairPoolPo) {
        repairServiceDaoImpl.updateRepairInfoInstance(BeanConvertUtil.beanCovertMap(repairPoolPo));
        return 1;
    }
    public IRepairServiceDao getRepairServiceDaoImpl() {
        return repairServiceDaoImpl;
    }
service-fee/src/main/java/com/java110/fee/api/FeeApi.java
@@ -6,6 +6,7 @@
import com.java110.core.factory.DataTransactionFactory;
import com.java110.dto.fee.FeeAttrDto;
import com.java110.dto.fee.FeeDto;
import com.java110.fee.bmo.IPayOweFee;
import com.java110.fee.bmo.IQueryFeeByAttr;
import com.java110.fee.bmo.IQueryOweFee;
import com.java110.fee.bmo.IQueryParkspaceFee;
@@ -44,6 +45,9 @@
    @Autowired
    private IQueryOweFee queryOweFeeImpl;
    @Autowired
    private IPayOweFee payOweFeeImpl;
    @RequestMapping(path = "/service", method = RequestMethod.GET)
    public String serviceGet(HttpServletRequest request) {
@@ -159,10 +163,11 @@
    /**
     * 查询欠费费用
     * @path /app/feeApi/listOweFees
     *
     * @param payObjId    付费方ID
     * @param communityId 小区ID
     * @return
     * @path /app/feeApi/listOweFees
     */
    @RequestMapping(value = "/listOweFees", method = RequestMethod.GET)
    public ResponseEntity<String> listOweFees(
@@ -175,4 +180,31 @@
        feeDto.setCommunityId(communityId);
        return queryOweFeeImpl.query(feeDto);
    }
    /**
     * 欠费批量缴费
     *
     * @param reqJson {
     *                "communityId":"",
     *                "fees":[
     *                {
     *                "feeId":"123123",
     *                "feePrice":10.00,
     *                <p>
     *                }
     *                <p>
     *                ]
     *                }
     * @return
     * @path /app/feeApi/payOweFee
     */
    @RequestMapping(value = "/payOweFee", method = RequestMethod.POST)
    public ResponseEntity<String> payOweFee(@RequestBody JSONObject reqJson) {
        Assert.hasKeyAndValue(reqJson, "communityId", "未包含小区信息");
        Assert.hasKey(reqJson, "fees", "未包含缴费项目");
        return payOweFeeImpl.pay(reqJson);
    }
}
service-fee/src/main/java/com/java110/fee/bmo/IPayOweFee.java
New file
@@ -0,0 +1,14 @@
package com.java110.fee.bmo;
import com.alibaba.fastjson.JSONObject;
import org.springframework.http.ResponseEntity;
public interface IPayOweFee {
    /**
     * 欠费缴费接口
     * @param reqJson 缴费报文
     * @return
     */
    ResponseEntity<String> pay(JSONObject reqJson);
}
service-fee/src/main/java/com/java110/fee/bmo/impl/PayOweFeeImpl.java
New file
@@ -0,0 +1,209 @@
package com.java110.fee.bmo.impl;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.java110.core.annotation.Java110Transactional;
import com.java110.core.factory.GenerateCodeFactory;
import com.java110.dto.fee.FeeAttrDto;
import com.java110.dto.fee.FeeConfigDto;
import com.java110.dto.fee.FeeDto;
import com.java110.dto.repair.RepairDto;
import com.java110.fee.bmo.IPayOweFee;
import com.java110.fee.listener.fee.UpdateFeeInfoListener;
import com.java110.intf.community.IRepairInnerServiceSMO;
import com.java110.intf.fee.IFeeAttrInnerServiceSMO;
import com.java110.intf.fee.IFeeConfigInnerServiceSMO;
import com.java110.intf.fee.IFeeDetailInnerServiceSMO;
import com.java110.intf.fee.IFeeInnerServiceSMO;
import com.java110.po.fee.PayFeeDetailPo;
import com.java110.po.fee.PayFeePo;
import com.java110.po.owner.RepairPoolPo;
import com.java110.utils.constant.FeeFlagTypeConstant;
import com.java110.utils.constant.FeeStateConstant;
import com.java110.utils.constant.ResponseConstant;
import com.java110.utils.exception.ListenerExecuteException;
import com.java110.utils.lock.DistributedLock;
import com.java110.utils.util.Assert;
import com.java110.utils.util.DateUtil;
import com.java110.vo.ResultVo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.text.ParseException;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
/**
 * 欠费缴费实现类
 */
@Service
public class PayOweFeeImpl implements IPayOweFee {
    private static Logger logger = LoggerFactory.getLogger(UpdateFeeInfoListener.class);
    @Autowired
    private IFeeInnerServiceSMO feeInnerServiceSMOImpl;
    @Autowired
    private IFeeDetailInnerServiceSMO feeDetailInnerServiceSMOImpl;
    @Autowired
    private IFeeConfigInnerServiceSMO feeConfigInnerServiceSMOImpl;
    @Autowired
    private IFeeAttrInnerServiceSMO feeAttrInnerServiceSMOImpl;
    @Autowired
    private IRepairInnerServiceSMO repairInnerServiceSMOImpl;
    /**
     * 欠费缴费
     *
     * @param reqJson 缴费报文 {"communityId":"7020181217000001","fees":[{"feeId":"902020073149140091","feePrice":90},{"feeId":"902020072844020741","feePrice":1500}]}
     * @return
     */
    @Override
    @Java110Transactional
    public ResponseEntity<String> pay(JSONObject reqJson) {
        //小区ID
        String communityId = reqJson.getString("communityId");
        JSONArray fees = reqJson.getJSONArray("fees");
        JSONObject feeObj = null;
        for (int feeIndex = 0; feeIndex < fees.size(); feeIndex++) {
            feeObj = fees.getJSONObject(feeIndex);
            Assert.hasKeyAndValue(feeObj, "feeId", "未包含费用项ID");
            Assert.hasKeyAndValue(feeObj, "feeId", "未包含费用项ID");
            feeObj.put("communityId", communityId);
            doPayOweFee(feeObj);
        }
        return ResultVo.success();
    }
    private void doPayOweFee(JSONObject feeObj) {
        //开启全局锁
        String requestId = DistributedLock.getLockUUID();
        String key = this.getClass().getSimpleName() + feeObj.get("feeId");
        try {
            DistributedLock.waitGetDistributedLock(key, requestId);
            addFeeDetail(feeObj);
            modifyFee(feeObj);
            //判断是否有派单属性ID
            FeeAttrDto feeAttrDto = new FeeAttrDto();
            feeAttrDto.setCommunityId(feeObj.getString("communityId"));
            feeAttrDto.setFeeId(feeObj.getString("feeId"));
            feeAttrDto.setSpecCd(FeeAttrDto.SPEC_CD_REPAIR);
            List<FeeAttrDto> feeAttrDtos = feeAttrInnerServiceSMOImpl.queryFeeAttrs(feeAttrDto);
            //修改 派单状态
            if (feeAttrDtos != null && feeAttrDtos.size() > 0) {
                RepairPoolPo repairPoolPo = new RepairPoolPo();
                repairPoolPo.setRepairId(feeAttrDtos.get(0).getValue());
                repairPoolPo.setCommunityId(feeObj.getString("communityId"));
                repairPoolPo.setState(RepairDto.STATE_APPRAISE);
                int saved = repairInnerServiceSMOImpl.updateRepair(repairPoolPo);
                if (saved < 1) {
                    throw new IllegalArgumentException("缴费后修改报修单失败");
                }
            }
        } catch (Exception e) {
            logger.error("缴费失败", e);
            throw new IllegalArgumentException("缴费失败" + e);
        } finally {
            DistributedLock.releaseDistributedLock(requestId, key);
        }
    }
    /**
     * @param feeObj
     */
    private void modifyFee(JSONObject feeObj) throws ParseException {
        PayFeePo payFeePo = new PayFeePo();
        FeeDto feeInfo = (FeeDto) feeObj.get("feeInfo");
        Date endTime = feeInfo.getEndTime();
        Calendar endCalender = Calendar.getInstance();
        endCalender.setTime(endTime);
        int hours = 0;
        hours = new Double(Double.parseDouble(feeObj.getString("tmpCycles")) * DateUtil.getCurrentMonthDay() * 24).intValue();
        endCalender.add(Calendar.HOUR, hours);
        FeeConfigDto feeConfigDto = new FeeConfigDto();
        feeConfigDto.setConfigId(feeInfo.getConfigId());
        feeConfigDto.setCommunityId(feeInfo.getCommunityId());
        List<FeeConfigDto> feeConfigDtos = feeConfigInnerServiceSMOImpl.queryFeeConfigs(feeConfigDto);
        Assert.listOnlyOne(feeConfigDtos, "未找到费用配置");
        payFeePo.setEndTime(DateUtil.getFormatTimeString(endCalender.getTime(), DateUtil.DATE_FORMATE_STRING_A));
        // 一次性收费类型,缴费后,则设置费用状态为收费结束、设置结束日期为费用项终止日期
        if (FeeFlagTypeConstant.ONETIME.equals(feeConfigDtos.get(0).getFeeFlag())) {
            payFeePo.setState(FeeStateConstant.END);
            payFeePo.setEndTime(feeConfigDtos.get(0).getEndTime());
        }
        // 周期性收费、缴费后,到期日期在费用项终止日期后,则设置缴费状态结束,设置结束日期为费用项终止日期
        if (FeeFlagTypeConstant.CYCLE.equals(feeConfigDtos.get(0).getFeeFlag())) {
            if ((feeInfo.getEndTime()).after(DateUtil.getDateFromString(feeConfigDtos.get(0).getEndTime(), DateUtil.DATE_FORMATE_STRING_A))) {
                payFeePo.setState(FeeStateConstant.END);
                payFeePo.setEndTime(feeConfigDtos.get(0).getEndTime());
            }
        }
        payFeePo.setFeeId(feeObj.getString("feeId"));
        payFeePo.setEndTime(DateUtil.getFormatTimeString(feeInfo.getEndTime(), DateUtil.DATE_FORMATE_STRING_A));
        payFeePo.setCommunityId(feeObj.getString("communityId"));
        int saveFlag = feeInnerServiceSMOImpl.updateFee(payFeePo);
        if (saveFlag < 1) {
            throw new IllegalArgumentException("缴费失败" + payFeePo.toString());
        }
    }
    /**
     * 添加 费用缴费明细
     *
     * @param paramInJson
     */
    private void addFeeDetail(JSONObject paramInJson) {
        PayFeeDetailPo payFeeDetailPo = new PayFeeDetailPo();
        payFeeDetailPo.setDetailId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_detailId));
        payFeeDetailPo.setPrimeRate("1.00");
        //计算 应收金额
        FeeDto feeDto = new FeeDto();
        feeDto.setFeeId(paramInJson.getString("feeId"));
        feeDto.setCommunityId(paramInJson.getString("communityId"));
        List<FeeDto> feeDtos = feeInnerServiceSMOImpl.queryFees(feeDto);
        if (feeDtos == null || feeDtos.size() != 1) {
            throw new ListenerExecuteException(ResponseConstant.RESULT_CODE_ERROR, "查询费用信息失败,未查到数据或查到多条数据");
        }
        feeDto = feeDtos.get(0);
        paramInJson.put("feeInfo", feeDto);
        BigDecimal feePrice = new BigDecimal("0.00");
        BigDecimal receivedAmount = new BigDecimal(Double.parseDouble(paramInJson.getString("receivedAmount")));
        BigDecimal cycles = receivedAmount.divide(feePrice, 2, BigDecimal.ROUND_HALF_EVEN);
        paramInJson.put("tmpCycles", cycles);
        payFeeDetailPo.setCommunityId(paramInJson.getString("communityId"));
        payFeeDetailPo.setCycles(cycles.doubleValue() + "");
        payFeeDetailPo.setReceivableAmount(receivedAmount.doubleValue() + "");
        payFeeDetailPo.setReceivedAmount(receivedAmount.doubleValue() + "");
        int saveFeeDetail = feeDetailInnerServiceSMOImpl.saveFeeDetail(payFeeDetailPo);
        if (saveFeeDetail < 1) {
            throw new IllegalArgumentException("保存费用详情失败" + payFeeDetailPo.toString());
        }
    }
}
service-fee/src/main/java/com/java110/fee/dao/IFeeDetailServiceDao.java
@@ -74,4 +74,11 @@
     */
    int queryFeeDetailsCount(Map info);
    /**
     * 保存 费用明细信息
     * @param feeDetail 费用明细信息 封装
     * @throws DAOException 操作数据库异常
     */
    void saveFeeDetail(Map feeDetail) throws DAOException;
}
service-fee/src/main/java/com/java110/fee/dao/impl/FeeDetailServiceDaoImpl.java
@@ -125,5 +125,16 @@
        return Integer.parseInt(businessFeeDetailInfos.get(0).get("count").toString());
    }
    @Override
    public void saveFeeDetail(Map feeDetail) throws DAOException {
        logger.debug("保存明细 入参 info : {}",feeDetail);
        int saveFlag = sqlSessionTemplate.update("feeDetailServiceDaoImpl.saveFeeDetail",feeDetail);
        if(saveFlag < 1){
            throw new DAOException(ResponseConstant.RESULT_PARAM_ERROR,"保存明细 数据失败:"+ JSONObject.toJSONString(feeDetail));
        }
    }
}
service-fee/src/main/java/com/java110/fee/smo/impl/FeeDetailInnerServiceSMOImpl.java
@@ -1,6 +1,7 @@
package com.java110.fee.smo.impl;
import com.java110.po.fee.PayFeeDetailPo;
import com.java110.utils.util.BeanConvertUtil;
import com.java110.fee.dao.IFeeDetailServiceDao;
import com.java110.core.base.smo.BaseServiceSMO;
@@ -52,6 +53,11 @@
    public int queryFeeDetailsCount(@RequestBody FeeDetailDto feeDetailDto) {
        return feeDetailServiceDaoImpl.queryFeeDetailsCount(BeanConvertUtil.beanCovertMap(feeDetailDto));    }
    @Override
    public int saveFeeDetail(@RequestBody PayFeeDetailPo payFeeDetailPo) {
        return 0;
    }
    public IFeeDetailServiceDao getFeeDetailServiceDaoImpl() {
        return feeDetailServiceDaoImpl;
    }
service-fee/src/main/java/com/java110/fee/smo/impl/FeeInnerServiceSMOImpl.java
@@ -1,17 +1,18 @@
package com.java110.fee.smo.impl;
import com.java110.core.base.smo.BaseServiceSMO;
import com.java110.dto.PageDto;
import com.java110.dto.fee.BillDto;
import com.java110.dto.fee.BillOweFeeDto;
import com.java110.dto.fee.FeeAttrDto;
import com.java110.dto.fee.FeeDto;
import com.java110.dto.user.UserDto;
import com.java110.fee.dao.IFeeServiceDao;
import com.java110.utils.util.BeanConvertUtil;
import com.java110.core.base.smo.BaseServiceSMO;
import com.java110.intf.fee.IFeeInnerServiceSMO;
import com.java110.intf.user.IUserInnerServiceSMO;
import com.java110.dto.fee.FeeDto;
import com.java110.dto.PageDto;
import com.java110.dto.user.UserDto;
import com.java110.po.fee.PayFeePo;
import com.java110.utils.util.BeanConvertUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@@ -69,7 +70,7 @@
        List<Map> fees = feeServiceDaoImpl.getBusinessFeeInfo(BeanConvertUtil.beanCovertMap(feeDto));
        return BeanConvertUtil.covertBeanList(fees,FeeDto.class);
        return BeanConvertUtil.covertBeanList(fees, FeeDto.class);
    }
@@ -207,6 +208,12 @@
        return feeServiceDaoImpl.insertBill(BeanConvertUtil.beanCovertMap(billDto));
    }
    @Override
    public int updateFee(@RequestBody PayFeePo payFeePo) {
        feeServiceDaoImpl.updateFeeInfoInstance(BeanConvertUtil.beanCovertMap(payFeePo));
        return 1;
    }
    public IFeeServiceDao getFeeServiceDaoImpl() {
        return feeServiceDaoImpl;