瀏覽代碼

优化代码

wuxw 2 年之前
父節點
當前提交
ebbf4a655a

+ 2 - 0
java110-bean/src/main/java/com/java110/dto/data/DatabusDataDto.java

@@ -23,6 +23,8 @@ public class DatabusDataDto extends PageDto implements Serializable {
     // 欠费催缴
     public static final String BUSINESS_TYPE_OWE_FEE_CALLABLE = "oweFeeCallable";
 
+    //todo 房屋批量创建费用
+    public static final String BUSINESS_TYPE_ROOM_CREATE_PAY_FEE = "roomCreatePayFee";
 
     private String businessTypeCd;
 

+ 11 - 0
java110-bean/src/main/java/com/java110/dto/payFee/PayFeeDetailRefreshFeeMonthDto.java

@@ -1,6 +1,7 @@
 package com.java110.dto.payFee;
 
 import java.io.Serializable;
+import java.util.List;
 
 /**
  * 缴费离散月对象
@@ -11,6 +12,8 @@ public class PayFeeDetailRefreshFeeMonthDto implements Serializable {
     private String feeId;
     private String detailId;
 
+    private List<String> feeIds;
+
     public String getCommunityId() {
         return communityId;
     }
@@ -34,4 +37,12 @@ public class PayFeeDetailRefreshFeeMonthDto implements Serializable {
     public void setDetailId(String detailId) {
         this.detailId = detailId;
     }
+
+    public List<String> getFeeIds() {
+        return feeIds;
+    }
+
+    public void setFeeIds(List<String> feeIds) {
+        this.feeIds = feeIds;
+    }
 }

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

@@ -35,4 +35,9 @@ public interface IPayFeeMonthInnerServiceSMO {
     @RequestMapping(value = "/doGeneratorOrRefreshAllFeeMonth", method = RequestMethod.POST)
     int doGeneratorOrRefreshAllFeeMonth(@RequestBody PayFeeDetailRefreshFeeMonthDto payFeeDetailRefreshFeeMonthDto);
 
+    @RequestMapping(value = "/doGeneratorFeeMonths", method = RequestMethod.POST)
+    void doGeneratorFeeMonths(@RequestBody PayFeeDetailRefreshFeeMonthDto payFeeDetailRefreshFeeMonthDto);
+
+    @RequestMapping(value = "/doGeneratorOweFees", method = RequestMethod.POST)
+    void doGeneratorOweFees(@RequestBody PayFeeDetailRefreshFeeMonthDto payFeeDetailRefreshFeeMonthDto);
 }

+ 145 - 0
service-fee/src/main/java/com/java110/fee/cmd/fee/RoomCreatePayFeeCmd.java

@@ -0,0 +1,145 @@
+package com.java110.fee.cmd.fee;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.java110.core.annotation.Java110Cmd;
+import com.java110.core.context.CmdContextUtils;
+import com.java110.core.context.ICmdDataFlowContext;
+import com.java110.core.event.cmd.Cmd;
+import com.java110.core.event.cmd.CmdEvent;
+import com.java110.core.factory.GenerateCodeFactory;
+import com.java110.dto.data.DatabusDataDto;
+import com.java110.dto.fee.FeeConfigDto;
+import com.java110.dto.fee.FeeDto;
+import com.java110.dto.payFee.PayFeeBatchDto;
+import com.java110.dto.user.UserDto;
+import com.java110.intf.fee.IFeeConfigInnerServiceSMO;
+import com.java110.intf.fee.IPayFeeBatchV1InnerServiceSMO;
+import com.java110.intf.job.IDataBusInnerServiceSMO;
+import com.java110.intf.user.IUserInnerServiceSMO;
+import com.java110.po.payFee.PayFeeBatchPo;
+import com.java110.utils.exception.CmdException;
+import com.java110.utils.util.Assert;
+import com.java110.utils.util.DateUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.text.ParseException;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 房屋批量创建费用
+ */
+
+@Java110Cmd(serviceCode = "fee.roomCreatePayFee")
+public class RoomCreatePayFeeCmd extends Cmd {
+
+
+    @Autowired
+    private IFeeConfigInnerServiceSMO feeConfigInnerServiceSMOImpl;
+
+    @Autowired
+    private IPayFeeBatchV1InnerServiceSMO payFeeBatchV1InnerServiceSMOImpl;
+
+
+    @Autowired
+    private IUserInnerServiceSMO userInnerServiceSMOImpl;
+
+    @Autowired
+    private IDataBusInnerServiceSMO dataBusInnerServiceSMOImpl;
+
+    @Override
+    public void validate(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) throws CmdException, ParseException {
+
+        Assert.hasKeyAndValue(reqJson, "communityId", "未包含小区ID");
+        Assert.hasKeyAndValue(reqJson, "configId", "未包含收费项目");
+        Assert.hasKeyAndValue(reqJson, "startTime", "开始时间不存在");
+
+        FeeConfigDto feeConfigDto = new FeeConfigDto();
+        feeConfigDto.setCommunityId(reqJson.getString("communityId"));
+        feeConfigDto.setConfigId(reqJson.getString("configId"));
+        List<FeeConfigDto> feeConfigDtos = feeConfigInnerServiceSMOImpl.queryFeeConfigs(feeConfigDto);
+        Assert.listOnlyOne(feeConfigDtos, "当前费用项ID不存在或存在多条" + reqJson.getString("configId"));
+        reqJson.put("feeTypeCd", feeConfigDtos.get(0).getFeeTypeCd());
+        reqJson.put("feeFlag", feeConfigDtos.get(0).getFeeFlag());
+        reqJson.put("configEndTime", feeConfigDtos.get(0).getEndTime());
+
+        if (!reqJson.containsKey("roomIds")) {
+            throw new IllegalArgumentException("未包含房屋");
+        }
+
+        JSONArray roomIds = reqJson.getJSONArray("roomIds");
+        if (roomIds == null || roomIds.isEmpty()) {
+            throw new IllegalArgumentException("未包含房屋");
+        }
+        //todo 不是周期性费用 endTime 必须存在
+        if (!FeeDto.FEE_FLAG_CYCLE.equals(feeConfigDtos.get(0).getFeeFlag())) {
+            Assert.hasKeyAndValue(reqJson, "endTime", "结束时间不存在");
+            Date endTime = null;
+            Date configEndTime = null;
+            endTime = DateUtil.getDateFromStringB(reqJson.getString("endTime"));
+            configEndTime = DateUtil.getDateFromStringA(feeConfigDtos.get(0).getEndTime());
+            if (endTime.getTime() > configEndTime.getTime()) {
+                throw new IllegalArgumentException("结束时间不能超过费用项时间");
+            }
+        }
+
+        //todo 动态费用
+        if (FeeConfigDto.COMPUTING_FORMULA_DYNAMIC.equals(feeConfigDtos.get(0).getComputingFormula())) {
+            Assert.hasKeyAndValue(reqJson, "amount", "未包含金额");
+        }
+
+        //todo 递增情况
+        if (FeeConfigDto.COMPUTING_FORMULA_RANT_RATE.equals(feeConfigDtos.get(0).getComputingFormula())) {
+            Assert.hasKeyAndValue(reqJson, "rateCycle", "未包含递增周期");
+            Assert.hasKeyAndValue(reqJson, "rate", "未包含递增率");
+            Assert.hasKeyAndValue(reqJson, "rateStartTime", "未包含递增开始时间");
+            reqJson.put("configComputingFormula", feeConfigDtos.get(0).getComputingFormula());
+        }
+
+        String userId = CmdContextUtils.getUserId(context);
+        reqJson.put("userId", userId);
+
+        String storeId = CmdContextUtils.getStoreId(context);
+        reqJson.put("storeId", storeId);
+
+    }
+
+    @Override
+    public void doCmd(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) throws CmdException, ParseException {
+
+        //todo 生成批次
+        generatorBatch(reqJson);
+
+
+        //todo 交给databus 异步方式处理,同步方式处理很容易超时
+        dataBusInnerServiceSMOImpl.databusData(new DatabusDataDto(DatabusDataDto.BUSINESS_TYPE_ROOM_CREATE_PAY_FEE, reqJson));
+
+    }
+
+    /**
+     * 生成批次号
+     *
+     * @param reqJson
+     */
+    private void generatorBatch(JSONObject reqJson) {
+        PayFeeBatchPo payFeeBatchPo = new PayFeeBatchPo();
+        payFeeBatchPo.setBatchId(GenerateCodeFactory.getGeneratorId("12"));
+        payFeeBatchPo.setCommunityId(reqJson.getString("communityId"));
+        payFeeBatchPo.setCreateUserId(reqJson.getString("userId"));
+        UserDto userDto = new UserDto();
+        userDto.setUserId(reqJson.getString("userId"));
+        List<UserDto> userDtos = userInnerServiceSMOImpl.getUsers(userDto);
+        Assert.listOnlyOne(userDtos, "用户不存在");
+        payFeeBatchPo.setCreateUserName(userDtos.get(0).getUserName());
+        payFeeBatchPo.setState(PayFeeBatchDto.STATE_NORMAL);
+        payFeeBatchPo.setMsg("正常");
+        int flag = payFeeBatchV1InnerServiceSMOImpl.savePayFeeBatch(payFeeBatchPo);
+
+        if (flag < 1) {
+            throw new IllegalArgumentException("生成批次失败");
+        }
+
+        reqJson.put("batchId", payFeeBatchPo.getBatchId());
+    }
+}

+ 10 - 0
service-fee/src/main/java/com/java110/fee/smo/impl/PayFeeMonthInnerServiceSMOImpl.java

@@ -43,4 +43,14 @@ public class PayFeeMonthInnerServiceSMOImpl extends BaseServiceSMO implements IP
         payFeeMonthImpl.doGeneratorOrRefreshAllFeeMonth(payFeeDetailRefreshFeeMonthDto.getCommunityId());
         return 1;
     }
+
+    @Override
+    public void doGeneratorFeeMonths(@RequestBody PayFeeDetailRefreshFeeMonthDto payFeeDetailRefreshFeeMonthDto) {
+        payFeeMonthImpl.doGeneratorFeeMonths(payFeeDetailRefreshFeeMonthDto.getFeeIds(),payFeeDetailRefreshFeeMonthDto.getCommunityId());
+    }
+
+    @Override
+    public void doGeneratorOweFees(@RequestBody PayFeeDetailRefreshFeeMonthDto payFeeDetailRefreshFeeMonthDto) {
+        payFeeMonthImpl.doGeneratorOweFees(payFeeDetailRefreshFeeMonthDto.getFeeIds(),payFeeDetailRefreshFeeMonthDto.getCommunityId());
+    }
 }

+ 244 - 0
service-job/src/main/java/com/java110/job/adapt/fee/RoomCreatePayFeeAdapt.java

@@ -0,0 +1,244 @@
+package com.java110.job.adapt.fee;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.java110.core.context.ICmdDataFlowContext;
+import com.java110.core.factory.GenerateCodeFactory;
+import com.java110.dto.fee.FeeAttrDto;
+import com.java110.dto.fee.FeeConfigDto;
+import com.java110.dto.fee.FeeDetailDto;
+import com.java110.dto.fee.FeeDto;
+import com.java110.dto.oweFeeCallable.OweFeeCallableDto;
+import com.java110.dto.owner.OwnerAppUserDto;
+import com.java110.dto.owner.OwnerDto;
+import com.java110.dto.payFee.PayFeeDetailRefreshFeeMonthDto;
+import com.java110.dto.reportFee.ReportOweFeeDto;
+import com.java110.dto.room.RoomDto;
+import com.java110.dto.system.Business;
+import com.java110.dto.user.UserDto;
+import com.java110.intf.community.IRoomInnerServiceSMO;
+import com.java110.intf.community.IRoomV1InnerServiceSMO;
+import com.java110.intf.fee.IFeeAttrInnerServiceSMO;
+import com.java110.intf.fee.IFeeInnerServiceSMO;
+import com.java110.intf.fee.IOweFeeCallableV1InnerServiceSMO;
+import com.java110.intf.fee.IPayFeeMonthInnerServiceSMO;
+import com.java110.intf.report.IReportOweFeeInnerServiceSMO;
+import com.java110.intf.user.*;
+import com.java110.job.adapt.DatabusAdaptImpl;
+import com.java110.job.msgNotify.MsgNotifyFactory;
+import com.java110.po.fee.FeeAttrPo;
+import com.java110.po.fee.PayFeePo;
+import com.java110.po.oweFeeCallable.OweFeeCallablePo;
+import com.java110.utils.cache.MappingCache;
+import com.java110.utils.cache.UrlCache;
+import com.java110.utils.constant.CommonConstant;
+import com.java110.utils.constant.WechatConstant;
+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 com.java110.vo.ResultVo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Component;
+
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 欠费催缴databus
+ */
+@Component(value = "roomCreatePayFeeAdapt")
+public class RoomCreatePayFeeAdapt extends DatabusAdaptImpl {
+    private static final int DEFAULT_ADD_FEE_COUNT = 200;
+    @Autowired
+    private IRoomInnerServiceSMO roomInnerServiceSMOImpl;
+
+    @Autowired
+    private IOwnerRoomRelV1InnerServiceSMO ownerRoomRelV1InnerServiceSMOImpl;
+
+    @Autowired
+    private IOwnerInnerServiceSMO ownerInnerServiceSMOImpl;
+
+    @Autowired
+    private IOweFeeCallableV1InnerServiceSMO oweFeeCallableV1InnerServiceSMOImpl;
+
+    @Autowired
+    private IReportOweFeeInnerServiceSMO reportOweFeeInnerServiceSMOImpl;
+
+    @Autowired
+    private IUserV1InnerServiceSMO userV1InnerServiceSMOImpl;
+
+    @Autowired
+    private IOwnerAppUserInnerServiceSMO ownerAppUserInnerServiceSMOImpl;
+
+    @Autowired
+    private IFeeInnerServiceSMO feeInnerServiceSMOImpl;
+
+    @Autowired
+    private IFeeAttrInnerServiceSMO feeAttrInnerServiceSMOImpl;
+
+    @Autowired
+    private IPayFeeMonthInnerServiceSMO payFeeMonthInnerServiceSMOImpl;
+
+    @Override
+    public void execute(Business business, List<Business> businesses) throws ParseException {
+        JSONObject data = business.getData();
+
+
+        JSONArray roomIds = data.getJSONArray("roomIds");
+
+        List<String> tmpRoomIds = new ArrayList<>();
+
+
+        for (int roomIndex = 0; roomIndex < roomIds.size(); roomIndex++) {
+            tmpRoomIds.add(roomIds.getString(roomIndex));
+            if (tmpRoomIds.size() == DEFAULT_ADD_FEE_COUNT) {
+                doCreateRoomPayFee(data, tmpRoomIds);
+                tmpRoomIds = new ArrayList<>();
+            }
+        }
+        if (!tmpRoomIds.isEmpty()) {
+            doCreateRoomPayFee(data, tmpRoomIds);
+        }
+    }
+
+    private void doCreateRoomPayFee(JSONObject data, List<String> roomIds) {
+        RoomDto roomDto = new RoomDto();
+        roomDto.setRoomIds(roomIds.toArray(new String[roomIds.size()]));
+        roomDto.setCommunityId(data.getString("communityId"));
+        List<RoomDto> roomDtos = roomInnerServiceSMOImpl.queryRooms(roomDto);
+
+        //todo 房屋不存在,这种场景一般执行不到
+        if (roomDtos == null || roomDtos.isEmpty()) {
+            throw new IllegalArgumentException("房屋不存在");
+        }
+
+
+        //todo 查询业主信息
+        OwnerDto ownerDto = new OwnerDto();
+        ownerDto.setCommunityId(data.getString("communityId"));
+        ownerDto.setRoomIds(roomIds.toArray(new String[roomIds.size()]));
+        List<OwnerDto> ownerDtos = ownerInnerServiceSMOImpl.queryOwnersByRoom(ownerDto);
+        for (RoomDto tmpRoomDto : roomDtos) {
+            for (OwnerDto tmpOwnerDto : ownerDtos) {
+                if (tmpRoomDto.getRoomId().equals(tmpOwnerDto.getRoomId())) {
+                    tmpRoomDto.setOwnerId(tmpOwnerDto.getOwnerId());
+                    tmpRoomDto.setOwnerName(tmpOwnerDto.getName());
+                    tmpRoomDto.setLink(tmpOwnerDto.getLink());
+                }
+            }
+        }
+
+        // todo
+
+        List<PayFeePo> feePos = new ArrayList<>();
+        List<FeeAttrPo> feeAttrsPos = new ArrayList<>();
+
+        int saveFlag = 0;
+        for (int roomIndex = 0; roomIndex < roomDtos.size(); roomIndex++) {
+            //todo 加入 房屋费用
+            feePos.add(addRoomFee(roomDtos.get(roomIndex), data));
+            if (!StringUtil.isEmpty(roomDtos.get(roomIndex).getOwnerId())) {
+                if (!FeeDto.FEE_FLAG_CYCLE.equals(data.getString("feeFlag"))) {
+                    feeAttrsPos.add(addFeeAttr(data, FeeAttrDto.SPEC_CD_ONCE_FEE_DEADLINE_TIME, data.containsKey("endTime") ? data.getString("endTime") : data.getString("configEndTime")));
+                }
+                feeAttrsPos.add(addFeeAttr(data, FeeAttrDto.SPEC_CD_OWNER_ID, roomDtos.get(roomIndex).getOwnerId()));
+                feeAttrsPos.add(addFeeAttr(data, FeeAttrDto.SPEC_CD_OWNER_LINK, roomDtos.get(roomIndex).getLink()));
+                feeAttrsPos.add(addFeeAttr(data, FeeAttrDto.SPEC_CD_OWNER_NAME, roomDtos.get(roomIndex).getOwnerName()));
+            }
+
+            //todo 定制开发 加入
+            //1、对合同约定的租金递增比例、递增年限各不相同的问题,支持按合同到期日期设租金递增比例。
+            //2、能自动设置递增的租金实行自动计算当月的租金。
+            if (data.containsKey("configComputingFormula") && FeeConfigDto.COMPUTING_FORMULA_RANT_RATE.equals(data.getString("configComputingFormula"))) {
+                feeAttrsPos.add(addFeeAttr(data, FeeAttrDto.SPEC_CD_RATE_CYCLE, data.getString("rateCycle")));
+                feeAttrsPos.add(addFeeAttr(data, FeeAttrDto.SPEC_CD_RATE, data.getString("rate")));
+                feeAttrsPos.add(addFeeAttr(data, FeeAttrDto.SPEC_CD_RATE_START_TIME, data.getString("rateStartTime")));
+            }
+
+            //todo 付费对象名称
+            feeAttrsPos.add(addFeeAttr(data, FeeAttrDto.SPEC_CD_PAY_OBJECT_NAME, roomDtos.get(roomIndex).getFloorNum() + "-" + roomDtos.get(roomIndex).getUnitNum() + "-" + roomDtos.get(roomIndex).getRoomNum()));
+
+            if (feePos.size() == DEFAULT_ADD_FEE_COUNT) {
+                saveFlag = saveFeeAndAttrs(feePos, feeAttrsPos);
+                feePos = new ArrayList<>();
+                feeAttrsPos = new ArrayList<>();
+            }
+        }
+        if (!feePos.isEmpty()) {
+            saveFlag = saveFeeAndAttrs(feePos, feeAttrsPos);
+        }
+
+    }
+
+    private PayFeePo addRoomFee(RoomDto roomDto, JSONObject paramInJson) {
+        String time = DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A);
+        if (paramInJson.containsKey("feeEndDate")) {
+            time = paramInJson.getString("feeEndDate");
+        } else if (paramInJson.containsKey("startTime")) {
+            time = paramInJson.getString("startTime");
+        }
+        //查询费用项
+        JSONObject businessUnit = new JSONObject();
+        businessUnit.put("feeId", GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_feeId));
+        businessUnit.put("configId", paramInJson.getString("configId"));
+        businessUnit.put("feeTypeCd", paramInJson.getString("feeTypeCd"));
+        businessUnit.put("incomeObjId", paramInJson.getString("storeId"));
+        businessUnit.put("amount", "-1.00");
+        if (paramInJson.containsKey("amount") && !StringUtil.isEmpty(paramInJson.getString("amount"))) {
+            businessUnit.put("amount", paramInJson.getString("amount"));
+        }
+        businessUnit.put("startTime", time);
+        businessUnit.put("endTime", time);
+        businessUnit.put("communityId", paramInJson.getString("communityId"));
+        businessUnit.put("payerObjId", roomDto.getRoomId());
+        businessUnit.put("payerObjType", FeeDto.PAYER_OBJ_TYPE_ROOM);
+        businessUnit.put("feeFlag", paramInJson.getString("feeFlag"));
+        businessUnit.put("state", "2008001");
+        businessUnit.put("batchId", paramInJson.getString("batchId"));
+        businessUnit.put("userId", paramInJson.getString("userId"));
+        paramInJson.put("feeId", businessUnit.getString("feeId"));
+        return BeanConvertUtil.covertBean(paramInJson, PayFeePo.class)
+    }
+
+    private FeeAttrPo addFeeAttr(JSONObject paramInJson, String specCd, String value) {
+        FeeAttrPo feeAttrPo = new FeeAttrPo();
+        feeAttrPo.setCommunityId(paramInJson.getString("communityId"));
+        feeAttrPo.setSpecCd(specCd);
+        feeAttrPo.setValue(value);
+        feeAttrPo.setFeeId(paramInJson.getString("feeId"));
+        feeAttrPo.setAttrId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_attrId, true));
+        return feeAttrPo;
+
+    }
+
+    private int saveFeeAndAttrs(List<PayFeePo> feePos, List<FeeAttrPo> feeAttrsPos) {
+        if (feePos == null || feePos.isEmpty()) {
+            return 1;
+        }
+        int flag = feeInnerServiceSMOImpl.saveFee(feePos);
+        if (flag < 1) {
+            return flag;
+        }
+
+        flag = feeAttrInnerServiceSMOImpl.saveFeeAttrs(feeAttrsPos);
+
+        // todo 这里异步的方式计算 月数据 和欠费数据
+        List<String> feeIds = new ArrayList<>();
+        for (PayFeePo feePo : feePos) {
+            feeIds.add(feePo.getFeeId());
+        }
+
+        PayFeeDetailRefreshFeeMonthDto payFeeDetailRefreshFeeMonthDto = new PayFeeDetailRefreshFeeMonthDto();
+        payFeeDetailRefreshFeeMonthDto.setCommunityId(feePos.get(0).getCommunityId());
+        payFeeDetailRefreshFeeMonthDto.setFeeIds(feeIds);
+
+        payFeeMonthInnerServiceSMOImpl.doGeneratorFeeMonths(payFeeDetailRefreshFeeMonthDto);
+
+        payFeeMonthInnerServiceSMOImpl.doGeneratorOweFees(payFeeDetailRefreshFeeMonthDto);
+        return flag;
+    }
+
+}