Browse Source

充电桩功能优化代码

Your Name 3 years ago
parent
commit
f1eb8b84e9

+ 58 - 28
java110-bean/src/main/java/com/java110/dto/chargeMachineOrderAcct/ChargeMachineOrderAcctDto.java

@@ -1,6 +1,7 @@
 package com.java110.dto.chargeMachineOrderAcct;
 
 import com.java110.dto.PageDto;
+
 import java.io.Serializable;
 import java.util.Date;
 
@@ -15,15 +16,17 @@ import java.util.Date;
 public class ChargeMachineOrderAcctDto extends PageDto implements Serializable {
 
     private String amount;
-private String cmoaId;
-private String orderId;
-private String acctDetailId;
-private String acctId;
-private String startTime;
-private String remark;
-private String endTime;
-private String communityId;
-private String energy;
+    private String cmoaId;
+    private String orderId;
+    private String acctDetailId;
+    private String acctId;
+    private String startTime;
+    private String remark;
+    private String endTime;
+    private String communityId;
+    private String energy;
+
+    private String powerTime;
 
 
     private Date createTime;
@@ -34,61 +37,80 @@ private String energy;
     public String getAmount() {
         return amount;
     }
-public void setAmount(String amount) {
+
+    public void setAmount(String amount) {
         this.amount = amount;
     }
-public String getCmoaId() {
+
+    public String getCmoaId() {
         return cmoaId;
     }
-public void setCmoaId(String cmoaId) {
+
+    public void setCmoaId(String cmoaId) {
         this.cmoaId = cmoaId;
     }
-public String getOrderId() {
+
+    public String getOrderId() {
         return orderId;
     }
-public void setOrderId(String orderId) {
+
+    public void setOrderId(String orderId) {
         this.orderId = orderId;
     }
-public String getAcctDetailId() {
+
+    public String getAcctDetailId() {
         return acctDetailId;
     }
-public void setAcctDetailId(String acctDetailId) {
+
+    public void setAcctDetailId(String acctDetailId) {
         this.acctDetailId = acctDetailId;
     }
-public String getAcctId() {
+
+    public String getAcctId() {
         return acctId;
     }
-public void setAcctId(String acctId) {
+
+    public void setAcctId(String acctId) {
         this.acctId = acctId;
     }
-public String getStartTime() {
+
+    public String getStartTime() {
         return startTime;
     }
-public void setStartTime(String startTime) {
+
+    public void setStartTime(String startTime) {
         this.startTime = startTime;
     }
-public String getRemark() {
+
+    public String getRemark() {
         return remark;
     }
-public void setRemark(String remark) {
+
+    public void setRemark(String remark) {
         this.remark = remark;
     }
-public String getEndTime() {
+
+    public String getEndTime() {
         return endTime;
     }
-public void setEndTime(String endTime) {
+
+    public void setEndTime(String endTime) {
         this.endTime = endTime;
     }
-public String getCommunityId() {
+
+    public String getCommunityId() {
         return communityId;
     }
-public void setCommunityId(String communityId) {
+
+    public void setCommunityId(String communityId) {
         this.communityId = communityId;
     }
-public String getEnergy() {
+
+    public String getEnergy() {
         return energy;
     }
-public void setEnergy(String energy) {
+
+    public void setEnergy(String energy) {
         this.energy = energy;
     }
 
@@ -108,4 +130,12 @@ public void setEnergy(String energy) {
     public void setStatusCd(String statusCd) {
         this.statusCd = statusCd;
     }
+
+    public String getPowerTime() {
+        return powerTime;
+    }
+
+    public void setPowerTime(String powerTime) {
+        this.powerTime = powerTime;
+    }
 }

+ 55 - 33
java110-bean/src/main/java/com/java110/po/chargeMachineOrderAcct/ChargeMachineOrderAcctPo.java

@@ -17,6 +17,7 @@ package com.java110.po.chargeMachineOrderAcct;
 
 import java.io.Serializable;
 import java.util.Date;
+
 /**
  * 类表述: Po 数据模型实体对象 基本保持与数据库模型一直 用于 增加修改删除 等时的数据载体
  * add by 吴学文 at 2023-03-10 02:04:45 mail: 928255095@qq.com
@@ -28,83 +29,104 @@ import java.util.Date;
 public class ChargeMachineOrderAcctPo implements Serializable {
 
     private String amount;
-private String cmoaId;
-private String orderId;
-private String acctDetailId;
-private String acctId;
-private String startTime;
-private String remark;
-private String statusCd = "0";
-private String endTime;
-private String communityId;
-private String energy;
-public String getAmount() {
+    private String cmoaId;
+    private String orderId;
+    private String acctDetailId;
+    private String acctId;
+    private String startTime;
+    private String remark;
+    private String statusCd = "0";
+    private String endTime;
+    private String communityId;
+    private String energy;
+
+    public String getAmount() {
         return amount;
     }
-public void setAmount(String amount) {
+
+    public void setAmount(String amount) {
         this.amount = amount;
     }
-public String getCmoaId() {
+
+    public String getCmoaId() {
         return cmoaId;
     }
-public void setCmoaId(String cmoaId) {
+
+    public void setCmoaId(String cmoaId) {
         this.cmoaId = cmoaId;
     }
-public String getOrderId() {
+
+    public String getOrderId() {
         return orderId;
     }
-public void setOrderId(String orderId) {
+
+    public void setOrderId(String orderId) {
         this.orderId = orderId;
     }
-public String getAcctDetailId() {
+
+    public String getAcctDetailId() {
         return acctDetailId;
     }
-public void setAcctDetailId(String acctDetailId) {
+
+    public void setAcctDetailId(String acctDetailId) {
         this.acctDetailId = acctDetailId;
     }
-public String getAcctId() {
+
+    public String getAcctId() {
         return acctId;
     }
-public void setAcctId(String acctId) {
+
+    public void setAcctId(String acctId) {
         this.acctId = acctId;
     }
-public String getStartTime() {
+
+    public String getStartTime() {
         return startTime;
     }
-public void setStartTime(String startTime) {
+
+    public void setStartTime(String startTime) {
         this.startTime = startTime;
     }
-public String getRemark() {
+
+    public String getRemark() {
         return remark;
     }
-public void setRemark(String remark) {
+
+    public void setRemark(String remark) {
         this.remark = remark;
     }
-public String getStatusCd() {
+
+    public String getStatusCd() {
         return statusCd;
     }
-public void setStatusCd(String statusCd) {
+
+    public void setStatusCd(String statusCd) {
         this.statusCd = statusCd;
     }
-public String getEndTime() {
+
+    public String getEndTime() {
         return endTime;
     }
-public void setEndTime(String endTime) {
+
+    public void setEndTime(String endTime) {
         this.endTime = endTime;
     }
-public String getCommunityId() {
+
+    public String getCommunityId() {
         return communityId;
     }
-public void setCommunityId(String communityId) {
+
+    public void setCommunityId(String communityId) {
         this.communityId = communityId;
     }
-public String getEnergy() {
+
+    public String getEnergy() {
         return energy;
     }
-public void setEnergy(String energy) {
+
+    public void setEnergy(String energy) {
         this.energy = energy;
     }
 
 
-
 }

+ 130 - 122
java110-db/src/main/resources/mapper/common/ChargeMachineOrderAcctV1ServiceDaoImplMapper.xml

@@ -5,147 +5,155 @@
 <mapper namespace="chargeMachineOrderAcctV1ServiceDaoImpl">
 
 
-
-
-
     <!-- 保存充电扣款信息 add by wuxw 2018-07-03 -->
     <insert id="saveChargeMachineOrderAcctInfo" parameterType="Map">
         insert into charge_machine_order_acct(
-amount,cmoa_id,order_id,acct_detail_id,acct_id,start_time,remark,end_time,community_id,energy
-) values (
-#{amount},#{cmoaId},#{orderId},#{acctDetailId},#{acctId},#{startTime},#{remark},#{endTime},#{communityId},#{energy}
-)
+        amount,cmoa_id,order_id,acct_detail_id,acct_id,start_time,remark,end_time,community_id,energy
+        ) values (
+        #{amount},#{cmoaId},#{orderId},#{acctDetailId},#{acctId},#{startTime},#{remark},#{endTime},#{communityId},#{energy}
+        )
     </insert>
 
 
-
     <!-- 查询充电扣款信息 add by wuxw 2018-07-03 -->
     <select id="getChargeMachineOrderAcctInfo" parameterType="Map" resultType="Map">
-        select  t.amount,t.cmoa_id,t.cmoa_id cmoaId,t.order_id,t.order_id orderId,t.acct_detail_id,t.acct_detail_id acctDetailId,t.acct_id,t.acct_id acctId,t.start_time,t.start_time startTime,t.remark,t.status_cd,t.status_cd statusCd,t.end_time,t.end_time endTime,t.community_id,t.community_id communityId,t.energy 
-from charge_machine_order_acct t 
-where 1 =1 
-<if test="amount !=null and amount != ''">
-   and t.amount= #{amount}
-</if> 
-<if test="cmoaId !=null and cmoaId != ''">
-   and t.cmoa_id= #{cmoaId}
-</if> 
-<if test="orderId !=null and orderId != ''">
-   and t.order_id= #{orderId}
-</if> 
-<if test="acctDetailId !=null and acctDetailId != ''">
-   and t.acct_detail_id= #{acctDetailId}
-</if> 
-<if test="acctId !=null and acctId != ''">
-   and t.acct_id= #{acctId}
-</if> 
-<if test="startTime !=null and startTime != ''">
-   and t.start_time= #{startTime}
-</if> 
-<if test="remark !=null and remark != ''">
-   and t.remark= #{remark}
-</if> 
-<if test="statusCd !=null and statusCd != ''">
-   and t.status_cd= #{statusCd}
-</if> 
-<if test="endTime !=null and endTime != ''">
-   and t.end_time= #{endTime}
-</if> 
-<if test="communityId !=null and communityId != ''">
-   and t.community_id= #{communityId}
-</if> 
-<if test="energy !=null and energy != ''">
-   and t.energy= #{energy}
-</if> 
-order by t.create_time desc
-<if test="page != -1 and page != null ">
-   limit #{page}, #{row}
-</if> 
+        select t.amount,t.cmoa_id,t.cmoa_id cmoaId,t.order_id,t.order_id orderId,t.acct_detail_id,t.acct_detail_id
+        acctDetailId,t.acct_id,t.acct_id acctId,t.start_time,t.start_time startTime,t.remark,t.status_cd,t.status_cd
+        statusCd,t.end_time,t.end_time endTime,t.community_id,t.community_id communityId,t.energy
+        from charge_machine_order_acct t
+        where 1 =1
+        <if test="amount !=null and amount != ''">
+            and t.amount= #{amount}
+        </if>
+        <if test="cmoaId !=null and cmoaId != ''">
+            and t.cmoa_id= #{cmoaId}
+        </if>
+        <if test="orderId !=null and orderId != ''">
+            and t.order_id= #{orderId}
+        </if>
+        <if test="acctDetailId !=null and acctDetailId != ''">
+            and t.acct_detail_id= #{acctDetailId}
+        </if>
+        <if test="acctId !=null and acctId != ''">
+            and t.acct_id= #{acctId}
+        </if>
+        <if test="startTime !=null and startTime != ''">
+            and t.start_time= #{startTime}
+        </if>
+        <if test="remark !=null and remark != ''">
+            and t.remark= #{remark}
+        </if>
+        <if test="statusCd !=null and statusCd != ''">
+            and t.status_cd= #{statusCd}
+        </if>
+        <if test="endTime !=null and endTime != ''">
+            and t.end_time= #{endTime}
+        </if>
+        <if test="communityId !=null and communityId != ''">
+            and t.community_id= #{communityId}
+        </if>
+        <if test="energy !=null and energy != ''">
+            and t.energy= #{energy}
+        </if>
+        <if test="powerTime !=null and powerTime != ''">
+            and t.start_time &lt; #{powerTime}
+            and t.end_time &gt; #{powerTime}
+        </if>
+
+        order by t.create_time desc
+        <if test="page != -1 and page != null ">
+            limit #{page}, #{row}
+        </if>
 
     </select>
 
 
-
-
     <!-- 修改充电扣款信息 add by wuxw 2018-07-03 -->
     <update id="updateChargeMachineOrderAcctInfo" parameterType="Map">
-        update  charge_machine_order_acct t set t.status_cd = #{statusCd}
-<if test="newBId != null and newBId != ''">
-,t.b_id = #{newBId}
-</if> 
-<if test="amount !=null and amount != ''">
-, t.amount= #{amount}
-</if> 
-<if test="orderId !=null and orderId != ''">
-, t.order_id= #{orderId}
-</if> 
-<if test="acctDetailId !=null and acctDetailId != ''">
-, t.acct_detail_id= #{acctDetailId}
-</if> 
-<if test="acctId !=null and acctId != ''">
-, t.acct_id= #{acctId}
-</if> 
-<if test="startTime !=null and startTime != ''">
-, t.start_time= #{startTime}
-</if> 
-<if test="remark !=null and remark != ''">
-, t.remark= #{remark}
-</if> 
-<if test="endTime !=null and endTime != ''">
-, t.end_time= #{endTime}
-</if> 
-<if test="communityId !=null and communityId != ''">
-, t.community_id= #{communityId}
-</if> 
-<if test="energy !=null and energy != ''">
-, t.energy= #{energy}
-</if> 
- where 1=1 <if test="cmoaId !=null and cmoaId != ''">
-and t.cmoa_id= #{cmoaId}
-</if> 
+        update charge_machine_order_acct t set t.status_cd = #{statusCd}
+        <if test="newBId != null and newBId != ''">
+            ,t.b_id = #{newBId}
+        </if>
+        <if test="amount !=null and amount != ''">
+            , t.amount= #{amount}
+        </if>
+
+        <if test="acctDetailId !=null and acctDetailId != ''">
+            , t.acct_detail_id= #{acctDetailId}
+        </if>
+        <if test="acctId !=null and acctId != ''">
+            , t.acct_id= #{acctId}
+        </if>
+        <if test="startTime !=null and startTime != ''">
+            , t.start_time= #{startTime}
+        </if>
+        <if test="remark !=null and remark != ''">
+            , t.remark= #{remark}
+        </if>
+        <if test="endTime !=null and endTime != ''">
+            , t.end_time= #{endTime}
+        </if>
+
+        <if test="energy !=null and energy != ''">
+            , t.energy= #{energy}
+        </if>
+        where 1=1
+        <if test="cmoaId !=null and cmoaId != ''">
+            and t.cmoa_id= #{cmoaId}
+        </if>
+        <if test="communityId !=null and communityId != ''">
+            and t.community_id= #{communityId}
+        </if>
+        <if test="orderId !=null and orderId != ''">
+            and t.order_id= #{orderId}
+        </if>
 
     </update>
 
     <!-- 查询充电扣款数量 add by wuxw 2018-07-03 -->
-     <select id="queryChargeMachineOrderAcctsCount" parameterType="Map" resultType="Map">
-        select  count(1) count 
-from charge_machine_order_acct t 
-where 1 =1 
-<if test="amount !=null and amount != ''">
-   and t.amount= #{amount}
-</if> 
-<if test="cmoaId !=null and cmoaId != ''">
-   and t.cmoa_id= #{cmoaId}
-</if> 
-<if test="orderId !=null and orderId != ''">
-   and t.order_id= #{orderId}
-</if> 
-<if test="acctDetailId !=null and acctDetailId != ''">
-   and t.acct_detail_id= #{acctDetailId}
-</if> 
-<if test="acctId !=null and acctId != ''">
-   and t.acct_id= #{acctId}
-</if> 
-<if test="startTime !=null and startTime != ''">
-   and t.start_time= #{startTime}
-</if> 
-<if test="remark !=null and remark != ''">
-   and t.remark= #{remark}
-</if> 
-<if test="statusCd !=null and statusCd != ''">
-   and t.status_cd= #{statusCd}
-</if> 
-<if test="endTime !=null and endTime != ''">
-   and t.end_time= #{endTime}
-</if> 
-<if test="communityId !=null and communityId != ''">
-   and t.community_id= #{communityId}
-</if> 
-<if test="energy !=null and energy != ''">
-   and t.energy= #{energy}
-</if> 
+    <select id="queryChargeMachineOrderAcctsCount" parameterType="Map" resultType="Map">
+        select count(1) count
+        from charge_machine_order_acct t
+        where 1 =1
+        <if test="amount !=null and amount != ''">
+            and t.amount= #{amount}
+        </if>
+        <if test="cmoaId !=null and cmoaId != ''">
+            and t.cmoa_id= #{cmoaId}
+        </if>
+        <if test="orderId !=null and orderId != ''">
+            and t.order_id= #{orderId}
+        </if>
+        <if test="acctDetailId !=null and acctDetailId != ''">
+            and t.acct_detail_id= #{acctDetailId}
+        </if>
+        <if test="acctId !=null and acctId != ''">
+            and t.acct_id= #{acctId}
+        </if>
+        <if test="startTime !=null and startTime != ''">
+            and t.start_time= #{startTime}
+        </if>
+        <if test="remark !=null and remark != ''">
+            and t.remark= #{remark}
+        </if>
+        <if test="statusCd !=null and statusCd != ''">
+            and t.status_cd= #{statusCd}
+        </if>
+        <if test="endTime !=null and endTime != ''">
+            and t.end_time= #{endTime}
+        </if>
+        <if test="communityId !=null and communityId != ''">
+            and t.community_id= #{communityId}
+        </if>
+        <if test="energy !=null and energy != ''">
+            and t.energy= #{energy}
+        </if>
+        <if test="powerTime !=null and powerTime != ''">
+            and t.start_time &lt; #{powerTime}
+            and t.end_time &gt; #{powerTime}
+        </if>
 
 
-     </select>
+    </select>
 
 </mapper>

+ 9 - 0
java110-utils/src/main/java/com/java110/utils/util/DateUtil.java

@@ -477,6 +477,15 @@ public class DateUtil {
     }
 
 
+    public static String getAddHoursStringA(Date date, int hours) {
+        SimpleDateFormat sf = new SimpleDateFormat(DATE_FORMATE_STRING_A);
+        Calendar c = Calendar.getInstance();
+        c.setTime(date);
+        c.add(Calendar.HOUR_OF_DAY, hours);
+        return sf.format(c.getTime());
+    }
+
+
     public static String getAddMonthStringA(Date date, int month) {
         SimpleDateFormat sf = new SimpleDateFormat(DATE_FORMATE_STRING_A);
         Calendar c = Calendar.getInstance();

+ 106 - 6
service-common/src/main/java/com/java110/common/charge/ChargeCoreImpl.java

@@ -1,17 +1,20 @@
 package com.java110.common.charge;
 
 import com.java110.common.smartMeter.ISmartMeterFactoryAdapt;
+import com.java110.core.factory.GenerateCodeFactory;
+import com.java110.dto.account.AccountDto;
 import com.java110.dto.chargeMachine.ChargeMachineDto;
 import com.java110.dto.chargeMachineFactory.ChargeMachineFactoryDto;
 import com.java110.dto.chargeMachineOrder.ChargeMachineOrderDto;
 import com.java110.dto.chargeMachineOrder.NotifyChargeOrderDto;
 import com.java110.dto.chargeMachineOrder.NotifyChargePortDto;
+import com.java110.dto.chargeMachineOrderAcct.ChargeMachineOrderAcctDto;
 import com.java110.dto.chargeMachinePort.ChargeMachinePortDto;
-import com.java110.intf.common.IChargeMachineFactoryV1InnerServiceSMO;
-import com.java110.intf.common.IChargeMachineOrderV1InnerServiceSMO;
-import com.java110.intf.common.IChargeMachinePortV1InnerServiceSMO;
-import com.java110.intf.common.IChargeMachineV1InnerServiceSMO;
+import com.java110.intf.acct.IAccountInnerServiceSMO;
+import com.java110.intf.common.*;
+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.utils.exception.CmdException;
 import com.java110.utils.factory.ApplicationContextFactory;
@@ -23,6 +26,7 @@ import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
 import java.util.List;
 
 /**
@@ -31,6 +35,9 @@ import java.util.List;
 @Service
 public class ChargeCoreImpl implements IChargeCore {
 
+    @Autowired
+    private IAccountInnerServiceSMO accountInnerServiceSMOImpl;
+
     @Autowired
     private IChargeMachineFactoryV1InnerServiceSMO chargeMachineFactoryV1InnerServiceSMOImpl;
 
@@ -43,6 +50,10 @@ public class ChargeCoreImpl implements IChargeCore {
     @Autowired
     private IChargeMachinePortV1InnerServiceSMO chargeMachinePortV1InnerServiceSMOImpl;
 
+
+    @Autowired
+    private IChargeMachineOrderAcctV1InnerServiceSMO chargeMachineOrderAcctV1InnerServiceSMOImpl;
+
     @Override
     public ResultVo startCharge(ChargeMachineDto chargeMachineDto, ChargeMachinePortDto chargeMachinePortDto, String chargeType, double duration, String orderId) {
 
@@ -164,7 +175,7 @@ public class ChargeCoreImpl implements IChargeCore {
         List<NotifyChargePortDto> portDtos = chargeFactoryAdapt.getChargeHeartBeatParam(notifyChargeOrderDto);
 
         for (NotifyChargePortDto notifyChargePortDto : portDtos) {
-            doDealChargePort(notifyChargePortDto, notifyChargeOrderDto, chargeMachineDtos.get(0));
+            doDealChargePort(notifyChargePortDto, notifyChargeOrderDto, chargeMachineDtos.get(0), chargeFactoryAdapt);
         }
 
         return new ResponseEntity<>("{\n" +
@@ -179,14 +190,103 @@ public class ChargeCoreImpl implements IChargeCore {
      * @param notifyChargePortDto
      * @param notifyChargeOrderDto
      */
-    private void doDealChargePort(NotifyChargePortDto notifyChargePortDto, NotifyChargeOrderDto notifyChargeOrderDto, ChargeMachineDto chargeMachineDto) {
+    private void doDealChargePort(NotifyChargePortDto notifyChargePortDto,
+                                  NotifyChargeOrderDto notifyChargeOrderDto,
+                                  ChargeMachineDto chargeMachineDto,
+                                  IChargeFactoryAdapt chargeFactoryAdapt) {
+
+        String preEnergy = "0";
+        ChargeMachineOrderDto chargeMachineOrderDto = new ChargeMachineOrderDto();
+        chargeMachineOrderDto.setOrderId(notifyChargePortDto.getOrderId());
+        List<ChargeMachineOrderDto> orderDtos = chargeMachineOrderV1InnerServiceSMOImpl.queryChargeMachineOrders(chargeMachineOrderDto);
+
+        Assert.listOnlyOne(orderDtos, "订单不存在");
+        String state = ChargeMachineOrderDto.STATE_DOING;
+        if (preEnergy.equals(notifyChargePortDto.getEnergy())) {
+            state = ChargeMachineOrderDto.STATE_FINISH;
+        }
+        updateOrderState(notifyChargePortDto, state);
+
+        //todo 主动调用关闭
+        if (preEnergy.equals(notifyChargePortDto.getEnergy())) {
+            customStopCharge(notifyChargePortDto, chargeMachineDto, chargeFactoryAdapt, orderDtos);
+        }
 
         // todo 1.0 查询上报时间是否已经 扣款,如果扣款过,那么更新 充电电量 后返回
 
+        String powerTime = DateUtil.getFormatTimeString(notifyChargePortDto.getPowerTime(), DateUtil.DATE_FORMATE_STRING_A);
+
+        ChargeMachineOrderAcctDto chargeMachineOrderAcctDto = new ChargeMachineOrderAcctDto();
+        chargeMachineOrderAcctDto.setOrderId(notifyChargeOrderDto.getOrderId());
+        chargeMachineOrderAcctDto.setPowerTime(powerTime);
+        List<ChargeMachineOrderAcctDto> chargeMachineOrderAcctDtos = chargeMachineOrderAcctV1InnerServiceSMOImpl.queryChargeMachineOrderAccts(chargeMachineOrderAcctDto);
+
+        if (chargeMachineOrderAcctDtos != null && chargeMachineOrderAcctDtos.size() > 0) {
+            return;
+        }
+
         // todo 2.0 检查账户是否余额充足,如果余额不足,则 调用停止充电 将充电订单 修改成充电完成,并且修改备注
 
+        double price = Double.parseDouble(chargeMachineDto.getDurationPrice());
+
+        AccountDto accountDto = new AccountDto();
+        accountDto.setAcctId(orderDtos.get(0).getAcctDetailId());
+        accountDto.setAcctType(AccountDto.ACCT_TYPE_CASH);
+        List<AccountDto> accountDtos = accountInnerServiceSMOImpl.queryAccounts(accountDto);
+
+        if (accountDtos == null || accountDtos.size() < 1) {
+            throw new CmdException("请先充值,账户金额不足");
+        }
+
+        //todo 账户金额不足,无法支付小时费用,停止充电
+        if (Double.parseDouble(accountDtos.get(0).getAmount()) < price) {
+            customStopCharge(notifyChargePortDto, chargeMachineDto, chargeFactoryAdapt, orderDtos);
+            updateOrderState(notifyChargePortDto, ChargeMachineOrderDto.STATE_FINISH);
+            return;
+        }
+
+
         // todo 3.0 账户扣款
+        AccountDetailPo accountDetailPo = new AccountDetailPo();
+        accountDetailPo.setAcctId(accountDtos.get(0).getAcctId());
+        accountDetailPo.setObjId(accountDtos.get(0).getObjId());
+        accountDetailPo.setObjType(accountDtos.get(0).getObjType());
+        accountDetailPo.setAmount(price + "");
+        accountDetailPo.setDetailId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_detailId));
+        accountInnerServiceSMOImpl.withholdAccount(accountDetailPo);
+
+        ChargeMachineOrderAcctPo chargeMachineOrderAcctPo = new ChargeMachineOrderAcctPo();
+        chargeMachineOrderAcctPo.setAcctDetailId(accountDetailPo.getDetailId());
+        chargeMachineOrderAcctPo.setAmount(price + "");
+        chargeMachineOrderAcctPo.setCmoaId(GenerateCodeFactory.getGeneratorId("11"));
+        chargeMachineOrderAcctPo.setOrderId(notifyChargePortDto.getOrderId());
+        chargeMachineOrderAcctPo.setAcctId(accountDtos.get(0).getAcctId());
+        chargeMachineOrderAcctPo.setStartTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A));
+        chargeMachineOrderAcctPo.setEndTime(DateUtil.getAddHoursStringA(DateUtil.getCurrentDate(), 1));
+        chargeMachineOrderAcctPo.setRemark("一小时定时扣款");
+        chargeMachineOrderAcctPo.setCommunityId(orderDtos.get(0).getCommunityId());
+        chargeMachineOrderAcctPo.setEnergy(notifyChargePortDto.getEnergy());
+
+        chargeMachineOrderAcctV1InnerServiceSMOImpl.saveChargeMachineOrderAcct(chargeMachineOrderAcctPo);
+
+    }
 
+    private void updateOrderState(NotifyChargePortDto notifyChargePortDto, String state) {
+        ChargeMachineOrderPo chargeMachineOrderPo = new ChargeMachineOrderPo();
+        chargeMachineOrderPo.setOrderId(notifyChargePortDto.getOrderId());
+        chargeMachineOrderPo.setEnergy(notifyChargePortDto.getEnergy());
+        chargeMachineOrderPo.setState(state);
+
+        chargeMachineOrderV1InnerServiceSMOImpl.updateChargeMachineOrder(chargeMachineOrderPo);
+    }
 
+    private void customStopCharge(NotifyChargePortDto notifyChargePortDto, ChargeMachineDto chargeMachineDto, IChargeFactoryAdapt chargeFactoryAdapt, List<ChargeMachineOrderDto> orderDtos) {
+        ChargeMachinePortDto chargeMachinePortDto = new ChargeMachinePortDto();
+        chargeMachinePortDto.setMachineId(orderDtos.get(0).getMachineId());
+        chargeMachinePortDto.setPortCode(notifyChargePortDto.getPortCode());
+        List<ChargeMachinePortDto> chargeMachinePortDtos = chargeMachinePortV1InnerServiceSMOImpl.queryChargeMachinePorts(chargeMachinePortDto);
+        if (chargeMachinePortDtos != null && chargeMachinePortDtos.size() > 0) {
+            chargeFactoryAdapt.stopCharge(chargeMachineDto, chargeMachinePortDtos.get(0));
+        }
     }
 }

+ 38 - 0
service-common/src/main/java/com/java110/common/cmd/chargeMachine/StartChargeCmd.java

@@ -3,6 +3,7 @@ package com.java110.common.cmd.chargeMachine;
 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;
@@ -14,11 +15,14 @@ import com.java110.dto.chargeMachineOrder.ChargeMachineOrderDto;
 import com.java110.dto.chargeMachinePort.ChargeMachinePortDto;
 import com.java110.dto.user.UserDto;
 import com.java110.intf.acct.IAccountInnerServiceSMO;
+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.utils.exception.CmdException;
 import com.java110.utils.util.Assert;
 import com.java110.utils.util.DateUtil;
@@ -56,6 +60,9 @@ public class StartChargeCmd extends Cmd {
     @Autowired
     private IChargeMachineOrderV1InnerServiceSMO chargeMachineOrderV1InnerServiceSMOImpl;
 
+    @Autowired
+    private IChargeMachineOrderAcctV1InnerServiceSMO chargeMachineOrderAcctV1InnerServiceSMOImpl;
+
     @Override
     public void validate(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) throws CmdException, ParseException {
         Assert.hasKeyAndValue(reqJson, "communityId", "未包含小区信息");
@@ -120,6 +127,7 @@ public class StartChargeCmd extends Cmd {
     }
 
     @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();
@@ -183,6 +191,36 @@ public class StartChargeCmd extends Cmd {
             chargeCoreImpl.stopCharge(chargeMachineDtos.get(0), chargeMachinePortDtos.get(0));
             throw new CmdException("充电失败");
         }
+
+        //扣款
+        // todo 3.0 账户扣款
+
+        AccountDto accountDto = new AccountDto();
+        accountDto.setAcctId(reqJson.getString("acctId"));
+        List<AccountDto> accountDtos = accountInnerServiceSMOImpl.queryAccounts(accountDto);
+
+        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.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.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("一小时定时扣款");
+        chargeMachineOrderAcctPo.setCommunityId(chargeMachineDtos.get(0).getCommunityId());
+        chargeMachineOrderAcctPo.setEnergy("0");
+
+        chargeMachineOrderAcctV1InnerServiceSMOImpl.saveChargeMachineOrderAcct(chargeMachineOrderAcctPo);
+
         context.setResponseEntity(ResultVo.createResponseEntity(resultVo));
     }
 }