Explorar o código

优化欠费缴费功能

java110 %!s(int64=6) %!d(string=hai) anos
pai
achega
27ac059511

+ 10 - 0
java110-bean/src/main/java/com/java110/vo/ResultVo.java

@@ -171,6 +171,16 @@ public class ResultVo implements Serializable {
         return responseEntity;
     }
 
+    /**
+     * 成功通用回复
+     * @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对象
      *

+ 9 - 0
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>

+ 4 - 0
java110-interface/src/main/java/com/java110/intf/community/IRepairInnerServiceSMO.java

@@ -2,6 +2,7 @@ package com.java110.intf.community;
 
 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 @@ public interface IRepairInnerServiceSMO {
      */
     @RequestMapping(value = "/queryStaffFinishRepairsCount", method = RequestMethod.POST)
     int queryStaffFinishRepairsCount(@RequestBody RepairDto repairDto);
+
+    @RequestMapping(value = "/updateRepair", method = RequestMethod.POST)
+    int updateRepair(@RequestBody RepairPoolPo repairPoolPo);
 }

+ 9 - 0
java110-interface/src/main/java/com/java110/intf/fee/IFeeDetailInnerServiceSMO.java

@@ -2,6 +2,7 @@ package com.java110.intf.fee;
 
 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 @@ public interface IFeeDetailInnerServiceSMO {
      */
     @RequestMapping(value = "/queryFeeDetailsCount", method = RequestMethod.POST)
     int queryFeeDetailsCount(@RequestBody FeeDetailDto feeDetailDto);
+
+    /**
+     * 保存费用明细
+     * @param payFeeDetailPo
+     * @return
+     */
+    @RequestMapping(value = "/saveFeeDetail")
+    int saveFeeDetail(@RequestBody PayFeeDetailPo payFeeDetailPo);
 }

+ 5 - 0
java110-interface/src/main/java/com/java110/intf/fee/IFeeInnerServiceSMO.java

@@ -5,6 +5,7 @@ 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.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 @@ public interface IFeeInnerServiceSMO {
      */
     @RequestMapping(value = "/insertBill", method = RequestMethod.POST)
     public int insertBill(@RequestBody BillDto billDto);
+
+
+    @RequestMapping(value = "/updateFee", method = RequestMethod.POST)
+    public int updateFee(@RequestBody PayFeePo payFeePo);
 }

+ 9 - 2
service-community/src/main/java/com/java110/community/smo/impl/RepairInnerServiceSMOImpl.java

@@ -3,10 +3,11 @@ package com.java110.community.smo.impl;
 
 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 @@ public class RepairInnerServiceSMOImpl extends BaseServiceSMO implements IRepair
         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;
     }

+ 33 - 1
service-fee/src/main/java/com/java110/fee/api/FeeApi.java

@@ -6,6 +6,7 @@ import com.java110.core.context.BusinessServiceDataFlow;
 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;
@@ -45,6 +46,9 @@ public class FeeApi extends BaseController {
     @Autowired
     private IQueryOweFee queryOweFeeImpl;
 
+    @Autowired
+    private IPayOweFee payOweFeeImpl;
+
     @RequestMapping(path = "/service", method = RequestMethod.GET)
     public String serviceGet(HttpServletRequest request) {
         return DataTransactionFactory.createBusinessResponseJson(ResponseConstant.RESULT_CODE_ERROR, "不支持Get方法请求").toJSONString();
@@ -159,10 +163,11 @@ public class FeeApi extends BaseController {
 
     /**
      * 查询欠费费用
-     * @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 @@ public class FeeApi extends BaseController {
         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);
+    }
+
 }

+ 14 - 0
service-fee/src/main/java/com/java110/fee/bmo/IPayOweFee.java

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

+ 209 - 0
service-fee/src/main/java/com/java110/fee/bmo/impl/PayOweFeeImpl.java

@@ -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());
+        }
+    }
+}

+ 7 - 0
service-fee/src/main/java/com/java110/fee/dao/IFeeDetailServiceDao.java

@@ -74,4 +74,11 @@ public interface IFeeDetailServiceDao {
      */
     int queryFeeDetailsCount(Map info);
 
+    /**
+     * 保存 费用明细信息
+     * @param feeDetail 费用明细信息 封装
+     * @throws DAOException 操作数据库异常
+     */
+    void saveFeeDetail(Map feeDetail) throws DAOException;
+
 }

+ 11 - 0
service-fee/src/main/java/com/java110/fee/dao/impl/FeeDetailServiceDaoImpl.java

@@ -125,5 +125,16 @@ public class FeeDetailServiceDaoImpl extends BaseServiceDao implements IFeeDetai
         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));
+        }
+    }
+
 
 }

+ 6 - 0
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 class FeeDetailInnerServiceSMOImpl extends BaseServiceSMO implements IFee
     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;
     }

+ 13 - 6
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 @@ public class FeeInnerServiceSMOImpl extends BaseServiceSMO implements IFeeInnerS
 
         List<Map> fees = feeServiceDaoImpl.getBusinessFeeInfo(BeanConvertUtil.beanCovertMap(feeDto));
 
-        return BeanConvertUtil.covertBeanList(fees,FeeDto.class);
+        return BeanConvertUtil.covertBeanList(fees, FeeDto.class);
 
     }
 
@@ -207,6 +208,12 @@ public class FeeInnerServiceSMOImpl extends BaseServiceSMO implements IFeeInnerS
         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;