Your Name пре 2 година
родитељ
комит
08b2c18ce3
1 измењених фајлова са 123 додато и 3 уклоњено
  1. 123 3
      service-fee/src/main/java/com/java110/fee/cmd/fee/PayFeeCmd.java

+ 123 - 3
service-fee/src/main/java/com/java110/fee/cmd/fee/PayFeeCmd.java

@@ -32,6 +32,7 @@ import com.java110.intf.fee.IFeeAccountDetailServiceSMO;
 import com.java110.intf.user.IOwnerCarInnerServiceSMO;
 import com.java110.intf.user.IUserV1InnerServiceSMO;
 import com.java110.po.account.AccountDetailPo;
+import com.java110.po.fee.FeeAttrPo;
 import com.java110.po.room.ApplyRoomDiscountPo;
 import com.java110.po.car.OwnerCarPo;
 import com.java110.po.fee.PayFeeDetailPo;
@@ -41,6 +42,7 @@ import com.java110.po.owner.RepairPoolPo;
 import com.java110.po.owner.RepairUserPo;
 import com.java110.po.payFee.PayFeeDetailDiscountPo;
 import com.java110.utils.cache.CommonCache;
+import com.java110.utils.constant.CommonConstant;
 import com.java110.utils.constant.FeeFlagTypeConstant;
 import com.java110.utils.constant.ResponseConstant;
 import com.java110.utils.exception.CmdException;
@@ -210,13 +212,20 @@ public class PayFeeCmd extends Cmd {
         List<UserDto> userDtos = userV1InnerServiceSMOImpl.queryUsers(userDto);
         Assert.listOnlyOne(userDtos, "用户未登录");
 
+        String cycle = paramObj.getString("cycle");
+        Date endTime = null;
+
         PayFeePo payFeePo = null;
         String requestId = DistributedLock.getLockUUID();
         String key = this.getClass().getSimpleName() + paramObj.get("feeId");
         try {
             DistributedLock.waitGetDistributedLock(key, requestId);
+            //todo 封装 缴费记录报文
             JSONObject feeDetail = addFeeDetail(paramObj);
+            FeeDto feeInfo = (FeeDto) paramObj.get("feeInfo");
+            endTime = feeInfo.getEndTime();
             feeDetail.put("payableAmount", feeDetail.getString("receivableAmount"));
+            //todo 封装 修改费用时间报文
             JSONObject fee = modifyFee(paramObj);
             payFeePo = BeanConvertUtil.covertBean(fee, PayFeePo.class);
             PayFeeDetailPo payFeeDetailPo = BeanConvertUtil.covertBean(feeDetail, PayFeeDetailPo.class);
@@ -244,10 +253,12 @@ public class PayFeeCmd extends Cmd {
             if (flag < 1) {
                 throw new CmdException("缴费失败");
             }
+            // todo 如果是按 自定义时间段缴费,这里补一条缴费记录 和 欠费费用
+            ifCustomStartEndTimePayFee(cycle, endTime, payFeeDetailPo, payFeePo, paramObj);
         } catch (ParseException e) {
             e.printStackTrace();
         } finally {
-            DistributedLock.releaseDistributedLock(key,requestId);
+            DistributedLock.releaseDistributedLock(key, requestId);
         }
         //账户处理
         dealAccount(paramObj);
@@ -289,6 +300,7 @@ public class PayFeeCmd extends Cmd {
         cmdDataFlowContext.setResponseEntity(ResultVo.createResponseEntity(feeReceiptDetailDto));
     }
 
+
     private void dealUserAccount(JSONObject paramObj, PayFeeDetailPo payFeeDetailPo) {
         //判断选择的账号
         JSONArray jsonArray = paramObj.getJSONArray("selectUserAccount");
@@ -710,7 +722,7 @@ public class PayFeeCmd extends Cmd {
                 businessFeeDetail.put("receivableAmount", receivedAmount.doubleValue());
             }
             //todo 如果应收小于实收,将应收刷为 实收
-            if(businessFeeDetail.getDoubleValue("receivableAmount") < receivedAmount.doubleValue()){
+            if (businessFeeDetail.getDoubleValue("receivableAmount") < receivedAmount.doubleValue()) {
                 businessFeeDetail.put("receivableAmount", receivedAmount.doubleValue());
             }
         } else if ("-103".equals(paramInJson.getString("cycles"))) { //这里按缴费结束时间缴费
@@ -733,9 +745,34 @@ public class PayFeeCmd extends Cmd {
                 businessFeeDetail.put("receivableAmount", receivedAmount.doubleValue());
             }
             //todo 如果应收小于实收,将应收刷为 实收
-            if(businessFeeDetail.getDoubleValue("receivableAmount") < receivedAmount.doubleValue()){
+            if (businessFeeDetail.getDoubleValue("receivableAmount") < receivedAmount.doubleValue()) {
                 businessFeeDetail.put("receivableAmount", receivedAmount.doubleValue());
             }
+        } else if ("-105".equals(paramInJson.getString("cycles"))) { //这里按缴费结束时间缴费
+            String customEndTime = paramInJson.getString("customEndTime");
+            Date endDates = DateUtil.getDateFromStringB(customEndTime);
+            Calendar c = Calendar.getInstance();
+            c.setTime(endDates);
+            c.add(Calendar.DAY_OF_MONTH, 1);
+            endDates = c.getTime();//这是明天
+            targetEndTime = endDates;
+            BigDecimal receivedAmount1 = new BigDecimal(Double.parseDouble(paramInJson.getString("receivedAmount")));
+            cycles = receivedAmount1.divide(feePrice, 4, BigDecimal.ROUND_HALF_EVEN);
+            paramInJson.put("tmpCycles", cycles.doubleValue());
+            businessFeeDetail.put("cycles", cycles.doubleValue());
+            BigDecimal receivedAmount = new BigDecimal(Double.parseDouble(paramInJson.getString("receivedAmount")));
+            //处理 可能还存在 实收手工减免的情况
+            if (paramInJson.containsKey("receivableAmount") && !StringUtil.isEmpty(paramInJson.getString("receivableAmount"))) {
+                businessFeeDetail.put("receivableAmount", paramInJson.getString("receivableAmount"));
+            } else {
+                businessFeeDetail.put("receivableAmount", receivedAmount.doubleValue());
+            }
+            //todo 如果应收小于实收,将应收刷为 实收
+            if (businessFeeDetail.getDoubleValue("receivableAmount") < receivedAmount.doubleValue()) {
+                businessFeeDetail.put("receivableAmount", receivedAmount.doubleValue());
+            }
+            //todo 改写开始时间
+            businessFeeDetail.put("startTime", paramInJson.getString("customStartTime"));
         } else { //自定义周期
             targetEndTime = computeFeeSMOImpl.getFeeEndTimeByCycles(feeDto, paramInJson.getString("cycles"));//根据缴费周期计算 结束时间
             cycles = new BigDecimal(Double.parseDouble(paramInJson.getString("cycles")));
@@ -775,6 +812,14 @@ public class PayFeeCmd extends Cmd {
             c.add(Calendar.DAY_OF_MONTH, 1);
             endDates = c.getTime();//这是明天
             endCalender.setTime(endDates);
+        } else if ("-105".equals(paramInJson.getString("cycles"))) {
+            String customEndTime = paramInJson.getString("customEndTime");
+            Date endDates = DateUtil.getDateFromStringB(customEndTime);
+            Calendar c = Calendar.getInstance();
+            c.setTime(endDates);
+            c.add(Calendar.DAY_OF_MONTH, 1);
+            endDates = c.getTime();//这是明天
+            endCalender.setTime(endDates);
         } else {
             endCalender.add(Calendar.MONTH, Integer.parseInt(paramInJson.getString("cycles")));
         }
@@ -969,6 +1014,81 @@ public class PayFeeCmd extends Cmd {
         }
     }
 
+    /**
+     * 自定义时间段 缴费
+     *
+     * @param cycle
+     * @param endTime
+     * @param payFeeDetailPo
+     * @param payFeePo
+     */
+    private void ifCustomStartEndTimePayFee(String cycle, Date endTime, PayFeeDetailPo payFeeDetailPo, PayFeePo payFeePo, JSONObject reqJson) {
+        if (!"-105".equals(cycle)) {
+            return;
+        }
+
+        FeeDto feeInfo = (FeeDto) reqJson.get("feeInfo");
+        String payObjNameRemark = "房屋";
+        if (FeeDto.PAYER_OBJ_TYPE_CAR.equals(feeInfo.getPayerObjType())) {
+            payObjNameRemark = "车辆";
+        } else if (FeeDto.PAYER_OBJ_TYPE_CONTRACT.equals(feeInfo.getPayerObjType())) {
+            payObjNameRemark = "合同";
+        }
+
+        //todo 补充一条 缴费记录数据
+        PayFeeDetailPo tmpPayFeeDetailPo = BeanConvertUtil.covertBean(payFeeDetailPo, PayFeeDetailPo.class);
+        tmpPayFeeDetailPo.setDetailId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_detailId));
+        tmpPayFeeDetailPo.setCycles("0");
+        tmpPayFeeDetailPo.setReceivableAmount("0");
+        tmpPayFeeDetailPo.setReceivedAmount("0");
+        tmpPayFeeDetailPo.setPayableAmount("0");
+        tmpPayFeeDetailPo.setStartTime(DateUtil.getFormatTimeStringB(endTime));
+        tmpPayFeeDetailPo.setEndTime(reqJson.getString("customStartTime"));
+        tmpPayFeeDetailPo.setRemark("按缴费时间段缴费,这部分费用按欠费的方式重新生成,请在" + payObjNameRemark + "上查看");
+        int flag = payFeeDetailNewV1InnerServiceSMOImpl.savePayFeeDetailNew(tmpPayFeeDetailPo);
+
+        if (flag < 1) {
+            throw new CmdException("生成欠费失败");
+        }
+
+        //todo 生成费用
+        PayFeePo tmpPayFeePo = BeanConvertUtil.covertBean(feeInfo, PayFeePo.class);;
+        tmpPayFeePo.setFeeId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_feeId));
+        tmpPayFeePo.setEndTime(DateUtil.getFormatTimeStringB(endTime));
+        tmpPayFeePo.setState(FeeDto.STATE_DOING);
+
+        flag = payFeeV1InnerServiceSMOImpl.savePayFee(tmpPayFeePo);
+        if (flag < 1) {
+            throw new CmdException("生成欠费失败");
+        }
+
+        //todo 补充 费用属性
+        FeeAttrDto feeAttrDto = new FeeAttrDto();
+        feeAttrDto.setFeeId(payFeePo.getFeeId());
+        feeAttrDto.setCommunityId(payFeePo.getCommunityId());
+        List<FeeAttrDto> feeAttrDtos = feeAttrInnerServiceSMOImpl.queryFeeAttrs(feeAttrDto);
+
+        if(feeAttrDtos == null || feeAttrDtos.size() < 1){
+            return;
+        }
+
+        List<FeeAttrPo> tmpFeeAttrPos = new ArrayList<>();
+        FeeAttrPo tmpFeeAttrPo = null;
+        for(FeeAttrDto tmpFeeAttrDto: feeAttrDtos){
+            tmpFeeAttrDto.setFeeId(tmpPayFeePo.getFeeId());
+            tmpFeeAttrDto.setAttrId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_attrId,true));
+
+            if(FeeAttrDto.SPEC_CD_ONCE_FEE_DEADLINE_TIME.equals(tmpFeeAttrDto.getSpecCd())){
+                tmpFeeAttrDto.setValue(reqJson.getString("customStartTime"));
+            }
+            tmpFeeAttrPo = BeanConvertUtil.covertBean(tmpFeeAttrDto,FeeAttrPo.class);
+            tmpFeeAttrPos.add(tmpFeeAttrPo);
+        }
+
+        feeAttrInnerServiceSMOImpl.saveFeeAttrs(tmpFeeAttrPos);
+
+    }
+
     private static Calendar getTargetEndTime(Calendar endCalender, Double cycles) {
         if (StringUtil.isInteger(cycles.toString())) {
             endCalender.add(Calendar.MONTH, new Double(cycles).intValue());