Files
mp-java/docs/bszx/service/impl/BszxPayServiceImpl.java
2025-08-09 17:18:30 +08:00

170 lines
6.5 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.gxwebsoft.bszx.service.impl;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.freewayso.image.combiner.ImageCombiner;
import com.freewayso.image.combiner.enums.OutputFormat;
import com.gxwebsoft.bszx.entity.BszxBm;
import com.gxwebsoft.bszx.mapper.BszxPayMapper;
import com.gxwebsoft.bszx.service.BszxBmService;
import com.gxwebsoft.bszx.service.BszxPayService;
import com.gxwebsoft.bszx.entity.BszxPay;
import com.gxwebsoft.bszx.param.BszxPayParam;
import com.gxwebsoft.cms.entity.CmsArticle;
import com.gxwebsoft.cms.service.CmsArticleService;
import com.gxwebsoft.common.core.utils.ImageUtil;
import com.gxwebsoft.common.core.web.PageParam;
import com.gxwebsoft.common.core.web.PageResult;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.io.File;
import java.math.BigDecimal;
import java.util.List;
/**
* 百色中学-捐款记录Service实现
*
* @author 科技小王子
* @since 2025-03-06 22:50:25
*/
@Service
public class BszxPayServiceImpl extends ServiceImpl<BszxPayMapper, BszxPay> implements BszxPayService {
@Value("${config.upload-path}")
private String uploadPath;
@Value("${config.file-server}")
private String fileServer;
@Resource
private CmsArticleService cmsArticleService;
@Resource
public BszxBmService bszxBmService;
@Resource
private BszxPayService bszxPayService;
@Override
public PageResult<BszxPay> pageRel(BszxPayParam param) {
PageParam<BszxPay, BszxPayParam> page = new PageParam<>(param);
page.setDefaultOrder("price desc, create_time desc");
List<BszxPay> list = baseMapper.selectPageRel(page, param);
list.forEach(item -> {
if(item.getId().equals(2088)){
item.setFormName("捐款用于设立阙里校友奖学金");
}
});
return new PageResult<>(list, page.getTotal());
}
@Override
public List<BszxPay> listRel(BszxPayParam param) {
List<BszxPay> list = baseMapper.selectListRel(param);
// 排序
PageParam<BszxPay, BszxPayParam> page = new PageParam<>();
page.setDefaultOrder("id desc");
return page.sortRecords(list);
}
@Override
public BszxPay getByIdRel(Integer id) {
BszxPayParam param = new BszxPayParam();
param.setId(id);
final BszxPay item = param.getOne(baseMapper.selectListRel(param));
final CmsArticle article = cmsArticleService.getById(item.getFormId());
if (ObjectUtil.isNotEmpty(article)) {
item.setArticle(article);
}
return item;
}
/**
* 生成捐款证书 <a href="https://portrait.gitee.com/sGodT/image-combiner">...</a>
*/
@Override
public String generatePayCert(Integer id) throws Exception {
final BszxPay payCert = getByIdRel(id);
final CmsArticle item = cmsArticleService.getById(payCert.getFormId());
final BszxBm bm = bszxBmService.getOne(new LambdaQueryWrapper<BszxBm>().eq(BszxBm::getUserId, payCert.getUserId()).last("limit 1"));
final BigDecimal totalMoney = bszxPayService.sumMoney(new LambdaQueryWrapper<BszxPay>().eq(BszxPay::getUserId, payCert.getUserId()));
if (StrUtil.isBlank(item.getAddress())) {
return null;
}
if (ObjectUtil.isNotEmpty(payCert)) {
//合成器(指定背景图和输出格式,整个图片的宽高和相关计算依赖于背景图,所以背景图的大小是个基准)
ImageCombiner combiner = new ImageCombiner("https://oss.wsdns.cn/20250420/811a380e8e124097aa0940a7c68a1f72.jpeg", OutputFormat.JPG);
//加图片元素:盖章
// combiner.addImageElement("https://oss.wsdns.cn/20250304/6936b109b09b4919a3498ac5027e728b.png", 550, 926);
//加文本元素:姓名
String str;
if (bm.getType().equals(0)) {
str = bm.getName().concat(" 校友");
combiner.addTextElement(str, 32, 930, 450);
} else {
str = bm.getName();
combiner.addTextElement(str, 22, 880, 450);
}
// combiner.addTextElement(bm.getName(), 32,900, 450);
//加文本元素:捐款证书内容
// combiner.addTextElement(" 承您慷慨解囊,襄助百色市百色中学", 32,200, 650);
// combiner.addTextElement("百廿校庆“" + item.getTitle() + "”项目,捐赠人民币", 32,200, 700);
combiner.addTextElement(totalMoney + "", 32, 1330, 600);
// combiner.addTextElement(" 您对学校的支持,为我们共同教育理", 32,200, 800);
// combiner.addTextElement("想的实现增添了一份动力。", 32,200, 850);
// combiner.addTextElement(" 承蒙惠赠,隆情铭感,特颁此证,以资谢旌!", 32, 200, 900);
// combiner.addTextElement("百色市百色中学", 32,560, 1015);
// final Date createTime = payCert.getCreateTime();
// combiner.addTextElement(DateUtil.format(createTime, "yyyy年MM月"), 28,586, 1060);
// combiner.addTextElement("2025年4月15日", 28,580, 1060);
//执行图片合并
combiner.combine();
if (!FileUtil.exist(uploadPath + "/file/poster/" + payCert.getTenantId() + "/pay")) {
FileUtil.mkdir(uploadPath + "/file/poster/" + payCert.getTenantId() + "/pay");
}
String basePath = "/poster/" + payCert.getTenantId() + "/pay/big-" + id + ".jpg";
String smallPath = "/poster/" + payCert.getTenantId() + "/pay/" + id + ".jpg";
String filename = uploadPath + "/file" + basePath;
String smallFileName = uploadPath + "/file" + smallPath;
combiner.save(filename);
File input = new File(filename);
File output = new File(smallFileName);
ImageUtil.adjustQuality(input, output, 0.8f);
if (input.exists()) {
input.delete();
}
return fileServer + smallPath + "?r=" + RandomUtil.randomNumbers(4);
}
return null;
}
@Override
public BigDecimal sumMoney(LambdaQueryWrapper<BszxPay> wrapper) {
return baseMapper.selectSumMoney(wrapper);
}
@Override
public BigDecimal total() {
try {
// 使用数据库聚合查询统计捐款总金额,性能更高
LambdaQueryWrapper<BszxPay> wrapper = new LambdaQueryWrapper<>();
BigDecimal total = baseMapper.selectSumMoney(wrapper);
if (total == null) {
total = BigDecimal.ZERO;
}
return total;
} catch (Exception e) {
// 异常时返回0确保接口稳定性
return BigDecimal.ZERO;
}
}
}