|
@ -0,0 +1,350 @@ |
|
|
|
|
|
package org.jeecg.api.service.impl; |
|
|
|
|
|
|
|
|
|
|
|
import com.alibaba.fastjson.JSON; |
|
|
|
|
|
import com.alibaba.fastjson.TypeReference; |
|
|
|
|
|
import com.baomidou.mybatisplus.core.metadata.IPage; |
|
|
|
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
|
|
|
|
|
import org.apache.commons.lang3.StringUtils; |
|
|
|
|
|
import org.jeecg.api.bean.FansPageBean; |
|
|
|
|
|
import org.jeecg.api.bean.PageBean; |
|
|
|
|
|
import org.jeecg.api.bean.WxQrCodeVo; |
|
|
|
|
|
import org.jeecg.api.service.AppletPromotionService; |
|
|
|
|
|
import org.jeecg.api.wxUtils.HttpClientUtil; |
|
|
|
|
|
import org.jeecg.common.api.vo.Result; |
|
|
|
|
|
import org.jeecg.config.shiro.ShiroRealm; |
|
|
|
|
|
import org.jeecg.modules.commonConfig.entity.CommonConfig; |
|
|
|
|
|
import org.jeecg.modules.commonConfig.service.ICommonConfigService; |
|
|
|
|
|
import org.jeecg.modules.commonOrder.entity.CommonOrder; |
|
|
|
|
|
import org.jeecg.modules.commonOrder.service.ICommonOrderService; |
|
|
|
|
|
import org.jeecg.modules.commonPromotion.entity.CommonPromotion; |
|
|
|
|
|
import org.jeecg.modules.commonPromotion.service.ICommonPromotionService; |
|
|
|
|
|
import org.jeecg.modules.commonText.entity.CommonText; |
|
|
|
|
|
import org.jeecg.modules.hanHaiMember.entity.HanHaiMember; |
|
|
|
|
|
import org.jeecg.modules.hanHaiMember.service.IHanHaiMemberService; |
|
|
|
|
|
import org.springframework.http.HttpMethod; |
|
|
|
|
|
import org.springframework.http.ResponseEntity; |
|
|
|
|
|
import org.springframework.stereotype.Service; |
|
|
|
|
|
import org.springframework.util.LinkedMultiValueMap; |
|
|
|
|
|
import org.springframework.util.MultiValueMap; |
|
|
|
|
|
import org.springframework.web.client.RestTemplate; |
|
|
|
|
|
|
|
|
|
|
|
import javax.annotation.Resource; |
|
|
|
|
|
import javax.imageio.ImageIO; |
|
|
|
|
|
import java.awt.*; |
|
|
|
|
|
import java.awt.image.BufferedImage; |
|
|
|
|
|
import java.io.ByteArrayInputStream; |
|
|
|
|
|
import java.io.File; |
|
|
|
|
|
import java.math.BigDecimal; |
|
|
|
|
|
import java.net.URL; |
|
|
|
|
|
import java.nio.file.Files; |
|
|
|
|
|
import java.util.*; |
|
|
|
|
|
import java.util.List; |
|
|
|
|
|
|
|
|
|
|
|
@Service |
|
|
|
|
|
public class AppletPromotionServiceImpl implements AppletPromotionService { |
|
|
|
|
|
|
|
|
|
|
|
//权限 |
|
|
|
|
|
@Resource |
|
|
|
|
|
private ShiroRealm shiroRealm; |
|
|
|
|
|
@Resource |
|
|
|
|
|
private IHanHaiMemberService hanHaiMemberService; |
|
|
|
|
|
@Resource |
|
|
|
|
|
private ICommonPromotionService commonPromotionService; |
|
|
|
|
|
@Resource |
|
|
|
|
|
private ICommonConfigService commonConfigService; |
|
|
|
|
|
@Resource |
|
|
|
|
|
private ICommonOrderService commonOrderService; |
|
|
|
|
|
|
|
|
|
|
|
//获取推广排行榜单带分页 |
|
|
|
|
|
@Override |
|
|
|
|
|
public Result<?> getRankList(PageBean pageBean){ |
|
|
|
|
|
IPage<HanHaiMember> page = new Page<>(pageBean.getPageNo(), pageBean.getPageSize()); |
|
|
|
|
|
IPage<HanHaiMember> pageList = hanHaiMemberService |
|
|
|
|
|
.lambdaQuery() |
|
|
|
|
|
.page(page); |
|
|
|
|
|
return Result.OK("推广排行榜单",pageList); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
//我的推广官申请表单信息 |
|
|
|
|
|
@Override |
|
|
|
|
|
public Result<?> getMyPromotionInfo(String token){ |
|
|
|
|
|
HanHaiMember member = shiroRealm.checkUserTokenIsEffectHanHaiOpenId(token); |
|
|
|
|
|
CommonPromotion one = commonPromotionService.lambdaQuery() |
|
|
|
|
|
.eq(CommonPromotion::getUserId, member.getId()) |
|
|
|
|
|
.one(); |
|
|
|
|
|
return Result.OK("我的推广官申请表单信息",one); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
//提交申请成为推广官 |
|
|
|
|
|
@Override |
|
|
|
|
|
public Result<?> apply(String token, CommonPromotion commonPromotion){ |
|
|
|
|
|
HanHaiMember member = shiroRealm.checkUserTokenIsEffectHanHaiOpenId(token); |
|
|
|
|
|
CommonPromotion one = commonPromotionService.lambdaQuery() |
|
|
|
|
|
.eq(CommonPromotion::getUserId, member.getId()) |
|
|
|
|
|
.one(); |
|
|
|
|
|
if(one != null){ |
|
|
|
|
|
return Result.error("您已提交过申请"); |
|
|
|
|
|
} |
|
|
|
|
|
commonPromotion.setStatus(0); |
|
|
|
|
|
commonPromotion.setCreateTime(new Date()); |
|
|
|
|
|
commonPromotion.setUserId(member.getId()); |
|
|
|
|
|
commonPromotionService.save(commonPromotion); |
|
|
|
|
|
return Result.OK("提交成功"); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
//获取推广二维码 2 |
|
|
|
|
|
@Override |
|
|
|
|
|
public byte[] getInviteCode2(String token){ |
|
|
|
|
|
HanHaiMember member = shiroRealm.checkUserTokenIsEffectHanHaiOpenId(token); |
|
|
|
|
|
|
|
|
|
|
|
// 获取环境配置 |
|
|
|
|
|
CommonConfig vsion = commonConfigService.lambdaQuery() |
|
|
|
|
|
.eq(CommonConfig::getKeyName, "v_sion") |
|
|
|
|
|
.one(); |
|
|
|
|
|
Integer vsionStr = Integer.parseInt(vsion.getKeyContent()); |
|
|
|
|
|
String trial = "release"; |
|
|
|
|
|
if(vsionStr == 0){ |
|
|
|
|
|
trial= "release"; |
|
|
|
|
|
}else if(vsionStr == 1){ |
|
|
|
|
|
trial= "trial"; |
|
|
|
|
|
}else{ |
|
|
|
|
|
trial= "develop"; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 获取必要的配置信息 |
|
|
|
|
|
CommonConfig xcxSharePage = commonConfigService.lambdaQuery() |
|
|
|
|
|
.eq(CommonConfig::getKeyName, "xcxSharePage") |
|
|
|
|
|
.one(); |
|
|
|
|
|
|
|
|
|
|
|
CommonConfig oneImage = commonConfigService.lambdaQuery() |
|
|
|
|
|
.eq(CommonConfig::getKeyName, "codeImg") |
|
|
|
|
|
.one(); |
|
|
|
|
|
|
|
|
|
|
|
CommonConfig qr_code = commonConfigService.lambdaQuery() |
|
|
|
|
|
.eq(CommonConfig::getKeyName, "qr_code") |
|
|
|
|
|
.one(); |
|
|
|
|
|
|
|
|
|
|
|
CommonConfig image_go_url = commonConfigService.lambdaQuery() |
|
|
|
|
|
.eq(CommonConfig::getKeyName, "image_go_url") |
|
|
|
|
|
.one(); |
|
|
|
|
|
|
|
|
|
|
|
String backgroundImageUrl = qr_code.getKeyContent(); |
|
|
|
|
|
|
|
|
|
|
|
// 尝试从缓存获取二维码 |
|
|
|
|
|
String cacheKey = "CodeImage::" + trial + member.getId(); |
|
|
|
|
|
WxQrCodeVo wxCodeVo = new WxQrCodeVo(); |
|
|
|
|
|
|
|
|
|
|
|
wxCodeVo.setName("爱回收欢迎您"); |
|
|
|
|
|
|
|
|
|
|
|
// 如果启用了Redis缓存,可以取消下面注释 |
|
|
|
|
|
// String cachedQrCode = (String) redisUtil.get(cacheKey); |
|
|
|
|
|
// if(cachedQrCode != null){ |
|
|
|
|
|
// String combinedImageUrl = this.generateAndCombineImagesFromUrl(cachedQrCode, backgroundImageUrl, "combined_image_code"); |
|
|
|
|
|
// wxCodeVo.setUrl(combinedImageUrl); |
|
|
|
|
|
// return Result.OK(wxCodeVo); |
|
|
|
|
|
// } |
|
|
|
|
|
|
|
|
|
|
|
try { |
|
|
|
|
|
|
|
|
|
|
|
// 准备微信API请求参数 |
|
|
|
|
|
String key = "shareId=" + member.getId(); |
|
|
|
|
|
Map<String, Object> param = new HashMap<>(); |
|
|
|
|
|
param.put("path", xcxSharePage.getKeyContent() + "?" + key); |
|
|
|
|
|
param.put("scene", member.getId()); |
|
|
|
|
|
param.put("width", 150); |
|
|
|
|
|
param.put("auto_color", false); |
|
|
|
|
|
param.put("env_version", trial); |
|
|
|
|
|
|
|
|
|
|
|
// Map<String, Object> line_color = new HashMap<>(); |
|
|
|
|
|
// line_color.put("r", 0); |
|
|
|
|
|
// line_color.put("g", 0); |
|
|
|
|
|
// line_color.put("b", 0); |
|
|
|
|
|
// param.put("line_color", line_color); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
param.put("is_hyaline", true); |
|
|
|
|
|
|
|
|
|
|
|
// 获取微信小程序码 |
|
|
|
|
|
String accessToken = this.getAccessToken(); |
|
|
|
|
|
String url = "https://api.weixin.qq.com/wxa/getwxacode?access_token=" + accessToken; |
|
|
|
|
|
|
|
|
|
|
|
// 请求微信API获取二维码图片数据 |
|
|
|
|
|
RestTemplate rest = new RestTemplate(); |
|
|
|
|
|
MultiValueMap<String, String> headers = new LinkedMultiValueMap<>(); |
|
|
|
|
|
org.springframework.http.HttpEntity requestEntity = new org.springframework.http.HttpEntity(JSON.toJSONString(param), headers); |
|
|
|
|
|
ResponseEntity<byte[]> entity = rest.exchange(url, HttpMethod.POST, requestEntity, byte[].class, new Object[0]); |
|
|
|
|
|
byte[] qrCodeBytes = entity.getBody(); |
|
|
|
|
|
|
|
|
|
|
|
// 直接将二维码图片转为MultipartFile,避免写入临时文件 |
|
|
|
|
|
// MultipartFile qrCodeFile = createMultipartFile(qrCodeBytes, "qrcode.jpg"); |
|
|
|
|
|
|
|
|
|
|
|
// 上传二维码到阿里云并获取URL |
|
|
|
|
|
// String qrCodeImageUrl = image_go_url.getKeyContent() + this.uploadAliYunOss(qrCodeFile); |
|
|
|
|
|
|
|
|
|
|
|
// 合并图片并上传 |
|
|
|
|
|
// String combinedImageUrl = this.generateAndCombineImagesFromUrl2(qrCodeBytes, backgroundImageUrl); |
|
|
|
|
|
|
|
|
|
|
|
// 设置返回数据 |
|
|
|
|
|
|
|
|
|
|
|
// 如果启用了Redis缓存,可以取消下面注释 |
|
|
|
|
|
//redisUtil.set(cacheKey, qrCodeImageUrl, 3600); // 缓存一小时 |
|
|
|
|
|
|
|
|
|
|
|
return this.generateAndCombineImagesFromUrl2(qrCodeBytes, backgroundImageUrl); |
|
|
|
|
|
} catch (Exception e) { |
|
|
|
|
|
e.printStackTrace(); |
|
|
|
|
|
|
|
|
|
|
|
return null; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public byte[] generateAndCombineImagesFromUrl2(byte[] qrCodeImageByte, String backgroundUrl) { |
|
|
|
|
|
File file = null; |
|
|
|
|
|
try { |
|
|
|
|
|
// 从字节数组加载小程序码图像 |
|
|
|
|
|
BufferedImage qrCodeImage = ImageIO.read(new ByteArrayInputStream(qrCodeImageByte)); |
|
|
|
|
|
|
|
|
|
|
|
// 从URL加载背景图像 |
|
|
|
|
|
URL backgroundImageUrl = new URL(backgroundUrl); |
|
|
|
|
|
BufferedImage backgroundImage = ImageIO.read(backgroundImageUrl); |
|
|
|
|
|
|
|
|
|
|
|
// 创建一个新的BufferedImage来保存合并后的图像 |
|
|
|
|
|
Graphics2D g2d = backgroundImage.createGraphics(); |
|
|
|
|
|
|
|
|
|
|
|
int wh = backgroundImage.getWidth() / 3; |
|
|
|
|
|
|
|
|
|
|
|
// 计算小程序码放置的位置(这里以中心位置为例) |
|
|
|
|
|
int qrCodeX = (backgroundImage.getWidth() - wh) / 2; |
|
|
|
|
|
int qrCodeY = (int) ((backgroundImage.getHeight() - wh) * 0.6); |
|
|
|
|
|
|
|
|
|
|
|
// 绘制小程序码图像 |
|
|
|
|
|
g2d.drawImage(qrCodeImage, qrCodeX, qrCodeY, wh, wh, null); |
|
|
|
|
|
|
|
|
|
|
|
// 释放Graphics2D资源 |
|
|
|
|
|
g2d.dispose(); |
|
|
|
|
|
|
|
|
|
|
|
// 将合并后的图像保存到临时文件 |
|
|
|
|
|
file = File.createTempFile("combined_", ".png"); |
|
|
|
|
|
ImageIO.write(backgroundImage, "png", file); |
|
|
|
|
|
|
|
|
|
|
|
// 上传到阿里云OSS |
|
|
|
|
|
// return this.uploadAliYunOss(Files.readAllBytes(file.toPath()), file.getName()); |
|
|
|
|
|
return Files.readAllBytes(file.toPath()); |
|
|
|
|
|
} catch (Exception e) { |
|
|
|
|
|
|
|
|
|
|
|
throw new RuntimeException("生成合并图片失败", e); |
|
|
|
|
|
} finally { |
|
|
|
|
|
// 删除临时文件 |
|
|
|
|
|
if (file != null && file.exists()) { |
|
|
|
|
|
file.delete(); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private String appid = "wx2bd656ae9704dbee"; |
|
|
|
|
|
|
|
|
|
|
|
private String secret = "b07f82b16e9598bc23de604f49c57e23"; |
|
|
|
|
|
/** |
|
|
|
|
|
* 获取令牌 |
|
|
|
|
|
* |
|
|
|
|
|
* @return |
|
|
|
|
|
*/ |
|
|
|
|
|
private String getAccessToken() { |
|
|
|
|
|
String requestUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appid + "&secret=" + secret; |
|
|
|
|
|
String doGet2 = HttpClientUtil.doGet2(requestUrl); |
|
|
|
|
|
Map<String, String> map = JSON.parseObject(doGet2, new TypeReference<Map<String, String>>() { |
|
|
|
|
|
}); |
|
|
|
|
|
return map.get("access_token"); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
|
public Result<?> getHanHaiMemberUser(String token,Integer state,PageBean pageBean){ |
|
|
|
|
|
HanHaiMember hanHaiMember = shiroRealm.checkUserTokenIsEffectHanHaiOpenId(token); |
|
|
|
|
|
Page<HanHaiMember> page = new Page<HanHaiMember>(pageBean.getPageNo(), pageBean.getPageSize()); |
|
|
|
|
|
Page<HanHaiMember> pageList = hanHaiMemberService.lambdaQuery() |
|
|
|
|
|
.eq(HanHaiMember::getShareId,hanHaiMember.getId()) |
|
|
|
|
|
.page(page); |
|
|
|
|
|
if(state == 0){ |
|
|
|
|
|
pageList = hanHaiMemberService.lambdaQuery() |
|
|
|
|
|
.eq(HanHaiMember::getShareId,hanHaiMember.getId()) |
|
|
|
|
|
.page(page); |
|
|
|
|
|
}else{ |
|
|
|
|
|
pageList = hanHaiMemberService.lambdaQuery() |
|
|
|
|
|
.eq(HanHaiMember::getVid,hanHaiMember.getId()) |
|
|
|
|
|
.page(page); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//创建一个新的集合 |
|
|
|
|
|
Page<FansPageBean> pageListFans = new Page<>(); |
|
|
|
|
|
List<FansPageBean> fansPageBean = new ArrayList<>(); |
|
|
|
|
|
pageList.getRecords().forEach(item->{ |
|
|
|
|
|
//创建一个新的对象 |
|
|
|
|
|
FansPageBean fansPageBean1 = new FansPageBean(); |
|
|
|
|
|
fansPageBean1.setPhone(item.getPhone()); |
|
|
|
|
|
fansPageBean1.setHeadImage(item.getHeadImage()); |
|
|
|
|
|
fansPageBean1.setNickName(item.getNickName()); |
|
|
|
|
|
//查询该用户的订单数量,count中的state>0 |
|
|
|
|
|
|
|
|
|
|
|
int count = commonOrderService.lambdaQuery() |
|
|
|
|
|
.in(CommonOrder::getState,1,2,3) |
|
|
|
|
|
.eq(CommonOrder::getUserId,item.getId()) |
|
|
|
|
|
.count().intValue(); |
|
|
|
|
|
fansPageBean1.setOrderNum(count); |
|
|
|
|
|
|
|
|
|
|
|
//查询该用户的佣金之和 |
|
|
|
|
|
BigDecimal commission = new BigDecimal(0); |
|
|
|
|
|
|
|
|
|
|
|
fansPageBean1.setCommission(commission); |
|
|
|
|
|
fansPageBean1.setCreateTime(item.getCreateTime()); |
|
|
|
|
|
fansPageBean.add(fansPageBean1); |
|
|
|
|
|
}); |
|
|
|
|
|
pageListFans.setRecords(fansPageBean); |
|
|
|
|
|
|
|
|
|
|
|
return Result.OK(pageListFans); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//管理员:获取推广表单申请列表带分页 |
|
|
|
|
|
@Override |
|
|
|
|
|
public Result<?> getPromotionApplyListPage(PageBean pageBean){ |
|
|
|
|
|
Page<CommonPromotion> page = new Page<>(pageBean.getPageNo(),pageBean.getPageSize()); |
|
|
|
|
|
Page<CommonPromotion> pageList = commonPromotionService.lambdaQuery() |
|
|
|
|
|
.page(page); |
|
|
|
|
|
return Result.OK("推广表单申请列表",pageList); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//管理员:通过推广表单申请 |
|
|
|
|
|
@Override |
|
|
|
|
|
public Result<?> passPromotionApply(String token, String id){ |
|
|
|
|
|
HanHaiMember hanHaiMember = shiroRealm.checkUserTokenIsEffectHanHaiOpenId(token); |
|
|
|
|
|
CommonPromotion commonPromotion = commonPromotionService.getById(id); |
|
|
|
|
|
commonPromotion.setStatus(1); |
|
|
|
|
|
commonPromotionService.updateById(commonPromotion); |
|
|
|
|
|
return Result.OK("通过推广表单申请成功"); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//管理员:拒绝推广表单申请 |
|
|
|
|
|
@Override |
|
|
|
|
|
public Result<?> rejectPromotionApply(String token, String id){ |
|
|
|
|
|
HanHaiMember hanHaiMember = shiroRealm.checkUserTokenIsEffectHanHaiOpenId(token); |
|
|
|
|
|
CommonPromotion commonPromotion = commonPromotionService.getById(id); |
|
|
|
|
|
commonPromotion.setStatus(2); |
|
|
|
|
|
commonPromotionService.updateById(commonPromotion); |
|
|
|
|
|
return Result.OK("拒绝推广表单申请成功"); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//管理员:推广员信息列表 |
|
|
|
|
|
@Override |
|
|
|
|
|
public Result<?> getPromotionList(PageBean pageBean){ |
|
|
|
|
|
Page<HanHaiMember> page = new Page<>(pageBean.getPageNo(),pageBean.getPageSize()); |
|
|
|
|
|
Page<HanHaiMember> pageList = hanHaiMemberService.lambdaQuery() |
|
|
|
|
|
.eq(HanHaiMember::getIsUser,"Y") |
|
|
|
|
|
.page(page); |
|
|
|
|
|
return Result.OK("推广员信息列表",pageList); |
|
|
|
|
|
} |
|
|
|
|
|
} |