Merge branch 'dev-new' into dev

This commit is contained in:
Guoqs
2025-01-08 08:30:41 +08:00
8 changed files with 748 additions and 682 deletions

View File

@@ -14,7 +14,6 @@ import com.jsowell.common.response.RestApiResponse;
import com.jsowell.common.util.StringUtils; import com.jsowell.common.util.StringUtils;
import com.jsowell.common.util.poi.ExcelUtil; import com.jsowell.common.util.poi.ExcelUtil;
import com.jsowell.pile.domain.PileStationInfo; import com.jsowell.pile.domain.PileStationInfo;
import com.jsowell.pile.domain.ThirdPartySettingInfo;
import com.jsowell.pile.domain.ThirdpartyParkingConfig; import com.jsowell.pile.domain.ThirdpartyParkingConfig;
import com.jsowell.pile.dto.FastCreateStationDTO; import com.jsowell.pile.dto.FastCreateStationDTO;
import com.jsowell.pile.dto.PushStationInfoDTO; import com.jsowell.pile.dto.PushStationInfoDTO;
@@ -48,74 +47,74 @@ import java.util.stream.Collectors;
@RestController @RestController
@RequestMapping("/pile/station") @RequestMapping("/pile/station")
public class PileStationInfoController extends BaseController { public class PileStationInfoController extends BaseController {
@Autowired @Autowired
private PileStationInfoService pileStationInfoService; private PileStationInfoService pileStationInfoService;
@Autowired @Autowired
private PileService pileService; private PileService pileService;
@Autowired @Autowired
private ThirdPartySettingInfoService thirdPartySettingInfoService; private ThirdPartySettingInfoService thirdPartySettingInfoService;
@Autowired @Autowired
private CommonService commonService; private CommonService commonService;
@Autowired @Autowired
private AMapService aMapService; private AMapService aMapService;
@Autowired @Autowired
private ThirdPartyStationRelationService thirdPartyStationRelationService; private ThirdPartyStationRelationService thirdPartyStationRelationService;
@Autowired @Autowired
private ThirdPartyParkingConfigService parkingConfigService; private ThirdPartyParkingConfigService parkingConfigService;
/** /**
* 查询充电站信息列表NEW * 查询充电站信息列表NEW
*/ */
@PreAuthorize("@ss.hasPermi('pile:station:list')") @PreAuthorize("@ss.hasPermi('pile:station:list')")
@GetMapping("/list") @GetMapping("/list")
public TableDataInfo list(QueryStationDTO queryStationDTO) { public TableDataInfo list(QueryStationDTO queryStationDTO) {
startPage(); startPage();
// List<PileStationInfo> list = pileStationInfoService.selectPileStationInfoList(pileStationInfo); // List<PileStationInfo> list = pileStationInfoService.selectPileStationInfoList(pileStationInfo);
List<PileStationVO> list = pileStationInfoService.queryStationInfos(queryStationDTO); List<PileStationVO> list = pileStationInfoService.queryStationInfos(queryStationDTO);
return getDataTable(list); return getDataTable(list);
} }
/** /**
* 查询充电站下拉列表 * 查询充电站下拉列表
*/ */
@PreAuthorize("@ss.hasPermi('pile:station:list')") @PreAuthorize("@ss.hasPermi('pile:station:list')")
@GetMapping("/StationSelectList") @GetMapping("/StationSelectList")
public TableDataInfo getStationSelectList(QueryStationDTO dto) { public TableDataInfo getStationSelectList(QueryStationDTO dto) {
logger.info("dto:{}", JSON.toJSONString(dto)); logger.info("dto:{}", JSON.toJSONString(dto));
startPage(); startPage();
List<PileStationVO> list = pileStationInfoService.getStationSelectList(dto); List<PileStationVO> list = pileStationInfoService.getStationSelectList(dto);
return getDataTable(list); return getDataTable(list);
} }
/** /**
* 快速建站接口 * 快速建站接口
*/ */
// @PreAuthorize("@ss.hasPermi('pile:station:add')") // @PreAuthorize("@ss.hasPermi('pile:station:add')")
@PostMapping("/fastCreateStation") @PostMapping("/fastCreateStation")
public AjaxResult fastCreateStation(@RequestBody FastCreateStationDTO dto) { public AjaxResult fastCreateStation(@RequestBody FastCreateStationDTO dto) {
logger.info("快速建站接口 param:{}", JSON.toJSONString(dto)); logger.info("快速建站接口 param:{}", JSON.toJSONString(dto));
int i = 0; int i = 0;
try { try {
i = pileStationInfoService.fastCreateStation(dto); i = pileStationInfoService.fastCreateStation(dto);
} catch (BusinessException e) { } catch (BusinessException e) {
logger.warn("快速建站接口 warn", e); logger.warn("快速建站接口 warn", e);
} catch (Exception e) { } catch (Exception e) {
logger.error("快速建站接口 error", e); logger.error("快速建站接口 error", e);
} }
return toAjax(i); return toAjax(i);
} }
/** /**
* 查询充电站信息列表 * 查询充电站信息列表
*/ */
/*@PreAuthorize("@ss.hasPermi('pile:station:list')") /*@PreAuthorize("@ss.hasPermi('pile:station:list')")
@GetMapping("/list") @GetMapping("/list")
public TableDataInfo list(PileStationInfo pileStationInfo) { public TableDataInfo list(PileStationInfo pileStationInfo) {
@@ -124,272 +123,278 @@ public class PileStationInfoController extends BaseController {
return getDataTable(list); return getDataTable(list);
}*/ }*/
/** /**
* 导出充电站信息列表 * 导出充电站信息列表
*/ */
@PreAuthorize("@ss.hasPermi('pile:station:export')") @PreAuthorize("@ss.hasPermi('pile:station:export')")
@Log(title = "充电站信息", businessType = BusinessType.EXPORT) @Log(title = "充电站信息", businessType = BusinessType.EXPORT)
@PostMapping("/export") @PostMapping("/export")
public void export(HttpServletResponse response, PileStationInfo pileStationInfo) { public void export(HttpServletResponse response, PileStationInfo pileStationInfo) {
List<PileStationInfo> list = pileStationInfoService.selectPileStationInfoList(pileStationInfo); List<PileStationInfo> list = pileStationInfoService.selectPileStationInfoList(pileStationInfo);
ExcelUtil<PileStationInfo> util = new ExcelUtil<PileStationInfo>(PileStationInfo.class); ExcelUtil<PileStationInfo> util = new ExcelUtil<PileStationInfo>(PileStationInfo.class);
util.exportExcel(response, list, "充电站信息数据"); util.exportExcel(response, list, "充电站信息数据");
} }
/** /**
* 获取充电站信息详细信息 * 获取充电站信息详细信息
*/ */
@PreAuthorize("@ss.hasPermi('pile:station:query')") @PreAuthorize("@ss.hasPermi('pile:station:query')")
@GetMapping(value = "/{id}") @GetMapping(value = "/{id}")
public AjaxResult getInfo(@PathVariable("id") Long id) { public AjaxResult getInfo(@PathVariable("id") Long id) {
return AjaxResult.success(pileStationInfoService.selectPileStationInfoById(id)); return AjaxResult.success(pileStationInfoService.selectPileStationInfoById(id));
} }
/** /**
* 后管站点基本资料页面 * 后管站点基本资料页面
* @return *
*/ * @return
@PreAuthorize("@ss.hasPermi('pile:station:query')") */
@GetMapping(value = "/getStationInfo/{stationId}") @PreAuthorize("@ss.hasPermi('pile:station:query')")
public AjaxResult getStationInfo(@PathVariable("stationId") String stationId) { @GetMapping(value = "/getStationInfo/{stationId}")
return AjaxResult.success(pileStationInfoService.getStationInfo(stationId)); public AjaxResult getStationInfo(@PathVariable("stationId") String stationId) {
} return AjaxResult.success(pileStationInfoService.getStationInfo(stationId));
}
/** /**
* 新增充电站信息 * 新增充电站信息
*/ */
@PreAuthorize("@ss.hasPermi('pile:station:add')") @PreAuthorize("@ss.hasPermi('pile:station:add')")
@Log(title = "充电站信息", businessType = BusinessType.INSERT) @Log(title = "充电站信息", businessType = BusinessType.INSERT)
@PostMapping @PostMapping
public AjaxResult add(@RequestBody PileStationInfo pileStationInfo) { public AjaxResult add(@RequestBody PileStationInfo pileStationInfo) {
return toAjax(pileStationInfoService.insertPileStationInfo(pileStationInfo)); return toAjax(pileStationInfoService.insertPileStationInfo(pileStationInfo));
} }
/** /**
* 修改充电站信息 * 修改充电站信息
*/ */
@PreAuthorize("@ss.hasPermi('pile:station:edit')") @PreAuthorize("@ss.hasPermi('pile:station:edit')")
@Log(title = "充电站信息", businessType = BusinessType.UPDATE) @Log(title = "充电站信息", businessType = BusinessType.UPDATE)
@PutMapping @PutMapping
public AjaxResult edit(@RequestBody PileStationInfo pileStationInfo) { public AjaxResult edit(@RequestBody PileStationInfo pileStationInfo) {
logger.info("修改充电站信息 param:{}", pileStationInfo.toString()); logger.info("修改充电站信息 param:{}", pileStationInfo.toString());
return toAjax(pileStationInfoService.updatePileStationInfo(pileStationInfo)); return toAjax(pileStationInfoService.updatePileStationInfo(pileStationInfo));
} }
/** /**
* 修改对接高德标识 * 修改对接高德标识
*/ */
@PreAuthorize("@ss.hasPermi('pile:station:edit')") @PreAuthorize("@ss.hasPermi('pile:station:edit')")
@Log(title = "修改对接高德标识", businessType = BusinessType.UPDATE) @Log(title = "修改对接高德标识", businessType = BusinessType.UPDATE)
@PostMapping("/editAmapFlag") @PostMapping("/editAmapFlag")
public AjaxResult editAmapFlag(@RequestBody EditAmapFlagDTO dto) { public AjaxResult editAmapFlag(@RequestBody EditAmapFlagDTO dto) {
logger.info("修改对接高德标识 param:{}", JSON.toJSONString(dto)); logger.info("修改对接高德标识 param:{}", JSON.toJSONString(dto));
return toAjax(pileStationInfoService.updateAmapFlag(dto.getStationId(), dto.getAmapFlag())); return toAjax(pileStationInfoService.updateAmapFlag(dto.getStationId(), dto.getAmapFlag()));
} }
/** /**
* 高德地图商家推送静态信息状态 * 高德地图商家推送静态信息状态
* @param dto *
* @return * @param dto
*/ * @return
@PreAuthorize("@ss.hasPermi('pile:station:edit')") */
@PostMapping("/pushAMapStationStatus") @PreAuthorize("@ss.hasPermi('pile:station:edit')")
public RestApiResponse<?> pushAMapStationStatus(EditAmapFlagDTO dto) { @PostMapping("/pushAMapStationStatus")
RestApiResponse<?> response = null; public RestApiResponse<?> pushAMapStationStatus(EditAmapFlagDTO dto) {
try { RestApiResponse<?> response = null;
String result = aMapService.pushStationInfo(Lists.newArrayList(dto.getStationId()), dto.getAmapFlag()); try {
response = new RestApiResponse<>(result); String result = aMapService.pushStationInfo(Lists.newArrayList(dto.getStationId()), dto.getAmapFlag());
} catch (Exception e) { response = new RestApiResponse<>(result);
logger.error("高德地图商家推送静态信息状态 error", e); } catch (Exception e) {
response = new RestApiResponse<>(e); logger.error("高德地图商家推送静态信息状态 error", e);
} response = new RestApiResponse<>(e);
logger.info("高德地图商家推送静态信息状态 result:{}", response); }
return response; logger.info("高德地图商家推送静态信息状态 result:{}", response);
} return response;
}
/** /**
* 删除充电站信息 * 删除充电站信息
*/ */
@PreAuthorize("@ss.hasPermi('pile:station:remove')") @PreAuthorize("@ss.hasPermi('pile:station:remove')")
@Log(title = "充电站信息", businessType = BusinessType.DELETE) @Log(title = "充电站信息", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}") @DeleteMapping("/{ids}")
public AjaxResult remove(@PathVariable Long[] ids) { public AjaxResult remove(@PathVariable Long[] ids) {
return toAjax(pileStationInfoService.deletePileStationInfoByIds(ids)); return toAjax(pileStationInfoService.deletePileStationInfoByIds(ids));
} }
/** /**
* 根据运营商id获取充电站列表 * 根据运营商id获取充电站列表
*/ */
@PreAuthorize("@ss.hasPermi('pile:station:query')") @PreAuthorize("@ss.hasPermi('pile:station:query')")
@PostMapping(value = "/selectStationListByMerchantId") @PostMapping(value = "/selectStationListByMerchantId")
public AjaxResult selectStationListByMerchantId(@RequestBody QueryStationDTO dto) { public AjaxResult selectStationListByMerchantId(@RequestBody QueryStationDTO dto) {
return AjaxResult.success(pileStationInfoService.selectStationListByMerchantIdWithAuth(Long.valueOf(dto.getMerchantId()))); return AjaxResult.success(pileStationInfoService.selectStationListByMerchantIdWithAuth(Long.valueOf(dto.getMerchantId())));
} }
/** /**
* 修改站点二维码前缀 * 修改站点二维码前缀
* @param dto *
* @return * @param dto
*/ * @return
@PreAuthorize("@ss.hasPermi('pile:station:edit')") */
@PostMapping("/updateStationQRCodePrefix") @PreAuthorize("@ss.hasPermi('pile:station:edit')")
public AjaxResult updateStationQRCodePrefix(@RequestBody QueryStationDTO dto) { @PostMapping("/updateStationQRCodePrefix")
// 校验入参 public AjaxResult updateStationQRCodePrefix(@RequestBody QueryStationDTO dto) {
if (StringUtils.isBlank(dto.getStationId()) || StringUtils.isBlank(dto.getQrcodePrefix())) { // 校验入参
return AjaxResult.error(ReturnCodeEnum.CODE_PARAM_NOT_NULL_ERROR.getValue()); if (StringUtils.isBlank(dto.getStationId()) || StringUtils.isBlank(dto.getQrcodePrefix())) {
} return AjaxResult.error(ReturnCodeEnum.CODE_PARAM_NOT_NULL_ERROR.getValue());
return AjaxResult.success(pileService.updateStationQRCodePrefix(dto)); }
} return AjaxResult.success(pileService.updateStationQRCodePrefix(dto));
}
/** /**
* 查询站点互联互通配置 * 查询站点互联互通配置
* @param id *
* @return * @param id
*/ * @return
@PreAuthorize("@ss.hasPermi('pile:station:query')") */
@GetMapping("/getRelationByStationId/{stationId}") @PreAuthorize("@ss.hasPermi('pile:station:query')")
public TableDataInfo getSettingByStationId(@PathVariable("stationId") Long id) { @GetMapping("/getRelationByStationId/{stationId}")
List<ThirdPartyStationRelationVO> list = thirdPartyStationRelationService.getRelationInfoList(String.valueOf(id)); public TableDataInfo getSettingByStationId(@PathVariable("stationId") Long id) {
for (ThirdPartyStationRelationVO vo : list) { List<ThirdPartyStationRelationVO> list = thirdPartyStationRelationService.getRelationInfoList(String.valueOf(id));
vo.setThirdPartyType(ThirdPlatformTypeEnum.getTypeLabelByTypeCode(vo.getThirdPartyType())); for (ThirdPartyStationRelationVO vo : list) {
} vo.setThirdPartyType(ThirdPlatformTypeEnum.getTypeLabelByTypeCode(vo.getThirdPartyType()));
return getDataTable(list); }
} return getDataTable(list);
}
/** /**
* 查询第三方平台配置信息 * 查询第三方平台配置信息
* @param info * @param info
* @return * @return
*/ */
@PreAuthorize("@ss.hasPermi('pile:station:query')") // @PreAuthorize("@ss.hasPermi('pile:station:query')")
@PostMapping("/getSettingInfo") // @PostMapping("/getSettingInfo")
public TableDataInfo getSettingInfo(@RequestBody ThirdPartySettingInfo info) { // public TableDataInfo getSettingInfo(@RequestBody ThirdPartySettingInfo info) {
List<ThirdPartySettingInfo> infos = thirdPartySettingInfoService.selectThirdPartySettingInfoList(info); // List<ThirdPartySettingInfo> infos = thirdPartySettingInfoService.selectThirdPartySettingInfoList(info);
return getDataTable(infos); // return getDataTable(infos);
// return AjaxResult.success(thirdPartySettingInfoService.selectSettingInfo(info)); // // return AjaxResult.success(thirdPartySettingInfoService.selectSettingInfo(info));
} // }
/** /**
* 修改站点互联互通配置信息 * 修改站点互联互通配置信息
* @param info * @param info
* @return * @return
*/ */
// @PreAuthorize("@ss.hasPermi('pile:station:edit')") // @PreAuthorize("@ss.hasPermi('pile:station:edit')")
// @PostMapping("/updateSettingByStationId") // @PostMapping("/updateSettingByStationId")
// public AjaxResult updateSettingByStationId(@RequestBody ThirdPartySettingInfo info) { // public AjaxResult updateSettingByStationId(@RequestBody ThirdPartySettingInfo info) {
// return AjaxResult.success(thirdPartySettingInfoService.updateStationSettingInfo(info)); // return AjaxResult.success(thirdPartySettingInfoService.updateStationSettingInfo(info));
// } // }
/** /**
* 新增站点互联互通配置信息 * 新增站点互联互通配置信息
* @param info * @param info
* @return * @return
*/ */
// @PreAuthorize("@ss.hasPermi('pile:station:add')") // @PreAuthorize("@ss.hasPermi('pile:station:add')")
// @PostMapping("/insertSettingInfo") // @PostMapping("/insertSettingInfo")
// public AjaxResult insertSettingInfo(ThirdPartySettingInfo info) { // public AjaxResult insertSettingInfo(ThirdPartySettingInfo info) {
// return AjaxResult.success(thirdPartySettingInfoService.insertThirdPartySettingInfo(info)); // return AjaxResult.success(thirdPartySettingInfoService.insertThirdPartySettingInfo(info));
// } // }
/**
* 推送充电站信息 notification_stationInfo
* http://localhost:8080/LianLian/pushStationInfo
*
* @param dto
* @return
*/
@PostMapping("/pushStationInfo")
public RestApiResponse<?> pushStationInfo(@RequestBody PushStationInfoDTO dto) {
logger.info("推送第三方平台充电站信息 params:{}", JSON.toJSONString(dto));
RestApiResponse<?> response = null;
Long stationId = dto.getStationId();
List<String> types = dto.getThirdPartyTypes();
// 先查到该站点推送过的类型
List<ThirdPartyStationRelationVO> infoList = thirdPartyStationRelationService.getRelationInfoList(String.valueOf(stationId));
List<String> typeList = infoList.stream()
.map(ThirdPartyStationRelationVO::getThirdPartyType)
.collect(Collectors.toList());
// 对types去重可获取到需要新推送的第三方平台类型
types.removeAll(typeList);
dto.setThirdPartyTypes(types);
try {
if (StringUtils.isBlank(String.valueOf(stationId))) {
throw new BusinessException(ReturnCodeEnum.CODE_PARAM_NOT_NULL_ERROR);
}
String result = commonService.commonPushStation(dto);
response = new RestApiResponse<>(result);
} catch (BusinessException e) {
logger.error("推送第三方平台充电站信息 error", e);
response = new RestApiResponse<>(e.getCode(), e.getMessage());
} catch (Exception e) {
logger.error("推送第三方平台充电站信息 error", e);
response = new RestApiResponse<>("推送失败,请联系管理员");
// 有报错,所有的都必须删除
thirdPartyStationRelationService.updateRelationDelFlag(String.valueOf(stationId), types);
}
logger.info("推送第三方平台充电站信息 result:{}", response);
return response;
}
/** /**
* 推送充电站信息 notification_stationInfo * 绑定停车平台(停车充电下发优惠券)
* http://localhost:8080/LianLian/pushStationInfo *
* @param dto * @param dto
* @return * @return
*/ */
@PostMapping("/pushStationInfo") @PostMapping("/bindParkingPlatform")
public RestApiResponse<?> pushStationInfo(@RequestBody PushStationInfoDTO dto) { public RestApiResponse<?> bindParkingPlatform(@RequestBody BindParkingPlatformDTO dto) {
logger.info("推送第三方平台充电站信息 params:{}", JSON.toJSONString(dto)); logger.info("绑定停车平台 params:{}", JSON.toJSONString(dto));
RestApiResponse<?> response = null; RestApiResponse<?> response = null;
Long stationId = dto.getStationId(); try {
List<String> types = dto.getThirdPartyTypes(); int i = pileStationInfoService.bindParkingPlatform(dto);
// 先查到该站点推送过的类型 response = new RestApiResponse<>(i);
List<ThirdPartyStationRelationVO> infoList = thirdPartyStationRelationService.getRelationInfoList(String.valueOf(stationId)); } catch (BusinessException e) {
List<String> typeList = infoList.stream() logger.error("绑定停车平台 error,", e);
.map(ThirdPartyStationRelationVO::getThirdPartyType) response = new RestApiResponse<>(e.getCode(), e.getMessage());
.collect(Collectors.toList()); } catch (Exception e) {
// 对types去重可获取到需要新推送的第三方平台类型 logger.error("绑定停车平台 error", e);
types.removeAll(typeList); response = new RestApiResponse<>(e);
dto.setThirdPartyTypes(types); }
try { logger.info("绑定停车平台 result:{}", response);
if (StringUtils.isBlank(String.valueOf(stationId))) { return response;
throw new BusinessException(ReturnCodeEnum.CODE_PARAM_NOT_NULL_ERROR); }
}
String result = commonService.commonPushStation(dto);
response = new RestApiResponse<>(result);
}catch (BusinessException e) {
logger.error("推送第三方平台充电站信息 error",e);
response = new RestApiResponse<>(e.getCode(), e.getMessage());
}catch (Exception e) {
logger.error("推送第三方平台充电站信息 error", e);
response = new RestApiResponse<>("推送失败,请联系管理员");
// 有报错,所有的都必须删除
thirdPartyStationRelationService.updateRelationDelFlag(String.valueOf(stationId), types);
}
logger.info("推送第三方平台充电站信息 result:{}", response);
return response;
}
/** /**
* 绑定停车平台(停车充电下发优惠券) * 获取停车平台列表
* @param dto *
* @return * @return
*/ */
@PostMapping("/bindParkingPlatform") @GetMapping("/getParkingInfoList")
public RestApiResponse<?> bindParkingPlatform(@RequestBody BindParkingPlatformDTO dto) { public RestApiResponse<?> getParkingInfoList() {
logger.info("绑定停车平台 params:{}", JSON.toJSONString(dto)); // logger.info("获取停车平台列表");
RestApiResponse<?> response = null; RestApiResponse<?> response = null;
try { try {
int i = pileStationInfoService.bindParkingPlatform(dto); startPage();
response = new RestApiResponse<>(i); List<ThirdpartyParkingConfig> list = parkingConfigService.selectInfoList();
}catch (BusinessException e) { response = new RestApiResponse<>(list);
logger.error("绑定停车平台 error,", e); } catch (Exception e) {
response = new RestApiResponse<>(e.getCode(), e.getMessage()); logger.error("获取停车平台列表 error,", e);
} catch (Exception e) { response = new RestApiResponse<>(e);
logger.error("绑定停车平台 error", e); }
response = new RestApiResponse<>(e); logger.info("获取停车平台列表 result:{}", response);
} return response;
logger.info("绑定停车平台 result:{}", response); }
return response;
}
/** /**
* 获取停车平台列表 * 更新站点与第三方平台关系
* @return */
*/ @PostMapping("/updateThirdPartyStationRelation")
@GetMapping("/getParkingInfoList") public AjaxResult updateThirdPartyStationRelation(@RequestBody ThirdPartyStationRelationDTO dto) {
public RestApiResponse<?> getParkingInfoList() { AjaxResult result;
// logger.info("获取停车平台列表"); try {
RestApiResponse<?> response = null; // startPage();
try { thirdPartyStationRelationService.updateThirdPartyStationRelation(dto);
startPage(); result = AjaxResult.success();
List<ThirdpartyParkingConfig> list = parkingConfigService.selectInfoList(); } catch (Exception e) {
response = new RestApiResponse<>(list); logger.error("更新站点与第三方平台关系error,", e);
} catch (Exception e) { result = AjaxResult.error(e.getMessage());
logger.error("获取停车平台列表 error,", e); }
response = new RestApiResponse<>(e); return result;
} }
logger.info("获取停车平台列表 result:{}", response);
return response;
}
/**
* 更新站点与第三方平台关系
*/
@PostMapping("/updateThirdPartyStationRelation")
public AjaxResult updateThirdPartyStationRelation(@RequestBody ThirdPartyStationRelationDTO dto) {
AjaxResult result;
try {
// startPage();
thirdPartyStationRelationService.updateThirdPartyStationRelation(dto);
result = AjaxResult.success();
} catch (Exception e) {
logger.error("更新站点与第三方平台关系error,", e);
result = AjaxResult.error(e.getMessage());
}
return result;
}
} }

View File

@@ -2,6 +2,7 @@ package com.jsowell.common.core.domain.parking;
import lombok.Data; import lombok.Data;
import java.util.HashMap;
import java.util.Map; import java.util.Map;
/** /**
@@ -38,4 +39,13 @@ public class ParkingCommonParam {
* 请求签名 * 请求签名
*/ */
private String sign; private String sign;
public Map<String, String> getPublicParams() {
Map<String, String> publicParams = new HashMap<>();
publicParams.put("service", service);
publicParams.put("version", version);
publicParams.put("msgId", msgId);
publicParams.put("orgId", orgId);
return publicParams;
}
} }

View File

@@ -1,5 +1,6 @@
package com.jsowell.common.util; package com.jsowell.common.util;
import com.jsowell.common.core.domain.parking.ParkingCommonParam;
import com.jsowell.common.util.sign.MD5Util; import com.jsowell.common.util.sign.MD5Util;
import java.util.HashMap; import java.util.HashMap;
@@ -35,6 +36,14 @@ public class ParkingUtil {
return MD5Util.MD5Encode(stringC).toLowerCase(); return MD5Util.MD5Encode(stringC).toLowerCase();
} }
/**
* 设置sign
*/
public static void generateAndSetSign(ParkingCommonParam param, String secretKey) {
String sign = generateSign(param.getPublicParams(), param.getData(), secretKey);
param.setSign(sign);
}
public static void main(String[] args) { public static void main(String[] args) {
// 模拟公共请求参数 // 模拟公共请求参数
Map<String, String> publicParams = new HashMap<>(); Map<String, String> publicParams = new HashMap<>();

View File

@@ -57,7 +57,8 @@
"vue-qr": "^4.0.9", "vue-qr": "^4.0.9",
"vue-router": "3.4.9", "vue-router": "3.4.9",
"vuedraggable": "2.24.3", "vuedraggable": "2.24.3",
"vuex": "3.6.0" "vuex": "3.6.0",
"xlsx": "^0.18.5"
}, },
"devDependencies": { "devDependencies": {
"@vue/cli-plugin-babel": "4.4.6", "@vue/cli-plugin-babel": "4.4.6",

View File

@@ -121,14 +121,6 @@ export function getRelationByStationId(id) {
}); });
} }
// 查询站点互联互通配置
export function getSettingInfo(data) {
return request({
url: "/pile/station/getSettingInfo",
method: "post",
data: data,
});
}
// 修改站点互联互通配置 // 修改站点互联互通配置
export function updateSettingByStationId(data) { export function updateSettingByStationId(data) {

View File

@@ -1,35 +1,70 @@
import * as XLSX from 'xlsx';
import { saveAs } from 'file-saver';
export function barDataView(titleName, fileName) { export function barDataView(titleName, fileName) {
var dataView = { var dataView = {
show: true, show: true,
readOnly: false, readOnly: false,
lang: ['数据视图', '关闭', '刷新'], lang: ['数据视图', '关闭', '导出Excel'],
optionToContent: function(opt) { optionToContent: function (opt) {
var axisData = opt.xAxis[0].data // 坐标数据 var axisData = opt.xAxis[0].data; // 坐标数据
var series = opt.series // 折线图数据 var series = opt.series; // 折线图数据
var tdHeads = '' var tdHeads = '';
for (let index = 0; index < titleName.length; index++) { for (let index = 0; index < titleName.length; index++) {
// 样式 tdHeads += '<td style="height:30px;text-align: center;">' + titleName[index] + '</td>';
tdHeads += '<td style="height:30px;text-align: center;">' + titleName[index] + '</td>'
} }
var tdBodys = '' // 表数据 var tdBodys = ''; // 表数据
var table = '<table id="tableExcel_Day" border="1" class="table-bordered table-striped" style="width:100%;text-align:centerborder:1px solid #ccc;border-collapse:collapse;" ><tbody><tr>' + tdHeads + ' </tr>' var tableId = 'tableExcel_' + new Date().getTime(); // 动态表格ID
// 组装表数据 var table = `<table id="${tableId}" border="1" class="table-bordered table-striped" style="width:100%;text-align:center;border:1px solid #ccc;border-collapse:collapse;"><tbody><tr>${tdHeads}</tr>`;
for (var i = 0, l = axisData.length; i < l; i++) { for (var i = 0, l = axisData.length; i < l; i++) {
tdBodys = '<td style="height:30px;text-align: center;">' + axisData[i] + '</td>'; // 添加坐标轴数据
for (var j = 0; j < series.length; j++) { for (var j = 0; j < series.length; j++) {
var temp = series[j].data[i] var temp = series[j].data[i];
if (temp != null && temp !== undefined) { if (temp != null && temp !== undefined) {
tdBodys += '<td>' + temp + '</td>' tdBodys += '<td>' + temp + '</td>';
} else { } else {
tdBodys += '<td></td>' tdBodys += '<td></td>';
} }
} }
// 样式 table += '<tr>' + tdBodys + '</tr>';
table += '<tr style="height:30px;text-align: center;"><td >' + axisData[i] + '</td>' + tdBodys + '</tr>'
tdBodys = ''
} }
table += '</tbody></table>' table += '</tbody></table>';
return table return table;
} },
} contentToOption: function (html, opt) {
return dataView console.log('HTMLDomElement:', html); // 调试信息
if (!html || !html.tagName) {
console.error('Invalid HTML element passed to contentToOption');
return opt;
}
// 获取表格元素
let tableElement = html.querySelector('table');
if (!tableElement) {
console.error('Table element not found within the provided HTML element');
return opt;
}
let et = XLSX.utils.table_to_book(tableElement);
let etout = XLSX.write(et, {
bookType: "xlsx",
bookSST: true,
type: "array",
});
try {
saveAs(
new Blob([etout], { type: "application/octet-stream" }),
`${fileName}-${new Date().toLocaleString().replace(/[:\/]/g, '-')}.xlsx`
);
} catch (e) {
console.error("Export failed:", e);
}
return opt; // 返回原始选项,因为这里没有修改图表的配置
},
};
return dataView;
} }

View File

@@ -1,61 +1,65 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<h1>概况 (自2023-01-01)</h1> <h1>概况 (自2023-01-01)</h1>
<hr /> <hr />
<div style="display: flex;justify-content: space-between;margin-top: 10px;flex-wrap: wrap;"> <div
<div class="box" style="background-color: #ffba00;"> style="
<el-image class="box-image" :src="require('@/assets/images/lightning.png')" /> display: flex;
<div class="flex1"> justify-content: space-between;
<div class="box-h1">{{ generalSituation.totalChargingDegree }}</div> margin-top: 10px;
<div>总充电电量()</div> flex-wrap: wrap;
</div> "
>
</div> <div class="box" style="background-color: #ffba00">
<div class="box" style="background-color: #c74542;"> <el-image class="box-image" :src="require('@/assets/images/lightning.png')" />
<el-image class="box-image" :src="require('@/assets/images/zongfeiyong.png')" /> <div class="flex1">
<div class="flex1"> <div class="box-h1">{{ generalSituation.totalChargingDegree }}</div>
<div class="box-h1">{{ generalSituation.totalChargingAmount }}</div> <div>总充电电量()</div>
<div>总充电费用()</div>
</div>
</div>
<div class="box" style="background-color: #12ce65;">
<el-image class="box-image" :src="require('@/assets/images/dingdan.png')" />
<div class="flex1">
<div class="box-h1">{{ generalSituation.totalChargingQuantity }}</div>
<div>总充电订单数()</div>
</div>
</div>
<div class="box" style="background-color: #909399;">
<el-image class="box-image" :src="require('@/assets/images/shebei.png')" />
<div class="flex1">
<div class="box-h1">{{ generalSituation.totalPileQuantity }}</div>
<div>总充电设备数量()</div>
</div>
</div>
<!-- <div class="box" v-hasRole="['admin', 'common']" style="background-color: #ff4949;">-->
<!-- <el-image-->
<!-- class="box-image"-->
<!-- :src="require('@/assets/images/yue.png')"-->
<!-- ></el-image>-->
<!-- <div class="flex1">-->
<!-- <div class="box-h1">{{ generalSituation.totalMemberAmount }}</div>-->
<!-- <div>总客户余额()</div>-->
<!-- </div>-->
<!-- </div>-->
</div> </div>
<h1>订单</h1> </div>
<hr /> <div class="box" style="background-color: #c74542">
<el-button style="background-color: #1ab394; color: #ffffff">最近30天 <el-image class="box-image" :src="require('@/assets/images/zongfeiyong.png')" />
</el-button> <div class="flex1">
<div ref="chart" :style="{ width: '100%', height: '500px' }"></div> <div class="box-h1">{{ generalSituation.totalChargingAmount }}</div>
<hr /> <div>总充电费用()</div>
<!-- <h1>启动充电渠道</h1> --> </div>
<!-- <div ref="chartDom" :style="{ width: '50%', height: '550px' }"></div> --> </div>
<!-- <hr /> --> <div class="box" style="background-color: #12ce65">
<!-- <hr /> --> <el-image class="box-image" :src="require('@/assets/images/dingdan.png')" />
<!-- <h1>设备</h1> --> <div class="flex1">
<div class="box-h1">{{ generalSituation.totalChargingQuantity }}</div>
<div>总充电订单数()</div>
</div>
</div>
<div class="box" style="background-color: #909399">
<el-image class="box-image" :src="require('@/assets/images/shebei.png')" />
<div class="flex1">
<div class="box-h1">{{ generalSituation.totalPileQuantity }}</div>
<div>总充电设备数量()</div>
</div>
</div>
<!-- <div class="box" v-hasRole="['admin', 'common']" style="background-color: #ff4949;">-->
<!-- <el-image-->
<!-- class="box-image"-->
<!-- :src="require('@/assets/images/yue.png')"-->
<!-- ></el-image>-->
<!-- <div class="flex1">-->
<!-- <div class="box-h1">{{ generalSituation.totalMemberAmount }}</div>-->
<!-- <div>总客户余额()</div>-->
<!-- </div>-->
<!-- </div>-->
</div> </div>
<h1>订单</h1>
<hr />
<el-button style="background-color: #1ab394; color: #ffffff">最近30天 </el-button>
<div ref="chart" :style="{ width: '100%', height: '500px' }"></div>
<hr />
<!-- <h1>启动充电渠道</h1> -->
<!-- <div ref="chartDom" :style="{ width: '50%', height: '550px' }"></div> -->
<!-- <hr /> -->
<!-- <hr /> -->
<!-- <h1>设备</h1> -->
</div>
</template> </template>
<script> <script>
import Echarts from "echarts"; import Echarts from "echarts";
@@ -63,275 +67,287 @@ import { barDataView } from "./echarts";
import { getGeneralSituation, getOrderInfo } from "@/api/index"; import { getGeneralSituation, getOrderInfo } from "@/api/index";
export default { export default {
data() { data() {
return { return {
chart: null, chart: null,
generalSituation: {}, generalSituation: {},
orderInfo: [], orderInfo: [],
tableData: [{ tableData: [
pileSn: '9527', {
stationName: '万车充充电桩', pileSn: "9527",
stationAddress: '昆山市黄埔江南路', stationName: "万车充充电桩",
type: '直流', stationAddress: "昆山市黄埔江南路",
power: '2131', type: "直流",
degree: '215', power: "2131",
electricityPrice: '565', degree: "215",
servicePrice: '9274', electricityPrice: "565",
chargingNumber: '624', servicePrice: "9274",
chargingNumber: "624",
}] },
],
};
}, //图表实例
created() {
this.getGeneral();
},
mounted() {
this.init();
// this.rose();
},
methods: {
async getGeneral() {
const { obj } = await getGeneralSituation({});
console.log("首页信息", obj);
this.generalSituation = obj;
},
async getOrder() {
const { obj, resCode } = await getOrderInfo({});
console.log("订单信息", obj, resCode);
if (resCode === "00100000") {
this.orderInfo = obj;
}
},
async init() {
await this.getOrder();
this.$nextTick(() => {
this.chart = Echarts.init(this.$refs.chart);
console.log("柱状图", this.orderInfo);
let str = this.orderInfo.map((item) => {
return item.date;
});
console.log(str);
let option = {
tooltip: {
trigger: "axis",
axisPointer: {
type: "shadow",
},
},
toolbox: {
feature: {
dataView: { show: true, readOnly: false },
magicType: { show: true, type: ["line", "bar"] },
restore: { show: true },
saveAsImage: { show: true },
},
},
legend: {
data: [
"总订单金额",
"尖时段总用电量",
"峰时段总用电量",
"平时段总用电量",
"谷时段总用电量",
],
},
dataZoom: {
show: false,
start: 0,
end: 100,
},
grid: {
left: "3%",
right: "4%",
bottom: "3%",
containLabel: true,
},
xAxis: [
{
type: "category",
boundaryGap: true,
data: str,
axisLine: { onZero: false },
},
],
animation: true,
animationDuration: 2000,
yAxis: [
{
type: "value",
name: "电费",
position: "left",
alignTicks: true,
axisLabel: {
formatter: "{value} ¥",
},
},
{
type: "value",
name: "电量",
position: "right",
alignTicks: true,
axisLabel: {
formatter: "{value} kwh",
},
},
],
series: [
{
name: "总用电量",
type: "line",
data: this.orderInfo.map((item) => {
return item.totalElectricity;
}),
symbolSize: 1,
symbol: "circle",
itemStyle: {
normal: {
color: "rgba(252,120,48,0)",
barBorderRadius: 0,
},
},
},
{
name: "总订单金额",
type: "line",
yAxisIndex: 0,
data: this.orderInfo.map((item) => {
return item.totalOrderAmount;
}),
},
{
name: "尖时段总用电量",
type: "bar",
yAxisIndex: 1,
stack: "one",
emphasis: {
focus: "series",
blurScope: "coordinateSystem",
},
data: this.orderInfo.map((item) => {
return item.totalSharpUsedElectricity;
}),
barWidth: "35%", //柱子宽度
// barGap: 1, //柱子之间间距
itemStyle: {
normal: {
color: "#ff4949",
opacity: 1,
barBorderRadius: 1, //柱子菱角
},
},
},
{
name: "峰时段总用电量",
type: "bar",
yAxisIndex: 1,
stack: "one",
emphasis: {
focus: "series",
blurScope: "coordinateSystem",
},
data: this.orderInfo.map((item) => {
return item.totalPeakUsedElectricity;
}),
barWidth: "35%",
itemStyle: {
normal: {
color: "#ffba00",
opacity: 1,
barBorderRadius: 1, //柱子菱角
},
},
},
{
name: "平时段总用电量",
type: "bar",
yAxisIndex: 1,
stack: "one",
data: this.orderInfo.map((item) => {
return item.totalFlatUsedElectricity;
}),
emphasis: {
focus: "series",
blurScope: "coordinateSystem",
},
itemStyle: {
normal: {
color: "#12ce65",
opacity: 1,
barBorderRadius: 1, //柱子菱角
},
},
},
{
name: "谷时段总用电量",
type: "bar",
yAxisIndex: 1,
stack: "one",
data: this.orderInfo.map((item) => {
return item.totalValleyUsedElectricity;
}),
emphasis: {
focus: "series",
blurScope: "coordinateSystem",
},
itemStyle: {
normal: {
color: "#909399",
opacity: 1,
barBorderRadius: 1, //柱子菱角
},
},
},
],
}; };
}, //图表实例 option.toolbox.feature.dataView = barDataView(
created() { [
this.getGeneral(); "时间/日期",
"总用电量",
"总订单金额",
"尖时段总用电量",
"峰时段总用电量",
"平时段总用电量",
"谷时段总用电量",
],
"电量电费"
);
this.chart.setOption(option);
});
}, },
mounted() { rose() {
this.init(); this.$nextTick(() => {
// this.rose(); this.chartDom = Echarts.init(this.$refs.chartDom);
}, let option = {
methods: { legend: {
async getGeneral() { top: "bottom",
const { obj } = await getGeneralSituation({}); },
console.log("首页信息", obj); toolbox: {
this.generalSituation = obj; show: true,
}, feature: {
async getOrder() { mark: { show: true },
const { obj, resCode } = await getOrderInfo({}); dataView: { show: true, readOnly: false },
console.log("订单信息", obj, resCode); restore: { show: true },
if (resCode === '00100000') { saveAsImage: { show: true },
this.orderInfo = obj; },
} },
}, series: [
async init() { {
await this.getOrder(); name: "Nightingale Chart",
this.$nextTick(() => { type: "pie",
this.chart = Echarts.init(this.$refs.chart); radius: [50, 250],
console.log("柱状图", this.orderInfo); center: ["50%", "50%"],
let str = this.orderInfo.map((item) => { roseType: "area",
return item.date; itemStyle: {
}); borderRadius: 8,
console.log(str); },
let option = { data: [
tooltip: { { value: 40, name: "rose 1" },
trigger: "axis", { value: 38, name: "rose 2" },
axisPointer: { { value: 32, name: "rose 3" },
type: "shadow", { value: 30, name: "rose 4" },
}, { value: 28, name: "rose 5" },
}, { value: 26, name: "rose 6" },
toolbox: { { value: 22, name: "rose 7" },
feature: { { value: 18, name: "rose 8" },
dataView: { show: true, readOnly: false }, ],
magicType: { show: true, type: ["line", "bar"] }, },
restore: { show: true }, ],
saveAsImage: { show: true }, };
}, this.chartDom.setOption(option);
}, });
legend: {
data: [
"总订单金额",
"尖时段总用电量",
"峰时段总用电量",
"平时段总用电量",
"谷时段总用电量",
],
},
dataZoom: {
show: false,
start: 0,
end: 100,
},
grid: {
left: "3%",
right: "4%",
bottom: "3%",
containLabel: true,
},
xAxis: [
{
type: "category",
boundaryGap: true,
data: str,
axisLine: { onZero: false },
},
],
animation: true,
animationDuration: 2000,
yAxis: [
{
type: "value",
name: "电费",
position: "left",
alignTicks: true,
axisLabel: {
formatter: "{value} ¥",
},
},
{
type: "value",
name: "电量",
position: "right",
alignTicks: true,
axisLabel: {
formatter: "{value} kwh",
},
},
],
series: [
{
name: "总用电量",
type: "line",
data: this.orderInfo.map((item) => {
return item.totalElectricity;
}),
symbolSize: 1,
symbol: "circle",
itemStyle: {
normal: {
color: "rgba(252,120,48,0)",
barBorderRadius: 0,
},
},
},
{
name: "总订单金额",
type: "line",
yAxisIndex: 0,
data: this.orderInfo.map((item) => {
return item.totalOrderAmount;
}),
},
{
name: "尖时段总用电量",
type: "bar",
yAxisIndex: 1,
stack: "one",
emphasis: {
focus: "series",
blurScope: "coordinateSystem",
},
data: this.orderInfo.map((item) => {
return item.totalSharpUsedElectricity;
}),
barWidth: "35%", //柱子宽度
// barGap: 1, //柱子之间间距
itemStyle: {
normal: {
color: "#ff4949",
opacity: 1,
barBorderRadius: 1, //柱子菱角
},
},
},
{
name: "峰时段总用电量",
type: "bar",
yAxisIndex: 1,
stack: "one",
emphasis: {
focus: "series",
blurScope: "coordinateSystem",
},
data: this.orderInfo.map((item) => {
return item.totalPeakUsedElectricity;
}),
barWidth: "35%",
itemStyle: {
normal: {
color: "#ffba00",
opacity: 1,
barBorderRadius: 1, //柱子菱角
},
},
},
{
name: "平时段总用电量",
type: "bar",
yAxisIndex: 1,
stack: "one",
data: this.orderInfo.map((item) => {
return item.totalFlatUsedElectricity;
}),
emphasis: {
focus: "series",
blurScope: "coordinateSystem",
},
itemStyle: {
normal: {
color: "#12ce65",
opacity: 1,
barBorderRadius: 1, //柱子菱角
},
},
},
{
name: "谷时段总用电量",
type: "bar",
yAxisIndex: 1,
stack: "one",
data: this.orderInfo.map((item) => {
return item.totalValleyUsedElectricity;
}),
emphasis: {
focus: "series",
blurScope: "coordinateSystem",
},
itemStyle: {
normal: {
color: "#909399",
opacity: 1,
barBorderRadius: 1, //柱子菱角
},
},
},
],
};
option.toolbox.feature.dataView = barDataView(['时间/日期', '总用电量', '总订单金额', '尖时段总用电量', '峰时段总用电量', '平时段总用电量', '谷时段总用电量'], '电量电费')
this.chart.setOption(option);
});
},
rose() {
this.$nextTick(() => {
this.chartDom = Echarts.init(this.$refs.chartDom);
let option = {
legend: {
top: "bottom",
},
toolbox: {
show: true,
feature: {
mark: { show: true },
dataView: { show: true, readOnly: false },
restore: { show: true },
saveAsImage: { show: true },
},
},
series: [
{
name: "Nightingale Chart",
type: "pie",
radius: [50, 250],
center: ["50%", "50%"],
roseType: "area",
itemStyle: {
borderRadius: 8,
},
data: [
{ value: 40, name: "rose 1" },
{ value: 38, name: "rose 2" },
{ value: 32, name: "rose 3" },
{ value: 30, name: "rose 4" },
{ value: 28, name: "rose 5" },
{ value: 26, name: "rose 6" },
{ value: 22, name: "rose 7" },
{ value: 18, name: "rose 8" },
],
},
],
};
this.chartDom.setOption(option);
});
},
}, },
},
}; };
</script> </script>
@@ -340,43 +356,43 @@ export default {
// overflow: scroll; // overflow: scroll;
// } // }
.box { .box {
position: relative; position: relative;
width: 15rem; width: 15rem;
display: flex; display: flex;
height: 6.25rem; height: 6.25rem;
padding: 0.8rem; padding: 0.8rem;
/* font-size: 18px; */ /* font-size: 18px; */
color: #ffffff; color: #ffffff;
border-radius: 8px; border-radius: 8px;
box-shadow: 0 15px 0.8rem -11px black; box-shadow: 0 15px 0.8rem -11px black;
margin-right: 24px; margin-right: 24px;
margin-bottom: 20px; margin-bottom: 20px;
position: relative; position: relative;
.box-image { .box-image {
position: absolute; position: absolute;
left: 0; left: 0;
width: 3.75rem; width: 3.75rem;
height: 3.75rem; height: 3.75rem;
// background-size: 100% 100%; // background-size: 100% 100%;
// position: absolute; // position: absolute;
// right: 0; // right: 0;
// bottom: 0; // bottom: 0;
// filter: drop-shadow(40px 0px gray); // filter: drop-shadow(40px 0px gray);
} }
.flex1 { .flex1 {
flex: 1; flex: 1;
margin-left: 48px; margin-left: 48px;
} }
} }
.box-h1 { .box-h1 {
/* margin-top: -14px; */ /* margin-top: -14px; */
font-size: 2rem; font-size: 2rem;
} }
.box-text { .box-text {
margin-top: 0px; margin-top: 0px;
} }
</style> </style>

View File

@@ -255,10 +255,8 @@ import stationWhiteList from "@/views/pile/station/stationWhiteList";
import { import {
getStationInfo, getStationInfo,
updateStationQRCodePrefix, updateStationQRCodePrefix,
getSettingByStationId,
updateSettingByStationId, updateSettingByStationId,
pushStationInfo, pushStationInfo,
getSettingInfo,
getParkingInfoList, getParkingInfoList,
bindParkingPlatform, bindParkingPlatform,
getRelationByStationId, getRelationByStationId,