From 959db7dce6fca5b6224ca20078646840d051300b Mon Sep 17 00:00:00 2001
From: wuxw <928255095@qq.com>
Date: 星期一, 27 一月 2020 12:49:12 +0800
Subject: [PATCH] 优化 临时车缴费功能

---
 Api/src/main/java/com/java110/api/listener/machineTranslate/MachineRoadGateOpenListener.java |  206 ++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 200 insertions(+), 6 deletions(-)

diff --git a/Api/src/main/java/com/java110/api/listener/machineTranslate/MachineRoadGateOpenListener.java b/Api/src/main/java/com/java110/api/listener/machineTranslate/MachineRoadGateOpenListener.java
index 41babf5..e4b29ab 100644
--- a/Api/src/main/java/com/java110/api/listener/machineTranslate/MachineRoadGateOpenListener.java
+++ b/Api/src/main/java/com/java110/api/listener/machineTranslate/MachineRoadGateOpenListener.java
@@ -5,12 +5,14 @@
 import com.java110.core.annotation.Java110Listener;
 import com.java110.core.context.DataFlowContext;
 import com.java110.core.factory.GenerateCodeFactory;
+import com.java110.core.smo.community.ICommunityInnerServiceSMO;
 import com.java110.core.smo.fee.IFeeConfigInnerServiceSMO;
 import com.java110.core.smo.fee.IFeeInnerServiceSMO;
 import com.java110.core.smo.hardwareAdapation.ICarBlackWhiteInnerServiceSMO;
 import com.java110.core.smo.hardwareAdapation.ICarInoutInnerServiceSMO;
 import com.java110.core.smo.hardwareAdapation.IMachineInnerServiceSMO;
 import com.java110.core.smo.owner.IOwnerCarInnerServiceSMO;
+import com.java110.dto.CommunityMemberDto;
 import com.java110.dto.FeeConfigDto;
 import com.java110.dto.FeeDto;
 import com.java110.dto.hardwareAdapation.CarBlackWhiteDto;
@@ -21,6 +23,7 @@
 import com.java110.event.service.api.ServiceDataFlowEvent;
 import com.java110.utils.constant.BusinessTypeConstant;
 import com.java110.utils.constant.CommonConstant;
+import com.java110.utils.constant.CommunityMemberTypeConstant;
 import com.java110.utils.constant.FeeTypeConstant;
 import com.java110.utils.constant.ServiceCodeMachineTranslateConstant;
 import com.java110.utils.util.Assert;
@@ -56,6 +59,8 @@
 
     private static final String MACHINE_DIRECTION_OUT = "3307"; //鍑哄幓
 
+    private static final String HIRE_SELL_OUT = "hireSellOut"; // 鍑虹鎴栧嚭鍞溅杈嗗嚭鍦�
+
     private static final String CAR_BLACK = "1111"; // 杞﹁締榛戝悕鍗�
     private static final String CAR_WHITE = "2222"; // 杞﹁締鐧藉悕鍗�
 
@@ -76,6 +81,9 @@
 
     @Autowired
     private IFeeConfigInnerServiceSMO feeConfigInnerServiceSMOImpl;
+
+    @Autowired
+    private ICommunityInnerServiceSMO communityInnerServiceSMOImpl;
 
     @Override
     protected void validate(ServiceDataFlowEvent event, JSONObject reqJson) {
@@ -154,6 +162,14 @@
             return;
         }
 
+        //鏍囪瘑鏀粯瀹屾垚锛屾鏌ユ槸鍚︿负鏀粯瓒呮椂
+
+        if (judgeCarOutTimeOut(event, context, reqJson, tmpCarInoutDto, machineDto)) {
+            JSONObject data = computeHourAndMoney(tmpCarInoutDto.getCommunityId(), new Date(), reqJson.getDate("feeRestartTime"));
+            context.setResponseEntity(MachineResDataVo.getResData(MachineResDataVo.CODE_ERROR, "鏀粯宸茶秴鏃讹紝璇烽噸鏂版敮浠�", data));
+            return;
+        }
+
         modifyCarInoutInfo(event, context, reqJson, tmpCarInoutDto, machineDto);
         ResponseEntity<String> responseEntity = context.getResponseEntity();
 
@@ -162,6 +178,67 @@
             return;
         }
         context.setResponseEntity(MachineResDataVo.getResData(MachineResDataVo.CODE_SUCCESS, "鎴愬姛"));
+    }
+
+    /**
+     * 鍒ゆ柇杞﹁締鍑哄満鏄惁宸茬粡瓒呮椂
+     *
+     * @param event
+     * @param context
+     * @param reqJson
+     * @param tmpCarInoutDto
+     * @param machineDto
+     * @return
+     */
+    private boolean judgeCarOutTimeOut(ServiceDataFlowEvent event, DataFlowContext context, JSONObject reqJson, CarInoutDto tmpCarInoutDto, MachineDto machineDto) {
+        CommunityMemberDto communityMemberDto = new CommunityMemberDto();
+        communityMemberDto.setCommunityId(machineDto.getCommunityId());
+        communityMemberDto.setMemberTypeCd(CommunityMemberTypeConstant.PROPERTY);
+        List<CommunityMemberDto> communityMemberDtos = communityInnerServiceSMOImpl.getCommunityMembers(communityMemberDto);
+        String storeId = "-1";
+        if (communityMemberDtos != null && communityMemberDtos.size() > 0) {
+            storeId = communityMemberDtos.get(0).getMemberId();
+        }
+
+        FeeDto feeDto = new FeeDto();
+        feeDto.setCommunityId(machineDto.getCommunityId());
+        feeDto.setPayerObjId(reqJson.getString("inoutId"));
+        feeDto.setIncomeObjId(storeId);
+        feeDto.setFeeTypeCd(FeeTypeConstant.FEE_TYPE_TEMP_DOWN_PARKING_SPACE);
+        feeDto.setState("2009001");
+        feeDto.setFeeFlag("2006012");
+        List<FeeDto> feeDtos = feeInnerServiceSMOImpl.queryFees(feeDto);
+
+        if (feeDtos == null || feeDtos.size() < 1) {
+            return false;
+        }
+
+        FeeDto tmpFeeDto = feeDtos.get(0);
+
+
+        long dffMin = new Date().getTime() - tmpFeeDto.getEndTime().getTime();
+
+        if (dffMin < 15 * 1000 * 60) {
+            return false;
+        }
+
+        //閲嶆柊鎻掑叆 涓�鏉� 鏀惰垂璁板綍 鏀惰垂
+
+        HttpHeaders header = new HttpHeaders();
+        context.getRequestCurrentHeaders().put(CommonConstant.HTTP_ORDER_TYPE_CD, "D");
+        JSONArray businesses = new JSONArray();
+        AppService service = event.getAppService();
+        //娣诲姞鍗曞厓淇℃伅
+        businesses.add(modifyCarInout(reqJson, context, tmpCarInoutDto, "100600", ""));
+        businesses.add(addCarInoutFee(reqJson, context, tmpCarInoutDto.getCommunityId(), DateUtil.getFormatTimeString(tmpFeeDto.getEndTime(), DateUtil.DATE_FORMATE_STRING_A)));
+        JSONObject paramInObj = super.restToCenterProtocol(businesses, context.getRequestCurrentHeaders());
+        //灏� rest header 淇℃伅浼犻�掑埌涓嬪眰鏈嶅姟涓幓
+        super.freshHttpHeader(header, context.getRequestCurrentHeaders());
+        ResponseEntity<String> responseEntity = this.callService(context, service.getServiceCode(), paramInObj);
+        context.setResponseEntity(responseEntity);
+        reqJson.put("feeRestartTime", tmpFeeDto.getEndTime());
+
+        return true;
     }
 
     /**
@@ -210,7 +287,7 @@
                 long day = betweenTime / (60 * 60 * 24 * 1000);
                 JSONObject data = new JSONObject();
                 data.put("day", day);//杩樺墿浣欏灏戝ぉ
-                modifyCarInoutInfo(event, context, reqJson, tmpCarInoutDto, machineDto);
+                modifyCarInoutInfo(event, context, reqJson, tmpCarInoutDto, machineDto, HIRE_SELL_OUT);
                 context.setResponseEntity(MachineResDataVo.getResData(MachineResDataVo.CODE_SUCCESS, "鎴愬姛", data));
                 return;
             }
@@ -226,8 +303,14 @@
             return;
         }
 
+        JSONObject data = computeHourAndMoney(tmpCarInoutDto.getCommunityId(), nowTime, inTime);
+
+        context.setResponseEntity(MachineResDataVo.getResData(MachineResDataVo.CODE_ERROR, "杞﹁締鏈敮浠橈紝璇峰厛鏀粯", data));
+    }
+
+    private JSONObject computeHourAndMoney(String communityId, Date nowTime, Date inTime) {
         FeeConfigDto feeConfigDto = new FeeConfigDto();
-        feeConfigDto.setCommunityId(tmpCarInoutDto.getCommunityId());
+        feeConfigDto.setCommunityId(communityId);
         feeConfigDto.setFeeTypeCd(FeeTypeConstant.FEE_TYPE_TEMP_DOWN_PARKING_SPACE);
         List<FeeConfigDto> feeConfigDtos = feeConfigInnerServiceSMOImpl.queryFeeConfigs(feeConfigDto);
 
@@ -258,11 +341,14 @@
         data.put("money", money);//缂磋垂閲戦
         data.put("hour", new Double(hour).intValue());//鍋滆溅鏃堕棿
         data.put("min", new Double(min).intValue());//鍋滆溅鏃堕棿
-
-        context.setResponseEntity(MachineResDataVo.getResData(MachineResDataVo.CODE_ERROR, "杞﹁締鏈敮浠橈紝璇峰厛鏀粯", data));
+        return data;
     }
 
     private void modifyCarInoutInfo(ServiceDataFlowEvent event, DataFlowContext context, JSONObject reqJson, CarInoutDto tmpCarInoutDto, MachineDto machineDto) {
+        modifyCarInoutInfo(event, context, reqJson, tmpCarInoutDto, machineDto, "");
+    }
+
+    private void modifyCarInoutInfo(ServiceDataFlowEvent event, DataFlowContext context, JSONObject reqJson, CarInoutDto tmpCarInoutDto, MachineDto machineDto, String from) {
         HttpHeaders header = new HttpHeaders();
         context.getRequestCurrentHeaders().put(CommonConstant.HTTP_ORDER_TYPE_CD, "D");
         JSONArray businesses = new JSONArray();
@@ -271,6 +357,12 @@
         businesses.add(modifyCarInout(reqJson, context, tmpCarInoutDto));
         reqJson.put("inoutId", tmpCarInoutDto.getInoutId());
         businesses.add(addCarInoutDetail(reqJson, context, tmpCarInoutDto.getCommunityId(), machineDto));
+        if (HIRE_SELL_OUT.equals(from)) {
+            JSONObject tmpModifyCarInoutFee = modifyCarInoutFee(reqJson, context, tmpCarInoutDto.getCommunityId(), machineDto);
+            if (tmpModifyCarInoutFee != null) {
+                businesses.add(tmpModifyCarInoutFee);
+            }
+        }
         JSONObject paramInObj = super.restToCenterProtocol(businesses, context.getRequestCurrentHeaders());
         //灏� rest header 淇℃伅浼犻�掑埌涓嬪眰鏈嶅姟涓幓
         super.freshHttpHeader(header, context.getRequestCurrentHeaders());
@@ -279,14 +371,18 @@
     }
 
     private JSONObject modifyCarInout(JSONObject reqJson, DataFlowContext context, CarInoutDto carInoutDto) {
+        return modifyCarInout(reqJson, context, carInoutDto, "100500", DateUtil.getFormatTimeString(new Date(), DateUtil.DATE_FORMATE_STRING_A));
+    }
+
+    private JSONObject modifyCarInout(JSONObject reqJson, DataFlowContext context, CarInoutDto carInoutDto, String state, String endTime) {
         JSONObject business = JSONObject.parseObject("{\"datas\":{}}");
         business.put(CommonConstant.HTTP_BUSINESS_TYPE_CD, BusinessTypeConstant.BUSINESS_TYPE_UPDATE_CAR_INOUT);
         business.put(CommonConstant.HTTP_SEQ, DEFAULT_SEQ);
         business.put(CommonConstant.HTTP_INVOKE_MODEL, CommonConstant.HTTP_INVOKE_MODEL_S);
         JSONObject businessCarInout = new JSONObject();
         businessCarInout.putAll(BeanConvertUtil.beanCovertMap(carInoutDto));
-        businessCarInout.put("state", "100500");
-        businessCarInout.put("outTime", DateUtil.getFormatTimeString(new Date(), DateUtil.DATE_FORMATE_STRING_A));
+        businessCarInout.put("state", state);
+        businessCarInout.put("outTime", endTime);
         //璁$畻 搴旀敹閲戦
         business.getJSONObject(CommonConstant.HTTP_BUSINESS_DATAS).put("businessCarInout", businessCarInout);
         return business;
@@ -321,6 +417,7 @@
         //娣诲姞鍗曞厓淇℃伅
         businesses.add(addCarInout(reqJson, context, communityId));
         businesses.add(addCarInoutDetail(reqJson, context, communityId, machineDto));
+        businesses.add(addCarInoutFee(reqJson, context, communityId));
 
         JSONObject paramInObj = super.restToCenterProtocol(businesses, context.getRequestCurrentHeaders());
 
@@ -335,6 +432,103 @@
         context.setResponseEntity(MachineResDataVo.getResData(MachineResDataVo.CODE_SUCCESS, "鎴愬姛"));
     }
 
+    /**
+     * 娣诲姞鐗╀笟璐圭敤
+     *
+     * @param paramInJson     鎺ュ彛璋冪敤鏀句紶鍏ュ叆鍙�
+     * @param dataFlowContext 鏁版嵁涓婁笅鏂�
+     * @return 璁㈠崟鏈嶅姟鑳藉鎺ュ彈鐨勬姤鏂�
+     */
+    private JSONObject addCarInoutFee(JSONObject paramInJson, DataFlowContext dataFlowContext, String communityId) {
+        return addCarInoutFee(paramInJson, dataFlowContext, communityId, DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A));
+    }
+
+
+    /**
+     * 娣诲姞鐗╀笟璐圭敤
+     *
+     * @param paramInJson     鎺ュ彛璋冪敤鏀句紶鍏ュ叆鍙�
+     * @param dataFlowContext 鏁版嵁涓婁笅鏂�
+     * @return 璁㈠崟鏈嶅姟鑳藉鎺ュ彈鐨勬姤鏂�
+     */
+    private JSONObject addCarInoutFee(JSONObject paramInJson, DataFlowContext dataFlowContext, String communityId, String startTime) {
+        CommunityMemberDto communityMemberDto = new CommunityMemberDto();
+        communityMemberDto.setCommunityId(communityId);
+        communityMemberDto.setMemberTypeCd(CommunityMemberTypeConstant.PROPERTY);
+        List<CommunityMemberDto> communityMemberDtos = communityInnerServiceSMOImpl.getCommunityMembers(communityMemberDto);
+        String storeId = "-1";
+        if (communityMemberDtos != null && communityMemberDtos.size() > 0) {
+            storeId = communityMemberDtos.get(0).getMemberId();
+        }
+
+        JSONObject business = JSONObject.parseObject("{\"datas\":{}}");
+        business.put(CommonConstant.HTTP_BUSINESS_TYPE_CD, BusinessTypeConstant.BUSINESS_TYPE_SAVE_FEE_INFO);
+        business.put(CommonConstant.HTTP_SEQ, DEFAULT_SEQ + 1);
+        business.put(CommonConstant.HTTP_INVOKE_MODEL, CommonConstant.HTTP_INVOKE_MODEL_S);
+        JSONObject businessUnit = new JSONObject();
+        businessUnit.put("feeId", "-1");
+        businessUnit.put("feeTypeCd", FeeTypeConstant.FEE_TYPE_TEMP_DOWN_PARKING_SPACE);
+        businessUnit.put("incomeObjId", storeId);
+        businessUnit.put("amount", "-1.00");
+        businessUnit.put("startTime", startTime);
+        businessUnit.put("endTime", DateUtil.getLastTime()); // 涓存椂杞﹀皢缁撴潫鏃堕棿鍒锋垚2038骞�
+        businessUnit.put("communityId", communityId);
+        businessUnit.put("payerObjId", paramInJson.getString("inoutId"));
+        businessUnit.put("feeFlag", "2006012"); // 涓�娆℃�ц垂鐢�
+        businessUnit.put("state", "2008001"); // 鏀惰垂涓�
+        businessUnit.put("userId", "-1");
+        business.getJSONObject(CommonConstant.HTTP_BUSINESS_DATAS).put("businessFee", businessUnit);
+
+        return business;
+    }
+
+    /**
+     * 鍑虹鎴栧嚭鍞� 杞﹁締鍑哄満
+     *
+     * @param reqJson
+     * @param context
+     * @param communityId
+     * @param machineDto
+     * @return
+     */
+    private JSONObject modifyCarInoutFee(JSONObject reqJson, DataFlowContext context, String communityId, MachineDto machineDto) {
+
+        CommunityMemberDto communityMemberDto = new CommunityMemberDto();
+        communityMemberDto.setCommunityId(communityId);
+        communityMemberDto.setMemberTypeCd(CommunityMemberTypeConstant.PROPERTY);
+        List<CommunityMemberDto> communityMemberDtos = communityInnerServiceSMOImpl.getCommunityMembers(communityMemberDto);
+        String storeId = "-1";
+        if (communityMemberDtos != null && communityMemberDtos.size() > 0) {
+            storeId = communityMemberDtos.get(0).getMemberId();
+        }
+
+        FeeDto feeDto = new FeeDto();
+        feeDto.setCommunityId(communityId);
+        feeDto.setPayerObjId(reqJson.getString("inoutId"));
+        feeDto.setIncomeObjId(storeId);
+        feeDto.setFeeTypeCd(FeeTypeConstant.FEE_TYPE_TEMP_DOWN_PARKING_SPACE);
+        feeDto.setState("2008001");
+        feeDto.setFeeFlag("2006012");
+        List<FeeDto> feeDtos = feeInnerServiceSMOImpl.queryFees(feeDto);
+
+        if (feeDtos == null || feeDtos.size() < 1) {
+            return null;
+        }
+
+        FeeDto tmpFeeDto = feeDtos.get(0);
+
+        JSONObject business = JSONObject.parseObject("{\"datas\":{}}");
+        business.put(CommonConstant.HTTP_BUSINESS_TYPE_CD, BusinessTypeConstant.BUSINESS_TYPE_UPDATE_FEE_INFO);
+        business.put(CommonConstant.HTTP_SEQ, DEFAULT_SEQ + 1);
+        business.put(CommonConstant.HTTP_INVOKE_MODEL, CommonConstant.HTTP_INVOKE_MODEL_S);
+        JSONObject businessUnit = new JSONObject();
+        businessUnit.putAll(BeanConvertUtil.beanCovertMap(tmpFeeDto));
+        businessUnit.put("endTime", DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A));
+        businessUnit.put("state", "2009001"); // 鏀惰垂涓�
+        business.getJSONObject(CommonConstant.HTTP_BUSINESS_DATAS).put("businessFee", businessUnit);
+
+        return business;
+    }
 
     /**
      * 娣诲姞灏忓尯淇℃伅

--
Gitblit v1.8.0