fileResult = remoteFileService.upload(multipartFile);
+ String url = fileResult.getData().getUrl();
+ log.info("qr code file: {}", url);
+
+
String subject = mailProperties.getSubject();
if (StrUtil.isBlank(subject)) {
subject = "Your WANFI Verification Code";
}
- MailUtils.sendHtml(email, subject, htmlStr);
+// MailUtils.sendHtml(email, subject, htmlStr, uploadFile);
+
+// FileUtil.del(uploadFile);
} catch (Exception e) {
log.error("email verification code send failed => {}", e.getMessage());
return R.fail(e.getMessage());
diff --git a/wfc-modules/wfc-user/src/main/java/org/wfc/user/domain/UBill.java b/wfc-modules/wfc-user/src/main/java/org/wfc/user/domain/UBill.java
index 6d02884..39998f1 100644
--- a/wfc-modules/wfc-user/src/main/java/org/wfc/user/domain/UBill.java
+++ b/wfc-modules/wfc-user/src/main/java/org/wfc/user/domain/UBill.java
@@ -1,12 +1,12 @@
package org.wfc.user.domain;
import com.baomidou.mybatisplus.annotation.TableName;
-import java.io.Serializable;
-import java.math.BigDecimal;
-import org.wfc.common.mybatis.domain.BaseData;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
+import org.wfc.common.mybatis.domain.BaseData;
+
+import java.math.BigDecimal;
/**
*
@@ -38,4 +38,10 @@ public class UBill extends BaseData {
@Schema(description = "状态")
private Integer status;
+
+ @Schema(description = "发票编号")
+ private String invoiceNumber;
+
+ @Schema(description = "发票文件")
+ private String invoiceFile;
}
diff --git a/wfc-modules/wfc-user/src/main/java/org/wfc/user/domain/bo/UInvoiceTemplateBo.java b/wfc-modules/wfc-user/src/main/java/org/wfc/user/domain/bo/UInvoiceTemplateBo.java
new file mode 100644
index 0000000..c0be0b5
--- /dev/null
+++ b/wfc-modules/wfc-user/src/main/java/org/wfc/user/domain/bo/UInvoiceTemplateBo.java
@@ -0,0 +1,40 @@
+package org.wfc.user.domain.bo;
+
+import lombok.Data;
+
+/**
+ * @description: 发票模板bo
+ * @author: cyc
+ * @since: 2025-06-06
+ */
+@Data
+public class UInvoiceTemplateBo {
+
+ private String username;
+
+ private String email;
+
+ private String invoiceNumber;
+
+ private String invoiceDate;
+
+ private String itemName;
+
+ private String qty;
+
+ private String unitPrice;
+
+ private String total;
+
+ private String currency;
+
+ private boolean hasDetails;
+
+ private String traffic;
+
+ private String speedCap;
+
+ private String clientsNumber;
+
+ private String billingCycle;
+}
diff --git a/wfc-modules/wfc-user/src/main/java/org/wfc/user/domain/constant/OrderTypeEnum.java b/wfc-modules/wfc-user/src/main/java/org/wfc/user/domain/constant/OrderTypeEnum.java
index b043770..0dd59dc 100644
--- a/wfc-modules/wfc-user/src/main/java/org/wfc/user/domain/constant/OrderTypeEnum.java
+++ b/wfc-modules/wfc-user/src/main/java/org/wfc/user/domain/constant/OrderTypeEnum.java
@@ -12,8 +12,8 @@ import lombok.Getter;
@AllArgsConstructor
public enum OrderTypeEnum {
- PACKAGE(0, "套餐"),
- RECHARGE(1, "充值");
+ PACKAGE(0, "Package"),
+ RECHARGE(1, "Recharge");
private final Integer code;
private final String desc;
diff --git a/wfc-modules/wfc-user/src/main/java/org/wfc/user/domain/constant/PeriodTypeEnum.java b/wfc-modules/wfc-user/src/main/java/org/wfc/user/domain/constant/PeriodTypeEnum.java
index b2b8319..ec0abc6 100644
--- a/wfc-modules/wfc-user/src/main/java/org/wfc/user/domain/constant/PeriodTypeEnum.java
+++ b/wfc-modules/wfc-user/src/main/java/org/wfc/user/domain/constant/PeriodTypeEnum.java
@@ -12,10 +12,10 @@ import lombok.Getter;
@AllArgsConstructor
public enum PeriodTypeEnum {
- HOUR(0, "小时"),
- DAY(1, "天"),
- MONTH(2, "月"),
- YEAR(3, "年")
+ HOUR(0, "Hour"),
+ DAY(1, "Day"),
+ MONTH(2, "Month"),
+ YEAR(3, "Year")
;
private final Integer code;
diff --git a/wfc-modules/wfc-user/src/main/java/org/wfc/user/service/IUBillService.java b/wfc-modules/wfc-user/src/main/java/org/wfc/user/service/IUBillService.java
index 6aacce3..e64483a 100644
--- a/wfc-modules/wfc-user/src/main/java/org/wfc/user/service/IUBillService.java
+++ b/wfc-modules/wfc-user/src/main/java/org/wfc/user/service/IUBillService.java
@@ -2,7 +2,10 @@ package org.wfc.user.service;
import com.baomidou.mybatisplus.extension.service.IService;
import org.wfc.user.domain.UBill;
+import org.wfc.user.domain.UOrder;
import org.wfc.user.domain.vo.UBillUserVo;
+import org.wfc.user.domain.vo.UInvoiceBillVo;
+import org.wfc.user.domain.vo.UInvoiceGenVo;
import java.util.List;
@@ -20,4 +23,5 @@ public interface IUBillService extends IService {
List getInvoiceByUser();
+ UInvoiceGenVo genInvoice(UOrder order);
}
diff --git a/wfc-modules/wfc-user/src/main/java/org/wfc/user/service/impl/UBillServiceImpl.java b/wfc-modules/wfc-user/src/main/java/org/wfc/user/service/impl/UBillServiceImpl.java
index 8c35169..9270f9a 100644
--- a/wfc-modules/wfc-user/src/main/java/org/wfc/user/service/impl/UBillServiceImpl.java
+++ b/wfc-modules/wfc-user/src/main/java/org/wfc/user/service/impl/UBillServiceImpl.java
@@ -1,15 +1,62 @@
package org.wfc.user.service.impl;
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.itextpdf.html2pdf.ConverterProperties;
+import com.itextpdf.html2pdf.HtmlConverter;
+import com.itextpdf.layout.font.FontProvider;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.math.NumberUtils;
import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+import org.thymeleaf.TemplateEngine;
+import org.thymeleaf.context.Context;
+import org.wfc.common.core.constant.CacheConstants;
import org.wfc.common.core.domain.LoginUser;
+import org.wfc.common.core.domain.R;
+import org.wfc.common.core.exception.ServiceException;
+import org.wfc.common.core.utils.file.MultipartFileUtil;
+import org.wfc.common.mail.config.properties.MailProperties;
+import org.wfc.common.mail.utils.MailUtils;
+import org.wfc.common.mybatis.domain.BaseData;
+import org.wfc.common.redis.service.RedisService;
import org.wfc.common.security.utils.SecurityUtils;
+import org.wfc.system.api.RemoteFileService;
+import org.wfc.system.api.domain.SysFile;
+import org.wfc.user.api.domain.UUser;
+import org.wfc.user.domain.InvoiceBean;
import org.wfc.user.domain.UBill;
+import org.wfc.user.domain.UOrder;
+import org.wfc.user.domain.UPackage;
+import org.wfc.user.domain.URateLimit;
+import org.wfc.user.domain.bo.UInvoiceTemplateBo;
+import org.wfc.user.domain.constant.OrderTypeEnum;
+import org.wfc.user.domain.constant.PeriodTypeEnum;
import org.wfc.user.domain.vo.UBillUserVo;
+import org.wfc.user.domain.vo.UInvoiceBillVo;
+import org.wfc.user.domain.vo.UInvoiceGenVo;
import org.wfc.user.mapper.UBillMapper;
+import org.wfc.user.mapper.UPackageMapper;
+import org.wfc.user.mapper.URateLimitMapper;
+import org.wfc.user.mapper.UUserMapper;
import org.wfc.user.service.IUBillService;
+import org.wfc.user.util.TrafficConverter;
+import java.io.File;
+import java.io.IOException;
+import java.math.RoundingMode;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Collections;
import java.util.List;
+import java.util.Map;
/**
*
@@ -19,12 +66,186 @@ import java.util.List;
* @author sys
* @since 2025-01-06
*/
+@Slf4j
@Service
+@RequiredArgsConstructor
public class UBillServiceImpl extends ServiceImpl implements IUBillService {
+ private final MailProperties mailProperties;
+ private final TemplateEngine templateEngine;
+ private final RemoteFileService remoteFileService;
+ private final UUserMapper userMapper;
+ private final RedisService redisService;
+ private final UPackageMapper packageMapper;
+ private final URateLimitMapper urateLimitMapper;
+ private final InvoiceBean invoiceBean;
+
+ public static final String PRE_INVOICE_NUMBER = "INV-";
+ public static final String LAST_INVOICE_NUMBER = "-001";
+ private static final String DEFAULT_SYS_PAY_CURRENCY_VALUE = "USD";
+ private static final String DEFAULT_SYS_PAY_CURRENCY_SYMBOL_VALUE = "$";
+
+
@Override
public List getBillByUser() {
LoginUser