package com.simple.controller; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.simple.common.ErrorCode; import com.simple.common.Result; import com.simple.common.ResultData; import com.simple.domain.po.*; import com.simple.enums.EnumCarVendor; import com.simple.service.WxCUserCarService; import com.simple.service.WxCarCmdLogsService; import com.simple.service.WxMerchantService; import com.simple.service.WxParkService; import com.simple.utils.ETCPUtil; import com.simple.utils.TJDCarUtil; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; @RestController @RequestMapping("/api/car") public class WxCarController extends BaseController { private Logger logger = Logger.getLogger(WxCarController.class); ETCPUtil etcp = new ETCPUtil(); TJDCarUtil tjd = new TJDCarUtil(); @Autowired WxParkService wxParkService; @Autowired WxCUserCarService wxCUserCarService; @Autowired WxMerchantService wxMerchantService; private WxPark getCurrentPark(WxCUser user) { WxPark wxPark = wxParkService.getByTenantId(user.getTenantId()); // 1, get mall's park // future use redis to optimize return wxPark; } @ApiOperation(value = "获取车场支持的厂家",notes="") @GetMapping("/getVendor") public ResultData getVendor() { WxCUser user = getUser(); // 1, get mall's park WxPark park = getCurrentPark(user); Map map = new HashMap(); map.put("vendor", park.getVendorType()); return new ResultData(map); } /** * 初始化/etcp共同登录 * @param paramMap * @return */ @ApiOperation(value = "初始化/etcp共同登录",notes="{\"phone\":\"string\"}") @PostMapping("/init") public ResultData init(Map paramMap) { WxCUser user = getUser(); // 1, get mall's park WxPark park = getCurrentPark(user); // 2. get vendor params if (park.getVendorType() == EnumCarVendor.CAR_ETCP.getCode()) { String phone = paramMap.get("phone"); if (StringUtils.isBlank(phone)) { logger.error("手机号为空"); return new ResultData(ErrorCode.PARAMETER_NOT_NULL.getCode(), "phone为空"); } String params = park.getVendorParams(); JSONObject objParams = JSON.parseObject(params); String url = objParams.getString("url"); String appId = objParams.getString("appId"); String merchantNo = objParams.getString("merchantNo"); String merchantKey = objParams.getString("merchantKey"); String version = objParams.getString("version"); String ret = etcp.userSignin(url, appId, merchantNo, merchantKey, version, phone); JSONObject retObj = JSON.parseObject(ret); if (retObj.getIntValue("code") == 0) { // 获取绑定的车牌 JSONObject dataObj = retObj.getJSONObject("data"); String etcpToken = dataObj.getString("token"); JSONObject dataObj1 = syncCarNumbers(user.getId(), user.getTenantId(), park.getVendorType(), url, merchantNo, merchantKey, version, etcpToken); // c端必须保存此token return new ResultData(dataObj1); } else { logger.error("共同登录失败: "+phone); return new ResultData(ErrorCode.ETCP_LOGIN_FAIL.getCode(), "共同登录失败"); } } else if (park.getVendorType() == EnumCarVendor.CAR_TJD.getCode()){ // TJD不需要共同登录 return new ResultData(); } return new ResultData(ErrorCode.CAR_VENDOR_NOT_SUPPORT.getCode(), "登录失败"); } private JSONObject syncCarNumbers(Long cUserId, String tenantId, int iVendorType, String url, String merchantNo, String merchantKey, String version, String etcpToken) { String ret; JSONObject retObj; ret = etcp.carNum(url, merchantNo, merchantKey, version, etcpToken); /*{"code": 0,"msg": "ok","data": {"number": 3,"carList": ["晋 BMZ105","云 C12345"]}} */ retObj = JSON.parseObject(ret); JSONObject dataObj1 = retObj.getJSONObject("data"); dataObj1.put("vendor", iVendorType); JSONArray arr = dataObj1.getJSONArray("carList"); WxCUserCar queryUserCar = new WxCUserCar(); queryUserCar.setCUserId(cUserId); List uclist = wxCUserCarService.getList(queryUserCar); // 删除ETCP不存在 for(WxCUserCar userCar: uclist) { boolean bExist = isExistInArray(arr, userCar.getCarNumber()); if (!bExist) { wxCUserCarService.deleteById(userCar.getId()); uclist.remove(userCar); } } // 添加ETCP的 for(int i=0;i list, String carNumber) { boolean bExist = false; for(WxCUserCar userCar: list) { if(carNumber.equals(userCar.getCarNumber())) { bExist = true; break; } } return bExist; } /** * 绑车牌 * @param paramMap * @return */ @ApiOperation(value = "绑车牌", notes = "ETCP:={\"etcpToken\":\"string\",\"carNumber\":\"string\"}\n" + "TJD:={\"carNumber\":\"string\",\"carNumColor\":\"string\",\"outCarId\":\"string\"}\n返回\n" + "{\n" + " \"timestamp\": \"1464235239561\",\n" + " \"returnCode\": \"T\",\n" + " \"errorMsg\": \"\",\n" + " \"returnMsg\": \"OK\",\n" + " \"isSuccess\": \"0\",\n" + " \"carId\": \"5836b8b52ada463ebc6199579f029561\"\n" + "}\n") @PostMapping("/bindCar") public ResultData bindCar(Map paramMap) { WxCUser user = getUser(); // 1, get mall's park WxPark park = getCurrentPark(user); // 2. get vendor params if (park.getVendorType() == EnumCarVendor.CAR_ETCP.getCode()) { String etcpToken = paramMap.get("etcpToken"); if (StringUtils.isBlank(etcpToken)) { logger.error("etcpToken为空"); return new ResultData(ErrorCode.PARAMETER_NOT_NULL.getCode(), "etcpToken为空"); } String carNumber = paramMap.get("carNumber"); if (StringUtils.isBlank(carNumber)) { logger.error("carNumber为空"); return new ResultData(ErrorCode.PARAMETER_NOT_NULL.getCode(), "carNumber为空"); } String params = park.getVendorParams(); JSONObject objParams = JSON.parseObject(params); String url = objParams.getString("url"); String merchantNo = objParams.getString("merchantNo"); String merchantKey = objParams.getString("merchantKey"); String version = objParams.getString("version"); String ret = etcp.bindCar(url, merchantNo, merchantKey, version, etcpToken, carNumber, null); JSONObject retObj = JSON.parseObject(ret); if (retObj.getIntValue("code") == 0) { // 插入车牌 Date curr = new Date(); WxCUserCar userCar = new WxCUserCar(); userCar.setCUserId(user.getId()); userCar.setTenantId(user.getTenantId()); userCar.setCarNumber(carNumber); userCar.setVendorType(EnumCarVendor.CAR_ETCP.getCode()); userCar.setCreateDate(curr); userCar.setUpdateDate(curr); wxCUserCarService.saveOrUpdate(userCar); JSONObject dataObj = retObj.getJSONObject("data"); dataObj.put("vendor", park.getVendorType()); return new ResultData(dataObj); } else { logger.error("绑车牌失败: " + carNumber); return new ResultData(ErrorCode.ETCP_BIND_FAIL.getCode(), "绑车牌失败"); } } else if (park.getVendorType() == EnumCarVendor.CAR_TJD.getCode()) { String carNumber = paramMap.get("carNumber"); if (StringUtils.isBlank(carNumber)) { logger.error("carNumber为空"); return new ResultData(ErrorCode.PARAMETER_NOT_NULL.getCode(), "carNumber为空"); } String carNumColor = paramMap.get("carNumColor"); if (StringUtils.isBlank(carNumColor)) { logger.error("carNumColor为空"); return new ResultData(ErrorCode.PARAMETER_NOT_NULL.getCode(), "carNumColor为空"); } String outCarId = paramMap.get("outCarId"); if (StringUtils.isBlank(outCarId)) { logger.error("outCarId为空"); return new ResultData(ErrorCode.PARAMETER_NOT_NULL.getCode(), "outCarId为空"); } String params = park.getVendorParams(); JSONObject objParams = JSON.parseObject(params); String url = objParams.getString("url"); String partner = objParams.getString("partner"); String key = objParams.getString("key"); String version = objParams.getString("version"); String ret = tjd.registerCar(url, partner, key, version, carNumber, carNumColor, null, outCarId); JSONObject retObj = JSON.parseObject(ret); retObj.put("vendor", park.getVendorType()); if (retObj.getString("returnCode") == "T") { String carId = retObj.getString("carId"); // 插入车牌 Date curr = new Date(); WxCUserCar userCar = new WxCUserCar(); userCar.setCUserId(user.getId()); userCar.setTenantId(user.getTenantId()); userCar.setCarNumber(carNumber); userCar.setVendorType(EnumCarVendor.CAR_TJD.getCode()); JSONObject jo = new JSONObject(); jo.put("carId", carId); userCar.setVendorParams(JSON.toJSONString(jo)); userCar.setCreateDate(curr); userCar.setUpdateDate(curr); wxCUserCarService.saveOrUpdate(userCar); return new ResultData(retObj); } else { return new ResultData(ErrorCode.TJD_BIND_FAIL.getCode(), "绑车牌失败", retObj); } } return new ResultData(ErrorCode.CAR_VENDOR_NOT_SUPPORT.getCode(), "绑车牌失败"); } /** * 解绑车牌 * @param paramMap * @return */ @ApiOperation(value = "解绑车牌", notes = "ETCP:={\"etcpToken\":\"string\",\"carNumber\":\"string\"}\n返回:\n" + "{\n" + " \"code\": 0,\n" + " \"message\": \"ok\"" + "}" + "TJD:={\"carNumber\":\"string\",\"carNumColor\":\"string\",\"outCarId\":\"string\"}\n返回:\n" + "{\n" + " \"timestamp\": \"1464235239561\",\n" + " \"returnCode\": \"T\",\n" + " \"errorMsg\": \"\",\n" + " \"returnMsg\": \"OK\",\n" + " \"isSuccess\": \"0\",\n" + "}\n") @PostMapping("/unbindCar") public ResultData unbindCar(Map paramMap) { WxCUser user = getUser(); // 1, get mall's park WxPark park = getCurrentPark(user); if (park.getVendorType() == EnumCarVendor.CAR_ETCP.getCode()) { String etcpToken = paramMap.get("etcpToken"); if (StringUtils.isBlank(etcpToken)) { logger.error("etcpToken为空"); return new ResultData(ErrorCode.PARAMETER_NOT_NULL.getCode(), "etcpToken为空"); } String carNumber = paramMap.get("carNumber"); if (StringUtils.isBlank(carNumber)) { logger.error("carNumber为空"); return new ResultData(ErrorCode.PARAMETER_NOT_NULL.getCode(), "carNumber为空"); } String params = park.getVendorParams(); JSONObject objParams = JSON.parseObject(params); String url = objParams.getString("url"); String merchantNo = objParams.getString("merchantNo"); String merchantKey = objParams.getString("merchantKey"); String version = objParams.getString("version"); String ret = etcp.unbindCar(url, merchantNo, merchantKey, version, etcpToken, carNumber); JSONObject retObj = JSON.parseObject(ret); if (retObj.getIntValue("code") == 0) { WxCUserCar userCar = new WxCUserCar(); userCar.setCUserId(user.getId()); userCar.setTenantId(user.getTenantId()); userCar.setCarNumber(carNumber); wxCUserCarService.deleteByObj(userCar); return new ResultData(); } else { logger.error("解绑车牌失败"); return new ResultData(ErrorCode.ETCP_UNBIND_FAIL.getCode(), "解绑车牌失败"); } } else if (park.getVendorType() == EnumCarVendor.CAR_TJD.getCode()) { String carNumber = paramMap.get("carNumber"); if (StringUtils.isBlank(carNumber)) { return new ResultData(ErrorCode.PARAMETER_NOT_NULL.getCode(), "carNumber为空"); } WxCUserCar queryOne = new WxCUserCar(); queryOne.setCarNumber(carNumber); queryOne.setTenantId(user.getTenantId()); queryOne.setCUserId(user.getId()); WxCUserCar userCar = wxCUserCarService.getOne(queryOne); if (userCar != null) { String params = userCar.getVendorParams(); JSONObject objParams = JSON.parseObject(params); String carId = objParams.getString("carId"); params = park.getVendorParams(); String url = objParams.getString("url"); String partner = objParams.getString("partner"); String key = objParams.getString("key"); String version = objParams.getString("version"); String ret = tjd.writeOffCar(url, partner, key, version, carId); JSONObject retObj = JSON.parseObject(ret); if (retObj.getString("returnCode") == "T") { wxCUserCarService.deleteByObj(userCar); return new ResultData(); } else { return new ResultData(ErrorCode.TJD_UNBIND_FAIL, "解绑车牌失败"); } } } return new ResultData(ErrorCode.CAR_VENDOR_NOT_SUPPORT.getCode(), "解绑车牌失败"); } /** * 停车费 * @param paramMap * @return */ @ApiOperation(value = "停车费", notes = "ETCP:={\"etcpToken\":\"string\",\"carNumber\":\"string\"}\n输出\n{\n" + " \"carNumber\": \"渝****87\",\n" + " \"entranceTime\": \"2017-06-11 11:19:27\",\n" + " \"exitTime\": \"2017-06-11 11:59:47\",\n" + " \"orderId\": \"B9466E26-7420-4BDF-958D-E90106AB5F20\", \"parkingFee\": 2.00,\n" + " \"remainingServiceFee\": 0,\n" + " \"payedServiceFee\": 0,\n" + " \"remainingParkFee\": 2.00,\n" + " \"discountAmount\": 0,\n" + " \"parkingId\": 3126,\n" + " \"parkingName\": \"ETCP 停车场\",\n" + " \"remainingFee\": 2.00,\n" + " \"paidFee\": 0,\n" + " \"verificationInfo\": \"FSED9JvxgAU6XJUd8YRF5YH/LpfQYzCAfcPbAOKPV3BjKSatbgIsh7EBH2JBiRoGBe3btr gzKRMTfIoFuCn1XX7HUsJYlb7JSCBArnNmEVU4JuDLLjzoqB7qhQ8KnP16\"\n" + " }" + "TJD:={\"carNumber\":\"string\",\"carNumColor\":\"string\",\"outCarId\":\"string\"}\n输出\n{\n" + " \"inDt\": \"20160526112000\",\n" + " \"timestamp\": \"1464235239561\",\n" + " \"returnCode\": \"T\",\n" + " \"errorMsg\": \"\",\n" + " \"tradeId\": \"d49aeaedcf144f1faf569846d6b1667e\",\n" + " \"parkTime\": \"2439593\",\n" + " \"returnMsg\": \"OK\",\n" + " \"totalAmount\": \"0.03\",\n" + " \"isSuccess\": \"0\",\n" + " \"unPayAmount\": \"0.03\",\n" + " \"paidAmount\": \"0.00\",\n" + " \"freeThroughTime\": \"15\",\n" + " \"outDt\": \"20170321121212\",\n" + " \"payUrl\": \"http://prep.tingjiandan.com/tcweixin/letter/prePay/payInPark.html?\n" + " prePayType=16&channel=10001\",\n" + " \"accountId\": \"d49aeaedcf144f1faf569846d6b16671\",\n" + " \"freeMinsAmount\": \"0.00\",\n" + " \"pmParkId\": \"d49aeaedcf144f1faf569846d6b16670\"\n" + " }") @PostMapping("/getCarStopFee") public ResultData getCarStopFee(Map paramMap) { WxCUser user = getUser(); // 1, get mall's park WxPark park = getCurrentPark(user); if (park.getVendorType() == EnumCarVendor.CAR_ETCP.getCode()) { String etcpToken = paramMap.get("etcpToken"); String carNumber = paramMap.get("carNumber"); if (StringUtils.isBlank(etcpToken)) { return new ResultData(ErrorCode.PARAMETER_NOT_NULL.getCode(), "etcpToken为空"); } if (StringUtils.isBlank(carNumber)) { return new ResultData(ErrorCode.PARAMETER_NOT_NULL.getCode(), "carNumber为空"); } String params = park.getVendorParams(); JSONObject objParams = JSON.parseObject(params); String url = objParams.getString("url"); String appId = objParams.getString("appId"); String merchantNo = objParams.getString("merchantNo"); String merchantKey = objParams.getString("merchantKey"); String version = objParams.getString("version"); String ret = etcp.orderUnpay(url, appId, merchantNo, merchantKey, version, etcpToken, carNumber); JSONObject retObj = JSON.parseObject(ret); if (retObj.getIntValue("code") == 0) { JSONObject feeObj = retObj.getJSONArray("data").getJSONObject(0); feeObj.put("vendor", park.getVendorType()); return new ResultData(Result.SUCCESS, "停车费获取成功", feeObj); } else { return new ResultData(ErrorCode.ETCP_STOP_FEE_FAIL.getCode(), "停车费获取失败"); } } else if (park.getVendorType() == EnumCarVendor.CAR_TJD.getCode()) { String carNumber = paramMap.get("carNumber"); if (StringUtils.isBlank(carNumber)) { return new ResultData(ErrorCode.PARAMETER_NOT_NULL.getCode(), "carNumber为空"); } String params = park.getVendorParams(); JSONObject objParams = JSON.parseObject(params); String url = objParams.getString("url"); String partner = objParams.getString("partner"); String key = objParams.getString("key"); String version = objParams.getString("version"); String ret = tjd.infoForFreeMins(url, partner, key, version, carNumber); JSONObject retObj = JSON.parseObject(ret); if (retObj.getString("returnCode") == "T") { return new ResultData(retObj); } else { return new ResultData(ErrorCode.TJD_STOP_FEE_FAIL.getCode(), "停车费获取失败"); } } return new ResultData(ErrorCode.CAR_VENDOR_NOT_SUPPORT.getCode(), "停车费获取失败"); } /** * 停车费抵扣 * */ @ApiOperation(value = "停车费抵扣", notes = "{\"tradeId\":\"string\",\"deductionAmount\":\"string\",\"accountId\":\"string\",\"orderId\":\"string\"}\nresult\n{\n" + " \"timestamp\": \"1464235239561\",\n" + " \"returnCode\": \"T\",\n" + " \"errorMsg\": \"\",\n" + " \"returnMsg\": \"OK\",\n" + " \"isSuccess\": \"0\",\n" + " \"carId\": \"5836b8b52ada463ebc6199579f029561\"\n" + " }") @PostMapping("/deductionFee") public ResultData deductionFee(Map paramMap) { WxCUser user = getUser(); /// 1, get mall's park WxPark park = getCurrentPark(user); if (park.getVendorType() == EnumCarVendor.CAR_TJD.getCode()) { String tradeId = paramMap.get("tradeId"); String deductionAmount = paramMap.get("deductionAmount"); String accountId = paramMap.get("accountId"); String outTradeNo = paramMap.get("orderId"); if (StringUtils.isBlank(tradeId)) { return new ResultData(ErrorCode.PARAMETER_NOT_NULL.getCode(), "tradeId为空"); } if (StringUtils.isBlank(deductionAmount)) { return new ResultData(ErrorCode.PARAMETER_NOT_NULL.getCode(), "deductionAmount为空"); } if (StringUtils.isBlank(accountId)) { return new ResultData(ErrorCode.PARAMETER_NOT_NULL.getCode(), "accountId为空"); } if (StringUtils.isBlank(outTradeNo)) { return new ResultData(ErrorCode.PARAMETER_NOT_NULL.getCode(), "orderId为空"); } String params = park.getVendorParams(); JSONObject objParams = JSON.parseObject(params); String url = objParams.getString("url"); String partner = objParams.getString("partner"); String key = objParams.getString("key"); String version = objParams.getString("version"); String ret = tjd.deductionNotSettle(url, partner, key, version, tradeId, deductionAmount, outTradeNo, accountId); JSONObject retObj = JSON.parseObject(ret); if (retObj.getString("returnCode") == "T") { return new ResultData(); } else { return new ResultData(ErrorCode.TJD_DEDUCE_FEE_FAIL.getCode(), "停车费抵扣失败"); } } return new ResultData(ErrorCode.CAR_VENDOR_NOT_SUPPORT.getCode(), "停车费抵扣失败"); } private String getETCPBusinessID(String merchantIdStr) { String businessId; Long merchantId = 0L; try { merchantId = Long.valueOf(merchantIdStr); } catch (NumberFormatException e) { logger.error(e.getMessage()); } WxMerchant wxMerchant = wxMerchantService.getById(merchantId); String carParams = wxMerchant.getCarParams(); JSONObject objParams1 = JSON.parseObject(carParams); businessId = objParams1.getString("businessId"); return businessId; } /** * 优免券领取 * 优免券不可退 */ @ApiOperation(value = "优免券领取", notes="ETCP:={\"etcpToken\":\"string\",\"carNumber\":\"string\",\"couponFreeId\":\"string\"},输出\n{}") @PostMapping("/getCoupon") public ResultData getCoupon(Map paramMap) { WxCUser user = getUser(); /// 1, get mall's park WxPark park = getCurrentPark(user); if (park.getVendorType() == EnumCarVendor.CAR_ETCP.getCode()) { String etcpToken = paramMap.get("etcpToken"); String carNumber = paramMap.get("carNumber"); String couponFreeId = paramMap.get("couponFreeId"); String merchantIdStr = paramMap.get("merchantId"); if (StringUtils.isBlank(etcpToken)) { return new ResultData(ErrorCode.PARAMETER_NOT_NULL.getCode(), "etcpToken为空"); } if (StringUtils.isBlank(carNumber)) { return new ResultData(ErrorCode.PARAMETER_NOT_NULL.getCode(), "carNumber为空"); } if (StringUtils.isBlank(carNumber)) { return new ResultData(ErrorCode.PARAMETER_NOT_NULL.getCode(), "carNumber为空"); } if (StringUtils.isBlank(couponFreeId)) { return new ResultData(ErrorCode.PARAMETER_NOT_NULL.getCode(), "couponFreeId为空"); } if (StringUtils.isBlank(merchantIdStr)) { return new ResultData(ErrorCode.PARAMETER_NOT_NULL.getCode(), "merchantId为空"); } String params = park.getVendorParams(); JSONObject objParams = JSON.parseObject(params); String url = objParams.getString("url"); String merchantNo = objParams.getString("merchantNo"); String merchantKey = objParams.getString("merchantKey"); String version = objParams.getString("version"); String parkId = objParams.getString("parkId"); String businessId = ""; // 优先从从商户表里取 businessId = getETCPBusinessID(merchantIdStr); if (StringUtils.isBlank(businessId)) { // 1期只有一个虚拟商户,可以写在商场配置里 businessId = objParams.getString("businessId"); } String ret = etcp.bCouponRecord(url, merchantNo, merchantKey, version, etcpToken, parkId, businessId, carNumber, couponFreeId); JSONObject retObj = JSON.parseObject(ret); if (retObj.getIntValue("code") == 0) { return new ResultData(); } else { return new ResultData(ErrorCode.ETCP_QUAN_SEND_FAIL.getCode(), "优免券领取失败"); } } return new ResultData(ErrorCode.CAR_VENDOR_NOT_SUPPORT.getCode(), "优免券领取失败"); } }