From 11ec1c23a9f47ed70b124e413e33e3696897390f Mon Sep 17 00:00:00 2001 From: 无关风月 <443237572@qq.com> Date: 星期五, 14 二月 2025 15:04:41 +0800 Subject: [PATCH] bug修改 --- manage/src/main/java/com/jilongda/manage/controller/TCouponController.java | 295 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 293 insertions(+), 2 deletions(-) diff --git a/manage/src/main/java/com/jilongda/manage/controller/TCouponController.java b/manage/src/main/java/com/jilongda/manage/controller/TCouponController.java index 026a948..35c71de 100644 --- a/manage/src/main/java/com/jilongda/manage/controller/TCouponController.java +++ b/manage/src/main/java/com/jilongda/manage/controller/TCouponController.java @@ -1,9 +1,55 @@ package com.jilongda.manage.controller; -import org.springframework.web.bind.annotation.RequestMapping; +import com.aliyun.oss.OSS; +import com.aliyun.oss.OSSClientBuilder; +import com.aliyun.oss.common.utils.BinaryUtil; +import com.aliyun.oss.model.MatchMode; +import com.aliyun.oss.model.OSSObject; +import com.aliyun.oss.model.PolicyConditions; +import com.aliyun.oss.model.PutObjectResult; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.jilongda.common.basic.ApiResult; +import com.jilongda.common.basic.PageInfo; +import com.jilongda.common.utils.UUIDUtil; +import com.jilongda.manage.component.AliOssMange; +import com.jilongda.manage.dto.TModelDTO; +import com.jilongda.manage.model.TAppUser; +import com.jilongda.manage.model.TCoupon; +import com.jilongda.manage.model.TCouponReceive; +import com.jilongda.manage.model.TModel; +import com.jilongda.manage.query.TAppUserQuery; +import com.jilongda.manage.query.TCouponQuery; +import com.jilongda.manage.service.TAppUserService; +import com.jilongda.manage.service.TCouponReceiveService; +import com.jilongda.manage.service.TCouponService; +import com.jilongda.manage.utils.OssUploadUtil; +import com.jilongda.manage.utils.QRCodeUtil; +import com.jilongda.manage.vo.TAppUserVO; +import com.jilongda.manage.vo.TCouponInfoVO; +import com.jilongda.manage.vo.TCouponVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.apache.tomcat.util.http.fileupload.ByteArrayOutputStream; +import org.springframework.beans.BeanUtils; +import org.springframework.core.io.ByteArrayResource; +import org.springframework.mock.web.MockMultipartFile; +import org.springframework.util.StringUtils; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.io.InputStream; +import java.math.BigDecimal; +import java.nio.charset.StandardCharsets; +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; /** * <p> @@ -14,8 +60,253 @@ * @since 2024-12-09 */ @RestController +@Api(tags = "优惠券管理") @RequestMapping("/t-coupon") public class TCouponController { + @Resource + private TCouponService couponService; + @Resource + private TCouponReceiveService couponReceiveService; + @Resource + private TAppUserService appUserService; + @ApiOperation(value = "优惠券列表") + @PostMapping(value = "/pageList") + public ApiResult<PageInfo<TCouponVO>> pageList(@RequestBody TCouponQuery query) { + PageInfo<TCouponVO> appUserVOPageInfo = couponService.pageList(query); + return ApiResult.success(appUserVOPageInfo); + } + @ApiOperation(value = "添加优惠券") + @PostMapping(value = "/add") + public ApiResult<String> add( @RequestBody TCoupon dto) throws Exception { + if (dto.getTime()!=null && dto.getTime()>365){ + return ApiResult.failed("优惠券有效期不能大于365天"); + } + if (dto.getType()==1||dto.getType()==4)dto.setGrantStatus(1); + couponService.save(dto); + switch (dto.getType()){ + case 2: + // 全局发放 + List<Integer> collect = appUserService.lambdaQuery().list().stream() + .map(TAppUser::getId).collect(Collectors.toList()); + List<TCouponReceive> tCouponReceives = new ArrayList<>(); + for (Integer i : collect) { + TCouponReceive tCouponReceive = new TCouponReceive(); + tCouponReceive.setCouponId(dto.getId()); + tCouponReceive.setUserId(i); + tCouponReceive.setType(2); + tCouponReceive.setAmount(dto.getAmount()); + tCouponReceive.setStoreId(dto.getStoreId()); + if (dto.getTime()!=0){ + tCouponReceive.setEndTime(LocalDateTime.now().plusDays(dto.getTime())); + } + tCouponReceive.setAmountCondition(dto.getAmountCondition()); + tCouponReceive.setStatus(1); + tCouponReceive.setCouponName(dto.getName()); + tCouponReceives.add(tCouponReceive); + } + couponReceiveService.saveBatch(tCouponReceives); + break; + case 3: + List<TCouponReceive> tCouponReceives1 = new ArrayList<>(); + for (Integer userId : dto.getUserIds()) { + TCouponReceive tCouponReceive = new TCouponReceive(); + tCouponReceive.setCouponId(dto.getId()); + tCouponReceive.setUserId(userId); + tCouponReceive.setType(3); + tCouponReceive.setAmount(dto.getAmount()); + tCouponReceive.setStoreId(dto.getStoreId()); + if (dto.getTime()!=0){ + tCouponReceive.setEndTime(LocalDateTime.now().plusDays(dto.getTime())); + } + tCouponReceive.setAmountCondition(dto.getAmountCondition()); + tCouponReceive.setStatus(1); + tCouponReceive.setCouponName(dto.getName()); + tCouponReceives1.add(tCouponReceive); + } + couponReceiveService.saveBatch(tCouponReceives1); + break; + case 4: + String code = "{\"id\": "+dto.getId()+ "}"; + BufferedImage blueImage = QRCodeUtil.createImage(code); + MultipartFile blueFile = convert(blueImage, new Date().getTime() + UUIDUtil.getRandomCode(3) + ".PNG"); + String s = OssUploadUtil.ossUpload("eyes/", blueFile); + dto.setQrCode(s); + couponService.updateById(dto); + return ApiResult.success(s); + + } + return ApiResult.success(); + } + @ApiOperation(value = "暂停发放 只有type为1和4的时候") + @PostMapping(value = "/stop") + public ApiResult stop(Integer id) throws Exception { + TCoupon byId = couponService.getById(id); + byId.setGrantStatus(2); + couponService.updateById(byId); + return ApiResult.success(); + } + @ApiOperation(value = "修改优惠券") + @PostMapping(value = "/update") + public ApiResult<String> update( @RequestBody TCoupon dto) throws Exception { + couponService.updateById(dto); + return ApiResult.success(); + } + @ApiOperation(value = "优惠券详情") + @PostMapping(value = "/getDetail") + public ApiResult<TCouponInfoVO> getDetail(Integer id) { + TCouponInfoVO tCouponInfoVO = new TCouponInfoVO(); + TCoupon byId = couponService.getById(id); + BeanUtils.copyProperties(byId, tCouponInfoVO); + int size = couponReceiveService.list(new LambdaQueryWrapper<TCouponReceive>() + .eq(TCouponReceive::getCouponId, id)).size(); + tCouponInfoVO.setGrantCout(size); + List<TCouponReceive> list = couponReceiveService.list(new LambdaQueryWrapper<TCouponReceive>() + .eq(TCouponReceive::getCouponId, id) + .eq(TCouponReceive::getStatus, 2)); + list.stream().map(TCouponReceive::getAmount).reduce(BigDecimal::add).ifPresent(tCouponInfoVO::setUseMoney); + tCouponInfoVO.setUseCount(list.size()); + if (byId.getType()==3){ + // 查询领取人 + List<Integer> collect = couponReceiveService.lambdaQuery() + .eq(TCouponReceive::getCouponId, id).list() + .stream().map(TCouponReceive::getUserId) + .distinct() + .collect(Collectors.toList()); + tCouponInfoVO.setUserIds(collect); + } + return ApiResult.success(tCouponInfoVO); + } + + public static MultipartFile convert(BufferedImage bufferedImage, String fileName) throws IOException { + // 将 BufferedImage 转换为字节数组 + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + ImageIO.write(bufferedImage, "png", baos); + byte[] bytes = baos.toByteArray(); + + // 创建 ByteArrayResource + ByteArrayResource resource = new ByteArrayResource(bytes); + + // 创建 MockMultipartFile + MockMultipartFile multipartFile = new MockMultipartFile( + "file", + fileName, + "image/png", + resource.getInputStream() + ); + + return multipartFile; + } + @ApiOperation(value = "服务端上传", notes = "服务端上传") + @PostMapping(value = "upload") + public ApiResult<String> fileUpload(@RequestParam(value = "file") MultipartFile file) throws IOException { + InputStream inputStream = file.getInputStream(); + String filename = System.currentTimeMillis() + file.getOriginalFilename(); + // Endpoint以杭州为例,其它Region请按实际情况填写。 + final String endpoint = AliOssMange.endpoint; + // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。 + final String accessKeyId = AliOssMange.accessKeyId; + final String accessKeySecret = AliOssMange.accessKeySecret; + final String bucketName = AliOssMange.bucketName; + // <yourObjectName>上传文件到OSS时需要指定包含文件后缀在内的完整路径,例如abc/efg/123.jpg。 + String objectName = AliOssMange.dir + filename; + // 创建OSSClient实例。 + OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); + // 填写本地文件的完整路径。如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件流。 + // InputStream inputStream = new FileInputStream("D:\\localpath\\examplefile.txt"); + // 依次填写Bucket名称(例如examplebucket)和Object完整路径(例如exampledir/exampleobject.txt)。Object完整路径中不能包含Bucket名称。 + PutObjectResult putObjectResult = ossClient.putObject(bucketName, objectName, inputStream); + OSSObject ossObject = ossClient.getObject(bucketName, objectName); + String uri = ossObject.getResponse().getUri(); + // 关闭OSSClient。 + ossClient.shutdown(); +// uri = uri.replace("http://nn-bucket.oss-cn-shanghai.aliyuncs.com",FILE_CDN); + return ApiResult.okmsg(uri); + } + + + @ApiOperation(value = "服务端签名后直传", notes = "服务端签名后直传") + @PostMapping("signature") + public ApiResult<Map<String, String>> signature() { + OSS builder = new OSSClientBuilder().build(AliOssMange.endpoint, AliOssMange.accessKeyId, AliOssMange.accessKeySecret); + long expireTime = 30; + long expireEndTime = System.currentTimeMillis() + expireTime * 1000; + Date expiration = new Date(expireEndTime); + PolicyConditions policyConds = new PolicyConditions(); + policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, 1048576000); + policyConds.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, AliOssMange.dir); + String postPolicy = builder.generatePostPolicy(expiration, policyConds); + byte[] binaryData = postPolicy.getBytes(StandardCharsets.UTF_8); + String encodedPolicy = BinaryUtil.toBase64String(binaryData); + String postSignature = builder.calculatePostSignature(postPolicy); + Map<String, String> respMap = new LinkedHashMap<>(6); + respMap.put("accessid", AliOssMange.accessKeyId); + respMap.put("policy", encodedPolicy); + respMap.put("signature", postSignature); + // 示例为dir + respMap.put("dir", AliOssMange.dir); + // 前端为key + // respMap.put("key", AliOssMange.dir); + respMap.put("host", AliOssMange.host); +// respMap.put("cdn", AliOssMange.cdn); + respMap.put("expire", String.valueOf(expireEndTime / 1000)); +// // 回调 +// if (StringUtils.hasLength(AliOssMange.callbackUrl)) { +// JSONObject jasonCallback = new JSONObject(); +// jasonCallback.put("callbackUrl", AliOssMange.callbackUrl); +// String callbackBody = "{\"filename\":${object},\"size\":${size},\"mimeType\":${mimeType}}"; +// jasonCallback.put("callbackBody", callbackBody); +// jasonCallback.put("callbackBodyType", "application/json"); +// String base64CallbackBody = BinaryUtil.toBase64String(jasonCallback.toString().getBytes()); +// respMap.put("callback", base64CallbackBody); +// } + +// HttpServletResponse response = WebUtils.response(); +// assert response != null; +// response.setHeader("Access-Control-Allow-Origin", "*"); +// response.setHeader("Access-Control-Allow-Methods", "GET, POST"); + + // 关闭OSSClient。 + builder.shutdown(); + return ApiResult.success(respMap); + } + + @ApiOperation(value = "服务端上传(二进制字符串)", notes = "服务端上传") + @PostMapping(value = "str/upload") + public String strUpload(InputStream inputStream, String filename) throws IOException { + //String filename = System.currentTimeMillis() + CodeGenerateUtils.generateVolumeSn()+".jpg"; + // Endpoint以杭州为例,其它Region请按实际情况填写。 + final String endpoint = AliOssMange.endpoint; + // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。 + final String accessKeyId = AliOssMange.accessKeyId; + final String accessKeySecret = AliOssMange.accessKeySecret; + final String bucketName = AliOssMange.bucketName; + // <yourObjectName>上传文件到OSS时需要指定包含文件后缀在内的完整路径,例如abc/efg/123.jpg。 + String objectName = AliOssMange.dir + filename; + // 创建OSSClient实例。 + OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); + // 填写本地文件的完整路径。如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件流。 + // InputStream inputStream = new FileInputStream("D:\\localpath\\examplefile.txt"); + // 依次填写Bucket名称(例如examplebucket)和Object完整路径(例如exampledir/exampleobject.txt)。Object完整路径中不能包含Bucket名称。 + PutObjectResult putObjectResult = ossClient.putObject(bucketName, objectName, inputStream); + OSSObject ossObject = ossClient.getObject(bucketName, objectName); + String uri = ossObject.getResponse().getUri(); + // 关闭OSSClient。 + ossClient.shutdown(); + return uri; + } + + /** + * oss上传成功回调 + * + * @param callback + * @return + */ + @ApiOperation(value = "oss回调", notes = "oss回调") + @PostMapping(value = "/callback") + public ApiResult callback(@RequestBody Map<String, Object> callback) { + String filename = "http://".concat(AliOssMange.bucketName).concat(".").concat(AliOssMange.endpoint).concat("/").concat(callback.get("filename").toString()); + return ApiResult.okmsg(filename); + } } -- Gitblit v1.7.1