From 62e6f8b77d80cdf7bf2e4a467deaa00cc630444e Mon Sep 17 00:00:00 2001 From: shahaibo <1023316923@qq.com> Date: Fri, 26 Jan 2024 13:17:59 +0800 Subject: [PATCH] =?UTF-8?q?TASK:=E6=95=B0=E6=8D=AE=E8=BF=81=E7=A7=BB;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ai/da/common/config/MyTaskScheduler.java | 3 + .../com/ai/da/common/utils/MinioUtil.java | 2 +- .../com/ai/da/common/utils/SendEmailUtil.java | 55 ++++++-- .../ai/da/controller/AccountController.java | 7 + .../ai/da/controller/LibraryController.java | 8 ++ .../com/ai/da/mapper/LibraryCopyMapper.java | 15 ++ .../mapper/LibraryModelPointCopyMapper.java | 15 ++ .../com/ai/da/mapper/entity/LibraryCopy.java | 83 +++++++++++ .../mapper/entity/LibraryModelPointCopy.java | 76 +++++++++++ .../com/ai/da/service/AccountService.java | 4 + .../com/ai/da/service/LibraryService.java | 3 + .../da/service/impl/LibraryServiceImpl.java | 129 ++++++++++++++++++ 12 files changed, 391 insertions(+), 9 deletions(-) create mode 100644 src/main/java/com/ai/da/mapper/LibraryCopyMapper.java create mode 100644 src/main/java/com/ai/da/mapper/LibraryModelPointCopyMapper.java create mode 100644 src/main/java/com/ai/da/mapper/entity/LibraryCopy.java create mode 100644 src/main/java/com/ai/da/mapper/entity/LibraryModelPointCopy.java diff --git a/src/main/java/com/ai/da/common/config/MyTaskScheduler.java b/src/main/java/com/ai/da/common/config/MyTaskScheduler.java index 00a3b0c8..93ff24f6 100644 --- a/src/main/java/com/ai/da/common/config/MyTaskScheduler.java +++ b/src/main/java/com/ai/da/common/config/MyTaskScheduler.java @@ -30,6 +30,9 @@ public class MyTaskScheduler { // 用户到期时间戳 Long timestamp = account.getValidEndTime(); // 替换为你的时间戳 + if (null == timestamp) { + continue; + } // 获取当前时间戳 Long currentTimestamp = System.currentTimeMillis(); diff --git a/src/main/java/com/ai/da/common/utils/MinioUtil.java b/src/main/java/com/ai/da/common/utils/MinioUtil.java index 5a8f90a1..5bd54cf8 100644 --- a/src/main/java/com/ai/da/common/utils/MinioUtil.java +++ b/src/main/java/com/ai/da/common/utils/MinioUtil.java @@ -196,7 +196,7 @@ public class MinioUtil { } } } - return bucketName + path; + return bucketName + "/" + path; } // public String upload(String bucketName, String path, File file) { diff --git a/src/main/java/com/ai/da/common/utils/SendEmailUtil.java b/src/main/java/com/ai/da/common/utils/SendEmailUtil.java index a14975a4..1fcba907 100644 --- a/src/main/java/com/ai/da/common/utils/SendEmailUtil.java +++ b/src/main/java/com/ai/da/common/utils/SendEmailUtil.java @@ -34,6 +34,7 @@ public class SendEmailUtil { * 发信地址 */ private static String SEND_ADDRESS = "info@aida.com.hk"; + private final static String CODE_CREATE_SEND_ADDRESS = "info@code-create.com.hk"; /** * 登入主题 */ @@ -219,18 +220,20 @@ public class SendEmailUtil { JSONObject jsonObject = new JSONObject(); // 设置试用订单相关数据 jsonObject.put("userName", account.getUserName()); + // 用户到期时间戳 Long timestamp = account.getValidEndTime(); // 替换为你的时间戳 + if (null != timestamp) { + // 获取当前时间戳 + Long currentTimestamp = System.currentTimeMillis(); - // 获取当前时间戳 - Long currentTimestamp = System.currentTimeMillis(); + // 计算时间差(毫秒) + long timeDifference = currentTimestamp - timestamp; - // 计算时间差(毫秒) - long timeDifference = currentTimestamp - timestamp; - - // 向上取整计算天数 - long days = (timeDifference + 24 * 60 * 60 * 1000 - 1) / (24 * 60 * 60 * 1000); - jsonObject.put("days", days); + // 向上取整计算天数 + long days = (timeDifference + 24 * 60 * 60 * 1000 - 1) / (24 * 60 * 60 * 1000); + jsonObject.put("days", days); + } return jsonObject.toJSONString(); } @@ -269,4 +272,40 @@ public class SendEmailUtil { jsonObject.put("email", trialOrder.getEmail()); return jsonObject.toJSONString(); } + + private final static Long UPGRADE_NOTIFICATION_ID = 118855L; + public static void sendUpgradeNotification(Account account, String senderAddress) { + try { + // 实例化一个认证对象 + Credential cred = new Credential(SECRET_ID, SECRET_KEy); + HttpProfile httpProfile = new HttpProfile(); + httpProfile.setEndpoint("ses.tencentcloudapi.com"); + ClientProfile clientProfile = new ClientProfile(); + clientProfile.setHttpProfile(httpProfile); + SesClient client = new SesClient(cred, "ap-hongkong", clientProfile); + SendEmailRequest req = new SendEmailRequest(); + if (StringUtils.isEmpty(senderAddress)) { + senderAddress = CODE_CREATE_SEND_ADDRESS; + } + req.setFromEmailAddress(senderAddress); + req.setDestination(new String[]{account.getUserEmail()}); + + // 根据邮件类型设置不同的主题和模板 + String subject = ""; + Template template = new Template(); + subject = "Upcoming AiDA 3.0 Launch and Scheduled Maintenance"; + template.setTemplateID(UPGRADE_NOTIFICATION_ID); + template.setTemplateData(buildAccountData(account)); + + req.setSubject(subject); + req.setTemplate(template); + + // 发送邮件 + SendEmailResponse resp = client.SendEmail(req); + log.info("短信发送结果res###{}", SendEmailResponse.toJsonString(resp)); + } catch (TencentCloudSDKException e) { + log.info("邮件发送失败###{}", e.toString()); + throw new BusinessException("failed.to.send.mail"); + } + } } diff --git a/src/main/java/com/ai/da/controller/AccountController.java b/src/main/java/com/ai/da/controller/AccountController.java index 1a91a5e5..d9ed7803 100644 --- a/src/main/java/com/ai/da/controller/AccountController.java +++ b/src/main/java/com/ai/da/controller/AccountController.java @@ -149,4 +149,11 @@ public class AccountController { public Response noLoginRequired(@RequestBody NoLoginRequiredDTO noLoginRequiredDTO, HttpServletRequest request){ return Response.success(accountService.noLoginRequired(noLoginRequiredDTO, request)); } + + @PostMapping("upgradeNotification") + @ApiOperation(value = "升级邮件通知") + public Response upgradeNotification() { + accountService.upgradeNotification(); + return Response.success(true); + } } diff --git a/src/main/java/com/ai/da/controller/LibraryController.java b/src/main/java/com/ai/da/controller/LibraryController.java index 15c58b5d..fd4aa57c 100644 --- a/src/main/java/com/ai/da/controller/LibraryController.java +++ b/src/main/java/com/ai/da/controller/LibraryController.java @@ -28,6 +28,7 @@ import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import javax.validation.Valid; import java.io.File; +import java.text.ParseException; import java.util.Date; import java.util.List; import java.util.Objects; @@ -197,4 +198,11 @@ public class LibraryController { return "/workspace/python_code/Multi-layer-Virtual-Try-on/dataset_for_test/Img_model.png"; } + @PostMapping("moveLibraryData") + @ApiOperation(value = "用户library数据迁移") + public Response moveLibraryDate() throws ParseException { + libraryService.moveLibraryDate(); + return Response.success(true); + } + } diff --git a/src/main/java/com/ai/da/mapper/LibraryCopyMapper.java b/src/main/java/com/ai/da/mapper/LibraryCopyMapper.java new file mode 100644 index 00000000..3cec4a2e --- /dev/null +++ b/src/main/java/com/ai/da/mapper/LibraryCopyMapper.java @@ -0,0 +1,15 @@ +package com.ai.da.mapper; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.entity.Library; +import com.ai.da.mapper.entity.LibraryCopy; + +/** + * Mapper 接口 + * + * @author easy-generator + * @since 2022-06-13 + */ +public interface LibraryCopyMapper extends CommonMapper { + +} diff --git a/src/main/java/com/ai/da/mapper/LibraryModelPointCopyMapper.java b/src/main/java/com/ai/da/mapper/LibraryModelPointCopyMapper.java new file mode 100644 index 00000000..05447f66 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/LibraryModelPointCopyMapper.java @@ -0,0 +1,15 @@ +package com.ai.da.mapper; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.entity.LibraryModelPoint; +import com.ai.da.mapper.entity.LibraryModelPointCopy; + +/** + * Mapper 接口 + * + * @author easy-generator + * @since 2022-11-11 + */ +public interface LibraryModelPointCopyMapper extends CommonMapper { + +} diff --git a/src/main/java/com/ai/da/mapper/entity/LibraryCopy.java b/src/main/java/com/ai/da/mapper/entity/LibraryCopy.java new file mode 100644 index 00000000..99e5377f --- /dev/null +++ b/src/main/java/com/ai/da/mapper/entity/LibraryCopy.java @@ -0,0 +1,83 @@ +package com.ai.da.mapper.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * Attendance + * + * @author easy-generator + * @since 2022-06-13 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("t_library_copy") +public class LibraryCopy implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 用户ID + */ + private Long accountId; + + /** + * 一级类型 + */ + private String level1Type; + + /** + * 二级类型 + */ + private String level2Type; + +// private String level3Type; + + /** + * 元素名 + */ + private String name; + + /** + * 元素存放地址 + */ + private String url; + /** + * md5值 + */ + private String md5; + /** + * 图片高度,目前只争对 models类型 + */ + private Integer high; + /** + * 图片宽度,目前只争对 models类型 + */ + private Integer width; + + /** + * 创建时间 + */ + private Date createDate; + + /** + * 更新时间 + */ + private Date updateDate; + +// private Integer isCopy; +} diff --git a/src/main/java/com/ai/da/mapper/entity/LibraryModelPointCopy.java b/src/main/java/com/ai/da/mapper/entity/LibraryModelPointCopy.java new file mode 100644 index 00000000..01cb6901 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/entity/LibraryModelPointCopy.java @@ -0,0 +1,76 @@ +package com.ai.da.mapper.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * Attendance + * + * @author easy-generator + * @since 2022-11-13 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("t_library_model_point_copy") +public class LibraryModelPointCopy implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 关联的 library或sys Id + */ + private Long libraryId; + + /** + * 左肩 + */ + private String shoulderLeft; + + /** + * 右肩 + */ + private String shoulderRight; + + /** + * 左腰 + */ + private String waistbandLeft; + + /** + * 右腰 + */ + private String waistbandRight; + /** + * 左手 + */ + private String handLeft; + + /** + * 右手 + */ + private String handRight; + + /** + * 创建时间 + */ + private Date createDate; + + /** + * 更新时间 + */ + private Date updateDate; +} diff --git a/src/main/java/com/ai/da/service/AccountService.java b/src/main/java/com/ai/da/service/AccountService.java index 86293174..2b1f20f1 100644 --- a/src/main/java/com/ai/da/service/AccountService.java +++ b/src/main/java/com/ai/da/service/AccountService.java @@ -127,4 +127,8 @@ public interface AccountService extends IService { String addNoLoginRequiredNew(NoLoginRequiredDTO noLoginRequiredDTO, HttpServletRequest request); Boolean deleteNoLoginRequiredNew(NoLoginRequiredDTO noLoginRequiredDTO, HttpServletRequest request); + + void upgradeNotification(); + + void moveLibraryDate(); } diff --git a/src/main/java/com/ai/da/service/LibraryService.java b/src/main/java/com/ai/da/service/LibraryService.java index 7ae5fc4a..0b23577e 100644 --- a/src/main/java/com/ai/da/service/LibraryService.java +++ b/src/main/java/com/ai/da/service/LibraryService.java @@ -12,6 +12,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import org.springframework.web.bind.annotation.RequestBody; import javax.validation.Valid; +import java.text.ParseException; import java.util.List; /** @@ -88,4 +89,6 @@ public interface LibraryService extends IService { void batchDeleteLibrary(LibraryDeleteDTO deleteDTO); void deleteTrialData(Long id); + + void moveLibraryDate() throws ParseException; } diff --git a/src/main/java/com/ai/da/service/impl/LibraryServiceImpl.java b/src/main/java/com/ai/da/service/impl/LibraryServiceImpl.java index bde22e96..49edc997 100644 --- a/src/main/java/com/ai/da/service/impl/LibraryServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/LibraryServiceImpl.java @@ -10,8 +10,11 @@ import com.ai.da.common.response.PageBaseResponse; import com.ai.da.common.response.ResultEnum; import com.ai.da.common.utils.CopyUtil; import com.ai.da.common.utils.DateUtil; +import com.ai.da.common.utils.FileUtil; import com.ai.da.common.utils.MinioUtil; +import com.ai.da.mapper.LibraryCopyMapper; import com.ai.da.mapper.LibraryMapper; +import com.ai.da.mapper.LibraryModelPointCopyMapper; import com.ai.da.mapper.SysFileMapper; import com.ai.da.mapper.entity.*; import com.ai.da.model.dto.*; @@ -30,15 +33,26 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.google.common.base.Function; import lombok.extern.slf4j.Slf4j; import okhttp3.*; +import org.apache.commons.fileupload.FileItem; +import org.apache.commons.fileupload.FileItemFactory; +import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.commons.CommonsMultipartFile; import javax.annotation.Resource; +import java.io.File; +import java.io.FileInputStream; import java.io.IOException; +import java.io.OutputStream; +import java.nio.file.Files; +import java.text.ParseException; +import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.*; @@ -463,6 +477,121 @@ public class LibraryServiceImpl extends ServiceImpl impl libraryMapper.delete(qw); } + @Resource + private LibraryCopyMapper libraryCopyMapper; + @Resource + private LibraryModelPointCopyMapper libraryModelPointCopyMapper; + @Override + public void moveLibraryDate() throws ParseException { + QueryWrapper qw = new QueryWrapper<>(); + // 定义日期格式 + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + // 定义日期字符串 + String dateString = "2023-09-01 00:00:00"; + qw.gt("create_date", dateFormat.parse(dateString)); + // 生产所有数据 + List libraryList = libraryCopyMapper.selectList(qw); + for (LibraryCopy libraryCopy : libraryList) { + QueryWrapper one = new QueryWrapper<>(); + one.lambda().eq(Library::getAccountId, libraryCopy.getAccountId()); + one.lambda().eq(Library::getMd5, libraryCopy.getMd5()); + List libraryList1 = libraryMapper.selectList(one); + if (CollectionUtil.isNotEmpty(libraryList1)) { + continue; + } + String url = libraryCopy.getUrl(); + if (StringUtils.isEmpty(url)) { + continue; + } + if (url.contains("/download/")) { + String[] downloads = url.split("/download/"); + if (downloads.length == 2) { + String linux = downloads[1]; + String windows = linux.replaceAll("/", "\\\\"); + String path = "C:\\workspace\\fileData\\file\\" + windows; + File file = FileUtil.getFile(path); + if (file != null) { + String name = file.getName(); + System.out.println(name); + StringBuilder sb = new StringBuilder(); + sb.append(libraryCopy.getAccountId()).append("/").append(libraryCopy.getLevel1Type().toLowerCase()).append("/"); + if (libraryCopy.getLevel1Type().equals("Sketchboard") || libraryCopy.getLevel1Type().equals("Models")) { + sb.append("female/"); + } + if (!StringUtils.isEmpty(libraryCopy.getLevel2Type())) { + sb.append(libraryCopy.getLevel2Type().toLowerCase()).append("/"); + } + sb.append(name); + String bucketName = users; + boolean b = minioUtil.doesObjectExist(bucketName, sb.toString()); + if (!b) { + FileItem a = getMultipartFile(file, file.getName()); + MultipartFile multipartFile = new CommonsMultipartFile(a); + String upload = minioUtil.upload(bucketName, sb.toString(), multipartFile, ""); + Library newInsert = CopyUtil.copyObject(libraryCopy, Library.class); + newInsert.setId(null); + if (libraryCopy.getLevel1Type().equals("Models")) { + newInsert.setLevel2Type("Female"); + QueryWrapper modelCopy = new QueryWrapper<>(); + modelCopy.lambda().eq(LibraryModelPointCopy::getLibraryId, libraryCopy.getId()); + LibraryModelPointCopy libraryModelPointCopy = libraryModelPointCopyMapper.selectOne(modelCopy); + LibraryModelPoint libraryModelPoint = CopyUtil.copyObject(libraryModelPointCopy, LibraryModelPoint.class); + libraryModelPoint.setModelType("Library"); + + upload = processMannequins(upload); + newInsert.setUrl(upload); + libraryMapper.insert(newInsert); + + libraryModelPoint.setRelationId(newInsert.getId()); + libraryModelPoint.setId(null); + libraryModelPointService.saveOrUpdate(libraryModelPoint); + continue; + } + if (libraryCopy.getLevel1Type().equals("Sketchboard")) { + newInsert.setLevel3Type("Female"); + } + newInsert.setUrl(upload); + libraryMapper.insert(newInsert); + } + } + } + } + } + } + private static FileItem getMultipartFile(File file, String fieldName) { + // 使用 DiskFileItemFactory 创建一个 FileItemFactory + FileItemFactory factory = new DiskFileItemFactory(16, null); + + // 使用 FileItemFactory 创建一个 FileItem 对象 + String mimeType = getMimeType(file); + FileItem item = factory.createItem(fieldName, mimeType, true, file.getName()); + + byte[] buffer = new byte[8192]; + int bytesRead; + + try (FileInputStream fis = new FileInputStream(file); + OutputStream os = item.getOutputStream()) { + // 从文件中读取数据并写入 FileItem + while ((bytesRead = fis.read(buffer)) != -1) { + os.write(buffer, 0, bytesRead); + } + } catch (IOException e) { + e.printStackTrace(); + } + + return item; + } + + private static String getMimeType(File file) { + try { + return Files.probeContentType(file.toPath()); + } catch (IOException e) { + e.printStackTrace(); + return null; + } + } + @Override public void checkModel(String value, List modelIds, Integer deleteModelConfirm) {