From af551e9df1e59ef94f57007e1f4e8960ba2f8778 Mon Sep 17 00:00:00 2001
From: java110 <928255095@qq.com>
Date: 星期二, 04 四月 2023 11:15:40 +0800
Subject: [PATCH] optimize charge coupon

---
 service-common/src/main/java/com/java110/common/cmd/chargeMachine/StartChargeCmd.java |  178 ++++++++++++++++++++++++++++++++++++++++-------------------
 1 files changed, 120 insertions(+), 58 deletions(-)

diff --git a/service-common/src/main/java/com/java110/common/cmd/chargeMachine/StartChargeCmd.java b/service-common/src/main/java/com/java110/common/cmd/chargeMachine/StartChargeCmd.java
index 002268e..7856d40 100644
--- a/service-common/src/main/java/com/java110/common/cmd/chargeMachine/StartChargeCmd.java
+++ b/service-common/src/main/java/com/java110/common/cmd/chargeMachine/StartChargeCmd.java
@@ -14,6 +14,7 @@
 import com.java110.dto.chargeMachine.ChargeMachineDto;
 import com.java110.dto.chargeMachineOrder.ChargeMachineOrderDto;
 import com.java110.dto.chargeMachinePort.ChargeMachinePortDto;
+import com.java110.dto.chargeRuleFee.ChargeRuleFeeDto;
 import com.java110.dto.couponPropertyPoolConfig.CouponPropertyPoolConfigDto;
 import com.java110.dto.couponPropertyUser.CouponPropertyUserDto;
 import com.java110.dto.user.UserDto;
@@ -21,17 +22,16 @@
 import com.java110.intf.acct.ICouponPropertyPoolConfigV1InnerServiceSMO;
 import com.java110.intf.acct.ICouponPropertyUserDetailV1InnerServiceSMO;
 import com.java110.intf.acct.ICouponPropertyUserV1InnerServiceSMO;
-import com.java110.intf.common.IChargeMachineOrderAcctV1InnerServiceSMO;
-import com.java110.intf.common.IChargeMachineOrderV1InnerServiceSMO;
-import com.java110.intf.common.IChargeMachinePortV1InnerServiceSMO;
-import com.java110.intf.common.IChargeMachineV1InnerServiceSMO;
+import com.java110.intf.common.*;
 import com.java110.intf.user.IUserV1InnerServiceSMO;
 import com.java110.po.accountDetail.AccountDetailPo;
 import com.java110.po.chargeMachineOrder.ChargeMachineOrderPo;
 import com.java110.po.chargeMachineOrderAcct.ChargeMachineOrderAcctPo;
+import com.java110.po.chargeMachineOrderCoupon.ChargeMachineOrderCouponPo;
 import com.java110.po.chargeMachinePort.ChargeMachinePortPo;
 import com.java110.po.couponPropertyUser.CouponPropertyUserPo;
 import com.java110.utils.exception.CmdException;
+import com.java110.utils.lock.DistributedLock;
 import com.java110.utils.util.Assert;
 import com.java110.utils.util.DateUtil;
 import com.java110.utils.util.StringUtil;
@@ -80,6 +80,12 @@
     @Autowired
     private ICouponPropertyPoolConfigV1InnerServiceSMO couponPropertyPoolConfigV1InnerServiceSMOImpl;
 
+    @Autowired
+    private IChargeRuleFeeV1InnerServiceSMO chargeRuleFeeV1InnerServiceSMOImpl;
+
+    @Autowired
+    private IChargeMachineOrderCouponV1InnerServiceSMO chargeMachineOrderCouponV1InnerServiceSMOImpl;
+
     @Override
     public void validate(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) throws CmdException, ParseException {
         Assert.hasKeyAndValue(reqJson, "communityId", "鏈寘鍚皬鍖轰俊鎭�");
@@ -114,7 +120,17 @@
             duration = 10;
         }
 
-        BigDecimal payMoneyDec = new BigDecimal(Double.parseDouble(chargeMachineDtos.get(0).getDurationPrice()));
+        ChargeRuleFeeDto chargeRuleFeeDto = new ChargeRuleFeeDto();
+        chargeRuleFeeDto.setRuleId(chargeMachineDtos.get(0).getRuleId());
+        chargeRuleFeeDto.setCommunityId(chargeMachineDtos.get(0).getCommunityId());
+        List<ChargeRuleFeeDto> chargeRuleFeeDtos = chargeRuleFeeV1InnerServiceSMOImpl.queryChargeRuleFees(chargeRuleFeeDto);
+
+        if (chargeRuleFeeDtos == null || chargeRuleFeeDtos.size() < 1) {
+            throw new CmdException("鏈缃厖鍊兼敹璐�");
+        }
+        reqJson.put("durationPrice", chargeRuleFeeDtos.get(chargeRuleFeeDtos.size() - 1).getDurationPrice());
+
+        BigDecimal payMoneyDec = new BigDecimal(Double.parseDouble(chargeRuleFeeDtos.get(chargeRuleFeeDtos.size() - 1).getDurationPrice()));
 
         double payMoney = payMoneyDec.multiply(new BigDecimal(duration)).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
 
@@ -129,6 +145,7 @@
         accountDto.setLink(userDtos.get(0).getTel());
         accountDto.setAcctType(AccountDto.ACCT_TYPE_CASH);
         accountDto.setObjType(AccountDto.OBJ_TYPE_PERSON);
+        accountDto.setPartId(reqJson.getString("communityId"));
         List<AccountDto> accountDtos = accountInnerServiceSMOImpl.queryAccounts(accountDto);
 
         if (accountDtos == null || accountDtos.size() < 1) {
@@ -184,6 +201,7 @@
             durationHours = 10;
         }
 
+
         ChargeMachinePortDto chargeMachinePortDto = new ChargeMachinePortDto();
         chargeMachinePortDto.setMachineId(reqJson.getString("machineId"));
         chargeMachinePortDto.setPortId(reqJson.getString("portId"));
@@ -217,6 +235,7 @@
         chargeMachineOrderPo.setPersonId(userId);
         chargeMachineOrderPo.setChargeHours(reqJson.getString("duration"));
         chargeMachineOrderPo.setStartTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A));
+        chargeMachineOrderPo.setDurationPrice(reqJson.getString("durationPrice"));
         Calendar calendar = Calendar.getInstance();
         if (duration == 999) {
             calendar.add(Calendar.HOUR, 10);
@@ -237,16 +256,17 @@
         }
         resultVo.setData(orderId);
 
-        //鎵f
-        if (!reqJson.containsKey("couponIds") || StringUtil.isEmpty(reqJson.getString("couponIds"))) {
-            // todo 3.0 璐︽埛鎵f
-            withholdAccount(reqJson, chargeMachineDtos, orderId);
-            context.setResponseEntity(ResultVo.createResponseEntity(resultVo));
-            return;
-        }
+        double couponDurationHours = 0.0;
+
 
         //todo 浼樻儬鍒告姷鎵�
         withholdCoupon(reqJson, chargeMachineDtos, orderId);
+
+
+        if (durationHours - couponDurationHours > 0) {
+            // todo 3.0 璐︽埛鎵f
+            withholdAccount(reqJson, chargeMachineDtos, orderId, durationHours, couponDurationHours);
+        }
 
         context.setResponseEntity(ResultVo.createResponseEntity(resultVo));
     }
@@ -259,55 +279,81 @@
      * @param orderId
      */
     private void withholdCoupon(JSONObject reqJson, List<ChargeMachineDto> chargeMachineDtos, String orderId) {
+        if (!reqJson.containsKey("couponIds") || StringUtil.isEmpty(reqJson.getString("couponIds"))) {
+            return;
+        }
         int flag;
-        double hours = 0;
-        String couponNames = "";
+//        double hours = 0;
+//        String couponNames = "";
+        ChargeMachineOrderCouponPo chargeMachineOrderCouponPo = null;
         for (String couponId : reqJson.getString("couponIds").split(",")) {
+            String requestId = DistributedLock.getLockUUID();
+            String key = this.getClass().getSimpleName() + reqJson.getString("couponId");
+            try {
+                CouponPropertyUserDto couponPropertyUserDto = new CouponPropertyUserDto();
+                couponPropertyUserDto.setCouponId(couponId);
+                couponPropertyUserDto.setToType(CouponPropertyUserDto.TO_TYPE_CHARGE);
+                couponPropertyUserDto.setState(CouponPropertyUserDto.STATE_WAIT);
 
-            CouponPropertyUserDto couponPropertyUserDto = new CouponPropertyUserDto();
-            couponPropertyUserDto.setCouponId(couponId);
-            couponPropertyUserDto.setToType(CouponPropertyUserDto.TO_TYPE_CHARGE);
-            couponPropertyUserDto.setState(CouponPropertyUserDto.STATE_WAIT);
+                List<CouponPropertyUserDto> couponPropertyUserDtos = couponPropertyUserV1InnerServiceSMOImpl.queryCouponPropertyUsers(couponPropertyUserDto);
+                int stock = Integer.parseInt(couponPropertyUserDtos.get(0).getStock());
+                CouponPropertyUserPo couponPropertyUserPo = new CouponPropertyUserPo();
+                couponPropertyUserPo.setCouponId(couponPropertyUserDtos.get(0).getCouponId());
+                couponPropertyUserPo.setCommunityId(couponPropertyUserDtos.get(0).getCommunityId());
+                couponPropertyUserPo.setStock((stock - 1) + "");
+                if (stock == 1) {
+                    couponPropertyUserPo.setState(CouponPropertyUserDto.STATE_FINISH);
+                }
+                flag = couponPropertyUserV1InnerServiceSMOImpl.updateCouponPropertyUser(couponPropertyUserPo);
+                if (flag < 1) {
+                    throw new CmdException("鏍搁攢澶辫触");
+                }
 
-            List<CouponPropertyUserDto> couponPropertyUserDtos = couponPropertyUserV1InnerServiceSMOImpl.queryCouponPropertyUsers(couponPropertyUserDto);
+                CouponPropertyPoolConfigDto couponPropertyPoolConfigDto = new CouponPropertyPoolConfigDto();
+                couponPropertyPoolConfigDto.setCouponId(couponPropertyUserDtos.get(0).getCppId());
+                couponPropertyPoolConfigDto.setColumnKey("hours");
+                List<CouponPropertyPoolConfigDto> couponPropertyPoolConfigDtos = couponPropertyPoolConfigV1InnerServiceSMOImpl.queryCouponPropertyPoolConfigs(couponPropertyPoolConfigDto);
 
-            CouponPropertyUserPo couponPropertyUserPo = new CouponPropertyUserPo();
-            couponPropertyUserPo.setCouponId(couponPropertyUserDtos.get(0).getCouponId());
-            couponPropertyUserPo.setCommunityId(couponPropertyUserDtos.get(0).getCommunityId());
-            couponPropertyUserPo.setState(CouponPropertyUserDto.STATE_FINISH);
-            flag = couponPropertyUserV1InnerServiceSMOImpl.updateCouponPropertyUser(couponPropertyUserPo);
-            if (flag < 1) {
-                throw new CmdException("鏍搁攢澶辫触");
+                Assert.listOnlyOne(couponPropertyPoolConfigDtos, "鏈寘鍚紭鎯犲埜閰嶇疆淇℃伅");
+
+                double value = Double.parseDouble(couponPropertyPoolConfigDtos.get(0).getColumnValue());
+
+                chargeMachineOrderCouponPo = new ChargeMachineOrderCouponPo();
+                chargeMachineOrderCouponPo.setCouponId(couponId);
+                chargeMachineOrderCouponPo.setCouponName(couponPropertyUserDtos.get(0).getCouponName());
+                chargeMachineOrderCouponPo.setOrderId(orderId);
+                chargeMachineOrderCouponPo.setCommunityId(chargeMachineDtos.get(0).getCommunityId());
+                chargeMachineOrderCouponPo.setState("W");
+                chargeMachineOrderCouponPo.setCmocId(GenerateCodeFactory.getGeneratorId("11"));
+                chargeMachineOrderCouponPo.setHours(value + "");
+                chargeMachineOrderCouponV1InnerServiceSMOImpl.saveChargeMachineOrderCoupon(chargeMachineOrderCouponPo);
+
+//                couponNames += ("浼樻儬鍒稿悕绉帮細" + couponPropertyUserDtos.get(0).getCouponName() + "(" + couponId + "),灏忔椂锛�"+value+";");
+//
+//                hours += value;
+            } finally {
+                DistributedLock.releaseDistributedLock(requestId, key);
             }
-
-            couponNames += ("浼樻儬鍒稿悕绉帮細" + couponPropertyUserDtos.get(0).getCouponName() + ",浼樻儬鍒哥紪鍙凤細" + couponId + ";");
-
-            CouponPropertyPoolConfigDto couponPropertyPoolConfigDto = new CouponPropertyPoolConfigDto();
-            couponPropertyPoolConfigDto.setCouponId(couponPropertyUserDtos.get(0).getCppId());
-            couponPropertyPoolConfigDto.setColumnKey("hours");
-            List<CouponPropertyPoolConfigDto> couponPropertyPoolConfigDtos = couponPropertyPoolConfigV1InnerServiceSMOImpl.queryCouponPropertyPoolConfigs(couponPropertyPoolConfigDto);
-
-            Assert.listOnlyOne(couponPropertyPoolConfigDtos, "鏈寘鍚紭鎯犲埜閰嶇疆淇℃伅");
-
-            double value = Double.parseDouble(couponPropertyPoolConfigDtos.get(0).getColumnValue());
-            hours += value;
         }
 
-        hours = Math.ceil(hours);
+//        hours = Math.ceil(hours);
 
-        ChargeMachineOrderAcctPo chargeMachineOrderAcctPo = new ChargeMachineOrderAcctPo();
-        chargeMachineOrderAcctPo.setAcctDetailId("-1");
-        chargeMachineOrderAcctPo.setAmount(chargeMachineDtos.get(0).getDurationPrice());
-        chargeMachineOrderAcctPo.setCmoaId(GenerateCodeFactory.getGeneratorId("11"));
-        chargeMachineOrderAcctPo.setOrderId(orderId);
-        chargeMachineOrderAcctPo.setAcctId(reqJson.getString("acctId"));
-        chargeMachineOrderAcctPo.setStartTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A));
-        chargeMachineOrderAcctPo.setEndTime(DateUtil.getAddHoursStringA(DateUtil.getCurrentDate(), new Double(hours).intValue()));
-        chargeMachineOrderAcctPo.setRemark("浼樻儬鍒告姷鎵�," + couponNames);
-        chargeMachineOrderAcctPo.setCommunityId(chargeMachineDtos.get(0).getCommunityId());
-        chargeMachineOrderAcctPo.setEnergy("0");
+//        ChargeMachineOrderAcctPo chargeMachineOrderAcctPo = new ChargeMachineOrderAcctPo();
+//        chargeMachineOrderAcctPo.setAcctDetailId("-1");
+//        chargeMachineOrderAcctPo.setAmount("0");
+//        chargeMachineOrderAcctPo.setCmoaId(GenerateCodeFactory.getGeneratorId("11"));
+//        chargeMachineOrderAcctPo.setOrderId(orderId);
+//        chargeMachineOrderAcctPo.setAcctId(reqJson.getString("acctId"));
+//        chargeMachineOrderAcctPo.setStartTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A));
+//        chargeMachineOrderAcctPo.setEndTime(DateUtil.getAddHoursStringA(DateUtil.getCurrentDate(), new Double(hours).intValue()));
+//        chargeMachineOrderAcctPo.setRemark("浼樻儬鍒告姷鎵�," + couponNames);
+//        chargeMachineOrderAcctPo.setCommunityId(chargeMachineDtos.get(0).getCommunityId());
+//        chargeMachineOrderAcctPo.setEnergy("0");
+//        chargeMachineOrderAcctPo.setDurationPrice(reqJson.getString("durationPrice"));
+//
+//        chargeMachineOrderAcctV1InnerServiceSMOImpl.saveChargeMachineOrderAcct(chargeMachineOrderAcctPo);
 
-        chargeMachineOrderAcctV1InnerServiceSMOImpl.saveChargeMachineOrderAcct(chargeMachineOrderAcctPo);
+//        return hours;
     }
 
     /**
@@ -317,30 +363,46 @@
      * @param chargeMachineDtos
      * @param orderId
      */
-    private void withholdAccount(JSONObject reqJson, List<ChargeMachineDto> chargeMachineDtos, String orderId) {
+    private void withholdAccount(JSONObject reqJson, List<ChargeMachineDto> chargeMachineDtos, String orderId, double durationHours, double couponDurationHours) {
         AccountDto accountDto = new AccountDto();
         accountDto.setAcctId(reqJson.getString("acctId"));
         List<AccountDto> accountDtos = accountInnerServiceSMOImpl.queryAccounts(accountDto);
+
+        double amount = 0.0;
+        BigDecimal durationPrice = new BigDecimal(Double.parseDouble(reqJson.getString("durationPrice")));
+        if (couponDurationHours > 0) {
+            durationPrice = durationPrice.multiply(new BigDecimal(durationHours - couponDurationHours)).setScale(2, BigDecimal.ROUND_HALF_UP);
+            amount = durationPrice.doubleValue();
+        } else {
+            durationPrice = durationPrice.multiply(new BigDecimal(durationHours)).setScale(2, BigDecimal.ROUND_HALF_UP);
+            amount = durationPrice.doubleValue();
+        }
 
         AccountDetailPo accountDetailPo = new AccountDetailPo();
         accountDetailPo.setAcctId(accountDtos.get(0).getAcctId());
         accountDetailPo.setObjId(accountDtos.get(0).getObjId());
         accountDetailPo.setObjType(accountDtos.get(0).getObjType());
-        accountDetailPo.setAmount(chargeMachineDtos.get(0).getDurationPrice());
+        accountDetailPo.setAmount(amount + "");
         accountDetailPo.setDetailId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_detailId));
         accountInnerServiceSMOImpl.withholdAccount(accountDetailPo);
-
         ChargeMachineOrderAcctPo chargeMachineOrderAcctPo = new ChargeMachineOrderAcctPo();
         chargeMachineOrderAcctPo.setAcctDetailId(accountDetailPo.getDetailId());
-        chargeMachineOrderAcctPo.setAmount(chargeMachineDtos.get(0).getDurationPrice());
+        chargeMachineOrderAcctPo.setAmount(amount + "");
+
         chargeMachineOrderAcctPo.setCmoaId(GenerateCodeFactory.getGeneratorId("11"));
         chargeMachineOrderAcctPo.setOrderId(orderId);
         chargeMachineOrderAcctPo.setAcctId(accountDtos.get(0).getAcctId());
-        chargeMachineOrderAcctPo.setStartTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A));
-        chargeMachineOrderAcctPo.setEndTime(DateUtil.getAddHoursStringA(DateUtil.getCurrentDate(), 1));
-        chargeMachineOrderAcctPo.setRemark("涓�灏忔椂瀹氭椂鎵f");
+        if (couponDurationHours > 0) {
+            chargeMachineOrderAcctPo.setStartTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A));
+        } else {
+            chargeMachineOrderAcctPo.setStartTime(DateUtil.getAddHoursStringA(DateUtil.getCurrentDate(), new Double(Math.ceil(couponDurationHours)).intValue()));
+        }
+        chargeMachineOrderAcctPo.setEndTime(DateUtil.getAddHoursStringA(DateUtil.getCurrentDate(), new Double(Math.ceil(durationHours)).intValue()));
+        chargeMachineOrderAcctPo.setRemark("璐︽埛鎵f");
         chargeMachineOrderAcctPo.setCommunityId(chargeMachineDtos.get(0).getCommunityId());
         chargeMachineOrderAcctPo.setEnergy("0");
+        chargeMachineOrderAcctPo.setDurationPrice(reqJson.getString("durationPrice"));
+
 
         chargeMachineOrderAcctV1InnerServiceSMOImpl.saveChargeMachineOrderAcct(chargeMachineOrderAcctPo);
     }

--
Gitblit v1.8.0