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;