From 78d7911139088c285abbddcb4746f3ea10a94f23 Mon Sep 17 00:00:00 2001
From: 无关风月 <443237572@qq.com>
Date: 星期三, 04 九月 2024 10:45:05 +0800
Subject: [PATCH] Merge branch 'master' of http://120.76.84.145:10101/gitblit/r/java/mx_charging_pile

---
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/BillingModeVerifyMessageListener.java |   21 ++
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/export/OrderInvoiceExport.java                                    |   79 +++++++
 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TOrderInvoice.java                                      |    2 
 ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TOrderInvoiceMapper.xml                                         |  110 +++++++++++
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TOrderInvoiceMapper.java                                   |   29 ++
 ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TOrderInvoiceDetailMapper.xml                                   |    5 
 ruoyi-service/ruoyi-order/pom.xml                                                                                         |   12 +
 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TOrderInvoiceDetail.java                                |   10 
 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/query/TOrderInvoiceQuery.java                                 |   41 ++++
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TOrderInvoiceController.java                           |   83 ++++++++
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TOrderInvoiceService.java                                 |   26 ++
 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/DateUtils.java                                   |   11 +
 ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/AppUserFallbackFactory.java                       |    5 
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyController.java       |    2 
 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java                            |   10 +
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderInvoiceServiceImpl.java                        |   83 ++++++++
 ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/AppUserClient.java                            |    7 
 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/TOrderInvoiceVO.java                                       |   31 +++
 18 files changed, 561 insertions(+), 6 deletions(-)

diff --git a/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/AppUserFallbackFactory.java b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/AppUserFallbackFactory.java
index 71dc82f..ab00b84 100644
--- a/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/AppUserFallbackFactory.java
+++ b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/AppUserFallbackFactory.java
@@ -64,6 +64,11 @@
             }
 
             @Override
+            public R<List<TAppUser>> selectByPhoneLike(String phone) {
+                return R.fail("通过手机号模糊查询用户失败:"+throwable.getMessage());
+            }
+
+            @Override
             public R refundPoints(String param) {
                 return R.fail("后台兑换订单退款回退用户积分失败:"+throwable.getMessage());
             }
diff --git a/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/AppUserClient.java b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/AppUserClient.java
index f7c1da1..f52c5d9 100644
--- a/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/AppUserClient.java
+++ b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/AppUserClient.java
@@ -69,6 +69,13 @@
     @GetMapping("/t-app-user/user/selectByPhone")
     R<TAppUser> selectByPhone(@RequestParam("phone") String phone);
     /**
+     * 通过手机号模糊查询用户
+     * @param phone
+     * @return
+     */
+    @GetMapping("/t-app-user/user/selectByPhoneLike")
+    R<List<TAppUser>> selectByPhoneLike(@RequestParam("phone") String phone);
+    /**
      * 远程调用 积分兑换订单 退款回退积分
      * @return
      */
diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TOrderInvoice.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TOrderInvoice.java
index 280b1b0..5eef671 100644
--- a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TOrderInvoice.java
+++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TOrderInvoice.java
@@ -4,6 +4,7 @@
 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 io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -114,6 +115,7 @@
     private LocalDateTime createTime;
     
     @ApiModelProperty(value = "开票时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     @TableField("billing_time")
     private LocalDateTime billingTime;
     
diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TOrderInvoiceDetail.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TOrderInvoiceDetail.java
index 6566de9..c28f9ce 100644
--- a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TOrderInvoiceDetail.java
+++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TOrderInvoiceDetail.java
@@ -59,6 +59,14 @@
     @ApiModelProperty(value = "增值服务费税率")
     @TableField("added_service_tariff")
     private BigDecimal addedServiceTariff;
-
+    @ApiModelProperty(value = "'电费'")
+    @TableField("electrovalence")
+    private BigDecimal electrovalence;
+    @ApiModelProperty(value = "'服务费'")
+    @TableField("service_charge")
+    private BigDecimal serviceCharge;
+    @ApiModelProperty(value = "'增值服务费'")
+    @TableField("added_service")
+    private BigDecimal addedService;
 
 }
diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/query/TOrderInvoiceQuery.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/query/TOrderInvoiceQuery.java
new file mode 100644
index 0000000..f1bad4a
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/query/TOrderInvoiceQuery.java
@@ -0,0 +1,41 @@
+package com.ruoyi.order.api.query;
+
+import com.ruoyi.common.core.query.TimeRangePageQuery;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+@ApiModel(value = "发票管理Query")
+public class TOrderInvoiceQuery extends TimeRangePageQuery {
+
+    @ApiModelProperty(value = "开票公司")
+    private String invoicingCompany;
+
+    @ApiModelProperty(value = "发票类型")
+    private String invoiceType;
+
+    @ApiModelProperty(value = "抬头类型(1=个人,2=企业)")
+    private Integer invoicingObjectType;
+
+    @ApiModelProperty(value = "发票种类(1=纸质发票,2=电子发票)")
+    private Integer invoiceMaterial;
+
+    @ApiModelProperty(value = "开票方式(1=人工,2=自动)")
+    private Integer invoicingMethod;
+
+    @ApiModelProperty(value = "申请人电话")
+    private String userPhone;
+
+    @ApiModelProperty(value = "申请人姓名")
+    private String nickName;
+
+    @ApiModelProperty(value = "公司名称")
+    private String name;
+
+    @ApiModelProperty(value = "用户id 前端忽略")
+    private List<Long> userIds;
+
+}
diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/TOrderInvoiceVO.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/TOrderInvoiceVO.java
new file mode 100644
index 0000000..690a19c
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/TOrderInvoiceVO.java
@@ -0,0 +1,31 @@
+package com.ruoyi.order.api.vo;
+
+import com.ruoyi.order.api.model.TOrderInvoice;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+@ApiModel(value = "发票管理VO")
+public class TOrderInvoiceVO extends TOrderInvoice {
+
+    @ApiModelProperty(value = "电费税率")
+    private BigDecimal electricityTariff;
+
+    @ApiModelProperty(value = "服务费税率")
+    private BigDecimal serviceTariff;
+
+    @ApiModelProperty(value = "增值服务费税率")
+    private BigDecimal addedServiceTariff;
+    @ApiModelProperty(value = "电费")
+    private BigDecimal electrovalence;
+    @ApiModelProperty(value = "服务费")
+    private BigDecimal serviceCharge;
+    @ApiModelProperty(value = "增值服务费")
+    private BigDecimal addedService;
+    @ApiModelProperty(value = "用户电话")
+    private String userPhone;
+
+}
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/DateUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/DateUtils.java
index 9c314ca..230ce8a 100644
--- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/DateUtils.java
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/DateUtils.java
@@ -372,5 +372,16 @@
         return LocalTime.parse(time, formatter);
     }
 
+    /**
+     * localdatetime转为字符串
+     *
+     * @param time localdatetime
+     * @return 字符串
+     */
+    public static String localDateTimeToString(LocalDateTime time) {
+        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        return df.format(time);
+    }
+
 
 }
diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java
index 93d83d5..c40aeb7 100644
--- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java
+++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java
@@ -725,6 +725,16 @@
                 .eq(TAppUser::getPhone,phone)
                 .last("LIMIT 1")));
     }
+    /**
+     * 通过手机号模糊查询用户
+     * @param phone
+     * @return
+     */
+    @GetMapping("/user/selectByPhoneLike")
+    public R<List<TAppUser>> selectByPhoneLike(@RequestParam("phone") String phone){
+        return R.ok(appUserService.list(Wrappers.lambdaQuery(TAppUser.class)
+                .eq(TAppUser::getPhone,phone)));
+    }
 
     @ApiOperation(value = "签到", tags = {"小程序-个人中心-签到"})
     @GetMapping(value = "/user/sign")
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyController.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyController.java
index b0b15f2..ed71ef3 100644
--- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyController.java
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyController.java
@@ -92,7 +92,7 @@
     public AjaxResult<List<TAccountingStrategyDetailVO>> queryAccountingStrategyDetailByStrategyId(@RequestParam("strategyId") Integer strategyId) {
         List<TAccountingStrategyDetailVO> list = accountingStrategyDetailService.queryAccountingStrategyDetailByStrategyId(strategyId);
         list.forEach(detail -> {
-            detail.setTotalPrice(detail.getElectrovalence().add(detail.getElectrovalence()));
+            detail.setTotalPrice(detail.getElectrovalence().add(detail.getServiceCharge()));
         });
         return AjaxResult.ok(list);
     }
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/BillingModeVerifyMessageListener.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/BillingModeVerifyMessageListener.java
index 49dcc6b..5001d80 100644
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/BillingModeVerifyMessageListener.java
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/BillingModeVerifyMessageListener.java
@@ -2,6 +2,11 @@
 
 import com.ruoyi.integration.api.model.AcquisitionBillingMode;
 import com.ruoyi.integration.api.model.BillingModeVerify;
+import com.ruoyi.integration.api.model.BillingModeVerifyReply;
+import com.ruoyi.integration.iotda.enums.ServiceIdMenu;
+import com.ruoyi.integration.iotda.utils.produce.IotMessageProduce;
+import com.ruoyi.integration.iotda.utils.tools.MessageUtil;
+import com.ruoyi.integration.mongodb.service.BillingModeVerifyReplyService;
 import com.ruoyi.integration.mongodb.service.BillingModeVerifyService;
 import com.ruoyi.integration.rocket.model.BillingModeVerifyMessage;
 import com.ruoyi.integration.rocket.util.EnhanceMessageHandler;
@@ -24,6 +29,10 @@
 
     @Autowired
     private BillingModeVerifyService billingModeVerifyService;
+    @Autowired
+    private IotMessageProduce iotMessageProduce;
+    @Autowired
+    private MessageUtil messageUtil;
 
     @Override
     protected void handleMessage(BillingModeVerifyMessage message) throws Exception {
@@ -34,6 +43,18 @@
         BeanUtils.copyProperties(message,billingModeVerify);
         billingModeVerifyService.create(billingModeVerify);
         // 业务处理
+        BillingModeVerifyReply billingModeVerifyReply = new BillingModeVerifyReply();
+        if(message.getBilling_model_code().equals("0")){
+            // 首次
+            billingModeVerifyReply.setCharging_pile_code(billingModeVerify.getCharging_pile_code());
+            billingModeVerifyReply.setBilling_model_code("0");
+            billingModeVerifyReply.setBilling_model_result(1);
+            iotMessageProduce.sendMessage(billingModeVerifyReply.getCharging_pile_code(), ServiceIdMenu.BILLING_MODE_VERIFY_REPLY.getKey(),messageUtil.billingModeVerifyReply(billingModeVerifyReply));
+        }else {
+            // 校验计费模版是否准确
+
+
+        }
     }
 
     @Override
diff --git a/ruoyi-service/ruoyi-order/pom.xml b/ruoyi-service/ruoyi-order/pom.xml
index 51c211d..f5641e4 100644
--- a/ruoyi-service/ruoyi-order/pom.xml
+++ b/ruoyi-service/ruoyi-order/pom.xml
@@ -140,6 +140,18 @@
             <scope>test</scope>
         </dependency>
 
+        <dependency>
+            <groupId>cn.afterturn</groupId>
+            <artifactId>easypoi-spring-boot-starter</artifactId>
+            <version>4.0.0</version>
+            <exclusions>
+                <exclusion>
+                    <artifactId>guava</artifactId>
+                    <groupId>com.google.guava</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
     </dependencies>
 
     <build>
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TOrderInvoiceController.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TOrderInvoiceController.java
index 8e2cd80..5bbdf95 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TOrderInvoiceController.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TOrderInvoiceController.java
@@ -1,18 +1,37 @@
 package com.ruoyi.order.controller;
 
 
+import cn.afterturn.easypoi.excel.ExcelExportUtil;
+import cn.afterturn.easypoi.excel.entity.ExportParams;
+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.core.web.page.PageInfo;
+import com.ruoyi.common.log.annotation.Log;
+import com.ruoyi.common.log.enums.BusinessType;
+import com.ruoyi.order.api.model.TOrderInvoice;
+import com.ruoyi.order.api.query.TOrderInvoiceQuery;
+import com.ruoyi.order.api.vo.TOrderInvoiceVO;
 import com.ruoyi.order.dto.AddOrderInvoice;
 import com.ruoyi.order.dto.GetOrderInvoiceList;
 import com.ruoyi.order.dto.MyOrderInvoiceInfo;
 import com.ruoyi.order.dto.OrderInvoiceList;
+import com.ruoyi.order.export.OrderInvoiceExport;
 import com.ruoyi.order.service.TOrderInvoiceService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+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.net.URLEncoder;
+import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 /**
  * <p>
@@ -39,8 +58,68 @@
 	public AjaxResult addOrderInvoice(@RequestBody AddOrderInvoice addOrderInvoice){
 		return orderInvoiceService.addOrderInvoice(addOrderInvoice);
 	}
-	
-	
+
+	@PostMapping("/pageList")
+	@ApiOperation(value = "查询开票分页列表", tags = {"管理后台-发票管理"})
+	public AjaxResult<PageInfo<TOrderInvoiceVO>> pageList(@RequestBody TOrderInvoiceQuery query){
+		return AjaxResult.success(orderInvoiceService.pageList(query));
+	}
+
+	@GetMapping("/uploadPdf")
+	@ApiOperation(value = "上传发票", tags = {"管理后台-发票管理"})
+	public AjaxResult<String> uploadPdf(@RequestParam("id") Long id,
+										@RequestParam("invoiceUrl") String invoiceUrl){
+		TOrderInvoice orderInvoice = orderInvoiceService.getById(id);
+		orderInvoice.setInvoiceUrl(invoiceUrl);
+		orderInvoiceService.updateById(orderInvoice);
+		return AjaxResult.success();
+	}
+
+	@PostMapping("/statusCount")
+	@ApiOperation(value = "查询开票状态数量", tags = {"管理后台-发票管理"})
+	public AjaxResult<Map<String,Integer>> statusCount(@RequestBody TOrderInvoiceQuery query){
+		return AjaxResult.success(orderInvoiceService.statusCount(query));
+	}
+
+	/**
+	 * 发票管理导出
+	 */
+	@ApiOperation(value = "发票管理导出")
+	@Log(title = "发票管理导出", businessType = BusinessType.EXPORT)
+	@PostMapping("/export")
+	public void export(@RequestBody TOrderInvoiceQuery query)
+	{
+		List<TOrderInvoiceVO> list = orderInvoiceService.export(query);
+		List<OrderInvoiceExport> orderInvoiceExports = new ArrayList<>();
+		for (TOrderInvoiceVO orderInvoiceVO : list) {
+			OrderInvoiceExport orderInvoiceExport = new OrderInvoiceExport();
+			BeanUtils.copyProperties(orderInvoiceVO,orderInvoiceExport);
+			orderInvoiceExport.setBillingTime(DateUtils.localDateTimeToString(orderInvoiceVO.getBillingTime()));
+			orderInvoiceExports.add(orderInvoiceExport);
+		}
+		Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), OrderInvoiceExport.class, orderInvoiceExports);
+		HttpServletResponse response = WebUtils.response();
+		response.setContentType("application/vnd.ms-excel");
+		response.setCharacterEncoding("utf-8");
+		ServletOutputStream outputStream = null;
+		try {
+			String fileName = URLEncoder.encode("发票导出.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();
+			}
+		}
+	}
 	
 	@ResponseBody
 	@GetMapping("/getMyOrderInvoiceList")
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/export/OrderInvoiceExport.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/export/OrderInvoiceExport.java
new file mode 100644
index 0000000..9434e69
--- /dev/null
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/export/OrderInvoiceExport.java
@@ -0,0 +1,79 @@
+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 OrderInvoiceExport implements Serializable {
+
+    @Excel(name = "申请单编号",width = 30)
+    private String code;
+
+    @Excel(name  = "申请日期",width = 30)
+    private String billingTime;
+
+    @Excel(name  = "开票公司",width = 30)
+    private String invoicingCompany;
+
+    @Excel(name  = "发票类型",width = 30)
+    private String invoiceType;
+
+    @Excel(name  = "发票种类",replace = {"纸质发票_1","电子发票_2"},width = 30)
+    private Integer invoiceMaterial;
+
+    @Excel(name  = "开票方式",replace = {"人工_1","自动_2"},width = 30)
+    private Integer invoicingMethod;
+
+    @Excel(name  = "开票总金额",width = 30)
+    private BigDecimal totalAmount;
+
+    @Excel(name  = "服务费",width = 30)
+    private BigDecimal serviceCharge;
+
+    @Excel(name  = "服务费税率",width = 30)
+    private BigDecimal serviceTariff;
+
+    @Excel(name  = "增值服务费",width = 30)
+    private BigDecimal addedService;
+
+    @Excel(name  = "增值服务费税率",width = 30)
+    private BigDecimal addedServiceTariff;
+
+//    @Excel(name  = "开票订单类型",replace = {"充电订单_1","购物订单_2","兑换订单_3","会员订单_4"},width = 30)
+//    private Integer orderType;
+
+    @Excel(name  = "抬头类型",replace = {"个人_1","企业_2"},width = 30)
+    private Integer invoicingObjectType;
+
+    @Excel(name  = "发票抬头",width = 30)
+    private String name;
+
+    @Excel(name  = "开户银行",width = 30)
+    private String depositBank;
+
+    @Excel(name  = "银行账户",width = 30)
+    private String bankAccount;
+
+    @Excel(name  = "公司电话",width = 30)
+    private String companyPhone;
+
+    @Excel(name  = "纳税识别号",width = 30)
+    private String taxIdentificationNumber;
+
+    @Excel(name  = "公司地址",width = 30)
+    private String companyAddress;
+
+    @Excel(name  = "邮箱",width = 30)
+    private String mailbox;
+
+    @Excel(name  = "状态",replace = {"待开票_1","开票中_2","已开票_3"},width = 30)
+    private Integer status;
+
+    @Excel(name  = "用户电话",width = 30)
+    private String userPhone;
+}
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TOrderInvoiceMapper.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TOrderInvoiceMapper.java
index 224b5dd..9a6fdad 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TOrderInvoiceMapper.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TOrderInvoiceMapper.java
@@ -1,8 +1,15 @@
 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.TOrderInvoice;
+import com.ruoyi.order.api.query.TOrderInvoiceQuery;
+import com.ruoyi.order.api.vo.TOrderInvoiceVO;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
 
 /**
  * <p>
@@ -15,4 +22,26 @@
 @Mapper
 public interface TOrderInvoiceMapper extends BaseMapper<TOrderInvoice> {
 
+    /**
+     * 发票分页查询
+     * @param query
+     * @param pageInfo
+     * @return
+     */
+    List<TOrderInvoiceVO> pageList(@Param("query") TOrderInvoiceQuery query, @Param("pageInfo")PageInfo<TOrderInvoiceVO> pageInfo);
+
+    /**
+     * 查询开票状态数量
+     * @param query
+     * @return
+     */
+    Map<String, Integer> statusCount(@Param("query")TOrderInvoiceQuery query);
+
+    /**
+     * 导出
+     * @param query
+     * @return
+     */
+    List<TOrderInvoiceVO> export(@Param("query")TOrderInvoiceQuery query);
+
 }
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TOrderInvoiceService.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TOrderInvoiceService.java
index d44196e..366df75 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TOrderInvoiceService.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TOrderInvoiceService.java
@@ -2,13 +2,17 @@
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.common.core.web.domain.AjaxResult;
+import com.ruoyi.common.core.web.page.PageInfo;
 import com.ruoyi.order.api.model.TOrderInvoice;
+import com.ruoyi.order.api.query.TOrderInvoiceQuery;
+import com.ruoyi.order.api.vo.TOrderInvoiceVO;
 import com.ruoyi.order.dto.AddOrderInvoice;
 import com.ruoyi.order.dto.GetOrderInvoiceList;
 import com.ruoyi.order.dto.MyOrderInvoiceInfo;
 import com.ruoyi.order.dto.OrderInvoiceList;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * <p>
@@ -43,4 +47,26 @@
 	 * @return
 	 */
 	MyOrderInvoiceInfo getMyOrderInvoiceInfo(String id);
+
+	/**
+	 * 查询开票分页列表
+	 * @param query
+	 * @return
+	 */
+	PageInfo<TOrderInvoiceVO> pageList(TOrderInvoiceQuery query);
+
+	/**
+	 * 查询开票状态数量
+	 * @param query
+	 * @return
+	 */
+	Map<String,Integer> statusCount(TOrderInvoiceQuery query);
+
+	/**
+	 * 发票管理导出
+	 * @param query
+	 * @return
+	 */
+	List<TOrderInvoiceVO> export(TOrderInvoiceQuery query);
+
 }
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderInvoiceServiceImpl.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderInvoiceServiceImpl.java
index 61431f4..fdb077d 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderInvoiceServiceImpl.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderInvoiceServiceImpl.java
@@ -4,17 +4,25 @@
 import com.alibaba.fastjson2.JSONArray;
 import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+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.SiteClient;
 import com.ruoyi.chargingPile.api.model.Site;
 import com.ruoyi.common.core.utils.StringUtils;
 import com.ruoyi.common.core.web.domain.AjaxResult;
+import com.ruoyi.common.core.web.page.PageInfo;
 import com.ruoyi.common.security.service.TokenService;
 import com.ruoyi.order.api.model.TChargingOrder;
 import com.ruoyi.order.api.model.TOrderInvoice;
 import com.ruoyi.order.api.model.TOrderInvoiceDetail;
 import com.ruoyi.order.api.model.TShoppingOrder;
+import com.ruoyi.order.api.query.TOrderInvoiceQuery;
+import com.ruoyi.order.api.vo.TOrderEvaluateVO;
+import com.ruoyi.order.api.vo.TOrderInvoiceVO;
 import com.ruoyi.order.dto.*;
 import com.ruoyi.order.mapper.TOrderInvoiceMapper;
 import com.ruoyi.order.service.TChargingOrderService;
@@ -30,6 +38,7 @@
 import io.seata.spring.annotation.GlobalTransactional;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
@@ -75,7 +84,9 @@
 	
 	@Resource
 	private CouponClient couponClient;
-	
+	@Resource
+	private AppUserClient appUserClient;
+
 	
 	
 	
@@ -228,4 +239,74 @@
 		}
 		return myOrderInvoiceInfo;
 	}
+
+	@Override
+	public PageInfo<TOrderInvoiceVO> pageList(TOrderInvoiceQuery query) {
+		// 查询申请用户
+		List<TAppUser> userList = appUserClient.selectByPhoneLike(query.getUserPhone()).getData();
+		if(CollectionUtils.isEmpty(userList)){
+			return new PageInfo<>();
+		}
+		query.setUserIds(userList.stream().map(TAppUser::getId).collect(Collectors.toList()));
+		PageInfo<TOrderInvoiceVO> pageInfo = new PageInfo<>(query.getPageCurr(),query.getPageSize());
+		List<TOrderInvoiceVO> list = this.baseMapper.pageList(query,pageInfo);
+
+		List<Long> ids = list.stream().map(TOrderInvoiceVO::getId).collect(Collectors.toList());
+
+		List<TOrderInvoiceDetail> orderInvoiceDetailList = orderInvoiceDetailService.list(new LambdaQueryWrapper<TOrderInvoiceDetail>()
+				.in(TOrderInvoiceDetail::getOrderInvoiceId, ids));
+
+		list.forEach(e->{
+			e.setServiceTariff(orderInvoiceDetailList.get(0).getServiceTariff());
+			e.setElectricityTariff(orderInvoiceDetailList.get(0).getElectricityTariff());
+			e.setAddedServiceTariff(orderInvoiceDetailList.get(0).getAddedServiceTariff());
+			e.setAddedService(orderInvoiceDetailList.stream().map(TOrderInvoiceDetail::getAddedService).reduce(BigDecimal::add).get());
+			e.setElectrovalence(orderInvoiceDetailList.stream().map(TOrderInvoiceDetail::getElectrovalence).reduce(BigDecimal::add).get());
+			e.setServiceCharge(orderInvoiceDetailList.stream().map(TOrderInvoiceDetail::getServiceCharge).reduce(BigDecimal::add).get());
+			e.setUserPhone(userList.stream().filter(m->m.getId().equals(Long.parseLong(e.getBillingUserId().toString()))).findFirst().get().getPhone());
+		});
+
+		pageInfo.setRecords(list);
+		return pageInfo;
+	}
+
+	@Override
+	public Map<String, Integer> statusCount(TOrderInvoiceQuery query) {
+		Map<String, Integer> map = new HashMap<>();
+		List<TAppUser> userList = appUserClient.selectByPhoneLike(query.getUserPhone()).getData();
+		if(CollectionUtils.isEmpty(userList)){
+			map.put("notAccepted",0);
+			map.put("processing",0);
+			map.put("finished",0);
+			return map;
+		}
+		query.setUserIds(userList.stream().map(TAppUser::getId).collect(Collectors.toList()));
+		map = this.baseMapper.statusCount(query);
+		return map;
+	}
+
+	@Override
+	public List<TOrderInvoiceVO> export(TOrderInvoiceQuery query) {
+		// 查询申请用户
+		List<TAppUser> userList = appUserClient.selectByPhoneLike(query.getUserPhone()).getData();
+		if(CollectionUtils.isEmpty(userList)){
+			return new ArrayList<>();
+		}
+		query.setUserIds(userList.stream().map(TAppUser::getId).collect(Collectors.toList()));
+		PageInfo<TOrderInvoiceVO> pageInfo = new PageInfo<>(query.getPageCurr(),query.getPageSize());
+		List<TOrderInvoiceVO> list = this.baseMapper.export(query);
+		List<Long> ids = list.stream().map(TOrderInvoiceVO::getId).collect(Collectors.toList());
+		List<TOrderInvoiceDetail> orderInvoiceDetailList = orderInvoiceDetailService.list(new LambdaQueryWrapper<TOrderInvoiceDetail>()
+				.in(TOrderInvoiceDetail::getOrderInvoiceId, ids));
+		list.forEach(e->{
+			e.setServiceTariff(orderInvoiceDetailList.get(0).getServiceTariff());
+			e.setElectricityTariff(orderInvoiceDetailList.get(0).getElectricityTariff());
+			e.setAddedServiceTariff(orderInvoiceDetailList.get(0).getAddedServiceTariff());
+			e.setAddedService(orderInvoiceDetailList.stream().map(TOrderInvoiceDetail::getAddedService).reduce(BigDecimal::add).get());
+			e.setElectrovalence(orderInvoiceDetailList.stream().map(TOrderInvoiceDetail::getElectrovalence).reduce(BigDecimal::add).get());
+			e.setServiceCharge(orderInvoiceDetailList.stream().map(TOrderInvoiceDetail::getServiceCharge).reduce(BigDecimal::add).get());
+			e.setUserPhone(userList.stream().filter(m->m.getId().equals(Long.parseLong(e.getBillingUserId().toString()))).findFirst().get().getPhone());
+		});
+		return list;
+	}
 }
diff --git a/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TOrderInvoiceDetailMapper.xml b/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TOrderInvoiceDetailMapper.xml
index b668acb..c9db30f 100644
--- a/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TOrderInvoiceDetailMapper.xml
+++ b/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TOrderInvoiceDetailMapper.xml
@@ -12,11 +12,14 @@
         <result column="electricity_tariff" property="electricityTariff" />
         <result column="service_tariff" property="serviceTariff" />
         <result column="added_service_tariff" property="addedServiceTariff" />
+        <result column="electrovalence" property="electrovalence" />
+        <result column="service_charge" property="serviceCharge" />
+        <result column="added_service" property="addedService" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, order_invoice_id, order_type, order_id, invoice_amount, electricity_tariff, service_tariff, added_service_tariff
+        id, order_invoice_id, order_type, order_id, invoice_amount, electricity_tariff, service_tariff, added_service_tariff,electrovalence,service_charge,added_service
     </sql>
 
 </mapper>
diff --git a/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TOrderInvoiceMapper.xml b/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TOrderInvoiceMapper.xml
index d7fddbe..c7fdb2d 100644
--- a/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TOrderInvoiceMapper.xml
+++ b/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TOrderInvoiceMapper.xml
@@ -33,5 +33,115 @@
     <sql id="Base_Column_List">
         id, code, app_user_id, order_type, invoicing_company, invoice_type_id, invoice_type, invoice_material, invoicing_method, invoicing_object_type, name, tax_identification_number, company_address, company_phone, deposit_bank, bank_account, total_amount, invoice_url, mailbox, status, create_time, billing_time, billing_user_id
     </sql>
+    <select id="pageList" resultType="com.ruoyi.order.api.vo.TOrderInvoiceVO">
+        select toi.id, toi.code, toi.app_user_id, toi.order_type, toi.invoicing_company, toi.invoice_type_id, toi.invoice_type, toi.invoice_material,
+               toi.invoicing_method, toi.invoicing_object_type, toi.name, toi.tax_identification_number, toi.company_address, toi.company_phone,
+               toi.deposit_bank, toi.bank_account, toi.total_amount, toi.invoice_url, toi.mailbox, toi.status, toi.create_time, toi.billing_time,
+               toi.billing_user_id
+        from t_order_invoice toi
+        <where>
+            <if test="query.invoicingCompany != null and query.invoicingCompany != ''">
+                AND toi.invoicing_company LIKE concat('%',#{query.invoicingCompany},'%')
+            </if>
+            <if test="query.invoiceType != null and query.invoiceType != ''">
+                AND toi.invoice_type LIKE concat('%',#{query.invoiceType},'%')
+            </if>
+            <if test="query.invoicingObjectType != null">
+                AND toi.invoicing_object_type = #{query.invoicingObjectType}
+            </if>
+            <if test="query.invoiceMaterial != null">
+                AND toi.invoice_material = #{query.invoiceMaterial}
+            </if>
+            <if test="query.invoicingMethod != null">
+                AND toi.invoicing_method = #{query.invoicingMethod}
+            </if>
+            <if test="query.name != null and query.name != ''">
+                AND toi.name LIKE concat('%',#{query.name},'%')
+            </if>
+            <if test="query.startTime != null and query.startTime != '' and query.endTime != null and query.endTime != ''">
+                AND toi.billing_time BETWEEN #{query.startTime} AND #{query.endTime}
+            </if>
+            <if test="query.userIds != null and query.userIds.size()>0">
+                AND toi.billing_user_id IN
+                <foreach collection="query.userIds" close=")" open="(" item="userId" separator=",">
+                    #{userId}
+                </foreach>
+            </if>
+        </where>
+        ORDER BY toi.billing_time DESC
+    </select>
+    <select id="statusCount" resultType="java.util.Map">
+        select
+            COUNT(CASE WHEN status = 1 THEN 1 END) AS `notAccepted`,
+            COUNT(CASE WHEN status = 2 THEN 1 END) AS `processing`,
+            COUNT(CASE WHEN status = 3 THEN 1 END) AS `finished`
+        from t_order_invoice toi
+        <where>
+            <if test="query.invoicingCompany != null and query.invoicingCompany != ''">
+                AND toi.invoicing_company LIKE concat('%',#{query.invoicingCompany},'%')
+            </if>
+            <if test="query.invoiceType != null and query.invoiceType != ''">
+                AND toi.invoice_type LIKE concat('%',#{query.invoiceType},'%')
+            </if>
+            <if test="query.invoicingObjectType != null">
+                AND toi.invoicing_object_type = #{query.invoicingObjectType}
+            </if>
+            <if test="query.invoiceMaterial != null">
+                AND toi.invoice_material = #{query.invoiceMaterial}
+            </if>
+            <if test="query.invoicingMethod != null">
+                AND toi.invoicing_method = #{query.invoicingMethod}
+            </if>
+            <if test="query.name != null and query.name != ''">
+                AND toi.name LIKE concat('%',#{query.name},'%')
+            </if>
+            <if test="query.startTime != null and query.startTime != '' and query.endTime != null and query.endTime != ''">
+                AND toi.billing_time BETWEEN #{query.startTime} AND #{query.endTime}
+            </if>
+            <if test="query.userIds != null and query.userIds.size()>0">
+                AND toi.billing_user_id IN
+                <foreach collection="query.userIds" close=")" open="(" item="userId" separator=",">
+                    #{userId}
+                </foreach>
+            </if>
+        </where>
+    </select>
+    <select id="export" resultType="com.ruoyi.order.api.vo.TOrderInvoiceVO">
+        select toi.id, toi.code, toi.app_user_id, toi.order_type, toi.invoicing_company, toi.invoice_type_id, toi.invoice_type, toi.invoice_material,
+        toi.invoicing_method, toi.invoicing_object_type, toi.name, toi.tax_identification_number, toi.company_address, toi.company_phone,
+        toi.deposit_bank, toi.bank_account, toi.total_amount, toi.invoice_url, toi.mailbox, toi.status, toi.create_time, toi.billing_time,
+        toi.billing_user_id
+        from t_order_invoice toi
+        <where>
+            <if test="query.invoicingCompany != null and query.invoicingCompany != ''">
+                AND toi.invoicing_company LIKE concat('%',#{query.invoicingCompany},'%')
+            </if>
+            <if test="query.invoiceType != null and query.invoiceType != ''">
+                AND toi.invoice_type LIKE concat('%',#{query.invoiceType},'%')
+            </if>
+            <if test="query.invoicingObjectType != null">
+                AND toi.invoicing_object_type = #{query.invoicingObjectType}
+            </if>
+            <if test="query.invoiceMaterial != null">
+                AND toi.invoice_material = #{query.invoiceMaterial}
+            </if>
+            <if test="query.invoicingMethod != null">
+                AND toi.invoicing_method = #{query.invoicingMethod}
+            </if>
+            <if test="query.name != null and query.name != ''">
+                AND toi.name LIKE concat('%',#{query.name},'%')
+            </if>
+            <if test="query.startTime != null and query.startTime != '' and query.endTime != null and query.endTime != ''">
+                AND toi.billing_time BETWEEN #{query.startTime} AND #{query.endTime}
+            </if>
+            <if test="query.userIds != null and query.userIds.size()>0">
+                AND toi.billing_user_id IN
+                <foreach collection="query.userIds" close=")" open="(" item="userId" separator=",">
+                    #{userId}
+                </foreach>
+            </if>
+        </where>
+        ORDER BY toi.billing_time DESC
+    </select>
 
 </mapper>

--
Gitblit v1.7.1