ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/dto/CodeGetDto.java
New file @@ -0,0 +1,18 @@ package com.ruoyi.system.api.domain.dto; import lombok.Data; /** * @ClassName CodeGetDto * @Description TODO * @Author jqs * @Date 2023/8/3 12:53 * @Version 1.0 */ @Data public class CodeGetDto { private String url; private String fileName; } ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/poji/shop/Shop.java
@@ -281,6 +281,9 @@ @TableField("auth_flag") private Integer authFlag; @TableField("shop_code") private String shopCode; @Override protected Serializable pkVal() { return this.shopId; ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteFileFallbackFactory.java
@@ -1,5 +1,6 @@ package com.ruoyi.system.api.factory; import com.ruoyi.system.api.domain.dto.CodeGetDto; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.cloud.openfeign.FallbackFactory; @@ -30,6 +31,11 @@ { return R.fail("上传文件失败:" + throwable.getMessage()); } @Override public R<String> getAppOrderTotal(CodeGetDto codeGetDto) { return R.fail("获取二维码失败:" + throwable.getMessage()); } }; } } ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteFileService.java
@@ -1,8 +1,10 @@ package com.ruoyi.system.api.service; import com.ruoyi.system.api.domain.dto.CodeGetDto; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestPart; import org.springframework.web.multipart.MultipartFile; import com.ruoyi.common.core.constant.ServiceNameConstants; @@ -26,4 +28,14 @@ */ @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public R<SysFile> upload(@RequestPart(value = "file") MultipartFile file); /** * @description 生成二维码 * @author jqs * @date 2023/8/3 12:57 * @param codeGetDto * @return R<String> */ @PostMapping("/file/getCodeUrl") public R<String> getAppOrderTotal(@RequestBody CodeGetDto codeGetDto); } ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/controller/FileController.java
New file @@ -0,0 +1,40 @@ package com.ruoyi.file.controller; import com.ruoyi.common.core.domain.R; import com.ruoyi.file.service.ActivityCodeService; import com.ruoyi.system.api.domain.dto.CodeGetDto; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; /** * @ClassName FileController * @Description TODO * @Author jqs * @Date 2023/8/3 12:50 * @Version 1.0 */ @RestController @RequestMapping("/file") public class FileController { @Resource private ActivityCodeService activityCodeService; @PostMapping("/getCodeUrl") public R<String> getAppOrderTotal(@RequestBody CodeGetDto codeGetDto){ String url = null; try { url = activityCodeService.createActivityCode(codeGetDto.getUrl(),codeGetDto.getFileName()); } catch (Exception e) { throw new RuntimeException(e); } return R.ok(url); } } ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/ActivityCodeService.java
@@ -1,9 +1,5 @@ package com.ruoyi.file.service; import me.chanjar.weixin.common.error.WxErrorException; import java.io.FileNotFoundException; /** * @ClassName ActivityCodeService * @Description TODO @@ -16,22 +12,32 @@ /** * @description 生成活动二维码 * @description 生成二维码 * @author jqs * @date 2023/7/26 19:09 * @param activityId * @return void * @date 2023/8/3 12:44 * @param url * @return String */ public String createActivityCode(String activityId); public String createActivityCode(String url, String fileName) throws Exception; /** * @description 生成活动二维码 * @description 生成微信活动二维码 * @author jqs * @date 2023/7/26 19:09 * @param activityId * @return void */ public String createActivityCode(String activityId,String backImageUrl) throws WxErrorException, FileNotFoundException; public String createActivityWxCode(String activityId); /** * @description 生成活动海报 * @author jqs * @date 2023/7/26 19:09 * @param activityId * @return void */ public String createActivityPoster(String activityId, String backImageUrl) throws Exception; } ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/ActivityCodeServiceImpl.java
@@ -5,7 +5,6 @@ import cn.hutool.core.img.ImgUtil; import cn.hutool.extra.qrcode.QrCodeUtil; import com.ruoyi.file.utils.OBSUploadUtils; import me.chanjar.weixin.common.error.WxErrorException; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -27,6 +26,22 @@ /** * @description 生成二维码 * @author jqs * @date 2023/8/3 12:44 * @param url * @return String */ @Override public String createActivityCode(String url, String fileName) throws Exception { File qrCodeFile = new File("/home/image/qrcode.png");// 生成二维码 QrCodeUtil.generate(url, 100, 100, qrCodeFile); InputStream codeStream = new FileInputStream(qrCodeFile); String fileUrl = OBSUploadUtils.uploadInputStream(codeStream,fileName); return fileUrl; } /** * @description 生成活动二维码 * @author jqs * @date 2023/7/26 19:09 @@ -34,7 +49,7 @@ * @return void */ @Override public String createActivityCode(String activityId){ public String createActivityWxCode(String activityId){ WxMaQrcodeService wxMaQrcodeService = wxMaService.getQrcodeService(); String scene = activityId; @@ -57,29 +72,28 @@ * @return void */ @Override public String createActivityCode(String activityId,String backImageUrl) throws WxErrorException, FileNotFoundException { public String createActivityPoster(String activityId,String backImageUrl) throws Exception { String fileUrl = null; File qrCodeFile = new File("/home/image/qrcode.png"); // 二维码内容 String text = ""+activityId; String text = "https://wxapp.hhhrt.cn/mini/activity?"+activityId; // 生成二维码 QrCodeUtil.generate(text, 100, 100, qrCodeFile); File backFile ; QrCodeUtil.generate(text, 200, 200, qrCodeFile); ByteArrayOutputStream out = new ByteArrayOutputStream(); InputStream codeStream = new FileInputStream(qrCodeFile); InputStream backStream = new FileInputStream(qrCodeFile); backImageUrl = backImageUrl.replace("https://hongruitang.oss-cn-beijing.aliyuncs.com/",""); InputStream backStream = OBSUploadUtils.getOSSInputStream(backImageUrl); // 将图片合成在一起 ImgUtil.pressImage( backStream, // 主图片 out, // 输出图片 ImgUtil.read(codeStream).getScaledInstance(516, 516, Image.SCALE_DEFAULT), //水印图片 ImgUtil.read(codeStream).getScaledInstance(200, 200, Image.SCALE_DEFAULT), //水印图片 0, //x坐标修正值。 默认在中间,偏移量相对于中间偏移 0, //y坐标修正值。 默认在中间,偏移量相对于中间偏移 350, //y坐标修正值。 默认在中间,偏移量相对于中间偏移 1.0f ); InputStream inputStream = new ByteArrayInputStream(out.toByteArray()); fileUrl = OBSUploadUtils.uploadInputStream(inputStream,activityId); return fileUrl; } } ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/utils/OBSUploadUtils.java
@@ -1,16 +1,19 @@ package com.ruoyi.file.utils; import cn.hutool.core.img.ImgUtil; import cn.hutool.extra.qrcode.QrCodeUtil; import com.aliyun.oss.ClientException; import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import com.aliyun.oss.OSSException; import com.aliyun.oss.model.OSSObject; import com.aliyun.oss.model.PutObjectRequest; import com.aliyun.oss.model.PutObjectResult; import com.ruoyi.common.core.utils.uuid.IdUtils; import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.io.InputStream; import java.awt.*; import java.io.*; import java.util.Calendar; /** @@ -22,6 +25,31 @@ */ public class OBSUploadUtils { public static void main(String[] args) throws Exception { String activityId = "123"; String backImageUrl = "2023/8/3/6742e22f748349429e454c9c6ba168ee.jpg"; String fileUrl = null; File qrCodeFile = new File("/home/image/qrcode.png"); // 二维码内容 String text = "https://wxapp.hhhrt.cn/mini/activity?"+activityId; // 生成二维码 QrCodeUtil.generate(text, 100, 100, qrCodeFile); ByteArrayOutputStream out = new ByteArrayOutputStream(); InputStream codeStream = new FileInputStream(qrCodeFile); InputStream backStream = OBSUploadUtils.getOSSInputStream(backImageUrl); // 将图片合成在一起 ImgUtil.pressImage( backStream, // 主图片 out, // 输出图片 ImgUtil.read(codeStream).getScaledInstance(200, 200, Image.SCALE_DEFAULT), //水印图片 0, //x坐标修正值。 默认在中间,偏移量相对于中间偏移 350, //y坐标修正值。 默认在中间,偏移量相对于中间偏移 1.0f ); InputStream inputStream = new ByteArrayInputStream(out.toByteArray()); fileUrl = OBSUploadUtils.uploadInputStream(inputStream,activityId); System.out.println(fileUrl); } protected static OSS createOss(){ // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。 @@ -58,6 +86,55 @@ String prefix = fileName.substring(fileName.lastIndexOf(".")); String objectName = filePath + uuid + prefix; InputStream inputStream = file.getInputStream(); // 创建PutObjectRequest对象。 PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, inputStream); // 设置该属性可以返回response。如果不设置,则返回的response为空。 putObjectRequest.setProcess("true"); // 创建PutObject请求。 result = ossClient.putObject(putObjectRequest); // 如果上传成功,则返回200。 System.out.println(fileName + "上传返回" + result.getResponse().getStatusCode()); return result.getResponse().getUri(); } catch (OSSException oe) { System.out.println("Caught an OSSException, which means your request made it to OSS, " + "but was rejected with an error response for some reason."); System.out.println("Error Message:" + oe.getErrorMessage()); System.out.println("Error Code:" + oe.getErrorCode()); System.out.println("Request ID:" + oe.getRequestId()); System.out.println("Host ID:" + oe.getHostId()); } catch (ClientException ce) { System.out.println("Caught an ClientException, which means the client encountered " + "a serious internal problem while trying to communicate with OSS, " + "such as not being able to access the network."); System.out.println("Error Message:" + ce.getMessage()); } finally { if (ossClient != null) { ossClient.shutdown(); } } return result.getResponse().getErrorResponseAsString(); } public static String uploadInputStream (InputStream inputStream,String fileName) throws Exception { // 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。 String bucketName = "hongruitang"; Calendar calendar = Calendar.getInstance(); // 获取当前年 String year = String.valueOf(calendar.get(Calendar.YEAR)); // 获取当前月 String month = String.valueOf(calendar.get(Calendar.MONTH) + 1); // 获取当前日 String day = String.valueOf(calendar.get(Calendar.DATE)); String filePath = year+"/"+month+"/"+day+"/"; String uuid = IdUtils.fastSimpleUUID(); // 创建OSSClient实例。 OSS ossClient = createOss(); PutObjectResult result = null; try { System.out.println(fileName + "开始上传"); String objectName = filePath + fileName + ".jpg"; // 创建PutObjectRequest对象。 PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, inputStream); // 设置该属性可以返回response。如果不设置,则返回的response为空。 @@ -134,9 +211,13 @@ return result.getResponse().getErrorResponseAsString(); } public static void getOSSFile(String key) throws Exception { public static InputStream getOSSInputStream(String key) throws Exception { String bucketName = "hongruitang"; // 创建OSSClient实例。 OSS ossClient = createOss(); OSSObject ossObject = ossClient.getObject(bucketName,key); InputStream inputStream = ossObject.getObjectContent(); return inputStream; } } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/pojo/activity/Activity.java
@@ -127,7 +127,11 @@ */ @TableField("activity_introduce") private String activityIntroduce; /** * 活动二维码 */ @TableField("activity_code") private String activityCode; @Override protected Serializable pkVal() { ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/MgtActivityPageVo.java
@@ -48,4 +48,10 @@ @ApiModelProperty(value = "创建时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date createTime; @ApiModelProperty(value = "活动二维码地址") private String activityCode; @ApiModelProperty(value = "背景海报地址") private String propagandaPoster; } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/activity/ActivityServiceImpl.java
@@ -29,6 +29,7 @@ import com.ruoyi.system.api.domain.vo.MgtSimpleShopVo; import com.ruoyi.system.api.domain.vo.MgtUserIdByKeywordVo; import com.ruoyi.system.api.service.RemoteConfigService; import com.ruoyi.system.api.service.RemoteFileService; import com.ruoyi.system.api.service.RemoteMemberService; import com.ruoyi.system.api.service.RemoteShopService; import org.redisson.api.RLock; @@ -85,6 +86,9 @@ @Autowired private RedissonClient redissonClient; @Resource private RemoteFileService remoteFileService; /** * @param mgtActivityEditDto * @return void @@ -123,6 +127,12 @@ activityTotal.setRefundTotal(0); activityTotal.setOrderMoneyTotal(BigDecimal.ZERO); activityTotalService.save(activityTotal); CodeGetDto codeGetDto = new CodeGetDto(); String url = "https://wxapp.hhhrt.cn/mini/activity?activityId="+activityId; codeGetDto.setUrl(url); codeGetDto.setFileName("activity-"+activityId); String codeUrl = remoteFileService.getAppOrderTotal(codeGetDto).getData(); activity.setActivityCode(codeUrl); } // 获取活动开始时间和结束时间 Date activityStartTime = mgtActivityEditDto.getActivityStartTime(); ruoyi-modules/ruoyi-goods/src/main/resources/mapper/activity/ActivityMapper.xml
@@ -23,7 +23,9 @@ WHEN 1 THEN '是' ELSE '否' END recommendFlag, ta.create_time createTime ta.create_time createTime, ta.activity_code activityCode, ta.propaganda_poster propagandaPoster FROM t_activity ta INNER JOIN t_activity_total tat ON ta.activity_id = tat.activity_id WHERE ta.del_flag = 0 @@ -61,10 +63,10 @@ AND FIND_IN_SET(#{param.userIds}, user_id) > 0 </if> <if test="param.createStartTime!=null and param.createStartTime != ''"> AND Date(ta.create_time) >= #{param.createStartTime} AND Date(create_time) >= #{param.createStartTime} </if> <if test="param.createEndTime!=null and param.createEndTime != ''"> AND Date(ta.create_time) <= #{param.createEndTime} AND Date(create_time) <= #{param.createEndTime} </if> <if test="param.orderFlag!=null and param.orderFlag == 1"> AND order_id IS NOT NULL ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderServiceImpl.java
@@ -3268,6 +3268,18 @@ @Override public MerTotalOrderVo totalMerOrder(MerOrderPageDto merOrderPageDto) { MerTotalOrderVo merTotalOrderVo = new MerTotalOrderVo(); if(StringUtils.isNotBlank(merOrderPageDto.getKeyword())){ MgtUserIdByKeywordDto userIdByKeywordDto = new MgtUserIdByKeywordDto(); userIdByKeywordDto.setKeyword(merOrderPageDto.getKeyword()); MgtUserIdByKeywordVo userIdByKeywordVo = remoteMemberService.getUserIdByKeyword(userIdByKeywordDto).getData(); if(StringUtils.isNotBlank(userIdByKeywordVo.getUserIds())){ List<Long> userIdList = Arrays.stream(userIdByKeywordVo.getUserIds().split(",")) .map(Long::parseLong) .collect(Collectors.toList()); merOrderPageDto.setMemberUserIdList(userIdList); merOrderPageDto.setMemberUserId(null); } } merTotalOrderVo = orderMapper.totalMerOrder(merOrderPageDto); return merTotalOrderVo; } ruoyi-modules/ruoyi-order/src/main/resources/mapper/order/OrderMapper.xml
@@ -1454,28 +1454,28 @@ FROM t_order WHERE del_flag = 0 AND shop_id = #{param.shopId} <if test="param.memberUserId != null and param.memberUserId != ''"> AND toc.user_id = #{param.memberUserId} AND user_id = #{param.memberUserId} </if> <if test="param.type != null and param.type ==1 "> AND (toc.order_status = 2 OR toc.order_status = 3) AND (order_status = 2 OR order_status = 3) </if> <if test="param.type != null and param.type ==2 "> AND toc.order_status = 2 AND order_status = 2 </if> <if test="param.type != null and param.type ==3 "> AND toc.order_status = 3 AND order_status = 3 </if> <if test="param.orderFrom != null and param.orderFrom != '' "> AND toc.order_from = #{param.orderFrom} AND order_from = #{param.orderFrom} </if> <if test="param.startOrderDate != null and param.startOrderDate != '' "> AND Date(toc.create_time) >= #{param.startOrderDate} AND Date(create_time) >= #{param.startOrderDate} </if> <if test="param.endOrderDate != null and param.endOrderDate != '' "> AND Date(toc.create_time) <= #{param.endOrderDate} AND Date(create_time) <= #{param.endOrderDate} </if> <if test="param.keyword != null and param.keyword != ''"> AND (toc.order_no LIKE CONCAT('%',#{param.keyword},'%') OR tog.goods_name LIKE CONCAT('%',#{param.keyword},'%')) AND order_no LIKE CONCAT('%',#{param.keyword},'%') </if> </select> ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/mapper/shop/ShopStaffMapper.java
@@ -19,4 +19,14 @@ * @param shopId */ void clearShopStaffRelation(@Param("shopId") Long shopId); /** * @description * @author jqs * @date 2023/8/3 13:19 * @param shopId * @param codeUrl * @return void */ void updateShopCodeUrl(@Param("shopId") Long shopId,@Param("codeUrl") String codeUrl); } ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/shop/ShopServiceImpl.java
@@ -107,6 +107,9 @@ private RemoteSysStaffService remoteSysStaffService; @Resource private RemoteFileService remoteFileService; @Resource private ShopTaskService shopTaskService; @Resource @@ -300,6 +303,13 @@ if(newShop){ //生成商户关联记录 initNewShop(shop,mgtEditShopDto.getUserId()); CodeGetDto codeGetDto = new CodeGetDto(); String url = "https://wxapp.hhhrt.cn/mini/activity?activityId="+shop.getShopId(); codeGetDto.setUrl(url); codeGetDto.setFileName("shop-"+shop.getShopId()); String codeUrl = remoteFileService.getAppOrderTotal(codeGetDto).getData(); shop.setShopCode(codeUrl); this.saveOrUpdate(shop); } } ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/shop/ShopStaffServiceImpl.java
@@ -10,10 +10,12 @@ import com.ruoyi.shop.mapper.shop.ShopStaffMapper; import com.ruoyi.shop.service.shop.ShopStaffService; import com.ruoyi.system.api.domain.dto.AppEditUserDto; import com.ruoyi.system.api.domain.dto.CodeGetDto; import com.ruoyi.system.api.domain.dto.MerEditUserDto; import com.ruoyi.system.api.domain.dto.MgtShopStaffEditDto; import com.ruoyi.system.api.domain.poji.shop.Shop; import com.ruoyi.system.api.domain.vo.MerStaffInfoVo; import com.ruoyi.system.api.service.RemoteFileService; import com.ruoyi.system.api.service.RemoteSysStaffService; import com.ruoyi.system.api.service.RemoteUserService; import org.springframework.stereotype.Service; @@ -41,6 +43,8 @@ @Resource private RemoteSysStaffService remoteSysStaffService; @Resource private RemoteFileService remoteFileService; /** * * @param userId @@ -82,8 +86,17 @@ merStaffInfoVo.setBusinessTime(shop.getBusinessStartTime()+"-"+shop.getBusinessEndTime()); merStaffInfoVo.setShopType(shop.getShopType()); merStaffInfoVo.setShopNumber(shop.getShopNumber()); String shopCodeUrl = "https://wxapp.hhhrt.cn/mini/shop?shopId="+shop.getShopId(); merStaffInfoVo.setShopCodeUrl(shopCodeUrl); if(StringUtils.isNotBlank(shop.getShopCode())){ merStaffInfoVo.setShopCodeUrl(shop.getShopCode()); }else{ CodeGetDto codeGetDto = new CodeGetDto(); String url = "https://wxapp.hhhrt.cn/mini/activity?activityId="+shop.getShopId(); codeGetDto.setUrl(url); codeGetDto.setFileName("shop-"+shop.getShopId()); String codeUrl = remoteFileService.getAppOrderTotal(codeGetDto).getData(); merStaffInfoVo.setShopCodeUrl(codeUrl); shopStaffMapper.updateShopCodeUrl(shop.getShopId(),codeUrl); } return merStaffInfoVo; } ruoyi-modules/ruoyi-shop/src/main/resources/mapper/shop/ShopStaffMapper.xml
@@ -8,4 +8,7 @@ UPDATE t_shop_staff SET del_flag = 1 WHERE del_flag = 0 AND shop_id = #{shopId} </update> <update id="clearShopStaffRelation"> UPDATE t_shop SET shop_code = #{codeUrl} WHERE shop_id = #{shopId} </update> </mapper> ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/config/CustomConfigMapper.java
@@ -5,7 +5,7 @@ import com.ruoyi.system.domain.pojo.config.CustomConfig; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.system.domain.vo.MgtOperLogPageVo; import io.lettuce.core.dynamic.annotation.Param; import org.apache.ibatis.annotations.Param; import java.util.List; ruoyi-modules/ruoyi-system/src/main/resources/mapper/config/CustomConfigMapper.xml
@@ -20,10 +20,10 @@ FROM sys_oper_log WHERE operator_type = 1 AND del_flag = 0 <if test="param.operContent != null and param.operContent !=''"> oper_content LIKE concat('%', #{param.operContent}, '%') AND oper_content LIKE concat('%', #{param.operContent}, '%') </if> <if test="param.operTitle != null and param.operTitle !=''"> title = #{param.operTitle} AND title = #{param.operTitle} </if> <if test="param.operStartTime!=null and param.operStartTime!=''"> AND Date(oper_time) >= #{param.operStartTime}