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;
@@ -147,6 +146,7 @@ public class PileStationInfoController extends BaseController {
/** /**
* 后管站点基本资料页面 * 后管站点基本资料页面
*
* @return * @return
*/ */
@PreAuthorize("@ss.hasPermi('pile:station:query')") @PreAuthorize("@ss.hasPermi('pile:station:query')")
@@ -189,6 +189,7 @@ public class PileStationInfoController extends BaseController {
/** /**
* 高德地图商家推送静态信息状态 * 高德地图商家推送静态信息状态
*
* @param dto * @param dto
* @return * @return
*/ */
@@ -229,6 +230,7 @@ public class PileStationInfoController extends BaseController {
/** /**
* 修改站点二维码前缀 * 修改站点二维码前缀
*
* @param dto * @param dto
* @return * @return
*/ */
@@ -244,6 +246,7 @@ public class PileStationInfoController extends BaseController {
/** /**
* 查询站点互联互通配置 * 查询站点互联互通配置
*
* @param id * @param id
* @return * @return
*/ */
@@ -262,13 +265,13 @@ public class PileStationInfoController extends BaseController {
* @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));
} // }
/** /**
* 修改站点互联互通配置信息 * 修改站点互联互通配置信息
@@ -293,10 +296,10 @@ public class PileStationInfoController extends BaseController {
// } // }
/** /**
* 推送充电站信息 notification_stationInfo * 推送充电站信息 notification_stationInfo
* http://localhost:8080/LianLian/pushStationInfo * http://localhost:8080/LianLian/pushStationInfo
*
* @param dto * @param dto
* @return * @return
*/ */
@@ -320,10 +323,10 @@ public class PileStationInfoController extends BaseController {
} }
String result = commonService.commonPushStation(dto); String result = commonService.commonPushStation(dto);
response = new RestApiResponse<>(result); response = new RestApiResponse<>(result);
}catch (BusinessException e) { } catch (BusinessException e) {
logger.error("推送第三方平台充电站信息 error",e); logger.error("推送第三方平台充电站信息 error", e);
response = new RestApiResponse<>(e.getCode(), e.getMessage()); response = new RestApiResponse<>(e.getCode(), e.getMessage());
}catch (Exception e) { } catch (Exception e) {
logger.error("推送第三方平台充电站信息 error", e); logger.error("推送第三方平台充电站信息 error", e);
response = new RestApiResponse<>("推送失败,请联系管理员"); response = new RestApiResponse<>("推送失败,请联系管理员");
// 有报错,所有的都必须删除 // 有报错,所有的都必须删除
@@ -335,6 +338,7 @@ public class PileStationInfoController extends BaseController {
/** /**
* 绑定停车平台(停车充电下发优惠券) * 绑定停车平台(停车充电下发优惠券)
*
* @param dto * @param dto
* @return * @return
*/ */
@@ -345,7 +349,7 @@ public class PileStationInfoController extends BaseController {
try { try {
int i = pileStationInfoService.bindParkingPlatform(dto); int i = pileStationInfoService.bindParkingPlatform(dto);
response = new RestApiResponse<>(i); response = new RestApiResponse<>(i);
}catch (BusinessException e) { } catch (BusinessException e) {
logger.error("绑定停车平台 error,", e); logger.error("绑定停车平台 error,", e);
response = new RestApiResponse<>(e.getCode(), e.getMessage()); response = new RestApiResponse<>(e.getCode(), e.getMessage());
} catch (Exception e) { } catch (Exception e) {
@@ -358,6 +362,7 @@ public class PileStationInfoController extends BaseController {
/** /**
* 获取停车平台列表 * 获取停车平台列表
*
* @return * @return
*/ */
@GetMapping("/getParkingInfoList") @GetMapping("/getParkingInfoList")

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) {
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;
} }
return dataView
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

@@ -2,30 +2,36 @@
<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="
display: flex;
justify-content: space-between;
margin-top: 10px;
flex-wrap: wrap;
"
>
<div class="box" style="background-color: #ffba00">
<el-image class="box-image" :src="require('@/assets/images/lightning.png')" /> <el-image class="box-image" :src="require('@/assets/images/lightning.png')" />
<div class="flex1"> <div class="flex1">
<div class="box-h1">{{ generalSituation.totalChargingDegree }}</div> <div class="box-h1">{{ generalSituation.totalChargingDegree }}</div>
<div>总充电电量()</div> <div>总充电电量()</div>
</div> </div>
</div> </div>
<div class="box" style="background-color: #c74542;"> <div class="box" style="background-color: #c74542">
<el-image class="box-image" :src="require('@/assets/images/zongfeiyong.png')" /> <el-image class="box-image" :src="require('@/assets/images/zongfeiyong.png')" />
<div class="flex1"> <div class="flex1">
<div class="box-h1">{{ generalSituation.totalChargingAmount }}</div> <div class="box-h1">{{ generalSituation.totalChargingAmount }}</div>
<div>总充电费用()</div> <div>总充电费用()</div>
</div> </div>
</div> </div>
<div class="box" style="background-color: #12ce65;"> <div class="box" style="background-color: #12ce65">
<el-image class="box-image" :src="require('@/assets/images/dingdan.png')" /> <el-image class="box-image" :src="require('@/assets/images/dingdan.png')" />
<div class="flex1"> <div class="flex1">
<div class="box-h1">{{ generalSituation.totalChargingQuantity }}</div> <div class="box-h1">{{ generalSituation.totalChargingQuantity }}</div>
<div>总充电订单数()</div> <div>总充电订单数()</div>
</div> </div>
</div> </div>
<div class="box" style="background-color: #909399;"> <div class="box" style="background-color: #909399">
<el-image class="box-image" :src="require('@/assets/images/shebei.png')" /> <el-image class="box-image" :src="require('@/assets/images/shebei.png')" />
<div class="flex1"> <div class="flex1">
<div class="box-h1">{{ generalSituation.totalPileQuantity }}</div> <div class="box-h1">{{ generalSituation.totalPileQuantity }}</div>
@@ -42,12 +48,10 @@
<!-- <div>总客户余额()</div>--> <!-- <div>总客户余额()</div>-->
<!-- </div>--> <!-- </div>-->
<!-- </div>--> <!-- </div>-->
</div> </div>
<h1>订单</h1> <h1>订单</h1>
<hr /> <hr />
<el-button style="background-color: #1ab394; color: #ffffff">最近30天 <el-button style="background-color: #1ab394; color: #ffffff">最近30天 </el-button>
</el-button>
<div ref="chart" :style="{ width: '100%', height: '500px' }"></div> <div ref="chart" :style="{ width: '100%', height: '500px' }"></div>
<hr /> <hr />
<!-- <h1>启动充电渠道</h1> --> <!-- <h1>启动充电渠道</h1> -->
@@ -68,18 +72,19 @@ export default {
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() { created() {
@@ -98,7 +103,7 @@ export default {
async getOrder() { async getOrder() {
const { obj, resCode } = await getOrderInfo({}); const { obj, resCode } = await getOrderInfo({});
console.log("订单信息", obj, resCode); console.log("订单信息", obj, resCode);
if (resCode === '00100000') { if (resCode === "00100000") {
this.orderInfo = obj; this.orderInfo = obj;
} }
}, },
@@ -285,7 +290,18 @@ export default {
}, },
], ],
}; };
option.toolbox.feature.dataView = barDataView(['时间/日期', '总用电量', '总订单金额', '尖时段总用电量', '峰时段总用电量', '平时段总用电量', '谷时段总用电量'], '电量电费') option.toolbox.feature.dataView = barDataView(
[
"时间/日期",
"总用电量",
"总订单金额",
"尖时段总用电量",
"峰时段总用电量",
"平时段总用电量",
"谷时段总用电量",
],
"电量电费"
);
this.chart.setOption(option); this.chart.setOption(option);
}); });
}, },

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,