java110 пре 2 година
родитељ
комит
91dae281bf

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

@@ -18,6 +18,9 @@ public class DatabusDataDto extends PageDto implements Serializable {
     // 车辆进出手动触发
     public static final String BUSINESS_TYPE_SAVE_CAR_INOUT_DETAIL = "saveCarInoutDetail";
 
+    public static final String BUSINESS_TYPE_SAVE_PARKING_COUPON_CAR_ORDER = "saveParkingCouponCarOrder";
+
+
     private String businessTypeCd;
 
     private JSONObject data;

+ 10 - 0
java110-bean/src/main/java/com/java110/dto/parking/ParkingCouponShopDto.java

@@ -43,6 +43,8 @@ public class ParkingCouponShopDto extends PageDto implements Serializable {
     private String valuePrice;
     private String typeCdName;
 
+    private String hasQuantity;
+
 
     public String getQuantity() {
         return quantity;
@@ -196,4 +198,12 @@ public class ParkingCouponShopDto extends PageDto implements Serializable {
     public void setTypeCdName(String typeCdName) {
         this.typeCdName = typeCdName;
     }
+
+    public String getHasQuantity() {
+        return hasQuantity;
+    }
+
+    public void setHasQuantity(String hasQuantity) {
+        this.hasQuantity = hasQuantity;
+    }
 }

+ 50 - 30
java110-bean/src/main/java/com/java110/po/parking/ParkingCouponCarOrderPo.java

@@ -17,6 +17,7 @@ package com.java110.po.parking;
 
 import java.io.Serializable;
 import java.util.Date;
+
 /**
  * 类表述: Po 数据模型实体对象 基本保持与数据库模型一直 用于 增加修改删除 等时的数据载体
  * add by 吴学文 at 2022-10-12 19:10:35 mail: 928255095@qq.com
@@ -28,76 +29,95 @@ import java.util.Date;
 public class ParkingCouponCarOrderPo implements Serializable {
 
     private String pccId;
-private String machineId;
-private String orderId;
-private String paId;
-private String carNum;
-private String remark;
-private String statusCd = "0";
-private String communityId;
-private String carOutId;
-private String machineName;
-public String getPccId() {
+    private String machineId;
+    private String orderId;
+    private String paId;
+    private String carNum;
+    private String remark;
+    private String statusCd = "0";
+    private String communityId;
+    private String carOutId;
+    private String machineName;
+
+    public String getPccId() {
         return pccId;
     }
-public void setPccId(String pccId) {
+
+    public void setPccId(String pccId) {
         this.pccId = pccId;
     }
-public String getMachineId() {
+
+    public String getMachineId() {
         return machineId;
     }
-public void setMachineId(String machineId) {
+
+    public void setMachineId(String machineId) {
         this.machineId = machineId;
     }
-public String getOrderId() {
+
+    public String getOrderId() {
         return orderId;
     }
-public void setOrderId(String orderId) {
+
+    public void setOrderId(String orderId) {
         this.orderId = orderId;
     }
-public String getPaId() {
+
+    public String getPaId() {
         return paId;
     }
-public void setPaId(String paId) {
+
+    public void setPaId(String paId) {
         this.paId = paId;
     }
-public String getCarNum() {
+
+    public String getCarNum() {
         return carNum;
     }
-public void setCarNum(String carNum) {
+
+    public void setCarNum(String carNum) {
         this.carNum = carNum;
     }
-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 getCommunityId() {
+
+    public String getCommunityId() {
         return communityId;
     }
-public void setCommunityId(String communityId) {
+
+    public void setCommunityId(String communityId) {
         this.communityId = communityId;
     }
-public String getCarOutId() {
+
+    public String getCarOutId() {
         return carOutId;
     }
-public void setCarOutId(String carOutId) {
+
+    public void setCarOutId(String carOutId) {
         this.carOutId = carOutId;
     }
-public String getMachineName() {
+
+    public String getMachineName() {
         return machineName;
     }
-public void setMachineName(String machineName) {
+
+    public void setMachineName(String machineName) {
         this.machineName = machineName;
     }
 
 
-
 }

+ 4 - 0
java110-db/src/main/resources/mapper/acct/ParkingCouponShopV1ServiceDaoImplMapper.xml

@@ -29,6 +29,10 @@
         <if test="quantity !=null and quantity != ''">
             and t.quantity= #{quantity}
         </if>
+
+        <if test="hasQuantity !=null and hasQuantity != ''">
+            and t.quantity &gt;>0
+        </if>
         <if test="paName !=null and paName != ''">
             and t.pa_name= #{paName}
         </if>

Разлика између датотеке није приказан због своје велике величине
+ 295 - 0
java110-utils/src/main/java/com/java110/utils/util/TeldUtil.java


+ 183 - 0
service-acct/src/main/java/com/java110/acct/cmd/parkingCoupon/TeldSendParkingCouponCarCmd.java

@@ -0,0 +1,183 @@
+package com.java110.acct.cmd.parkingCoupon;
+
+import com.alibaba.fastjson.JSONObject;
+import com.java110.core.annotation.Java110Cmd;
+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.parking.ParkingCouponCarDto;
+import com.java110.dto.parking.ParkingCouponShopDto;
+import com.java110.dto.shop.ShopDto;
+import com.java110.dto.shop.StoreShopDto;
+import com.java110.dto.store.StoreUserDto;
+import com.java110.intf.acct.IParkingCouponCarV1InnerServiceSMO;
+import com.java110.intf.acct.IParkingCouponShopV1InnerServiceSMO;
+import com.java110.intf.mall.IShopInnerServiceSMO;
+import com.java110.intf.shore.IShoreShopV1InnerServiceSMO;
+import com.java110.intf.store.IStoreShopCommunityV1InnerServiceSMO;
+import com.java110.intf.store.IStoreShopV1InnerServiceSMO;
+import com.java110.intf.store.IStoreUserV1InnerServiceSMO;
+import com.java110.po.parking.ParkingCouponCarPo;
+import com.java110.po.parking.ParkingCouponShopPo;
+import com.java110.utils.cache.MappingCache;
+import com.java110.utils.exception.CmdException;
+import com.java110.utils.lock.DistributedLock;
+import com.java110.utils.util.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+
+import java.text.ParseException;
+import java.util.List;
+
+/**
+ * 特来电同步车牌号给物业系统
+ */
+@Java110Cmd(serviceCode = "parkingCoupon.teldSendParkingCouponCar")
+public class TeldSendParkingCouponCarCmd extends Cmd {
+
+    @Autowired
+    private IStoreUserV1InnerServiceSMO storeUserV1InnerServiceSMOImpl;
+
+    @Autowired
+    private IStoreShopV1InnerServiceSMO storeShopV1InnerServiceSMOImpl;
+
+    @Autowired
+    private IParkingCouponShopV1InnerServiceSMO parkingCouponShopV1InnerServiceSMOImpl;
+
+    @Autowired
+    private IParkingCouponCarV1InnerServiceSMO parkingCouponCarV1InnerServiceSMOImpl;
+
+    public static final String CODE_PREFIX_ID = "10";
+
+    @Override
+    public void validate(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) throws CmdException, ParseException {
+        Assert.hasKeyAndValue(reqJson, "Data", "未包含加密报文");
+
+    }
+
+    @Override
+    public void doCmd(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) throws CmdException, ParseException {
+        String signKey = MappingCache.getValue("TELD_DOMAIN", "SIGN_KEY");
+        String aesKey = MappingCache.getValue("TELD_DOMAIN", "AES_KEY");
+        String aesIv = MappingCache.getValue("TELD_DOMAIN", "AES_IV");
+
+        String data = TeldUtil.Decrypt(reqJson.getString("Data"), aesKey, aesIv);
+
+        if (StringUtil.isEmpty(data)) {
+            throw new CmdException("未包含报文");
+        }
+
+        JSONObject dataObj = JSONObject.parseObject(data);
+
+        String StartChargeSeq = dataObj.getString("StartChargeSeq");
+        int ConfirmResult = 0;
+        int PlateAutResult = 1;
+        int PlateAutFailReason = 0;
+        try {
+            doSend(context, dataObj);
+        } catch (Exception e) {
+            e.printStackTrace();
+            ConfirmResult = 1;
+            PlateAutResult = 2;
+            PlateAutFailReason = 6;
+        }
+
+        JSONObject paramOut = new JSONObject();
+        paramOut.put("StartChargeSeq", StartChargeSeq);
+        paramOut.put("ConfirmResult", ConfirmResult);
+        paramOut.put("PlateAutResult", PlateAutResult);
+        paramOut.put("PlateAutFailReason", PlateAutFailReason);
+        String paramStr = "";
+        try {
+            paramStr = TeldUtil.generateSecurityParam(paramOut.toJSONString(), aesKey, aesIv, signKey, reqJson.getString("OperatorID"));
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        context.setResponseEntity(new ResponseEntity(paramStr, HttpStatus.OK));
+
+    }
+
+    private void doSend(ICmdDataFlowContext context, JSONObject dataObj) {
+        String userId = context.getReqHeaders().get("user-id");
+
+
+        StoreUserDto storeUserDto = new StoreUserDto();
+        storeUserDto.setUserId(userId);
+        List<StoreUserDto> storeUserDtos = storeUserV1InnerServiceSMOImpl.queryStoreUsers(storeUserDto);
+        Assert.listOnlyOne(storeUserDtos, "商户不存在");
+
+        StoreShopDto storeShopDto = new StoreShopDto();
+        storeUserDto.setStoreId(storeUserDtos.get(0).getStoreId());
+        List<ShopDto> storeShops = storeShopV1InnerServiceSMOImpl.queryStoreShops(storeShopDto);
+        if (storeShops == null || storeShops.size() < 1) {
+            Assert.listOnlyOne(storeUserDtos, "商户店铺不存在");
+        }
+
+        ParkingCouponShopDto parkingCouponShopDto = new ParkingCouponShopDto();
+        parkingCouponShopDto.setHasQuantity("Y");
+        parkingCouponShopDto.setShopId(storeShops.get(0).getShopId());
+        List<ParkingCouponShopDto> parkingCouponShopDtos = parkingCouponShopV1InnerServiceSMOImpl.queryParkingCouponShops(parkingCouponShopDto);
+
+        if (parkingCouponShopDtos == null || parkingCouponShopDtos.size() < 1) { //停车券已用完
+            throw new CmdException("停车券已用完");
+        }
+
+
+        String carNum = dataObj.getString("plateNum");
+
+        int quantity = 0;
+
+        int flag = 0;
+        String requestId = DistributedLock.getLockUUID();
+        String key = this.getClass().getSimpleName() + parkingCouponShopDtos.get(0).getCouponShopId();
+        try {
+            DistributedLock.waitGetDistributedLock(key, requestId);
+            parkingCouponShopDto = new ParkingCouponShopDto();
+            parkingCouponShopDto.setCouponShopId(parkingCouponShopDtos.get(0).getCouponShopId());
+            parkingCouponShopDto.setShopId(storeShops.get(0).getShopId());
+            parkingCouponShopDtos = parkingCouponShopV1InnerServiceSMOImpl.queryParkingCouponShops(parkingCouponShopDto);
+            quantity = Integer.parseInt(parkingCouponShopDtos.get(0).getQuantity());
+            if (quantity < 1) {
+                throw new CmdException("停车劵不足,请购买");
+            }
+            ParkingCouponShopPo parkingCouponShopPo = new ParkingCouponShopPo();
+            parkingCouponShopPo.setCouponShopId(parkingCouponShopDtos.get(0).getCouponShopId());
+            parkingCouponShopPo.setQuantity((quantity - 1) + "");
+            flag = parkingCouponShopV1InnerServiceSMOImpl.updateParkingCouponShop(parkingCouponShopPo);
+            if (flag < 1) {
+                throw new CmdException("优惠券递减失败");
+            }
+        } finally {
+            DistributedLock.releaseDistributedLock(requestId, key);
+        }
+
+        String StartChargeSeq = dataObj.getString("StartChargeSeq");
+        JSONObject remarkObj = new JSONObject();
+        remarkObj.put("StartChargeSeq", StartChargeSeq);
+
+        ParkingCouponCarPo parkingCouponCarPo = new ParkingCouponCarPo();
+        parkingCouponCarPo.setCarNum(carNum);
+        parkingCouponCarPo.setGiveWay("1001");
+        parkingCouponCarPo.setCouponShopId(parkingCouponShopDtos.get(0).getCouponShopId());
+        parkingCouponCarPo.setShopId(parkingCouponShopDtos.get(0).getShopId());
+        parkingCouponCarPo.setPccId(GenerateCodeFactory.getGeneratorId(CODE_PREFIX_ID));
+        parkingCouponCarPo.setCouponId(parkingCouponShopDtos.get(0).getCouponId());
+        parkingCouponCarPo.setCommunityId(parkingCouponShopDtos.get(0).getCommunityId());
+        parkingCouponCarPo.setStartTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A));
+        parkingCouponCarPo.setEndTime(DateUtil.getAddDayString(DateUtil.getCurrentDate(), DateUtil.DATE_FORMATE_STRING_A, 1));
+        parkingCouponCarPo.setPaId(parkingCouponShopDtos.get(0).getPaId());
+        parkingCouponCarPo.setState(ParkingCouponCarDto.STATE_WAIT);
+        parkingCouponCarPo.setTypeCd(parkingCouponShopDtos.get(0).getTypeCd());
+        parkingCouponCarPo.setValue(parkingCouponShopDtos.get(0).getValue());
+        parkingCouponCarPo.setRemark(remarkObj.toJSONString());
+
+        flag = parkingCouponCarV1InnerServiceSMOImpl.saveParkingCouponCar(parkingCouponCarPo);
+
+        if (flag < 1) {
+            throw new CmdException("保存数据失败");
+        }
+    }
+}

+ 8 - 0
service-acct/src/main/java/com/java110/acct/smo/impl/ParkingCouponCarOrderV1InnerServiceSMOImpl.java

@@ -17,8 +17,10 @@ package com.java110.acct.smo.impl;
 
 
 import com.java110.acct.dao.IParkingCouponCarOrderV1ServiceDao;
+import com.java110.dto.data.DatabusDataDto;
 import com.java110.intf.acct.IParkingCouponCarOrderV1InnerServiceSMO;
 import com.java110.dto.parking.ParkingCouponCarOrderDto;
+import com.java110.intf.job.IDataBusInnerServiceSMO;
 import com.java110.po.parking.ParkingCouponCarOrderPo;
 import com.java110.utils.util.BeanConvertUtil;
 import com.java110.core.base.smo.BaseServiceSMO;
@@ -43,10 +45,16 @@ public class ParkingCouponCarOrderV1InnerServiceSMOImpl extends BaseServiceSMO i
     @Autowired
     private IParkingCouponCarOrderV1ServiceDao parkingCouponCarOrderV1ServiceDaoImpl;
 
+    @Autowired
+    private IDataBusInnerServiceSMO dataBusInnerServiceSMOImpl;
+
 
     @Override
     public int saveParkingCouponCarOrder(@RequestBody  ParkingCouponCarOrderPo parkingCouponCarOrderPo) {
         int saveFlag = parkingCouponCarOrderV1ServiceDaoImpl.saveParkingCouponCarOrderInfo(BeanConvertUtil.beanCovertMap(parkingCouponCarOrderPo));
+
+        //todo 触发databus
+        dataBusInnerServiceSMOImpl.databusData(new DatabusDataDto(DatabusDataDto.BUSINESS_TYPE_SAVE_PARKING_COUPON_CAR_ORDER,BeanConvertUtil.beanCovertJson(parkingCouponCarOrderPo)));
         return saveFlag;
     }
 

+ 186 - 0
service-job/src/main/java/com/java110/job/adapt/car/SendParkingCouponCarOrderToTeldAdapt.java

@@ -0,0 +1,186 @@
+package com.java110.job.adapt.car;
+
+import com.alibaba.fastjson.JSONObject;
+import com.java110.core.client.RestTemplate;
+import com.java110.core.log.LoggerFactory;
+import com.java110.dto.machine.CarInoutDetailDto;
+import com.java110.dto.parking.ParkingAreaDto;
+import com.java110.dto.parking.ParkingCouponCarDto;
+import com.java110.dto.system.Business;
+import com.java110.intf.acct.IParkingCouponCarV1InnerServiceSMO;
+import com.java110.job.adapt.DatabusAdaptImpl;
+import com.java110.po.car.CarInoutDetailPo;
+import com.java110.po.parking.ParkingCouponCarOrderPo;
+import com.java110.utils.cache.CommonCache;
+import com.java110.utils.cache.MappingCache;
+import com.java110.utils.util.BeanConvertUtil;
+import com.java110.utils.util.DateUtil;
+import com.java110.utils.util.StringUtil;
+import com.java110.utils.util.TeldUtil;
+import org.slf4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Component;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.client.HttpStatusCodeException;
+
+import java.util.List;
+
+/**
+ * 特来电 2.7 推送车辆离场通知
+ * <p>
+ * databus 配置
+ * <p>
+ * 名称 车辆进出databus
+ * 业务类型 saveParkingCouponCarOrder
+ * 适配器 sendParkingCouponCarOrderToTeldAdapt
+ * 顺序 81
+ * 状态 在用
+ *
+ *
+ * mapping 中配置
+ *
+ *   String signKey = MappingCache.getValue("TELD_DOMAIN", "SIGN_KEY");
+ *   String aesKey = MappingCache.getValue("TELD_DOMAIN", "AES_KEY");
+ *   String aesIv = MappingCache.getValue("TELD_DOMAIN", "AES_IV");
+ *   String OperatorID = MappingCache.getValue("TELD_DOMAIN","Teld_OperatorID");
+ *   String OperatorSecret = MappingCache.getValue("TELD_DOMAIN","Teld_OperatorSecret");
+ */
+
+@Component(value = "sendParkingCouponCarOrderToTeldAdapt")
+public class SendParkingCouponCarOrderToTeldAdapt extends DatabusAdaptImpl {
+    private static Logger logger = LoggerFactory.getLogger(SendParkingCouponCarOrderToTeldAdapt.class);
+
+    @Autowired
+    private IParkingCouponCarV1InnerServiceSMO parkingCouponCarV1InnerServiceSMOImpl;
+
+    private static final String query_token = "http://hlht.teld.cc:7777/evcs/v20161110/query_token";
+
+    private static final String notify_url = "http://hlht.teld.cc:7777/evcs/v20161110/notification_park_order_consumed";
+
+
+    @Autowired
+    private RestTemplate outRestTemplate;
+
+    @Override
+    public void execute(Business business, List<Business> businesses) {
+        JSONObject data = business.getData();
+
+        //todo 获取到 参数信息
+        ParkingCouponCarOrderPo parkingCouponCarOrderPo = BeanConvertUtil.covertBean(data, ParkingCouponCarOrderPo.class);
+
+
+        ParkingCouponCarDto parkingCouponCarDto = new ParkingCouponCarDto();
+        parkingCouponCarDto.setPccId(parkingCouponCarOrderPo.getPccId());
+        List<ParkingCouponCarDto> parkingCouponCarDtos = parkingCouponCarV1InnerServiceSMOImpl.queryParkingCouponCars(parkingCouponCarDto);
+
+        if (parkingCouponCarDtos == null || parkingCouponCarDtos.size() < 1) {
+            return;
+        }
+
+        String remark = parkingCouponCarDtos.get(0).getRemark();
+        if (!StringUtil.isJsonObject(remark)) {
+            return;
+        }
+
+        JSONObject remarkObj = JSONObject.parseObject(remark);
+        String StartChargeSeq = remarkObj.getString("StartChargeSeq");
+
+        try {
+            String token = getAccessToken();
+            notification_park_order_consumed(token, StartChargeSeq, parkingCouponCarDtos.get(0).getCarNum());
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+
+    }
+
+    /**
+     * 通知 数据
+     *
+     * @param token
+     * @param startChargeSeq
+     * @param carNum
+     */
+    private void notification_park_order_consumed(String token, String startChargeSeq, String carNum) throws Exception {
+
+        JSONObject paramIn = new JSONObject();
+        paramIn.put("StartChargeSeq", startChargeSeq);
+        paramIn.put("PlateNum", carNum);
+        paramIn.put("LeavingTime", DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A));
+        paramIn.put("CalculationMethod", 3);
+
+        String signKey = MappingCache.getValue("TELD_DOMAIN", "SIGN_KEY");
+        String aesKey = MappingCache.getValue("TELD_DOMAIN", "AES_KEY");
+        String aesIv = MappingCache.getValue("TELD_DOMAIN", "AES_IV");
+        String OperatorID = MappingCache.getValue("TELD_DOMAIN","Teld_OperatorID");
+
+        String param = TeldUtil.generateSecurityParam(paramIn.toJSONString(), aesKey, aesIv, signKey, OperatorID);
+
+        logger.debug("请求报文:{}", paramIn);
+        HttpHeaders httpHeaders = new HttpHeaders();
+        httpHeaders.add("Content-Type", "application/json;charset=UTF-8");
+        httpHeaders.add("Authorization", "Bearer " + token);
+
+        HttpEntity<MultiValueMap<String, Object>> httpEntity = new HttpEntity(param, httpHeaders);
+        try {
+            ResponseEntity<String> responseEntity = outRestTemplate.exchange(notify_url, HttpMethod.POST, httpEntity, String.class);
+            logger.debug("返回报文,{}", responseEntity);
+            String body = responseEntity.getBody();
+            JSONObject paramOut = JSONObject.parseObject(body);
+            String data = TeldUtil.Decrypt(paramOut.getString("Data"), aesKey, aesIv);
+            JSONObject dataObj = JSONObject.parseObject(data);
+            token = dataObj.getString("AccessToken");
+            CommonCache.setValue("Teld_Parking_token", token, CommonCache.TOKEN_EXPIRE_TIME);
+        } catch (HttpStatusCodeException e) {
+            logger.error("调用异常", e);
+        } catch (Exception e) {
+            logger.error("调用异常", e);
+        }
+    }
+
+    public String getAccessToken() throws Exception {
+
+        String token = CommonCache.getValue("Teld_Parking_token");
+
+        if (!StringUtil.isEmpty(token)) {
+            return token;
+        }
+        String signKey = MappingCache.getValue("TELD_DOMAIN", "SIGN_KEY");
+        String aesKey = MappingCache.getValue("TELD_DOMAIN", "AES_KEY");
+        String aesIv = MappingCache.getValue("TELD_DOMAIN", "AES_IV");
+        String OperatorID = MappingCache.getValue("TELD_DOMAIN","Teld_OperatorID");
+        String OperatorSecret = MappingCache.getValue("TELD_DOMAIN","Teld_OperatorSecret");
+
+        JSONObject paramIn = new JSONObject();
+        paramIn.put("OperatorID", OperatorID);
+        paramIn.put("OperatorSecret", OperatorSecret);
+        String param = TeldUtil.generateSecurityParam(paramIn.toJSONString(), aesKey, aesIv, signKey, OperatorID);
+
+
+        logger.debug("请求报文:{}", paramIn);
+        HttpHeaders httpHeaders = new HttpHeaders();
+        httpHeaders.add("Content-Type", "application/json;charset=UTF-8");
+        HttpEntity<MultiValueMap<String, Object>> httpEntity = new HttpEntity(param, httpHeaders);
+        try {
+            ResponseEntity<String> responseEntity = outRestTemplate.exchange(query_token, HttpMethod.POST, httpEntity, String.class);
+            logger.debug("返回报文,{}", responseEntity);
+            String body = responseEntity.getBody();
+            JSONObject paramOut = JSONObject.parseObject(body);
+            String data = TeldUtil.Decrypt(paramOut.getString("Data"), aesKey, aesIv);
+            JSONObject dataObj = JSONObject.parseObject(data);
+            token = dataObj.getString("AccessToken");
+            CommonCache.setValue("Teld_Parking_token", token, CommonCache.TOKEN_EXPIRE_TIME);
+        } catch (HttpStatusCodeException e) {
+            logger.error("调用异常", e);
+        } catch (Exception e) {
+            logger.error("调用异常", e);
+        }
+
+        return token;
+    }
+}

+ 140 - 0
service-user/src/main/java/com/java110/user/cmd/login/GetTokenForTeldCmd.java

@@ -0,0 +1,140 @@
+package com.java110.user.cmd.login;
+
+import com.alibaba.fastjson.JSONObject;
+import com.java110.core.annotation.Java110Cmd;
+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.AuthenticationFactory;
+import com.java110.doc.annotation.*;
+import com.java110.dto.user.UserDto;
+import com.java110.intf.user.IUserV1InnerServiceSMO;
+import com.java110.utils.cache.MappingCache;
+import com.java110.utils.constant.CommonConstant;
+import com.java110.utils.exception.CmdException;
+import com.java110.utils.util.Assert;
+import com.java110.utils.util.DateUtil;
+import com.java110.utils.util.StringUtil;
+import com.java110.utils.util.TeldUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+
+import java.text.ParseException;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Java110CmdDoc(title = "特来电获取token",
+        description = "主要用于 特来电平台使用,<br/>" +
+                "请求其他接口时 头信息中需要加 Authorization: Bearer token ,<br/>" +
+                "token 是这个接口返回的内容<br/> " +
+                "会话保持为2小时,请快要到2小时时,再次登录,保持会话</br>",
+        httpMethod = "post",
+        url = "http://{ip}:{port}/app/ext/login.getTokenForTeld/{appId}",
+        resource = "userDoc",
+        author = "吴学文",
+        serviceCode = "login.getTokenForTeld",
+        seq = 1
+)
+
+@Java110ParamsDoc(
+        headers = {
+                @Java110HeaderDoc(name = "Content-Type", defaultValue = "application/json", description = "application/json"),
+        },
+        params = {
+                @Java110ParamDoc(name = "OperatorID", length = 30, remark = "调用方的组织机构代码"),
+                @Java110ParamDoc(name = "OperatorSecret", length = 30, remark = "服务方分配的唯一识别密钥"),
+        })
+
+@Java110ResponseDoc(
+        params = {
+                @Java110ParamDoc(name = "Ret", type = "int", length = 11, defaultValue = "0", remark = "返回编号,0 成功 其他失败"),
+                @Java110ParamDoc(name = "Msg", type = "int", length = 11, defaultValue = "0", remark = "返回编号,0 成功 其他失败"),
+                @Java110ParamDoc(name = "Data", type = "Object", remark = "有效数据"),
+                @Java110ParamDoc(parentNodeName = "data", name = "TokenAvailableTime", type = "int", remark = "有效期"),
+                @Java110ParamDoc(parentNodeName = "data", name = "AccessToken", type = "String", remark = "临时票据"),
+        }
+)
+
+@Java110ExampleDoc(
+        reqBody = "{\n" +
+                "  \"OperatorID\": \"123456789\",\n" +
+                "  \"Data\": \"mYvffpNoFf4E/ZTC1tOw41TC5OlkEobfAYCm5N8hEusaLUaUIqOrXtdbMrSck0DSmfM7mRuOGMoCQzH0nWPGuw==\",\n" +
+                "  \"TimeStamp\": \"20180120165755\",\n" +
+                "  \"Seq\": \"0001\",\n" +
+                "  \"Sig\": \"D2D584A14F3F284445DF85D0E8C0697C\"\n" +
+                "}",
+        resBody = "{\n" +
+                "    \"Ret\": 0,\n" +
+                "    \"Msg\": \"\",\n" +
+                "    \"Data\": \"uxeKP0ezR5yL8xSg4/ZCDh/N91/u86NXFxd2DrwZVW8zCPYcpl59Twz/yQZ3RaO4rDDrGmkvQignmNEJ+k4PGxdmIC+4fpJ8rU6osSobY+AeA0uueuQ5+eQiWBL6p6v5XMMm91brtK8yfFELYUWQzVcxABnAwK/+dyxtUhqLIxUpkwTEU/4ktN40df9IzzlLO5uvUknPGYu9yL0pp5w9vdRxmA1RiiTDNCysz6klr9bunGV3VJa2qpLcgeZMf/oG\",\n" +
+                "    \"Sig\": \"58E52010C7DEE87FE183B0AFA5B2BE30\"\n" +
+                "}"
+)
+@Java110Cmd(serviceCode = "login.getTokenForTeld")
+public class GetTokenForTeldCmd extends Cmd {
+
+
+    public static String OPERATOR_SECRET = "1234567890abcdef"; //
+
+    //
+    public static String OPERATOR_ID = "123456789"; //9位组织机构代码
+    //	// open平台地址
+    public static String URL = "http://hlht.telaidian.com.cn:9501/evcs/v20161110/";
+
+    @Autowired
+    private IUserV1InnerServiceSMO userV1InnerServiceSMOImpl;
+
+    @Override
+    public void validate(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) throws CmdException, ParseException {
+
+        Assert.hasKeyAndValue(reqJson, "Data", "未包含加密报文");
+
+    }
+
+    @Override
+    public void doCmd(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) throws CmdException, ParseException {
+
+        String signKey = MappingCache.getValue("TELD_DOMAIN","SIGN_KEY");
+        String aesKey = MappingCache.getValue("TELD_DOMAIN","AES_KEY");
+        String aesIv = MappingCache.getValue("TELD_DOMAIN","AES_IV");
+
+        String data = TeldUtil.Decrypt(reqJson.getString("Data"), aesKey, aesIv);
+
+        if (StringUtil.isEmpty(data)) {
+            throw new CmdException("未包含报文");
+        }
+
+        JSONObject dataObj = JSONObject.parseObject(data);
+
+
+        UserDto userDto = new UserDto();
+        userDto.setTel(dataObj.getString("OperatorID"));
+        userDto.setPassword(AuthenticationFactory.md5UserPassword(dataObj.getString("OperatorSecret")));
+        List<UserDto> userDtos = userV1InnerServiceSMOImpl.queryUsers(userDto);
+
+        Assert.listOnlyOne(userDtos, "用户不存在");
+
+        Map userMap = new HashMap();
+        userMap.put(CommonConstant.LOGIN_USER_ID, userDtos.get(0).getUserId());
+        userMap.put(CommonConstant.LOGIN_USER_NAME, userDtos.get(0).getUserName());
+        String paramOut = "";
+        try {
+            String token = AuthenticationFactory.createAndSaveToken(userMap);
+            JSONObject param = new JSONObject();
+            param.put("OperatorID", dataObj.getString("OperatorID"));
+            param.put("SuccStat", 0);
+            param.put("AccessToken", token);
+            param.put("TokenAvailableTime", 7200);
+            param.put("FailReason", 0);
+            paramOut = TeldUtil.generateSecurityParam(param.toJSONString(), aesKey, aesIv, signKey, dataObj.getString("OperatorID"));
+            context.setResponseEntity(new ResponseEntity(paramOut, HttpStatus.OK));
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+
+}

+ 3 - 3
springboot/src/main/java/com/java110/boot/controller/app/AppController.java

@@ -343,12 +343,12 @@ public class AppController extends BaseController {
      * @return http status 200 成功 其他失败
      */
 
-    @RequestMapping(path = "/ext/{serviceCode}/{appId}", method = RequestMethod.POST)
+    @RequestMapping(path = "/ext/{serviceCode}/{appId}/{communityId}", method = RequestMethod.POST)
     @Java110Lang
     public ResponseEntity<String> extPost(
             @PathVariable String serviceCode,
             @PathVariable String appId,
-
+            @RequestBody String postInfo,
             HttpServletRequest request) {
         ResponseEntity<String> responseEntity = null;
         Map<String, String> headers = new HashMap<String, String>();
@@ -364,7 +364,7 @@ public class AppController extends BaseController {
             logger.debug("api:{} 请求报文为:{},header信息为:{}", "", headers);
             IPageData pd = (IPageData) request.getAttribute(CommonConstant.CONTEXT_PAGE_DATA);
             privilegeSMOImpl.hasPrivilege(restTemplate, pd, "/app/" + serviceCode);
-            responseEntity = apiSMOImpl.doApi(JSONObject.toJSONString(getParameterStringMap(request)), headers, request);
+            responseEntity = apiSMOImpl.doApi(postInfo, headers, request);
         } catch (Throwable e) {
             logger.error("请求get 方法[" + serviceCode + "]失败:", e);
             responseEntity = ResultVo.error("请求发生异常," + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);