From a1e2fd3cb3031a80ec3df81fb628f343703b7823 Mon Sep 17 00:00:00 2001 From: 无关风月 <443237572@qq.com> Date: 星期五, 20 九月 2024 13:42:30 +0800 Subject: [PATCH] Merge branch 'master' of http://120.76.84.145:10101/gitblit/r/java/mx_charging_pile --- ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/enums/ServiceIdMenu.java | 4 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java | 2 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TAccountingStrategyServiceImpl.java | 4 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/api/IotInterfaceUtil.java | 2 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TVipServiceImpl.java | 17 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/constant/SendTagConstant.java | 4 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TShoppingOrderServiceImpl.java | 1 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/util/RocketMQEnhanceTemplate.java | 9 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/OrderFallbackFactory.java | 5 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TVipController.java | 5 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/ParameterSettingMessage.java | 2 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/CarNumDto.java | 12 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TChargingOrder.java | 4 ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml | 5 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TEnterpriseUserApplicationController.java | 22 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/OrderClient.java | 3 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/UploadRealTimeMonitoringDataMessage.java | 4 ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/TAppUser.java | 6 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TCompanyController.java | 5 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TApplyChargingPileController.java | 4 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderInvoiceServiceImpl.java | 3 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/CarUtil.java | 2384 ++++++++++++++++++++++++++++++++++++++++++++++ ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/TOrderInvoiceVO.java | 3 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/TransactionRecordMessageListener.java | 13 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/ErrorMessageMessage.java | 35 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/tools/MessageUtil.java | 11 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/produce/EnhanceProduce.java | 11 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyController.java | 10 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java | 26 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyDetailController.java | 10 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/EndChargeMessage.java | 4 ruoyi-service/ruoyi-payment/src/main/java/com/ruoyi/payment/controller/WxPayController.java | 2 ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/AppUserClient.java | 4 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/OnlineMessageListener.java | 7 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/tools/StrategyUtil.java | 9 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/task/TaskUtil.java | 26 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/ErrorMessageMessageListener.java | 80 + ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/controller/SendMessageController.java | 10 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/mongodb/service/ErrorMessageMessageService.java | 8 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/PingMessageListener.java | 8 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TVipOrder.java | 3 ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/dto/VipInfoDto.java | 2 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/BmsDemandAndChargerExportationMessage.java | 3 ruoyi-service/ruoyi-payment/src/main/resources/bootstrap.yml | 1 ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/AppUserFallbackFactory.java | 6 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/AcquisitionBillingModeMessageListener.java | 16 ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/AccountingStrategyDetailClient.java | 9 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/mongodb/service/impl/ErrorMessageMessageServiceImpl.java | 35 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TVipOrderController.java | 23 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/listener/IotMessageListener.java | 134 ++ 50 files changed, 2,910 insertions(+), 106 deletions(-) diff --git a/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/AppUserFallbackFactory.java b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/AppUserFallbackFactory.java index ab00b84..5c3fc3f 100644 --- a/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/AppUserFallbackFactory.java +++ b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/AppUserFallbackFactory.java @@ -1,5 +1,6 @@ package com.ruoyi.account.api.factory; +import com.ruoyi.account.api.dto.GiveVipDto; import com.ruoyi.account.api.feignClient.AppUserClient; import com.ruoyi.account.api.model.TAppCoupon; import com.ruoyi.account.api.model.TAppUser; @@ -74,6 +75,11 @@ } @Override + public R giveVip(GiveVipDto giveVipDto) { + return null; + } + + @Override public R<List<TAppUser>> getUserByIds(List<Long> appUserIds) { return R.fail("根据用户id查询用户信息失败:"+throwable.getMessage()); } diff --git a/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/AppUserClient.java b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/AppUserClient.java index f52c5d9..3cc881d 100644 --- a/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/AppUserClient.java +++ b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/AppUserClient.java @@ -1,5 +1,6 @@ package com.ruoyi.account.api.feignClient; +import com.ruoyi.account.api.dto.GiveVipDto; import com.ruoyi.account.api.model.TAppCoupon; import com.ruoyi.account.api.model.TAppUser; import com.ruoyi.account.api.model.TAppUserAddress; @@ -81,4 +82,7 @@ */ @PostMapping(value = "/t-app-user/refundPoints/{param}") public R refundPoints(@PathVariable("param")String param); + + @PostMapping(value = "/t-app-user/user/give/vip") + public R giveVip(@RequestBody GiveVipDto giveVipDto); } diff --git a/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/TAppUser.java b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/TAppUser.java index e11a395..32db936 100644 --- a/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/TAppUser.java +++ b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/TAppUser.java @@ -126,6 +126,9 @@ @ApiModelProperty(value = "vip名称") @TableField(exist = false) private String vipName; + @ApiModelProperty(value = "归属地") + @TableField(exist = false) + private String place; @ApiModelProperty("累计充电数") @TableField(exist = false) private Long orderCount; @@ -133,6 +136,9 @@ @ApiModelProperty("剩余天数") @TableField(exist = false) private Long lastDays; + @ApiModelProperty(value = "单位名称") + @TableField(exist = false) + private String companyName; } diff --git a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/AccountingStrategyDetailClient.java b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/AccountingStrategyDetailClient.java index 94a055e..e12602d 100644 --- a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/AccountingStrategyDetailClient.java +++ b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/AccountingStrategyDetailClient.java @@ -6,6 +6,7 @@ import com.ruoyi.common.core.constant.ServiceNameConstants; import com.ruoyi.common.core.domain.R; import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; @@ -26,14 +27,14 @@ * @param siteId * @return */ - @PostMapping("/t-accounting-strategy-detail/getDetailBySiteId") + @GetMapping("/t-accounting-strategy-detail/getDetailBySiteId") R<TAccountingStrategyDetail> getDetailBySiteId(@RequestParam("siteId") Integer siteId); /** * 通过桩编号查询当前时段使用的策略明细 * @param code * @return */ - @PostMapping("/t-accounting-strategy-detail/getDetailByCode") + @GetMapping("/t-accounting-strategy-detail/getDetailByCode") R<TAccountingStrategyDetail> getDetailByCode(@RequestParam("code") String code); /** * 校验充电桩计费模版是否准确 @@ -49,13 +50,13 @@ * @param id * @return */ - @PostMapping("/t-accounting-strategy-detail/getListByAccountingStrategyId") + @GetMapping("/t-accounting-strategy-detail/getListByAccountingStrategyId") R<List<TAccountingStrategyDetail>> getListByAccountingStrategyId(@RequestParam("id") Integer id); /** * 通过桩编号查询当前使用的策略明细列表 * @param code * @return */ - @PostMapping("/t-accounting-strategy-detail/getDetailListByCode") + @GetMapping("/t-accounting-strategy-detail/getDetailListByCode") R<List<TAccountingStrategyDetail>> getDetailListByCode(@RequestParam("code") String code); } diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/OrderFallbackFactory.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/OrderFallbackFactory.java index 61b14b5..7f2650b 100644 --- a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/OrderFallbackFactory.java +++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/OrderFallbackFactory.java @@ -69,6 +69,11 @@ return R.fail("支付回调:" + cause.getMessage()); } + @Override + public R vipCallBack(String code, String outTradeNo) { + return R.fail("会员订单回调失败:" + cause.getMessage()); + } + @Override public R<TActivityVO> activityStatistics(TActivityStatisticsQuery dto) { diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/OrderClient.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/OrderClient.java index c49e25f..9e49992 100644 --- a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/OrderClient.java +++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/OrderClient.java @@ -45,6 +45,9 @@ public R<TShoppingOrder> shopCreate(@RequestBody ExchangeDto exchangeDto); @PostMapping("/t-shopping-order/callBack") public R callBack(@RequestParam("code")String code,@RequestParam("outTradeNo")String outTradeNo); + @PostMapping("/t-vip-order/callBack") + public R vipCallBack(@RequestParam("code")String code,@RequestParam("outTradeNo")String outTradeNo); + /** * 管理后台 活动费用统计 diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TChargingOrder.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TChargingOrder.java index a548f5d..382ce1d 100644 --- a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TChargingOrder.java +++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TChargingOrder.java @@ -186,7 +186,9 @@ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @TableField("refund_time") private LocalDateTime refundTime; - + @ApiModelProperty(value = "总电量") + @TableField("total_electricity") + private BigDecimal totalElectricity;// 总电量 @ApiModelProperty(value = "支付时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TVipOrder.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TVipOrder.java index ab4f606..541c529 100644 --- a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TVipOrder.java +++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TVipOrder.java @@ -37,6 +37,9 @@ @ApiModelProperty(value = "订单编号") @TableField("code") private String code; + @ApiModelProperty(value = "标题") + @TableField("title") + private String title; @ApiModelProperty(value = "用户id") @TableField("app_user_id") diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/TOrderInvoiceVO.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/TOrderInvoiceVO.java index b6dd626..80615b0 100644 --- a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/TOrderInvoiceVO.java +++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/TOrderInvoiceVO.java @@ -17,7 +17,8 @@ @ApiModelProperty(value = "服务费税率") private BigDecimal serviceTariff; - + @ApiModelProperty(value = "uid") + private String uid; @ApiModelProperty(value = "增值服务费税率") private BigDecimal addedServiceTariff; @ApiModelProperty(value = "电费") diff --git a/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/dto/VipInfoDto.java b/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/dto/VipInfoDto.java index 86e0ed5..17df5bc 100644 --- a/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/dto/VipInfoDto.java +++ b/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/dto/VipInfoDto.java @@ -9,7 +9,7 @@ import java.util.List; @Data public class VipInfoDto { - + private Integer id; @ApiModelProperty("月卡价格") private BigDecimal monthlyCard; @ApiModelProperty(value = "月卡折扣") diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java index ebda806..5b8ce08 100644 --- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java +++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java @@ -11,11 +11,9 @@ import com.ruoyi.account.api.dto.*; import com.ruoyi.account.api.model.*; import com.ruoyi.account.service.*; -import com.ruoyi.account.util.PointDetailUtil; -import com.ruoyi.account.util.SignDayUtil; +import com.ruoyi.account.util.*; import com.ruoyi.account.util.carBrand.CarBrandUtil; import com.ruoyi.account.wx.model.WeixinProperties; -import com.ruoyi.account.util.GiveVipUtil; import com.ruoyi.common.core.constant.Constants; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.dto.PointChangeDto; @@ -230,7 +228,7 @@ return R.ok(page); } List<Integer> vipIds = new ArrayList<>(); - vipIds = page.getRecords().stream().map(TAppUser::getVipId).collect(Collectors.toList()); +// vipIds = page.getRecords().stream().map(TAppUser::getVipId).collect(Collectors.toList()); //获取会员map R<Map<Integer, String>> vipMap = otherClient.getVipMap(vipIds); //循环处理 @@ -244,12 +242,28 @@ appUser.setTagName(byIdTag.getData().getName()); } } - //匹配vipMap的值 - appUser.setVipName(vipMap.getData().get(appUser.getVipId())); + if (appUser.getVipEndTime()!=null&&appUser.getVipEndTime().isAfter(LocalDateTime.now())) { + //匹配vipMap的值 + appUser.setVipName(vipMap.getData().get(appUser.getVipId())); + } //累计充电次数 R<Long> useOrderCount = chargingOrderClient.useOrderCount(appUser.getId()); appUser.setOrderCount(useOrderCount.getData()); appUser.setUid(appUser.getId().toString()); + if (appUser.getCompanyId()!=null){ + TCompany data = otherClient.unitDetail(appUser.getCompanyId()).getData(); + if (data!=null){ + appUser.setCompanyName(data.getName()); + } + } + + TAppUserCar one1 = appUserCarService.lambdaQuery().eq(TAppUserCar::getAppUserId, appUser.getId()).orderByDesc(BasePojo::getCreateTime).last("limit 1").one(); + if (one1!=null){ + CarNumDto carNumDto = CarUtil.carNum(one1.getLicensePlate()); + appUser.setPlace(carNumDto.getProvince()+carNumDto.getCity()); + + } + } return R.ok(page); diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/task/TaskUtil.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/task/TaskUtil.java index 0bdf907..7e87177 100644 --- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/task/TaskUtil.java +++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/task/TaskUtil.java @@ -1,8 +1,11 @@ package com.ruoyi.account.task; +import com.ruoyi.account.api.model.TAppUser; import com.ruoyi.account.api.model.TAppUserVipDetail; +import com.ruoyi.account.service.TAppUserService; import com.ruoyi.account.service.TAppUserVipDetailService; +import org.intellij.lang.annotations.RegExp; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @@ -21,6 +24,8 @@ @Resource private TAppUserVipDetailService tAppUserVipDetailService; + @Resource + private TAppUserService appUserService; /** @@ -48,6 +53,27 @@ } catch (Exception e) { e.printStackTrace(); } + + + + + } + + @Scheduled(fixedRate = 1000 * 60) + public void changeVipId(){ + LocalDate currentDate = LocalDate.now(); + List<TAppUserVipDetail> recentDetails = tAppUserVipDetailService.lambdaQuery() + .le(TAppUserVipDetail::getStartTime, currentDate) + .ge(TAppUserVipDetail::getEndTime, currentDate) + .orderByDesc(TAppUserVipDetail::getStartTime).list(); + for (TAppUserVipDetail recentDetail : recentDetails) { + TAppUser byId = appUserService.getById(recentDetail.getAppUserId()); + if (byId!=null) { + byId.setVipId(recentDetail.getVipId()); + appUserService.updateById(byId); + } + } + } diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/CarNumDto.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/CarNumDto.java new file mode 100644 index 0000000..ed30b43 --- /dev/null +++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/CarNumDto.java @@ -0,0 +1,12 @@ +package com.ruoyi.account.util; + +import lombok.Data; + +import java.io.Serializable; +@Data +public class CarNumDto implements Serializable { + private String pcode; + private String province; + private String city; + private String code; +} \ No newline at end of file diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/CarUtil.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/CarUtil.java new file mode 100644 index 0000000..532cc5d --- /dev/null +++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/CarUtil.java @@ -0,0 +1,2384 @@ +package com.ruoyi.account.util; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; + +public class CarUtil { + + public static CarNumDto carNum(String num) { + String jsonStr = "{\"date\":[\n" + + "{\n" + + "\"code\":\"冀A\",\n" + + "\"city\":\"石家庄\",\n" + + "\"province\":\"河北\",\n" + + "\"pcode\":\"HB\"\n" + + "},\n" + + "{\n" + + "\"code\":\"冀B\",\n" + + "\"city\":\"唐山\",\n" + + "\"province\":\"河北\",\n" + + "\"pcode\":\"HB\"\n" + + "},\n" + + "{\n" + + "\"code\":\"冀C\",\n" + + "\"city\":\"秦皇岛\",\n" + + "\"province\":\"河北\",\n" + + "\"pcode\":\"HB\"\n" + + "},\n" + + "{\n" + + "\"code\":\"冀D\",\n" + + "\"city\":\"邯郸\",\n" + + "\"province\":\"河北\",\n" + + "\"pcode\":\"HB\"\n" + + "},\n" + + "{\n" + + "\"code\":\"冀E\",\n" + + "\"city\":\"邢台\",\n" + + "\"province\":\"河北\",\n" + + "\"pcode\":\"HB\"\n" + + "},\n" + + "{\n" + + "\"code\":\"冀F\",\n" + + "\"city\":\"保定\",\n" + + "\"province\":\"河北\",\n" + + "\"pcode\":\"HB\"\n" + + "},\n" + + "{\n" + + "\"code\":\"冀G\",\n" + + "\"city\":\"张家口\",\n" + + "\"province\":\"河北\",\n" + + "\"pcode\":\"HB\"\n" + + "},\n" + + "{\n" + + "\"code\":\"冀H\",\n" + + "\"city\":\"承德\",\n" + + "\"province\":\"河北\",\n" + + "\"pcode\":\"HB\"\n" + + "},\n" + + "{\n" + + "\"code\":\"冀J\",\n" + + "\"city\":\"沧州\",\n" + + "\"province\":\"河北\",\n" + + "\"pcode\":\"HB\"\n" + + "},\n" + + "{\n" + + "\"code\":\"冀R\",\n" + + "\"city\":\"廊坊\",\n" + + "\"province\":\"河北\",\n" + + "\"pcode\":\"HB\"\n" + + "},\n" + + "{\n" + + "\"code\":\"冀S\",\n" + + "\"city\":\"沧州\",\n" + + "\"province\":\"河北\",\n" + + "\"pcode\":\"HB\"\n" + + "},\n" + + "{\n" + + "\"code\":\"冀T\",\n" + + "\"city\":\"衡水\",\n" + + "\"province\":\"河北\",\n" + + "\"pcode\":\"HB\"\n" + + "},\n" + + "{\n" + + "\"code\":\"辽A\",\n" + + "\"city\":\"沈阳\",\n" + + "\"province\":\"辽宁\",\n" + + "\"pcode\":\"LN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"辽B\",\n" + + "\"city\":\"大连\",\n" + + "\"province\":\"辽宁\",\n" + + "\"pcode\":\"LN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"辽C\",\n" + + "\"city\":\"鞍山\",\n" + + "\"province\":\"辽宁\",\n" + + "\"pcode\":\"LN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"辽D\",\n" + + "\"city\":\"抚顺\",\n" + + "\"province\":\"辽宁\",\n" + + "\"pcode\":\"LN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"辽E\",\n" + + "\"city\":\"本溪\",\n" + + "\"province\":\"辽宁\",\n" + + "\"pcode\":\"LN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"辽F\",\n" + + "\"city\":\"丹东\",\n" + + "\"province\":\"辽宁\",\n" + + "\"pcode\":\"LN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"辽G\",\n" + + "\"city\":\"锦州\",\n" + + "\"province\":\"辽宁\",\n" + + "\"pcode\":\"LN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"辽H\",\n" + + "\"city\":\"营口\",\n" + + "\"province\":\"辽宁\",\n" + + "\"pcode\":\"LN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"辽J\",\n" + + "\"city\":\"阜新\",\n" + + "\"province\":\"辽宁\",\n" + + "\"pcode\":\"LN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"辽K\",\n" + + "\"city\":\"辽阳\",\n" + + "\"province\":\"辽宁\",\n" + + "\"pcode\":\"LN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"辽L\",\n" + + "\"city\":\"盘锦\",\n" + + "\"province\":\"辽宁\",\n" + + "\"pcode\":\"LN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"辽M\",\n" + + "\"city\":\"铁岭\",\n" + + "\"province\":\"辽宁\",\n" + + "\"pcode\":\"LN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"辽N\",\n" + + "\"city\":\"朝阳\",\n" + + "\"province\":\"辽宁\",\n" + + "\"pcode\":\"LN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"辽p\",\n" + + "\"city\":\"葫芦岛\",\n" + + "\"province\":\"辽宁\",\n" + + "\"pcode\":\"LN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"皖A\",\n" + + "\"city\":\"合肥\",\n" + + "\"province\":\"安徽\",\n" + + "\"pcode\":\"AH\"\n" + + "},\n" + + "{\n" + + "\"code\":\"皖B\",\n" + + "\"city\":\"芜湖\",\n" + + "\"province\":\"安徽\",\n" + + "\"pcode\":\"AH\"\n" + + "},\n" + + "{\n" + + "\"code\":\"皖C\",\n" + + "\"city\":\"蚌埠\",\n" + + "\"province\":\"安徽\",\n" + + "\"pcode\":\"AH\"\n" + + "},\n" + + "{\n" + + "\"code\":\"皖D\",\n" + + "\"city\":\"淮南\",\n" + + "\"province\":\"安徽\",\n" + + "\"pcode\":\"AH\"\n" + + "},\n" + + "{\n" + + "\"code\":\"皖E\",\n" + + "\"city\":\"马鞍山\",\n" + + "\"province\":\"安徽\",\n" + + "\"pcode\":\"AH\"\n" + + "},\n" + + "{\n" + + "\"code\":\"皖F\",\n" + + "\"city\":\"淮北\",\n" + + "\"province\":\"安徽\",\n" + + "\"pcode\":\"AH\"\n" + + "},\n" + + "{\n" + + "\"code\":\"皖G\",\n" + + "\"city\":\"铜陵\",\n" + + "\"province\":\"安徽\",\n" + + "\"pcode\":\"AH\"\n" + + "},\n" + + "{\n" + + "\"code\":\"皖H\",\n" + + "\"city\":\"安庆\",\n" + + "\"province\":\"安徽\",\n" + + "\"pcode\":\"AH\"\n" + + "},\n" + + "{\n" + + "\"code\":\"皖J\",\n" + + "\"city\":\"黄山\",\n" + + "\"province\":\"安徽\",\n" + + "\"pcode\":\"AH\"\n" + + "},\n" + + "{\n" + + "\"code\":\"皖K\",\n" + + "\"city\":\"阜阳\",\n" + + "\"province\":\"安徽\",\n" + + "\"pcode\":\"AH\"\n" + + "},\n" + + "{\n" + + "\"code\":\"皖L\",\n" + + "\"city\":\"宿州\",\n" + + "\"province\":\"安徽\",\n" + + "\"pcode\":\"AH\"\n" + + "},\n" + + "{\n" + + "\"code\":\"皖M\",\n" + + "\"city\":\"滁州\",\n" + + "\"province\":\"安徽\",\n" + + "\"pcode\":\"AH\"\n" + + "},\n" + + "{\n" + + "\"code\":\"皖N\",\n" + + "\"city\":\"六安\",\n" + + "\"province\":\"安徽\",\n" + + "\"pcode\":\"AH\"\n" + + "},\n" + + "{\n" + + "\"code\":\"皖p\",\n" + + "\"city\":\"宣城\",\n" + + "\"province\":\"安徽\",\n" + + "\"pcode\":\"AH\"\n" + + "},\n" + + "{\n" + + "\"code\":\"皖Q\",\n" + + "\"city\":\"巢湖\",\n" + + "\"province\":\"安徽\",\n" + + "\"pcode\":\"AH\"\n" + + "},\n" + + "{\n" + + "\"code\":\"皖R\",\n" + + "\"city\":\"池州\",\n" + + "\"province\":\"安徽\",\n" + + "\"pcode\":\"AH\"\n" + + "},\n" + + "{\n" + + "\"code\":\"皖S\",\n" + + "\"city\":\"亳州\",\n" + + "\"province\":\"安徽\",\n" + + "\"pcode\":\"AH\"\n" + + "},\n" + + "{\n" + + "\"code\":\"苏A\",\n" + + "\"city\":\"南京\",\n" + + "\"province\":\"江苏\",\n" + + "\"pcode\":\"JS\"\n" + + "},\n" + + "{\n" + + "\"code\":\"苏B\",\n" + + "\"city\":\"无锡\",\n" + + "\"province\":\"江苏\",\n" + + "\"pcode\":\"JS\"\n" + + "},\n" + + "{\n" + + "\"code\":\"苏C\",\n" + + "\"city\":\"徐州\",\n" + + "\"province\":\"江苏\",\n" + + "\"pcode\":\"JS\"\n" + + "},\n" + + "{\n" + + "\"code\":\"苏D\",\n" + + "\"city\":\"常州\",\n" + + "\"province\":\"江苏\",\n" + + "\"pcode\":\"JS\"\n" + + "},\n" + + "{\n" + + "\"code\":\"苏E\",\n" + + "\"city\":\"苏州\",\n" + + "\"province\":\"江苏\",\n" + + "\"pcode\":\"JS\"\n" + + "},\n" + + "{\n" + + "\"code\":\"苏F\",\n" + + "\"city\":\"南通\",\n" + + "\"province\":\"江苏\",\n" + + "\"pcode\":\"JS\"\n" + + "},\n" + + "{\n" + + "\"code\":\"苏G\",\n" + + "\"city\":\"连云港\",\n" + + "\"province\":\"江苏\",\n" + + "\"pcode\":\"JS\"\n" + + "},\n" + + "{\n" + + "\"code\":\"苏H\",\n" + + "\"city\":\"淮安\",\n" + + "\"province\":\"江苏\",\n" + + "\"pcode\":\"JS\"\n" + + "},\n" + + "{\n" + + "\"code\":\"苏J\",\n" + + "\"city\":\"盐城\",\n" + + "\"province\":\"江苏\",\n" + + "\"pcode\":\"JS\"\n" + + "},\n" + + "{\n" + + "\"code\":\"苏K\",\n" + + "\"city\":\"扬州\",\n" + + "\"province\":\"江苏\",\n" + + "\"pcode\":\"JS\"\n" + + "},\n" + + "{\n" + + "\"code\":\"苏L\",\n" + + "\"city\":\"镇江\",\n" + + "\"province\":\"江苏\",\n" + + "\"pcode\":\"JS\"\n" + + "},\n" + + "{\n" + + "\"code\":\"苏M\",\n" + + "\"city\":\"泰州\",\n" + + "\"province\":\"江苏\",\n" + + "\"pcode\":\"JS\"\n" + + "},\n" + + "{\n" + + "\"code\":\"苏N\",\n" + + "\"city\":\"宿迁\",\n" + + "\"province\":\"江苏\",\n" + + "\"pcode\":\"JS\"\n" + + "},\n" + + "{\n" + + "\"code\":\"鄂A\",\n" + + "\"city\":\"武汉\",\n" + + "\"province\":\"湖北\",\n" + + "\"pcode\":\"HB\"\n" + + "},\n" + + "{\n" + + "\"code\":\"鄂B\",\n" + + "\"city\":\"黄石\",\n" + + "\"province\":\"湖北\",\n" + + "\"pcode\":\"HB\"\n" + + "},\n" + + "{\n" + + "\"code\":\"鄂C\",\n" + + "\"city\":\"十堰\",\n" + + "\"province\":\"湖北\",\n" + + "\"pcode\":\"HB\"\n" + + "},\n" + + "{\n" + + "\"code\":\"鄂D\",\n" + + "\"city\":\"荆州\",\n" + + "\"province\":\"湖北\",\n" + + "\"pcode\":\"HB\"\n" + + "},\n" + + "{\n" + + "\"code\":\"鄂E\",\n" + + "\"city\":\"宜昌\",\n" + + "\"province\":\"湖北\",\n" + + "\"pcode\":\"HB\"\n" + + "},\n" + + "{\n" + + "\"code\":\"鄂F\",\n" + + "\"city\":\"襄樊\",\n" + + "\"province\":\"湖北\",\n" + + "\"pcode\":\"HB\"\n" + + "},\n" + + "{\n" + + "\"code\":\"鄂G\",\n" + + "\"city\":\"鄂州\",\n" + + "\"province\":\"湖北\",\n" + + "\"pcode\":\"HB\"\n" + + "},\n" + + "{\n" + + "\"code\":\"鄂H\",\n" + + "\"city\":\"荆门 \",\n" + + "\"province\":\"湖北\",\n" + + "\"pcode\":\"HB\"\n" + + "},\n" + + "{\n" + + "\"code\":\"鄂J\",\n" + + "\"city\":\"黄冈\",\n" + + "\"province\":\"湖北\",\n" + + "\"pcode\":\"HB\"\n" + + "},\n" + + "{\n" + + "\"code\":\"鄂K\",\n" + + "\"city\":\"孝感\",\n" + + "\"province\":\"湖北\",\n" + + "\"pcode\":\"HB\"\n" + + "},\n" + + "{\n" + + "\"code\":\"鄂L\",\n" + + "\"city\":\"咸宁\",\n" + + "\"province\":\"湖北\",\n" + + "\"pcode\":\"HB\"\n" + + "},\n" + + "{\n" + + "\"code\":\"鄂M\",\n" + + "\"city\":\"仙桃\",\n" + + "\"province\":\"湖北\",\n" + + "\"pcode\":\"HB\"\n" + + "},\n" + + "{\n" + + "\"code\":\"鄂N\",\n" + + "\"city\":\"潜江\",\n" + + "\"province\":\"湖北\",\n" + + "\"pcode\":\"HB\"\n" + + "},\n" + + "{\n" + + "\"code\":\"鄂p\",\n" + + "\"city\":\"神农架林区\",\n" + + "\"province\":\"湖北\",\n" + + "\"pcode\":\"HB\"\n" + + "},\n" + + "{\n" + + "\"code\":\"鄂Q\",\n" + + "\"city\":\"恩施土家族苗族自治州\",\n" + + "\"province\":\"湖北\",\n" + + "\"pcode\":\"HB\"\n" + + "},\n" + + "{\n" + + "\"code\":\"鄂R\",\n" + + "\"city\":\"天门\",\n" + + "\"province\":\"湖北\",\n" + + "\"pcode\":\"HB\"\n" + + "},\n" + + "{\n" + + "\"code\":\"鄂S\",\n" + + "\"city\":\"随州\",\n" + + "\"province\":\"湖北\",\n" + + "\"pcode\":\"HB\"\n" + + "},\n" + + "{\n" + + "\"code\":\"晋A\",\n" + + "\"city\":\"太原\",\n" + + "\"province\":\"山西\",\n" + + "\"pcode\":\"SX\"\n" + + "},\n" + + "{\n" + + "\"code\":\"晋B\",\n" + + "\"city\":\"大同\",\n" + + "\"province\":\"山西\",\n" + + "\"pcode\":\"SX\"\n" + + "},\n" + + "{\n" + + "\"code\":\"晋C\",\n" + + "\"city\":\"阳泉\",\n" + + "\"province\":\"山西\",\n" + + "\"pcode\":\"SX\"\n" + + "},\n" + + "{\n" + + "\"code\":\"晋D\",\n" + + "\"city\":\"长治\",\n" + + "\"province\":\"山西\",\n" + + "\"pcode\":\"SX\"\n" + + "},\n" + + "{\n" + + "\"code\":\"晋E\",\n" + + "\"city\":\"晋城\",\n" + + "\"province\":\"山西\",\n" + + "\"pcode\":\"SX\"\n" + + "},\n" + + "{\n" + + "\"code\":\"晋F\",\n" + + "\"city\":\"朔州\",\n" + + "\"province\":\"山西\",\n" + + "\"pcode\":\"SX\"\n" + + "},\n" + + "{\n" + + "\"code\":\"晋H\",\n" + + "\"city\":\"忻州\",\n" + + "\"province\":\"山西\",\n" + + "\"pcode\":\"SX\"\n" + + "},\n" + + "{\n" + + "\"code\":\"晋J\",\n" + + "\"city\":\"吕梁地区\",\n" + + "\"province\":\"山西\",\n" + + "\"pcode\":\"SX\"\n" + + "},\n" + + "{\n" + + "\"code\":\"晋K\",\n" + + "\"city\":\"晋中\",\n" + + "\"province\":\"山西\",\n" + + "\"pcode\":\"SX\"\n" + + "},\n" + + "{\n" + + "\"code\":\"晋L\",\n" + + "\"city\":\"临汾\",\n" + + "\"province\":\"山西\",\n" + + "\"pcode\":\"SX\"\n" + + "},\n" + + "{\n" + + "\"code\":\"晋M\",\n" + + "\"city\":\"运城\",\n" + + "\"province\":\"山西\",\n" + + "\"pcode\":\"SX\"\n" + + "},\n" + + "{\n" + + "\"code\":\"吉A\",\n" + + "\"city\":\"长春\",\n" + + "\"province\":\"吉林\",\n" + + "\"pcode\":\"JL\"\n" + + "},\n" + + "{\n" + + "\"code\":\"吉B\",\n" + + "\"city\":\"吉林\",\n" + + "\"province\":\"吉林\",\n" + + "\"pcode\":\"JL\"\n" + + "},\n" + + "{\n" + + "\"code\":\"吉C\",\n" + + "\"city\":\"四平\",\n" + + "\"province\":\"吉林\",\n" + + "\"pcode\":\"JL\"\n" + + "},\n" + + "{\n" + + "\"code\":\"吉D\",\n" + + "\"city\":\"辽源\",\n" + + "\"province\":\"吉林\",\n" + + "\"pcode\":\"JL\"\n" + + "},\n" + + "{\n" + + "\"code\":\"吉E\",\n" + + "\"city\":\"通化\",\n" + + "\"province\":\"吉林\",\n" + + "\"pcode\":\"JL\"\n" + + "},\n" + + "{\n" + + "\"code\":\"吉F\",\n" + + "\"city\":\"白山\",\n" + + "\"province\":\"吉林\",\n" + + "\"pcode\":\"JL\"\n" + + "},\n" + + "{\n" + + "\"code\":\"吉G\",\n" + + "\"city\":\"白城\",\n" + + "\"province\":\"吉林\",\n" + + "\"pcode\":\"JL\"\n" + + "},\n" + + "{\n" + + "\"code\":\"吉H\",\n" + + "\"city\":\"延边朝鲜族自治州\",\n" + + "\"province\":\"吉林\",\n" + + "\"pcode\":\"JL\"\n" + + "},\n" + + "{\n" + + "\"code\":\"吉J\",\n" + + "\"city\":\"松原\",\n" + + "\"province\":\"吉林\",\n" + + "\"pcode\":\"JL\"\n" + + "},\n" + + "{\n" + + "\"code\":\"吉K\",\n" + + "\"city\":\"长白山\",\n" + + "\"province\":\"吉林\",\n" + + "\"pcode\":\"JL\"\n" + + "},\n" + + "{\n" + + "\"code\":\"粤A\",\n" + + "\"city\":\"广州\",\n" + + "\"province\":\"广东\",\n" + + "\"pcode\":\"GD\"\n" + + "},\n" + + "{\n" + + "\"code\":\"粤B\",\n" + + "\"city\":\"深圳\",\n" + + "\"province\":\"广东\",\n" + + "\"pcode\":\"GD\"\n" + + "},\n" + + "{\n" + + "\"code\":\"粤C\",\n" + + "\"city\":\"珠海\",\n" + + "\"province\":\"广东\",\n" + + "\"pcode\":\"GD\"\n" + + "},\n" + + "{\n" + + "\"code\":\"粤D\",\n" + + "\"city\":\"汕头\",\n" + + "\"province\":\"广东\",\n" + + "\"pcode\":\"GD\"\n" + + "},\n" + + "{\n" + + "\"code\":\"粤E\",\n" + + "\"city\":\"佛山\",\n" + + "\"province\":\"广东\",\n" + + "\"pcode\":\"GD\"\n" + + "},\n" + + "{\n" + + "\"code\":\"粤F\",\n" + + "\"city\":\"韶关\",\n" + + "\"province\":\"广东\",\n" + + "\"pcode\":\"GD\"\n" + + "},\n" + + "{\n" + + "\"code\":\"粤G\",\n" + + "\"city\":\"湛江\",\n" + + "\"province\":\"广东\",\n" + + "\"pcode\":\"GD\"\n" + + "},\n" + + "{\n" + + "\"code\":\"粤H\",\n" + + "\"city\":\"肇庆\",\n" + + "\"province\":\"广东\",\n" + + "\"pcode\":\"GD\"\n" + + "},\n" + + "{\n" + + "\"code\":\"粤J\",\n" + + "\"city\":\"江门\",\n" + + "\"province\":\"广东\",\n" + + "\"pcode\":\"GD\"\n" + + "},\n" + + "{\n" + + "\"code\":\"粤K\",\n" + + "\"city\":\"茂名\",\n" + + "\"province\":\"广东\",\n" + + "\"pcode\":\"GD\"\n" + + "},\n" + + "{\n" + + "\"code\":\"粤L\",\n" + + "\"city\":\"惠州\",\n" + + "\"province\":\"广东\",\n" + + "\"pcode\":\"GD\"\n" + + "},\n" + + "{\n" + + "\"code\":\"粤M\",\n" + + "\"city\":\"梅州\",\n" + + "\"province\":\"广东\",\n" + + "\"pcode\":\"GD\"\n" + + "},\n" + + "{\n" + + "\"code\":\"粤N\",\n" + + "\"city\":\"汕尾\",\n" + + "\"province\":\"广东\",\n" + + "\"pcode\":\"GD\"\n" + + "},\n" + + "{\n" + + "\"code\":\"粤p\",\n" + + "\"city\":\"河源\",\n" + + "\"province\":\"广东\",\n" + + "\"pcode\":\"GD\"\n" + + "},\n" + + "{\n" + + "\"code\":\"粤Q\",\n" + + "\"city\":\"阳江\",\n" + + "\"province\":\"广东\",\n" + + "\"pcode\":\"GD\"\n" + + "},\n" + + "{\n" + + "\"code\":\"粤R\",\n" + + "\"city\":\"清远\",\n" + + "\"province\":\"广东\",\n" + + "\"pcode\":\"GD\"\n" + + "},\n" + + "{\n" + + "\"code\":\"粤S\",\n" + + "\"city\":\"东莞\",\n" + + "\"province\":\"广东\",\n" + + "\"pcode\":\"GD\"\n" + + "},\n" + + "{\n" + + "\"code\":\"粤T\",\n" + + "\"city\":\"中山\",\n" + + "\"province\":\"广东\",\n" + + "\"pcode\":\"GD\"\n" + + "},\n" + + "{\n" + + "\"code\":\"粤U\",\n" + + "\"city\":\"潮州\",\n" + + "\"province\":\"广东\",\n" + + "\"pcode\":\"GD\"\n" + + "},\n" + + "{\n" + + "\"code\":\"粤V\",\n" + + "\"city\":\"揭阳\",\n" + + "\"province\":\"广东\",\n" + + "\"pcode\":\"GD\"\n" + + "},\n" + + "{\n" + + "\"code\":\"粤W\",\n" + + "\"city\":\"云浮\",\n" + + "\"province\":\"广东\",\n" + + "\"pcode\":\"GD\"\n" + + "},\n" + + "{\n" + + "\"code\":\"粤X\",\n" + + "\"city\":\"顺德区\",\n" + + "\"province\":\"广东\",\n" + + "\"pcode\":\"GD\"\n" + + "},\n" + + "{\n" + + "\"code\":\"粤Y\",\n" + + "\"city\":\"南海区\",\n" + + "\"province\":\"广东\",\n" + + "\"pcode\":\"GD\"\n" + + "},\n" + + "{\n" + + "\"code\":\"粤Z\",\n" + + "\"city\":\"港澳进入内地车辆\",\n" + + "\"province\":\"广东\",\n" + + "\"pcode\":\"GD\"\n" + + "},\n" + + "{\n" + + "\"code\":\"宁A\",\n" + + "\"city\":\"银川\",\n" + + "\"province\":\"宁夏\",\n" + + "\"pcode\":\"NX\"\n" + + "},\n" + + "{\n" + + "\"code\":\"宁B\",\n" + + "\"city\":\"石嘴山\",\n" + + "\"province\":\"宁夏\",\n" + + "\"pcode\":\"NX\"\n" + + "},\n" + + "{\n" + + "\"code\":\"宁C\",\n" + + "\"city\":\"银南\",\n" + + "\"province\":\"宁夏\",\n" + + "\"pcode\":\"NX\"\n" + + "},\n" + + "{\n" + + "\"code\":\"宁D\",\n" + + "\"city\":\"固原\",\n" + + "\"province\":\"宁夏\",\n" + + "\"pcode\":\"NX\"\n" + + "},\n" + + "{\n" + + "\"code\":\"宁E\",\n" + + "\"city\":\"中卫\",\n" + + "\"province\":\"宁夏\",\n" + + "\"pcode\":\"NX\"\n" + + "},\n" + + "{\n" + + "\"code\":\"京A\",\n" + + "\"city\":\"北京\",\n" + + "\"province\":\"北京\",\n" + + "\"pcode\":\"BJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"京B\",\n" + + "\"city\":\"北京\",\n" + + "\"province\":\"北京\",\n" + + "\"pcode\":\"BJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"京C\",\n" + + "\"city\":\"北京\",\n" + + "\"province\":\"北京\",\n" + + "\"pcode\":\"BJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"京D\",\n" + + "\"city\":\"北京\",\n" + + "\"province\":\"北京\",\n" + + "\"pcode\":\"BJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"京E\",\n" + + "\"city\":\"北京\",\n" + + "\"province\":\"北京\",\n" + + "\"pcode\":\"BJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"京F\",\n" + + "\"city\":\"北京\",\n" + + "\"province\":\"北京\",\n" + + "\"pcode\":\"BJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"京G\",\n" + + "\"city\":\"北京\",\n" + + "\"province\":\"北京\",\n" + + "\"pcode\":\"BJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"京H\",\n" + + "\"city\":\"北京\",\n" + + "\"province\":\"北京\",\n" + + "\"pcode\":\"BJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"京J\",\n" + + "\"city\":\"北京\",\n" + + "\"province\":\"北京\",\n" + + "\"pcode\":\"BJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"京K\",\n" + + "\"city\":\"北京\",\n" + + "\"province\":\"北京\",\n" + + "\"pcode\":\"BJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"京L\",\n" + + "\"city\":\"北京\",\n" + + "\"province\":\"北京\",\n" + + "\"pcode\":\"BJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"京M\",\n" + + "\"city\":\"北京\",\n" + + "\"province\":\"北京\",\n" + + "\"pcode\":\"BJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"京Y\",\n" + + "\"city\":\"北京\",\n" + + "\"province\":\"北京\",\n" + + "\"pcode\":\"BJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"豫A\",\n" + + "\"city\":\"郑州\",\n" + + "\"province\":\"河南\",\n" + + "\"pcode\":\"HN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"豫B\",\n" + + "\"city\":\"开封\",\n" + + "\"province\":\"河南\",\n" + + "\"pcode\":\"HN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"豫C\",\n" + + "\"city\":\"洛阳\",\n" + + "\"province\":\"河南\",\n" + + "\"pcode\":\"HN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"豫D\",\n" + + "\"city\":\"平顶山\",\n" + + "\"province\":\"河南\",\n" + + "\"pcode\":\"HN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"豫E\",\n" + + "\"city\":\"安阳\",\n" + + "\"province\":\"河南\",\n" + + "\"pcode\":\"HN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"豫F\",\n" + + "\"city\":\"鹤壁\",\n" + + "\"province\":\"河南\",\n" + + "\"pcode\":\"HN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"豫G\",\n" + + "\"city\":\"新乡\",\n" + + "\"province\":\"河南\",\n" + + "\"pcode\":\"HN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"豫H\",\n" + + "\"city\":\"焦作\",\n" + + "\"province\":\"河南\",\n" + + "\"pcode\":\"HN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"豫J\",\n" + + "\"city\":\"濮阳\",\n" + + "\"province\":\"河南\",\n" + + "\"pcode\":\"HN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"豫K\",\n" + + "\"city\":\"许昌\",\n" + + "\"province\":\"河南\",\n" + + "\"pcode\":\"HN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"豫L\",\n" + + "\"city\":\"漯河\",\n" + + "\"province\":\"河南\",\n" + + "\"pcode\":\"HN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"豫M\",\n" + + "\"city\":\"三门峡\",\n" + + "\"province\":\"河南\",\n" + + "\"pcode\":\"HN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"豫N\",\n" + + "\"city\":\"商丘\",\n" + + "\"province\":\"河南\",\n" + + "\"pcode\":\"HN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"豫p\",\n" + + "\"city\":\"周口\",\n" + + "\"province\":\"河南\",\n" + + "\"pcode\":\"HN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"豫Q\",\n" + + "\"city\":\"驻马店\",\n" + + "\"province\":\"河南\",\n" + + "\"pcode\":\"HN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"豫R\",\n" + + "\"city\":\"南阳\",\n" + + "\"province\":\"河南\",\n" + + "\"pcode\":\"HN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"豫S\",\n" + + "\"city\":\"信阳\",\n" + + "\"province\":\"河南\",\n" + + "\"pcode\":\"HN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"豫U\",\n" + + "\"city\":\"济源\",\n" + + "\"province\":\"河南\",\n" + + "\"pcode\":\"HN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"黑A\",\n" + + "\"city\":\"哈尔滨\",\n" + + "\"province\":\"黑龙江\",\n" + + "\"pcode\":\"HLJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"黑B\",\n" + + "\"city\":\"齐齐哈尔\",\n" + + "\"province\":\"黑龙江\",\n" + + "\"pcode\":\"HLJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"黑C\",\n" + + "\"city\":\"牡丹江\",\n" + + "\"province\":\"黑龙江\",\n" + + "\"pcode\":\"HLJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"黑D\",\n" + + "\"city\":\"佳木斯\",\n" + + "\"province\":\"黑龙江\",\n" + + "\"pcode\":\"HLJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"黑E\",\n" + + "\"city\":\"大庆\",\n" + + "\"province\":\"黑龙江\",\n" + + "\"pcode\":\"HLJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"黑F\",\n" + + "\"city\":\"伊春\",\n" + + "\"province\":\"黑龙江\",\n" + + "\"pcode\":\"HLJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"黑G\",\n" + + "\"city\":\"鸡西\",\n" + + "\"province\":\"黑龙江\",\n" + + "\"pcode\":\"HLJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"黑H\",\n" + + "\"city\":\"鹤岗\",\n" + + "\"province\":\"黑龙江\",\n" + + "\"pcode\":\"HLJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"黑J\",\n" + + "\"city\":\"双鸭山\",\n" + + "\"province\":\"黑龙江\",\n" + + "\"pcode\":\"HLJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"黑K\",\n" + + "\"city\":\"七台河\",\n" + + "\"province\":\"黑龙江\",\n" + + "\"pcode\":\"HLJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"黑L\",\n" + + "\"city\":\"松花江地区\",\n" + + "\"province\":\"黑龙江\",\n" + + "\"pcode\":\"HLJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"黑M\",\n" + + "\"city\":\"绥化\",\n" + + "\"province\":\"黑龙江\",\n" + + "\"pcode\":\"HLJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"黑N\",\n" + + "\"city\":\"黑河\",\n" + + "\"province\":\"黑龙江\",\n" + + "\"pcode\":\"HLJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"黑p\",\n" + + "\"city\":\"大兴安岭地区\",\n" + + "\"province\":\"黑龙江\",\n" + + "\"pcode\":\"HLJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"黑R\",\n" + + "\"city\":\"农垦系统\",\n" + + "\"province\":\"黑龙江\",\n" + + "\"pcode\":\"HLJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"鲁A \",\n" + + "\"city\":\"济南\",\n" + + "\"province\":\"山东\",\n" + + "\"pcode\":\"SD\"\n" + + "},\n" + + "{\n" + + "\"code\":\"鲁B\",\n" + + "\"city\":\"青岛\",\n" + + "\"province\":\"山东\",\n" + + "\"pcode\":\"SD\"\n" + + "},\n" + + "{\n" + + "\"code\":\"鲁C\",\n" + + "\"city\":\"淄博\",\n" + + "\"province\":\"山东\",\n" + + "\"pcode\":\"SD\"\n" + + "},\n" + + "{\n" + + "\"code\":\"鲁D\",\n" + + "\"city\":\"枣庄\",\n" + + "\"province\":\"山东\",\n" + + "\"pcode\":\"SD\"\n" + + "},\n" + + "{\n" + + "\"code\":\"鲁E\",\n" + + "\"city\":\"东营\",\n" + + "\"province\":\"山东\",\n" + + "\"pcode\":\"SD\"\n" + + "},\n" + + "{\n" + + "\"code\":\"鲁F\",\n" + + "\"city\":\"烟台\",\n" + + "\"province\":\"山东\",\n" + + "\"pcode\":\"SD\"\n" + + "},\n" + + "{\n" + + "\"code\":\"鲁G\",\n" + + "\"city\":\"潍坊\",\n" + + "\"province\":\"山东\",\n" + + "\"pcode\":\"SD\"\n" + + "},\n" + + "{\n" + + "\"code\":\"鲁H\",\n" + + "\"city\":\"济宁\",\n" + + "\"province\":\"山东\",\n" + + "\"pcode\":\"SD\"\n" + + "},\n" + + "{\n" + + "\"code\":\"鲁J\",\n" + + "\"city\":\"泰安\",\n" + + "\"province\":\"山东\",\n" + + "\"pcode\":\"SD\"\n" + + "},\n" + + "{\n" + + "\"code\":\"鲁K\",\n" + + "\"city\":\"威海\",\n" + + "\"province\":\"山东\",\n" + + "\"pcode\":\"SD\"\n" + + "},\n" + + "{\n" + + "\"code\":\"鲁L\",\n" + + "\"city\":\"日照\",\n" + + "\"province\":\"山东\",\n" + + "\"pcode\":\"SD\"\n" + + "},\n" + + "{\n" + + "\"code\":\"鲁M\",\n" + + "\"city\":\"滨州\",\n" + + "\"province\":\"山东\",\n" + + "\"pcode\":\"SD\"\n" + + "},\n" + + "{\n" + + "\"code\":\"鲁N\",\n" + + "\"city\":\"德州\",\n" + + "\"province\":\"山东\",\n" + + "\"pcode\":\"SD\"\n" + + "},\n" + + "{\n" + + "\"code\":\"鲁p\",\n" + + "\"city\":\"聊城\",\n" + + "\"province\":\"山东\",\n" + + "\"pcode\":\"SD\"\n" + + "},\n" + + "{\n" + + "\"code\":\"鲁Q\",\n" + + "\"city\":\"临沂\",\n" + + "\"province\":\"山东\",\n" + + "\"pcode\":\"SD\"\n" + + "},\n" + + "{\n" + + "\"code\":\"鲁R\",\n" + + "\"city\":\"菏泽\",\n" + + "\"province\":\"山东\",\n" + + "\"pcode\":\"SD\"\n" + + "},\n" + + "{\n" + + "\"code\":\"鲁S\",\n" + + "\"city\":\"莱芜\",\n" + + "\"province\":\"山东\",\n" + + "\"pcode\":\"SD\"\n" + + "},\n" + + "{\n" + + "\"code\":\"鲁U\",\n" + + "\"city\":\"青岛增补\",\n" + + "\"province\":\"山东\",\n" + + "\"pcode\":\"SD\"\n" + + "},\n" + + "{\n" + + "\"code\":\"鲁V\",\n" + + "\"city\":\"潍坊增补\",\n" + + "\"province\":\"山东\",\n" + + "\"pcode\":\"SD\"\n" + + "},\n" + + "{\n" + + "\"code\":\"鲁Y\",\n" + + "\"city\":\"烟台\",\n" + + "\"province\":\"山东\",\n" + + "\"pcode\":\"SD\"\n" + + "},\n" + + "{\n" + + "\"code\":\"浙A\",\n" + + "\"city\":\"杭州\",\n" + + "\"province\":\"浙江\",\n" + + "\"pcode\":\"ZJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"浙B\",\n" + + "\"city\":\"宁波\",\n" + + "\"province\":\"浙江\",\n" + + "\"pcode\":\"ZJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"浙C\",\n" + + "\"city\":\"温州\",\n" + + "\"province\":\"浙江\",\n" + + "\"pcode\":\"ZJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"浙D\",\n" + + "\"city\":\"绍兴\",\n" + + "\"province\":\"浙江\",\n" + + "\"pcode\":\"ZJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"浙E\",\n" + + "\"city\":\"湖州\",\n" + + "\"province\":\"浙江\",\n" + + "\"pcode\":\"ZJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"浙F\",\n" + + "\"city\":\"嘉兴\",\n" + + "\"province\":\"浙江\",\n" + + "\"pcode\":\"ZJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"浙G\",\n" + + "\"city\":\"金华\",\n" + + "\"province\":\"浙江\",\n" + + "\"pcode\":\"ZJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"浙H\",\n" + + "\"city\":\"衢州\",\n" + + "\"province\":\"浙江\",\n" + + "\"pcode\":\"ZJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"浙J\",\n" + + "\"city\":\"台州\",\n" + + "\"province\":\"浙江\",\n" + + "\"pcode\":\"ZJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"浙K\",\n" + + "\"city\":\"丽水\",\n" + + "\"province\":\"浙江\",\n" + + "\"pcode\":\"ZJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"浙L\",\n" + + "\"city\":\"舟山\",\n" + + "\"province\":\"浙江\",\n" + + "\"pcode\":\"ZJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"桂A\",\n" + + "\"city\":\"南宁\",\n" + + "\"province\":\"广西\",\n" + + "\"pcode\":\"GX\"\n" + + "},\n" + + "{\n" + + "\"code\":\"桂B\",\n" + + "\"city\":\"柳州\",\n" + + "\"province\":\"广西\",\n" + + "\"pcode\":\"GX\"\n" + + "},\n" + + "{\n" + + "\"code\":\"桂C\",\n" + + "\"city\":\"桂林\",\n" + + "\"province\":\"广西\",\n" + + "\"pcode\":\"GX\"\n" + + "},\n" + + "{\n" + + "\"code\":\"桂D\",\n" + + "\"city\":\"梧州\",\n" + + "\"province\":\"广西\",\n" + + "\"pcode\":\"GX\"\n" + + "},\n" + + "{\n" + + "\"code\":\"桂E\",\n" + + "\"city\":\"北海\",\n" + + "\"province\":\"广西\",\n" + + "\"pcode\":\"GX\"\n" + + "},\n" + + "{\n" + + "\"code\":\"桂F\",\n" + + "\"city\":\"崇左\",\n" + + "\"province\":\"广西\",\n" + + "\"pcode\":\"GX\"\n" + + "},\n" + + "{\n" + + "\"code\":\"桂G\",\n" + + "\"city\":\"来宾\",\n" + + "\"province\":\"广西\",\n" + + "\"pcode\":\"GX\"\n" + + "},\n" + + "{\n" + + "\"code\":\"桂H\",\n" + + "\"city\":\"桂林地区\",\n" + + "\"province\":\"广西\",\n" + + "\"pcode\":\"GX\"\n" + + "},\n" + + "{\n" + + "\"code\":\"桂J\",\n" + + "\"city\":\"贺州\",\n" + + "\"province\":\"广西\",\n" + + "\"pcode\":\"GX\"\n" + + "},\n" + + "{\n" + + "\"code\":\"桂K\",\n" + + "\"city\":\"玉林\",\n" + + "\"province\":\"广西\",\n" + + "\"pcode\":\"GX\"\n" + + "},\n" + + "{\n" + + "\"code\":\"桂L\",\n" + + "\"city\":\"百色\",\n" + + "\"province\":\"广西\",\n" + + "\"pcode\":\"GX\"\n" + + "},\n" + + "{\n" + + "\"code\":\"桂M\",\n" + + "\"city\":\"河池\",\n" + + "\"province\":\"广西\",\n" + + "\"pcode\":\"GX\"\n" + + "},\n" + + "{\n" + + "\"code\":\"桂N\",\n" + + "\"city\":\"钦州\",\n" + + "\"province\":\"广西\",\n" + + "\"pcode\":\"GX\"\n" + + "},\n" + + "{\n" + + "\"code\":\"桂p\",\n" + + "\"city\":\"防城港\",\n" + + "\"province\":\"广西\",\n" + + "\"pcode\":\"GX\"\n" + + "},\n" + + "{\n" + + "\"code\":\"桂R\",\n" + + "\"city\":\"贵港\",\n" + + "\"province\":\"广西\",\n" + + "\"pcode\":\"GX\"\n" + + "},\n" + + "{\n" + + "\"code\":\"蒙A\",\n" + + "\"city\":\"呼和浩特\",\n" + + "\"province\":\"内蒙古\",\n" + + "\"pcode\":\"NMG\"\n" + + "},\n" + + "{\n" + + "\"code\":\"蒙B\",\n" + + "\"city\":\"包头\",\n" + + "\"province\":\"内蒙古\",\n" + + "\"pcode\":\"NMG\"\n" + + "},\n" + + "{\n" + + "\"code\":\"蒙C\",\n" + + "\"city\":\"乌海\",\n" + + "\"province\":\"内蒙古\",\n" + + "\"pcode\":\"NMG\"\n" + + "},\n" + + "{\n" + + "\"code\":\"蒙D\",\n" + + "\"city\":\"赤峰\",\n" + + "\"province\":\"内蒙古\",\n" + + "\"pcode\":\"NMG\"\n" + + "},\n" + + "{\n" + + "\"code\":\"蒙E\",\n" + + "\"city\":\"呼伦贝尔 \",\n" + + "\"province\":\"内蒙古\",\n" + + "\"pcode\":\"NMG\"\n" + + "},\n" + + "{\n" + + "\"code\":\"蒙F\",\n" + + "\"city\":\"兴安盟\",\n" + + "\"province\":\"内蒙古\",\n" + + "\"pcode\":\"NMG\"\n" + + "},\n" + + "{\n" + + "\"code\":\"蒙G\",\n" + + "\"city\":\"通辽\",\n" + + "\"province\":\"内蒙古\",\n" + + "\"pcode\":\"NMG\"\n" + + "},\n" + + "{\n" + + "\"code\":\"蒙H\",\n" + + "\"city\":\"锡林郭勒盟\",\n" + + "\"province\":\"内蒙古\",\n" + + "\"pcode\":\"NMG\"\n" + + "},\n" + + "{\n" + + "\"code\":\"蒙J\",\n" + + "\"city\":\"乌兰察布盟\",\n" + + "\"province\":\"内蒙古\",\n" + + "\"pcode\":\"NMG\"\n" + + "},\n" + + "{\n" + + "\"code\":\"蒙K\",\n" + + "\"city\":\"鄂尔多斯 \",\n" + + "\"province\":\"内蒙古\",\n" + + "\"pcode\":\"NMG\"\n" + + "},\n" + + "{\n" + + "\"code\":\"蒙L\",\n" + + "\"city\":\"巴彦淖尔盟\",\n" + + "\"province\":\"内蒙古\",\n" + + "\"pcode\":\"NMG\"\n" + + "},\n" + + "{\n" + + "\"code\":\"蒙M \",\n" + + "\"city\":\" 阿拉善盟\",\n" + + "\"province\":\"内蒙古\",\n" + + "\"pcode\":\"NMG\"\n" + + "},\n" + + "{\n" + + "\"code\":\"闽A\",\n" + + "\"city\":\"福州\",\n" + + "\"province\":\"福建\",\n" + + "\"pcode\":\"FJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"闽B\",\n" + + "\"city\":\"莆田\",\n" + + "\"province\":\"福建\",\n" + + "\"pcode\":\"FJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"闽C\",\n" + + "\"city\":\"泉州\",\n" + + "\"province\":\"福建\",\n" + + "\"pcode\":\"FJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"闽D\",\n" + + "\"city\":\"厦门\",\n" + + "\"province\":\"福建\",\n" + + "\"pcode\":\"FJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"闽E\",\n" + + "\"city\":\"漳州\",\n" + + "\"province\":\"福建\",\n" + + "\"pcode\":\"FJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"闽F\",\n" + + "\"city\":\"龙岩\",\n" + + "\"province\":\"福建\",\n" + + "\"pcode\":\"FJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"闽G\",\n" + + "\"city\":\"三明\",\n" + + "\"province\":\"福建\",\n" + + "\"pcode\":\"FJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"闽H\",\n" + + "\"city\":\"南平\",\n" + + "\"province\":\"福建\",\n" + + "\"pcode\":\"FJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"闽J\",\n" + + "\"city\":\"宁德\",\n" + + "\"province\":\"福建\",\n" + + "\"pcode\":\"FJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"闽K\",\n" + + "\"city\":\"直系统\",\n" + + "\"province\":\"福建\",\n" + + "\"pcode\":\"FJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"川A\",\n" + + "\"city\":\"成都\",\n" + + "\"province\":\"四川\",\n" + + "\"pcode\":\"SC\"\n" + + "},\n" + + "{\n" + + "\"code\":\"川B\",\n" + + "\"city\":\"绵阳\",\n" + + "\"province\":\"四川\",\n" + + "\"pcode\":\"SC\"\n" + + "},\n" + + "{\n" + + "\"code\":\"川C\",\n" + + "\"city\":\"自贡\",\n" + + "\"province\":\"四川\",\n" + + "\"pcode\":\"SC\"\n" + + "},\n" + + "{\n" + + "\"code\":\"川D\",\n" + + "\"city\":\"攀枝花\",\n" + + "\"province\":\"四川\",\n" + + "\"pcode\":\"SC\"\n" + + "},\n" + + "{\n" + + "\"code\":\"川E\",\n" + + "\"city\":\"泸州\",\n" + + "\"province\":\"四川\",\n" + + "\"pcode\":\"SC\"\n" + + "},\n" + + "{\n" + + "\"code\":\"川F\",\n" + + "\"city\":\"德阳\",\n" + + "\"province\":\"四川\",\n" + + "\"pcode\":\"SC\"\n" + + "},\n" + + "{\n" + + "\"code\":\"川H\",\n" + + "\"city\":\"广元\",\n" + + "\"province\":\"四川\",\n" + + "\"pcode\":\"SC\"\n" + + "},\n" + + "{\n" + + "\"code\":\"川J\",\n" + + "\"city\":\"遂宁\",\n" + + "\"province\":\"四川\",\n" + + "\"pcode\":\"SC\"\n" + + "},\n" + + "{\n" + + "\"code\":\"川K\",\n" + + "\"city\":\"内江\",\n" + + "\"province\":\"四川\",\n" + + "\"pcode\":\"SC\"\n" + + "},\n" + + "{\n" + + "\"code\":\"川L\",\n" + + "\"city\":\"乐山\",\n" + + "\"province\":\"四川\",\n" + + "\"pcode\":\"SC\"\n" + + "},\n" + + "{\n" + + "\"code\":\"川M\",\n" + + "\"city\":\"资阳\",\n" + + "\"province\":\"四川\",\n" + + "\"pcode\":\"SC\"\n" + + "},\n" + + "{\n" + + "\"code\":\"川Q\",\n" + + "\"city\":\"宜宾\",\n" + + "\"province\":\"四川\",\n" + + "\"pcode\":\"SC\"\n" + + "},\n" + + "{\n" + + "\"code\":\"川R\",\n" + + "\"city\":\"南充\",\n" + + "\"province\":\"四川\",\n" + + "\"pcode\":\"SC\"\n" + + "},\n" + + "{\n" + + "\"code\":\"川S\",\n" + + "\"city\":\"达州\",\n" + + "\"province\":\"四川\",\n" + + "\"pcode\":\"SC\"\n" + + "},\n" + + "{\n" + + "\"code\":\"川T\",\n" + + "\"city\":\"雅安\",\n" + + "\"province\":\"四川\",\n" + + "\"pcode\":\"SC\"\n" + + "},\n" + + "{\n" + + "\"code\":\"川U\",\n" + + "\"city\":\"阿坝藏族羌族自治州\",\n" + + "\"province\":\"四川\",\n" + + "\"pcode\":\"SC\"\n" + + "},\n" + + "{\n" + + "\"code\":\"川V\",\n" + + "\"city\":\"甘孜藏族自治州\",\n" + + "\"province\":\"四川\",\n" + + "\"pcode\":\"SC\"\n" + + "},\n" + + "{\n" + + "\"code\":\"川W\",\n" + + "\"city\":\"凉山彝族自治州\",\n" + + "\"province\":\"四川\",\n" + + "\"pcode\":\"SC\"\n" + + "},\n" + + "{\n" + + "\"code\":\"川X\",\n" + + "\"city\":\"广安\",\n" + + "\"province\":\"四川\",\n" + + "\"pcode\":\"SC\"\n" + + "},\n" + + "{\n" + + "\"code\":\"川Y\",\n" + + "\"city\":\"巴中\",\n" + + "\"province\":\"四川\",\n" + + "\"pcode\":\"SC\"\n" + + "},\n" + + "{\n" + + "\"code\":\"川Z\",\n" + + "\"city\":\"眉山\",\n" + + "\"province\":\"四川\",\n" + + "\"pcode\":\"SC\"\n" + + "},\n" + + "{\n" + + "\"code\":\"渝A\",\n" + + "\"city\":\"重庆区(江南)\",\n" + + "\"province\":\"重庆\",\n" + + "\"pcode\":\"ZQ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"渝B\",\n" + + "\"city\":\"重庆区(江北)\",\n" + + "\"province\":\"重庆\",\n" + + "\"pcode\":\"ZQ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"渝C\",\n" + + "\"city\":\"永川区\",\n" + + "\"province\":\"重庆\",\n" + + "\"pcode\":\"ZQ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"渝F\",\n" + + "\"city\":\"万州区\",\n" + + "\"province\":\"重庆\",\n" + + "\"pcode\":\"ZQ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"渝G\",\n" + + "\"city\":\"涪陵区\",\n" + + "\"province\":\"重庆\",\n" + + "\"pcode\":\"ZQ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"渝H\",\n" + + "\"city\":\"黔江区\",\n" + + "\"province\":\"重庆\",\n" + + "\"pcode\":\"ZQ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"津A\",\n" + + "\"city\":\"天津\",\n" + + "\"province\":\"天津\",\n" + + "\"pcode\":\"TJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"津B\",\n" + + "\"city\":\"天津\",\n" + + "\"province\":\"天津\",\n" + + "\"pcode\":\"TJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"津C\",\n" + + "\"city\":\"天津\",\n" + + "\"province\":\"天津\",\n" + + "\"pcode\":\"TJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"津D\",\n" + + "\"city\":\"天津\",\n" + + "\"province\":\"天津\",\n" + + "\"pcode\":\"TJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"津E\",\n" + + "\"city\":\"天津\",\n" + + "\"province\":\"天津\",\n" + + "\"pcode\":\"TJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"津F\",\n" + + "\"city\":\"天津\",\n" + + "\"province\":\"天津\",\n" + + "\"pcode\":\"TJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"津G\",\n" + + "\"city\":\"天津\",\n" + + "\"province\":\"天津\",\n" + + "\"pcode\":\"TJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"津H\",\n" + + "\"city\":\"天津\",\n" + + "\"province\":\"天津\",\n" + + "\"pcode\":\"TJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"云A\",\n" + + "\"city\":\"昆明\",\n" + + "\"province\":\"云南\",\n" + + "\"pcode\":\"YN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"云A-V\",\n" + + "\"city\":\"东川\",\n" + + "\"province\":\"云南\",\n" + + "\"pcode\":\"YN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"云C\",\n" + + "\"city\":\"昭通\",\n" + + "\"province\":\"云南\",\n" + + "\"pcode\":\"YN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"云D\",\n" + + "\"city\":\"曲靖\",\n" + + "\"province\":\"云南\",\n" + + "\"pcode\":\"YN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"云E\",\n" + + "\"city\":\"楚雄彝族自治州\",\n" + + "\"province\":\"云南\",\n" + + "\"pcode\":\"YN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"云F\",\n" + + "\"city\":\"玉溪\",\n" + + "\"province\":\"云南\",\n" + + "\"pcode\":\"YN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"云G\",\n" + + "\"city\":\"红河哈尼族彝族自治州\",\n" + + "\"province\":\"云南\",\n" + + "\"pcode\":\"YN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"云H\",\n" + + "\"city\":\"文山壮族苗族自治州\",\n" + + "\"province\":\"云南\",\n" + + "\"pcode\":\"YN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"云J\",\n" + + "\"city\":\"思茅\",\n" + + "\"province\":\"云南\",\n" + + "\"pcode\":\"YN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"云K\",\n" + + "\"city\":\"西双版纳傣族自治州\",\n" + + "\"province\":\"云南\",\n" + + "\"pcode\":\"YN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"云L\",\n" + + "\"city\":\"大理白族自治州\",\n" + + "\"province\":\"云南\",\n" + + "\"pcode\":\"YN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"云M\",\n" + + "\"city\":\"保山\",\n" + + "\"province\":\"云南\",\n" + + "\"pcode\":\"YN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"云N\",\n" + + "\"city\":\"德宏傣族景颇族自治州\",\n" + + "\"province\":\"云南\",\n" + + "\"pcode\":\"YN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"云p\",\n" + + "\"city\":\"丽江\",\n" + + "\"province\":\"云南\",\n" + + "\"pcode\":\"YN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"云Q\",\n" + + "\"city\":\"怒江傈僳族自治州\",\n" + + "\"province\":\"云南\",\n" + + "\"pcode\":\"YN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"云R\",\n" + + "\"city\":\"迪庆藏族自治州\",\n" + + "\"province\":\"云南\",\n" + + "\"pcode\":\"YN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"云S\",\n" + + "\"city\":\"临沧地区\",\n" + + "\"province\":\"云南\",\n" + + "\"pcode\":\"YN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"湘A \",\n" + + "\"city\":\"长沙\",\n" + + "\"province\":\"湖南\",\n" + + "\"pcode\":\"HN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"湘B\",\n" + + "\"city\":\"株洲\",\n" + + "\"province\":\"湖南\",\n" + + "\"pcode\":\"HN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"湘C\",\n" + + "\"city\":\"湘潭\",\n" + + "\"province\":\"湖南\",\n" + + "\"pcode\":\"HN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"湘D\",\n" + + "\"city\":\"衡阳\",\n" + + "\"province\":\"湖南\",\n" + + "\"pcode\":\"HN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"湘E\",\n" + + "\"city\":\"邵阳\",\n" + + "\"province\":\"湖南\",\n" + + "\"pcode\":\"HN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"湘F\",\n" + + "\"city\":\"岳阳\",\n" + + "\"province\":\"湖南\",\n" + + "\"pcode\":\"HN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"湘G\",\n" + + "\"city\":\"张家界\",\n" + + "\"province\":\"湖南\",\n" + + "\"pcode\":\"HN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"湘H\",\n" + + "\"city\":\"益阳\",\n" + + "\"province\":\"湖南\",\n" + + "\"pcode\":\"HN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"湘J\",\n" + + "\"city\":\"常德\",\n" + + "\"province\":\"湖南\",\n" + + "\"pcode\":\"HN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"湘K\",\n" + + "\"city\":\"娄底\",\n" + + "\"province\":\"湖南\",\n" + + "\"pcode\":\"HN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"湘L\",\n" + + "\"city\":\"郴州\",\n" + + "\"province\":\"湖南\",\n" + + "\"pcode\":\"HN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"湘M\",\n" + + "\"city\":\"永州\",\n" + + "\"province\":\"湖南\",\n" + + "\"pcode\":\"HN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"湘N\",\n" + + "\"city\":\"怀化\",\n" + + "\"province\":\"湖南\",\n" + + "\"pcode\":\"HN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"湘U\",\n" + + "\"city\":\"湘西土家族苗族自治州\",\n" + + "\"province\":\"湖南\",\n" + + "\"pcode\":\"HN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"新A\",\n" + + "\"city\":\"乌鲁木齐\",\n" + + "\"province\":\"新疆\",\n" + + "\"pcode\":\"XJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"新B\",\n" + + "\"city\":\"昌吉回族自治州\",\n" + + "\"province\":\"新疆\",\n" + + "\"pcode\":\"XJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"新C\",\n" + + "\"city\":\"石河子\",\n" + + "\"province\":\"新疆\",\n" + + "\"pcode\":\"XJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"新D\",\n" + + "\"city\":\"奎屯\",\n" + + "\"province\":\"新疆\",\n" + + "\"pcode\":\"XJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"新E\",\n" + + "\"city\":\"博尔塔拉蒙古自治州\",\n" + + "\"province\":\"新疆\",\n" + + "\"pcode\":\"XJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"新F\",\n" + + "\"city\":\"伊犁哈萨克自治州直辖县\",\n" + + "\"province\":\"新疆\",\n" + + "\"pcode\":\"XJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"新G\",\n" + + "\"city\":\"塔城\",\n" + + "\"province\":\"新疆\",\n" + + "\"pcode\":\"XJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"新H\",\n" + + "\"city\":\"阿勒泰\",\n" + + "\"province\":\"新疆\",\n" + + "\"pcode\":\"XJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"新J\",\n" + + "\"city\":\"克拉玛依\",\n" + + "\"province\":\"新疆\",\n" + + "\"pcode\":\"XJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"新K\",\n" + + "\"city\":\"吐鲁番\",\n" + + "\"province\":\"新疆\",\n" + + "\"pcode\":\"XJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"新L\",\n" + + "\"city\":\"哈密\",\n" + + "\"province\":\"新疆\",\n" + + "\"pcode\":\"XJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"新M\",\n" + + "\"city\":\"巴音郭愣蒙古自治州\",\n" + + "\"province\":\"新疆\",\n" + + "\"pcode\":\"XJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"新N\",\n" + + "\"city\":\"阿克苏\",\n" + + "\"province\":\"新疆\",\n" + + "\"pcode\":\"XJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"新p\",\n" + + "\"city\":\"克孜勒苏柯尔克孜自治州\",\n" + + "\"province\":\"新疆\",\n" + + "\"pcode\":\"XJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"新Q\",\n" + + "\"city\":\"喀什\",\n" + + "\"province\":\"新疆\",\n" + + "\"pcode\":\"XJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"新R\",\n" + + "\"city\":\"和田\",\n" + + "\"province\":\"新疆\",\n" + + "\"pcode\":\"XJ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"赣A\",\n" + + "\"city\":\"南昌\",\n" + + "\"province\":\"江西\",\n" + + "\"pcode\":\"JX\"\n" + + "},\n" + + "{\n" + + "\"code\":\"赣B\",\n" + + "\"city\":\"赣州\",\n" + + "\"province\":\"江西\",\n" + + "\"pcode\":\"JX\"\n" + + "},\n" + + "{\n" + + "\"code\":\"赣C\",\n" + + "\"city\":\"宜春\",\n" + + "\"province\":\"江西\",\n" + + "\"pcode\":\"JX\"\n" + + "},\n" + + "{\n" + + "\"code\":\"赣D\",\n" + + "\"city\":\"吉安\",\n" + + "\"province\":\"江西\",\n" + + "\"pcode\":\"JX\"\n" + + "},\n" + + "{\n" + + "\"code\":\"赣E\",\n" + + "\"city\":\"上饶\",\n" + + "\"province\":\"江西\",\n" + + "\"pcode\":\"JX\"\n" + + "},\n" + + "{\n" + + "\"code\":\"赣F\",\n" + + "\"city\":\"抚州\",\n" + + "\"province\":\"江西\",\n" + + "\"pcode\":\"JX\"\n" + + "},\n" + + "{\n" + + "\"code\":\"赣G\",\n" + + "\"city\":\"九江\",\n" + + "\"province\":\"江西\",\n" + + "\"pcode\":\"JX\"\n" + + "},\n" + + "{\n" + + "\"code\":\"赣H\",\n" + + "\"city\":\"景德镇\",\n" + + "\"province\":\"江西\",\n" + + "\"pcode\":\"JX\"\n" + + "},\n" + + "{\n" + + "\"code\":\"赣J\",\n" + + "\"city\":\"萍乡\",\n" + + "\"province\":\"江西\",\n" + + "\"pcode\":\"JX\"\n" + + "},\n" + + "{\n" + + "\"code\":\"赣K\",\n" + + "\"city\":\"新余\",\n" + + "\"province\":\"江西\",\n" + + "\"pcode\":\"JX\"\n" + + "},\n" + + "{\n" + + "\"code\":\"赣L\",\n" + + "\"city\":\"鹰潭\",\n" + + "\"province\":\"江西\",\n" + + "\"pcode\":\"JX\"\n" + + "},\n" + + "{\n" + + "\"code\":\"赣M\",\n" + + "\"city\":\"南昌,直系统\",\n" + + "\"province\":\"江西\",\n" + + "\"pcode\":\"JX\"\n" + + "},\n" + + "{\n" + + "\"code\":\"甘A\",\n" + + "\"city\":\"兰州\",\n" + + "\"province\":\"甘肃\",\n" + + "\"pcode\":\"GS\"\n" + + "},\n" + + "{\n" + + "\"code\":\"甘B\",\n" + + "\"city\":\"嘉峪关\",\n" + + "\"province\":\"甘肃\",\n" + + "\"pcode\":\"GS\"\n" + + "},\n" + + "{\n" + + "\"code\":\"甘C\",\n" + + "\"city\":\"金昌\",\n" + + "\"province\":\"甘肃\",\n" + + "\"pcode\":\"GS\"\n" + + "},\n" + + "{\n" + + "\"code\":\"甘D\",\n" + + "\"city\":\"白银\",\n" + + "\"province\":\"甘肃\",\n" + + "\"pcode\":\"GS\"\n" + + "},\n" + + "{\n" + + "\"code\":\"甘E\",\n" + + "\"city\":\"天水\",\n" + + "\"province\":\"甘肃\",\n" + + "\"pcode\":\"GS\"\n" + + "},\n" + + "{\n" + + "\"code\":\"甘F\",\n" + + "\"city\":\"酒泉\",\n" + + "\"province\":\"甘肃\",\n" + + "\"pcode\":\"GS\"\n" + + "},\n" + + "{\n" + + "\"code\":\"甘G\",\n" + + "\"city\":\"张掖\",\n" + + "\"province\":\"甘肃\",\n" + + "\"pcode\":\"GS\"\n" + + "},\n" + + "{\n" + + "\"code\":\"甘H\",\n" + + "\"city\":\"武威\",\n" + + "\"province\":\"甘肃\",\n" + + "\"pcode\":\"GS\"\n" + + "},\n" + + "{\n" + + "\"code\":\"甘J\",\n" + + "\"city\":\"定西\",\n" + + "\"province\":\"甘肃\",\n" + + "\"pcode\":\"GS\"\n" + + "},\n" + + "{\n" + + "\"code\":\"甘K\",\n" + + "\"city\":\"陇南\",\n" + + "\"province\":\"甘肃\",\n" + + "\"pcode\":\"GS\"\n" + + "},\n" + + "{\n" + + "\"code\":\"甘L\",\n" + + "\"city\":\"平凉\",\n" + + "\"province\":\"甘肃\",\n" + + "\"pcode\":\"GS\"\n" + + "},\n" + + "{\n" + + "\"code\":\"甘M\",\n" + + "\"city\":\"庆阳\",\n" + + "\"province\":\"甘肃\",\n" + + "\"pcode\":\"GS\"\n" + + "},\n" + + "{\n" + + "\"code\":\"甘N\",\n" + + "\"city\":\"临夏回族自治州\",\n" + + "\"province\":\"甘肃\",\n" + + "\"pcode\":\"GS\"\n" + + "},\n" + + "{\n" + + "\"code\":\"甘p\",\n" + + "\"city\":\"甘南藏族自治州\",\n" + + "\"province\":\"甘肃\",\n" + + "\"pcode\":\"GS\"\n" + + "},\n" + + "{\n" + + "\"code\":\"陕A\",\n" + + "\"city\":\"西安\",\n" + + "\"province\":\"陕西\",\n" + + "\"pcode\":\"SX\"\n" + + "},\n" + + "{\n" + + "\"code\":\"陕B\",\n" + + "\"city\":\"铜川\",\n" + + "\"province\":\"陕西\",\n" + + "\"pcode\":\"SX\"\n" + + "},\n" + + "{\n" + + "\"code\":\"陕C\",\n" + + "\"city\":\"宝鸡\",\n" + + "\"province\":\"陕西\",\n" + + "\"pcode\":\"SX\"\n" + + "},\n" + + "{\n" + + "\"code\":\"陕D\",\n" + + "\"city\":\"咸阳\",\n" + + "\"province\":\"陕西\",\n" + + "\"pcode\":\"SX\"\n" + + "},\n" + + "{\n" + + "\"code\":\"陕E\",\n" + + "\"city\":\"渭南\",\n" + + "\"province\":\"陕西\",\n" + + "\"pcode\":\"SX\"\n" + + "},\n" + + "{\n" + + "\"code\":\"陕F\",\n" + + "\"city\":\"汉中\",\n" + + "\"province\":\"陕西\",\n" + + "\"pcode\":\"SX\"\n" + + "},\n" + + "{\n" + + "\"code\":\"陕G\",\n" + + "\"city\":\"安康\",\n" + + "\"province\":\"陕西\",\n" + + "\"pcode\":\"SX\"\n" + + "},\n" + + "{\n" + + "\"code\":\"陕H\",\n" + + "\"city\":\"商洛\",\n" + + "\"province\":\"陕西\",\n" + + "\"pcode\":\"SX\"\n" + + "},\n" + + "{\n" + + "\"code\":\"陕J\",\n" + + "\"city\":\"延安\",\n" + + "\"province\":\"陕西\",\n" + + "\"pcode\":\"SX\"\n" + + "},\n" + + "{\n" + + "\"code\":\"陕K\",\n" + + "\"city\":\"榆林\",\n" + + "\"province\":\"陕西\",\n" + + "\"pcode\":\"SX\"\n" + + "},\n" + + "{\n" + + "\"code\":\"陕V\",\n" + + "\"city\":\"杨凌高新农业示范区\",\n" + + "\"province\":\"陕西\",\n" + + "\"pcode\":\"SX\"\n" + + "},\n" + + "{\n" + + "\"code\":\"贵A\",\n" + + "\"city\":\"贵阳\",\n" + + "\"province\":\"贵州\",\n" + + "\"pcode\":\"GZ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"贵B\",\n" + + "\"city\":\"六盘水\",\n" + + "\"province\":\"贵州\",\n" + + "\"pcode\":\"GZ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"贵C\",\n" + + "\"city\":\"遵义\",\n" + + "\"province\":\"贵州\",\n" + + "\"pcode\":\"GZ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"贵D\",\n" + + "\"city\":\"铜仁\",\n" + + "\"province\":\"贵州\",\n" + + "\"pcode\":\"GZ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"贵E\",\n" + + "\"city\":\"黔西南布依族苗族自治州\",\n" + + "\"province\":\"贵州\",\n" + + "\"pcode\":\"GZ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"贵F\",\n" + + "\"city\":\"毕节\",\n" + + "\"province\":\"贵州\",\n" + + "\"pcode\":\"GZ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"贵G\",\n" + + "\"city\":\"安顺\",\n" + + "\"province\":\"贵州\",\n" + + "\"pcode\":\"GZ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"贵H\",\n" + + "\"city\":\"黔东南苗族侗族自治州\",\n" + + "\"province\":\"贵州\",\n" + + "\"pcode\":\"GZ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"贵J\",\n" + + "\"city\":\"黔南布依族苗族自治州\",\n" + + "\"province\":\"贵州\",\n" + + "\"pcode\":\"GZ\"\n" + + "},\n" + + "{\n" + + "\"code\":\"青A\",\n" + + "\"city\":\"西宁\",\n" + + "\"province\":\"青海\",\n" + + "\"pcode\":\"QH\"\n" + + "},\n" + + "{\n" + + "\"code\":\"青B\",\n" + + "\"city\":\"海东\",\n" + + "\"province\":\"青海\",\n" + + "\"pcode\":\"QH\"\n" + + "},\n" + + "{\n" + + "\"code\":\"青C\",\n" + + "\"city\":\"海北藏族自治州\",\n" + + "\"province\":\"青海\",\n" + + "\"pcode\":\"QH\"\n" + + "},\n" + + "{\n" + + "\"code\":\"青D\",\n" + + "\"city\":\"黄南藏族自治州\",\n" + + "\"province\":\"青海\",\n" + + "\"pcode\":\"QH\"\n" + + "},\n" + + "{\n" + + "\"code\":\"青E\",\n" + + "\"city\":\"藏族自治州\",\n" + + "\"province\":\"青海\",\n" + + "\"pcode\":\"QH\"\n" + + "},\n" + + "{\n" + + "\"code\":\"青F\",\n" + + "\"city\":\"果洛藏族自治州\",\n" + + "\"province\":\"青海\",\n" + + "\"pcode\":\"QH\"\n" + + "},\n" + + "{\n" + + "\"code\":\"青G\",\n" + + "\"city\":\"玉树藏族自治州\",\n" + + "\"province\":\"青海\",\n" + + "\"pcode\":\"QH\"\n" + + "},\n" + + "{\n" + + "\"code\":\"青H\",\n" + + "\"city\":\"海西蒙古族藏族自治州\",\n" + + "\"province\":\"青海\",\n" + + "\"pcode\":\"QH\"\n" + + "},\n" + + "{\n" + + "\"code\":\"藏A\",\n" + + "\"city\":\"拉萨\",\n" + + "\"province\":\"西藏\",\n" + + "\"pcode\":\"XC\"\n" + + "},\n" + + "{\n" + + "\"code\":\"藏B\",\n" + + "\"city\":\"昌都地区\",\n" + + "\"province\":\"西藏\",\n" + + "\"pcode\":\"XC\"\n" + + "},\n" + + "{\n" + + "\"code\":\"藏C\",\n" + + "\"city\":\"山南地区\",\n" + + "\"province\":\"西藏\",\n" + + "\"pcode\":\"XC\"\n" + + "},\n" + + "{\n" + + "\"code\":\"藏D\",\n" + + "\"city\":\"日喀则地区\",\n" + + "\"province\":\"西藏\",\n" + + "\"pcode\":\"XC\"\n" + + "},\n" + + "{\n" + + "\"code\":\"藏E\",\n" + + "\"city\":\"那曲地区\",\n" + + "\"province\":\"西藏\",\n" + + "\"pcode\":\"XC\"\n" + + "},\n" + + "{\n" + + "\"code\":\"藏F\",\n" + + "\"city\":\"阿里地区\",\n" + + "\"province\":\"西藏\",\n" + + "\"pcode\":\"XC\"\n" + + "},\n" + + "{\n" + + "\"code\":\"藏G\",\n" + + "\"city\":\"林芝地区\",\n" + + "\"province\":\"西藏\",\n" + + "\"pcode\":\"XC\"\n" + + "},\n" + + "{\n" + + "\"code\":\"藏H\",\n" + + "\"city\":\"天全县车辆管理所\",\n" + + "\"province\":\"西藏\",\n" + + "\"pcode\":\"XC\"\n" + + "},\n" + + "{\n" + + "\"code\":\"藏J\",\n" + + "\"city\":\"格尔木车辆管理所\",\n" + + "\"province\":\"西藏\",\n" + + "\"pcode\":\"XC\"\n" + + "},\n" + + "{\n" + + "\"code\":\"琼A\",\n" + + "\"city\":\"海口\",\n" + + "\"province\":\"海南\",\n" + + "\"pcode\":\"HN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"琼B\",\n" + + "\"city\":\"三亚\",\n" + + "\"province\":\"海南\",\n" + + "\"pcode\":\"HN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"琼C\",\n" + + "\"city\":\"琼海\",\n" + + "\"province\":\"海南\",\n" + + "\"pcode\":\"HN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"琼D\",\n" + + "\"city\":\"五指山\",\n" + + "\"province\":\"海南\",\n" + + "\"pcode\":\"HN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"琼E\",\n" + + "\"city\":\"洋浦开发区\",\n" + + "\"province\":\"海南\",\n" + + "\"pcode\":\"HN\"\n" + + "},\n" + + "{\n" + + "\"code\":\"沪A\",\n" + + "\"city\":\"上海\",\n" + + "\"province\":\"上海\",\n" + + "\"pcode\":\"SH\"\n" + + "},\n" + + "{\n" + + "\"code\":\"沪B\",\n" + + "\"city\":\"上海\",\n" + + "\"province\":\"上海\",\n" + + "\"pcode\":\"SH\"\n" + + "},\n" + + "{\n" + + "\"code\":\"沪C\",\n" + + "\"city\":\"上海\",\n" + + "\"province\":\"上海\",\n" + + "\"pcode\":\"SH\"\n" + + "},\n" + + "{\n" + + "\"code\":\"沪D\",\n" + + "\"city\":\"上海\",\n" + + "\"province\":\"上海\",\n" + + "\"pcode\":\"SH\"\n" + + "},\n" + + "{\n" + + "\"code\":\"沪R\",\n" + + "\"city\":\"崇明、长兴、横沙\",\n" + + "\"province\":\"上海\",\n" + + "\"pcode\":\"SH\"\n" + + "}\n" + + "]}"; + String hp = num.substring(0, 2);// + JSONObject jsonObject = JSONObject.parseObject(jsonStr); + JSONArray data = jsonObject.getJSONArray("date"); + List<CarNumDto> carNumDtos = JSONObject.parseArray(data.toJSONString(), CarNumDto.class); + CarNumDto carNumDto = new CarNumDto(); + for (CarNumDto carNumDtoTemp : carNumDtos) { + if (carNumDtoTemp.getCode().equals(hp)) { + carNumDto.setCity(carNumDtoTemp.getCity()); + carNumDto.setCode(carNumDtoTemp.getCode()); + carNumDto.setProvince(carNumDtoTemp.getProvince()); + break; + } + } + return carNumDto; + + } + + +} \ No newline at end of file diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyController.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyController.java index 3c21884..48c30cf 100644 --- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyController.java +++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyController.java @@ -329,9 +329,17 @@ byId.setTwoAuditTime(LocalDateTime.now()); //如果parentId不为空,则将parentId对应的siteId改为现在的,并且将parenId对应的数据删除 + if (byId.getParentId()!=null) { + TAccountingStrategy one = accountingStrategyService.lambdaQuery().eq(TAccountingStrategy::getId, byId.getParentId()).one(); + byId.setSiteId(one.getSiteId()); + //将site表对应的模板id修改为新的这个 + Site byId1 = siteService.getById(one.getSiteId()); + byId1.setAccountingStrategyId(byId.getId()); + siteService.updateById(byId1); + } + //硬件 - //将site表对应的模板id修改为新的这个 } }else { diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyDetailController.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyDetailController.java index 35c031e..b87e9de 100644 --- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyDetailController.java +++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyDetailController.java @@ -91,7 +91,7 @@ * @param siteId * @return */ - @PostMapping("/getDetailBySiteId") + @GetMapping("/getDetailBySiteId") public R<TAccountingStrategyDetail> getDetailBySiteId(@RequestParam("siteId") Integer siteId){ Site site = siteService.getById(siteId); TAccountingStrategy accountingStrategy = accountingStrategyService.getById(site.getAccountingStrategyId()); @@ -105,8 +105,8 @@ * @param code 设备编号 * @return */ - @PostMapping("/getDetailByCode") - public R<TAccountingStrategyDetail> getDetailByPileId(@RequestParam("code") String code){ + @GetMapping("/getDetailByCode") + public R<TAccountingStrategyDetail> getDetailByCode(@RequestParam("code") String code){ // 查询桩 TChargingPile chargingPile = chargingPileService.getOne(Wrappers.lambdaQuery(TChargingPile.class) .eq(TChargingPile::getCode,code) @@ -149,7 +149,7 @@ * @param id * @return */ - @PostMapping("/getListByAccountingStrategyId") + @GetMapping("/getListByAccountingStrategyId") public R<List<TAccountingStrategyDetail>> getListByAccountingStrategyId(@RequestParam("id") Integer id){ List<TAccountingStrategyDetail> list = accountingStrategyDetailService.list(new LambdaQueryWrapper<TAccountingStrategyDetail>().eq(TAccountingStrategyDetail::getAccountingStrategyId, id)); return R.ok(list); @@ -160,7 +160,7 @@ * @param code * @return */ - @PostMapping("/t-accounting-strategy-detail/getDetailListByCode") + @GetMapping("/getDetailListByCode") public R<List<TAccountingStrategyDetail>> getDetailListByCode(@RequestParam("code") String code){ // 查询桩 TChargingPile chargingPile = chargingPileService.getOne(Wrappers.lambdaQuery(TChargingPile.class) diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TApplyChargingPileController.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TApplyChargingPileController.java index 3ea8ece..74e0baf 100644 --- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TApplyChargingPileController.java +++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TApplyChargingPileController.java @@ -367,9 +367,9 @@ @ApiOperation(value = "下载", tags = {"管理后台-结算表记录"}) @PutMapping("/downloadSettlement") @Log(title = "【结算表记录】下载结算表", businessType = BusinessType.EXPORT) - public R downloadSettlement(String uid,HttpServletResponse response) + public R downloadSettlement(@RequestBody ExportUidDto uid,HttpServletResponse response) { - TSettlementConfirm data = chargingOrderClient.downloadSettlement(uid).getData(); + TSettlementConfirm data = chargingOrderClient.downloadSettlement(uid.getUid()).getData(); List<Site> data1 = siteClient.getSiteByIds(Arrays.asList(data.getSiteId())).getData(); if (!data1.isEmpty()){ data.setSiteName(data1.get(0).getName()); diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TAccountingStrategyServiceImpl.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TAccountingStrategyServiceImpl.java index ad0bc26..39a7152 100644 --- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TAccountingStrategyServiceImpl.java +++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TAccountingStrategyServiceImpl.java @@ -46,11 +46,11 @@ SysUser data = sysUserClient.getSysUser(tAccountingStrategyVO.getUserId()).getData(); tAccountingStrategyVO.setUserName(data.getNickName()); if (tAccountingStrategyVO.getFirstUserId()!=null){ - SysUser first = sysUserClient.getSysUser(tAccountingStrategyVO.getUserId()).getData(); + SysUser first = sysUserClient.getSysUser(tAccountingStrategyVO.getFirstUserId()).getData(); tAccountingStrategyVO.setFirstUserName(first==null?null:first.getNickName()); } if (tAccountingStrategyVO.getTwoUserId()!=null){ - SysUser two = sysUserClient.getSysUser(tAccountingStrategyVO.getUserId()).getData(); + SysUser two = sysUserClient.getSysUser(tAccountingStrategyVO.getTwoUserId()).getData(); tAccountingStrategyVO.setTwoUserName(two==null?null:two.getNickName()); } // 匹配编辑后的未审核的 diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/constant/SendTagConstant.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/constant/SendTagConstant.java index 3c83fca..3062d45 100644 --- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/constant/SendTagConstant.java +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/constant/SendTagConstant.java @@ -19,6 +19,10 @@ */ public static final String END_CHARGE = "end_charge"; /** + * 错误报文 + */ + public static final String ERROR_MESSAGE = "error_message"; + /** * 计费模型验证请求 */ public static final String BILLING_MODE_VERIFY ="billing_mode_verify"; diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/controller/SendMessageController.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/controller/SendMessageController.java index 9a27b45..53b62e4 100644 --- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/controller/SendMessageController.java +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/controller/SendMessageController.java @@ -172,6 +172,16 @@ } /** + * 对时设置 + * @param timingSetting 实体对象 + * @return + */ + @PostMapping("/timingSetting") + public String timingSetting(@RequestBody TimingSetting timingSetting){ + return iotMessageProduce.sendMessage(timingSetting.getCharging_pile_code(), ServiceIdMenu.TIMING_SETTING.getKey(),messageUtil.timingSetting(timingSetting)); + } + + /** * 对时设置应答 * @param timingSettingReply 实体对象 * @return diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/enums/ServiceIdMenu.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/enums/ServiceIdMenu.java index 12ea9d4..5146187 100644 --- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/enums/ServiceIdMenu.java +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/enums/ServiceIdMenu.java @@ -67,6 +67,10 @@ */ WORKING_PARAMETER_SETTING ("充电桩工作参数设置","working_parameter_setting"), /** + * 对时设置 + */ + TIMING_SETTING ("对时设置","timing_setting"), + /** * 对时设置应答 */ TIMING_SETTING_REPLY ("对时设置应答","timing_setting_reply"), diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/api/IotInterfaceUtil.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/api/IotInterfaceUtil.java index 491377c..77aeab2 100644 --- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/api/IotInterfaceUtil.java +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/api/IotInterfaceUtil.java @@ -114,7 +114,7 @@ * 创建设备 * @param productId 产品ID * @param nodeId 设备标识码 通常使用IMEI、MAC地址或Serial No作为node_id - * @param deviceId 设备ID 使用CodeGenerateUtils.generateVolumeSn() + * @param deviceId 设备ID 使用设备标识码 * @param deviceName 设备名称 * @param description 设备描述 * @return AddDeviceResponse diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/listener/IotMessageListener.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/listener/IotMessageListener.java index 7125512..c29b1a2 100644 --- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/listener/IotMessageListener.java +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/listener/IotMessageListener.java @@ -5,6 +5,7 @@ import com.ruoyi.chargingPile.api.dto.CheckChargingStrategyDTO; import com.ruoyi.chargingPile.api.feignClient.AccountingStrategyDetailClient; import com.ruoyi.chargingPile.api.model.TAccountingStrategyDetail; +import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.integration.api.model.*; import com.ruoyi.integration.iotda.constant.SendTagConstant; @@ -17,15 +18,18 @@ import com.ruoyi.integration.rocket.produce.EnhanceProduce; import lombok.extern.slf4j.Slf4j; import org.apache.rocketmq.client.producer.SendResult; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import java.io.IOException; +import java.math.BigDecimal; import java.util.Date; import java.util.List; import java.util.Map; +import java.util.Objects; /** * iotda消息监听 @@ -63,7 +67,7 @@ String result; switch (service_id){ case SendTagConstant.ONLINE: - OnlineMessage onlineMessage = JSON.parseObject(jsonObject.toJSONString(),OnlineMessage.class); + OnlineMessage onlineMessage = JSON.parseObject(content.toJSONString(),OnlineMessage.class); sendResult = enhanceProduce.onlineMessage(onlineMessage); // 响应硬件 // 业务处理 登录认证应答 @@ -74,7 +78,7 @@ log.info("充电桩登录认证-返回结果:{}",result); break; case SendTagConstant.PING: - PingMessage pingMessage = JSON.parseObject(jsonObject.toJSONString(),PingMessage.class); + PingMessage pingMessage = JSON.parseObject(content.toJSONString(),PingMessage.class); sendResult = enhanceProduce.pingMessage(pingMessage); // 响应硬件 Pong pong = new Pong(); @@ -85,12 +89,17 @@ log.info("充电桩心跳包-返回结果:{}",result); break; case SendTagConstant.END_CHARGE: - EndChargeMessage endChargeMessage = JSON.parseObject(jsonObject.toJSONString(),EndChargeMessage.class); + EndChargeMessage endChargeMessage = JSON.parseObject(content.toJSONString(),EndChargeMessage.class); sendResult = enhanceProduce.endChargeMessage(endChargeMessage); // 响应硬件 break; + case SendTagConstant.ERROR_MESSAGE: + ErrorMessageMessage errorMessageMessage = JSON.parseObject(content.toJSONString(),ErrorMessageMessage.class); + sendResult = enhanceProduce.errorMessageMessage(errorMessageMessage); + // 响应硬件 + break; case SendTagConstant.BILLING_MODE_VERIFY: - BillingModeVerifyMessage billingModeVerifyMessage = JSON.parseObject(jsonObject.toJSONString(),BillingModeVerifyMessage.class); + BillingModeVerifyMessage billingModeVerifyMessage = JSON.parseObject(content.toJSONString(),BillingModeVerifyMessage.class); sendResult = enhanceProduce.billingModeVerifyMessage(billingModeVerifyMessage); // 响应硬件 BillingModeVerifyReply billingModeVerifyReply = new BillingModeVerifyReply(); @@ -102,7 +111,7 @@ }else { // 查询桩使用的模版 CheckChargingStrategyDTO dto = new CheckChargingStrategyDTO(); - dto.setCode(billingModeVerifyMessage.getBilling_model_code()); + dto.setCode(billingModeVerifyMessage.getCharging_pile_code()); dto.setStrategyDetailId(Integer.valueOf(billingModeVerifyMessage.getBilling_model_code())); Boolean check = accountingStrategyDetailClient.checkChargingStrategy(dto).getData(); // 校验计费模版是否准确 @@ -117,7 +126,7 @@ iotMessageProduce.sendMessage(deviceId, ServiceIdMenu.BILLING_MODE_VERIFY_REPLY.getKey(),messageUtil.billingModeVerifyReply(billingModeVerifyReply)); break; case SendTagConstant.ACQUISITION_BILLING_MODE: - AcquisitionBillingModeMessage acquisitionBillingModeMessage = JSON.parseObject(jsonObject.toJSONString(),AcquisitionBillingModeMessage.class); + AcquisitionBillingModeMessage acquisitionBillingModeMessage = JSON.parseObject(content.toJSONString(),AcquisitionBillingModeMessage.class); sendResult = enhanceProduce.acquisitionBillingModeMessage(acquisitionBillingModeMessage); // 响应硬件 计费模型请求应答 1=尖阶段,2=峰阶段,3=平阶段,4=谷阶段 List<TAccountingStrategyDetail> accountingStrategyDetails = accountingStrategyDetailClient.getDetailListByCode(acquisitionBillingModeMessage.getCharging_pile_code()).getData(); @@ -127,58 +136,70 @@ StrategyUtil.setStrategyPrice(strategyPrice,acquisitionBillingModeReply); // 时段设置 StrategyUtil.setTime(accountingStrategyDetails,acquisitionBillingModeReply); + TAccountingStrategyDetail accountingStrategyDetail = accountingStrategyDetailClient.getDetailByCode(acquisitionBillingModeMessage.getCharging_pile_code()).getData(); + acquisitionBillingModeReply.setBilling_model_code(accountingStrategyDetail.getId().toString()); + acquisitionBillingModeReply.setCharging_pile_code(acquisitionBillingModeMessage.getCharging_pile_code()); + acquisitionBillingModeReply.setLoss_ratio(BigDecimal.ZERO); iotMessageProduce.sendMessage(deviceId, ServiceIdMenu.ACQUISITION_BILLING_MODE_REPLY.getKey(),messageUtil.acquisitionBillingModeReply(acquisitionBillingModeReply)); break; case SendTagConstant.UPLOAD_REAL_TIME_MONITORING_DATA: - UploadRealTimeMonitoringDataMessage uploadRealTimeMonitoringDataMessage = JSON.parseObject(jsonObject.toJSONString(),UploadRealTimeMonitoringDataMessage.class); + UploadRealTimeMonitoringDataMessage uploadRealTimeMonitoringDataMessage = JSON.parseObject(content.toJSONString(),UploadRealTimeMonitoringDataMessage.class); sendResult = enhanceProduce.uploadRealTimeMonitoringDataMessage(uploadRealTimeMonitoringDataMessage); // 响应硬件 break; case SendTagConstant.CHARGING_HANDSHAKE: - ChargingHandshakeMessage chargingHandshakeMessage = JSON.parseObject(jsonObject.toJSONString(),ChargingHandshakeMessage.class); + ChargingHandshakeMessage chargingHandshakeMessage = JSON.parseObject(content.toJSONString(),ChargingHandshakeMessage.class); sendResult = enhanceProduce.chargingHandshakeMessage(chargingHandshakeMessage); // 响应硬件 break; case SendTagConstant.PARAMETER_SETTING: - ParameterSettingMessage parameterSettingMessage = JSON.parseObject(jsonObject.toJSONString(),ParameterSettingMessage.class); + ParameterSettingMessage parameterSettingMessage = JSON.parseObject(content.toJSONString(),ParameterSettingMessage.class); sendResult = enhanceProduce.parameterSettingMessage(parameterSettingMessage); break; case SendTagConstant.BMS_ABORT: - BmsAbortMessage bmsAbortMessage = JSON.parseObject(jsonObject.toJSONString(),BmsAbortMessage.class); + BmsAbortMessage bmsAbortMessage = JSON.parseObject(content.toJSONString(),BmsAbortMessage.class); sendResult = enhanceProduce.bmsAbortMessage(bmsAbortMessage); // 响应硬件 break; case SendTagConstant.MOTOR_ABORT: - MotorAbortMessage motorAbortMessage = JSON.parseObject(jsonObject.toJSONString(),MotorAbortMessage.class); + MotorAbortMessage motorAbortMessage = JSON.parseObject(content.toJSONString(),MotorAbortMessage.class); sendResult = enhanceProduce.motorAbortMessage(motorAbortMessage); break; case SendTagConstant.BMS_DEMAND_AND_CHARGER_EXPORTATION: - BmsDemandAndChargerExportationMessage bmsDemandAndChargerExportationMessage = JSON.parseObject(jsonObject.toJSONString(),BmsDemandAndChargerExportationMessage.class); + BmsDemandAndChargerExportationMessage bmsDemandAndChargerExportationMessage = JSON.parseObject(content.toJSONString(),BmsDemandAndChargerExportationMessage.class); sendResult = enhanceProduce.bmsDemandAndChargerExportationMessage(bmsDemandAndChargerExportationMessage); // 响应硬件 break; case SendTagConstant.BMS_INFORMATION: - BmsInformationMessage bmsInformationMessage = JSON.parseObject(jsonObject.toJSONString(),BmsInformationMessage.class); + BmsInformationMessage bmsInformationMessage = JSON.parseObject(content.toJSONString(),BmsInformationMessage.class); sendResult = enhanceProduce.bmsInformationMessage(bmsInformationMessage); // 响应硬件 break; case SendTagConstant.CHARGING_PILE_STARTS_CHARGING: - ChargingPileStartsChargingMessage chargingPileStartsChargingMessage = JSON.parseObject(jsonObject.toJSONString(),ChargingPileStartsChargingMessage.class); + ChargingPileStartsChargingMessage chargingPileStartsChargingMessage = JSON.parseObject(content.toJSONString(),ChargingPileStartsChargingMessage.class); sendResult = enhanceProduce.chargingPileStartsChargingMessage(chargingPileStartsChargingMessage); // 响应硬件 + PlatformConfirmationCharging platformConfirmationCharging = new PlatformConfirmationCharging(); + platformConfirmationCharging.setCharging_pile_code(chargingPileStartsChargingMessage.getCharging_pile_code()); + platformConfirmationCharging.setCharging_gun_code(chargingPileStartsChargingMessage.getCharging_gun_code()); + platformConfirmationCharging.setCard_number(chargingPileStartsChargingMessage.getAccount()); + platformConfirmationCharging.setAccount_balance(BigDecimal.ZERO); + platformConfirmationCharging.setAuthentication(1); + // TODO 若是失败,给出失败原因 + iotMessageProduce.sendMessage(deviceId, ServiceIdMenu.PLATFORM_CONFIRMATION_CHARGING.getKey(),messageUtil.platformConfirmationCharging(platformConfirmationCharging)); break; case SendTagConstant.PLATFORM_START_CHARGING_REPLY: - PlatformStartChargingReplyMessage platformStartChargingReplyMessage = JSON.parseObject(jsonObject.toJSONString(),PlatformStartChargingReplyMessage.class); + PlatformStartChargingReplyMessage platformStartChargingReplyMessage = JSON.parseObject(content.toJSONString(),PlatformStartChargingReplyMessage.class); sendResult = enhanceProduce.platformStartChargingReplyMessage(platformStartChargingReplyMessage); // 响应硬件 break; case SendTagConstant.PLATFORM_STOP_CHARGING_REPLY: - PlatformStopChargingReplyMessage platformStopChargingReplyMessage = JSON.parseObject(jsonObject.toJSONString(),PlatformStopChargingReplyMessage.class); + PlatformStopChargingReplyMessage platformStopChargingReplyMessage = JSON.parseObject(content.toJSONString(),PlatformStopChargingReplyMessage.class); sendResult = enhanceProduce.platformStopChargingReplyMessage(platformStopChargingReplyMessage); // 响应硬件 break; case SendTagConstant.TRANSACTION_RECORD: - TransactionRecordMessage transactionRecordMessage = JSON.parseObject(jsonObject.toJSONString(),TransactionRecordMessage.class); + TransactionRecordMessage transactionRecordMessage = JSON.parseObject(content.toJSONString(),TransactionRecordMessage.class); sendResult = enhanceProduce.transactionRecordMessage(transactionRecordMessage); // 响应硬件 ConfirmTransactionRecord confirmTransactionRecord = new ConfirmTransactionRecord(); @@ -187,27 +208,27 @@ iotMessageProduce.sendMessage(deviceId, ServiceIdMenu.CONFIRM_TRANSACTION_RECORD.getKey(),messageUtil.confirmTransactionRecord(confirmTransactionRecord)); break; case SendTagConstant.UPDATE_BALANCE_REPLY: - UpdateBalanceReplyMessage updateBalanceReplyMessage = JSON.parseObject(jsonObject.toJSONString(),UpdateBalanceReplyMessage.class); + UpdateBalanceReplyMessage updateBalanceReplyMessage = JSON.parseObject(content.toJSONString(),UpdateBalanceReplyMessage.class); sendResult = enhanceProduce.updateBalanceReplyMessage(updateBalanceReplyMessage); // 响应硬件 break; case SendTagConstant.SYNCHRONIZE_OFFLINE_CARD_REPLY: - SynchronizeOfflineCardReplyMessage synchronizeOfflineCardReplyMessage = JSON.parseObject(jsonObject.toJSONString(),SynchronizeOfflineCardReplyMessage.class); + SynchronizeOfflineCardReplyMessage synchronizeOfflineCardReplyMessage = JSON.parseObject(content.toJSONString(),SynchronizeOfflineCardReplyMessage.class); sendResult = enhanceProduce.synchronizeOfflineCardReplyMessage(synchronizeOfflineCardReplyMessage); // 响应硬件 break; case SendTagConstant.CLEAR_OFFLINE_CARD_REPLY: - ClearOfflineCardReplyMessage clearOfflineCardReplyMessage = JSON.parseObject(jsonObject.toJSONString(),ClearOfflineCardReplyMessage.class); + ClearOfflineCardReplyMessage clearOfflineCardReplyMessage = JSON.parseObject(content.toJSONString(),ClearOfflineCardReplyMessage.class); sendResult = enhanceProduce.clearOfflineCardReplyMessage(clearOfflineCardReplyMessage); // 响应硬件 break; case SendTagConstant.WORKING_PARAMETER_SETTING_REPLY: - WorkingParameterSettingReplyMessage workingParameterSettingReplyMessage = JSON.parseObject(jsonObject.toJSONString(),WorkingParameterSettingReplyMessage.class); + WorkingParameterSettingReplyMessage workingParameterSettingReplyMessage = JSON.parseObject(content.toJSONString(),WorkingParameterSettingReplyMessage.class); sendResult = enhanceProduce.workingParameterSettingReplyMessage(workingParameterSettingReplyMessage); // 响应硬件 break; case SendTagConstant.TIMING_SETTING: - TimingSettingMessage timingSettingMessage = JSON.parseObject(jsonObject.toJSONString(),TimingSettingMessage.class); + TimingSettingMessage timingSettingMessage = JSON.parseObject(content.toJSONString(),TimingSettingMessage.class); sendResult = enhanceProduce.timingSettingMessage(timingSettingMessage); // 响应硬件 对时设置应答 TimingSettingReply timingSettingReply = new TimingSettingReply(); @@ -216,27 +237,27 @@ iotMessageProduce.sendMessage(deviceId, ServiceIdMenu.TIMING_SETTING_REPLY.getKey(),messageUtil.timingSettingReply(timingSettingReply)); break; case SendTagConstant.SETUP_BILLING_MODEL_REPLY: - SetupBillingModelReplyMessage setupBillingModelReplyMessage = JSON.parseObject(jsonObject.toJSONString(),SetupBillingModelReplyMessage.class); + SetupBillingModelReplyMessage setupBillingModelReplyMessage = JSON.parseObject(content.toJSONString(),SetupBillingModelReplyMessage.class); sendResult = enhanceProduce.setupBillingModelReplyMessage(setupBillingModelReplyMessage); // 响应硬件 break; case SendTagConstant.GROUND_LOCK_REAL_TIME_DATA: - GroundLockRealTimeDataMessage groundLockRealTimeDataMessage = JSON.parseObject(jsonObject.toJSONString(),GroundLockRealTimeDataMessage.class); + GroundLockRealTimeDataMessage groundLockRealTimeDataMessage = JSON.parseObject(content.toJSONString(),GroundLockRealTimeDataMessage.class); sendResult = enhanceProduce.groundLockRealTimeDataMessage(groundLockRealTimeDataMessage); // 响应硬件 break; case SendTagConstant.CHARGING_PILE_RETURNS_GROUND_LOCK_DATA: - ChargingPileReturnsGroundLockDataMessage chargingPileReturnsGroundLockDataMessage = JSON.parseObject(jsonObject.toJSONString(),ChargingPileReturnsGroundLockDataMessage.class); + ChargingPileReturnsGroundLockDataMessage chargingPileReturnsGroundLockDataMessage = JSON.parseObject(content.toJSONString(),ChargingPileReturnsGroundLockDataMessage.class); sendResult = enhanceProduce.chargingPileReturnsGroundLockDataMessage(chargingPileReturnsGroundLockDataMessage); // 响应硬件 break; case SendTagConstant.PLATFORM_RESTART_REPLY: - PlatformRestartReplyMessage platformRestartReplyMessage = JSON.parseObject(jsonObject.toJSONString(),PlatformRestartReplyMessage.class); + PlatformRestartReplyMessage platformRestartReplyMessage = JSON.parseObject(content.toJSONString(),PlatformRestartReplyMessage.class); sendResult = enhanceProduce.platformRestartReplyMessage(platformRestartReplyMessage); // 响应硬件 break; default: - PlatformRemoteUpdateReplyMessage platformRemoteUpdateReplyMessage = JSON.parseObject(jsonObject.toJSONString(),PlatformRemoteUpdateReplyMessage.class); + PlatformRemoteUpdateReplyMessage platformRemoteUpdateReplyMessage = JSON.parseObject(content.toJSONString(),PlatformRemoteUpdateReplyMessage.class); sendResult = enhanceProduce.platformRemoteUpdateReplyMessage(platformRemoteUpdateReplyMessage); // 响应硬件 break; @@ -245,4 +266,63 @@ return AjaxResult.success(); } + @PostMapping(value = "/message/sendMessage") + public R sendMessage() { + // 运营平台远程控制启机 +// PlatformStartCharging platformStartCharging = new PlatformStartCharging(); +// platformStartCharging.setTransaction_serial_number("4200002375202409185150427245"); +// platformStartCharging.setCharging_pile_code("3401231001200202"); +// platformStartCharging.setCharging_gun_code("1"); +// platformStartCharging.setCard_number("1833063878153543681"); +// platformStartCharging.setAccount_balance(new BigDecimal(50)); +// String message = iotMessageProduce.sendMessage(platformStartCharging.getCharging_pile_code(), ServiceIdMenu.PLATFORM_START_CHARGING.getKey(), messageUtil.platformStartCharging(platformStartCharging)); + // 运营平台远程停机 +// PlatformStopCharging platformStopCharging = new PlatformStopCharging(); +// platformStopCharging.setCharging_pile_code("3401231001200202"); +// platformStopCharging.setCharging_gun_code("1"); +// String message = iotMessageProduce.sendMessage(platformStopCharging.getCharging_pile_code(), ServiceIdMenu.PLATFORM_STOP_CHARGING.getKey(),messageUtil.platformStopCharging(platformStopCharging)); + // 修改余额 +// UpdateBalance updateBalance = new UpdateBalance(); +// updateBalance.setCharging_pile_code("3401231001200202"); +// updateBalance.setCharging_gun_code("1"); +// updateBalance.setPhysical_card_number("1833063878153543681"); +// updateBalance.setAccount_balance(new BigDecimal(20)); +// String message = iotMessageProduce.sendMessage(updateBalance.getCharging_pile_code(), ServiceIdMenu.UPDATE_BALANCE.getKey(),messageUtil.updateBalance(updateBalance)); + // 充电桩工作参数设置 +// WorkingParameterSetting workingParameterSetting = new WorkingParameterSetting(); +// workingParameterSetting.setCharging_pile_code("3401231001200202"); +// workingParameterSetting.setAllow_work(0); +// workingParameterSetting.setMaximum_output_power(220); +// String message = iotMessageProduce.sendMessage(workingParameterSetting.getCharging_pile_code(), ServiceIdMenu.WORKING_PARAMETER_SETTING.getKey(),messageUtil.workingParameterSetting(workingParameterSetting)); + // 对时设置 +// TimingSetting timingSetting = new TimingSetting(); +// timingSetting.setCharging_pile_code("3401231001200202"); +// System.err.println(CP56Time2aConverter.convertToCP56Time2a(new Date())); +// timingSetting.setCurrent_time(CP56Time2aConverter.convertToCP56Time2a(new Date())); +// String message = iotMessageProduce.sendMessage(timingSetting.getCharging_pile_code(), ServiceIdMenu.TIMING_SETTING.getKey(),messageUtil.timingSetting(timingSetting)); + // TODO 罗 计费模型设置 +// SetupBillingModel setupBillingModel = new SetupBillingModel(); +// // 计费模型 +// List<TAccountingStrategyDetail> accountingStrategyDetails = accountingStrategyDetailClient.getDetailListByCode("3401231001200202").getData(); +// Map<Integer, TAccountingStrategyDetail> strategyPrice = StrategyUtil.getStrategyPrice(accountingStrategyDetails); +// // 价格设置 +// AcquisitionBillingModeReply acquisitionBillingModeReply = new AcquisitionBillingModeReply(); +// StrategyUtil.setStrategyPrice(strategyPrice,acquisitionBillingModeReply); +// // 时段设置 +// StrategyUtil.setTime(accountingStrategyDetails,acquisitionBillingModeReply); +// TAccountingStrategyDetail accountingStrategyDetail = accountingStrategyDetailClient.getDetailByCode("3401231001200202").getData(); +// acquisitionBillingModeReply.setBilling_model_code(accountingStrategyDetail.getId().toString()); +// acquisitionBillingModeReply.setCharging_pile_code("3401231001200202"); +// acquisitionBillingModeReply.setLoss_ratio(BigDecimal.ZERO); +// BeanUtils.copyProperties(acquisitionBillingModeReply,setupBillingModel); +// System.err.println(setupBillingModel); +// String message = iotMessageProduce.sendMessage(setupBillingModel.getCharging_pile_code(), ServiceIdMenu.SETUP_BILLING_MODEL.getKey(),messageUtil.setupBillingModel(setupBillingModel)); + // 远程重启 + PlatformRestart platformRestart = new PlatformRestart(); + platformRestart.setCharging_pile_code("3401231001200202"); + platformRestart.setOperate(2); + String message = iotMessageProduce.sendMessage(platformRestart.getCharging_pile_code(), ServiceIdMenu.PLATFORM_RESTART.getKey(),messageUtil.platformRestart(platformRestart)); + return R.ok(message); + } + } \ No newline at end of file diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/tools/MessageUtil.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/tools/MessageUtil.java index c7c76bd..5fdcac0 100644 --- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/tools/MessageUtil.java +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/tools/MessageUtil.java @@ -44,6 +44,8 @@ @Autowired private WorkingParameterSettingService workingParameterSettingService; @Autowired + private TimingSettingService timingSettingService; + @Autowired private TimingSettingReplyService timingSettingReplyService; @Autowired private SetupBillingModelService setupBillingModelService; @@ -205,6 +207,15 @@ } /** + * 对时设置 + * @param timingSetting 实体对象 + * @return + */ + public String timingSetting(TimingSetting timingSetting){ + timingSettingService.create(timingSetting); + return getMessageJsonString(timingSetting, ServiceIdMenu.TIMING_SETTING.getValue()); + } + /** * 对时设置应答 * @param timingSettingReply 实体对象 * @return diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/tools/StrategyUtil.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/tools/StrategyUtil.java index 4ebf980..e935937 100644 --- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/tools/StrategyUtil.java +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/tools/StrategyUtil.java @@ -67,8 +67,13 @@ } accountingStrategyDetails = accountingStrategyDetails.stream().sorted(Comparator.comparing(TAccountingStrategyDetail::getStartTime)).collect(Collectors.toList()); for (TAccountingStrategyDetail accountingStrategyDetail : accountingStrategyDetails) { - if(DateUtils.string2LocalTime(accountingStrategyDetail.getStartTime()).isBefore(time) - && DateUtils.string2LocalTime(accountingStrategyDetail.getEndTime()).isAfter(time)){ + String startTime = accountingStrategyDetail.getStartTime(); + String endTime = accountingStrategyDetail.getEndTime(); + if("00:00".equals(endTime)){ + endTime = "23:59"; + } + if(DateUtils.string2LocalTime(startTime + ":00").isBefore(time) + && DateUtils.string2LocalTime(endTime + ":00").isAfter(time)){ switch (i){ case 1: acquisitionBillingModeReply.setTime1(accountingStrategyDetail.getType().equals(1)?0 diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/mongodb/service/ErrorMessageMessageService.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/mongodb/service/ErrorMessageMessageService.java new file mode 100644 index 0000000..180eaa3 --- /dev/null +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/mongodb/service/ErrorMessageMessageService.java @@ -0,0 +1,8 @@ +package com.ruoyi.integration.mongodb.service; + +import com.ruoyi.integration.mongodb.base.BaseService; +import com.ruoyi.integration.rocket.model.ErrorMessageMessage; + +public interface ErrorMessageMessageService extends BaseService<ErrorMessageMessage> { + +} diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/mongodb/service/impl/ErrorMessageMessageServiceImpl.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/mongodb/service/impl/ErrorMessageMessageServiceImpl.java new file mode 100644 index 0000000..6443f1f --- /dev/null +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/mongodb/service/impl/ErrorMessageMessageServiceImpl.java @@ -0,0 +1,35 @@ +package com.ruoyi.integration.mongodb.service.impl; + +import com.ruoyi.integration.api.model.EndCharge; +import com.ruoyi.integration.iotda.constant.IotConstant; +import com.ruoyi.integration.mongodb.service.EndChargeService; +import com.ruoyi.integration.mongodb.service.ErrorMessageMessageService; +import com.ruoyi.integration.rocket.model.ErrorMessageMessage; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.stereotype.Service; + +import java.util.List; + + +@Service +public class ErrorMessageMessageServiceImpl implements ErrorMessageMessageService { + @Autowired + private MongoTemplate mongoTemplate; + + @Override + public int create(ErrorMessageMessage errorMessageMessage) { + mongoTemplate.save(errorMessageMessage); + return IotConstant.SUCCESS; + } + + @Override + public ErrorMessageMessage findById(String id) { + return mongoTemplate.findById(id, ErrorMessageMessage.class); + } + + @Override + public List<ErrorMessageMessage> findAll() { + return mongoTemplate.findAll(ErrorMessageMessage.class); + } +} diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/AcquisitionBillingModeMessageListener.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/AcquisitionBillingModeMessageListener.java index 6286373..0dc777d 100644 --- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/AcquisitionBillingModeMessageListener.java +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/AcquisitionBillingModeMessageListener.java @@ -52,14 +52,14 @@ BeanUtils.copyProperties(message,acquisitionBillingMode); acquisitionBillingModeService.create(acquisitionBillingMode); // 业务处理 计费模型请求应答 1=尖阶段,2=峰阶段,3=平阶段,4=谷阶段 - List<TAccountingStrategyDetail> accountingStrategyDetails = accountingStrategyDetailClient.getDetailListByCode(message.getCharging_pile_code()).getData(); - Map<Integer, TAccountingStrategyDetail> strategyPrice = StrategyUtil.getStrategyPrice(accountingStrategyDetails); - // 价格设置 - AcquisitionBillingModeReply acquisitionBillingModeReply = new AcquisitionBillingModeReply(); - StrategyUtil.setStrategyPrice(strategyPrice,acquisitionBillingModeReply); - // 时段设置 - StrategyUtil.setTime(accountingStrategyDetails,acquisitionBillingModeReply); - iotMessageProduce.sendMessage(acquisitionBillingModeReply.getCharging_pile_code(), ServiceIdMenu.ACQUISITION_BILLING_MODE_REPLY.getKey(),messageUtil.acquisitionBillingModeReply(acquisitionBillingModeReply)); +// List<TAccountingStrategyDetail> accountingStrategyDetails = accountingStrategyDetailClient.getDetailListByCode(message.getCharging_pile_code()).getData(); +// Map<Integer, TAccountingStrategyDetail> strategyPrice = StrategyUtil.getStrategyPrice(accountingStrategyDetails); +// // 价格设置 +// AcquisitionBillingModeReply acquisitionBillingModeReply = new AcquisitionBillingModeReply(); +// StrategyUtil.setStrategyPrice(strategyPrice,acquisitionBillingModeReply); +// // 时段设置 +// StrategyUtil.setTime(accountingStrategyDetails,acquisitionBillingModeReply); +// iotMessageProduce.sendMessage(acquisitionBillingModeReply.getCharging_pile_code(), ServiceIdMenu.ACQUISITION_BILLING_MODE_REPLY.getKey(),messageUtil.acquisitionBillingModeReply(acquisitionBillingModeReply)); } @Override diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/ErrorMessageMessageListener.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/ErrorMessageMessageListener.java new file mode 100644 index 0000000..8c67b98 --- /dev/null +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/ErrorMessageMessageListener.java @@ -0,0 +1,80 @@ +package com.ruoyi.integration.rocket.listener; + +import com.ruoyi.integration.mongodb.service.ErrorMessageMessageService; +import com.ruoyi.integration.rocket.model.ErrorMessageMessage; +import com.ruoyi.integration.rocket.util.EnhanceMessageHandler; +import lombok.extern.slf4j.Slf4j; +import org.apache.rocketmq.spring.annotation.MessageModel; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Slf4j +@Component +@RocketMQMessageListener( + messageModel = MessageModel.CLUSTERING, + consumerGroup = "charge_error_message", + topic = "charge_error_message", + selectorExpression = "error_message", + consumeThreadMax = 5 //默认是64个线程并发消息,配置 consumeThreadMax 参数指定并发消费线程数,避免太大导致资源不够 +) +public class ErrorMessageMessageListener extends EnhanceMessageHandler<ErrorMessageMessage> implements RocketMQListener<ErrorMessageMessage> { + + @Autowired + private ErrorMessageMessageService errorMessageMessageService; + + + @Override + protected void handleMessage(ErrorMessageMessage message) throws Exception { + // 此时这里才是最终的业务处理,代码只需要处理资源类关闭异常,其他的可以交给父类重试 + log.info("错误报文-业务消息处理:{}",message); + // 持久化消息 + ErrorMessageMessage errorMessageMessage = new ErrorMessageMessage(); + BeanUtils.copyProperties(message,errorMessageMessage); + errorMessageMessageService.create(errorMessageMessage); + // 业务处理 + } + + @Override + protected void handleMaxRetriesExceeded(ErrorMessageMessage message) { + // 当超过指定重试次数消息时此处方法会被调用 + // 生产中可以进行回退或其他业务操作 + log.error("消息消费失败,请执行后续处理"); + } + + + /** + * 是否执行重试机制 + */ + @Override + protected boolean isRetry() { + return true; + } + + @Override + protected boolean throwException() { + // 是否抛出异常,false搭配retry自行处理异常 + return false; + } + + /** + * 若需要处理消息过滤,在父级中进行统一处理,或者在此处实现之后,自行处理 + * @param message 待处理消息 + * @return true: 本次消息被过滤,false:不过滤 + */ + @Override + protected boolean filter(ErrorMessageMessage message) { + // 此处可做消息过滤 + return false; + } + + /** + * 监听消费消息,不需要执行业务处理,委派给父类做基础操作,父类做完基础操作后会调用子类的实际处理类型 + */ + @Override + public void onMessage(ErrorMessageMessage message) { + super.dispatchMessage(message); + } +} \ No newline at end of file diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/OnlineMessageListener.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/OnlineMessageListener.java index d5ca13f..496d44a 100644 --- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/OnlineMessageListener.java +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/OnlineMessageListener.java @@ -1,16 +1,10 @@ package com.ruoyi.integration.rocket.listener; import com.ruoyi.integration.api.model.Online; -import com.ruoyi.integration.api.model.OnlineReply; -import com.ruoyi.integration.iotda.enums.ServiceIdMenu; -import com.ruoyi.integration.iotda.utils.produce.IotMessageProduce; -import com.ruoyi.integration.iotda.utils.tools.MessageUtil; import com.ruoyi.integration.mongodb.service.OnlineService; -import com.ruoyi.integration.rocket.model.OnlineMessage; import com.ruoyi.integration.rocket.model.OnlineMessage; import com.ruoyi.integration.rocket.util.EnhanceMessageHandler; import lombok.extern.slf4j.Slf4j; -import org.apache.rocketmq.spring.annotation.MessageModel; import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; import org.apache.rocketmq.spring.core.RocketMQListener; import org.springframework.beans.BeanUtils; @@ -20,7 +14,6 @@ @Slf4j @Component @RocketMQMessageListener( - messageModel = MessageModel.CLUSTERING, consumerGroup = "charge_online", topic = "charge_online", selectorExpression = "online", // 明确指定标签 diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/PingMessageListener.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/PingMessageListener.java index dadb590..3b67a82 100644 --- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/PingMessageListener.java +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/PingMessageListener.java @@ -1,16 +1,12 @@ package com.ruoyi.integration.rocket.listener; -import com.ruoyi.integration.api.model.Online; import com.ruoyi.integration.api.model.Ping; -import com.ruoyi.integration.api.model.Pong; -import com.ruoyi.integration.iotda.enums.ServiceIdMenu; -import com.ruoyi.integration.iotda.utils.produce.IotMessageProduce; -import com.ruoyi.integration.iotda.utils.tools.MessageUtil; -import com.ruoyi.integration.mongodb.service.OnlineService; import com.ruoyi.integration.mongodb.service.PingService; +import com.ruoyi.integration.rocket.model.OnlineMessage; import com.ruoyi.integration.rocket.model.PingMessage; import com.ruoyi.integration.rocket.util.EnhanceMessageHandler; import lombok.extern.slf4j.Slf4j; +import org.apache.rocketmq.client.consumer.listener.MessageListener; import org.apache.rocketmq.spring.annotation.MessageModel; import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; import org.apache.rocketmq.spring.core.RocketMQListener; diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/TransactionRecordMessageListener.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/TransactionRecordMessageListener.java index f3a26e5..9019abf 100644 --- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/TransactionRecordMessageListener.java +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/TransactionRecordMessageListener.java @@ -9,6 +9,8 @@ import com.ruoyi.integration.mongodb.service.TransactionRecordService; import com.ruoyi.integration.rocket.model.TransactionRecordMessage; import com.ruoyi.integration.rocket.util.EnhanceMessageHandler; +import com.ruoyi.order.api.feignClient.ChargingOrderClient; +import com.ruoyi.order.api.model.TChargingOrder; import lombok.extern.slf4j.Slf4j; import org.apache.rocketmq.spring.annotation.MessageModel; import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; @@ -16,6 +18,8 @@ import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; + +import java.util.Objects; @Slf4j @Component @@ -31,9 +35,7 @@ @Autowired private TransactionRecordService transactionRecordService; @Autowired - private IotMessageProduce iotMessageProduce; - @Autowired - private MessageUtil messageUtil; + private ChargingOrderClient chargingOrderClient; @Override protected void handleMessage(TransactionRecordMessage message) throws Exception { // 此时这里才是最终的业务处理,代码只需要处理资源类关闭异常,其他的可以交给父类重试 @@ -43,6 +45,11 @@ BeanUtils.copyProperties(message,transactionRecord); transactionRecordService.create(transactionRecord); // 业务处理 + TChargingOrder chargingOrder = chargingOrderClient.getOrderByCode(message.getTransaction_serial_number()).getData(); + if(Objects.nonNull(chargingOrder)){ + chargingOrder.setTotalElectricity(message.getTotal_electricity()); + chargingOrderClient.updateChargingOrder(chargingOrder); + } } @Override diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/BmsDemandAndChargerExportationMessage.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/BmsDemandAndChargerExportationMessage.java index 8e958b7..f7ac9d4 100644 --- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/BmsDemandAndChargerExportationMessage.java +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/BmsDemandAndChargerExportationMessage.java @@ -22,7 +22,8 @@ private Integer bms_charging_mode; // BMS 充电模式(1:恒压充电;2:恒流充电) private BigDecimal bms_voltage_measurement_value; // BMS 充电电压测量值 private BigDecimal bms_current_measurement_value; // BMS 充电电流测量值 - private Integer bms_battery_voltage_and_group_number; // BMS 最高单体动力蓄电池电压及组号(1-12 位:最高单体动力蓄电池电压,数据分辨率:0.01 V/位,0 V 偏移量;数据范围:0~24 V;13-16 位:最高单体动力蓄电池电压所在组号,数据分辨率:1/位,0 偏移量;数据范围:0~15) + private BigDecimal bms_battery_voltage; // 最高电压 BMS 最高单体动力蓄电池电压及组号(1-12 位:最高单体动力蓄电池电压,数据分辨率:0.01 V/位,0 V 偏移量;数据范围:0~24 V;13-16 位:最高单体动力蓄电池电压所在组号,数据分辨率:1/位,0 偏移量;数据范围:0~15) + private Integer bms_group_number; // 所在组号 BMS 最高单体动力蓄电池电压及组号(1-12 位:最高单体动力蓄电池电压,数据分辨率:0.01 V/位,0 V 偏移量;数据范围:0~24 V;13-16 位:最高单体动力蓄电池电压所在组号,数据分辨率:1/位,0 偏移量;数据范围:0~15) private BigDecimal bms_charged_status; // BMS 当前荷电状态 SOC( %) private Integer bms_remaining_charging_time; // BMS 估算剩余充电时间 private BigDecimal voltage_output_value; // 电桩电压输出值 diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/EndChargeMessage.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/EndChargeMessage.java index 4cfaafa..7231ba4 100644 --- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/EndChargeMessage.java +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/EndChargeMessage.java @@ -18,8 +18,8 @@ private BigDecimal bms_battery_charging_status; // BMS 中止荷电状态 SOC private BigDecimal bms_minimum_battery_voltage; // BMS 动力蓄电池单体最低电压 private BigDecimal bms_maximum_battery_voltage; // BMS 动力蓄电池单体最高电压 - private Integer bms_minimum_battery_temperature; // BMS 动力蓄电池最低温度 - private Integer bms_maximum_battery_temperature; // BMS 动力蓄电池最高温度 + private BigDecimal bms_minimum_battery_temperature; // BMS 动力蓄电池最低温度 + private BigDecimal bms_maximum_battery_temperature; // BMS 动力蓄电池最高温度 private BigDecimal cumulative_charging_time; // 电桩累计充电时间 private BigDecimal output_energy; // 电桩输出能量 private String charger_code; // 电桩充电机编号 diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/ErrorMessageMessage.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/ErrorMessageMessage.java new file mode 100644 index 0000000..97f289e --- /dev/null +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/ErrorMessageMessage.java @@ -0,0 +1,35 @@ +package com.ruoyi.integration.rocket.model; + +import com.ruoyi.integration.rocket.base.BaseMessage; +import lombok.Data; + +@Data +public class ErrorMessageMessage extends BaseMessage { + + private String transaction_serial_number; // 交易流水号 + private String charging_pile_code; // 桩编码 + private String charging_gun_code; // 抢号 + private Integer charger_identification_0; // 接收 SPN2560=0x00 的充电机辨识报文超时(0=正常,1=超时,10=不可信状态) + private Integer charger_identification_170; // 接收 SPN2560=0xAA 的充电机辨识报文超时(0=正常,1=超时,10=不可信状态) + private String charger_identification_reserve; // 预留位 + private Integer time_synchronization_and_maximum_output_charger; // 接收充电机的时间同步和充电机最大输出能力报文超时(0=正常,1=超时,10=不可信状态) + private Integer charge_preparation; // 接收充电机完成充电准备报文超时(0=正常,1=超时,10=不可信状态) + private String charge_preparation_reserve; // 预留位 + private Integer charging_status; // 接收充电机充电状态报文超时(0=正常,1=超时,10=不可信状态) + private Integer stop_charging; // 接收充电机中止充电报文超时(0=正常,1=超时,10=不可信状态) + private String charge_reserve; // 预留位 + private Integer charging_statistics; // 接收充电机充电统计报文超时(0=正常,1=超时,10=不可信状态) + private String bms_other; // BMS 其他 + private Integer bms_and_vehicle_identification; // 接收 BMS 和车辆的辨识报文超时(0=正常,1=超时,10=不可信状态) + private String bms_and_vehicle_identification_reserve; // 预留位 + private Integer battery_charging_parameter; // 接收电池充电参数报文超时(0=正常,1=超时,10=不可信状态) + private Integer bms_completes_charging_preparation; // 接收 BMS 完成充电准备报文超时(0=正常,1=超时,10=不可信状态) + private String bms_completes_charging_preparation_reserve; // 预留位 + private Integer total_battery_charging_status; // 接收电池充电总状态报文超时(0=正常,1=超时,10=不可信状态) + private Integer battery_charging_requirements; // 接收电池充电要求报文超时(0=正常,1=超时,10=不可信状态) + private Integer bms_stop_charging; // 接收 BMS 中止充电报文超时(0=正常,1=超时,10=不可信状态) + private Integer bms_reserve; // 预留位 + private Integer bms_charging_statistics; // 接收 BMS 充电统计报文超时0=正常,1=超时,10=不可信状态) + private String charger_other; // 充电机其他 + +} diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/ParameterSettingMessage.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/ParameterSettingMessage.java index 9a40e77..6efffe2 100644 --- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/ParameterSettingMessage.java +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/ParameterSettingMessage.java @@ -21,7 +21,7 @@ private BigDecimal bms_maximum_charging_current; // BMS 最高允许充电电流 private BigDecimal bms_battery_total_energy; // BMS 动力蓄电池标称总能量 private BigDecimal bms_total_charging_voltage; // BMS 最高允许充电总电压 - private Integer bms_maximum_temperature; // BMS 最高允许温度 + private BigDecimal bms_maximum_temperature; // BMS 最高允许温度 private BigDecimal bms_battery_charging_status; // BMS 整车动力蓄电池荷电状态 (soc) private BigDecimal bms_battery_voltage; // BMS 整车动力蓄电池当前电池 电压 private BigDecimal maximum_output_voltage; // 电桩最高输出电压 diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/UploadRealTimeMonitoringDataMessage.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/UploadRealTimeMonitoringDataMessage.java index 8a8f765..dd1c034 100644 --- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/UploadRealTimeMonitoringDataMessage.java +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/UploadRealTimeMonitoringDataMessage.java @@ -22,10 +22,10 @@ private Integer insertion_status; // 是否插枪(0:否,1:是) private BigDecimal output_voltage; // 输出电压,精确到小数点后一位;待机置零 private BigDecimal output_current; // 输出电流,精确到小数点后一位;待机置零 - private Integer gun_line_temperature; // 枪线温度,整形,偏移量-50;待机置零 + private BigDecimal gun_line_temperature; // 枪线温度,整形,偏移量-50;待机置零 private String gun_line_code; // 枪线编码,没有置零 private Integer soc; // SOC待机置零;交流桩置零 - private Integer battery_temperature; // 电池组最高温度,整形,偏移量-50 ºC;待机置零;交流桩置零 + private BigDecimal battery_temperature; // 电池组最高温度,整形,偏移量-50 ºC;待机置零;交流桩置零 private Integer cumulative_charging_time; // 累计充电时间,单位:min;待机置零 private Integer time_remaining; // 剩余时间,单位:min;待机置零、交流桩置零 private BigDecimal charging_degree; // 充电度数,精确到小数点后四位;待机置零 diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/produce/EnhanceProduce.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/produce/EnhanceProduce.java index ba614a5..a3a2137 100644 --- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/produce/EnhanceProduce.java +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/produce/EnhanceProduce.java @@ -2,6 +2,7 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.ruoyi.integration.api.model.ErrorMessage; import com.ruoyi.integration.api.model.ParameterSetting; import com.ruoyi.integration.iotda.constant.SendTagConstant; import com.ruoyi.integration.rocket.model.*; @@ -55,6 +56,16 @@ message.setSource(SendTagConstant.END_CHARGE); return rocketMQEnhanceTemplate.send(TOPIC+SendTagConstant.END_CHARGE, SendTagConstant.END_CHARGE, message); } + /** + * 错误报文 + */ + public SendResult errorMessageMessage(ErrorMessageMessage message) { + // 设置业务key + message.setKey(UUID.randomUUID().toString()); + // 设置消息来源,便于查询 + message.setSource(SendTagConstant.ERROR_MESSAGE); + return rocketMQEnhanceTemplate.send(TOPIC+SendTagConstant.ERROR_MESSAGE, SendTagConstant.ERROR_MESSAGE, message); + } /** * 计费模型验证请求 diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/util/RocketMQEnhanceTemplate.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/util/RocketMQEnhanceTemplate.java index 69773c3..f54f22e 100644 --- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/util/RocketMQEnhanceTemplate.java +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/util/RocketMQEnhanceTemplate.java @@ -5,10 +5,12 @@ import com.ruoyi.integration.rocket.configuration.RocketEnhanceProperties; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.rocketmq.client.producer.DefaultMQProducer; import org.apache.rocketmq.client.producer.SendResult; import org.apache.rocketmq.spring.core.RocketMQTemplate; import org.apache.rocketmq.spring.support.RocketMQHeaders; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; import org.springframework.messaging.Message; import org.springframework.messaging.support.MessageBuilder; import org.springframework.util.StringUtils; @@ -24,9 +26,6 @@ private RocketEnhanceProperties rocketEnhanceProperties; public RocketMQTemplate getTemplate() { -// DefaultMQProducer producer = new DefaultMQProducer(); -// producer.setProducerGroup("enhance_consumer_group"); -// template.setProducer(producer); return template; } @@ -62,7 +61,7 @@ public <T extends BaseMessage> SendResult send(String destination, T message) { // 设置业务键,此处根据公共的参数进行处理 // 更多的其它基础业务处理... - Message<T> sendMessage = MessageBuilder.withPayload(message).setHeader(RocketMQHeaders.KEYS, message.getKey()).build(); + Message<T> sendMessage = MessageBuilder.withPayload(message).setHeader(RocketMQHeaders.TAGS, message.getKey()).build(); SendResult sendResult = template.syncSend(destination, sendMessage); // 此处为了方便查看给日志转了json,根据选择选择日志记录方式,例如ELK采集 log.info("[{}]同步消息[{}]发送结果[{}]", destination, JSONObject.toJSON(message), JSONObject.toJSON(sendResult)); @@ -77,7 +76,7 @@ } public <T extends BaseMessage> SendResult send(String destination, T message, int delayLevel) { - Message<T> sendMessage = MessageBuilder.withPayload(message).setHeader(RocketMQHeaders.KEYS, message.getKey()).build(); + Message<T> sendMessage = MessageBuilder.withPayload(message).setHeader(RocketMQHeaders.TAGS, message.getKey()).build(); SendResult sendResult = template.syncSend(destination, sendMessage, 3000, delayLevel); log.info("[{}]延迟等级[{}]消息[{}]发送结果[{}]", destination, delayLevel, JSONObject.toJSON(message), JSONObject.toJSON(sendResult)); return sendResult; diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TVipOrderController.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TVipOrderController.java index 1ad49f2..74c4dfc 100644 --- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TVipOrderController.java +++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TVipOrderController.java @@ -1,6 +1,7 @@ package com.ruoyi.order.controller; +import com.ruoyi.account.api.dto.GiveVipDto; import com.ruoyi.account.api.feignClient.AppUserClient; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.web.domain.AjaxResult; @@ -62,5 +63,27 @@ vipOrderService.removeBatchByIds(Arrays.asList(id.split(","))); return AjaxResult.success(); } + + @PostMapping("/callBack") + public R callBack(@RequestParam("code")String code,@RequestParam("outTradeNo")String outTradeNo){ + + TVipOrder one = vipOrderService.lambdaQuery().eq(TVipOrder::getCode, code).one(); + one.setSerialNumber(outTradeNo); + one.setPaymentStatus(2); + vipOrderService.updateById(one); + GiveVipDto giveVipDto = new GiveVipDto(); + giveVipDto.setVipId(one.getVipId()); + giveVipDto.setType(one.getVipType()); + giveVipDto.setUserIds(one.getAppUserId().toString()); + + + + appUserClient.giveVip(giveVipDto); + + return R.ok(); + + } + + } diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java index 633923e..3d0b7e4 100644 --- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java +++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java @@ -2059,7 +2059,7 @@ for (TChargingPile datum : data) { bigDecimal = bigDecimal.add(datum.getRatedPower()); } - BigDecimal bigDecimal1 = bigDecimal.divide(new BigDecimal(data.size())).setScale(2, RoundingMode.HALF_DOWN); + tSettlementConfirm.setIncome(tSettlementConfirm.getElectrovalence().add(tSettlementConfirm.getServiceCharge())); // todo 计算利用率 该电站充电桩本月利用率: diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderInvoiceServiceImpl.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderInvoiceServiceImpl.java index 6202b2e..9e9a60e 100644 --- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderInvoiceServiceImpl.java +++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderInvoiceServiceImpl.java @@ -37,6 +37,7 @@ import javax.annotation.Resource; import java.math.BigDecimal; import java.text.SimpleDateFormat; +import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; @@ -121,6 +122,7 @@ addOrderInvoice.setAppUserId(userId); addOrderInvoice.setCode(code); addOrderInvoice.setStatus(1); + addOrderInvoice.setCreateTime(LocalDateTime.now()); this.save(addOrderInvoice); //获取开票类型 TInvoiceType invoiceType = invoiceTypeClient.getInvoiceType(addOrderInvoice.getInvoiceTypeId()).getData(); @@ -260,6 +262,7 @@ PageInfo<TOrderInvoiceVO> pageInfo = new PageInfo<>(query.getPageCurr(),query.getPageSize()); List<TOrderInvoiceVO> list = this.baseMapper.pageList(query,pageInfo); for (TOrderInvoiceVO tOrderInvoiceVO : list) { + tOrderInvoiceVO.setUid(tOrderInvoiceVO.getId().toString()); List<Long> collect = orderInvoiceDetailService.lambdaQuery().eq(TOrderInvoiceDetail::getOrderInvoiceId, tOrderInvoiceVO.getId()) .eq(TOrderInvoiceDetail::getOrderType, 1).list().stream() .map(TOrderInvoiceDetail::getOrderId).collect(Collectors.toList()); diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TShoppingOrderServiceImpl.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TShoppingOrderServiceImpl.java index 89ce5e6..843efa2 100644 --- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TShoppingOrderServiceImpl.java +++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TShoppingOrderServiceImpl.java @@ -484,6 +484,7 @@ TShoppingOrder shoppingOrder = this.baseMapper.selectOne(Wrappers.lambdaQuery(TShoppingOrder.class).eq(TShoppingOrder::getCode, code)); shoppingOrder.setPaymentStatus(2); shoppingOrder.setSerialNumber(outTradeNo); + shoppingOrder.setPayTime(LocalDateTime.now()); this.updateById(shoppingOrder); //如果是优惠券,赠送优惠券 if (shoppingOrder.getOrderType()==2){ diff --git a/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml b/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml index 68c3b1d..3d2dba7 100644 --- a/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml +++ b/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml @@ -39,6 +39,7 @@ <result column="need_elec" property="needElec" /> <result column="create_time" property="createTime" /> <result column="del_flag" property="delFlag" /> + <result column="total_electricity" property="totalElectricity" /> </resultMap> <!-- 通用查询结果列 --> @@ -46,7 +47,7 @@ id, code, order_type, order_classification, app_user_id, app_user_car_id,site_id, parking_lot_id, charging_pile_id, charging_gun_id, start_time, end_time, status, recharge_amount, recharge_payment_type, recharge_payment_status, recharge_serial_number, order_amount, app_coupon_id, coupon_discount_amount, vip_discount, vip_discount_amount, payment_amount, refund_code, - refund_amount, refund_status, refund_serial_number, refund_time, create_time, del_flag,need_elec + refund_amount, refund_status, refund_serial_number, refund_time, create_time, del_flag,need_elec,total_electricity </sql> @@ -200,7 +201,7 @@ <if test="data.createTime2 != null"> AND o.create_time <= #{data.createTime2} </if> - <if test="data.ids != null and data.ids() > 0"> + <if test="data.ids != null and data.ids.size() > 0"> AND o.id IN <foreach collection="data.ids" item="id" open="(" separator="," close=")"> #{id} diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TCompanyController.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TCompanyController.java index c5e604a..d355f5c 100644 --- a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TCompanyController.java +++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TCompanyController.java @@ -50,5 +50,10 @@ public R delete(@RequestParam("id") Integer id) { return R.ok(companyService.removeById(id)); } + + @PostMapping(value = "/unit/detail") + public R detail(@RequestParam("id") Integer id) { + return R.ok(companyService.getById(id)); + } } diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TEnterpriseUserApplicationController.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TEnterpriseUserApplicationController.java index 830e8fb..8be32f5 100644 --- a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TEnterpriseUserApplicationController.java +++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TEnterpriseUserApplicationController.java @@ -67,19 +67,19 @@ @ApiOperation(tags = {"后台-申请表单-集团用户"},value = "集团用户列表") @PostMapping(value = "/page") - public R<Page<TEnterpriseUserApplication>> page(EnterpriseQuery enterpriseQuery) { + public R<Page<TEnterpriseUserApplication>> page(@RequestBody EnterpriseQuery enterpriseQuery) { // 用户id - if (enterpriseQuery.getPhone()!=null) { - List<Long> userIds = appUserClient.getUserIdsByPhone(enterpriseQuery.getPhone()).getData(); - if (userIds.isEmpty()){ - return R.ok(); - } - Page<TEnterpriseUserApplication> page = enterpriseUserApplicationService.lambdaQuery().in(TEnterpriseUserApplication::getAppUserId, userIds).page(Page.of(enterpriseQuery.getPageCurr(), enterpriseQuery.getPageSize())); - return R.ok(page); - }else { - Page<TEnterpriseUserApplication> page = enterpriseUserApplicationService.lambdaQuery().page(Page.of(enterpriseQuery.getPageCurr(), enterpriseQuery.getPageSize())); +// if (enterpriseQuery.getPhone()!=null) { +// List<Long> userIds = appUserClient.getUserIdsByPhone(enterpriseQuery.getPhone()).getData(); +// if (userIds.isEmpty()){ +// return R.ok(); +// } +// Page<TEnterpriseUserApplication> page = enterpriseUserApplicationService.lambdaQuery().in(TEnterpriseUserApplication::getAppUserId, userIds).page(Page.of(enterpriseQuery.getPageCurr(), enterpriseQuery.getPageSize())); +// return R.ok(page); +// }else { + Page<TEnterpriseUserApplication> page = enterpriseUserApplicationService.lambdaQuery().eq(enterpriseQuery.getPhone()!=null&&enterpriseQuery.getPhone()!="",TEnterpriseUserApplication::getPhone,enterpriseQuery.getPhone()).page(Page.of(enterpriseQuery.getPageCurr(), enterpriseQuery.getPageSize())); return R.ok(page); - } +// } } diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TVipController.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TVipController.java index b3e8971..5bb53f0 100644 --- a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TVipController.java +++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TVipController.java @@ -180,6 +180,7 @@ vipInfoDto.setDoubleIntegration(vip.getDoubleIntegration()); vipInfoDto.setMallExclusivePrice(vip.getMallExclusivePrice()); vipInfoDto.setName(vip.getName()); + vipInfoDto.setId(vip.getId()); List<SendCouponDto> javaList = JSON.parseArray(vip.getCoupon()).toJavaList(SendCouponDto.class); List<VipCouponDto> vipCouponDtos = new ArrayList<>(); if (!javaList.isEmpty()){ @@ -215,8 +216,8 @@ @ApiOperation(value = "购买会员", tags = {"小程序-个人中心"}) @GetMapping("/vipInfo/pay") - public R vipInfoPay(@RequestParam("vipId")Integer vipId,@RequestParam(name = "1月2季3年",value = "buyType") Integer buyType, - @RequestParam(name = "1微信2支付宝",value = "payType") Integer payType + public R vipInfoPay(@RequestParam("vipId")Integer vipId,@RequestParam("buyType") Integer buyType, + @RequestParam("payType") Integer payType ) { TVip byId = vipService.getById(vipId); diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TVipServiceImpl.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TVipServiceImpl.java index 369b371..0bad395 100644 --- a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TVipServiceImpl.java +++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TVipServiceImpl.java @@ -12,6 +12,8 @@ import com.ruoyi.order.api.model.TVipOrder; import com.ruoyi.other.api.domain.TCoupon; import com.ruoyi.other.api.domain.TVip; +import com.ruoyi.other.api.feignClient.OtherClient; +import com.ruoyi.other.api.feignClient.VipClient; import com.ruoyi.other.mapper.TCouponMapper; import com.ruoyi.other.mapper.TVipMapper; import com.ruoyi.other.service.TVipService; @@ -80,17 +82,30 @@ return pageInfo; } + @Resource + private VipClient vipClient; @Override public Object vipInfoPay(TVip byId, BigDecimal payMoney, Integer payType,BigDecimal discountMoney,BigDecimal discount,Integer buyType, Long userId) { TAppUser user = appUserClient.getUserById(userId).getData(); + //生成会员购买订单 TVipOrder shopOrder = new TVipOrder(); shopOrder.setCode(OrderCodeUtil.getOrderCode("HY")); + shopOrder.setType(1); + shopOrder.setAppUserId(userId); shopOrder.setType(1); shopOrder.setVipId(byId.getId()); + shopOrder.setTitle(byId.getName()); + if (buyType==1){ + shopOrder.setTitle(byId.getName()+"月卡"); + }else if (buyType==2){ + shopOrder.setTitle(byId.getName()+"季卡"); + }else { + shopOrder.setTitle(byId.getName()+"年卡"); + } shopOrder.setVipType(buyType); shopOrder.setOrderAmount(payMoney.add(discountMoney)); shopOrder.setDiscount(discount); @@ -109,7 +124,7 @@ paymentOrder.setAmount(shopOrder.getPaymentAmount()); paymentOrder.setOpenId(user.getWxOpenid()); paymentOrder.setDescription("购买会员"); - return wxPaymentClient.orderPay(paymentOrder); + return wxPaymentClient.orderPay(paymentOrder).getData(); }else { AliPaymentReq req = new AliPaymentReq(); req.setOutTradeNo(shopOrder.getCode()); diff --git a/ruoyi-service/ruoyi-payment/src/main/java/com/ruoyi/payment/controller/WxPayController.java b/ruoyi-service/ruoyi-payment/src/main/java/com/ruoyi/payment/controller/WxPayController.java index d79f29b..6c834a0 100644 --- a/ruoyi-service/ruoyi-payment/src/main/java/com/ruoyi/payment/controller/WxPayController.java +++ b/ruoyi-service/ruoyi-payment/src/main/java/com/ruoyi/payment/controller/WxPayController.java @@ -129,6 +129,8 @@ System.err.println("----收到购物回调"); break; case "HY": + orderClient.vipCallBack(out_trade_no,outRefundNo); + System.err.println("----收到会员回调"); break; } diff --git a/ruoyi-service/ruoyi-payment/src/main/resources/bootstrap.yml b/ruoyi-service/ruoyi-payment/src/main/resources/bootstrap.yml index f72b520..fe9bde5 100644 --- a/ruoyi-service/ruoyi-payment/src/main/resources/bootstrap.yml +++ b/ruoyi-service/ruoyi-payment/src/main/resources/bootstrap.yml @@ -24,7 +24,6 @@ namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb username: nacos password: nacos - ip: 192.168.110.85 config: # 配置中心地址 server-addr: 192.168.110.169:8848 -- Gitblit v1.7.1