From e20c58a63d3827d9c55cd5f387568fb0916b9590 Mon Sep 17 00:00:00 2001
From: Your Name <you@example.com>
Date: 星期五, 17 三月 2023 23:37:12 +0800
Subject: [PATCH] Merge branch 'master' of http://git.homecommunity.cn/supervip/MicroCommunity

---
 service-common/src/main/java/com/java110/common/cmd/chargeMachine/StartChargeCmd.java |  185 ++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 185 insertions(+), 0 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 9f6ec21..0f67161 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
@@ -1,8 +1,10 @@
 package com.java110.common.cmd.chargeMachine;
 
+import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.java110.common.charge.IChargeCore;
 import com.java110.core.annotation.Java110Cmd;
+import com.java110.core.annotation.Java110Transactional;
 import com.java110.core.context.ICmdDataFlowContext;
 import com.java110.core.event.cmd.Cmd;
 import com.java110.core.event.cmd.CmdEvent;
@@ -12,16 +14,28 @@
 import com.java110.dto.chargeMachine.ChargeMachineDto;
 import com.java110.dto.chargeMachineOrder.ChargeMachineOrderDto;
 import com.java110.dto.chargeMachinePort.ChargeMachinePortDto;
+import com.java110.dto.couponPropertyPoolConfig.CouponPropertyPoolConfigDto;
+import com.java110.dto.couponPropertyUser.CouponPropertyUserDto;
 import com.java110.dto.user.UserDto;
 import com.java110.intf.acct.IAccountInnerServiceSMO;
+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.user.IUserV1InnerServiceSMO;
+import com.java110.po.accountDetail.AccountDetailPo;
 import com.java110.po.chargeMachineOrder.ChargeMachineOrderPo;
+import com.java110.po.chargeMachineOrderAcct.ChargeMachineOrderAcctPo;
+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;
 import com.java110.vo.ResultVo;
 import org.springframework.beans.factory.annotation.Autowired;
 
@@ -55,6 +69,17 @@
 
     @Autowired
     private IChargeMachineOrderV1InnerServiceSMO chargeMachineOrderV1InnerServiceSMOImpl;
+
+    @Autowired
+    private IChargeMachineOrderAcctV1InnerServiceSMO chargeMachineOrderAcctV1InnerServiceSMOImpl;
+    @Autowired
+    private ICouponPropertyUserV1InnerServiceSMO couponPropertyUserV1InnerServiceSMOImpl;
+
+    @Autowired
+    private ICouponPropertyUserDetailV1InnerServiceSMO couponPropertyUserDetailV1InnerServiceSMOImpl;
+
+    @Autowired
+    private ICouponPropertyPoolConfigV1InnerServiceSMO couponPropertyPoolConfigV1InnerServiceSMOImpl;
 
     @Override
     public void validate(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) throws CmdException, ParseException {
@@ -104,6 +129,7 @@
         AccountDto accountDto = new AccountDto();
         accountDto.setLink(userDtos.get(0).getTel());
         accountDto.setAcctType(AccountDto.ACCT_TYPE_CASH);
+        accountDto.setObjType(AccountDto.OBJ_TYPE_PERSON);
         List<AccountDto> accountDtos = accountInnerServiceSMOImpl.queryAccounts(accountDto);
 
         if (accountDtos == null || accountDtos.size() < 1) {
@@ -116,10 +142,30 @@
 
         reqJson.put("acctId", accountDtos.get(0).getAcctId());
 
+        if (!reqJson.containsKey("couponIds") || StringUtil.isEmpty(reqJson.getString("couponIds"))) {
+            return;
+        }
+
+        for (String couponId : reqJson.getString("couponIds").split(",")) {
+            CouponPropertyUserDto couponPropertyUserDto = new CouponPropertyUserDto();
+            couponPropertyUserDto.setCouponId(couponId);
+            couponPropertyUserDto.setToType(CouponPropertyUserDto.TO_TYPE_CHARGE);
+            couponPropertyUserDto.setState(CouponPropertyUserDto.STATE_WAIT);
+
+            List<CouponPropertyUserDto> couponPropertyUserDtos = couponPropertyUserV1InnerServiceSMOImpl.queryCouponPropertyUsers(couponPropertyUserDto);
+
+            if (couponPropertyUserDtos == null || couponPropertyUserDtos.size() < 1) {
+                throw new CmdException("浼樻儬鍒镐笉瀛樺湪");
+            }
+            if (!"Y".equals(couponPropertyUserDtos.get(0).getIsExpire())) {
+                throw new CmdException("浼樻儬鍒稿凡杩囨湡");
+            }
+        }
 
     }
 
     @Override
+    @Java110Transactional
     public void doCmd(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) throws CmdException, ParseException {
         String userId = context.getReqHeaders().get("user-id");
         UserDto userDto = new UserDto();
@@ -154,6 +200,13 @@
             return;
         }
 
+        // todo 淇敼绔彛鐘舵��
+        ChargeMachinePortPo chargeMachinePortPo = new ChargeMachinePortPo();
+        chargeMachinePortPo.setPortId(chargeMachinePortDtos.get(0).getPortId());
+        chargeMachinePortPo.setCommunityId(chargeMachinePortDtos.get(0).getCommunityId());
+        chargeMachinePortPo.setState(ChargeMachinePortDto.STATE_WORKING);
+        chargeMachinePortV1InnerServiceSMOImpl.updateChargeMachinePort(chargeMachinePortPo);
+
         // todo 鐢熸垚 鍏呯數璁㈠崟
         ChargeMachineOrderPo chargeMachineOrderPo = new ChargeMachineOrderPo();
         chargeMachineOrderPo.setAmount("0");
@@ -183,6 +236,138 @@
             chargeCoreImpl.stopCharge(chargeMachineDtos.get(0), chargeMachinePortDtos.get(0));
             throw new CmdException("鍏呯數澶辫触");
         }
+        resultVo.setData(orderId);
+
+        double couponDurationHours = 0.0;
+        //鎵f
+        if (reqJson.containsKey("couponIds") && !StringUtil.isEmpty(reqJson.getString("couponIds"))) {
+            //todo 浼樻儬鍒告姷鎵�
+            couponDurationHours = withholdCoupon(reqJson, chargeMachineDtos, orderId);
+        }
+
+        if(durationHours - couponDurationHours >0) {
+            // todo 3.0 璐︽埛鎵f
+            withholdAccount(reqJson, chargeMachineDtos, orderId,durationHours,couponDurationHours);
+        }
+
         context.setResponseEntity(ResultVo.createResponseEntity(resultVo));
     }
+
+    /**
+     * 浼樻儬鍒告姷鎵�
+     *
+     * @param reqJson
+     * @param chargeMachineDtos
+     * @param orderId
+     */
+    private double withholdCoupon(JSONObject reqJson, List<ChargeMachineDto> chargeMachineDtos, String orderId) {
+        int flag;
+        double hours = 0;
+        String couponNames = "";
+        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);
+
+                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("鏍搁攢澶辫触");
+                }
+
+                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;
+            } finally {
+                DistributedLock.releaseDistributedLock(requestId, key);
+            }
+        }
+
+        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");
+
+        chargeMachineOrderAcctV1InnerServiceSMOImpl.saveChargeMachineOrderAcct(chargeMachineOrderAcctPo);
+
+        return hours;
+    }
+
+    /**
+     * 璐︽埛鎶垫墸
+     *
+     * @param reqJson
+     * @param chargeMachineDtos
+     * @param 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(chargeMachineDtos.get(0).getDurationPrice()));
+        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(amount+"");
+        accountDetailPo.setDetailId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_detailId));
+        accountInnerServiceSMOImpl.withholdAccount(accountDetailPo);
+        ChargeMachineOrderAcctPo chargeMachineOrderAcctPo = new ChargeMachineOrderAcctPo();
+        chargeMachineOrderAcctPo.setAcctDetailId(accountDetailPo.getDetailId());
+        chargeMachineOrderAcctPo.setAmount(amount+"");
+
+        chargeMachineOrderAcctPo.setCmoaId(GenerateCodeFactory.getGeneratorId("11"));
+        chargeMachineOrderAcctPo.setOrderId(orderId);
+        chargeMachineOrderAcctPo.setAcctId(accountDtos.get(0).getAcctId());
+        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");
+
+        chargeMachineOrderAcctV1InnerServiceSMOImpl.saveChargeMachineOrderAcct(chargeMachineOrderAcctPo);
+    }
 }

--
Gitblit v1.8.0