puzhibing
2024-09-05 2d338a0e7480330ecb78e6d5471c2f47867b0a80
Merge remote-tracking branch 'origin/master'
1 文件已重命名
26个文件已修改
13个文件已添加
1840 ■■■■■ 已修改文件
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderFallbackFactory.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/OrderFallbackFactory.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderClient.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/OrderClient.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/ChargingListQuery.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TChargingBill.java 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TChargingOrder.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TChargingOrderRefund.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingBillListVO.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingBillVO.java 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/SiteController.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyController.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TApplyChargingPileController.java 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TParkingRecordController.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/resources/template/充电算帐单已出账.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/CallBackController.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/ChargingBillController.java 361 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/FinancialSettlementController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TVipOrderController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/export/ChargingBillDetailExport.java 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/export/ChargingBillExport.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/export/ChargingBillPayExport.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/export/ChargingBillRefundExport.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/export/TChargingBillExport.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TChargingBillMapper.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TChargingOrderMapper.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TChargingBillService.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TChargingOrderService.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TVipOrderService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingBillServiceImpl.java 327 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java 184 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TVipOrderServiceImpl.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingBillMapper.xml 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TVipController.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/TVipService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TVipServiceImpl.java 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-payment/src/main/java/com/ruoyi/payment/controller/AliPayController.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-payment/src/main/java/com/ruoyi/payment/controller/WxPayController.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderFallbackFactory.java
@@ -4,9 +4,11 @@
import com.ruoyi.common.core.dto.ChargingOrderGroup;
import com.ruoyi.common.core.dto.ChargingPercentProvinceDto;
import com.ruoyi.order.api.feignClient.ChargingOrderClient;
import com.ruoyi.order.api.model.ChargingListQuery;
import com.ruoyi.order.api.model.TChargingOrder;
import com.ruoyi.order.api.query.TChargingCountQuery;
import com.ruoyi.order.api.query.UploadRealTimeMonitoringDataQuery;
import com.ruoyi.order.api.vo.ChargingBillVO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.openfeign.FallbackFactory;
@@ -36,6 +38,11 @@
            }
            @Override
            public R<ChargingBillVO> chargingBillListR(ChargingListQuery dto) {
                return R.fail("查询充电算帐单失败" + throwable.getMessage());
            }
            @Override
            public R<TChargingOrder> orderDetail(Long orderId) {
                return R.fail("订单详情:" + throwable.getMessage());
            }
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/OrderFallbackFactory.java
@@ -4,6 +4,7 @@
import com.ruoyi.common.core.dto.ExchangeDto;
import com.ruoyi.order.api.feignClient.OrderClient;
import com.ruoyi.order.api.model.TShoppingOrder;
import com.ruoyi.order.api.model.TVipOrder;
import com.ruoyi.order.api.query.TActivityStatisticsQuery;
import com.ruoyi.order.api.vo.TActivityVO;
import org.slf4j.Logger;
@@ -51,6 +52,12 @@
            }
            @Override
            public R<Long> addVipOrder(TVipOrder vipOrder) {
                return null;
            }
            @Override
            public R<TShoppingOrder> shopCreate(ExchangeDto exchangeDto) {
                return R.fail("订单创建" + cause.getMessage());
            }
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderClient.java
@@ -5,9 +5,12 @@
import com.ruoyi.common.core.dto.ChargingOrderGroup;
import com.ruoyi.common.core.dto.ChargingPercentProvinceDto;
import com.ruoyi.order.api.factory.ChargingOrderFallbackFactory;
import com.ruoyi.order.api.model.ChargingListQuery;
import com.ruoyi.order.api.model.TChargingOrder;
import com.ruoyi.order.api.query.TChargingCountQuery;
import com.ruoyi.order.api.query.UploadRealTimeMonitoringDataQuery;
import com.ruoyi.order.api.vo.ChargingBillVO;
import io.swagger.annotations.ApiOperation;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;
@@ -21,7 +24,8 @@
public interface ChargingOrderClient {
    @PostMapping(value = "/t-charging-order/useOrderCount")
    R<Long> useOrderCount(@RequestParam("userId") Long userId);
    @PostMapping(value = "/t-charging-order/chargingBillListR")
    R<ChargingBillVO> chargingBillListR(@RequestBody ChargingListQuery dto);
    @PostMapping(value = "/t-charging-order/detail")
    R<TChargingOrder> orderDetail(@RequestParam("orderId") Long orderId);
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/OrderClient.java
@@ -5,6 +5,7 @@
import com.ruoyi.common.core.dto.ExchangeDto;
import com.ruoyi.order.api.factory.OrderFallbackFactory;
import com.ruoyi.order.api.model.TShoppingOrder;
import com.ruoyi.order.api.model.TVipOrder;
import com.ruoyi.order.api.query.TActivityStatisticsQuery;
import com.ruoyi.order.api.vo.TActivityVO;
import org.springframework.cloud.openfeign.FeignClient;
@@ -35,6 +36,8 @@
    @PostMapping("/t-exchange-order/create")
    public R<Long> exchangeCreate(@RequestBody ExchangeDto exchangeDto);
    @PostMapping("/t-vip-order//addVipOrder")
    public R<Long> addVipOrder(@RequestBody TVipOrder vipOrder);
    @PostMapping("/t-shopping-order/create")
    public R<TShoppingOrder> shopCreate(@RequestBody ExchangeDto exchangeDto);
    @PostMapping("/t-shopping-order/callBack")
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/ChargingListQuery.java
File was renamed from ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/ChargingListQuery.java
@@ -1,4 +1,4 @@
package com.ruoyi.order.dto;
package com.ruoyi.order.api.model;
import com.ruoyi.common.core.web.page.BasePage;
import io.swagger.annotations.ApiModel;
@@ -12,9 +12,11 @@
@ApiModel(value = "充电账单列表查询参数")
public class ChargingListQuery extends BasePage {
    @ApiModelProperty("订单分类 1全站 2各个站点")
    private String category;
    @ApiModelProperty("账单周期2020-01-01 - 2020-01-01")
    private String type;
    @ApiModelProperty("账单周期2020-01-01 00:00:00 - 2020-01-01 23:59:59")
    private String startTime;
    @ApiModelProperty("1已出账 2未出账")
    private Integer state;
    @ApiModelProperty("uid 前端忽略")
    private String uid;
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TChargingBill.java
New file
@@ -0,0 +1,62 @@
package com.ruoyi.order.api.model;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.core.web.domain.BasePojo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.cglib.core.Local;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
 * <p>
 * 充电算帐单
 * </p>
 *
 * @author 无关风月
 * @since 2024-09-04
 */
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("t_charging_bill")
@ApiModel(value="TChargingBill对象", description="")
public class TChargingBill extends BasePojo {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value = "主键")
    @TableId(value = "id", type = IdType.NONE)
    private Long id;
    @ApiModelProperty(value = "账单编号")
    @TableField("code")
    private String code;
    @ApiModelProperty(value = "账单类型 1全站账单 2站点账单")
    @TableField("type")
    private Integer type;
    @ApiModelProperty(value = "站点id")
    @TableField("site_id")
    private Integer siteId;
    @ApiModelProperty(value = "账单生成时间 每月二号")
    @TableField("bill_time")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    private LocalDateTime billTime;
    @ApiModelProperty(value = "1未出账2已出账")
    @TableField("status")
    private Integer status;
    @ApiModelProperty(value = "uid")
    @TableField(exist = false)
    private String uid;
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TChargingOrder.java
@@ -158,6 +158,9 @@
    @ApiModelProperty(value = "退款流水号")
    @TableField("refund_code")
    private String refundCode;
    @ApiModelProperty(value = "退款原因")
    @TableField("refund_reason")
    private String refundReason;
    @ApiModelProperty(value = "退款金额")
    @TableField("refund_amount")
@@ -190,4 +193,53 @@
    @TableField("pay_time")
    private LocalDateTime payTime;
    @ApiModelProperty(value = "站点名称")
    @TableField(exist = false)
    private String siteName;
    @ApiModelProperty(value = "终端名称")
    @TableField(exist = false)
    private String terminalName;
    @ApiModelProperty(value = "终端编号")
    @TableField(exist = false)
    private String terminalCode;
    @ApiModelProperty(value = "订单分类")
    @TableField(exist = false)
    private String orderClassification1;
    @ApiModelProperty(value = "支付方式")
    @TableField(exist = false)
    private String rechargePaymentType1;
    @ApiModelProperty(value = "充电启动方式")
    @TableField(exist = false)
    private String chargingType;
    @ApiModelProperty(value = "订单状态")
    @TableField(exist = false)
    private String status1;
    @ApiModelProperty(value = "终端名称")
    @TableField(exist = false)
    private String endMode1;
    @ApiModelProperty(value = "充电费用")
    @TableField(exist = false)
    private String totalAmount;
    @ApiModelProperty(value = "优惠抵扣")
    @TableField(exist = false)
    private String discount;
    @ApiModelProperty(value = "充电时长")
    @TableField(exist = false)
    private String chargingTime;
    @ApiModelProperty(value = "充电后soc")
    @TableField(exist = false)
    private String endSoc;
    @ApiModelProperty(value = "客户昵称")
    @TableField(exist = false)
    private String userName;
    @ApiModelProperty(value = "手机号")
    @TableField(exist = false)
    private String phone;
    @ApiModelProperty(value = "车牌号")
    @TableField(exist = false)
    private String licensePlate;
    @ApiModelProperty(value = "车辆品牌")
    @TableField(exist = false)
    private String vehicleModel;
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TChargingOrderRefund.java
@@ -21,7 +21,7 @@
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("t_charging_order_refund")
@ApiModel(value="TChargingOrderRefund对象", description="")
@ApiModel(value="TChargingOrderRefund对象1", description="")
public class TChargingOrderRefund implements Serializable {
    private static final long serialVersionUID = 1L;
@@ -86,5 +86,17 @@
    @TableField("pay_amount")
    private BigDecimal payAmount;
    @TableField(exist = false)
    private Integer type;
    @ApiModelProperty(value = "第三方支付流水号")
    @TableField(exist = false)
    private String serailNumber;
    @ApiModelProperty(value = "支付金额")
    @TableField(exist = false)
    private BigDecimal paymentAmount;
    @ApiModelProperty(value = "支付时间")
    @TableField(exist = false)
    private LocalDateTime payTime;
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingBillListVO.java
New file
@@ -0,0 +1,37 @@
package com.ruoyi.order.api.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.order.api.model.TChargingBill;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Data
@ApiModel(value = "ChargingBillListVO对象",description = "充电算帐单列表VO")
public class ChargingBillListVO extends TChargingBill {
    @ApiModelProperty(value = "账单周期")
    private String billWeek;
    @ApiModelProperty(value = "充电时间 秒")
    private Integer chargingSecond;
    @ApiModelProperty(value = "订单数量")
    private Integer orderCount;
    @ApiModelProperty(value = "站点名称")
    private String siteName;
    @ApiModelProperty(value = "实收金额")
    private BigDecimal paymentAmount;
    @ApiModelProperty(value = "总金额")
    private BigDecimal orderAmount;
    @ApiModelProperty(value = "累计电费")
    private BigDecimal electrovalence;
    @ApiModelProperty(value = "累计服务费")
    private BigDecimal serviceCharge;
    @ApiModelProperty(value = "平台手续费")
    private BigDecimal commissionAmount;
    @ApiModelProperty(value = "平台分佣")
    private BigDecimal sharingAmount;
    @ApiModelProperty(value = "充电电流 度")
    private BigDecimal chargingCapacity;
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingBillVO.java
@@ -1,11 +1,13 @@
package com.ruoyi.order.api.vo;
import com.ruoyi.common.core.web.page.PageInfo;
import com.ruoyi.order.api.model.TChargingOrder;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
@Data
@ApiModel(value = "ChargingBillVO对象",description = "充电算帐单")
@@ -23,11 +25,27 @@
    @ApiModelProperty(value = "订单数量")
    private Integer orderCount;
    @ApiModelProperty(value = "平台手续费")
    private String commissionAmount;
    private BigDecimal commissionAmount;
    @ApiModelProperty(value = "三方平台分佣")
    private String sharingAmount;
    private BigDecimal sharingAmount;
    @ApiModelProperty(value = "优惠抵扣")
    private String discount;
    private BigDecimal discount;
    @ApiModelProperty(value = "账单分类 1全站 2各个站点 前端忽略")
    private String category;
    @ApiModelProperty(value = "账单类型 月结 前端忽略")
    private String type;
    @ApiModelProperty(value = "站点名称 前端忽略")
    private String siteName;
    @ApiModelProperty(value = "账单周期 前端忽略")
    private String billWeek;
    @ApiModelProperty(value = "账单生成日期 前端忽略")
    private String createTime;
    @ApiModelProperty(value = "账单编号 前端忽略")
    private String code;
    @ApiModelProperty(value = "充电时长 前端忽略")
    private String chargingTime;
    @ApiModelProperty(value = "列表数据")
    private PageInfo<ChargingOrderListVO> list;
    private PageInfo<ChargingBillListVO> list;
    @ApiModelProperty(value = "导出Excel数据 前端忽略")
    private List<TChargingOrder> exportList;
}
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/SiteController.java
@@ -82,8 +82,6 @@
    @Resource
    private ChargingOrderClient chargingOrderClient;
    /**
     * 小程序扫一扫
     * @param number
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyController.java
@@ -326,6 +326,12 @@
                byId.setAuditStatus(3);
                byId.setTwoRemark(steategyPassDto.getRemark());
                byId.setTwoAuditTime(LocalDateTime.now());
                //如果parentId不为空,则将parentId对应的siteId改为现在的,并且将parenId对应的数据删除
                //将site表对应的模板id修改为新的这个
            }
        }else {
            byId.setAuditStatus(4);
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TApplyChargingPileController.java
@@ -1,10 +1,18 @@
package com.ruoyi.chargingPile.controller;
import java.math.BigDecimal;
import com.ruoyi.common.core.web.page.PageInfo;
import com.ruoyi.order.api.model.TChargingOrder;
import com.ruoyi.order.api.vo.ChargingBillListVO;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.EasyExcelFactory;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.enums.WriteDirectionEnum;
import com.alibaba.excel.write.builder.ExcelWriterBuilder;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.metadata.fill.FillConfig;
import com.alibaba.excel.write.metadata.fill.FillWrapper;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
@@ -24,18 +32,23 @@
import com.ruoyi.common.log.enums.OperatorType;
import com.ruoyi.common.redis.service.RedisService;
import com.ruoyi.common.security.service.TokenService;
import com.ruoyi.order.api.feignClient.ChargingOrderClient;
import com.ruoyi.order.api.model.ChargingListQuery;
import com.ruoyi.order.api.vo.ChargingBillVO;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.codec.CharEncoding;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
@@ -55,6 +68,8 @@
    private final TApplyChargingPileService applyChargingPileService;
    private final TokenService tokenService;
    private final RedisService redisService;
    @Resource
    private ChargingOrderClient chargingOrderClient;
    @Autowired
    public TApplyChargingPileController(TApplyChargingPileService applyChargingPileService, TokenService tokenService, RedisService redisService) {
@@ -217,6 +232,87 @@
        return R.ok();
    }
    @ApiOperation(value = "下载-已出账", tags = {"管理后台-充电算账单"})
    @GetMapping("/downloadBill")
    public R downloadBill(String uid,HttpServletResponse response)
    {
        ChargingListQuery chargingListQuery = new ChargingListQuery();
        chargingListQuery.setUid(uid);
        chargingListQuery.setPageCurr(1);
        chargingListQuery.setPageSize(99999);
        ChargingBillVO data = chargingOrderClient.chargingBillListR(chargingListQuery).getData();
        List<ChargingBillVO> chargingBillVOS = new ArrayList<>();
        chargingBillVOS.add(data);
        try {
            response.setCharacterEncoding(Constants.UTF8);
            response.setContentType("application/vnd.ms-excel");
            response.setHeader("Access-Control-Expose-Headers", "Content-disposition");
            response.setHeader("Content-Disposition", "attachment;filename=" +
                    URLEncoder.encode("月账单-"+data.getCategory()+"-"+data.getBillWeek()+"-"+data.getSiteName(), CharEncoding.UTF_8) + ".xlsx");
        } catch (UnsupportedEncodingException e) {
            return R.fail("excel导出失败!");
        }
        try {
            // excel模板封装
            ExcelWriterBuilder excelWriterBuilder = EasyExcelFactory.write(response.getOutputStream());
            InputStream stream = Thread.currentThread().getContextClassLoader().getResourceAsStream("template/" +"充电算帐单已出账" + ".xlsx");
            // 自动释放资源
            try (ExcelWriter excelWriter = excelWriterBuilder.withTemplate(stream).build()) {
                WriteSheet writeSheet = EasyExcel.writerSheet().build();
                FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.HORIZONTAL).build();
                excelWriter.fill(new FillWrapper("data1", chargingBillVOS), fillConfig, writeSheet);
                excelWriter.fill(new FillWrapper("data2", data.getExportList()), fillConfig, writeSheet);
                excelWriter.finish();
            } catch (Exception e) {
                return R.fail("excel导出失败!");
            }
        } catch (IOException e) {
            return R.fail("excel导出失败!");
        }
        return R.ok();
    }
    @ApiOperation(value = "下载-未出账", tags = {"管理后台-充电算账单"})
    @GetMapping("/download")
    public R download(String uid,HttpServletResponse response)
    {
        ChargingListQuery chargingListQuery = new ChargingListQuery();
        chargingListQuery.setUid(uid);
        chargingListQuery.setPageCurr(1);
        chargingListQuery.setPageSize(99999);
        ChargingBillVO data = chargingOrderClient.chargingBillListR(chargingListQuery).getData();
        List<ChargingBillVO> chargingBillVOS = new ArrayList<>();
        chargingBillVOS.add(data);
        try {
            response.setCharacterEncoding(Constants.UTF8);
            response.setContentType("application/vnd.ms-excel");
            response.setHeader("Access-Control-Expose-Headers", "Content-disposition");
            response.setHeader("Content-Disposition", "attachment;filename=" +
                    URLEncoder.encode("月账单-"+data.getCategory()+data.getBillWeek()+data.getSiteName(), CharEncoding.UTF_8) + ".xlsx");
        } catch (UnsupportedEncodingException e) {
            return R.fail("excel导出失败!");
        }
        try {
            // excel模板封装
            ExcelWriterBuilder excelWriterBuilder = EasyExcelFactory.write(response.getOutputStream());
            InputStream stream = Thread.currentThread().getContextClassLoader().getResourceAsStream("template/" +"充电算帐单已出账" + ".xlsx");
            // 自动释放资源
            try (ExcelWriter excelWriter = excelWriterBuilder.withTemplate(stream).build()) {
                WriteSheet writeSheet = EasyExcel.writerSheet().build();
                FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.HORIZONTAL).build();
                excelWriter.fill(new FillWrapper("data1", chargingBillVOS), fillConfig, writeSheet);
                excelWriter.fill(new FillWrapper("data2", data.getExportList()), fillConfig, writeSheet);
                excelWriter.finish();
            } catch (Exception e) {
                return R.fail("excel导出失败!");
            }
        } catch (IOException e) {
            return R.fail("excel导出失败!");
        }
        return R.ok();
    }
    public static boolean isImageUrl(JSONObject jsonObject) {
        String url = jsonObject.getString("url");
        Pattern pattern = Pattern.compile(
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TParkingRecordController.java
@@ -47,6 +47,14 @@
        return R.ok(page);
    }
    @ApiOperation(tags = {"后台-订单管理-停车记录"},value = "详情")
    @GetMapping(value = "/detail")
    public R<TParkingRecord> detail(Long id) {
      return R.ok(parkingRecordService.getById(id));
    }
    @ApiOperation(tags = {"后台-订单管理-停车记录"},value = "出场")
    @GetMapping(value = "/out")
    public R out(Long id) {
ruoyi-service/ruoyi-chargingPile/src/main/resources/template/充电算帐单已出账.xlsx
Binary files differ
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/CallBackController.java
New file
@@ -0,0 +1,50 @@
package com.ruoyi.order.controller;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.order.service.TVipOrderService;
import com.ruoyi.payment.api.vo.AliQueryOrder;
import io.swagger.annotations.Api;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
@RestController
@RequestMapping("/callBack")
public class CallBackController {
    @Resource
    private TVipOrderService tVipOrderService;
    @ResponseBody
    @PostMapping(value = "/ali/all")
    public void chargingOrderALICallback(@RequestBody AliQueryOrder aliQueryOrder, HttpServletResponse response) {
        try {
            String out_trade_no = aliQueryOrder.getOutTradeNo();
            String transaction_id = aliQueryOrder.getTradeNo();
            String attach = aliQueryOrder.getPassbackParams();
            String substring = out_trade_no.substring(0, 2);
            switch (substring){
                //购物订单
                case "GW":
                    break;
                case "HY":
                    tVipOrderService.payBack(out_trade_no);
                    break;
            }
//            AjaxResult ajaxResult = chargingOrderService.chargingOrderCallback(2, out_trade_no, transaction_id, attach);
//            if (ajaxResult.isSuccess()) {
//                PrintWriter writer = response.getWriter();
//                writer.println("success");
//                writer.flush();
//                writer.close();
//            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/ChargingBillController.java
@@ -1,29 +1,50 @@
package com.ruoyi.order.controller;
import com.ruoyi.account.api.feignClient.AppUserCarClient;
import com.ruoyi.account.api.feignClient.AppUserClient;
import com.ruoyi.chargingPile.api.feignClient.ChargingGunClient;
import com.ruoyi.chargingPile.api.feignClient.ChargingPileClient;
import com.ruoyi.chargingPile.api.feignClient.ParkingLotClient;
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
import com.alibaba.nacos.shaded.com.google.common.collect.Maps;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.ruoyi.chargingPile.api.feignClient.SiteClient;
import com.ruoyi.chargingPile.api.model.Site;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.utils.DateUtils;
import com.ruoyi.common.core.utils.WebUtils;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.redis.service.RedisService;
import com.ruoyi.common.security.service.TokenService;
import com.ruoyi.common.core.web.page.PageInfo;
import com.ruoyi.common.log.annotation.Log;
import com.ruoyi.common.log.enums.BusinessType;
import com.ruoyi.order.api.model.TChargingBill;
import com.ruoyi.order.api.model.TChargingOrder;
import com.ruoyi.order.api.query.TOrderInvoiceQuery;
import com.ruoyi.order.api.vo.ChargingBillListVO;
import com.ruoyi.order.api.vo.ChargingBillVO;
import com.ruoyi.order.api.vo.ChargingOrderTimeVO;
import com.ruoyi.order.dto.ChargingBillQuery;
import com.ruoyi.order.dto.ChargingListQuery;
import com.ruoyi.order.api.model.ChargingListQuery;
import com.ruoyi.order.api.vo.TOrderInvoiceVO;
import com.ruoyi.order.export.*;
import com.ruoyi.order.service.*;
import com.ruoyi.order.vo.ChargingOrderListInfoVO;
import com.ruoyi.payment.api.feignClient.AliPaymentClient;
import com.ruoyi.payment.api.feignClient.WxPaymentClient;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.beans.BeanUtils;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.math.BigDecimal;
import java.net.URLEncoder;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjusters;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
/**
 * <p>
@@ -39,53 +60,279 @@
public class ChargingBillController {
    @Resource
    private TChargingOrderService chargingOrderService;
    @Autowired
    private TokenService tokenService;
    @Autowired
    private TOrderEvaluateService orderEvaluateService;
    @Resource
    private WxPaymentClient wxPaymentClient;
    @Resource
    private RedisService redisService;
    @Resource
    private AliPaymentClient aliPaymentClient;
    @Resource
    private TShoppingOrderService shoppingOrderService;
    @Resource
    private AppUserClient appUserClient;
    @Resource
    private TVipOrderService vipOrderService;
    @Resource
    private ParkingLotClient parkingLotClient;
    @Resource
    private TChargingOrderRefundService chargingOrderRefundService;
    @Resource
    private TShoppingOrderRefundService shoppingOrderRefundService;
    @Resource
    private TVipOrderRefundService vipOrderRefundService;
    private TChargingBillService chargingBillService;
    @Resource
    private SiteClient siteClient;
    @Resource
    private ChargingPileClient chargingPileClient;
    @Resource
    private ChargingGunClient chargingGunClient;
    @Resource
    private AppUserCarClient appUserCarClient;
    @Resource
    private TChargingOrderAccountingStrategyService chargingOrderAccountingStrategyService;
    @ResponseBody
    @PostMapping(value = "/chargingList")
    @ApiOperation(value = "充电算帐单列表查询", tags = {"管理后台-充电算账单"})
    public AjaxResult<ChargingBillVO> chargingList(@RequestBody ChargingListQuery dto) {
    private TChargingOrderService chargingOrderService;
        return AjaxResult.success(null);
    @PostMapping(value = "/chargingBillList")
    @ApiOperation(value = "充电算帐单列表查询", tags = {"管理后台-充电算账单"})
    public AjaxResult<ChargingBillVO> chargingBillList(@RequestBody ChargingListQuery dto) {
        ChargingBillVO res = chargingBillService.chargingBillList(dto);
        return AjaxResult.success(res);
    }
    @PostMapping(value = "/chargingBillListR")
    public R<ChargingBillVO> chargingBillListR(@RequestBody ChargingListQuery dto) {
        ChargingBillVO res = chargingBillService.chargingBillList(dto);
        return R.ok(res);
    }
    @GetMapping(value = "/chargingBillListExport")
    public R<ChargingBillVO> chargingBillListExport(String uid) {
        return R.ok(null);
    }
    @ApiOperation(value = "导出", tags = {"管理后台-充电算账单"})
    @PostMapping("/export")
    public void export(@RequestBody ChargingListQuery dto)
    {
        ChargingBillVO res = chargingBillService.chargingBillList(dto);
        List<ChargingBillListVO> list = res.getList().getRecords();
        List<TChargingBillExport> tChargingBillExports = new ArrayList<>();
        for (ChargingBillListVO orderInvoiceVO : list) {
            TChargingBillExport tChargingBillExport = new TChargingBillExport();
            tChargingBillExport.setCode(orderInvoiceVO.getCode());
            tChargingBillExport.setBillType("月账单");
            tChargingBillExport.setType(orderInvoiceVO.getType().toString());
            tChargingBillExport.setBillWeek(orderInvoiceVO.getBillWeek());
            tChargingBillExport.setSiteName(orderInvoiceVO.getSiteName());
            tChargingBillExport.setPaymentAmount(orderInvoiceVO.getPaymentAmount());
            tChargingBillExport.setElectrovalence(orderInvoiceVO.getElectrovalence());
            tChargingBillExport.setServiceCharge(orderInvoiceVO.getServiceCharge());
            tChargingBillExport.setChargingCapacity(orderInvoiceVO.getChargingCapacity());
            Integer chargingSecond = orderInvoiceVO.getChargingSecond();
            // 根据秒数 转换为xx小时xx分钟xx秒 如果小时为0不展示 如果分钟为0则不展示
            // 计算小时、分钟和秒
            int hours = chargingSecond / 60 / 60;
            int minutes = chargingSecond /60 % 60;
            int seconds = 0; // 如果没有秒数,则默认是0
            // 构造结果字符串
            StringBuilder result = new StringBuilder();
            if (hours > 0) {
                result.append(hours).append("小时");
            }
            if (minutes > 0) {
                result.append(minutes).append("分钟");
            }
            if (seconds > 0 || result.length() == 0) { // 如果秒数大于0,或者小时和分钟都为0,则显示秒数
                result.append(seconds).append("秒");
            }
            tChargingBillExport.setChargingTime(result.toString());
            tChargingBillExport.setOrderCount(orderInvoiceVO.getOrderCount());
            tChargingBillExport.setBillTime(orderInvoiceVO.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
            tChargingBillExports.add(tChargingBillExport);
        }
        Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), TChargingBillExport.class, tChargingBillExports);
        HttpServletResponse response = WebUtils.response();
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        ServletOutputStream outputStream = null;
        try {
            String fileName = URLEncoder.encode("月账单-"+res.getCategory()+"-"+res.getBillWeek()+"-"+res.getSiteName()+".xls", "utf-8");
            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
            response.setContentType("application/vnd.ms-excel;charset=UTF-8");
            response.setHeader("Pragma", "no-cache");
            response.setHeader("Cache-Control", "no-cache");
            outputStream = response.getOutputStream();
            workbook.write(outputStream);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                outputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    @ApiOperation(value = "下载-未出账", tags = {"管理后台-充电算账单"})
    @GetMapping("/download")
    public void download(String uid)
    {
        List<ChargingBillExport> chargingBillExports = new ArrayList<>();
        List<ChargingBillRefundExport> chargingBillRefundExports = new ArrayList<>();
        List<ChargingBillPayExport> chargingBillPayExports = new ArrayList<>();
        TChargingBill byId = chargingBillService.getById(uid);
        ChargingBillExport chargingBillExport = new ChargingBillExport();
        chargingBillExport.setCode(byId.getCode());
        // todo 确认商户类型
        chargingBillExport.setAccountType("商户类型");
        chargingBillExport.setType(byId.getType().toString());
        chargingBillExport.setBillType("月结");
        LocalDateTime billTime = byId.getBillTime();
        // 将billTime 减去一个月 转化为yyyy-MM格式字符串
        billTime = billTime.minusMonths(1);
        chargingBillExport.setBillWeek(DateUtils.parseDateToStr("yyyy-MM",DateUtils.toDate(billTime)));
        chargingBillExport.setBillTime(DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss",DateUtils.toDate(billTime)));
        chargingBillExport.setState("未出账");
        List<Site> data = siteClient.getSiteByIds(Arrays.asList(byId.getSiteId())).getData();
        if (!data.isEmpty()){
            chargingBillExport.setSiteName(data.get(0).getName());
        }
        // 根据账单的出账时间 查询上个月的充电订单
        LocalDateTime localDate = byId.getBillTime().minusMonths(1);
        // 账单周期
        // 获取 LocalDate 对象
        LocalDate date = localDate.toLocalDate();
        // 获取该月份的第一天
        LocalDate firstDayOfMonth = date.withDayOfMonth(1);
        // 获取该月份的最后一天
        LocalDate lastDayOfMonth = date.with(TemporalAdjusters.lastDayOfMonth());
        QueryWrapper<TChargingOrder> eq = new QueryWrapper<TChargingOrder>()
                .between("create_time", firstDayOfMonth, lastDayOfMonth)
                .eq("status", 5)
                .eq("recharge_payment_status", 2);
        if (byId.getType() == 2) {
            eq.eq("site_id", byId.getSiteId());
        }
        BigDecimal paymentAmount = new BigDecimal("0");
        BigDecimal refundAmount = new BigDecimal("0");
        BigDecimal income = new BigDecimal("0");
        List<TChargingOrder> tChargingOrders = chargingOrderService.list(eq);
        // 累加支付金额
        int i =1;
        for (TChargingOrder tChargingOrder : tChargingOrders) {
            // 账单信息
            paymentAmount = paymentAmount.add(tChargingOrder.getPaymentAmount());
            if (tChargingOrder.getRefundStatus()!=null && tChargingOrder.getRefundStatus()==2){
                refundAmount = refundAmount.add(tChargingOrder.getRefundAmount());
            }
            // 退款信息
            ChargingBillRefundExport chargingBillRefundExport = new ChargingBillRefundExport();
            ChargingBillPayExport chargingBillPayExport = new ChargingBillPayExport();
            chargingBillRefundExport.setId(i+"");
            switch (tChargingOrder.getRechargePaymentType()){
                case 1:
                    chargingBillRefundExport.setPlatform("微信");
                    chargingBillRefundExport.setPlatformPay("微信小程序支付");
                    chargingBillPayExport.setPlatform("微信");
                    chargingBillPayExport.setPlatformPay("微信小程序支付");
                    break;
                case 2:
                    chargingBillRefundExport.setPlatform("支付宝");
                    chargingBillRefundExport.setPlatformPay("支付宝小程序支付");
                    chargingBillPayExport.setPlatform("支付宝");
                    chargingBillPayExport.setPlatformPay("支付宝小程序支付");
            }
            chargingBillRefundExport.setRechargeSerialNumber(tChargingOrder.getRechargeSerialNumber());
            chargingBillRefundExport.setCode(tChargingOrder.getCode());
            chargingBillRefundExport.setPayTime(DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss",DateUtils.toDate(tChargingOrder.getPayTime())));
            if (tChargingOrder.getRefundTime()!=null){
                chargingBillRefundExport.setRefundTime(DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss",DateUtils.toDate(tChargingOrder.getRefundTime())));
            }
            chargingBillRefundExport.setRefundMoney(tChargingOrder.getRefundAmount().toString());
            chargingBillRefundExport.setRefundRemark(tChargingOrder.getRefundReason());
            chargingBillRefundExport.setRefundCode(tChargingOrder.getRefundCode());
            chargingBillRefundExport.setRefundSerialNumber(tChargingOrder.getRefundSerialNumber());
            chargingBillRefundExports.add(chargingBillRefundExport);
            // 支付信息
            chargingBillPayExport.setId(i+"");
            chargingBillPayExport.setRechargeSerialNumber(tChargingOrder.getRechargeSerialNumber());
            chargingBillPayExport.setCode(tChargingOrder.getCode());
            chargingBillPayExport.setPayTime(DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss",DateUtils.toDate(tChargingOrder.getPayTime())));
            chargingBillPayExport.setPaymentAmount(tChargingOrder.getPaymentAmount().toString());
            chargingBillPayExport.setTotal("");
            chargingBillPayExports.add(chargingBillPayExport);
            i++;
        }
        chargingBillExport.setPaymentAmount(paymentAmount);
        chargingBillExport.setRefundAmount(refundAmount);
        chargingBillExport.setIncome(paymentAmount.subtract(refundAmount));
        chargingBillExports.add(chargingBillExport);
        // 导出
        List<Map<String, Object>> sheetsList = new ArrayList<>();
        AtomicInteger atomicInteger = new AtomicInteger();
        for (int i1 = 0; i1 < 3; i1++) {
            String sheetName="";
            switch (i1){
                case 1:
                    sheetName= "账单信息";
                    Map<String, Object> exportMap = Maps.newHashMap();
                    ExportParams exportParams = new ExportParams(null, sheetName, ExcelType.HSSF);
                    // 以下3个参数为API中写死的参数名 分别是sheet配置/导出类(注解定义)/数据集
                    exportMap.put("title", exportParams);
                    exportMap.put("entity", ChargingBillExport.class);
                    exportMap.put("data", chargingBillExports);
                    // 加入多sheet配置列表
                    sheetsList.add(exportMap);
                    break;
                case 2:
                    sheetName= "退款订单";
                    Map<String, Object> exportMap1 = Maps.newHashMap();
                    ExportParams exportParams1 = new ExportParams(null, sheetName, ExcelType.HSSF);
                    // 以下3个参数为API中写死的参数名 分别是sheet配置/导出类(注解定义)/数据集
                    exportMap1.put("title", exportParams1);
                    exportMap1.put("entity", ChargingBillRefundExport.class);
                    exportMap1.put("data", chargingBillRefundExports);
                    // 加入多sheet配置列表
                    sheetsList.add(exportMap1);
                    break;
                case 3:
                    sheetName= "支付记录";
                    Map<String, Object> exportMap2 = Maps.newHashMap();
                    ExportParams exportParams2 = new ExportParams(null, sheetName, ExcelType.HSSF);
                    // 以下3个参数为API中写死的参数名 分别是sheet配置/导出类(注解定义)/数据集
                    exportMap2.put("title", exportParams2);
                    exportMap2.put("entity", ChargingBillPayExport.class);
                    exportMap2.put("data", chargingBillPayExports);
                    // 加入多sheet配置列表
                    sheetsList.add(exportMap2);
                    break;
            }
        }
        if (!chargingBillRefundExports.isEmpty()){
            ChargingBillRefundExport chargingBillRefundExport = chargingBillRefundExports.get(0);
            chargingBillRefundExport.setTotal(refundAmount.toString());
        }
        if (!chargingBillPayExports.isEmpty()){
            ChargingBillPayExport chargingBillPayExport = chargingBillPayExports.get(0);
            chargingBillPayExport.setTotal(refundAmount.toString());
        }
        String type="";
        String type1="";
        switch (byId.getType()){
            case 1:
                type = "全站账单";
                type1 = "全站";
                break;
            case 2:
                type = "各个站点账单";
                List<Site> data1 = siteClient.getSiteByIds(Arrays.asList(byId.getSiteId())).getData();
                if (!data1.isEmpty()){
                    type1 = data.get(0).getName();
                }
                break;
        }
        String s = DateUtils.parseDateToStr("yyyy-MM", DateUtils.toDate(billTime));
        Workbook workbook = ExcelExportUtil.exportExcel(sheetsList, ExcelType.HSSF);
        HttpServletResponse response = WebUtils.response();
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        ServletOutputStream outputStream = null;
        try {
            String fileName = URLEncoder.encode("账户结算账单-月账单-"+type+"-"+s+"-"+type1+".xls", "utf-8");
            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
            response.setContentType("application/vnd.ms-excel;charset=UTF-8");
            response.setHeader("Pragma", "no-cache");
            response.setHeader("Cache-Control", "no-cache");
            outputStream = response.getOutputStream();
            workbook.write(outputStream);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                outputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/FinancialSettlementController.java
@@ -12,7 +12,7 @@
import com.ruoyi.common.security.service.TokenService;
import com.ruoyi.order.vo.ChargingOrderListInfoVO;
import com.ruoyi.order.api.vo.ChargingOrderTimeVO;
import com.ruoyi.order.dto.ChargingListQuery;
import com.ruoyi.order.api.model.ChargingListQuery;
import com.ruoyi.order.service.*;
import com.ruoyi.payment.api.feignClient.AliPaymentClient;
import com.ruoyi.payment.api.feignClient.WxPaymentClient;
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java
@@ -144,7 +144,7 @@
    }
    @ResponseBody
    @PostMapping(value = "/pay/order/refund")
    @ApiOperation(value = "列表", tags = {"管理后台-支付订单-订单信息"})
    @ApiOperation(value = "退款", tags = {"管理后台-支付订单-订单信息"})
    public R refund(@RequestBody PayOrderRefundDto payOrderQueryDto) {
        return chargingOrderService.payRefund(payOrderQueryDto);
    }
@@ -257,8 +257,15 @@
    @ResponseBody
    @PostMapping(value = "/pay/order/refund/list")
    @ApiOperation(value = "充电信息", tags = {"管理后台-支付订单-退款订单"})
    @ApiOperation(value = "列表", tags = {"管理后台-支付订单-退款订单"})
    public R<PageInfo<TChargingOrderRefund>> refundList(@RequestBody ChargingRefundDto chargingRefundDto) {
        return chargingOrderService.getRefundList(chargingRefundDto);
    }
    @ResponseBody
    @PostMapping(value = "/pay/order/refund/list1")
    @ApiOperation(value = "列表1", tags = {"管理后台-支付订单-退款订单"})
    public R<PageInfo<TChargingOrderRefund>> refundList1(@RequestBody ChargingRefundDto chargingRefundDto) {
        return chargingOrderService.getRefundList(chargingRefundDto);
    }
@@ -375,7 +382,10 @@
                .eq(TChargingOrder::getDelFlag, 0).eq(TChargingOrder::getStatus, 3));
        return R.ok(one);
    }
    @ResponseBody
    @GetMapping(value = "/getMyChargingOrderList")
    @ApiOperation(value = "获取充电记录列表", tags = {"小程序-充电记录"})
@@ -784,8 +794,8 @@
        return resultList;
    }
    /**
     * 硬件充电结束后的处理逻辑
     * @param code
@@ -794,7 +804,7 @@
    public void endCharge(@RequestParam("code") String code){
        chargingOrderService.endCharge(code, 2);
    }
    /**
     * 硬件异常结束充电后的处理逻辑
     * @param code
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TVipOrderController.java
@@ -2,6 +2,7 @@
import com.ruoyi.account.api.feignClient.AppUserClient;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.core.web.page.PageInfo;
import com.ruoyi.order.api.model.TExchangeOrder;
@@ -51,9 +52,9 @@
    }
    @PostMapping("/addVipOrder")
    @ApiOperation(value = "添加会员订单", tags = {"管理后台-会员订单"})
    public AjaxResult addVipOrder(@RequestBody TVipOrder dto) {
    public R<Long> addVipOrder(@RequestBody TVipOrder dto) {
        vipOrderService.saveOrUpdate(dto);
        return AjaxResult.success();
        return R.ok(dto.getId());
    }
    @GetMapping("/deleteVipOrder")
    @ApiOperation(value = "批量删除会员订单", tags = {"管理后台-会员订单"})
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/export/ChargingBillDetailExport.java
New file
@@ -0,0 +1,62 @@
package com.ruoyi.order.export;
import cn.afterturn.easypoi.excel.annotation.Excel;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
@Data
@ApiModel(value = "导出充电算帐单明细")
public class ChargingBillDetailExport implements Serializable {
    @Excel(name = "序号",width = 30)
    private String id;
    @Excel(name = "订单编号",width = 30)
    private String code;
    @Excel(name  = "电站名称",width = 30)
    private String siteName;
    @Excel(name  = "终端名称",width = 30)
    private String terminalName;
    @Excel(name  = "终端编号",width = 30)
    private String terminalCode;
    @Excel(name = "收款方式(直接修改成订单分类)",width = 30,replace = {"线上订单_1","线下订单_2"})
    private String type;
    @Excel(name = "支付方式(预付/先充后付)",width = 30)
    private String billType;
    @Excel(name  = "充电启动方式(对应订单类型)",width = 30)
    private String billWeek;
    @Excel(name  = "订单创建时间(支付订单)",width = 30)
    private String orderAmount;
    @Excel(name  = "充电开始时间(充电桩订单)",width = 30)
    private BigDecimal discount;
    @Excel(name  = "充电结束时间(充电桩订单)",width = 30)
    private BigDecimal discount1;
    @Excel(name  = "订单状态",width = 30,replace = {"未知_0","等待中_1","启动中_2","充电中_3","停止_4","已结束_5"})
    private BigDecimal d;
    @Excel(name  = "判定结束原因",width = 30)
    private BigDecimal electrovalence1;
    @Excel(name  = "充电电费(元)",width = 30)
    private BigDecimal electrovalence;
    @Excel(name  = "充电服务费(元)",width = 30)
    private BigDecimal serviceCharge;
    @Excel(name  = "充电费用(元)",width = 30)
    private BigDecimal serviceCharge1;
    @Excel(name  = "优惠券抵扣",width = 30)
    private BigDecimal chargingCapacity;
    @Excel(name  = "充电电量(度)",width = 30)
    private BigDecimal chargingCapacity1;
    @Excel(name  = "充电时长(从充电桩订单中获取)",width = 30)
    private String chargingTime;
    @Excel(name  = "充电后soc",width = 30)
    private Integer orderCount;
    @Excel(name  = "客户昵称",width = 30)
    private Integer orderCount1;
    @Excel(name  = "手机号",width = 30)
    private Integer orderCount2;
    @Excel(name  = "车牌号",width = 30)
    private Integer orderCount3;
    @Excel(name  = "汽车类型",width = 30)
    private Integer orderCount4;
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/export/ChargingBillExport.java
New file
@@ -0,0 +1,41 @@
package com.ruoyi.order.export;
import cn.afterturn.easypoi.excel.annotation.Excel;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
@Data
@ApiModel(value = "导出充电算帐单-导出")
public class ChargingBillExport implements Serializable {
    @Excel(name = "账单编号",width = 30)
    private String code;
    @Excel(name = "账户类型",width = 30)
    private String accountType;
    @Excel(name = "账单分类",width = 30,replace = {"全站账单_1","各个站点账单_2"})
    private String type;
    @Excel(name = "账单类型",width = 30)
    private String billType;
    @Excel(name  = "账单周期",width = 30 )
    private String billWeek;
    @Excel(name  = "账单生成日期",width = 30)
    private String billTime;
    @Excel(name  = "状态",width = 30)
    private String state;
    @Excel(name  = "站点名称",width = 30)
    private String siteName;
    @Excel(name  = "支付金额",width = 30)
    private BigDecimal paymentAmount;
    @Excel(name  = "退款金额",width = 30)
    private BigDecimal refundAmount;
    @Excel(name  = "入账金额",width = 30)
    private BigDecimal income;
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/export/ChargingBillPayExport.java
New file
@@ -0,0 +1,28 @@
package com.ruoyi.order.export;
import cn.afterturn.easypoi.excel.annotation.Excel;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import java.io.Serializable;
@Data
@ApiModel(value = "导出充电算帐单支付-导出")
public class ChargingBillPayExport implements Serializable {
    @Excel(name = "序号",width = 30)
    private String id;
    @Excel(name = "支付平台",width = 30)
    private String platform;
    @Excel(name = "支付方式名称",width = 30)
    private String platformPay;
    @Excel(name = "支付平台流水号",width = 30)
    private String rechargeSerialNumber;
    @Excel(name = "平台订单号",width = 30)
    private String code;
    @Excel(name = "支付时间",width = 30)
    private String payTime;
    @Excel(name = "支付金额",width = 30)
    private String paymentAmount;
    @Excel(name = "合计",width = 30)
    private String total;
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/export/ChargingBillRefundExport.java
New file
@@ -0,0 +1,37 @@
package com.ruoyi.order.export;
import cn.afterturn.easypoi.excel.annotation.Excel;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
@Data
@ApiModel(value = "导出充电算帐单退款-导出")
public class ChargingBillRefundExport implements Serializable {
    @Excel(name = "序号",width = 30)
    private String id;
    @Excel(name = "支付平台",width = 30)
    private String platform;
    @Excel(name = "支付方式名称",width = 30)
    private String platformPay;
    @Excel(name = "源(支付平台流水号)",width = 30)
    private String rechargeSerialNumber;
    @Excel(name = "源(平台支付订单号)",width = 30)
    private String code;
    @Excel(name = "支付时间",width = 30)
    private String payTime;
    @Excel(name = "退款时间",width = 30)
    private String refundTime;
    @Excel(name = "退款金额",width = 30)
    private String refundMoney;
    @Excel(name = "退款描述",width = 30)
    private String refundRemark;
    @Excel(name = "平台退款编号",width = 30)
    private String refundCode;
    @Excel(name = "支付平台退款流水号",width = 30)
    private String refundSerialNumber;
    @Excel(name = "合计",width = 30)
    private String total;
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/export/TChargingBillExport.java
New file
@@ -0,0 +1,39 @@
package com.ruoyi.order.export;
import cn.afterturn.easypoi.excel.annotation.Excel;
import io.swagger.annotations.ApiModel;
import io.swagger.models.auth.In;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
@Data
@ApiModel(value = "充电算帐单列表-导出")
public class TChargingBillExport implements Serializable {
    @Excel(name = "账单编号",width = 30)
    private String code;
    @Excel(name = "账单类型",width = 30)
    private String billType;
    @Excel(name = "账单分类",width = 30,replace = {"全站账单_1","各个站点账单_2"})
    private String type;
    @Excel(name  = "账单周期",width = 30 )
    private String billWeek;
    @Excel(name  = "站点名称",width = 30)
    private String siteName;
    @Excel(name  = "总金额",width = 30)
    private BigDecimal paymentAmount;
    @Excel(name  = "总电费",width = 30)
    private BigDecimal electrovalence;
    @Excel(name  = "总服务费",width = 30)
    private BigDecimal serviceCharge;
    @Excel(name  = "总电量",width = 30)
    private BigDecimal chargingCapacity;
    @Excel(name  = "充电时长",width = 30)
    private String chargingTime;
    @Excel(name  = "充电订单数量",width = 30)
    private Integer orderCount;
    @Excel(name  = "账单生成日期",width = 30)
    private String billTime;
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TChargingBillMapper.java
New file
@@ -0,0 +1,30 @@
package com.ruoyi.order.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.common.core.web.page.PageInfo;
import com.ruoyi.order.api.model.TChargingBill;
import com.ruoyi.order.api.vo.ChargingBillListVO;
import com.ruoyi.order.api.model.ChargingListQuery;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
 * <p>
 *  Mapper 接口
 * </p>
 *
 * @author xiaochen
 * @since 2024-08-07
 */
@Mapper
public interface TChargingBillMapper extends BaseMapper<TChargingBill> {
    List<ChargingBillListVO> chargingBillList(
            @Param("pageInfo") PageInfo<ChargingBillListVO> pageInfo,
            @Param("req") ChargingListQuery dto,
            @Param("startTime1")String startTime1,
            @Param("startTime2")String startTime2);
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TChargingOrderMapper.java
@@ -4,6 +4,7 @@
import com.ruoyi.common.core.dto.ChargingOrderGroup;
import com.ruoyi.common.core.dto.ChargingPercentProvinceDto;
import com.ruoyi.common.core.web.page.PageInfo;
import com.ruoyi.order.api.model.ChargingListQuery;
import com.ruoyi.order.api.model.TChargingOrder;
import com.ruoyi.order.api.model.TChargingOrderRefund;
import com.ruoyi.order.api.query.ChargingOrderQuery;
@@ -76,7 +77,7 @@
    List<Map<String, BigDecimal>> getYearData(List<Long> chargingOrderIds);
    List<ChargingOrderListVO> chargingList(@Param("pageInfo")PageInfo<ChargingOrderListVO> pageInfo, @Param("req")ChargingListQuery dto, @Param("startTime1")String startTime1, @Param("startTime2")String startTime2, @Param("endTime1")String endTime1, @Param("endTime2")String endTime2);
    List<ChargingOrderListVO> chargingList(@Param("pageInfo")PageInfo<ChargingOrderListVO> pageInfo, @Param("req") ChargingListQuery dto, @Param("startTime1")String startTime1, @Param("startTime2")String startTime2, @Param("endTime1")String endTime1, @Param("endTime2")String endTime2);
    List<ChargingOrderListVO> chargingList1( @Param("req")ChargingListQuery dto, @Param("startTime1")String startTime1, @Param("startTime2")String startTime2, @Param("endTime1")String endTime1, @Param("endTime2")String endTime2);
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TChargingBillService.java
New file
@@ -0,0 +1,20 @@
package com.ruoyi.order.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.order.api.model.TChargingBill;
import com.ruoyi.order.api.vo.ChargingBillVO;
import com.ruoyi.order.api.model.ChargingListQuery;
/**
 * <p>
 *  服务类
 * </p>
 *
 * @author xiaochen
 * @since 2024-08-07
 */
public interface TChargingBillService extends IService<TChargingBill> {
    ChargingBillVO chargingBillList(ChargingListQuery dto);
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TChargingOrderService.java
@@ -5,14 +5,13 @@
import com.ruoyi.common.core.dto.ChargingOrderGroup;
import com.ruoyi.common.core.dto.ChargingPercentProvinceDto;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.core.web.page.BasePage;
import com.ruoyi.common.core.web.page.PageInfo;
import com.ruoyi.order.api.model.ChargingListQuery;
import com.ruoyi.order.api.model.TChargingOrder;
import com.ruoyi.order.api.model.TChargingOrderRefund;
import com.ruoyi.order.api.query.ChargingOrderQuery;
import com.ruoyi.order.api.query.UploadRealTimeMonitoringDataQuery;
import com.ruoyi.order.api.vo.ChargingOrderTimeVO;
import com.ruoyi.order.api.vo.ChargingOrderVO;
import com.ruoyi.order.api.vo.TCharingOrderVO;
import com.ruoyi.order.dto.*;
import com.ruoyi.order.vo.ChargingOrderListInfoVO;
@@ -141,15 +140,15 @@
     * @param query
     */
    void chargeMonitoring(UploadRealTimeMonitoringDataQuery query);
    /**
     * 自动结束充电后的处理逻辑
     * @param code
     */
    void endCharge(String code, Integer endMode);
    /**
     * 异常结束充电处理逻辑
     * @param orderCode
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TVipOrderService.java
@@ -25,4 +25,6 @@
    List<SixVipDto> sixBefore(LocalDate sixBefore);
    BigDecimal getSumAmout(LocalDate sixBefore);
    void payBack(String outTradeNo);
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingBillServiceImpl.java
New file
@@ -0,0 +1,327 @@
package com.ruoyi.order.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.ruoyi.account.api.feignClient.AppUserCarClient;
import com.ruoyi.account.api.feignClient.AppUserClient;
import com.ruoyi.account.api.model.TAppUser;
import com.ruoyi.account.api.model.TAppUserCar;
import com.ruoyi.chargingPile.api.feignClient.ChargingGunClient;
import com.ruoyi.chargingPile.api.feignClient.ChargingPileClient;
import com.ruoyi.chargingPile.api.feignClient.SiteClient;
import com.ruoyi.chargingPile.api.model.Site;
import com.ruoyi.chargingPile.api.model.TChargingGun;
import com.ruoyi.chargingPile.api.model.TChargingPile;
import com.ruoyi.integration.api.feignClient.UploadRealTimeMonitoringDataClient;
import com.ruoyi.integration.api.model.UploadRealTimeMonitoringData;
import com.ruoyi.order.api.model.TChargingOrder;
import com.ruoyi.order.api.vo.ChargingBillListVO;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.core.web.page.PageInfo;
import com.ruoyi.order.api.model.TChargingBill;
import com.ruoyi.order.api.vo.ChargingBillVO;
import com.ruoyi.order.api.model.ChargingListQuery;
import com.ruoyi.order.mapper.TChargingBillMapper;
import com.ruoyi.order.mapper.TChargingOrderMapper;
import com.ruoyi.order.service.TChargingBillService;
import org.omg.CORBA.PRIVATE_MEMBER;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.temporal.TemporalAdjusters;
import java.util.Arrays;
import java.util.List;
/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author xiaochen
 * @since 2024-08-07
 */
@Service
public class TChargingBillServiceImpl extends ServiceImpl<TChargingBillMapper, TChargingBill> implements TChargingBillService {
    @Resource
    private TChargingOrderMapper chargingOrderList;
    @Resource
    private UploadRealTimeMonitoringDataClient uploadRealTimeMonitoringDataClient;
    @Resource
    private SiteClient siteClient;
    @Resource
    private ChargingPileClient chargingPileClient;
    @Resource
    private ChargingGunClient chargingGunClient;
    @Resource
    private AppUserClient appUserClient;
    @Resource
    private AppUserCarClient appUserCarClient;
    @Override
    public ChargingBillVO chargingBillList(ChargingListQuery dto) {
        ChargingBillVO chargingBillVO = new ChargingBillVO();
        String startTime1 = null;
        String startTime2 = null;
        if (StringUtils.hasLength(dto.getStartTime())){
            String[] split = dto.getStartTime().split(" - ");
            startTime1 = split[0];
            startTime2 = split[1];
        }
        PageInfo<ChargingBillListVO> pageInfo = new PageInfo<>(dto.getPageCurr(),dto.getPageSize());
        List<ChargingBillListVO> list = this.baseMapper.chargingBillList(pageInfo,dto,startTime1,startTime2);
        BigDecimal paymentAmountTotal = new BigDecimal("0");
        BigDecimal orderAmountTotal = new BigDecimal("0");
        BigDecimal electrovalenceTotal = new BigDecimal("0");
        BigDecimal serviceChargeTotal = new BigDecimal("0");
        BigDecimal commissionAmountTotal = new BigDecimal("0");
        BigDecimal sharingAmountTotal = new BigDecimal("0");
        BigDecimal chargingCapacityTotal = new BigDecimal("0");
        BigDecimal discountTotal = new BigDecimal("0");
        int orderCount = 0;
        for (ChargingBillListVO chargingBillListVO : list) {
            String temp = "";
            String temp1 = "";
            switch (chargingBillListVO.getType()){
                case 1:
                    temp = "全站账单";
                    temp1 = "全站";
                    break;
                case 2:
                    temp = "各个站点账单";
                    temp1 = siteClient.getSiteByIds(Arrays.asList(chargingBillListVO.getSiteId())).getData().get(0).getName();
                    break;
            }
            chargingBillVO.setCategory(temp);
            chargingBillVO.setSiteName(temp1);
            chargingBillVO.setType("月账单");
            chargingBillVO.setCode(chargingBillListVO.getCode());
            LocalDateTime billTime = chargingBillListVO.getBillTime();
            // 将其转化为yyyy-MM格式字符串
            chargingBillVO.setCreateTime(billTime.format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
            // 将billTime减去一个月 转化为yyyy-MM格式字符串
            chargingBillVO.setBillWeek(billTime.minusMonths(1).format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM")));
            chargingBillListVO.setUid(chargingBillListVO.getId().toString());
            // 根据账单的出账时间 查询上个月的充电订单
            LocalDateTime localDate = chargingBillListVO.getBillTime().minusMonths(1);
            // 账单周期
            chargingBillListVO.setBillWeek(localDate.format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM")));
            // 获取 LocalDate 对象
            LocalDate date = localDate.toLocalDate();
            // 获取该月份的第一天
            LocalDate firstDayOfMonth = date.withDayOfMonth(1);
            // 获取该月份的最后一天
            LocalDate lastDayOfMonth = date.with(TemporalAdjusters.lastDayOfMonth());
            QueryWrapper<TChargingOrder> eq = new QueryWrapper<TChargingOrder>()
                    .between("create_time", firstDayOfMonth, lastDayOfMonth)
                    .eq("status", 5)
                    .eq("recharge_payment_status", 2);
            if (chargingBillListVO.getType() == 2) {
                eq.eq("site_id", chargingBillListVO.getSiteId());
            }
            List<TChargingOrder> tChargingOrders = chargingOrderList.selectList(eq);
            int chargingSecond = 0;
            BigDecimal paymentAmount = new BigDecimal("0");
            BigDecimal orderAmount = new BigDecimal("0");
            BigDecimal electrovalence = new BigDecimal("0");
            BigDecimal serviceCharge = new BigDecimal("0");
            BigDecimal commissionAmount = new BigDecimal("0");
            BigDecimal sharingAmount = new BigDecimal("0");
            BigDecimal chargingCapacity = new BigDecimal("0");
            orderCount+=tChargingOrders.size();
            chargingBillVO.setCategory("");
            chargingBillVO.setExportList(tChargingOrders);
            for (TChargingOrder tChargingOrder : tChargingOrders) {
                List<Site> data = siteClient.getSiteByIds(Arrays.asList(tChargingOrder.getSiteId())).getData();
                if (!data.isEmpty()){
                    chargingBillVO.setSiteName(data.get(0).getName());
                }
                TChargingPile data1 = chargingPileClient.getChargingPileById(tChargingOrder.getChargingPileId()).getData();
                TChargingGun data2 = chargingGunClient.getChargingGunById(tChargingOrder.getChargingGunId()).getData();
                if (data1!=null && data2!=null){
                    tChargingOrder.setTerminalName(data1.getName()+data2.getName());
                    tChargingOrder.setTerminalCode(data2.getCode());
                }
                tChargingOrder.setOrderClassification1("线上订单");
                tChargingOrder.setRechargePaymentType1("预付");
                tChargingOrder.setChargingType("充电桩接口充电服务");
                switch (tChargingOrder.getStatus()){
                    case 1:
                        tChargingOrder.setStatus1("等待中");
                        break;
                    case 2:
                        tChargingOrder.setStatus1("启动中");
                        break;
                    case 3:
                        tChargingOrder.setStatus1("充电中");
                        break;
                    case 4:
                        tChargingOrder.setStatus1("停止中");
                        break;
                    case 5:
                        tChargingOrder.setStatus1("已结束");
                         break;
                    case 0:
                        tChargingOrder.setStatus1("未知");
                        break;
                }
                if (tChargingOrder.getEndMode()!=null){
                    switch (tChargingOrder.getEndMode()){
                        case 1:
                            tChargingOrder.setEndMode1("主动终止");
                            break;
                        case 2:
                            tChargingOrder.setEndMode1("满电终止");
                            break;
                        case 3:
                            tChargingOrder.setEndMode1("费用不足终止");
                            break;
                        case 0:
                            tChargingOrder.setEndMode1("异常终止");
                            break;
                    }
                }
                BigDecimal add = tChargingOrder.getElectrovalence().add(tChargingOrder.getServiceCharge());
                tChargingOrder.setTotalAmount(add.toString());
                tChargingOrder.setDiscount(tChargingOrder.getCouponDiscountAmount().toString());
                UploadRealTimeMonitoringData data5 = uploadRealTimeMonitoringDataClient.chargingOrderInfo(tChargingOrder.getCode()).getData();
                if (data5!=null){
                    if (data5.getTime_remaining()!=null){
                        chargingSecond+=data5.getTime_remaining()*60;
                    }
                }
                Integer cumulativeChargingTime = data5.getCumulative_charging_time();
                // 将其转化为xx小时xx分钟xx秒显示 如果是0小时则不展示小时 如果是0分钟则不展示分钟
                if (cumulativeChargingTime!=null){
                    // 计算小时、分钟和秒
                    int hours = cumulativeChargingTime / 60;
                    int minutes = cumulativeChargingTime % 60;
                    int seconds = 0; // 如果没有秒数,则默认是0
                    StringBuilder result = new StringBuilder();
                    if (hours > 0) {
                        result.append(hours).append("小时");
                    }
                    if (minutes > 0) {
                        result.append(minutes).append("分钟");
                    }
                    if (seconds > 0 || result.length() == 0) { // 如果秒数大于0,或者小时和分钟都为0,则显示秒数
                        result.append(seconds).append("秒");
                    }
                    tChargingOrder.setChargingTime(result.toString());
                }
                tChargingOrder.setEndSoc(data5.getSoc().toString());
                TAppUser data3 = appUserClient.getUserById(tChargingOrder.getAppUserId()).getData();
                if (tChargingOrder.getAppUserCarId()!=null){
                    List<TAppUserCar> data4 = appUserCarClient.getCarByIds(Arrays.asList(tChargingOrder.getAppUserCarId())).getData();
                    if (!data4.isEmpty()){
                        tChargingOrder.setLicensePlate(data4.get(0).getLicensePlate());
                        tChargingOrder.setVehicleModel(data4.get(0).getVehicleModel());
                    }
                }
                if (data3!=null)tChargingOrder.setUserName(data3.getName());
                // 累加实收金额 支付金额减去退款金额
                if (tChargingOrder.getRefundAmount()!=null && tChargingOrder.getPaymentAmount()!=null){
                    paymentAmount = paymentAmount.add(tChargingOrder.getPaymentAmount()).subtract(tChargingOrder.getRefundAmount());
                    paymentAmountTotal = paymentAmountTotal.add(tChargingOrder.getPaymentAmount()).subtract(tChargingOrder.getRefundAmount());
                }else if (tChargingOrder.getPaymentAmount()!=null){
                    paymentAmount = paymentAmount.add(tChargingOrder.getPaymentAmount());
                    paymentAmountTotal = paymentAmountTotal.add(tChargingOrder.getPaymentAmount());
                }
                // 累加订单金额
                if (tChargingOrder.getOrderAmount()!=null){
                orderAmount = orderAmount.add(tChargingOrder.getOrderAmount());
                orderAmountTotal = orderAmountTotal.add(tChargingOrder.getOrderAmount());
                }
                // 累加累计电费
                if (tChargingOrder.getElectrovalence()!=null){
                electrovalence = electrovalence.add(tChargingOrder.getElectrovalence());
                electrovalenceTotal = electrovalenceTotal.add(tChargingOrder.getElectrovalence());
                }
                // 累加累计服务费
                if (tChargingOrder.getServiceCharge()!=null){
                serviceCharge = serviceCharge.add(tChargingOrder.getServiceCharge());
                serviceChargeTotal = serviceChargeTotal.add(tChargingOrder.getServiceCharge());
                }
                // 累加平台手续费
                if (tChargingOrder.getCommissionAmount()!=null){
                    commissionAmount = commissionAmount.add(tChargingOrder.getCommissionAmount());
                    commissionAmountTotal = commissionAmountTotal.add(tChargingOrder.getCommissionAmount());
                }
                // 累加平台分佣
                if (tChargingOrder.getSharingAmount()!=null){
                    sharingAmount = sharingAmount.add(tChargingOrder.getSharingAmount());
                    sharingAmountTotal = sharingAmountTotal.add(tChargingOrder.getSharingAmount());
                }
                // 累加充电度数
                if (tChargingOrder.getChargingCapacity()!=null){
                    chargingCapacity = chargingCapacity.add(tChargingOrder.getChargingCapacity());
                    chargingCapacityTotal = chargingCapacityTotal.add(tChargingOrder.getChargingCapacity());
                }
                // 累加优惠金额
                if (tChargingOrder.getCouponDiscountAmount()!=null){
                    discountTotal = discountTotal.add(tChargingOrder.getCouponDiscountAmount());
                }
                if (tChargingOrder.getVipDiscountAmount()!=null){
                    discountTotal = discountTotal.add(tChargingOrder.getVipDiscountAmount());
                }
            }
            // 将chargingSecond 这是以秒为单位存放的总秒数 将其转化为xx小时xx分钟xx秒
            int hours = chargingSecond / 3600;
            int minutes = (chargingSecond % 3600) / 60;
            int seconds = chargingSecond % 60;
            // 格式化为字符串
            String timeString = String.format("%d小时%d分钟%d秒", hours, minutes, seconds);
            chargingBillVO.setChargingTime(timeString);
            chargingBillListVO.setPaymentAmount(paymentAmount);
            chargingBillListVO.setOrderAmount(orderAmount);
            chargingBillListVO.setElectrovalence(electrovalence);
            chargingBillListVO.setServiceCharge(serviceCharge);
            chargingBillListVO.setCommissionAmount(commissionAmount);
            chargingBillListVO.setSharingAmount(sharingAmount);
            chargingBillListVO.setChargingCapacity(chargingCapacity);
            switch (chargingBillListVO.getType()){
                case 1:
                    chargingBillListVO.setSiteName("全站");
                    break;
                case 2:
                    Site site = siteClient.getSiteByIds(Arrays.asList(chargingBillListVO.getSiteId())).getData().get(0);
                    if (site!=null){
                        chargingBillListVO.setSiteName(site.getName());
                    }
                    break;
            }
            // 订单数
            chargingBillListVO.setOrderCount(tChargingOrders.size());
            // 充电时间秒
            chargingBillListVO.setChargingSecond(chargingSecond);
        }
        chargingBillVO.setChargingCapacity(chargingCapacityTotal);
        chargingBillVO.setPaymentAmount(paymentAmountTotal);
        chargingBillVO.setOrderAmount(orderAmountTotal);
        chargingBillVO.setElectrovalence(electrovalenceTotal);
        chargingBillVO.setServiceCharge(serviceChargeTotal);
        chargingBillVO.setOrderCount(orderCount);
        chargingBillVO.setCommissionAmount(commissionAmountTotal);
        chargingBillVO.setSharingAmount(sharingAmountTotal);
        chargingBillVO.setDiscount(discountTotal);
        pageInfo.setRecords(list);
        chargingBillVO.setList(pageInfo);
        return chargingBillVO;
    }
    public static void main(String[] args) {
        LocalDateTime now = LocalDateTime.now();
        // 将时间转化为字符串 只保留年月日 格式为yyyy-MM-dd
        String format = now.format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd"));
    }
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
@@ -4,7 +4,6 @@
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.account.api.feignClient.*;
import com.ruoyi.account.api.model.*;
@@ -16,11 +15,9 @@
import com.ruoyi.common.core.dto.ChargingOrderGroup;
import com.ruoyi.common.core.dto.ChargingPercentProvinceDto;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.core.web.page.BasePage;
import com.ruoyi.common.core.web.page.PageInfo;
import com.ruoyi.common.redis.service.RedisService;
import com.ruoyi.common.security.service.TokenService;
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.integration.api.feignClient.ChargingHandshakeClient;
import com.ruoyi.integration.api.feignClient.PlatformStartChargingReplyClient;
import com.ruoyi.integration.api.feignClient.SendMessageClient;
@@ -43,6 +40,10 @@
import com.ruoyi.order.api.vo.TCharingOrderVO;
import com.ruoyi.order.dto.*;
import com.ruoyi.order.mapper.TChargingOrderMapper;
import com.ruoyi.order.service.TChargingOrderAccountingStrategyService;
import com.ruoyi.order.service.TChargingOrderRefundService;
import com.ruoyi.order.service.TChargingOrderService;
import com.ruoyi.order.service.TOrderEvaluateService;
import com.ruoyi.order.service.*;
import com.ruoyi.other.api.domain.TCoupon;
import com.ruoyi.other.api.domain.TGoods;
@@ -57,7 +58,6 @@
import com.ruoyi.payment.api.model.RefundResp;
import com.ruoyi.payment.api.model.WxPaymentRefundModel;
import com.ruoyi.payment.api.vo.*;
import com.ruoyi.system.api.domain.SysUser;
import com.ruoyi.system.api.feignClient.SysUserClient;
import io.seata.spring.annotation.GlobalTransactional;
import io.swagger.annotations.ApiModelProperty;
@@ -77,7 +77,6 @@
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.*;
import java.util.concurrent.*;
import java.util.stream.Collectors;
@@ -94,7 +93,7 @@
public class TChargingOrderServiceImpl extends ServiceImpl<TChargingOrderMapper, TChargingOrder> implements TChargingOrderService {
    
    private Logger log = LoggerFactory.getLogger(TChargingOrderServiceImpl.class);
    @Resource
    private ChargingGunClient chargingGunClient;
    
@@ -144,45 +143,45 @@
    @Resource
    private TOrderEvaluateService orderEvaluateService;
    @Resource
    private AccountingStrategyDetailClient accountingStrategyDetailClient;
    @Resource
    private AccountingStrategyDetailOrderClient accountingStrategyDetailOrderClient;
    @Resource
    private AccountingStrategyClient accountingStrategyClient;
    @Resource
    private PlatformStartChargingReplyClient platformStartChargingReplyClient;
    @Resource
    private TChargingOrderRefundService chargingOrderRefundService;
    @Resource
    private PlatformStopChargingReplyClient platformStopChargingReplyClient;
    @Resource
    private AccountingStrategyOrderService accountingStrategyOrderService;
    @Resource
    private AccountingStrategyDetailOrderService accountingStrategyDetailOrderService;
    @Resource
    private InviteUserClient inviteUserClient;
    @Resource
    private AppUserIntegralChangeClient appUserIntegralChangeClient;
    @Resource
    private IntegralRuleClient integralRuleClient;
    //计数器
    private Map<String, Integer> counter_map = new HashMap<>();
    /**
     * 获取小程序充电记录列表数据
@@ -441,9 +440,10 @@
                    chargingOrder.setVipDiscountAmount(discountAmount);
                }
            }
        }
        this.save(chargingOrder);
        //添加订单的计费策略
        TAccountingStrategy accountingStrategy = accountingStrategyClient.getAccountingStrategyById(tChargingGun.getAccountingStrategyId()).getData();
        List<TAccountingStrategyDetail> strategyDetailList = accountingStrategyDetailClient.getListByAccountingStrategyId(tChargingGun.getAccountingStrategyId()).getData();
@@ -459,7 +459,7 @@
            list1.add(accountingStrategyDetailOrder);
        }
        accountingStrategyDetailOrderService.saveBatch(list1);
        //会员优惠折扣将其计入增加充电时长(增加总充电金额)
        //如果充电总金额未使用完,则需要退回费用=(原金额/总金额)*(总金额-实际充电金额)
        if(1 == addChargingOrder.getPaymentType()){
@@ -507,7 +507,7 @@
        chargingOrder.setRechargePaymentStatus(2);
        chargingOrder.setRechargeSerialNumber(transaction_id);
        chargingOrder.setStatus(2);
        //添加安全检测数据到缓存中,每步安全检测完成后需要更新缓存数据
        PreChargeCheck preChargeCheck = new PreChargeCheck();
        preChargeCheck.setElectronicLockLock(false);
@@ -529,7 +529,7 @@
        //计算电费金额和服务费
        BigDecimal serviceCharge = strategyDetail.getServiceCharge().multiply(degrees);
        BigDecimal electrovalence = strategyDetail.getElectrovalence().multiply(degrees);
        //再处理会员折扣
        BigDecimal discount = BigDecimal.ZERO;
        TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData();
@@ -547,8 +547,8 @@
        electrovalence = electrovalence.add(discount);
        chargingOrder.setChargeAmount(electrovalence);
        this.updateById(chargingOrder);
        TChargingPile chargingPile = chargingPileClient.getChargingPileById(chargingGun.getChargingPileId()).getData();
        //调用远程启动充电消息
        PlatformStartCharging platformStartCharging = new PlatformStartCharging();
@@ -665,11 +665,11 @@
                    }
                }
            }
        }
    }
    /**
     * 启动失败后微信退款的回调处理
     * @param out_refund_no
@@ -688,10 +688,10 @@
        }
        return AjaxResult.success();
    }
    /**
     * 获取充电中的详情
     * @param id
@@ -754,7 +754,7 @@
        chargingOrder.setStatus(4);
        chargingOrder.setEndMode(1);
        this.updateById(chargingOrder);
        //异步线程处理停机
        ExecutorService cachedThreadPool = Executors.newFixedThreadPool(1);
        cachedThreadPool.execute(()->{
@@ -779,7 +779,7 @@
                    }
                    continue;
                }
                if(0 == reply.getStop_result()){
                    String failure_cause = "";
                    switch (reply.getFailure_cause()){
@@ -799,14 +799,14 @@
                    log.error("停机失败:订单号:{},失败原因:{}", chargingOrder.getCode(), failure_cause);
                    throw new RuntimeException(failure_cause);
                }
                //计算费用,处理退款
                endCharge(chargingOrder);
                break;
            }
        });
        //处理推荐奖励(被推荐首单奖励)
        TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData();
        long count = this.count(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getAppUserId, chargingOrder.getAppUserId())
@@ -841,15 +841,15 @@
            appUserIntegralChange.setCurrentIntegral(appUser1.getPoints() + num1);
            appUserIntegralChange.setCreateTime(LocalDateTime.now());
            appUserIntegralChangeClient.addAppUserIntegralChange(appUserIntegralChange);
            appUser1.setPoints(appUser1.getPoints() + num1);
            appUserClient.updateAppUser(appUser1);
        }
        return AjaxResult.success();
    }
    /**
     * 手动结束后的费用计算和退款逻辑
     */
@@ -876,14 +876,14 @@
            orderAmount = orderAmount.divide(chargingOrder.getVipDiscount().divide(new BigDecimal(10)));
            chargingOrder.setOrderAmount(total);
        }
        if(chargingOrder.getEndMode() == 2){
            chargingOrder.setEndMode(refundAmount.compareTo(BigDecimal.ZERO) > 0 ? 2 : 3);
        }
        chargingOrder.setStatus(5);
        chargingOrder.setPaymentAmount(payAmount);
        this.updateById(chargingOrder);
        //计算优惠券
        if(null != chargingOrder.getAppCouponId()){
            //判断实际充电金额是否满足优惠券使用条件,如果不满足则不适用优惠券。
@@ -919,7 +919,7 @@
                }
            }
        }
        if(null != chargingOrder.getVipDiscount()){
            BigDecimal subtract = orderAmount.subtract(total);
            chargingOrder.setVipDiscountAmount(subtract);
@@ -975,9 +975,9 @@
                    }
                }
            }
        }
    }
@@ -1326,10 +1326,10 @@
        return chargingOrderTimeVO;
    }
    @Override
    public R payRefund(PayOrderRefundDto payOrderQueryDto) {
        return null;
    }
//    @Override
//    public R payRefund(PayOrderRefundDto payOrderQueryDto) {
//        return null;
//    }
    @Override
    public ChargingOrderListInfoVO chargingInfo(String uid) {
@@ -1381,6 +1381,7 @@
        chargingOrderListInfoVO.setList1(list);
        return chargingOrderListInfoVO;
    }
    /**
     * 处理充电订单实时监控数据相关的业务逻辑
@@ -1466,7 +1467,7 @@
                    chargingOrderAccountingStrategyService.save(chargingOrderAccountingStrategy1);
                }
            }
            List<TChargingOrderAccountingStrategy> list = chargingOrderAccountingStrategyService.list(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>()
                    .eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrder.getId()));
            BigDecimal t = BigDecimal.ZERO;
@@ -1480,8 +1481,8 @@
            this.updateById(chargingOrder);
        }
    }
    /**
     * 自动结束充电后的处理逻辑
     * @param orderCode
@@ -1497,10 +1498,10 @@
        chargingOrder.setStatus(5);
        chargingOrder.setEndMode(endMode);
        this.updateById(chargingOrder);
        //计算费用,处理退款
        endCharge(chargingOrder);
        //处理推荐奖励(被推荐首单奖励)
        TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData();
        long count = this.count(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getAppUserId, chargingOrder.getAppUserId())
@@ -1535,12 +1536,12 @@
            appUserIntegralChange.setCurrentIntegral(appUser1.getPoints() + num1);
            appUserIntegralChange.setCreateTime(LocalDateTime.now());
            appUserIntegralChangeClient.addAppUserIntegralChange(appUserIntegralChange);
            appUser1.setPoints(appUser1.getPoints() + num1);
            appUserClient.updateAppUser(appUser1);
        }
    }
    /**
     * 异常结束充电处理逻辑
     * @param orderCode
@@ -1549,4 +1550,69 @@
    public void excelEndCharge(String orderCode) {
        endCharge(orderCode, 0);
    }
    @Override
    public R payRefund(PayOrderRefundDto payOrderQueryDto) {
            if (payOrderQueryDto.getType()==1){
                TChargingOrder tChargingOrder = this.baseMapper.selectById(payOrderQueryDto.getOrderId());
                TChargingOrderRefund chargingOrderRefund = new TChargingOrderRefund();
                chargingOrderRefund.setChargingOrderId(tChargingOrder.getId());
                chargingOrderRefund.setRefundAmount(payOrderQueryDto.getRefundAmount());
                chargingOrderRefund.setRefundStatus(1);
                chargingOrderRefund.setPayType(tChargingOrder.getRechargePaymentType());
                chargingOrderRefund.setRefundTime(LocalDateTime.now());
                chargingOrderRefund.setCode(tChargingOrder.getCode());
                SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
                chargingOrderRefund.setRefundCode("GDF" + sdf.format(new Date()) + (Math.random() * 1000));
                chargingOrderRefund.setRefundTitle("后台退款");
                chargingOrderRefund.setRefundContent("后台退款");
                chargingOrderRefund.setRefundReason("后台退款");
                chargingOrderRefund.setRefundRemark("后台退款");
                chargingOrderRefund.setRefundTotalAmount(tChargingOrder.getRefundAmount().add(payOrderQueryDto.getRefundAmount()));
                chargingOrderRefund.setPayAmount(tChargingOrder.getPaymentAmount());
                if(1 == tChargingOrder.getRechargePaymentType()){
                    WxPaymentRefundModel model = new WxPaymentRefundModel();
                    model.setOut_trade_no(tChargingOrder.getCode());
                    model.setOut_refund_no(chargingOrderRefund.getRefundCode());
                    model.setTransaction_id(tChargingOrder.getRechargeSerialNumber());
                    model.setReason("取消订单");
                    model.setNotify_url("http://127.0.0.1:9000/order/t-shopping-order/cancelShoppingOrderWxRefund");
                    WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
                    amount.setRefund(payOrderQueryDto.getRefundAmount().multiply(new BigDecimal(100)).intValue());
                    amount.setTotal(tChargingOrder.getPaymentAmount().multiply(new BigDecimal(100)).intValue());
                    amount.setCurrency("CNY");
                    model.setAmount(amount);
                    R<String> orderR = wxPaymentClient.refundOrderR(model);
                    if(200 == orderR.getCode()){
                        chargingOrderRefundService.save(chargingOrderRefund);
                    }
                }
                if(2 == tChargingOrder.getRechargePaymentType()){
                    RefundReq dto = new RefundReq();
                    dto.setOutTradeNo(tChargingOrder.getCode());
                    dto.setOutRequestNo(tChargingOrder.getCode());
                    dto.setRefundAmount(payOrderQueryDto.getRefundAmount().toString());
                    dto.setRefundReason("取消订单");
                    RefundResp resp = aliPaymentClient.refund(dto).getData();
                    if(null != resp){
                        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-DDTHH:mm:ss+TIMEZONE");
                            chargingOrderRefundService.save(chargingOrderRefund);
                    }
                }
            }
        return null;
    }
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TVipOrderServiceImpl.java
@@ -1,6 +1,8 @@
package com.ruoyi.order.service.impl;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.account.api.dto.GiveVipDto;
import com.ruoyi.common.core.web.page.PageInfo;
import com.ruoyi.order.api.model.TShoppingOrder;
import com.ruoyi.order.api.model.TVipOrder;
@@ -65,4 +67,18 @@
    public BigDecimal getSumAmout(LocalDate sixBefore) {
        return this.baseMapper.getSumAmout(sixBefore);
    }
    @Override
    public void payBack(String outTradeNo) {
        //将vip订单改为已完成
        TVipOrder tVipOrder = this.baseMapper.selectOne(Wrappers.lambdaQuery(TVipOrder.class).eq(TVipOrder::getCode, outTradeNo));
        tVipOrder.setPaymentStatus(2);
        this.baseMapper.updateById(tVipOrder);
        //赠送会员
        GiveVipDto giveVipDto = new GiveVipDto();
        giveVipDto.setUserIds(tVipOrder.getAppUserId().toString());
        giveVipDto.setVipId(tVipOrder.getVipId());
        giveVipDto.setType(tVipOrder.getVipType());
//        vipClient.giveVip(giveVipDto);
    }
}
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingBillMapper.xml
New file
@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.order.mapper.TChargingBillMapper">
    <select id="chargingBillList" resultType="com.ruoyi.order.api.vo.ChargingBillListVO">
    select t1.* from t_charging_bill t1
    where 1=1
        <if test="req.type != null ">
            and t1.type = #{req.type}
        </if>
      <if test="req.state != null ">
            and t1.status = #{req.state}
        </if>
        <if test="startTime1 != null and startTime1!=''">
            and (t1.bill_time between #{startTime1} and #{startTime2}
        </if>
        <if test="req.uid != null and req.uid!=''">
            and t1.id = #{req.uid}
        </if>
    </select>
</mapper>
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml
@@ -195,44 +195,59 @@
    </select>
    <select id="getRefundList" resultType="com.ruoyi.order.api.model.TChargingOrderRefund">
        select * from (SELECT id,
                              `code`,
                              refund_code,
                              refund_title,
                              refund_reason,
                              refund_amount,
                              refund_total_amount,
                              refund_time,
                              pay_type,
                              pay_amount,
                              refund_remark
                       FROM t_charging_order_refund
                       UNION ALL
                       SELECT id,
                              `code`,
                              refund_code,
                              refund_title,
                              refund_reason,
                              refund_amount,
                              refund_total_amount,
                              refund_time,
                              pay_type,
                              pay_amount,
                              refund_remark
                       FROM t_shopping_order_refund
                       UNION ALL
                       SELECT id,
                              `code`,
                              refund_code,
                              refund_title,
                              refund_reason,
                              refund_amount,
                              refund_total_amount,
                              refund_time,
                              pay_type,
                              pay_amount,
                              refund_remark
                       FROM t_vip_order_refund) o
        select * from (SELECT         re.id,
        re.`code`,
        re.refund_code,
        re.refund_title,
        re.refund_reason,
        re.refund_amount,
        re.refund_total_amount,
        re.refund_time,
        re.pay_type,
        re.pay_amount,
        re.refund_remark,
        co.recharge_serial_number as serail_number,
        co.payment_amount,
        co.pay_time
        FROM t_charging_order_refund re
        LEFT JOIN t_charging_order  co ON re.charging_order_id = co.id
        UNION ALL
        SELECT re.id,
        re.`code`,
        re.refund_code,
        re.refund_title,
        re.refund_reason,
        re.refund_amount,
        re.refund_total_amount,
        re.refund_time,
        re.pay_type,
        re.pay_amount,
        re.refund_remark,
        so.serial_number,
        so.payment_amount,
        so.pay_time
        FROM t_shopping_order_refund re
        LEFT JOIN t_shopping_order so on re.shopping_order_id = so.id
        UNION ALL
        SELECT vr.id,
        vr.`code`,
        vr.refund_code,
        vr.refund_title,
        vr.refund_reason,
        vr.refund_amount,
        vr.refund_total_amount,
        vr.refund_time,
        vr.pay_type,
        vr.pay_amount,
        vr.refund_remark,
        vo.serial_number,
        vo.payment_amount,
        vo.pay_time
        FROM t_vip_order_refund vr
        LEFT JOIN t_vip_order vo on vr.vip_order_id = vo.id
        ) o
        <where>
            <if test="data.code != null and data.code != ''">
                AND o.code LIKE CONCAT('%',#{data.code},'%')
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TVipController.java
@@ -8,6 +8,7 @@
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.core.web.page.BasePage;
import com.ruoyi.common.core.web.page.PageInfo;
import com.ruoyi.common.security.service.TokenService;
import com.ruoyi.other.api.domain.TCoupon;
import com.ruoyi.other.api.domain.TIntegralRule;
import com.ruoyi.other.api.domain.TUserTag;
@@ -47,6 +48,8 @@
    private TVipService vipService;
    @Resource
    private TCouponService couponService;
    @Resource
    private TokenService tokenService;
    @PostMapping("/saveVip")
    @ApiOperation(tags = {"管理后台-会员管理"},value = "会员添加")
    public AjaxResult saveVip(@RequestBody TVip dto) {
@@ -204,5 +207,52 @@
        return R.ok(vipInfoDtos);
    }
    @ApiOperation(value = "购买会员", tags = {"小程序-个人中心"})
    @GetMapping("/vipInfo/pay")
    public R vipInfoPay(@RequestParam("vipId")Integer vipId,@RequestParam(name = "1月2季3年",value = "buyType") Integer buyType,
        @RequestParam(name = "1微信2支付宝",value = "payType") Integer payType
    ) {
        TVip byId = vipService.getById(vipId);
        BigDecimal payMoney = BigDecimal.ZERO;
        BigDecimal discountMoney = BigDecimal.ZERO;
        BigDecimal discount = BigDecimal.ZERO;
        LocalDateTime now = LocalDateTime.now();
        switch (buyType){
            case 1:
                if (byId.getMonthlyCardDiscountStart()!=null&&(now.isAfter(byId.getMonthlyCardDiscountStart())&&now.isBefore(byId.getMonthlyCardDiscountEnd()))){
                    payMoney = byId.getMonthlyCard().multiply(byId.getMonthlyCardDiscount());
                    discountMoney = byId.getMonthlyCard().subtract(payMoney);
                    discount = byId.getMonthlyCardDiscount();
                }else {
                    payMoney = byId.getMonthlyCard();
                }
                break;
                case 2:
                    if (byId.getSeasonCardDiscountStart()!=null&&(now.isAfter(byId.getSeasonCardDiscountStart())&&now.isBefore(byId.getSeasonCardDiscountEnd()))){
                        payMoney = byId.getSeasonCard().multiply(byId.getSeasonCardDiscount());
                        discountMoney = byId.getSeasonCard().subtract(payMoney);
                        discount = byId.getSeasonCardDiscount();
                    }else {
                        payMoney = byId.getSeasonCard();
                    }
                break;
            case 3:
                if (byId.getAnnualCardDiscountStart()!=null&&(now.isAfter(byId.getAnnualCardDiscountStart())&&now.isBefore(byId.getAnnualCardDiscountEnd()))){
                    payMoney = byId.getAnnualCard().multiply(byId.getAnnualCardDiscount());
                    discountMoney = byId.getAnnualCard().subtract(payMoney);
                    discount = byId.getAnnualCardDiscount();
                }else {
                payMoney = byId.getAnnualCard();
                }
                break;
        }
        Long userId = tokenService.getLoginUserApplet().getUserId();
        return R.ok(vipService.vipInfoPay(byId,payMoney,payType,discountMoney,discount,buyType,userId));
    }
}
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/TVipService.java
@@ -4,6 +4,8 @@
import com.ruoyi.common.core.web.page.PageInfo;
import com.ruoyi.other.api.domain.TVip;
import java.math.BigDecimal;
/**
 * <p>
 *  服务类
@@ -17,4 +19,5 @@
    PageInfo<TVip> pageList(Integer pageCurr,Integer pageSize);
    Object vipInfoPay(TVip byId, BigDecimal payMoney, Integer payType,BigDecimal discountMoney,BigDecimal discount,Integer buyType, Long userId);
}
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TVipServiceImpl.java
@@ -1,19 +1,33 @@
package com.ruoyi.other.service.impl;
import java.time.LocalDateTime;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.account.api.feignClient.AppUserClient;
import com.ruoyi.account.api.model.TAppUser;
import com.ruoyi.common.core.utils.OrderCodeUtil;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.core.web.page.PageInfo;
import com.ruoyi.order.api.feignClient.OrderClient;
import com.ruoyi.order.api.model.TVipOrder;
import com.ruoyi.other.api.domain.TCoupon;
import com.ruoyi.other.api.domain.TVip;
import com.ruoyi.other.mapper.TCouponMapper;
import com.ruoyi.other.mapper.TVipMapper;
import com.ruoyi.other.service.TVipService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.payment.api.feignClient.AliPaymentClient;
import com.ruoyi.payment.api.feignClient.WxPaymentClient;
import com.ruoyi.payment.api.vo.AliPaymentReq;
import com.ruoyi.payment.api.vo.AliPaymentResp;
import com.ruoyi.payment.api.vo.PaymentOrder;
import org.apache.poi.util.StringUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.List;
/**
@@ -29,6 +43,17 @@
    @Autowired
    private TCouponMapper tCouponMapper;
    @Resource
    private OrderClient orderClient;
    @Resource
    private AppUserClient appUserClient;
    @Resource
    private WxPaymentClient wxPaymentClient;
    @Resource
    private AliPaymentClient aliPaymentClient;
    @Override
    public PageInfo<TVip> pageList(Integer pageCurr,Integer pageSize) {
        PageInfo<TVip> pageInfo = new PageInfo<>(pageCurr,pageSize);
@@ -54,4 +79,51 @@
        pageInfo.setRecords(list);
        return pageInfo;
    }
    @Override
    public Object vipInfoPay(TVip byId, BigDecimal payMoney, Integer payType,BigDecimal discountMoney,BigDecimal discount,Integer buyType, Long userId) {
        TAppUser user = appUserClient.getUserById(userId).getData();
        //生成会员购买订单
        TVipOrder shopOrder = new TVipOrder();
        shopOrder.setCode(OrderCodeUtil.getOrderCode("HY"));
        shopOrder.setAppUserId(userId);
        shopOrder.setType(1);
        shopOrder.setVipId(byId.getId());
        shopOrder.setVipType(buyType);
        shopOrder.setOrderAmount(payMoney.add(discountMoney));
        shopOrder.setDiscount(discount);
        shopOrder.setDiscountAmount(discountMoney);
        shopOrder.setPaymentAmount(payMoney);
        shopOrder.setPaymentStatus(1);
        shopOrder.setPaymentType(payType);
        shopOrder.setPayTime(LocalDateTime.now());
        orderClient.addVipOrder(shopOrder).getData();
        if (payType==1){
            //调起支付
            PaymentOrder paymentOrder = new PaymentOrder();
            paymentOrder.setCode(shopOrder.getCode());
            paymentOrder.setAmount(shopOrder.getPaymentAmount());
            paymentOrder.setOpenId(user.getWxOpenid());
            paymentOrder.setDescription("购买会员");
            return    wxPaymentClient.orderPay(paymentOrder);
        }else {
            AliPaymentReq req = new AliPaymentReq();
            req.setOutTradeNo(shopOrder.getCode());
            req.setTotalAmount(shopOrder.getPaymentAmount().toString());
            req.setSubject("充电充值");
            req.setBuyerOpenId(user.getAliOpenid());
            req.setBody("充电充值");
            AliPaymentResp data = aliPaymentClient.payment(req).getData();
            if(null != data){
                data.setNotifyUrl(data.getNotifyUrl() + "/callBack/ali/all");
                return AjaxResult.success(data);
            }
        }
        return null;
    }
}
ruoyi-service/ruoyi-payment/src/main/java/com/ruoyi/payment/controller/AliPayController.java
@@ -1,6 +1,7 @@
package com.ruoyi.payment.controller;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.payment.ali.config.AliProperties;
import com.ruoyi.payment.ali.v2.AppletPayUtil;
import com.ruoyi.payment.api.model.*;
@@ -11,6 +12,8 @@
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
/**
 * @author zhibing.pu
@@ -83,6 +86,27 @@
    public R<RefundResp> refund(@RequestBody RefundReq dto){
        return R.ok(appletPayUtil.refund(dto));
    }
    @ResponseBody
    @PostMapping(value = "/allCallBack")
    public void chargingOrderALICallback(@RequestBody AliQueryOrder aliQueryOrder, HttpServletResponse response) {
        try {
            String out_trade_no = aliQueryOrder.getOutTradeNo();
            String transaction_id = aliQueryOrder.getTradeNo();
            String attach = aliQueryOrder.getPassbackParams();
//            AjaxResult ajaxResult = chargingOrderService.chargingOrderCallback(2, out_trade_no, transaction_id, attach);
//            if (ajaxResult.isSuccess()) {
//                PrintWriter writer = response.getWriter();
//                writer.println("success");
//                writer.flush();
//                writer.close();
//            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    
    
ruoyi-service/ruoyi-payment/src/main/java/com/ruoyi/payment/controller/WxPayController.java
@@ -114,12 +114,14 @@
            log.info("支付回调:{}", params);
            String outRefundNo = (String) params.get("out_refund_no");
            String out_trade_no = params.get("out_trade_no").toString();
            String substring = outRefundNo.substring(0, 2);
            String substring = out_trade_no.substring(0, 2);
            switch (substring){
                //购物订单
                case "GW":
                    break;
                case "HY":
                    break;
            }
            return R.ok(params);