From b5492374fcf269083883d8315f04c64fb20db737 Mon Sep 17 00:00:00 2001 From: yjh_yyds <2944425955@qq.com> Date: Fri, 30 Aug 2024 15:02:58 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=BC=82=E5=B8=B8=E8=AE=A2?= =?UTF-8?q?=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../evcs/cdjgpc/domain/XhpcChargeOrder.java | 115 ++ .../xhpc/evcs/cdjgpc/dto/CDConnectorInfo.java | 21 +- .../cdjgpc/dto/CDConnectorStatusInfo.java | 22 +- .../xhpc/evcs/cdjgpc/dto/CDEquipmentInfo.java | 8 + .../cdjgpc/dto/CDEquipmentV2GPowerInfo.java | 93 ++ .../com/xhpc/evcs/cdjgpc/dto/CDOrderInfo.java | 29 + .../evcs/cdjgpc/dto/CDRequirementInfo.java | 61 + .../cdjgpc/dto/CDRequirementInfoList.java | 33 + .../xhpc/evcs/cdjgpc/dto/CDStationInfo.java | 52 + .../evcs/cdjgpc/dto/CDStationPowerlnfo.java | 85 ++ .../com/xhpc/evcs/cdjgpc/dto/CDTaskInfo.java | 78 ++ .../com/xhpc/evcs/domain/AuthSecretToken.java | 11 + .../java/com/xhpc/evcs/dto/StationInfo.java | 28 +- .../com/xhpc/evcs/encryption/Aes128Cbc.java | 4 +- .../evcs/api/QueryStationsInfoController.java | 2 + .../xhpc/evcs/api/QueryTokenController.java | 7 +- .../CDNotificationStationInfoController.java | 262 +++- .../cdjgpc/jpa/XhpcChargeOrderRepository.java | 25 + .../CDConnectorChargeStatusInfoTask.java | 1 + .../CDNotificationChargeOrderInfoTask.java | 4 +- ...NotificationEquipmentV2GPowerInfoTask.java | 108 ++ .../CDNotificationOrderInfoTask.java | 9 + .../CDNotificationStationFeeTask.java | 2 +- .../CDNotificationStationInfoTask.java | 145 ++- .../CDNotificationStationPowerInfoTask.java | 110 ++ .../CDNotificationStationStatusTask.java | 2 +- ...seNotificationOperationStatusInfoTask.java | 3 + ...viseNotificationRealtimePowerInfoTask.java | 4 +- .../java/com/xhpc/evcs/config/EvcsFilter.java | 73 +- .../evcs/jpa/AuthSecretTokenRepository.java | 21 + .../evcs/notification/CheckChargeOrders.java | 10 +- .../NotificationCancelOrderTask.java | 1 + ...NotificationChargeOrderInfo4BonusTask.java | 1 + .../NotificationChargeOrderInfoTask.java | 1 + .../NotificationEquipChargeStatusTask.java | 1 + .../NotificationStartChargeResultTask.java | 5 +- .../NotificationStationStatusTask.java | 1 + .../NotificationStopChargeResultTask.java | 1 + .../src/main/resources/bootstrap.yml | 6 +- ruoyi-auth/src/main/resources/bootstrap.yml | 4 +- .../src/main/resources/bootstrap.yml | 6 +- .../src/main/resources/bootstrap.yml | 4 +- .../src/main/resources/bootstrap.yml | 4 +- .../src/main/resources/bootstrap.yml | 4 +- .../src/main/resources/bootstrap.yml | 4 +- .../src/main/resources/bootstrap.yml | 4 +- xhpc-modules/xhpc-activity/pom.xml | 11 + .../XhpcTradebillCommonController.java | 9 +- .../XhpcTradebillInternetBillController.java | 45 +- .../XhpcTradebillUploadRecordDomain.java | 20 +- .../mapper/XhpcDeviceMessageMapper.java | 2 +- .../mapper/XhpcHistoryOrderMapper.java | 4 + .../XhpcTradebillUploadRecordMapper.java | 2 + .../xhpc/activity/service/CommonService.java | 6 +- .../activity/service/InternetBillService.java | 11 +- .../service/impl/CommonServiceImpl.java | 18 +- .../service/impl/InternetBillServiceImpl.java | 216 +++- .../service/impl/PileLogServiceImpl.java | 2 +- .../impl/XhpcClearingCheckoutServiceImpl.java | 36 +- .../com/xhpc/activity/utils/ExcelExp.java | 74 ++ .../com/xhpc/activity/utils/ExcelUtilYu.java | 1121 +++++++++++++++++ .../com/xhpc/activity/vo/XDTTradebillVo.java | 187 +-- .../src/main/resources/bootstrap.yml | 4 +- .../mapper/XhpcClearingHistoryOrderMapper.xml | 14 +- .../mapper/XhpcDeviceMessageMapper.xml | 6 +- .../mapper/XhpcHistoryOrderMapper.xml | 75 ++ .../XhpcTradebillUploadRecordMapper.xml | 144 ++- .../src/main/resources/bootstrap.yml | 4 +- .../controller/XhpcTerminalController.java | 23 +- .../station/mapper/XhpcTerminalMapper.java | 2 + .../station/service/IXhpcTerminalService.java | 1 + .../service/XhpcTerminalServiceImpl.java | 9 + .../src/main/resources/bootstrap.yml | 4 +- .../resources/mapper/XhpcTerminalMapper.xml | 23 + xhpc-modules/xhpc-common/pom.xml | 5 + .../com/xhpc/common/api/PowerPileService.java | 8 + .../common/api/dto/ChargingStationDto.java | 10 + .../api/factory/PowerPileFallbackFactory.java | 10 + .../common/data/down/RequirementInfoDto.java | 44 + .../data/down/RequirementInfoListDto.java | 20 + .../src/main/resources/bootstrap.yml | 4 +- .../order/api/XhpcPileOrderController.java | 120 +- .../XhpcStopChargingOrderController.java | 59 +- .../order/mapper/XhpcChargeOrderMapper.java | 2 +- .../service/IXhpcChargeOrderService.java | 6 + .../impl/XhpcChargeOrderServiceImpl.java | 5 + .../impl/XhpcRealTimeOrderServiceImpl.java | 6 +- .../src/main/resources/bootstrap.yml | 10 +- .../mapper/XhpcChargeOrderMapper.xml | 18 + .../mapper/XhpcHistoryOrderMapper.xml | 6 +- .../mapper/XhpcRealTimeOrderMapper.xml | 1 + .../controller/XhpcRefundOrderController.java | 3 + .../src/main/resources/bootstrap.yml | 4 +- .../xhpc/pp/controller/StationController.java | 16 + .../xhpc/pp/utils/security/CP56Time2a.java | 4 +- .../src/main/resources/bootstrap.yml | 4 +- .../controller/XhpcAppUserController.java | 14 +- .../user/mapper/XhpcUserVehicleMapper.java | 2 + .../impl/XhpcUserVehicleServiceImpl.java | 3 + .../src/main/resources/bootstrap.yml | 4 +- .../mapper/XhpcUserVehicleMapper.xml | 4 + .../src/main/resources/bootstrap.yml | 4 +- 102 files changed, 3591 insertions(+), 353 deletions(-) create mode 100644 evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/cdjgpc/domain/XhpcChargeOrder.java create mode 100644 evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/cdjgpc/dto/CDEquipmentV2GPowerInfo.java create mode 100644 evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/cdjgpc/dto/CDRequirementInfo.java create mode 100644 evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/cdjgpc/dto/CDRequirementInfoList.java create mode 100644 evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/cdjgpc/dto/CDStationPowerlnfo.java create mode 100644 evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/cdjgpc/dto/CDTaskInfo.java create mode 100644 evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/cdjgpc/jpa/XhpcChargeOrderRepository.java create mode 100644 evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/cdjgpc/notification/CDNotificationEquipmentV2GPowerInfoTask.java create mode 100644 evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/cdjgpc/notification/CDNotificationStationPowerInfoTask.java create mode 100644 xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/utils/ExcelExp.java create mode 100644 xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/utils/ExcelUtilYu.java create mode 100644 xhpc-modules/xhpc-common/src/main/java/com/xhpc/common/data/down/RequirementInfoDto.java create mode 100644 xhpc-modules/xhpc-common/src/main/java/com/xhpc/common/data/down/RequirementInfoListDto.java diff --git a/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/cdjgpc/domain/XhpcChargeOrder.java b/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/cdjgpc/domain/XhpcChargeOrder.java new file mode 100644 index 00000000..ae2de681 --- /dev/null +++ b/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/cdjgpc/domain/XhpcChargeOrder.java @@ -0,0 +1,115 @@ +package com.xhpc.evcs.cdjgpc.domain; + +import com.xhpc.common.core.web.domain.BaseEntity; +import lombok.Data; + +import javax.persistence.*; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 充电订单 + * + * @author yuyang + * @Date 2024-08-16 14:07 + */ +@Table(name = "xhpc_charge_order") +@Entity +@Data +public class XhpcChargeOrder extends BaseEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "charge_order_id", nullable = false) + private Long id; + + @Column(name = "charging_station_id") + private Long chargingStationId; + + @Column(name = "user_id") + private Long userId; + + @Column(name = "terminal_id") + private Long terminalId; + + @Column(name = "internet_serial_number", length = 50) + private String internetSerialNumber; + + @Column(name = "serial_number", length = 50) + private String serialNumber; + + @Column(name = "start_soc", length = 50) + private String startSoc; + + @Column(name = "end_soc", length = 50) + private String endSoc; + + @Column(name = "source") + private Integer source; + + @Column(name = "status") + private Integer status; + + @Column(name = "del_flag") + private Integer delFlag; + + @Column(name = "rate_model_id") + private Long rateModelId; + + @Column(name = "charging_mode", length = 50) + private String chargingMode; + + @Column(name = "start_time") + private Date startTime; + + @Column(name = "end_time") + private Date endTime; + + @Column(name = "charging_time", length = 50) + private String chargingTime; + + @Column(name = "charging_degree") + private BigDecimal chargingDegree; + + @Column(name = "type", length = 50) + private String type; + + @Column(name = "erro_remark", length = 50) + private String erroRemark; + + @Column(name = "amount_charged") + private BigDecimal amountCharged; + + @Column(name = "power", length = 50) + private String power; + + @Column(name = "charging_time_number") + private Long chargingTimeNumber; + + @Column(name = "driver_id", length = 50) + private String driverId; + + @Column(name = "charging_amt") + private Long chargingAmt; + + @Column(name = "Plate_num", length = 50) + private String plateNum; + + @Column(name = "evcs_order_no", length = 50) + private String evcsOrderNo; + + @Column(name = "tenant_id", length = 50) + private String tenantId; + + @Column(name = "vin_normal", length = 50) + private String vinNormal; + + @Column(name = "station_total_warning_num") + private Integer stationTotalWarningNum; + + @Column(name = "charging_capacity") + private Integer chargingCapacity; + + @Column(name = "suncha_status") + private Integer sunchaStatus; + +} diff --git a/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/cdjgpc/dto/CDConnectorInfo.java b/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/cdjgpc/dto/CDConnectorInfo.java index 85cb2f69..2c6a4419 100644 --- a/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/cdjgpc/dto/CDConnectorInfo.java +++ b/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/cdjgpc/dto/CDConnectorInfo.java @@ -54,8 +54,26 @@ public class CDConnectorInfo { @Column(columnDefinition = "Decimal(10,1)") @JsonProperty("Power") public Double power; + +// @Column(columnDefinition = "Decimal(10,1)") +// @JsonProperty("ConstantVoltageUpperLimits") +// public Double constantVoltageUpperLimits; +// +// @Column(columnDefinition = "Decimal(10,1)") +// @JsonProperty("ConstantVoltageLowerLimits") +// public Double constantVoltageLowerLimits; +// +// @Column(columnDefinition = "Decimal(10,1)") +// @JsonProperty("ConstantCurrentUpperLimits") +// public Double constantCurrentUpperLimits; +// +// @Column(columnDefinition = "Decimal(10,1)") +// @JsonProperty("ConstantCurrentLowerLimits") +// public Double constantCurrentLowerLimits; + // @JsonProperty("ParkNo") // public String ParkNo; + @JsonProperty("NationalStandard") public Integer nationalStandard; /** @@ -77,5 +95,6 @@ public class CDConnectorInfo { @JsonProperty("OpreateStatus") public Integer opreateStatus; - +// @JsonProperty("OperateHours") +// public String operateHours; } diff --git a/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/cdjgpc/dto/CDConnectorStatusInfo.java b/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/cdjgpc/dto/CDConnectorStatusInfo.java index 6610c3e9..cba40538 100644 --- a/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/cdjgpc/dto/CDConnectorStatusInfo.java +++ b/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/cdjgpc/dto/CDConnectorStatusInfo.java @@ -60,8 +60,22 @@ public class CDConnectorStatusInfo { */ @JsonProperty("Status") public Integer status; - - - - +// +// /** +// * 接口状态描述 +// */ +// @JsonProperty("StatusDesc") +// public String statusDesc; +// +// /** +// * 车位状态 +// */ +// @JsonProperty("ParkStatus") +// public Integer parkStatus; +// +// /** +// * 地锁状态 +// */ +// @JsonProperty("LockStatus") +// public Integer lockStatus; } diff --git a/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/cdjgpc/dto/CDEquipmentInfo.java b/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/cdjgpc/dto/CDEquipmentInfo.java index 03f7f62a..fb885127 100644 --- a/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/cdjgpc/dto/CDEquipmentInfo.java +++ b/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/cdjgpc/dto/CDEquipmentInfo.java @@ -6,6 +6,7 @@ import com.xhpc.evcs.dto.EquipmentInfo; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; +import javax.persistence.Column; import javax.persistence.Transient; import java.util.List; @@ -103,6 +104,7 @@ public class CDEquipmentInfo { * 额定功率 */ @JsonProperty("EquipmentPower") + @Column(columnDefinition = "Decimal(10,1)") public Double equipmentPower; /** * 新国标 @@ -134,4 +136,10 @@ public class CDEquipmentInfo { */ @JsonProperty("EquipmentClassificatlon") public Integer equipmentClassificatlon; +// /** +// * 是否支持 V2G +// */ +// @JsonProperty("V2GSupport") +// public Integer v2GSupport; + } diff --git a/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/cdjgpc/dto/CDEquipmentV2GPowerInfo.java b/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/cdjgpc/dto/CDEquipmentV2GPowerInfo.java new file mode 100644 index 00000000..b1283add --- /dev/null +++ b/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/cdjgpc/dto/CDEquipmentV2GPowerInfo.java @@ -0,0 +1,93 @@ +package com.xhpc.evcs.cdjgpc.dto; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import lombok.Data; + +import javax.persistence.Column; +/** + * V2G 实时负荷(1min 时点负荷值) + */ +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ + "StationID", + "OperatorID", + "EquipmentOwnerID", + "EquipmentID", + "ChargeStatus", + "TsMin", + "TsHour", + "TsDay", + "TsMonth", + "AnalysisReport" +}) +@Data +public class CDEquipmentV2GPowerInfo { + /** + * 充电桩ID + */ + @JsonProperty("StationID") + public String stationID; + /** + * 运营平台 ID + */ + @JsonProperty("OperatorID") + public String operatorID; + /** + * 产权所属单位 ID + */ + @JsonProperty("EquipmentOwnerID") + public String equipmentOwnerID; + /** + * 设备编码 + */ + @JsonProperty("EquipmentID") + public String equipmentID; + /** + * 充放电状态(1.充电 2放电) + */ + @JsonProperty("ChargeStatus") + public Integer chargeStatus; + /** + * 设备实时负荷值 + */ + @JsonProperty("Power") + @Column(columnDefinition = "Decimal(10,2)") + public Double power; + /** + * 时间点 1 分钟一个刻度 yyyymmddhhmm + */ + @JsonProperty("TsMin") + public String tsMin; + /** + * 时 yyyymmddhh + */ + @JsonProperty("TsHour") + public String tsHour; + /** + * 日 yyyymmdd + */ + @JsonProperty("TsDay") + public String tsDay; + /** + * 月 yyyymm + */ + @JsonProperty("TsMonth") + public String tsMonth; + /** + * 年 yyyy + */ + @JsonProperty("TsYear") + public String tsYear; + + + + + + + + + + +} diff --git a/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/cdjgpc/dto/CDOrderInfo.java b/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/cdjgpc/dto/CDOrderInfo.java index 852b82a4..e08ccc60 100644 --- a/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/cdjgpc/dto/CDOrderInfo.java +++ b/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/cdjgpc/dto/CDOrderInfo.java @@ -121,6 +121,35 @@ public class CDOrderInfo { @JsonProperty("Elect") @Column(columnDefinition = "Decimal(10,2)") public Double elect; + +// /** +// * 尖阶段电量 +// */ +// @JsonProperty("CuspElect") +// @Column(columnDefinition = "Decimal(10,4)") +// public Double cuspElect; +// +// /** +// * 峰阶段电量 +// */ +// @JsonProperty("PeakElect") +// @Column(columnDefinition = "Decimal(10,4)") +// public Double peakElect; +// +// /** +// * 平阶段电量 +// */ +// @JsonProperty("FlatElect") +// @Column(columnDefinition = "Decimal(10,4)") +// public Double flatElect; +// +// /** +// * 谷阶段电量 +// */ +// @JsonProperty("ValleyElect") +// @Column(columnDefinition = "Decimal(10,4)") +// public Double valleyElect; + /** * 本次充电开始时间 */ diff --git a/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/cdjgpc/dto/CDRequirementInfo.java b/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/cdjgpc/dto/CDRequirementInfo.java new file mode 100644 index 00000000..7a148538 --- /dev/null +++ b/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/cdjgpc/dto/CDRequirementInfo.java @@ -0,0 +1,61 @@ +package com.xhpc.evcs.cdjgpc.dto; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import lombok.Data; + +import java.util.List; + +/** + * 调控需求(RequirementInfo) + */ +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ + "Name", + "Area", + "Code", + "list", + "requireDate", + "releaseTime", + "releaseTime" +}) +@Data +public class CDRequirementInfo { + /** + * 需求名称 + */ + @JsonProperty("Name") + public String name; + /** + * 需求地区 + */ + @JsonProperty("Area") + public String area; + /** + * 需求编号 + */ + @JsonProperty("Code") + public String code; + /** + * 时段责任量 List + */ + @JsonProperty("list") + public List list; + /** + * 需求日期 + */ + @JsonProperty("RequireDate") + public String requireDate; + /** + * 发布时间 + */ + @JsonProperty("ReleaseTime") + public String releaseTime; + /** + * 下发时间 + */ + @JsonProperty("DeliveryTime") + public String deliveryTime; + +} diff --git a/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/cdjgpc/dto/CDRequirementInfoList.java b/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/cdjgpc/dto/CDRequirementInfoList.java new file mode 100644 index 00000000..1438e809 --- /dev/null +++ b/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/cdjgpc/dto/CDRequirementInfoList.java @@ -0,0 +1,33 @@ +package com.xhpc.evcs.cdjgpc.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +/** + * 调控需求 + * @author yuyang + * @Date 2024-08-20 10:14 + */ +@Data +public class CDRequirementInfoList { + + /** + * 开始时段 + */ + @JsonProperty("StartTime") + public String startTime; + + /** + * 结束时段 + */ + @JsonProperty("EndTime") + public String endTime; + + /** + * 需求时段响 + * 应量 + */ + @JsonProperty("Res") + public String res; + +} diff --git a/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/cdjgpc/dto/CDStationInfo.java b/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/cdjgpc/dto/CDStationInfo.java index 4c65aeaf..84dbf898 100644 --- a/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/cdjgpc/dto/CDStationInfo.java +++ b/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/cdjgpc/dto/CDStationInfo.java @@ -405,4 +405,56 @@ public class CDStationInfo extends CommonStationInfo { @Transient @JsonProperty("SwapEquipmentlnfos") public List swapEquipmentlnfos = null; + +// /** +// * 是否支持远程调控 +// */ +// @Transient +// @JsonProperty("SupportOrder2") +// public Integer supportOrder2; +// +// /** +// * 变压器装机容量 +// */ +// @Transient +// @JsonProperty("InstalledCapacity") +// @Column(columnDefinition = "Decimal(10,1)") +// public Double installedCapacity; +// +// /** +// * 备用容量 +// */ +// @Transient +// @JsonProperty("ReserveCapacity") +// @Column(columnDefinition = "Decimal(10,1)") +// public Double reserveCapacity; +// +// /** +// * 可响应时段 +// */ +// @Transient +// @JsonProperty("ResponsablePeriod") +// public String responsablePeriod; +// +// /** +// * 响应速率(min) +// */ +// @Transient +// @JsonProperty("ResponseRate") +// public String responseRate; +// +// /** +// * 当年最大可调能力 +// */ +// @Transient +// @Column(columnDefinition = "Decimal(10,1)") +// public String maxAdjustableCapacity; +// +// /** +// * 可调节时长 +// */ +// @Transient +// @JsonProperty("AdjustTime") +// public Integer adjustTime; + } diff --git a/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/cdjgpc/dto/CDStationPowerlnfo.java b/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/cdjgpc/dto/CDStationPowerlnfo.java new file mode 100644 index 00000000..7249962c --- /dev/null +++ b/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/cdjgpc/dto/CDStationPowerlnfo.java @@ -0,0 +1,85 @@ +package com.xhpc.evcs.cdjgpc.dto; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import lombok.Data; + +import javax.persistence.Column; + +/** + * 充电站实时负荷(1min 时点负荷值) + */ +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ + "StationID", + "OperatorID", + "EquipmentOwnerID", + "EleNo", + "Power", + "TsMin", + "TsHour", + "TsDay", + "TsMonth", + "AnalysisReport" +}) +@Data +public class CDStationPowerlnfo { + + /** + * 充电桩ID + */ + @JsonProperty("StationID") + public String stationID; + /** + * 运营平台 ID + */ + @JsonProperty("OperatorID") + public String operatorID; + /** + * 产权所属单位 ID + */ + @JsonProperty("EquipmentOwnerID") + public String equipmentOwnerID; + /** + * 户号编号 + */ + @JsonProperty("EleNo") + //@Column(columnDefinition = "Decimal(10,2)") + public String eleNo; + /** + * 站点实时负荷值 + */ + @JsonProperty("Power") + @Column(columnDefinition = "Decimal(10,2)") + public Double power; + /** + * 时间点 1 分钟一个刻度 yyyymmddhhmm + */ + @JsonProperty("TsMin") + public String tsMin; + /** + * 时 yyyymmddhh + */ + @JsonProperty("TsHour") + public String tsHour; + /** + * 日 yyyymmdd + */ + @JsonProperty("TsDay") + public String tsDay; + /** + * 月 yyyymm + */ + @JsonProperty("TsMonth") + public String tsMonth; + /** + * 年 yyyy + */ + @JsonProperty("TsYear") + public String tsYear; + + + + +} diff --git a/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/cdjgpc/dto/CDTaskInfo.java b/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/cdjgpc/dto/CDTaskInfo.java new file mode 100644 index 00000000..ab760dd8 --- /dev/null +++ b/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/cdjgpc/dto/CDTaskInfo.java @@ -0,0 +1,78 @@ +package com.xhpc.evcs.cdjgpc.dto; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import com.xhpc.evcs.cdjgpc.dto.CDRequirementInfoList; +import lombok.Data; + +import java.util.List; + +/** + * 调控任务 + * + * @author yuyang + * @Date 2024-08-16 10:59 + */ +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ + "TaskName", + "TaskCode", + "DemandDate", + "StationID", + "OperatorID", + "EquipmentOwnerID", + "EleNo", + "List", + "DeliveryTime" +}) +@Data +public class CDTaskInfo { + /** + * 任务名称 + */ + @JsonProperty("TaskName") + public String taskName; + /** + * 任务编码 + */ + @JsonProperty("TaskCode") + public String taskCode; + /** + * 响应日期 yyyy-MM-dd + */ + @JsonProperty("DemandDate") + public String demandDate; + + /** + * 充电桩ID + */ + @JsonProperty("StationID") + public String stationID; + /** + * 运营平台 ID + */ + @JsonProperty("OperatorID") + public String operatorID; + /** + * 产权所属单位 ID + */ + @JsonProperty("EquipmentOwnerID") + public String equipmentOwnerID; + /** + * 所属户号 + */ + @JsonProperty("EleNo") + public String eleNo; + /** + * 时段责任量 List + */ + @JsonProperty("List") + public List list; + /** + * 下发时间 + */ + @JsonProperty("DeliveryTime") + public String deliveryTime; + +} diff --git a/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/domain/AuthSecretToken.java b/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/domain/AuthSecretToken.java index 6ff1c0cf..1e3f38c3 100644 --- a/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/domain/AuthSecretToken.java +++ b/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/domain/AuthSecretToken.java @@ -43,6 +43,8 @@ public class AuthSecretToken { private Long lastPushOrder; + private Integer status; + public AuthSecretToken() { } @@ -63,6 +65,14 @@ public class AuthSecretToken { this.lastPushOrder = lastPushOrder; } + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + @Override public String toString() { return "AuthSecretToken{" + @@ -79,6 +89,7 @@ public class AuthSecretToken { ", tokenExpiry=" + tokenExpiry + ", encrypt=" + encrypt + ", lastPushOrder=" + lastPushOrder + + ", status=" + status + '}'; } } diff --git a/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/dto/StationInfo.java b/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/dto/StationInfo.java index ff954c69..14228545 100644 --- a/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/dto/StationInfo.java +++ b/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/dto/StationInfo.java @@ -29,6 +29,7 @@ import java.util.Map; "BusineHours", "ElectricityFee", "ServiceFee", + "ParkFee", "Payment", "SupportOrder", "EquipmentInfos" @@ -76,6 +77,9 @@ public class StationInfo extends CommonStationInfo { @JsonProperty("ServiceFee") public String serviceFee; @Transient + @JsonProperty("ParkFee") + public String parkFee; + @Transient @JsonProperty("Payment") public String payment; @Transient @@ -102,10 +106,24 @@ public class StationInfo extends CommonStationInfo { @Override public String toString() { - - return new ToStringBuilder(this).append("stationID", getStationId()).append("operatorID", getOperatorId()).append( - "equipmentOwnerID", getEquipmentOwnerId()).append("stationName", getStationName()).append("countryCode", - getCountryCode()).append("areaCode", areaCode).append("address", address).append("serviceTel", serviceTel).append("stationType", stationType).append("stationStatus", stationStatus).append("parkNums", parkNums).append("stationLng", stationLng).append("stationLat", stationLat).append("construction", construction).append("busineHours", busineHours).append("electricityFee", electricityFee).append("serviceFee", serviceFee).append("payment", payment).append("supportOrder", supportOrder).append("equipmentInfos", equipmentInfos).append("additionalProperties", additionalProperties).toString(); + return "StationInfo{" + + "areaCode='" + areaCode + '\'' + + ", address='" + address + '\'' + + ", serviceTel='" + serviceTel + '\'' + + ", stationType=" + stationType + + ", stationStatus=" + stationStatus + + ", parkNums=" + parkNums + + ", stationLng=" + stationLng + + ", stationLat=" + stationLat + + ", construction=" + construction + + ", busineHours='" + busineHours + '\'' + + ", electricityFee='" + electricityFee + '\'' + + ", serviceFee='" + serviceFee + '\'' + + ", parkFee='" + parkFee + '\'' + + ", payment='" + payment + '\'' + + ", supportOrder=" + supportOrder + + ", equipmentInfos=" + equipmentInfos + + ", additionalProperties=" + additionalProperties + + '}'; } - } diff --git a/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/encryption/Aes128Cbc.java b/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/encryption/Aes128Cbc.java index e5a13832..f5f62eff 100644 --- a/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/encryption/Aes128Cbc.java +++ b/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/encryption/Aes128Cbc.java @@ -69,9 +69,7 @@ public class Aes128Cbc { NoSuchAlgorithmException, IllegalBlockSizeException, UnsupportedEncodingException, NoSuchPaddingException, InvalidKeyException { - System.out.println(decryptString("vTGCo/ntYzY9ZLHnATipTR1WHP4hHjsB5byV2g62bxbNVQkGba8+u07Dv95vihuO+zYV" + - "/+9qwTUaSvFGUm0M1T9VMThVlsarbCMsBCgC2KE=", - "ojs67l46z3f7rhok", "tet9swfkyojkhaos" + System.out.println(decryptString("8LpncubmWiPCzY3V","8LpncubmWiPCzY3V", "av6A8QdnRaVRMXu6" )); //ujNoGsWRo5MyPKYOxeofKwgPEng3xF+yhM8DDjwtwHo= System.out.println(encrypt("{\"StationIDs\":[\"1\"]}", "8LpncubmWiPCzY3V", "av6A8QdnRaVRMXu6")); diff --git a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/QueryStationsInfoController.java b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/QueryStationsInfoController.java index 171f01c9..a41c223e 100644 --- a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/QueryStationsInfoController.java +++ b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/QueryStationsInfoController.java @@ -155,6 +155,7 @@ public class QueryStationsInfoController { chargingStationDto.setServiceTel(xhpcChargingStation.getServiceTel()); //车位数量 chargingStationDto.setParkNums(xhpcChargingStation.getParkNums()); + chargingStationDto.setParkFee(xhpcChargingStation.getParkingInstructions()); REDIS.setCacheObject(stationKey, chargingStationDto); } } @@ -170,6 +171,7 @@ public class QueryStationsInfoController { stationInfo.setStationLng(chargingStationDto.getLng()); stationInfo.setStationLat(chargingStationDto.getLat()); stationInfo.setConstruction(chargingStationDto.getConstruction()); + stationInfo.setParkFee(chargingStationDto.getParkFee()); String[] fees = getFees(chargingStationDto.getRateModelId()); if (fees != null) { stationInfo.setElectricityFee(fees[0]); diff --git a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/QueryTokenController.java b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/QueryTokenController.java index d2d2197c..21540447 100644 --- a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/QueryTokenController.java +++ b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/QueryTokenController.java @@ -68,7 +68,7 @@ public class QueryTokenController { if (xhpcInternetUser != null) { String operatorSecret = tokenRequest.getOperatorSecret(); AuthSecretToken authSecretTokenIn = - authSecretTokenRepository.findByOperatorId3irdptyAndSecretTokenTypeAndOperatorSecret( + authSecretTokenRepository.findByStatusAndOperatorId3irdptyAndSecretTokenTypeAndOperatorSecret(1, operatorID, AuthSecretToken.SECRET_TOKEN_TYPE_IN, operatorSecret).orElse(null); if (authSecretTokenIn == null) { resp.setRet("4003"); @@ -139,7 +139,7 @@ public class QueryTokenController { if (xhpcInternetUser != null) { String operatorSecret = tokenRequest.getOperatorSecret(); AuthSecretToken authSecretTokenIn = - authSecretTokenRepository.findByOperatorId3irdptyAndSecretTokenTypeAndOperatorSecret( + authSecretTokenRepository.findByStatusAndOperatorId3irdptyAndSecretTokenTypeAndOperatorSecret(2, operatorID, AuthSecretToken.SECRET_TOKEN_TYPE_IN, operatorSecret).orElse(null); if (authSecretTokenIn == null) { resp.setRet("4003"); @@ -195,7 +195,7 @@ public class QueryTokenController { if (xhpcInternetUser != null) { String operatorSecret = tokenRequest.getOperatorSecret(); AuthSecretToken authSecretTokenIn = - authSecretTokenRepository.findByOperatorId3irdptyAndSecretTokenTypeAndOperatorSecret( + authSecretTokenRepository.findByStatusAndOperatorId3irdptyAndSecretTokenTypeAndOperatorSecret(3, operatorID, AuthSecretToken.SECRET_TOKEN_TYPE_IN, operatorSecret).orElse(null); if (authSecretTokenIn == null) { resp.setRet("4003"); @@ -227,4 +227,5 @@ public class QueryTokenController { } return resp; } + } diff --git a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/cdjgpc/api/CDNotificationStationInfoController.java b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/cdjgpc/api/CDNotificationStationInfoController.java index b8153cc3..909b4eec 100644 --- a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/cdjgpc/api/CDNotificationStationInfoController.java +++ b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/cdjgpc/api/CDNotificationStationInfoController.java @@ -9,38 +9,32 @@ import com.xhpc.common.data.redis.CacheRateModel; import com.xhpc.common.data.redis.CacheRealtimeData; import com.xhpc.common.domain.XhpcTerminal; import com.xhpc.evcs.cdjgpc.dto.*; -import com.xhpc.evcs.cyc.dto.CYCNotificationStartChargeResultRequestData; import com.xhpc.evcs.domain.AuthSecretToken; import com.xhpc.evcs.domain.XhpcInternetUser; import com.xhpc.evcs.domain.XhpcStationInternetBlacklist; import com.xhpc.evcs.dto.*; import com.xhpc.evcs.encryption.Aes128Cbc; import com.xhpc.evcs.encryption.EvcsConst; -import com.xhpc.evcs.http.ForbiddenException; -import com.xhpc.evcs.http.ServerInternalException; import com.xhpc.evcs.jpa.AuthSecretTokenRepository; import com.xhpc.evcs.jpa.XhpcInternetUserRepository; import com.xhpc.evcs.jpa.XhpcStationInternetBlacklistRepository; import com.xhpc.evcs.jpa.XhpcTerminalRepository; import com.xhpc.evcs.notification.CoreDispatcher; +import com.xhpc.evcs.cdjgpc.dto.CDRequirementInfo; +import com.xhpc.evcs.cdjgpc.dto.CDTaskInfo; import com.xhpc.evcs.utils.JSONUtil; import lombok.extern.slf4j.Slf4j; -import okhttp3.OkHttpClient; -import okhttp3.Request; -import okhttp3.Response; import org.springframework.web.bind.annotation.*; import static cn.hutool.core.util.NumberUtil.isInteger; import static com.xhpc.common.data.redis.StaticBeanUtil.REDIS; import javax.annotation.Resource; -import java.io.IOException; import java.math.BigDecimal; import java.time.Instant; import java.util.*; -import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; -import static com.xhpc.evcs.config.EvcsFilter.encryptReqOut; + import static com.xhpc.evcs.domain.AuthSecretToken.SECRET_TOKEN_TYPE_IN; import static com.xhpc.evcs.domain.AuthSecretToken.SECRET_TOKEN_TYPE_OUT; @@ -81,6 +75,48 @@ public class CDNotificationStationInfoController extends CoreDispatcher { cdStationInfo.setEquipmentInfos(new ArrayList<>()); //查询场站是桩是否对应上 ChargingStationDto stationDto = REDIS.getCacheObject("station:"+chargingStationId); + + CacheRateModel cacheRateModel = REDIS.getCacheObject("rateModel:" + stationDto.getRateModelId()); + + StringBuilder price = new StringBuilder(); + StringBuilder svcPrice = new StringBuilder(); + + Integer t1Price = cacheRateModel.getT1Price(); + Integer t1SvcPrice = cacheRateModel.getT1SvcPrice(); + Integer t2Price = cacheRateModel.getT2Price(); + Integer t2SvcPrice = cacheRateModel.getT2SvcPrice(); + Integer t3Price = cacheRateModel.getT3Price(); + Integer t3SvcPrice = cacheRateModel.getT3SvcPrice(); + Integer t4Price = cacheRateModel.getT4Price(); + Integer t4SvcPrice = cacheRateModel.getT4SvcPrice(); + + if(cacheRateModel.getTfPricesSeq() !=null && cacheRateModel.getTfPricesSeq().length>0){ + price.append("{"); + svcPrice.append("{"); + for (int i = 0; i < cacheRateModel.getTfPricesSeq().length; i++) { + String time = getTime(i); + String s = cacheRateModel.getTfPricesSeq()[i]; + + if("00".equals(s)){ + price.append(time).append(t1Price.toString()).append(","); + svcPrice.append(time).append(t1SvcPrice.toString()).append(","); + }else if("01".equals(s)){ + price.append(time).append(t2Price.toString()).append(","); + svcPrice.append(time).append(t2SvcPrice.toString()).append(","); + }else if("02".equals(s)){ + price.append(time).append(t3Price.toString()).append(","); + svcPrice.append(time).append(t3SvcPrice.toString()).append(","); + }else{ + price.append(time).append(t4Price.toString()).append(","); + svcPrice.append(time).append(t4SvcPrice.toString()).append(","); + } + } + price.deleteCharAt(price.length()-1).append("}"); + svcPrice.deleteCharAt(price.length()-1).append("}"); + } + cdStationInfo.setElectricityFee(price.toString()); + cdStationInfo.setServiceFee(svcPrice.toString()); + Set pks = stationDto.getPiles(); if (pks != null) { List cdEquipmentInfos = new ArrayList<>(); @@ -730,6 +766,64 @@ public class CDNotificationStationInfoController extends CoreDispatcher { } + /** + * 需求通知推送 + * @param commonRequest + * @return + * @throws Exception + */ + @PostMapping("/v30/notification_requirement") + public CommonResponse notificationRequirement(@RequestBody(required = false) CommonRequest commonRequest)throws Exception { + CommonResponse resp = new CommonResponse(); + resp.setRet(EvcsConst.RET_FAIL); + CDRequirementInfo cdRequirementInfo = JSONUtil.readParams(commonRequest.getData(), CDRequirementInfo.class); + if (cdRequirementInfo == null) { + resp.setMsg("Request or token params validation failed"); + resp.setRet("4002"); + } else { + R r = powerPileService.addRequirementInfo(cdRequirementInfo.getName(), cdRequirementInfo.getArea(), cdRequirementInfo.getCode(), cdRequirementInfo.getList().toString(), cdRequirementInfo.getRequireDate(), cdRequirementInfo.getReleaseTime(), cdRequirementInfo.getDeliveryTime()); + if(r.getCode()==200){ + resp.setMsg("已接收数据"); + resp.setRet("0"); + }else{ + resp.setRet("-1"); + resp.setMsg("系统繁忙,此时请求方稍后重试"); + } + } + return resp; + } + + /** + * 需求通知推送 + * @param commonRequest + * @return + * @throws Exception + */ + @PostMapping("/v30/notification_task") + public CommonResponse notificationTask(@RequestBody(required = false) CommonRequest commonRequest)throws Exception { + CommonResponse resp = new CommonResponse(); + resp.setRet(EvcsConst.RET_FAIL); + CDTaskInfo cdTaskInfo = JSONUtil.readParams(commonRequest.getData(), CDTaskInfo.class); + if (cdTaskInfo == null) { + resp.setMsg("Request or token params validation failed"); + resp.setRet("4002"); + } else { + R r = powerPileService.addNotificationTask(cdTaskInfo.getTaskName(), cdTaskInfo.getTaskCode(), cdTaskInfo.getDemandDate(), cdTaskInfo.getStationID(), cdTaskInfo.getOperatorID(), cdTaskInfo.getEquipmentOwnerID(), cdTaskInfo.getEleNo(),cdTaskInfo.getList().toString(),cdTaskInfo.getDeliveryTime()); + if(r.getCode()==200){ + resp.setMsg("已接收数据"); + resp.setRet("0"); + }else{ + resp.setRet("-1"); + resp.setMsg("系统繁忙,此时请求方稍后重试"); + } + } + return resp; + } + + + + + //数据加密处理 @PostMapping("/v10/getEncrytReqout") public R getEncrytReqout(){ @@ -761,6 +855,8 @@ public class CDNotificationStationInfoController extends CoreDispatcher { // equipAuthRequest.setEquipAuthSeq("MA6DFCTD5202310161544441234"); // equipAuthRequest.setConnectorId("8083600020000101"); // equipAuthRequest.setQRCode("12312312312323"); + + // String data = JSONUtil.toJSONString(equipAuthRequest); // System.out.println("===data==="+data); // commonRequest.setData(data); @@ -770,31 +866,35 @@ public class CDNotificationStationInfoController extends CoreDispatcher { // authSecretTokenOut.getSigSecret(), commonRequest); // System.out.println("===tData==="+tData); - CommonRequest commonRequest = new CommonRequest<>(); - - Map map =new HashMap<>(); - map.put("PageNo","1"); - map.put("PageSize","10"); - String data = JSONUtil.toJSONString(map); - - //String data111 = Aes128Cbc.encrypt(data, "8LpncubmWiPCzY3V", "av6A8QdnRaVRMXu6"); - commonRequest.setData(data); - commonRequest.setOperatorId("MA25CNM38"); - AuthSecretToken authSecretTokenOut =authSecretTokenRepository.findByOperatorId3irdptyAndOperatorIdAndSecretTokenType( - "MA25CNM38", "MA6DFCTD5", SECRET_TOKEN_TYPE_IN).orElse(null); - - String result = okYu(commonRequest, "/query_stations_info", authSecretTokenOut,"MA25CNM38"); +// CommonRequest commonRequest = new CommonRequest<>(); +// +// EquipBizRequest equipBizRequest =new EquipBizRequest(); +// equipBizRequest.setEquipBizSeq("MA25CNM3800000"); +// equipBizRequest.setConnectorId("8083600001000801"); +// Map map =new HashMap<>(); +// map.put("PageNo","1"); +// map.put("PageSize","10"); +// String data = JSONUtil.toJSONString(equipBizRequest); +// +// String data111 = Aes128Cbc.encrypt(data, "8LpncubmWiPCzY3V", "av6A8QdnRaVRMXu6"); +// commonRequest.setData(data); +// commonRequest.setOperatorId("MA25CNM38"); +// AuthSecretToken authSecretTokenOut =authSecretTokenRepository.findByOperatorId3irdptyAndOperatorIdAndSecretTokenType( +// "MA25CNM38", "MA6DFCTD5", SECRET_TOKEN_TYPE_IN).orElse(null); +// +// String result = okYu(commonRequest, "/query_stations_info", authSecretTokenOut,"MA25CNM38"); +// +// +// System.out.println("==========result=============="+result); - System.out.println("==========result=============="+result); + String rawData = "CS/FmJAWR3rNx+k7rqPQcDDRpRMUkZmC0xiOV8EDpxliyL9t+AzTkRDV1ydr4Tl8fmSbgqhSoDvdO1CVNYbz8ObjD8El0G1nr/S980lxvO0="; + String dataSecret="8LpncubmWiPCzY3V"; + String dataSecretIV="av6A8QdnRaVRMXu6"; + String data = Aes128Cbc.encrypt(rawData, dataSecret, dataSecretIV); -// String rawData = "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"; -// String dataSecret="8LpncubmWiPCzY3V"; -// String dataSecretIV="av6A8QdnRaVRMXu6"; -// String data = Aes128Cbc.encrypt(rawData, dataSecret, dataSecretIV); - -// System.out.println("==========data=============="+data); + System.out.println("==========data=============="+data); }catch (Exception e){ e.printStackTrace(); @@ -802,5 +902,105 @@ public class CDNotificationStationInfoController extends CoreDispatcher { return R.fail(); } - + private String getTime(Integer number){ + String time =""; + if(number ==0){ + time ="00:00:00-00:30:00:"; + }else if(number ==1) { + time = "00:30:00-01:00:00:"; + }else if(number ==2) { + time = "01:00:00-01:30:00:"; + }else if(number ==3) { + time = "01:30:00-02:00:00:"; + }else if(number ==4) { + time = "02:00:00-02:30:00:"; + }else if(number ==5) { + time = "02:30:00-03:00:00:"; + }else if(number ==6) { + time = "03:00:00-03:30:00:"; + }else if(number ==7) { + time = "03:30:00-04:00:00:"; + }else if(number ==8) { + time = "04:00:00-04:30:00:"; + }else if(number ==9) { + time = "04:30:00-05:00:00:"; + }else if(number ==10) { + time = "05:00:00-05:30:00:"; + }else if(number ==11) { + time = "05:30:00-06:00:00:"; + }else if(number ==12) { + time = "06:00:00-06:30:00:"; + }else if(number ==13) { + time = "06:30:00-07:00:00:"; + }else if(number ==14) { + time = "07:00:00-07:30:00:"; + }else if(number ==15) { + time = "07:30:00-08:00:00:"; + }else if(number ==16) { + time = "08:00:00-08:30:00:"; + }else if(number ==17) { + time = "08:30:00-09:00:00:"; + }else if(number ==18) { + time = "09:00:00-09:30:00:"; + }else if(number ==19) { + time = "09:30:00-10:00:00:"; + }else if(number ==20) { + time = "10:00:00-10:30:00:"; + }else if(number ==21) { + time = "10:30:00-11:00:00:"; + }else if(number ==22) { + time = "11:00:00-11:30:00:"; + }else if(number ==23) { + time = "11:30:00-12:00:00:"; + }else if(number ==24) { + time = "12:00:00-12:30:00:"; + }else if(number ==25) { + time = "12:30:00-13:00:00:"; + }else if(number ==26) { + time = "13:00:00-13:30:00:"; + }else if(number ==27) { + time = "13:30:00-14:00:00:"; + }else if(number ==28) { + time = "14:00:00-14:30:00:"; + }else if(number ==29) { + time = "14:30:00-15:00:00:"; + }else if(number ==30){ + time ="15:00:00-15:30:00:"; + }else if(number ==31) { + time = "15:30:00-16:00:00:"; + }else if(number ==32) { + time = "16:00:00-16:30:00:"; + }else if(number ==33) { + time = "16:30:00-17:00:00:"; + }else if(number ==34) { + time = "17:00:00-17:30:00:"; + }else if(number ==35) { + time = "17:30:00-18:00:00:"; + }else if(number ==36) { + time = "18:00:00-18:30:00:"; + }else if(number ==37) { + time = "18:30:00-19:00:00:"; + }else if(number ==38) { + time = "19:00:00-19:30:00:"; + }else if(number ==39) { + time = "19:30:00-20:00:00:"; + }else if(number ==40){ + time ="20:00:00-20:30:00:"; + }else if(number ==41) { + time = "20:30:00-21:00:00:"; + }else if(number ==42) { + time = "21:00:00-21:30:00:"; + }else if(number ==43) { + time = "21:30:00-22:00:00"; + }else if(number ==44) { + time = "22:00:00-22:30:00:"; + }else if(number ==45) { + time = "22:30:00-23:00:00:"; + }else if(number ==46) { + time = "23:00:00-23:30:00"; + }else if(number ==47) { + time = "23:30:00-24:00:00:"; + } + return time; + } } diff --git a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/cdjgpc/jpa/XhpcChargeOrderRepository.java b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/cdjgpc/jpa/XhpcChargeOrderRepository.java new file mode 100644 index 00000000..6983061d --- /dev/null +++ b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/cdjgpc/jpa/XhpcChargeOrderRepository.java @@ -0,0 +1,25 @@ +package com.xhpc.evcs.cdjgpc.jpa; + +import com.xhpc.evcs.cdjgpc.domain.XhpcChargeOrder; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; +import org.springframework.data.repository.query.QueryByExampleExecutor; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * 充电站实时负荷 + * + * @author yuyang + * @Date 2024-08-16 14:04 + */ +@Repository +public interface XhpcChargeOrderRepository extends JpaRepository, + QueryByExampleExecutor, JpaSpecificationExecutor { + + + //查询充电中的数据 + List findByStatusAndDelFlagAndChargingStationIdOrderByChargingStationId(Integer status,Integer delflag,Long chargingStationId); + +} diff --git a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/cdjgpc/notification/CDConnectorChargeStatusInfoTask.java b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/cdjgpc/notification/CDConnectorChargeStatusInfoTask.java index c334fee3..f64efc40 100644 --- a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/cdjgpc/notification/CDConnectorChargeStatusInfoTask.java +++ b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/cdjgpc/notification/CDConnectorChargeStatusInfoTask.java @@ -39,6 +39,7 @@ public class CDConnectorChargeStatusInfoTask extends CoreDispatcher { private XhpcStationInternetBlacklistRepository xhpcStationInternetBlacklistRepo; private final Logger logger = LoggerFactory.getLogger(CDConnectorChargeStatusInfoTask.class); + //9099开放定时任务 9009不开放 /** * 设备充电中状态变化推送(我们平台推送成都市平台) --已推送 * 实时数据没40秒 diff --git a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/cdjgpc/notification/CDNotificationChargeOrderInfoTask.java b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/cdjgpc/notification/CDNotificationChargeOrderInfoTask.java index f981319b..15f5aa9f 100644 --- a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/cdjgpc/notification/CDNotificationChargeOrderInfoTask.java +++ b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/cdjgpc/notification/CDNotificationChargeOrderInfoTask.java @@ -29,7 +29,7 @@ import static com.xhpc.common.data.redis.StaticBeanUtil.REDIS; import static com.xhpc.evcs.domain.AuthSecretToken.SECRET_TOKEN_TYPE_OUT; /** - * + * 推送充电订单信息 * @author yuyang * @date 2023-09-24 19:27 */ @@ -42,7 +42,7 @@ public class CDNotificationChargeOrderInfoTask extends CoreDispatcher { private final Logger logger = LoggerFactory.getLogger(NotificationChargeOrderInfoTask.class); - //现阶段不开放 + //9099开放定时任务 9009不开放 //@Scheduled(fixedRate = 1000 * 15) public void run() throws JsonProcessingException { diff --git a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/cdjgpc/notification/CDNotificationEquipmentV2GPowerInfoTask.java b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/cdjgpc/notification/CDNotificationEquipmentV2GPowerInfoTask.java new file mode 100644 index 00000000..7ad74987 --- /dev/null +++ b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/cdjgpc/notification/CDNotificationEquipmentV2GPowerInfoTask.java @@ -0,0 +1,108 @@ +package com.xhpc.evcs.cdjgpc.notification; + +import cn.hutool.core.date.DateUtil; +import com.xhpc.common.data.redis.CacheBmsReqChargerOutputData; +import com.xhpc.evcs.cdjgpc.dto.CDStationInfo; +import com.xhpc.evcs.domain.AuthSecretToken; +import com.xhpc.evcs.domain.XhpcStationInternetBlacklist; +import com.xhpc.evcs.dto.CommonRequest; +import com.xhpc.evcs.jpa.AuthSecretTokenRepository; +import com.xhpc.evcs.jpa.XhpcStationInternetBlacklistRepository; +import com.xhpc.evcs.notification.CoreDispatcher; +import com.xhpc.evcs.cdjgpc.domain.XhpcChargeOrder; +import com.xhpc.evcs.cdjgpc.dto.CDEquipmentV2GPowerInfo; +import com.xhpc.evcs.cdjgpc.jpa.XhpcChargeOrderRepository; +import com.xhpc.evcs.utils.JSONUtil; +import lombok.extern.slf4j.Slf4j; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.io.IOException; +import java.math.BigDecimal; +import java.util.*; + +import static com.xhpc.common.data.redis.StaticBeanUtil.REDIS; +import static com.xhpc.evcs.domain.AuthSecretToken.SECRET_TOKEN_TYPE_OUT; + +/** + * V2G 实时负荷信息推送 + * @author yuyang + * @Date 2024-08-20 9:19 + */ +@Component +@Slf4j +public class CDNotificationEquipmentV2GPowerInfoTask extends CoreDispatcher { + + @Resource + AuthSecretTokenRepository authSecretTokenRepository; + @Resource + XhpcChargeOrderRepository xhpcChargeOrderRepository; + @Resource + private XhpcStationInternetBlacklistRepository xhpcStationInternetBlacklistRepo; + + private final Logger logger = LoggerFactory.getLogger(CDNotificationEquipmentV2GPowerInfoTask.class); + + //9099开放定时任务 9009不开放 + //@Scheduled(cron = "0 0/1 * * * ? ") + public void run() throws IOException { + //不参与合作的电站 + List xhpcStationInternetBlacklist =xhpcStationInternetBlacklistRepo.findByInternetUserId(6L); + List stationKeys = new ArrayList<>(REDIS.keys("station:*")); + + AuthSecretToken authSecretTokenOut = + authSecretTokenRepository.findByOperatorId3irdptyAndOperatorIdAndSecretTokenType( + "MA6CC2LK7", "MA6DFCTD5", SECRET_TOKEN_TYPE_OUT).orElse(null); //todo + + for (String stationKey : stationKeys) { + //查询不合作的电桩 + for (XhpcStationInternetBlacklist xhpcStationInternetBlack : xhpcStationInternetBlacklist) { + if (!stationKey.substring(8).equals(xhpcStationInternetBlack.getChargingStationId().toString())) { + // maybe对接第三方 + if (authSecretTokenOut != null) { + String stationId = xhpcStationInternetBlack.getChargingStationId().toString(); + //获取所有该场站充电中订单 + List xhpcChargeOrderList = xhpcChargeOrderRepository.findByStatusAndDelFlagAndChargingStationIdOrderByChargingStationId(0, 0,xhpcStationInternetBlack.getChargingStationId()); + //获取订单bms数据 + for (int i = 0; i < xhpcChargeOrderList.size(); i++) { + XhpcChargeOrder xhpcChargeOrder = xhpcChargeOrderList.get(i); + String key = "order:".concat(xhpcChargeOrder.getSerialNumber())+".bms"; + CacheBmsReqChargerOutputData bms = REDIS.getCacheObject(key); + BigDecimal bigDecimal = new BigDecimal(bms.getPileVoltageOutput()).multiply(new BigDecimal(bms.getPileCurrentOutput())).divide(new BigDecimal(1000)).setScale(2, BigDecimal.ROUND_CEILING); + //获取场站信息 + String keys = "cdjgpc:station:".concat(stationId)+".notification"; + CDStationInfo cdStationInfo =REDIS.getCacheObject(keys); + + CDEquipmentV2GPowerInfo cdEquipmentV2GPowerInfo = new CDEquipmentV2GPowerInfo(); + cdEquipmentV2GPowerInfo.setStationID(stationId); + cdEquipmentV2GPowerInfo.setOperatorID(cdStationInfo.getOperatorId()); + cdEquipmentV2GPowerInfo.setEquipmentOwnerID(cdStationInfo.getEquipmentOwnerId()); + cdEquipmentV2GPowerInfo.setEquipmentID(xhpcChargeOrder.getSerialNumber().substring(0,14)); + cdEquipmentV2GPowerInfo.setChargeStatus(1); + cdEquipmentV2GPowerInfo.setPower(bigDecimal.doubleValue()); + + String format = DateUtil.format(new Date(), "yyyymmddhhmm"); + cdEquipmentV2GPowerInfo.setTsMin(format); + cdEquipmentV2GPowerInfo.setTsHour(format.substring(0,10)); + cdEquipmentV2GPowerInfo.setTsDay(format.substring(0,8)); + cdEquipmentV2GPowerInfo.setTsMonth(format.substring(0,6)); + cdEquipmentV2GPowerInfo.setTsYear(format.substring(0,4)); + + CommonRequest commonRequest = new CommonRequest<>(); + Map mapStationInfo =new HashMap<>(); + mapStationInfo.put("EquipmentV2GPowerInfo",cdEquipmentV2GPowerInfo); + String data = JSONUtil.toJSONString(mapStationInfo); + System.out.println("=======data========"+data); + commonRequest.setData(data); + String result =ok(commonRequest,"/notification_equipmentV2GPowerInfo",authSecretTokenOut); + System.out.println("=====V2G 实时负荷信息推送==result========"+result); + } + } + } + } + } + } + +} diff --git a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/cdjgpc/notification/CDNotificationOrderInfoTask.java b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/cdjgpc/notification/CDNotificationOrderInfoTask.java index 42c7f52d..1cdfa536 100644 --- a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/cdjgpc/notification/CDNotificationOrderInfoTask.java +++ b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/cdjgpc/notification/CDNotificationOrderInfoTask.java @@ -20,6 +20,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Example; +import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.io.IOException; @@ -59,6 +60,7 @@ public class CDNotificationOrderInfoTask extends CoreDispatcher { *订单信息推送 ---已推送--推送服务使用 * @throws IOException */ + //9099开放定时任务 9009不开放 //@Scheduled(fixedDelay = 1000 * 60) public void run() throws IOException { @@ -144,6 +146,7 @@ public class CDNotificationOrderInfoTask extends CoreDispatcher { commonRequest.setData(data); String responseBody = ok(commonRequest, "/notification_orderInfo", authSecretTokenOut); logger.info("========新平台推送=======responseBody============================="+cdChargeOrderInfo4BonusReq.getStartChargeSeq()); + logger.info("========新平台推送=======responseBody============================="+cdChargeOrderInfo4BonusReq.getStartChargeSeq()); CDCancelOrderResponse cdChargeOrder4BonusInfoRes = DTOJsonHelper.parseResponseData(responseBody, CDCancelOrderResponse.class, authSecretTokenOut); @@ -213,4 +216,10 @@ public class CDNotificationOrderInfoTask extends CoreDispatcher { } return etOrderMapping; } + + public static void main(String[] args) { + String operatorId ="MA6DFCTD5"; + String orderNo ="80836000100002022410110921367394"; + System.out.println(operatorId.concat(DateUtil.getYYYY()).concat(orderNo.substring(18))); + } } diff --git a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/cdjgpc/notification/CDNotificationStationFeeTask.java b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/cdjgpc/notification/CDNotificationStationFeeTask.java index 8d3909d3..ebc6e0c6 100644 --- a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/cdjgpc/notification/CDNotificationStationFeeTask.java +++ b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/cdjgpc/notification/CDNotificationStationFeeTask.java @@ -30,7 +30,7 @@ public class CDNotificationStationFeeTask extends CoreDispatcher { AuthSecretTokenRepository authSecretTokenRepository; private final Logger logger = LoggerFactory.getLogger(CDNotificationStationFeeTask.class); - //--推送服务使用 + //9099开放定时任务 9009不开放 //@Scheduled(fixedDelay = 1000 * 60) public void run() throws IOException { diff --git a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/cdjgpc/notification/CDNotificationStationInfoTask.java b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/cdjgpc/notification/CDNotificationStationInfoTask.java index 11444790..18a1aafa 100644 --- a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/cdjgpc/notification/CDNotificationStationInfoTask.java +++ b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/cdjgpc/notification/CDNotificationStationInfoTask.java @@ -1,6 +1,7 @@ package com.xhpc.evcs.cdjgpc.notification; import com.xhpc.common.api.dto.ChargingStationDto; +import com.xhpc.common.data.redis.CacheRateModel; import com.xhpc.evcs.cdjgpc.dto.CDEquipmentInfo; import com.xhpc.evcs.cdjgpc.dto.CDStationInfo; import com.xhpc.evcs.domain.AuthSecretToken; @@ -30,7 +31,7 @@ public class CDNotificationStationInfoTask extends CoreDispatcher { private XhpcStationInternetBlacklistRepository xhpcStationInternetBlacklistRepo; private final Logger logger = LoggerFactory.getLogger(CDNotificationStationInfoTask.class); - //推送新平台场站信息 + //9099开放定时任务 9009不开放 //@Scheduled(cron = "0 0 0 1/15 * ? ") public void run() throws IOException { try{ @@ -53,6 +54,46 @@ public class CDNotificationStationInfoTask extends CoreDispatcher { cdStationInfo.setEquipmentInfos(new ArrayList<>()); //查询场站是桩是否对应上 ChargingStationDto stationDto = REDIS.getCacheObject("station:"+chargingStationId); + CacheRateModel cacheRateModel = REDIS.getCacheObject("rateModel:" + stationDto.getRateModelId()); + + StringBuilder price = new StringBuilder(); + StringBuilder svcPrice = new StringBuilder(); + + Integer t1Price = cacheRateModel.getT1Price(); + Integer t1SvcPrice = cacheRateModel.getT1SvcPrice(); + Integer t2Price = cacheRateModel.getT2Price(); + Integer t2SvcPrice = cacheRateModel.getT2SvcPrice(); + Integer t3Price = cacheRateModel.getT3Price(); + Integer t3SvcPrice = cacheRateModel.getT3SvcPrice(); + Integer t4Price = cacheRateModel.getT4Price(); + Integer t4SvcPrice = cacheRateModel.getT4SvcPrice(); + + if(cacheRateModel.getTfPricesSeq() !=null && cacheRateModel.getTfPricesSeq().length>0){ + price.append("{"); + svcPrice.append("{"); + for (int i = 0; i < cacheRateModel.getTfPricesSeq().length; i++) { + String time = getTime(i); + String s = cacheRateModel.getTfPricesSeq()[i]; + + if("00".equals(s)){ + price.append(time).append(t1Price.toString()).append(","); + svcPrice.append(time).append(t1SvcPrice.toString()).append(","); + }else if("01".equals(s)){ + price.append(time).append(t2Price.toString()).append(","); + svcPrice.append(time).append(t2SvcPrice.toString()).append(","); + }else if("02".equals(s)){ + price.append(time).append(t3Price.toString()).append(","); + svcPrice.append(time).append(t3SvcPrice.toString()).append(","); + }else{ + price.append(time).append(t4Price.toString()).append(","); + svcPrice.append(time).append(t4SvcPrice.toString()).append(","); + } + } + price.deleteCharAt(price.length()-1).append("}"); + svcPrice.deleteCharAt(price.length()-1).append("}"); + } + cdStationInfo.setElectricityFee(price.toString()); + cdStationInfo.setServiceFee(svcPrice.toString()); Set pks = stationDto.getPiles(); if (pks != null) { List cdEquipmentInfos = new ArrayList<>(); @@ -86,4 +127,106 @@ public class CDNotificationStationInfoTask extends CoreDispatcher { } } + private String getTime(Integer number){ + String time =""; + if(number ==0){ + time ="00:00:00-00:30:00:"; + }else if(number ==1) { + time = "00:30:00-01:00:00:"; + }else if(number ==2) { + time = "01:00:00-01:30:00:"; + }else if(number ==3) { + time = "01:30:00-02:00:00:"; + }else if(number ==4) { + time = "02:00:00-02:30:00:"; + }else if(number ==5) { + time = "02:30:00-03:00:00:"; + }else if(number ==6) { + time = "03:00:00-03:30:00:"; + }else if(number ==7) { + time = "03:30:00-04:00:00:"; + }else if(number ==8) { + time = "04:00:00-04:30:00:"; + }else if(number ==9) { + time = "04:30:00-05:00:00:"; + }else if(number ==10) { + time = "05:00:00-05:30:00:"; + }else if(number ==11) { + time = "05:30:00-06:00:00:"; + }else if(number ==12) { + time = "06:00:00-06:30:00:"; + }else if(number ==13) { + time = "06:30:00-07:00:00:"; + }else if(number ==14) { + time = "07:00:00-07:30:00:"; + }else if(number ==15) { + time = "07:30:00-08:00:00:"; + }else if(number ==16) { + time = "08:00:00-08:30:00:"; + }else if(number ==17) { + time = "08:30:00-09:00:00:"; + }else if(number ==18) { + time = "09:00:00-09:30:00:"; + }else if(number ==19) { + time = "09:30:00-10:00:00:"; + }else if(number ==20) { + time = "10:00:00-10:30:00:"; + }else if(number ==21) { + time = "10:30:00-11:00:00:"; + }else if(number ==22) { + time = "11:00:00-11:30:00:"; + }else if(number ==23) { + time = "11:30:00-12:00:00:"; + }else if(number ==24) { + time = "12:00:00-12:30:00:"; + }else if(number ==25) { + time = "12:30:00-13:00:00:"; + }else if(number ==26) { + time = "13:00:00-13:30:00:"; + }else if(number ==27) { + time = "13:30:00-14:00:00:"; + }else if(number ==28) { + time = "14:00:00-14:30:00:"; + }else if(number ==29) { + time = "14:30:00-15:00:00:"; + }else if(number ==30){ + time ="15:00:00-15:30:00:"; + }else if(number ==31) { + time = "15:30:00-16:00:00:"; + }else if(number ==32) { + time = "16:00:00-16:30:00:"; + }else if(number ==33) { + time = "16:30:00-17:00:00:"; + }else if(number ==34) { + time = "17:00:00-17:30:00:"; + }else if(number ==35) { + time = "17:30:00-18:00:00:"; + }else if(number ==36) { + time = "18:00:00-18:30:00:"; + }else if(number ==37) { + time = "18:30:00-19:00:00:"; + }else if(number ==38) { + time = "19:00:00-19:30:00:"; + }else if(number ==39) { + time = "19:30:00-20:00:00:"; + }else if(number ==40){ + time ="20:00:00-20:30:00:"; + }else if(number ==41) { + time = "20:30:00-21:00:00:"; + }else if(number ==42) { + time = "21:00:00-21:30:00:"; + }else if(number ==43) { + time = "21:30:00-22:00:00"; + }else if(number ==44) { + time = "22:00:00-22:30:00:"; + }else if(number ==45) { + time = "22:30:00-23:00:00:"; + }else if(number ==46) { + time = "23:00:00-23:30:00"; + }else if(number ==47) { + time = "23:30:00-24:00:00:"; + } + return time; + } + } diff --git a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/cdjgpc/notification/CDNotificationStationPowerInfoTask.java b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/cdjgpc/notification/CDNotificationStationPowerInfoTask.java new file mode 100644 index 00000000..a270a42b --- /dev/null +++ b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/cdjgpc/notification/CDNotificationStationPowerInfoTask.java @@ -0,0 +1,110 @@ +package com.xhpc.evcs.cdjgpc.notification; + +import cn.hutool.core.date.DateUtil; +import com.xhpc.common.data.redis.CacheBmsReqChargerOutputData; +import com.xhpc.evcs.cdjgpc.dto.CDStationInfo; +import com.xhpc.evcs.domain.AuthSecretToken; +import com.xhpc.evcs.domain.XhpcStationInternetBlacklist; +import com.xhpc.evcs.dto.CommonRequest; +import com.xhpc.evcs.jpa.AuthSecretTokenRepository; +import com.xhpc.evcs.jpa.XhpcStationInternetBlacklistRepository; +import com.xhpc.evcs.notification.CoreDispatcher; +import com.xhpc.evcs.cdjgpc.domain.XhpcChargeOrder; +import com.xhpc.evcs.cdjgpc.dto.CDStationPowerlnfo; +import com.xhpc.evcs.cdjgpc.jpa.XhpcChargeOrderRepository; +import com.xhpc.evcs.utils.JSONUtil; +import lombok.extern.slf4j.Slf4j; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.io.IOException; +import java.math.BigDecimal; +import java.util.*; + +import static com.xhpc.common.data.redis.StaticBeanUtil.REDIS; +import static com.xhpc.evcs.domain.AuthSecretToken.SECRET_TOKEN_TYPE_OUT; + +/** + * 充电站实时负荷信息推送 + * + * @author yuyang + * @Date 2024-08-16 13:57 + */ +@Component +@Slf4j +public class CDNotificationStationPowerInfoTask extends CoreDispatcher { + @Resource + AuthSecretTokenRepository authSecretTokenRepository; + @Resource + XhpcChargeOrderRepository xhpcChargeOrderRepository; + @Resource + private XhpcStationInternetBlacklistRepository xhpcStationInternetBlacklistRepo; + + private final Logger logger = LoggerFactory.getLogger(CDNotificationStationPowerInfoTask.class); + + //9099开放定时任务 9009不开放 + //@Scheduled(cron = "0 0/1 * * * ? ") + public void run() throws IOException { + //不参与合作的电站 + List xhpcStationInternetBlacklist =xhpcStationInternetBlacklistRepo.findByInternetUserId(6L); + List stationKeys = new ArrayList<>(REDIS.keys("station:*")); + + AuthSecretToken authSecretTokenOut = + authSecretTokenRepository.findByOperatorId3irdptyAndOperatorIdAndSecretTokenType( + "MA6CC2LK7", "MA6DFCTD5", SECRET_TOKEN_TYPE_OUT).orElse(null); //todo + + for (String stationKey : stationKeys) { + //查询不合作的电桩 + for (XhpcStationInternetBlacklist xhpcStationInternetBlack : xhpcStationInternetBlacklist) { + if (!stationKey.substring(8).equals(xhpcStationInternetBlack.getChargingStationId().toString())) { + // maybe对接第三方 + if (authSecretTokenOut != null) { + String stationId = xhpcStationInternetBlack.getChargingStationId().toString(); + //获取所有该场站充电中订单 + List xhpcChargeOrderList = xhpcChargeOrderRepository.findByStatusAndDelFlagAndChargingStationIdOrderByChargingStationId(0, 0,xhpcStationInternetBlack.getChargingStationId()); + //获取订单bms数据 + BigDecimal bigDecimal1 = new BigDecimal(0); + for (int i = 0; i < xhpcChargeOrderList.size(); i++) { + XhpcChargeOrder xhpcChargeOrder = xhpcChargeOrderList.get(i); + String key = "order:".concat(xhpcChargeOrder.getSerialNumber())+".bms"; + CacheBmsReqChargerOutputData bms = REDIS.getCacheObject(key); + BigDecimal bigDecimal = new BigDecimal(bms.getPileVoltageOutput()).multiply(new BigDecimal(bms.getPileCurrentOutput())).divide(new BigDecimal(1000)).setScale(2, BigDecimal.ROUND_CEILING); + bigDecimal1 = bigDecimal1.add(bigDecimal); + } + + //获取场站信息 + String key = "cdjgpc:station:".concat(stationId)+".notification"; + CDStationInfo cdStationInfo =REDIS.getCacheObject(key); + + CDStationPowerlnfo cdStationPowerlnfo = new CDStationPowerlnfo(); + cdStationPowerlnfo.setStationID(stationId); + cdStationPowerlnfo.setOperatorID(cdStationInfo.getOperatorId()); + cdStationPowerlnfo.setEquipmentOwnerID(cdStationInfo.getEquipmentOwnerId()); + cdStationPowerlnfo.setEleNo(cdStationInfo.getAccountNumber()); + cdStationPowerlnfo.setPower(bigDecimal1.doubleValue()); + + String format = DateUtil.format(new Date(), "yyyymmddhhmm"); + cdStationPowerlnfo.setTsMin(format); + cdStationPowerlnfo.setTsHour(format.substring(0,10)); + cdStationPowerlnfo.setTsDay(format.substring(0,8)); + cdStationPowerlnfo.setTsMonth(format.substring(0,6)); + cdStationPowerlnfo.setTsYear(format.substring(0,4)); + + + CommonRequest commonRequest = new CommonRequest<>(); + Map mapStationInfo =new HashMap<>(); + mapStationInfo.put("StationPowerInfo",cdStationPowerlnfo); + String data = JSONUtil.toJSONString(mapStationInfo); + System.out.println("=======data========"+data); + commonRequest.setData(data); + String result =ok(commonRequest,"/notification_stationPowerInfo",authSecretTokenOut); + System.out.println("=====充电站实时负荷信息推送==result========"+result); + } + } + } + } + } +} diff --git a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/cdjgpc/notification/CDNotificationStationStatusTask.java b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/cdjgpc/notification/CDNotificationStationStatusTask.java index 69c53976..25de40c0 100644 --- a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/cdjgpc/notification/CDNotificationStationStatusTask.java +++ b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/cdjgpc/notification/CDNotificationStationStatusTask.java @@ -49,7 +49,7 @@ public class CDNotificationStationStatusTask extends CoreDispatcher { private XhpcStationInternetBlacklistRepository xhpcStationInternetBlacklistRepo; @Resource private XhpcTerminalRepository terminalRepository; - //--推送服务使用 + //9099开放定时任务 9009不开放 //@Scheduled(fixedRate = 1000 * 45) protected void run() throws IOException { diff --git a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/cdjgpc/notification/CDSuperviseNotificationOperationStatusInfoTask.java b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/cdjgpc/notification/CDSuperviseNotificationOperationStatusInfoTask.java index 1594ae2d..9c138e48 100644 --- a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/cdjgpc/notification/CDSuperviseNotificationOperationStatusInfoTask.java +++ b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/cdjgpc/notification/CDSuperviseNotificationOperationStatusInfoTask.java @@ -40,6 +40,9 @@ public class CDSuperviseNotificationOperationStatusInfoTask extends CoreDispatch PowerPileService powerPileService; private final Logger logger = LoggerFactory.getLogger(CDSuperviseNotificationOperationStatusInfoTask.class); + + + //9099开放定时任务 9009不开放 //@Scheduled(cron = "0 0 0 * * ? ") //@Scheduled(fixedRate = 1000 * 45) protected void run() throws IOException { diff --git a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/cdjgpc/notification/CDSuperviseNotificationRealtimePowerInfoTask.java b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/cdjgpc/notification/CDSuperviseNotificationRealtimePowerInfoTask.java index 13451ed9..ebb9f374 100644 --- a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/cdjgpc/notification/CDSuperviseNotificationRealtimePowerInfoTask.java +++ b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/cdjgpc/notification/CDSuperviseNotificationRealtimePowerInfoTask.java @@ -41,8 +41,8 @@ public class CDSuperviseNotificationRealtimePowerInfoTask extends CoreDispatcher PowerPileService powerPileService; private final Logger logger = LoggerFactory.getLogger(CDSuperviseNotificationOperationStatusInfoTask.class); - //@Scheduled(cron = "0 0 0 * * ? ") - //@Scheduled(fixedRate = 1000 * 45) + //9099开放定时任务 9009不开放 + //@Scheduled(cron = "0 0/15 * * * ? ") protected void run() throws IOException { String replace = UUID.randomUUID().toString().replace("-", ""); AuthSecretToken authSecretTokenOut = diff --git a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/config/EvcsFilter.java b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/config/EvcsFilter.java index f3f1cf87..33366970 100644 --- a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/config/EvcsFilter.java +++ b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/config/EvcsFilter.java @@ -11,6 +11,7 @@ import com.fasterxml.jackson.databind.node.ObjectNode; import com.xhpc.evcs.domain.AuthSecretToken; import com.xhpc.evcs.dto.CommonRequest; import com.xhpc.evcs.dto.CommonResponse; +import com.xhpc.evcs.dto.EquipBizRequest; import com.xhpc.evcs.encryption.Aes128Cbc; import com.xhpc.evcs.encryption.EvcsConst; import com.xhpc.evcs.encryption.HMAC; @@ -39,16 +40,14 @@ import java.nio.charset.StandardCharsets; import java.security.InvalidAlgorithmParameterException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; -import java.util.Calendar; -import java.util.Date; -import java.util.Scanner; +import java.util.*; @SuppressWarnings({"Duplicates"}) //todo @Slf4j //@Component //spring boot way, see https://www.surasint.com/spring-boot-webfilter-instead-of-component/ //@Order(1) not supported, see https://github.com/spring-projects/spring-boot/issues/8276 -//成都市监管平台v10 恒大v20 新电途 v30 快电 v40 小桔v50 -@WebFilter(urlPatterns = {"/v1/*", "/v2/*", "/v10/*", "/v20/*"}, filterName = "v1n10filter") //multiple filters execute by filterName order +//成都市监管平台(蓉成充)v10 v20 川逸充 v30 +@WebFilter(urlPatterns = {"/v1/*", "/v2/*", "/v10/*", "/v20/*", "/v30/*"}, filterName = "v1n10filter") //multiple filters execute by filterName order public class EvcsFilter extends OncePerRequestFilter { @Resource @@ -99,28 +98,41 @@ public class EvcsFilter extends OncePerRequestFilter { if (servletPath.endsWith("/v1/query_token")) { log.info("================老接口过滤 token========operatorId=========="+operatorId); - authSecretTokenIn = authSecretTokenRepository.findByOperatorId3irdptyAndSecretTokenType(operatorId, + authSecretTokenIn = authSecretTokenRepository.findByStatusAndOperatorId3irdptyAndSecretTokenType(1,operatorId, AuthSecretToken.SECRET_TOKEN_TYPE_IN).orElse(null); handleQueryToken(request, response, chain, requestWrapper, bodyString, commonRequest, responseWrapper, authSecretTokenIn); }else if (servletPath.endsWith("/v10/query_token")) { - log.info("================新接口过滤 token========operatorId=========="+operatorId); - authSecretTokenIn = authSecretTokenRepository.findByOperatorId3irdptyAndSecretTokenType(operatorId, + log.info("================新监管平台(蓉城充) token========operatorId=========="+operatorId); + authSecretTokenIn = authSecretTokenRepository.findByStatusAndOperatorId3irdptyAndSecretTokenType(2,operatorId, AuthSecretToken.SECRET_TOKEN_TYPE_IN).orElse(null); handleQueryToken(request, response, chain, requestWrapper, bodyString, commonRequest, responseWrapper, authSecretTokenIn); }else if (servletPath.endsWith("/v20/query_token")) { - log.info("================新接口过滤 token========operatorId=========="+operatorId); - authSecretTokenIn = authSecretTokenRepository.findByOperatorId3irdptyAndSecretTokenType(operatorId, + log.info("================川逸充 token========operatorId=========="+operatorId); + authSecretTokenIn = authSecretTokenRepository.findByStatusAndOperatorId3irdptyAndSecretTokenType(3,operatorId, AuthSecretToken.SECRET_TOKEN_TYPE_IN).orElse(null); handleQueryToken(request, response, chain, requestWrapper, bodyString, commonRequest, responseWrapper, authSecretTokenIn); } else { if (authorization != null && authorization.startsWith("Bearer ")) { String token = authorization.replace("Bearer ", ""); - authSecretTokenIn = - authSecretTokenRepository.findByOperatorId3irdptyAndSecretTokenTypeAndTokenExpiryGreaterThan( - operatorId, AuthSecretToken.SECRET_TOKEN_TYPE_IN, now).orElse(null); + + if(servletPath.endsWith("/v1/")){ + authSecretTokenIn = + authSecretTokenRepository.findByStatusAndOperatorId3irdptyAndSecretTokenTypeAndTokenExpiryGreaterThan(1, + operatorId, AuthSecretToken.SECRET_TOKEN_TYPE_IN, now).orElse(null); + }else if(servletPath.endsWith("/v10/")){ + authSecretTokenIn = + authSecretTokenRepository.findByStatusAndOperatorId3irdptyAndSecretTokenTypeAndTokenExpiryGreaterThan(2, + operatorId, AuthSecretToken.SECRET_TOKEN_TYPE_IN, now).orElse(null); + }else if(servletPath.endsWith("/v20/")){ + authSecretTokenIn = + authSecretTokenRepository.findByStatusAndOperatorId3irdptyAndSecretTokenTypeAndTokenExpiryGreaterThan(3, + operatorId, AuthSecretToken.SECRET_TOKEN_TYPE_IN, now).orElse(null); + } + + if (authSecretTokenIn == null) { resp.setRet("4002"); resp.setMsg("Invalid token(db)"); @@ -336,4 +348,39 @@ public class EvcsFilter extends OncePerRequestFilter { } + + + private static CommonRequest structure() { + CommonRequest commonRequest = new CommonRequest<>(); + try { + EquipBizRequest equipBizRequest = new EquipBizRequest(); + equipBizRequest.setEquipBizSeq("MA25CNM3800000"); + equipBizRequest.setConnectorId("8083600001000801"); + + String data = JSONUtil.toJSONString(equipBizRequest); + System.out.println("========data========"+data); + + + commonRequest.setData(data); + commonRequest.setOperatorId("MA25CNM38"); + } catch (Exception e) { + + } + return commonRequest; + } + + public static void main(String[] args) { + try{ + + CommonRequest commonRequest = structure(); + String s = encryptReqOut("8LpncubmWiPCzY3V", "av6A8QdnRaVRMXu6", + "Ut5UFdqDthiJyncU", commonRequest); + System.out.println("s================"+s); + + + }catch (Exception e){ + + } + + } } diff --git a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/jpa/AuthSecretTokenRepository.java b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/jpa/AuthSecretTokenRepository.java index c53804c3..40b9af28 100644 --- a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/jpa/AuthSecretTokenRepository.java +++ b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/jpa/AuthSecretTokenRepository.java @@ -20,16 +20,37 @@ public interface AuthSecretTokenRepository extends JpaRepository findByOperatorId3irdptyAndSecretTokenTypeAndTokenExpiryGreaterThan(String operatorId, String secretTokenType, Date time); + + Optional findByStatusAndOperatorId3irdptyAndSecretTokenTypeAndTokenExpiryGreaterThan(Integer status, + String operatorId, + String secretTokenType, + Date time); + + Optional findByOperatorId3irdptyAndOperatorIdAndSecretTokenType(String operatorId3irdpty, String operatorID, String secretTokenTypeIn); + + Optional findByStatusAndOperatorId3irdptyAndOperatorIdAndSecretTokenType( + Integer status, + String operatorId3irdpty, + String operatorID, + String secretTokenTypeIn); + Optional findByOperatorId3irdptyAndSecretTokenTypeAndOperatorSecret(String operatorID3irdpty, String secretTokenType, String operatorSecret); + Optional findByStatusAndOperatorId3irdptyAndSecretTokenTypeAndOperatorSecret( + Integer status, + String operatorID3irdpty, + String secretTokenType, + String operatorSecret); + Optional findByOperatorId3irdptyAndSecretTokenType(String operatorId, String secretTokenType); + Optional findByStatusAndOperatorId3irdptyAndSecretTokenType(Integer status,String operatorId, String secretTokenType); List findBySecretTokenType(String secretTokenType); diff --git a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/notification/CheckChargeOrders.java b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/notification/CheckChargeOrders.java index f143ed01..dd968325 100644 --- a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/notification/CheckChargeOrders.java +++ b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/notification/CheckChargeOrders.java @@ -13,8 +13,8 @@ import com.xhpc.evcs.jpa.AuthSecretTokenRepository; import com.xhpc.evcs.jpa.EtDisputeOrdersRepository; import com.xhpc.evcs.jpa.XhpcRateRepository; import com.xhpc.evcs.utils.JSONUtil; -import org.springframework.beans.factory.annotation.Autowired; +import javax.annotation.Resource; import java.math.BigDecimal; import java.util.*; @@ -30,13 +30,13 @@ import static com.xhpc.evcs.domain.AuthSecretToken.SECRET_TOKEN_TYPE_OUT; */ public class CheckChargeOrders extends CoreDispatcher { - @Autowired + @Resource private RedisService redisService; - @Autowired + @Resource private XhpcRateRepository xhpcRateRepository; - @Autowired + @Resource private AuthSecretTokenRepository authSecretTokenRepository; - @Autowired + @Resource private EtDisputeOrdersRepository etDisputeOrdersRepository; public void checkChargeOrder() throws Exception { diff --git a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/notification/NotificationCancelOrderTask.java b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/notification/NotificationCancelOrderTask.java index 1f6b0ff9..ab2a8dbc 100644 --- a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/notification/NotificationCancelOrderTask.java +++ b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/notification/NotificationCancelOrderTask.java @@ -31,6 +31,7 @@ public class NotificationCancelOrderTask extends CoreDispatcher { //private Logger logger = LoggerFactory.getLogger(NotificationChargeOrderInfoTask.class); //推送不开放(evcs 放开) + //9009开放定时任务 9099不开放 @Scheduled(fixedRate = 1000 * 15) public void run() throws JsonProcessingException { diff --git a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/notification/NotificationChargeOrderInfo4BonusTask.java b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/notification/NotificationChargeOrderInfo4BonusTask.java index b4864c9b..61166c95 100644 --- a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/notification/NotificationChargeOrderInfo4BonusTask.java +++ b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/notification/NotificationChargeOrderInfo4BonusTask.java @@ -46,6 +46,7 @@ public class NotificationChargeOrderInfo4BonusTask extends CoreDispatcher { * 推送充电订单信息(运营奖补)(测试环境开) * @throws IOException */ + //9099开放定时任务 9009不开放 //@Scheduled(fixedDelay = 1000 * 60) public void run() throws IOException { diff --git a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/notification/NotificationChargeOrderInfoTask.java b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/notification/NotificationChargeOrderInfoTask.java index 14ac23c8..9e1cbb02 100644 --- a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/notification/NotificationChargeOrderInfoTask.java +++ b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/notification/NotificationChargeOrderInfoTask.java @@ -39,6 +39,7 @@ public class NotificationChargeOrderInfoTask extends CoreDispatcher { private final Logger logger = LoggerFactory.getLogger(NotificationChargeOrderInfoTask.class); //推送不开放(evcs 放开) + //9009开放定时任务 9099不开放 @Scheduled(fixedRate = 1000 * 15) public void run() throws JsonProcessingException { diff --git a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/notification/NotificationEquipChargeStatusTask.java b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/notification/NotificationEquipChargeStatusTask.java index 46f4079d..f2b68678 100644 --- a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/notification/NotificationEquipChargeStatusTask.java +++ b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/notification/NotificationEquipChargeStatusTask.java @@ -49,6 +49,7 @@ public class NotificationEquipChargeStatusTask extends CoreDispatcher { * @throws IOException */ //推送不开放 + //9009开放定时任务 9099不开放 @Scheduled(fixedRate = 1000 * 30) public void run() throws IOException { diff --git a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/notification/NotificationStartChargeResultTask.java b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/notification/NotificationStartChargeResultTask.java index 30e80381..8d2e4818 100644 --- a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/notification/NotificationStartChargeResultTask.java +++ b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/notification/NotificationStartChargeResultTask.java @@ -33,8 +33,9 @@ public class NotificationStartChargeResultTask extends CoreDispatcher { /** * Judging the 3rd whether it has got the start charging task. */ - //推送不开放(evcs 放开) - @Scheduled(fixedRate = 1000 * 30) + //(evcs 放开 30 秒, 测试平台开放 15秒) + //9009开放定时任务 9099不开放 + @Scheduled(fixedRate = 1000 * 15) public void run() throws IOException { //Getting the charge orders which from 3rd. diff --git a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/notification/NotificationStationStatusTask.java b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/notification/NotificationStationStatusTask.java index 21058254..17ec2527 100644 --- a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/notification/NotificationStationStatusTask.java +++ b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/notification/NotificationStationStatusTask.java @@ -50,6 +50,7 @@ public class NotificationStationStatusTask extends CoreDispatcher { private XhpcTerminalRepository terminalRepository; //推送不开放(evcs 放开) + //9009开放定时任务 9099不开放 @Scheduled(fixedRate = 1000 * 45) protected void run() throws IOException { diff --git a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/notification/NotificationStopChargeResultTask.java b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/notification/NotificationStopChargeResultTask.java index 0ff844bc..d5801638 100644 --- a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/notification/NotificationStopChargeResultTask.java +++ b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/notification/NotificationStopChargeResultTask.java @@ -27,6 +27,7 @@ public class NotificationStopChargeResultTask extends CoreDispatcher { private AuthSecretTokenRepository authSecretTokenRepository; //(evcs 放开) + //9009开放定时任务 9099不开放 @Scheduled(fixedRate = 1000 * 3) public void run() throws Exception { diff --git a/evcs-modules/evcs-core/src/main/resources/bootstrap.yml b/evcs-modules/evcs-core/src/main/resources/bootstrap.yml index a0dda8bc..2e1f4bfc 100644 --- a/evcs-modules/evcs-core/src/main/resources/bootstrap.yml +++ b/evcs-modules/evcs-core/src/main/resources/bootstrap.yml @@ -1,4 +1,4 @@ -# Tomcat +# Tomcat 9009 不走推送 9099走推送 server: port: 9009 @@ -14,10 +14,10 @@ spring: nacos: discovery: # 服务注册地址 - server-addr: 120.26.46.180:8858 + server-addr: mse-e2a05960-nacos-ans.mse.aliyuncs.com:8848 config: # 配置中心地址 - server-addr: 120.26.46.180:8858 + server-addr: mse-e2a05960-nacos-ans.mse.aliyuncs.com:8848 # 配置文件格式 file-extension: yml # 共享配置 diff --git a/ruoyi-auth/src/main/resources/bootstrap.yml b/ruoyi-auth/src/main/resources/bootstrap.yml index 39b4ae7d..62be9823 100644 --- a/ruoyi-auth/src/main/resources/bootstrap.yml +++ b/ruoyi-auth/src/main/resources/bootstrap.yml @@ -14,10 +14,10 @@ spring: nacos: discovery: # 服务注册地址 - server-addr: 120.26.46.180:8858 + server-addr: mse-e2a05960-nacos-ans.mse.aliyuncs.com:8848 config: # 配置中心地址 - server-addr: 120.26.46.180:8858 + server-addr: mse-e2a05960-nacos-ans.mse.aliyuncs.com:8848 # 配置文件格式 file-extension: yml # 共享配置 diff --git a/ruoyi-gateway/src/main/resources/bootstrap.yml b/ruoyi-gateway/src/main/resources/bootstrap.yml index 902c9297..5bbe74ea 100644 --- a/ruoyi-gateway/src/main/resources/bootstrap.yml +++ b/ruoyi-gateway/src/main/resources/bootstrap.yml @@ -16,10 +16,10 @@ spring: nacos: discovery: # 服务注册地址 - server-addr: 120.26.46.180:8858 + server-addr: mse-e2a05960-nacos-ans.mse.aliyuncs.com:8848 config: # 配置中心地址 - server-addr: 120.26.46.180:8858 + server-addr: mse-e2a05960-nacos-ans.mse.aliyuncs.com:8848 # 配置文件格式 file-extension: yml # 共享配置 @@ -35,7 +35,7 @@ spring: datasource: ds1: nacos: - server-addr: 120.26.46.180:8858 + server-addr: mse-e2a05960-nacos-ans.mse.aliyuncs.com:8848 dataId: sentinel-ruoyi-gateway groupId: DEFAULT_GROUP data-type: json diff --git a/ruoyi-modules/ruoyi-file/src/main/resources/bootstrap.yml b/ruoyi-modules/ruoyi-file/src/main/resources/bootstrap.yml index b5bedcae..020707b3 100644 --- a/ruoyi-modules/ruoyi-file/src/main/resources/bootstrap.yml +++ b/ruoyi-modules/ruoyi-file/src/main/resources/bootstrap.yml @@ -14,10 +14,10 @@ spring: nacos: discovery: # 服务注册地址 - server-addr: 120.26.46.180:8858 + server-addr: mse-e2a05960-nacos-ans.mse.aliyuncs.com:8848 config: # 配置中心地址 - server-addr: 120.26.46.180:8858 + server-addr: mse-e2a05960-nacos-ans.mse.aliyuncs.com:8848 # 配置文件格式 file-extension: yml # 共享配置 diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/bootstrap.yml b/ruoyi-modules/ruoyi-gen/src/main/resources/bootstrap.yml index f455ff02..d6293b3a 100644 --- a/ruoyi-modules/ruoyi-gen/src/main/resources/bootstrap.yml +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/bootstrap.yml @@ -14,10 +14,10 @@ spring: nacos: discovery: # 服务注册地址 - server-addr: 120.26.46.180:8858 + server-addr: mse-e2a05960-nacos-ans.mse.aliyuncs.com:8848 config: # 配置中心地址 - server-addr: 120.26.46.180:8858 + server-addr: mse-e2a05960-nacos-ans.mse.aliyuncs.com:8848 # 配置文件格式 file-extension: yml # 共享配置 diff --git a/ruoyi-modules/ruoyi-job/src/main/resources/bootstrap.yml b/ruoyi-modules/ruoyi-job/src/main/resources/bootstrap.yml index f8eb4379..bb947c6e 100644 --- a/ruoyi-modules/ruoyi-job/src/main/resources/bootstrap.yml +++ b/ruoyi-modules/ruoyi-job/src/main/resources/bootstrap.yml @@ -14,10 +14,10 @@ spring: nacos: discovery: # 服务注册地址 - server-addr: 120.26.46.180:8858 + server-addr: mse-e2a05960-nacos-ans.mse.aliyuncs.com:8848 config: # 配置中心地址 - server-addr: 120.26.46.180:8858 + server-addr: mse-e2a05960-nacos-ans.mse.aliyuncs.com:8848 # 配置文件格式 file-extension: yml # 共享配置 diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/bootstrap.yml b/ruoyi-modules/ruoyi-system/src/main/resources/bootstrap.yml index bbd4382c..d0362649 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/bootstrap.yml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/bootstrap.yml @@ -14,10 +14,10 @@ spring: nacos: discovery: # 服务注册地址 - server-addr: 120.26.46.180:8858 + server-addr: mse-e2a05960-nacos-ans.mse.aliyuncs.com:8848 config: # 配置中心地址 - server-addr: 120.26.46.180:8858 + server-addr: mse-e2a05960-nacos-ans.mse.aliyuncs.com:8848 # 配置文件格式 file-extension: yml # 共享配置 diff --git a/ruoyi-visual/ruoyi-monitor/src/main/resources/bootstrap.yml b/ruoyi-visual/ruoyi-monitor/src/main/resources/bootstrap.yml index e063163e..09a81fa8 100644 --- a/ruoyi-visual/ruoyi-monitor/src/main/resources/bootstrap.yml +++ b/ruoyi-visual/ruoyi-monitor/src/main/resources/bootstrap.yml @@ -14,10 +14,10 @@ spring: nacos: discovery: # 服务注册地址 - server-addr: 120.26.46.180:8858 + server-addr: mse-e2a05960-nacos-ans.mse.aliyuncs.com:8848 config: # 配置中心地址 - server-addr: 120.26.46.180:8858 + server-addr: mse-e2a05960-nacos-ans.mse.aliyuncs.com:8848 # 配置文件格式 file-extension: yml # 共享配置 diff --git a/xhpc-modules/xhpc-activity/pom.xml b/xhpc-modules/xhpc-activity/pom.xml index 66f6c9cd..1466a8f0 100644 --- a/xhpc-modules/xhpc-activity/pom.xml +++ b/xhpc-modules/xhpc-activity/pom.xml @@ -102,6 +102,17 @@ ruoyi-common-log + + + + + + + + + + + diff --git a/xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/controller/XhpcTradebillCommonController.java b/xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/controller/XhpcTradebillCommonController.java index 23fa2506..35d414a6 100644 --- a/xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/controller/XhpcTradebillCommonController.java +++ b/xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/controller/XhpcTradebillCommonController.java @@ -15,6 +15,7 @@ import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import java.util.HashMap; import java.util.Map; @@ -31,22 +32,22 @@ public class XhpcTradebillCommonController extends BaseController { @Log(title = "上传对账单(OSS方式)", businessType = BusinessType.INSERT) @PostMapping("/oss/upload") - public AjaxResult OssUpload(HttpServletRequest request, @RequestBody XhpcTradebillUploadRecordDomain domain) throws Exception{ + public AjaxResult OssUpload(HttpServletRequest request, HttpServletResponse response, @RequestBody XhpcTradebillUploadRecordDomain domain) throws Exception{ LoginUser logUser = logUserUtils.getLogUser(request); domain.setTenantId(logUser.getTenantId()); - return AjaxResult.success(commonService.ossUpload(domain)); + return AjaxResult.success(commonService.ossUpload(request,response,domain)); } @Log(title = "上传对账单(文件方式)", businessType = BusinessType.INSERT) @PostMapping("/file/upload") - public AjaxResult fileUpload(HttpServletRequest request, MultipartFile file, int type, String startTime, String endTime) throws Exception { + public AjaxResult fileUpload(HttpServletRequest request, HttpServletResponse response, MultipartFile file, int type, String startTime, String endTime) throws Exception { if (file ==null || type < 1){ return AjaxResult.error("文件或者对账类型为空"); } LoginUser logUser = logUserUtils.getLogUser(request); - return AjaxResult.success(commonService.fileUpload(logUser.getTenantId(), file, type, startTime, endTime)); + return AjaxResult.success(commonService.fileUpload(request,response,"000000", file, type, startTime, endTime)); } @GetMapping("/file/getPage") diff --git a/xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/controller/XhpcTradebillInternetBillController.java b/xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/controller/XhpcTradebillInternetBillController.java index 57fd610f..0b5ffde9 100644 --- a/xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/controller/XhpcTradebillInternetBillController.java +++ b/xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/controller/XhpcTradebillInternetBillController.java @@ -35,10 +35,10 @@ public class XhpcTradebillInternetBillController extends BaseController { @RequestParam(required = false) String orderNumber, @RequestParam(required = false) String stationName, @RequestParam(required = false) String internetName, - @RequestParam(required = false) Integer status){ + @RequestParam(required = false) Integer status) { Map params = new HashMap<>(); params.put("uploadId", uploadId); - params.put("orderNumber",orderNumber); + params.put("orderNumber", orderNumber); params.put("stationName", stationName); params.put("internetName", internetName); params.put("status", status); @@ -46,19 +46,18 @@ public class XhpcTradebillInternetBillController extends BaseController { } - @GetMapping("/checkPage") public TableDataInfo getCheckPage(HttpServletRequest request, @RequestParam(required = false) String tenantId, - @RequestParam(required = false) Long operatorId, - @RequestParam(required = false) Long chargingStationId, - @RequestParam(required = false) Integer uploadId, + @RequestParam(required = false) Long operatorId, + @RequestParam(required = false) Long chargingStationId, + @RequestParam(required = false) Integer uploadId, @RequestParam(required = false) String orderNumber, @RequestParam(required = false) String station, @RequestParam(required = false) String internetName, - @RequestParam(required = false) Integer status){ + @RequestParam(required = false) Integer status) { LoginUser loginUser = logUserUtils.getLogUser(request); - if (StringUtils.isEmpty(tenantId)){ + if (StringUtils.isEmpty(tenantId)) { tenantId = loginUser.getTenantId(); } @@ -67,7 +66,7 @@ public class XhpcTradebillInternetBillController extends BaseController { params.put("operatorId", operatorId); params.put("chargingStationId", chargingStationId); params.put("uploadId", uploadId); - params.put("orderNumber",orderNumber); + params.put("orderNumber", orderNumber); params.put("stationName", station); params.put("internetName", internetName); params.put("status", status); @@ -85,9 +84,9 @@ public class XhpcTradebillInternetBillController extends BaseController { @RequestParam(required = false) String orderNumber, @RequestParam(required = false) String stationName, @RequestParam(required = false) String internetName, - @RequestParam(required = false) Integer status){ + @RequestParam(required = false) Integer status) { LoginUser loginUser = logUserUtils.getLogUser(request); - if (StringUtils.isEmpty(tenantId)){ + if (StringUtils.isEmpty(tenantId)) { tenantId = loginUser.getTenantId(); } @@ -96,7 +95,7 @@ public class XhpcTradebillInternetBillController extends BaseController { params.put("operatorId", operatorId); params.put("chargingStationId", chargingStationId); params.put("uploadId", uploadId); - params.put("orderNumber",orderNumber); + params.put("orderNumber", orderNumber); params.put("stationName", stationName); params.put("internetName", internetName); params.put("status", status); @@ -105,7 +104,7 @@ public class XhpcTradebillInternetBillController extends BaseController { @GetMapping("/checkInfo/{id}") - public AjaxResult getCheckInfo(@PathVariable Integer id){ + public AjaxResult getCheckInfo(@PathVariable Integer id) { return AjaxResult.success(internetBillService.getInfoByPk(id)); } @@ -113,7 +112,7 @@ public class XhpcTradebillInternetBillController extends BaseController { @Log(title = "人工确认流量方对账数据", businessType = BusinessType.UPDATE) @PostMapping("/checkInfo") - public AjaxResult updateCheckInfo(@RequestBody XhpcTradebillInternetCheckRecordDomain domain){ + public AjaxResult updateCheckInfo(@RequestBody XhpcTradebillInternetCheckRecordDomain domain) { return AjaxResult.success(internetBillService.updateInfoByDomain(domain)); } @@ -130,7 +129,7 @@ public class XhpcTradebillInternetBillController extends BaseController { Map params = new HashMap<>(); params.put("uploadId", uploadId); - params.put("orderNumber",orderNumber); + params.put("orderNumber", orderNumber); params.put("stationName", stationName); params.put("internetName", internetName); params.put("status", status); @@ -138,4 +137,20 @@ public class XhpcTradebillInternetBillController extends BaseController { internetBillService.export(response, params); } + + @GetMapping("/getXhpcTradebillUploadRecordcheckPage") + public TableDataInfo getXhpcTradebillUploadRecordcheckPage(HttpServletRequest request, HttpServletResponse response) { + LoginUser loginUser = logUserUtils.getLogUser(request); + + Map params = new HashMap<>(); + params.put("userId", loginUser.getUserid()); + params.put("type", 0); + if (loginUser.getUserid() != 0) { + params.put("type", 1); + } + startPage(); + return getDataTable(internetBillService.getXhpcTradebillUploadRecordcheckPage(params)); + } + + } diff --git a/xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/domain/XhpcTradebillUploadRecordDomain.java b/xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/domain/XhpcTradebillUploadRecordDomain.java index e5891601..607cbe24 100644 --- a/xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/domain/XhpcTradebillUploadRecordDomain.java +++ b/xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/domain/XhpcTradebillUploadRecordDomain.java @@ -4,6 +4,7 @@ import lombok.Data; import javax.persistence.Table; import java.io.Serializable; +import java.math.BigDecimal; import java.util.Date; @@ -43,11 +44,28 @@ public class XhpcTradebillUploadRecordDomain implements Serializable { private String tenantId; - + private BigDecimal platformPower; + private BigDecimal platformServer; + private BigDecimal platformAmout; + private BigDecimal platformDegree; + private BigDecimal platformInternetCommission; + private BigDecimal platformInternetSvcCommission; + private BigDecimal platformInternetDegreeCommission; + private BigDecimal platformInternetAmout; + private BigDecimal platformActPower; + private BigDecimal platformActServicePowe; + private BigDecimal platformInternetSettlementAmout; + private BigDecimal internetPower; + private BigDecimal internetServer; + private BigDecimal internetAmout; + private BigDecimal internetDegree; + private BigDecimal internetSettlementAmout; + private Long userId; // === 时间区段内的订单,仅参数使用 private String startTime; private String endTime; + private String reconciliationTime; private static final long serialVersionUID = 1L; } \ No newline at end of file diff --git a/xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/mapper/XhpcDeviceMessageMapper.java b/xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/mapper/XhpcDeviceMessageMapper.java index f1878e7a..0e735463 100644 --- a/xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/mapper/XhpcDeviceMessageMapper.java +++ b/xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/mapper/XhpcDeviceMessageMapper.java @@ -10,7 +10,7 @@ import java.util.Map; @Mapper public interface XhpcDeviceMessageMapper { - List> selectListByTypeAndSerialNumber(@Param("type") String type, + List> selectListByTypeAndSerialNumber( @Param("serialNumber")String serialNumber, @Param("startTime") String startTime, @Param("endTime") String endTime); diff --git a/xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/mapper/XhpcHistoryOrderMapper.java b/xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/mapper/XhpcHistoryOrderMapper.java index 21a2d58d..92d91790 100644 --- a/xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/mapper/XhpcHistoryOrderMapper.java +++ b/xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/mapper/XhpcHistoryOrderMapper.java @@ -41,4 +41,8 @@ public interface XhpcHistoryOrderMapper { @Param("endTime")String endTime, @Param("chargingMode") String chargingMode, @Param("tenantId")String tenantId); + + //获取平台新电途订单 + List> getListPage(@Param("totalOrderNos")List totalOrderNos,@Param("type")Integer type); + } diff --git a/xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/mapper/XhpcTradebillUploadRecordMapper.java b/xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/mapper/XhpcTradebillUploadRecordMapper.java index 982275fb..bb00b41f 100644 --- a/xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/mapper/XhpcTradebillUploadRecordMapper.java +++ b/xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/mapper/XhpcTradebillUploadRecordMapper.java @@ -25,4 +25,6 @@ public interface XhpcTradebillUploadRecordMapper { int updateByPrimaryKey(XhpcTradebillUploadRecordDomain record); List selectByType(@Param("params") Map params); + + List getXhpcTradebillUploadRecordcheckPage(@Param("params") Map params); } \ No newline at end of file diff --git a/xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/service/CommonService.java b/xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/service/CommonService.java index 3e2ce5fe..7734367e 100644 --- a/xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/service/CommonService.java +++ b/xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/service/CommonService.java @@ -4,14 +4,16 @@ package com.xhpc.activity.service; import com.xhpc.activity.domain.XhpcTradebillUploadRecordDomain; import org.springframework.web.multipart.MultipartFile; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import java.util.List; import java.util.Map; public interface CommonService { - XhpcTradebillUploadRecordDomain ossUpload(XhpcTradebillUploadRecordDomain domain) throws Exception; + XhpcTradebillUploadRecordDomain ossUpload(HttpServletRequest request, HttpServletResponse response, XhpcTradebillUploadRecordDomain domain) throws Exception; - XhpcTradebillUploadRecordDomain fileUpload(String tenantId, MultipartFile file, int type, String startTime, String endTime) throws Exception; + XhpcTradebillUploadRecordDomain fileUpload(HttpServletRequest request, HttpServletResponse response,String tenantId, MultipartFile file, int type, String startTime, String endTime) throws Exception; List getFilePage(Map params); } diff --git a/xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/service/InternetBillService.java b/xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/service/InternetBillService.java index 8d6492ee..0959852d 100644 --- a/xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/service/InternetBillService.java +++ b/xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/service/InternetBillService.java @@ -4,6 +4,7 @@ package com.xhpc.activity.service; import com.xhpc.activity.domain.XhpcTradebillInternetCheckRecordDomain; import com.xhpc.activity.domain.XhpcTradebillUploadRecordDomain; +import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.util.List; @@ -73,7 +74,7 @@ public interface InternetBillService { * @return 对账数据 * @throws Exception 异常 */ - List getXDTInternetDataList(String fileUrl, String startTime, String endTime, String tenantId) throws Exception; + void getXDTInternetDataList(HttpServletRequest request, HttpServletResponse response, String fileUrl, String startTime, String endTime, String tenantId) throws Exception; /** @@ -82,7 +83,7 @@ public interface InternetBillService { * @return 对账数据 * @throws Exception 异常 */ - List getXDTInternetDataList(File dataFile, String startTime, String endTime, String tenantId) throws Exception; + void getXDTInternetDataList(HttpServletRequest request, HttpServletResponse response,File dataFile, String startTime, String endTime, String tenantId) throws Exception; @@ -111,4 +112,10 @@ public interface InternetBillService { * @throws Exception 异常 */ void export(HttpServletResponse response, Map params) throws Exception; + + + List> getListPage(List totalOrderNos,Integer type); + + + List getXhpcTradebillUploadRecordcheckPage(Map params); } diff --git a/xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/service/impl/CommonServiceImpl.java b/xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/service/impl/CommonServiceImpl.java index 511b559e..0893ae3c 100644 --- a/xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/service/impl/CommonServiceImpl.java +++ b/xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/service/impl/CommonServiceImpl.java @@ -16,6 +16,8 @@ import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import java.io.File; import java.util.HashMap; import java.util.List; @@ -40,7 +42,7 @@ public class CommonServiceImpl implements CommonService { AliOSSProperties ossProperties; @Override - public XhpcTradebillUploadRecordDomain ossUpload(XhpcTradebillUploadRecordDomain domain) throws Exception { + public XhpcTradebillUploadRecordDomain ossUpload(HttpServletRequest request, HttpServletResponse response, XhpcTradebillUploadRecordDomain domain) throws Exception { Long userId = SecurityUtils.getUserId(); domain.setCreateBy(userId); @@ -53,7 +55,7 @@ public class CommonServiceImpl implements CommonService { domain.setFailCount(0); domain.setUncheckCount(0); domain.setCheckedCount(0); - uploadRecordMapper.insertSelective(domain); + // uploadRecordMapper.insertSelective(domain); List paymentCheckRecordDomainList = null; List recordDomainList = null; @@ -90,9 +92,9 @@ public class CommonServiceImpl implements CommonService { break; case 7: // 新电途 - recordDomainList = internetBillService.getXDTInternetDataList(domain.getUrl(), domain.getStartTime(), domain.getEndTime(), domain.getTenantId()); - insertCount = internetBillService.insertInternetCheckList(domain, recordDomainList); - totalMap = computeInternetRecord(recordDomainList); + internetBillService.getXDTInternetDataList(request,response,domain.getUrl(), domain.getStartTime(), domain.getEndTime(), domain.getTenantId()); + // insertCount = internetBillService.insertInternetCheckList(domain, recordDomainList); + // totalMap = computeInternetRecord(recordDomainList); break; case 8: // 快电 @@ -113,7 +115,7 @@ public class CommonServiceImpl implements CommonService { domain.setFailCount(totalMap.get("failCount")); domain.setCheckedCount(totalMap.get("checkCount")); domain.setUncheckCount(totalMap.get("uncheckCount")); - uploadRecordMapper.updateByPrimaryKey(domain); + //uploadRecordMapper.updateByPrimaryKey(domain); return domain; } catch (Exception exception){ exception.printStackTrace(); @@ -124,7 +126,7 @@ public class CommonServiceImpl implements CommonService { @Override - public XhpcTradebillUploadRecordDomain fileUpload(String tenantId, MultipartFile file, int type, String startTime, String endTime) throws Exception { + public XhpcTradebillUploadRecordDomain fileUpload(HttpServletRequest request, HttpServletResponse response,String tenantId, MultipartFile file, int type, String startTime, String endTime) throws Exception { XhpcTradebillUploadRecordDomain domain = new XhpcTradebillUploadRecordDomain(); // 创建OSSClient实例 @@ -146,7 +148,7 @@ public class CommonServiceImpl implements CommonService { domain.setEndTime(endTime); domain.setType(type); domain.setTenantId(tenantId); - return ossUpload(domain); + return ossUpload(request,response,domain); } catch (Exception exception){ throw new CustomException("服务错误"); } diff --git a/xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/service/impl/InternetBillServiceImpl.java b/xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/service/impl/InternetBillServiceImpl.java index 3025ceb3..75bf618e 100644 --- a/xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/service/impl/InternetBillServiceImpl.java +++ b/xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/service/impl/InternetBillServiceImpl.java @@ -7,7 +7,14 @@ import cn.hutool.core.text.csv.CsvReader; import cn.hutool.core.text.csv.CsvUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.poi.excel.ExcelWriter; +import com.aliyun.oss.OSS; +import com.aliyun.oss.OSSClientBuilder; +import com.aliyun.oss.model.PutObjectResult; +import com.xhpc.activity.config.AliOSSProperties; import com.xhpc.activity.domain.XhpcTradebillUploadRecordDomain; +import com.xhpc.activity.mapper.XhpcTradebillUploadRecordMapper; +import com.xhpc.activity.utils.ExcelExp; +import com.xhpc.activity.utils.ExcelUtilYu; import com.xhpc.common.core.exception.CustomException; import com.xhpc.common.core.utils.SecurityUtils; import com.xhpc.common.core.utils.poi.ExcelUtil; @@ -22,15 +29,20 @@ import com.xhpc.activity.vo.KDTradebillVo; import com.xhpc.activity.vo.XDTTradebillVo; import com.xhpc.activity.vo.XJTradeBillVo; import com.xhpc.common.security.service.TokenService; +import com.xhpc.common.util.LogUserUtils; import com.xhpc.common.util.UserTypeUtil; import com.xhpc.system.api.domain.SysUser; import com.xhpc.system.api.model.LoginUser; import lombok.extern.slf4j.Slf4j; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.stereotype.Service; import javax.annotation.Resource; import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.math.BigDecimal; @@ -42,7 +54,8 @@ import java.util.stream.Collectors; @Slf4j @Service public class InternetBillServiceImpl implements InternetBillService { - + @Resource + LogUserUtils logUserUtils; @Resource XhpcTradebillInternetCheckRecordMapper internetCheckRecordMapper; @@ -52,6 +65,11 @@ public class InternetBillServiceImpl implements InternetBillService { @Resource TokenService tokenService; + @Resource + XhpcTradebillUploadRecordMapper uploadRecordMapper; + + @Resource + AliOSSProperties ossProperties; @Override public XhpcTradebillInternetCheckRecordDomain getInfoByPk(int pk) { @@ -200,10 +218,10 @@ public class InternetBillServiceImpl implements InternetBillService { * @throws Exception 异常 */ @Override - public List getXDTInternetDataList(String fileUrl, String startTime, String endTime, String tenantId) throws Exception { + public void getXDTInternetDataList(HttpServletRequest request, HttpServletResponse response, String fileUrl, String startTime, String endTime, String tenantId) throws Exception { File dataFile = DownloadUtil.downloadFile(fileUrl); - return getXDTInternetDataList(dataFile, startTime, endTime, tenantId); + getXDTInternetDataList(request,response,dataFile, startTime, endTime, tenantId); } @@ -368,10 +386,10 @@ public class InternetBillServiceImpl implements InternetBillService { * @return 对账数据 */ @Override - public List getXDTInternetDataList(File dataFile, String startTime, String endTime, String tenantId) throws Exception { + public void getXDTInternetDataList(HttpServletRequest request, HttpServletResponse response, File dataFile, String startTime, String endTime, String tenantId) throws Exception { String suffix = dataFile.getName().substring(dataFile.getName().lastIndexOf(".") + 1); - List checkRecordDomainList = new ArrayList<>(); + XhpcTradebillUploadRecordDomain xhpcTradebillUploadRecordDomain = new XhpcTradebillUploadRecordDomain(); List xdtTradebillVoList = new ArrayList<>(); List serialNumberList = new ArrayList<>(); @@ -395,36 +413,156 @@ public class InternetBillServiceImpl implements InternetBillService { throw new CustomException("文件数据不合规,请检查"); } + // String path = "/www/wwwroot/scxhua.cn/dist/moban/xindiantuzuizhangdan.xlsx"; + // String path = "/www/wwwroot/scxhua.cn/dist/moban/xindiantuzuizhangdan.xlsx"; + String path ="H:\\home\\xindiantuzuizhangdan.xlsx"; + + //新电途--总电费 + BigDecimal totalPowerAmount = new BigDecimal(0); + //新电途--总服务费 + BigDecimal totalServerAmount = new BigDecimal(0); + //新电途--总电量 + BigDecimal totalChargingDegree = new BigDecimal(0); + //新电途--总流里方结算平台金额 + BigDecimal totalPayAmount = new BigDecimal(0); + //新电途--总订单号 + List totalOrderNo = new ArrayList<>(); for (XDTTradebillVo vo : xdtTradebillVoList) { - XhpcTradebillInternetCheckRecordDomain domain = new XhpcTradebillInternetCheckRecordDomain(); - domain.setPlatformInternetSerialNumber(vo.getOrderNo().trim()); - domain.setInternetSerialNumber(vo.getOrderNo().trim()); - domain.setSource("新电途"); - domain.setInternetName("新电途"); - domain.setInternetChargeStation(vo.getStationName()); - - BigDecimal chargingDegree = vo.getChargingDegree() != null ? BigDecimal.valueOf(vo.getChargingDegree()) : BigDecimal.ZERO; - domain.setInternetChargingDegree(chargingDegree); - - BigDecimal orderAmount = vo.getOrderAmount() != null ? BigDecimal.valueOf(vo.getOrderAmount()) : BigDecimal.ZERO; - domain.setInternetOrderAmount(orderAmount); - - BigDecimal powerAmount = vo.getPowerAmount() != null ? BigDecimal.valueOf(vo.getPowerAmount()) : BigDecimal.ZERO; - domain.setInternetPowerAmount(powerAmount); - - BigDecimal serverAmount = vo.getServerAmount() != null ? BigDecimal.valueOf(vo.getServerAmount()) : BigDecimal.ZERO; - domain.setInternetServerAmount(serverAmount); - domain.setInternetDiscountAmount(BigDecimal.ZERO); - - BigDecimal payAmount = vo.getPayAmount() != null ? BigDecimal.valueOf(vo.getPayAmount()) : BigDecimal.ZERO; - domain.setInternetPayAmount(payAmount); - - serialNumberList.add(domain.getInternetSerialNumber()); -// getHistoryOrderInfo(domain); - checkRecordDomainList.add(domain); + if(vo.getPowerAmount()!=null){ + totalPowerAmount =totalPowerAmount.add(BigDecimal.valueOf(vo.getPowerAmount())); + } + if(vo.getServerAmount()!=null){ + totalServerAmount =totalServerAmount.add(BigDecimal.valueOf(vo.getServerAmount())); + } + if(vo.getChargingDegree()!=null){ + totalChargingDegree =totalChargingDegree.add(BigDecimal.valueOf(vo.getChargingDegree())); + } + if(vo.getPayAmount()!=null){ + totalPayAmount =totalPayAmount.add(BigDecimal.valueOf(vo.getPayAmount())); + } + totalOrderNo.add(vo.getOrderNo().trim()); } - getHistoryOrderList(checkRecordDomainList, serialNumberList, "3", startTime, endTime, tenantId); - return checkRecordDomainList; + //获取平台新电途订单 + List> listPage = historyOrderMapper.getListPage(totalOrderNo, 3); + //平台--总电费 + BigDecimal totalPlatformPowerAmount = new BigDecimal(0); + //平台--总服务费 + BigDecimal totalPlatformServerAmount = new BigDecimal(0); + //平台--总电量 + BigDecimal totalPlatformChargingDegree = new BigDecimal(0); + //平台--流里方总金额抽成 + BigDecimal totalPlatformInternetCommission = new BigDecimal(0); + //平台--流里方服务费抽成 + BigDecimal totalPlatformInternetSvcCommission = new BigDecimal(0); + //平台--流里方电量抽成 + BigDecimal totalPlatformInternetDegreeCommissione = new BigDecimal(0); + //平台--实收电费 + BigDecimal totalPlatformActPowerPrice = new BigDecimal(0); + //平台--实收服务费 + BigDecimal totalPlatformActServicePrice = new BigDecimal(0); + //新电途--总流里方结算平台金额 + BigDecimal totalPlatformPayAmount = new BigDecimal(0); + for (Map vo : listPage) { + totalPlatformPowerAmount =totalPlatformPowerAmount.add(new BigDecimal(vo.get("powerPriceTotal").toString())); + totalPlatformServerAmount =totalPlatformServerAmount.add(new BigDecimal(vo.get("servicePriceTotal").toString())); + totalPlatformChargingDegree =totalPlatformChargingDegree.add(new BigDecimal(vo.get("chargingDegree").toString())); + totalPlatformInternetCommission =totalPlatformInternetCommission.add(new BigDecimal(vo.get("internetCommission").toString())); + totalPlatformInternetSvcCommission =totalPlatformInternetSvcCommission.add(new BigDecimal(vo.get("internetSvcCommission").toString())); + totalPlatformInternetDegreeCommissione =totalPlatformInternetDegreeCommissione.add(new BigDecimal(vo.get("internetDegreeCommission").toString())); + totalPlatformActPowerPrice =totalPlatformActPowerPrice.add(new BigDecimal(vo.get("actPowerPrice").toString())); + totalPlatformActServicePrice =totalPlatformActServicePrice.add(new BigDecimal(vo.get("actServicePrice").toString())); + totalPlatformPayAmount =totalPlatformPayAmount.add(new BigDecimal(vo.get("actPrice").toString())); + } + + List> mapList =new ArrayList<>(); + Map objectMap =new HashMap<>(); + objectMap.put("PowerAmount",totalPlatformPowerAmount); + objectMap.put("ServerAmount",totalPlatformServerAmount); + objectMap.put("totalAmount",totalPlatformPowerAmount.add(totalPlatformServerAmount)); + objectMap.put("ChargingDegree",totalPlatformChargingDegree); + objectMap.put("InternetCommission",totalPlatformInternetCommission); + objectMap.put("InternetSvcCommission",totalPlatformInternetSvcCommission); + objectMap.put("InternetDegreeCommissione",totalPlatformInternetDegreeCommissione); + objectMap.put("totalInternetAmount",totalPlatformInternetCommission.add(totalPlatformInternetSvcCommission.add(totalPlatformInternetDegreeCommissione))); + objectMap.put("ActPowerPrice",totalPlatformActPowerPrice); + objectMap.put("ActServicePrice",totalPlatformActServicePrice); + objectMap.put("totalInternetSettlementAmount",totalPlatformActServicePrice.add(totalPlatformActPowerPrice)); + objectMap.put("totalPowerAmount",totalPowerAmount); + objectMap.put("totalServerAmount",totalServerAmount); + objectMap.put("InternetSettlementAmount",totalPowerAmount.add(totalServerAmount)); + objectMap.put("totalChargingDegree",totalChargingDegree); + objectMap.put("totalPayAmount",totalPayAmount); + mapList.add(objectMap); + + + List list =new ArrayList<>(); + + String suzu0[]={"PowerAmount","ServerAmount","totalAmount","ChargingDegree","InternetCommission","InternetSvcCommission","InternetDegreeCommissione","totalInternetAmount","ActPowerPrice","ActServicePrice","totalInternetSettlementAmount","totalPowerAmount","totalServerAmount","InternetSettlementAmount","totalChargingDegree","totalPayAmount"}; + ExcelExp excelExp0 = new ExcelExp("翔桦与新电途对账统计表", suzu0, mapList, "翔桦与新电途对账统计表"); + + String suzu1[]={"orderNo","stationName","city","exceptionType","transactionType","paymentType","settlementType","settlementTime","orderAmount","orderUserAmount","offlineAmount","userAmount","badDebt","placeholderBadDebt","platformBadDebt","businessMoney","platformMoney","platformMoneyDifference","platformIncomeMoney","platformProfitSharingMoney","platformServerMoney","payAmount","chargingDegree","powerAmount","serverAmount","surchargeAmount","settlementRules","stationOrder","notes","orderCreateTime","orderType"}; + ExcelExp excelExp1 = new ExcelExp("新电途对账单", suzu1, xdtTradebillVoList, "新电途对账单",3); + + String suzu2[]={"serialNumber","internetSerialNumber","chargingStationName","pileSerialNumber","terminalName","power","startSoc","endSoc","powerPriceTotal","servicePriceTotal","totalPrice","activityPowerPriceTotal","activityServicePriceTotal","activityTotalPrice","promotionDiscount","actPrice","internetCommission","internetSvcCommission","internetDegreeCommission","platformCommission","platformSvcCommisssion","operationCommission","operationSvcCommission","actPowerPrice","actServicePrice","actSumPrice","totalPrice","actPrice","chargingTime","chargingDegree","startTime","endTime","chargingModeName"}; + ExcelExp excelExp2 = new ExcelExp("四川翔桦科技有限公司平台对账单", suzu2, listPage, "四川翔桦科技有限公司平台对账单"); + + list.add(excelExp0); + list.add(excelExp1); + list.add(excelExp2); + + XSSFWorkbook workbook = ExcelUtilYu.importExcelByOriginYu(response, request, "四川翔桦科技有限公司-新电途与平台对账单.xlsx", path, list, 0, "xlsx", "四川翔桦科技有限公司-新电途与平台对账单", 2); + + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + workbook.write(byteArrayOutputStream); + byte[] byteArray = byteArrayOutputStream.toByteArray(); + + String endpoint = "https://oss-cn-hangzhou.aliyuncs.com"; + + String bucketName = "xhpc-bucket1"; + String objectName = "exampledir/四川翔桦科技有限公司-新电途与平台对账单_"+ com.xhpc.common.util.DateUtil.date2String(new Date(), com.xhpc.common.util.DateUtil.DEFAULT_DATE_FORMAT) +".xlsx"; + OSS ossClient = new OSSClientBuilder().build(endpoint, ossProperties.getAccessKey(), ossProperties.getSecretKey()); + String url ="https://xhpc-bucket1.oss-cn-hangzhou.aliyuncs.com/"+objectName; + try{ + PutObjectResult putObjectResult = ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(byteArray)); + System.out.println("putObjectResult="+putObjectResult.toString()); + }catch (Exception e){ + e.printStackTrace(); + }finally { + if (ossClient != null) { + ossClient.shutdown(); + } + } + xhpcTradebillUploadRecordDomain.setSource("平台上传"); + xhpcTradebillUploadRecordDomain.setFileName("新电途对账单"); + xhpcTradebillUploadRecordDomain.setDelFlag(0); + xhpcTradebillUploadRecordDomain.setUrl(url); + xhpcTradebillUploadRecordDomain.setType(7); + xhpcTradebillUploadRecordDomain.setStatus(0); + xhpcTradebillUploadRecordDomain.setSuccessCount(0); + xhpcTradebillUploadRecordDomain.setFailCount(0); + xhpcTradebillUploadRecordDomain.setUncheckCount(0); + xhpcTradebillUploadRecordDomain.setCheckedCount(0); + xhpcTradebillUploadRecordDomain.setPlatformPower(totalPlatformPowerAmount); + xhpcTradebillUploadRecordDomain.setPlatformServer(totalPlatformServerAmount); + xhpcTradebillUploadRecordDomain.setPlatformAmout(totalPlatformPowerAmount.add(totalPlatformServerAmount)); + xhpcTradebillUploadRecordDomain.setPlatformDegree(totalPlatformChargingDegree); + xhpcTradebillUploadRecordDomain.setPlatformInternetCommission(totalPlatformInternetCommission); + xhpcTradebillUploadRecordDomain.setPlatformInternetSvcCommission(totalPlatformInternetSvcCommission); + xhpcTradebillUploadRecordDomain.setPlatformInternetDegreeCommission(totalPlatformInternetDegreeCommissione); + xhpcTradebillUploadRecordDomain.setPlatformInternetAmout(totalPlatformInternetCommission.add(totalPlatformInternetSvcCommission.add(totalPlatformInternetDegreeCommissione))); + xhpcTradebillUploadRecordDomain.setPlatformActPower(totalPlatformActPowerPrice); + xhpcTradebillUploadRecordDomain.setPlatformActServicePowe(totalPlatformActServicePrice); + xhpcTradebillUploadRecordDomain.setPlatformInternetSettlementAmout(totalPlatformActServicePrice.add(totalPlatformActPowerPrice)); + xhpcTradebillUploadRecordDomain.setInternetPower(totalPowerAmount); + xhpcTradebillUploadRecordDomain.setInternetServer(totalServerAmount); + xhpcTradebillUploadRecordDomain.setInternetAmout(totalPowerAmount.add(totalServerAmount)); + xhpcTradebillUploadRecordDomain.setInternetDegree(totalChargingDegree); + xhpcTradebillUploadRecordDomain.setInternetSettlementAmout(totalPayAmount); + LoginUser logUser = logUserUtils.getLogUser(request); + xhpcTradebillUploadRecordDomain.setUserId(logUser.getUserid()); + xhpcTradebillUploadRecordDomain.setReconciliationTime(startTime); + uploadRecordMapper.insertSelective(xhpcTradebillUploadRecordDomain); + } /** @@ -510,7 +648,7 @@ public class InternetBillServiceImpl implements InternetBillService { List> list = internetCheckRecordMapper.selectByParams(params); -// 通过工具类创建writer,默认创建xls格式 + // 通过工具类创建writer,默认创建xls格式 ExcelWriter writer = cn.hutool.poi.excel.ExcelUtil.getWriter(true); writer.addHeaderAlias("internet_name", "流量方名称"); writer.addHeaderAlias("user_id", "用户账号"); @@ -557,6 +695,16 @@ public class InternetBillServiceImpl implements InternetBillService { IoUtil.close(out); } + @Override + public List> getListPage(List totalOrderNos, Integer type) { + return historyOrderMapper.getListPage(totalOrderNos,type); + } + + @Override + public List getXhpcTradebillUploadRecordcheckPage(Map params) { + return uploadRecordMapper.getXhpcTradebillUploadRecordcheckPage(params); + } + private void getHistoryOrderInfo(XhpcTradebillInternetCheckRecordDomain domain) { diff --git a/xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/service/impl/PileLogServiceImpl.java b/xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/service/impl/PileLogServiceImpl.java index d9d7d5ec..14661baa 100644 --- a/xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/service/impl/PileLogServiceImpl.java +++ b/xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/service/impl/PileLogServiceImpl.java @@ -74,7 +74,7 @@ public class PileLogServiceImpl extends BaseService implements PileLogService { @Override public List> getPileRunLogPage(String pileId, String startTime, String endTime){ - return deviceMessageMapper.selectListByTypeAndSerialNumber(StationDeviceEnum.PILE.getCode(), pileId, startTime, endTime); + return deviceMessageMapper.selectListByTypeAndSerialNumber( pileId, startTime, endTime); } @Override diff --git a/xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/service/impl/XhpcClearingCheckoutServiceImpl.java b/xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/service/impl/XhpcClearingCheckoutServiceImpl.java index 6b6893f3..32b3af50 100644 --- a/xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/service/impl/XhpcClearingCheckoutServiceImpl.java +++ b/xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/service/impl/XhpcClearingCheckoutServiceImpl.java @@ -187,8 +187,40 @@ public class XhpcClearingCheckoutServiceImpl extends BaseService implements Xhpc List list = checkoutMapper.selectOrderMapByCheckoutIds(checkoutIds); - com.xhpc.common.core.utils.poi.ExcelUtil util = new com.xhpc.common.core.utils.poi.ExcelUtil(CheckoutBankVo.class); - util.exportExcel(response, list, "待提现订单列表"); + BigExcelWriter writer = ExcelUtil.getBigWriter("xhpc_clearing_checkout" + System.currentTimeMillis() + ".xlsx"); + + writer.addHeaderAlias("curreyType", "币种"); + writer.addHeaderAlias("date", "日期"); + writer.addHeaderAlias("detailFlag", "明细标志"); + writer.addHeaderAlias("index", "顺序号"); + writer.addHeaderAlias("payBank", "付款帐号开户行"); + writer.addHeaderAlias("payBankAccount", "付款帐号/卡号"); + writer.addHeaderAlias("payBankName", "付款账号名称/卡名称"); + writer.addHeaderAlias("receiveBank", "收款账号开户行"); + writer.addHeaderAlias("receiveProvice", "收款账号省份"); + writer.addHeaderAlias("receiveCity", "收款账号地市"); + writer.addHeaderAlias("receiveCode", "收款账号地区码"); + writer.addHeaderAlias("receiveAccount", "收款账号"); + writer.addHeaderAlias("receiveName", "收款账号名称"); + writer.addHeaderAlias("amount", "金额"); + writer.addHeaderAlias("purposes", "汇款用途"); + writer.addHeaderAlias("remark", "备注信息"); + writer.addHeaderAlias("transType", "汇款方式"); + writer.addHeaderAlias("mobile", "收款账户短信通知手机号"); + writer.addHeaderAlias("customeIndex", "自定义序号"); + writer.addHeaderAlias("applyCheckNo", "预先审批编号"); + + writer.setOnlyAlias(true); + writer.write(list, true); + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setCharacterEncoding("utf-8"); + ServletOutputStream out = response.getOutputStream(); + writer.flush(out, true); + writer.close(); + IoUtil.close(out); + +// com.xhpc.common.core.utils.poi.ExcelUtil util = new com.xhpc.common.core.utils.poi.ExcelUtil(CheckoutBankVo.class); +// util.exportExcel(response, list, "待提现订单列表"); // ExcelWriter writer = ExcelUtil.getWriter(true); // writer.addHeaderAlias("curreyType", "币种"); diff --git a/xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/utils/ExcelExp.java b/xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/utils/ExcelExp.java new file mode 100644 index 00000000..13ce4194 --- /dev/null +++ b/xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/utils/ExcelExp.java @@ -0,0 +1,74 @@ +package com.xhpc.activity.utils; + +import com.xhpc.activity.vo.XDTTradebillVo; + +import java.util.List; +import java.util.Map; + +/** + * @author yuyang + * @date 2023-03-01 15:34 + */ +public class ExcelExp { + private String fileName;// sheet的名称 + private String[] handers;// sheet里的标题 + private List> dataset;// sheet里的数据集 + + private List xdtTradebillVoList;// sheet里的数据集 + private String tableName; + + private Integer type; + + public ExcelExp(String fileName, String[] handers, List> dataset, String tableName) { + this.fileName = fileName; + this.handers = handers; + this.dataset = dataset; + this.tableName = tableName; + } + + public ExcelExp(String fileName, String[] handers, List xdtTradebillVoList, String tableName,Integer type) { + this.fileName = fileName; + this.handers = handers; + this.xdtTradebillVoList = xdtTradebillVoList; + this.tableName = tableName; + } + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } + + public String[] getHanders() { + return handers; + } + + public void setHanders(String[] handers) { + this.handers = handers; + } + + public List> getDataset() { + return dataset; + } + + public void setDataset(List> dataset) { + this.dataset = dataset; + } + + public String getTableName() { + return tableName; + } + + public void setTableName(String tableName) { + this.tableName = tableName; + } + + public List getXdtTradebillVoList() { + return xdtTradebillVoList; + } + + public void setXdtTradebillVoList(List xdtTradebillVoList) { + this.xdtTradebillVoList = xdtTradebillVoList; + } +} diff --git a/xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/utils/ExcelUtilYu.java b/xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/utils/ExcelUtilYu.java new file mode 100644 index 00000000..2a5cd0c0 --- /dev/null +++ b/xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/utils/ExcelUtilYu.java @@ -0,0 +1,1121 @@ +package com.xhpc.activity.utils; + +import com.aliyun.oss.OSS; +import com.aliyun.oss.OSSClientBuilder; + +import com.aliyun.oss.model.PutObjectResult; +import com.aliyuncs.exceptions.ClientException; +import com.xhpc.activity.config.AliOSSProperties; +import com.xhpc.activity.vo.XDTTradebillVo; +import com.xhpc.common.util.DateUtil; +import org.apache.poi.hssf.usermodel.*; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.HorizontalAlignment; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.util.CellRangeAddress; +import org.apache.poi.xssf.usermodel.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 导出工具 + * + * @author yuyang + * @Date 2024-09-12 17:02 + */ +public class ExcelUtilYu { + private static String accessKeyId = "LTAI5tBWjnuQGxGicnThwMF1"; + private static String accessKeySecret = "b0WNtFYtWyTEkZzcr2WOAPoZg6w2Xu"; + + /** + * 创建Excel表 + * @param sheetName sheet名称 + * @param title 标题 + * @param keys 标题对应 map中的key值 + * @param dataList 内容 + * @return + */ + private static HSSFWorkbook getHSSFWorkbook(String sheetName, String []title, String []keys, List> dataList){ + + // 第一步,创建一个HSSFWorkbook,对应一个Excel文件 + HSSFWorkbook wb = new HSSFWorkbook(); + + // 第二步,在workbook中添加一个sheet,对应Excel文件中的sheet + HSSFSheet sheet = wb.createSheet(sheetName); + + // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制 + HSSFRow row = sheet.createRow(0); + + // 第四步,创建单元格,并设置值表头 设置表头居中 + HSSFCellStyle style = wb.createCellStyle(); + // 创建一个居中格式 +// style.setAlignment(HSSFCellStyle.ALIGN_CENTER); + HSSFFont font = wb.createFont(); + font.setFontName("DengXian"); + font.setFontHeightInPoints((short)12); + style.setFont(font); + + //声明列对象 + HSSFCell cell = null; + + //创建标题 + for(int i=0;i map = dataList.get(i); + //序号 + HSSFCell cell1 = row.createCell(0); + cell1.setCellValue(i+1); + cell1.setCellStyle(style); + for (int j = 0; j < keys.length; j++) { + String key = keys[j]; + //将内容对应的列对象 + if(map.get(key)==null){ + HSSFCell cell2 = row.createCell(j + 1); + cell2.setCellValue(""); + cell2.setCellStyle(style); + }else{ + HSSFCell cell2 = row.createCell(j + 1); + cell2.setCellValue(map.get(key).toString()); + cell2.setCellStyle(style); + } + } + } + return wb; + } + + /** + * 发送响应流方法 + * @param response 响应 + * @param fileName 文件名 + * @param wb 表格对象 + */ + private static void setResponseHeader(HttpServletResponse response, HttpServletRequest requset, String fileName, HSSFWorkbook wb, XSSFWorkbook sb) { + if(wb==null && sb ==null){ + return; + } + try { + response.setCharacterEncoding("utf-8"); + response.setContentType("application/msword"); + response.setHeader("content-type", "application/octet-stream"); + response.setContentType("application/octet-stream"); + if (requset.getHeader("User-Agent").toLowerCase().indexOf("firefox") > 0) { + fileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1"); // firefox浏览器 + } else if (requset.getHeader("User-Agent").toUpperCase().indexOf("MSIE") > 0 || requset.getHeader("User-Agent").contains("Trident")) { + fileName = URLEncoder.encode(fileName, "UTF-8");// IE浏览器 + }else if (requset.getHeader("User-Agent").toUpperCase().indexOf("CHROME") > 0) { + fileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1");// 谷歌 + } + response.setHeader("Content-disposition", String.format("attachment;filename=\"%s\"",fileName)); + OutputStream os = response.getOutputStream(); + if(wb!=null){ + wb.write(os); + }else{ + sb.write(os); + } + os.flush(); + os.close(); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + /** + * 自定义导出表格 + * @param response 响应 + * @param fileName 文件名 + * @param sheetName sheet名 + * @param title 每行的标题 + * @param keys 每个map值得 key + * @param dataList 内容 + */ + public static void importExcel(HttpServletResponse response, HttpServletRequest requset, String fileName,String sheetName, String []title,String []keys, List> dataList) throws ClientException { + HSSFWorkbook workbook = getHSSFWorkbook(sheetName, title, keys, dataList); + setResponseHeader(response,requset,fileName,workbook,null); + } + + /** + * 通过源文件导出表格 + * @param response 响应头 + * @param fileName 文件名字 + * @param path 源文件路径 + * @param keys 每个map值的key + * @param dataList 内容 + * @param sheetNum Excel 左下角行号 + * @param sheetName Excel 左下角名称 + */ + public static void importExcelByOrigin(HttpServletResponse response, HttpServletRequest requset,String fileName,String path,String []keys, List> dataList,int sheetNum,String value,String sheetName,int line){ + + if(value.equals("visit")){ + XSSFWorkbook workbook = createByPathXLSX(path, keys, dataList,sheetNum,sheetName,line); + setResponseHeaderVisit(response,requset,fileName,null,workbook); + }else if(value.equals("yu")){ + XSSFWorkbook workbook = createByPathYu(path, keys, dataList,sheetNum,sheetName,line); + setResponseHeader(response,requset,fileName,null,workbook); + }else if(value.equals("xls")){ + HSSFWorkbook workbook = createByPath(path, keys, dataList,sheetNum,line); + setResponseHeader(response,requset,fileName,workbook,null); + }else{ + XSSFWorkbook workbook = createByPathXLSX(path, keys, dataList,sheetNum,sheetName,line); + setResponseHeader(response,requset,fileName,null,workbook); + } + } + + /** + * 通过源文件创建表格(xls) + * @param path 源文件路径 + * @param keys map 中的key值 + * @param dataList 内容列表 + * @param sheetNum Excel 左下角行号 + * @return + */ + private static HSSFWorkbook createByPath(String path,String []keys,List> dataList,int sheetNum,int line){ + File newFile = new File(path); + try { + FileInputStream fileInputStream = new FileInputStream(newFile); + HSSFWorkbook hssfWorkbook = new HSSFWorkbook(fileInputStream); + HSSFSheet sheet = hssfWorkbook.getSheetAt(sheetNum); + //创建内容 + for(int i=0;i map = dataList.get(i); + //序号 + HSSFCell cell1 = row.createCell(0); + cell1.setCellValue(i+1); + for (int j = 0; j < keys.length; j++) { + String key = keys[j]; + //将内容对应的列对象 + if(map.get(key)==null){ + HSSFCell cell2 = row.createCell(j + 1); + cell2.setCellValue(""); + }else{ + HSSFCell cell2 = row.createCell(j + 1); + cell2.setCellValue(map.get(key).toString()); + } + } + } + return hssfWorkbook; + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + + /** + * 通过源文件创建表格(xlsx) + * @param path 源文件路径 + * @param keys map 中的key值 + * @param dataList 内容列表 + * @param sheetNum Excel 左下角行号 + * @param sheetName Excel 左下角名称 + * @param line Excel 第几行导入数据 + * @return + */ + private static XSSFWorkbook createByPathXLSX(String path,String []keys,List> dataList,int sheetNum,String sheetName,int line){ + File newFile = new File(path); + try { + FileInputStream fileInputStream = new FileInputStream(newFile); + XSSFWorkbook hssfWorkbook = new XSSFWorkbook(fileInputStream); + hssfWorkbook.setSheetName(sheetNum,sheetName); + XSSFSheet sheet = hssfWorkbook.getSheetAt(sheetNum); + //创建内容 + for(int i=0;i map = dataList.get(i); + //序号 + //XSSFCell cell1 = row.createCell(0); + //cell1.setCellValue(i+1); + for (int j = 0; j < keys.length; j++) { + String key = keys[j]; + //将内容对应的列对象 + if(map.get(key)==null){ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(""); + }else{ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(map.get(key).toString()); + } + } + } + + return hssfWorkbook; + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + + + + + /** + * MultipartFile 转 File + * @param file + * @throws Exception + */ + public static File inputStreamToFile(MultipartFile file) throws Exception{ + InputStream ins = file.getInputStream(); + File toFile = new File(file.getOriginalFilename()); + + try { + OutputStream os = new FileOutputStream(toFile); + int bytesRead = 0; + byte[] buffer = new byte[8192]; + while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) { + os.write(buffer, 0, bytesRead); + } + os.close(); + ins.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return toFile; + } + + /** + * 过滤空行 + */ + public static boolean isRowEmpty(XSSFRow row) { + for (int c = row.getFirstCellNum(); c < row.getLastCellNum(); c++) { + XSSFCell cell = row.getCell(c); +// if (cell != null && cell.getCellType() != Cell.CELL_TYPE_BLANK){ +// return false; +// } + } + return true; + } + + + /** + * 下载Excel + * @param response + * @param requset + * @param url 路径 + * @param name 名称 + * @throws Exception + */ + public static void getExcelDownload(HttpServletResponse response, HttpServletRequest requset,String url,String name)throws Exception{ + //String path = System.getProperty("user.dir"); + String path =url; + //方法一:直接下载路径下的文件模板 + try { + //获取要下载的模板名称 + String fileName = URLEncoder.encode(name,"UTF-8"); + //设置要下载的文件的名称 + if (requset.getHeader("User-Agent").toLowerCase().indexOf("firefox") > 0) { + fileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1"); // firefox浏览器 + } else if (requset.getHeader("User-Agent").toUpperCase().indexOf("MSIE") > 0 || requset.getHeader("User-Agent").contains("Trident")) { + fileName = URLEncoder.encode(fileName, "UTF-8");// IE浏览器 + }else if (requset.getHeader("User-Agent").toUpperCase().indexOf("CHROME") > 0) { + fileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1");// 谷歌 + } + response.setHeader("Content-Type","application/msexcel"); + //response.setHeader("Content-disposition", String.format("attachment;filename=\"%s\"",fileName)); + response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName+".xlsx", "UTF-8")); + //通知客服文件的MIME类型 + response.setContentType("application/vnd.ms-excel;charset=UTF-8"); + //获取文件的路径 + FileInputStream input = new FileInputStream(path); + OutputStream out = response.getOutputStream(); + byte[] b = new byte[2048]; + int len; + while ((len = input.read(b)) != -1) { + out.write(b, 0, len); + } + //修正 Excel在“xxx.xlsx”中发现不可读取的内容。是否恢复此工作薄的内容?如果信任此工作簿的来源,请点击"是" + response.setHeader("Content-Length", String.valueOf(input.getChannel().size())); + input.close(); + //return Response.ok("应用导入模板下载完成"); + } catch (Exception ex) { + //return Response.ok("应用导入模板下载失败!"); + } + } + + + private static XSSFWorkbook createByPathYu(String path,String []keys,List> dataList,int sheetNum,String sheetName,int line){ + File newFile = new File(path); + try { + FileInputStream fileInputStream = new FileInputStream(newFile); + XSSFWorkbook hssfWorkbook = new XSSFWorkbook(fileInputStream); + hssfWorkbook.setSheetName(sheetNum,sheetName); + XSSFSheet sheet = hssfWorkbook.getSheetAt(sheetNum); + XSSFCellStyle cellStyle = hssfWorkbook.createCellStyle(); + cellStyle.setWrapText(true); + + //创建内容 + int sum=0; //开始第几行 + int count =0;//结束第几行 + Long repeatId =0L; + for(int i=0;i map = dataList.get(i); + int repeat = Integer.parseInt(map.get("number").toString()); + Long id = Long.valueOf(map.get("id").toString()); + String name = map.get("name").toString(); + if(!repeatId.equals(id) || "基础合计分".equals(name.substring(0,5))){ + repeatId = id; + if(i==0){ + sum = 2; + count = 2+repeat-1; + sheet.addMergedRegion(new CellRangeAddress(sum,count,0,0)); + sheet.addMergedRegion(new CellRangeAddress(sum,count,1,1)); + sheet.addMergedRegion(new CellRangeAddress(sum,count,2,2)); + sum =sum+repeat; + }else if("基础合计分".equals(name.substring(0,5))){ + count =sum; + sheet.addMergedRegion(new CellRangeAddress(sum,count,0,2)); + sheet.addMergedRegion(new CellRangeAddress(sum,count,3,4)); + sum =sum+1; + }else { + count = sum+repeat-1; + sheet.addMergedRegion(new CellRangeAddress(sum,count,0,0)); + sheet.addMergedRegion(new CellRangeAddress(sum,count,1,1)); + sheet.addMergedRegion(new CellRangeAddress(sum,count,2,2)); + sum =sum+repeat; + } + } + //序号 + //XSSFCell cell1 = row.createCell(0); + //cell1.setCellValue(i+1); + for (int j = 0; j < keys.length; j++) { + String key = keys[j]; + //将内容对应的列对象 + if(map.get(key)==null){ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(""); + }else{ + XSSFCell cell2 = row.createCell(j ); + if(j==1 && "基础".equals(map.get(key).toString().substring(0,2))){ + XSSFCell cell3 = row.createCell(j-1 ); + cell3.setCellValue("基础分合计"); + XSSFCell cell4 = row.createCell(j+2 ); + cell4.setCellValue(map.get(key).toString().substring(5)); + break; + }else{ + cell2.setCellValue(map.get(key).toString()); + } + } + } + } + return hssfWorkbook; + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + + public static XSSFWorkbook importExcelByOriginYu(HttpServletResponse response, HttpServletRequest requset,String fileName,String path, List mysheets,int sheetNum,String value,String sheetName,int line) throws ClientException, IOException { + return createByPathYus(path,mysheets,sheetNum,sheetName,line); + + + } + + + private static XSSFWorkbook createByPathYus(String path,List mysheets,int sheetNum,String sheetName,int line){ + File newFile = new File(path); + try { + FileInputStream fileInputStream = new FileInputStream(newFile); + XSSFWorkbook hssfWorkbook = new XSSFWorkbook(fileInputStream); + List sheets = mysheets; + for (int k = 0; k < sheets.size(); k++) { + ExcelExp excel = sheets.get(k); + XSSFCellStyle style = hssfWorkbook.createCellStyle(); + style.setAlignment(HorizontalAlignment.CENTER); // 创建一个居中格式 + // 字体样式 + XSSFFont fontStyle = hssfWorkbook.createFont(); + fontStyle.setFontName("微软雅黑"); + fontStyle.setFontHeightInPoints((short) 12); + style.setFont(fontStyle); + style.setWrapText(true); + XSSFSheet sheet = hssfWorkbook.createSheet(excel.getFileName()); + sheet.setColumnWidth(0,100); + XSSFRow tableName = sheet.createRow(0); + XSSFCell cellName = tableName.createCell(0); + if(k==0){ + sheet.addMergedRegion(new CellRangeAddress(0,0,0,15)); + }else if(k==1){ + sheet.addMergedRegion(new CellRangeAddress(0,0,0,29)); + }else{ + sheet.addMergedRegion(new CellRangeAddress(0,0,0,33)); + } + + sheet.autoSizeColumn(1,true); + XSSFCellStyle titleStyle = hssfWorkbook.createCellStyle(); + XSSFFont titleFont = hssfWorkbook.createFont(); + titleFont.setFontHeightInPoints((short) 16); // 字 + titleStyle.setFont(titleFont); + titleStyle.setAlignment(HorizontalAlignment.CENTER); + cellName.setCellStyle(titleStyle); + // 设置单元格内容 + cellName.setCellValue(excel.getTableName()); + XSSFRow rowFirst = sheet.createRow(1); + String[] keys = excel.getHanders(); + + for (int i = 0; i < keys.length; i++) { + // 获取第一行的每个单元格 + XSSFCell cell = rowFirst.createCell(i); + // 往单元格里写数据 + if("PowerAmount".equals(keys[i])){ + cell.setCellValue("电费"); + }else if("ServerAmount".equals(keys[i])){ + cell.setCellValue("服务费"); + }else if("totalAmount".equals(keys[i])){ + cell.setCellValue("总金额"); + }else if("ChargingDegree".equals(keys[i])){ + cell.setCellValue("电量"); + }else if("InternetCommission".equals(keys[i])){ + cell.setCellValue("流里方总金额抽成"); + }else if("InternetSvcCommission".equals(keys[i])){ + cell.setCellValue("流里方服务费抽成"); + }else if("InternetDegreeCommissione".equals(keys[i])){ + cell.setCellValue("流里方电量抽成"); + }else if("totalInternetAmount".equals(keys[i])){ + cell.setCellValue("流里方总抽成的钱"); + }else if("ActPowerPrice".equals(keys[i])){ + cell.setCellValue("实收电费"); + }else if("ActServicePrice".equals(keys[i])){ + cell.setCellValue("实收服务费"); + }else if("totalInternetSettlementAmount".equals(keys[i])){ + cell.setCellValue("流里方结算平台金额"); + }else if("totalPowerAmount".equals(keys[i])){ + cell.setCellValue("电费"); + }else if("totalServerAmount".equals(keys[i])){ + cell.setCellValue("服务费"); + }else if("InternetSettlementAmount".equals(keys[i])){ + cell.setCellValue("总金额"); + }else if("totalChargingDegree".equals(keys[i])){ + cell.setCellValue("电量"); + }else if("totalPayAmount".equals(keys[i])){ + cell.setCellValue("流里方结算平台金额"); + }else if("orderNo".equals(keys[i])){ + cell.setCellValue("第三方订单号"); + }else if("stationName".equals(keys[i])){ + cell.setCellValue("场站"); + }else if("city".equals(keys[i])){ + cell.setCellValue("城市名称"); + }else if("exceptionType".equals(keys[i])){ + cell.setCellValue("异常类型"); + }else if("transactionType".equals(keys[i])){ + cell.setCellValue("交易类型"); + }else if("paymentType".equals(keys[i])){ + cell.setCellValue("付款类型"); + }else if("settlementType".equals(keys[i])){ + cell.setCellValue("结算状态"); + }else if("settlementTime".equals(keys[i])){ + cell.setCellValue("结算账单日"); + }else if("orderAmount".equals(keys[i])){ + cell.setCellValue("结算订单金额"); + }else if("orderUserAmount".equals(keys[i])){ + cell.setCellValue("结算用户实付金额"); + }else if("offlineAmount".equals(keys[i])){ + cell.setCellValue("线下支付金额"); + }else if("userAmount".equals(keys[i])){ + cell.setCellValue("用户待付金额"); + }else if("badDebt".equals(keys[i])){ + cell.setCellValue("充电坏账承担方"); + }else if("placeholderBadDebt".equals(keys[i])){ + cell.setCellValue("占位坏账承担方"); + }else if("platformBadDebt".equals(keys[i])){ + cell.setCellValue("平台承担坏账金额"); + }else if("businessMoney".equals(keys[i])){ + cell.setCellValue("商家支出"); + }else if("platformMoney".equals(keys[i])){ + cell.setCellValue("平台承担费用"); + }else if("platformMoneyDifference".equals(keys[i])){ + cell.setCellValue("平台费用总税差"); + }else if("platformIncomeMoney".equals(keys[i])){ + cell.setCellValue("平台收入金额"); + }else if("platformProfitSharingMoney".equals(keys[i])){ + cell.setCellValue("平台分润金额"); + }else if("platformServerMoney".equals(keys[i])){ + cell.setCellValue("平台服务费金额"); + }else if("payAmount".equals(keys[i])){ + cell.setCellValue("商家结算金额"); + }else if("chargingDegree".equals(keys[i])){ + cell.setCellValue("充电量"); + }else if("powerAmount".equals(keys[i])){ + cell.setCellValue("充电费"); + }else if("serverAmount".equals(keys[i])){ + cell.setCellValue("服务费"); + }else if("surchargeAmount".equals(keys[i])){ + cell.setCellValue("附加费"); + }else if("settlementRules".equals(keys[i])){ + cell.setCellValue("结算规则"); + }else if("stationOrder".equals(keys[i])){ + cell.setCellValue("占位订单号"); + }else if("notes".equals(keys[i])){ + cell.setCellValue("备注"); + }else if("orderCreateTime".equals(keys[i])){ + cell.setCellValue("订单生成时间"); + }else if("orderType".equals(keys[i])){ + cell.setCellValue("订单类型"); + }else if("serialNumber".equals(keys[i])){ + cell.setCellValue("订单号"); + }else if("internetSerialNumber".equals(keys[i])){ + cell.setCellValue("流量方订单号"); + }else if("chargingStationName".equals(keys[i])){ + cell.setCellValue("电站名称"); + }else if("pileSerialNumber".equals(keys[i])){ + cell.setCellValue("桩编号"); + }else if("terminalName".equals(keys[i])){ + cell.setCellValue("终端名称"); + }else if("power".equals(keys[i])){ + cell.setCellValue("功率"); + }else if("startSoc".equals(keys[i])){ + cell.setCellValue("开始soc"); + }else if("endSoc".equals(keys[i])){ + cell.setCellValue("结束soc"); + }else if("powerPriceTotal".equals(keys[i])){ + cell.setCellValue("总电费"); + }else if("servicePriceTotal".equals(keys[i])){ + cell.setCellValue("总服务费"); + }else if("totalPrice".equals(keys[i])){ + cell.setCellValue("订单总价"); + }else if("activityPowerPriceTotal".equals(keys[i])){ + cell.setCellValue("活动总电费"); + }else if("activityServicePriceTotal".equals(keys[i])){ + cell.setCellValue("活动总服务费"); + }else if("activityTotalPrice".equals(keys[i])){ + cell.setCellValue("活动总金额"); + }else if("promotionDiscount".equals(keys[i])){ + cell.setCellValue("电站活动抵扣总金额"); + }else if("actPrice".equals(keys[i])){ + cell.setCellValue("实际价格"); + }else if("internetCommission".equals(keys[i])){ + cell.setCellValue("流量方总金额抽成"); + }else if("internetSvcCommission".equals(keys[i])){ + cell.setCellValue("流量方服务费抽成"); + }else if("internetDegreeCommission".equals(keys[i])){ + cell.setCellValue("流量方电量抽成"); + }else if("platformCommission".equals(keys[i])){ + cell.setCellValue("平台总金额抽成"); + }else if("platformSvcCommisssion".equals(keys[i])){ + cell.setCellValue("平台服务费抽成"); + }else if("operationCommission".equals(keys[i])){ + cell.setCellValue("运维总抽成"); + }else if("operationSvcCommission".equals(keys[i])){ + cell.setCellValue("运维服务费抽成"); + }else if("actPowerPrice".equals(keys[i])){ + cell.setCellValue("实收电费-运营商电费"); + }else if("actServicePrice".equals(keys[i])){ + cell.setCellValue("实收电费-运营商服务费"); + }else if("actSumPrice".equals(keys[i])){ + cell.setCellValue("实收总费用-运营商总费用"); + }else if("totalPrice".equals(keys[i])){ + cell.setCellValue("订单总价"); + }else if("actPrice".equals(keys[i])){ + cell.setCellValue("实际价格-用户支付的钱"); + }else if("chargingTime".equals(keys[i])){ + cell.setCellValue("创建时间"); + }else if("chargingDegree".equals(keys[i])){ + cell.setCellValue("电量"); + }else if("startTime".equals(keys[i])){ + cell.setCellValue("订单开始时间"); + }else if("endTime".equals(keys[i])){ + cell.setCellValue("订单结束时间"); + }else if("chargingModeName".equals(keys[i])){ + cell.setCellValue("订单来源"); + } + cell.setCellStyle(style); // 加样式 + sheet.setColumnWidth(i, 7800); // 设置每列的列宽 + } + + if(k==1){ + List xdtTradebillVoList = excel.getXdtTradebillVoList(); + for (int i = 0; i < xdtTradebillVoList.size(); i++) { + XSSFRow row = sheet.createRow(i + line); + XDTTradebillVo xdtTradebillVo = xdtTradebillVoList.get(i); + for (int j = 0; j < keys.length; j++) { + String key = keys[j]; + if(j==0){ + if(xdtTradebillVo.getOrderNo()==null){ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(""); + }else{ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(xdtTradebillVo.getOrderNo()); + } + }else if(j==1){ + if(xdtTradebillVo.getStationName()==null){ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(""); + }else{ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(xdtTradebillVo.getStationName()); + } + }else if(j==2){ + if(xdtTradebillVo.getCity()==null){ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(""); + }else{ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(xdtTradebillVo.getCity()); + } + }else if(j==3){ + if(xdtTradebillVo.getExceptionType()==null){ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(""); + }else{ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(xdtTradebillVo.getExceptionType()); + } + }else if(j==4){ + if(xdtTradebillVo.getTransactionType()==null){ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(""); + }else{ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(xdtTradebillVo.getTransactionType()); + } + }else if(j==5){ + if(xdtTradebillVo.getPaymentType()==null){ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(""); + }else{ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(xdtTradebillVo.getPaymentType()); + } + }else if(j==6){ + if(xdtTradebillVo.getSettlementType()==null){ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(""); + }else{ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(xdtTradebillVo.getSettlementType()); + } + }else if(j==7){ + if(xdtTradebillVo.getSettlementTime()==null){ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(""); + }else{ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(xdtTradebillVo.getSettlementTime()); + } + }else if(j==8){ + if(xdtTradebillVo.getOrderAmount()==null){ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(""); + }else{ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(xdtTradebillVo.getOrderAmount().toString()); + } + }else if(j==9){ + if(xdtTradebillVo.getOrderUserAmount()==null){ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(""); + }else{ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(xdtTradebillVo.getOrderUserAmount().toString()); + } + }else if(j==10){ + if(xdtTradebillVo.getOfflineAmount()==null){ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(""); + }else{ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(xdtTradebillVo.getOfflineAmount().toString()); + } + }else if(j==11){ + if(xdtTradebillVo.getUserAmount()==null){ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(""); + }else{ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(xdtTradebillVo.getUserAmount().toString()); + } + }else if(j==12){ + if(xdtTradebillVo.getBadDebt()==null){ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(""); + }else{ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(xdtTradebillVo.getBadDebt()); + } + }else if(j==13){ + if(xdtTradebillVo.getPlaceholderBadDebt()==null){ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(""); + }else{ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(xdtTradebillVo.getPlaceholderBadDebt()); + } + }else if(j==14){ + if(xdtTradebillVo.getPlatformBadDebt()==null){ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(""); + }else{ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(xdtTradebillVo.getPlatformBadDebt().toString()); + } + }else if(j==15){ + if(xdtTradebillVo.getBusinessMoney()==null){ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(""); + }else{ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(xdtTradebillVo.getBusinessMoney().toString()); + } + }else if(j==16){ + if(xdtTradebillVo.getPlatformMoney()==null){ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(""); + }else{ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(xdtTradebillVo.getPlatformMoney().toString()); + } + }else if(j==17){ + if(xdtTradebillVo.getPlatformMoneyDifference()==null){ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(""); + }else{ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(xdtTradebillVo.getPlatformMoneyDifference().toString()); + } + }else if(j==18){ + if(xdtTradebillVo.getPlatformIncomeMoney()==null){ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(""); + }else{ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(xdtTradebillVo.getPlatformIncomeMoney().toString()); + } + }else if(j==19){ + if(xdtTradebillVo.getPlatformProfitSharingMoney()==null){ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(""); + }else{ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(xdtTradebillVo.getPlatformProfitSharingMoney().toString()); + } + }else if(j==20){ + if(xdtTradebillVo.getPlatformServerMoney()==null){ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(""); + }else{ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(xdtTradebillVo.getPlatformServerMoney().toString()); + } + }else if(j==21){ + if(xdtTradebillVo.getPayAmount()==null){ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(""); + }else{ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(xdtTradebillVo.getPayAmount().toString()); + } + }else if(j==22){ + if(xdtTradebillVo.getChargingDegree()==null){ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(""); + }else{ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(xdtTradebillVo.getChargingDegree().toString()); + } + }else if(j==23){ + if(xdtTradebillVo.getPowerAmount()==null){ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(""); + }else{ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(xdtTradebillVo.getPowerAmount().toString()); + } + }else if(j==24){ + if(xdtTradebillVo.getServerAmount()==null){ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(""); + }else{ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(xdtTradebillVo.getServerAmount().toString()); + } + }else if(j==25){ + if(xdtTradebillVo.getSurchargeAmount()==null){ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(""); + }else{ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(xdtTradebillVo.getSurchargeAmount().toString()); + } + }else if(j==25){ + if(xdtTradebillVo.getSettlementRules()==null){ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(""); + }else{ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(xdtTradebillVo.getSettlementRules()); + } + }else if(j==26){ + if(xdtTradebillVo.getStationOrder()==null){ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(""); + }else{ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(xdtTradebillVo.getStationOrder()); + } + }else if(j==27){ + if(xdtTradebillVo.getNotes()==null){ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(""); + }else{ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(xdtTradebillVo.getNotes()); + } + }else if(j==28){ + if(xdtTradebillVo.getOrderCreateTime()==null){ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(""); + }else{ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(xdtTradebillVo.getOrderCreateTime()); + } + }else if(j==29){ + if(xdtTradebillVo.getOrderType()==null){ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(""); + }else{ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(xdtTradebillVo.getOrderType()); + } + } + } + } + }else{ + List> dataList = excel.getDataset(); + for(int i=0;i map = dataList.get(i); + //序号 + //XSSFCell cell1 = row.createCell(0); + //cell1.setCellValue(i+1); + for (int j = 0; j < keys.length; j++) { + String key = keys[j]; + //将内容对应的列对象 + if(map.get(key)==null){ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(""); + }else{ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(map.get(key).toString()); + } + } + } + } + + + setAutoColumnWidth(hssfWorkbook.getSheet(excel.getFileName()),3); + } + return hssfWorkbook; + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + + + private static void setAutoColumnWidth(XSSFSheet sheet,int maxColumnNum) { + try{ + //获取当前列的宽度,然后对比本列的长度,取最大值 + for (int columnNum = 0; columnNum <= maxColumnNum; columnNum++) + { + int columnWidth = sheet.getColumnWidth(columnNum) / 256; + for (int rowNum = 0; rowNum <= sheet.getLastRowNum(); rowNum++) + { + Row currentRow; + //当前行未被使用过 + if (sheet.getRow(rowNum) == null) + { + currentRow = sheet.createRow(rowNum); + } + else + { + currentRow = sheet.getRow(rowNum); + } + + if(currentRow.getCell(columnNum) != null) + { + Cell currentCell = currentRow.getCell(columnNum); + int length = currentCell.toString().getBytes("GBK").length; + if (columnWidth < length + 1) + { + columnWidth = length + 1; + } + } + } + sheet.setColumnWidth(columnNum, columnWidth * 300); + } + }catch (UnsupportedEncodingException e){ + e.printStackTrace(); + } + } + + public static void importExcelByOriginVisit(HttpServletResponse response, HttpServletRequest requset,String fileName,String path, List mysheets,int sheetNum,String value,String sheetName,int line){ + XSSFWorkbook workbook = createByPathVisit(path,mysheets,sheetNum,sheetName,line); + setResponseHeaderVisit(response,requset,fileName,null,workbook); + } + + private static XSSFWorkbook createByPathVisit(String path,List mysheets,int sheetNum,String sheetName,int line){ + File newFile = new File(path); + try { + FileInputStream fileInputStream = new FileInputStream(newFile); + XSSFWorkbook hssfWorkbook = new XSSFWorkbook(fileInputStream); + List sheets = mysheets; + for (int k = 0; k < sheets.size(); k++) { + ExcelExp excel = sheets.get(k); + XSSFCellStyle style = hssfWorkbook.createCellStyle(); + style.setAlignment(HorizontalAlignment.CENTER); // 创建一个居中格式 + // 字体样式 + XSSFFont fontStyle = hssfWorkbook.createFont(); + fontStyle.setFontName("微软雅黑"); + fontStyle.setFontHeightInPoints((short) 12); + + style.setFont(fontStyle); + style.setWrapText(true); + + XSSFSheet sheet = hssfWorkbook.createSheet(excel.getFileName()); + sheet.setColumnWidth(0,100); + XSSFRow tableName = sheet.createRow(0); + XSSFCell cellName = tableName.createCell(0); + sheet.addMergedRegion(new CellRangeAddress(0,0,0,18)); + sheet.autoSizeColumn(1,true); + XSSFCellStyle titleStyle = hssfWorkbook.createCellStyle(); + XSSFFont titleFont = hssfWorkbook.createFont(); + titleFont.setFontHeightInPoints((short) 16); // 字 + titleStyle.setFont(titleFont); + titleStyle.setAlignment(HorizontalAlignment.CENTER); + cellName.setCellStyle(titleStyle); + // 设置单元格内容 + cellName.setCellValue(excel.getTableName()); + XSSFRow rowFirst = sheet.createRow(1); + + String[] keys = excel.getHanders(); + for (int i = 0; i < keys.length; i++) { + // 获取第一行的每个单元格 + XSSFCell cell = rowFirst.createCell(i); + // 往单元格里写数据 + if("visitData".equals(keys[i])){ + cell.setCellValue("来访日期"); + }else if("visitName".equals(keys[i])){ + cell.setCellValue("来访问人姓名"); + }else if("visitTypeName".equals(keys[i])){ + cell.setCellValue("来访类别"); + }else if("visitPeople".equals(keys[i])){ + cell.setCellValue("来访人数"); + }else if("visitSex".equals(keys[i])){ + cell.setCellValue("性别"); + }else if("visitIdNo".equals(keys[i])){ + cell.setCellValue("身份证号码"); + }else if("visitCode".equals(keys[i])){ + cell.setCellValue("来访人地址"); + }else if("visitAddress".equals(keys[i])){ + cell.setCellValue("详细地址"); + }else if("visitPhone".equals(keys[i])){ + cell.setCellValue("联系电话"); + }else if("visitInterviewName".equals(keys[i])){ + cell.setCellValue("接访人姓名"); + }else if("visitProblem".equals(keys[i])){ + cell.setCellValue("来访反映的主要问题及要求"); + }else if("appealOne".equals(keys[i])){ + cell.setCellValue("是否涉诉处理结果1"); + }else if("appealTwo".equals(keys[i])){ + cell.setCellValue("是否涉诉处理结果2"); + }else if("appealThree".equals(keys[i])){ + cell.setCellValue("是否涉诉处理结果3"); + }else if("visitHelp".equals(keys[i])){ + cell.setCellValue("是否要求法律帮助/援助"); + }else if("visitOpinion".equals(keys[i])){ + cell.setCellValue("处理意见"); + }else if("visitRemarks".equals(keys[i])){ + cell.setCellValue("备注"); + }else if("errorMassage".equals(keys[i])){ + cell.setCellValue("错误信息"); + } + cell.setCellStyle(style); // 加样式 + sheet.setColumnWidth(i, 4000); // 设置每列的列宽 + } + List> dataList = excel.getDataset(); + //创建内容 + for(int i=0;i map = dataList.get(i); + //序号 + //XSSFCell cell1 = row.createCell(0); + //cell1.setCellValue(i+1); + for (int j = 0; j < keys.length; j++) { + String key = keys[j]; + //将内容对应的列对象 + if(map.get(key)==null){ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(""); + }else{ + XSSFCell cell2 = row.createCell(j ); + cell2.setCellValue(map.get(key).toString()); + } + } + } + } + return hssfWorkbook; + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + /** + * 发送响应流方法 + * @param response 响应 + * @param fileName 文件名 + * @param wb 表格对象 + */ + private static void setResponseHeaderVisit(HttpServletResponse response, HttpServletRequest requset, String fileName, HSSFWorkbook wb, XSSFWorkbook sb) { + if(wb==null && sb ==null){ + return; + } + try { + response.setCharacterEncoding("utf-8"); + response.setContentType("application/msword"); + response.setHeader("content-type", "application/octet-stream"); + response.setContentType("application/octet-stream"); + if (requset.getHeader("User-Agent").toLowerCase().indexOf("firefox") > 0) { + fileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1"); // firefox浏览器 + } else if (requset.getHeader("User-Agent").toUpperCase().indexOf("MSIE") > 0 || requset.getHeader("User-Agent").contains("Trident")) { + fileName = URLEncoder.encode(fileName, "UTF-8");// IE浏览器 + }else if (requset.getHeader("User-Agent").toUpperCase().indexOf("CHROME") > 0) { + fileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1");// 谷歌 + } + response.setHeader("Content-disposition", String.format("attachment;filename=\"%s\"",fileName)); + OutputStream os = response.getOutputStream(); + if(wb!=null){ + wb.write(os); + }else{ + //sb.write(os); + } + os.flush(); + os.close(); + } catch (Exception ex) { + ex.printStackTrace(); + } + } +} diff --git a/xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/vo/XDTTradebillVo.java b/xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/vo/XDTTradebillVo.java index 2039442a..9780f982 100644 --- a/xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/vo/XDTTradebillVo.java +++ b/xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/vo/XDTTradebillVo.java @@ -13,94 +13,98 @@ import java.util.Date; @Data public class XDTTradebillVo { - @Excel(name = "订单时间") - @Alias("订单时间") - private Date orderTime; - - @Excel(name = "订单号") - @Alias("订单号") + @Excel(name = "第三方订单号") + @Alias("第三方订单号") private String orderNo = ""; - @Excel(name = "订单类型") - @Alias("订单类型") - private String orderType = ""; + @Excel(name = "场站") + @Alias("场站") + private String stationName = ""; + + @Excel(name = "城市名称") + @Alias("城市名称") + private String city = ""; @Excel(name = "异常类型") @Alias("异常类型") private String exceptionType = ""; - @Excel(name = "城市") - @Alias("城市") - private String city = ""; + @Excel(name = "交易类型") + @Alias("交易类型") + private String transactionType = ""; - @Excel(name = "站点名称") - @Alias("站点名称") - private String stationName = ""; + @Excel(name = "付款类型") + @Alias("付款类型") + private String paymentType = ""; + + @Excel(name = "结算状态") + @Alias("结算状态") + private String settlementType = ""; + + @Excel(name = "结算账单日") + @Alias("结算账单日") + private String settlementTime = ""; + + @Excel(name = "结算订单金额") + @Alias("结算订单金额") + private Double orderAmount = 0.0; + + @Excel(name = "结算用户实付金额") + @Alias("结算用户实付金额") + private Double orderUserAmount = 0.0; + + @Excel(name = "线下支付金额") + @Alias("线下支付金额") + private Double offlineAmount = 0.0; + + @Excel(name = "用户待付金额") + @Alias("用户待付金额") + private Double userAmount = 0.0; + + @Excel(name = "充电坏账承担方") + @Alias("充电坏账承担方") + private String badDebt = ""; + + @Excel(name = "占位坏账承担方") + @Alias("占位坏账承担方") + private String placeholderBadDebt = ""; + + @Excel(name = "平台承担坏账金额") + @Alias("平台承担坏账金额") + private Double platformBadDebt = 0.0; + + @Excel(name = "商家支出") + @Alias("商家支出") + private Double businessMoney = 0.0; + + @Excel(name = "平台承担费用") + @Alias("平台承担费用") + private Double platformMoney = 0.0; + + @Excel(name = "平台费用总税差") + @Alias("平台费用总税差") + private Double platformMoneyDifference = 0.0; + + @Excel(name = "平台收入金额") + @Alias("平台收入金额") + private Double platformIncomeMoney = 0.0; + + @Excel(name = "平台分润金额") + @Alias("平台分润金额") + private Double platformProfitSharingMoney = 0.0; + + @Excel(name = "平台服务费金额") + @Alias("平台服务费金额") + private Double platformServerMoney = 0.0; + + @Excel(name = "商家结算金额") + @Alias("商家结算金额") + private Double payAmount = 0.0; @Excel(name = "充电量") @Alias("充电量") private Double chargingDegree = 0.0; - @Excel(name = "订单金额") - @Alias("订单金额") - private Double orderAmount = 0.0; - - @Excel(name = "运营商承担费用") - @Alias("运营商承担费用") - private Double operatorCost = 0.0; - - @Excel(name = "新电途承担费用") - @Alias("新电途承担费用") - private Double xdtCost = 0.0; - - @Excel(name = "本期新电途补贴金额") - @Alias("本期新电途补贴金额") - private Double xdtSubsidyAmount = 0.0; - - @Excel(name = "历史新电途补贴金额") - @Alias("历史新电途补贴金额") - private Double xdtHistorySubsidyAmount = 0.0; - - @Excel(name = "本期用户实付金额") - @Alias("本期用户实付金额") - private Double payAmount = 0.0; - - @Excel(name = "历史用户实付金额") - @Alias("历史用户实付金额") - private Double payHistoryAmount = 0.0; - - @Excel(name = "未结清金额") - @Alias("未结清金额") - private Double outStandingAmount = 0.0; - - @Excel(name = "坏账金额") - @Alias("坏账金额") - private Double badDebtsAmount = 0.0; - - @Excel(name = "新电途线上分润金额") - @Alias("新电途线上分润金额") - private Double xdtOnlineAmount = 0.0; - - @Excel(name = "新电途线下分润金额") - @Alias("新电途线下分润金额") - private Double xdtOfflineAmount = 0.0; - - @Excel(name = "本期支付手续费") - @Alias("本期支付手续费") - private Double handlingFeeAmount = 0.0; - - @Excel(name = "历史支付手续费") - @Alias("历史支付手续费") - private Double handlingFeeHistoryAmount = 0.0; - - @Excel(name = "平台分润方式") - @Alias("平台分润方式") - private String profitSharingMethod = ""; - - @Excel(name = "自动扣除平台活费用") - @Alias("自动扣除平台活费用") - private String autoDiscountAmount = ""; - @Excel(name = "充电费") @Alias("充电费") private Double powerAmount = 0.0; @@ -113,21 +117,30 @@ public class XDTTradebillVo { @Alias("附加费") private Double surchargeAmount = 0.0; - @Excel(name = "结算状态") - @Alias("结算状态") - private String checkedStatus = ""; + @Excel(name = "结算规则") + @Alias("结算规则") + private String settlementRules = ""; - @Excel(name = "订单渠道") - @Alias("订单渠道") - private String orderSource = ""; + @Excel(name = "占位订单号") + @Alias("占位订单号") + private String stationOrder = ""; - @Excel(name = "结算日期") - @Alias("结算日期") - private Date checkoutDate; + @Excel(name = "备注") + @Alias("备注") + private String notes = ""; + + @Excel(name = "订单生成时间") + @Alias("订单生成时间") + private String orderCreateTime = ""; + + @Excel(name = "订单类型") + @Alias("订单类型") + private String orderType = ""; + + @Excel(name = "下单平台") + @Alias("下单平台") + private String orderingPlatform = ""; - @Excel(name = "分润账号") - @Alias("分润账号") - private String profitSharingAccount = ""; } diff --git a/xhpc-modules/xhpc-activity/src/main/resources/bootstrap.yml b/xhpc-modules/xhpc-activity/src/main/resources/bootstrap.yml index 0f17bfa1..4d87bbea 100644 --- a/xhpc-modules/xhpc-activity/src/main/resources/bootstrap.yml +++ b/xhpc-modules/xhpc-activity/src/main/resources/bootstrap.yml @@ -19,10 +19,10 @@ spring: nacos: discovery: # 服务注册地址 - server-addr: 127.0.0.1:8858 + server-addr: mse-e2a05960-nacos-ans.mse.aliyuncs.com:8848 config: # 配置中心地址 - server-addr: 127.0.0.1:8858 + server-addr: mse-e2a05960-nacos-ans.mse.aliyuncs.com:8848 # 配置文件格式 file-extension: yml # 共享配置 diff --git a/xhpc-modules/xhpc-activity/src/main/resources/mapper/XhpcClearingHistoryOrderMapper.xml b/xhpc-modules/xhpc-activity/src/main/resources/mapper/XhpcClearingHistoryOrderMapper.xml index 4ccdb431..c926cc22 100644 --- a/xhpc-modules/xhpc-activity/src/main/resources/mapper/XhpcClearingHistoryOrderMapper.xml +++ b/xhpc-modules/xhpc-activity/src/main/resources/mapper/XhpcClearingHistoryOrderMapper.xml @@ -76,7 +76,7 @@ ifnull(ho.act_price, 0) as 'act_price', ifnull(ho.act_power_price, 0) as 'act_power_price', ifnull(ho.act_service_price, 0) as 'act_service_price', - ifnull(ho.act_service_price+ho.act_power_price, 0) as 'actTotalPrice', + ifnull(ho.act_power_price+ho.act_service_price, 0) as 'act_total_price', ifnull(ho.internet_commission, 0) as 'internet_commission', ifnull( ho.internet_svc_commission, 0) as 'internet_svc_commission', ifnull(ho.platform_commission, 0) as 'platform_commission', @@ -87,7 +87,7 @@ ho.create_time, ho.create_by, ho.update_time, ho.update_by, ho.remark, ho.`state`, ho.vin_normal, ho.search_value, ho.operator_id_evcs, ho.charge_model_evcs, ho.connector_power_evcs, ho.meter_value_end_evcs, ho.meter_value_start_evcs, ho.operator_id3rdpty_evcs, ho.start_time, ho.end_time, ho.stop_reason_evcs, - ho.total_power as totalPower, ho.user_name_evcs, ho.phone, ho.evcs_order_no, ho.confirm_Result, ho.rate_model_id, + ho.total_power, ho.user_name_evcs, ho.phone, ho.evcs_order_no, ho.confirm_Result, ho.rate_model_id, ho.charging_mode, ifnull(ho.internet_degree_commission, 0) as 'internet_degree_commission', ho.`source`, ho.tenant_id, ho.operator_id, ho.operator_name, @@ -162,9 +162,7 @@ when ho.charging_mode="4" then '小桔' when ho.charging_mode="微信" then '微信' when ho.charging_mode="支付宝" then '支付宝' - when ho.charging_mode="App" then 'App' - when ho.charging_mode="刷卡" then '刷卡' - else 'vin码' + else '刷卡' end as 'chargingModeName' from xhpc_clearing_history_order ho left join xhpc_charging_station ct on ct.charging_station_id = ho.charging_station_id @@ -250,8 +248,6 @@ when ho.charging_mode="4" then "小桔" else "--" end as 'charging_mode_name' - - from xhpc_clearing_history_order as ho left join xhpc_charging_station as ct on ct.charging_station_id = ho.charging_station_id left join xhpc_operator as op on op.operator_id = ct.operator_id @@ -590,9 +586,7 @@ when ho.charging_mode="4" then "小桔" when ho.charging_mode="微信" then "微信" when ho.charging_mode="支付宝" then "支付宝" - when ho.charging_mode="App" then "App" - when ho.charging_mode="刷卡" then "刷卡" - else "vin码" + else "刷卡" end chargingModeName from xhpc_clearing_history_order as ho left join xhpc_charging_station as ct on ct.charging_station_id = ho.charging_station_id diff --git a/xhpc-modules/xhpc-activity/src/main/resources/mapper/XhpcDeviceMessageMapper.xml b/xhpc-modules/xhpc-activity/src/main/resources/mapper/XhpcDeviceMessageMapper.xml index 45567b1c..29ac8a9a 100644 --- a/xhpc-modules/xhpc-activity/src/main/resources/mapper/XhpcDeviceMessageMapper.xml +++ b/xhpc-modules/xhpc-activity/src/main/resources/mapper/XhpcDeviceMessageMapper.xml @@ -23,12 +23,12 @@ update_time as 'updateTime', update_by as 'updateBy' from xhpc_device_message - where type=#{type} and serial_number=#{serialNumber} + where serial_number=#{serialNumber} - and create_time = ]]> #{startTime} + and create_time >= #{startTime} - and create_time #{endTime} + and create_time <= #{endTime} order by create_time desc diff --git a/xhpc-modules/xhpc-activity/src/main/resources/mapper/XhpcHistoryOrderMapper.xml b/xhpc-modules/xhpc-activity/src/main/resources/mapper/XhpcHistoryOrderMapper.xml index 6156c0a2..59bd35ea 100644 --- a/xhpc-modules/xhpc-activity/src/main/resources/mapper/XhpcHistoryOrderMapper.xml +++ b/xhpc-modules/xhpc-activity/src/main/resources/mapper/XhpcHistoryOrderMapper.xml @@ -217,4 +217,79 @@ SELECT GROUP_CONCAT( `history_order_id`) FROM `xhpc_history_order` WHERE state ]]> 3 and `del_flag` = 0 and `history_order_id` in ( SELECT clearing_order_id from `xhpc_clearing_history_order` WHERE `check_status` = 2) + + + + diff --git a/xhpc-modules/xhpc-activity/src/main/resources/mapper/XhpcTradebillUploadRecordMapper.xml b/xhpc-modules/xhpc-activity/src/main/resources/mapper/XhpcTradebillUploadRecordMapper.xml index 9405c533..1661e714 100644 --- a/xhpc-modules/xhpc-activity/src/main/resources/mapper/XhpcTradebillUploadRecordMapper.xml +++ b/xhpc-modules/xhpc-activity/src/main/resources/mapper/XhpcTradebillUploadRecordMapper.xml @@ -18,10 +18,31 @@ + + + + + + + + + + + + + + + + + + id, create_time, create_by, update_time, update_by, `source`, file_name, url, `type`, - `status`, del_flag, success_count, fail_count, uncheck_count, checked_count, tenant_id + `status`, del_flag, success_count, fail_count, uncheck_count, checked_count, tenant_id,platform_power,platform_server, + platform_amout,platform_degree,platform_internet_commission,platform_internet_svc_commission,platform_internet_degree_commission, + platform_internet_amout,platform_act_power,platform_act_service_powe,platform_internet_settlement_amout,internet_power, + internet_server,internet_amout,internet_degree,internet_settlement_amout,user_id,reconciliation_time @@ -48,6 +69,19 @@ order by update_time desc + + + + + diff --git a/xhpc-modules/xhpc-order/src/main/resources/mapper/XhpcHistoryOrderMapper.xml b/xhpc-modules/xhpc-order/src/main/resources/mapper/XhpcHistoryOrderMapper.xml index fa7c07a2..b4941f7e 100644 --- a/xhpc-modules/xhpc-order/src/main/resources/mapper/XhpcHistoryOrderMapper.xml +++ b/xhpc-modules/xhpc-order/src/main/resources/mapper/XhpcHistoryOrderMapper.xml @@ -1667,7 +1667,7 @@ select count(history_order_id) number from xhpc_history_order - where history_order_id> (select last_push_order from et_auth_sec_token where id=2) + where history_order_id> (select last_push_order from et_auth_sec_token where id=12)