ソースを参照

订单接单,退款超时监控增加两次推送,配置系数

jyc 3 週間 前
コミット
ba9009f686

+ 52 - 0
alien-job/src/main/java/shop/alien/job/store/LawyerOrderJob.java

@@ -0,0 +1,52 @@
+package shop.alien.job.store;
+
+import com.alibaba.fastjson2.util.DateUtils;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.xxl.job.core.handler.annotation.XxlJob;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+import shop.alien.entity.store.LawyerConsultationOrder;
+import shop.alien.entity.store.LifeUserOrder;
+import shop.alien.mapper.LawyerConsultationOrderMapper;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 团购上下架数据统计
+ *
+ * @author jyc
+ * @date 2023/12/20 14:20
+ * @see LifeUserOrder
+ */
+
+@Slf4j
+@Component
+@RequiredArgsConstructor
+public class LawyerOrderJob {
+
+    private final LawyerConsultationOrderMapper lawyerConsultationOrderMapper;
+
+    /**
+     * 待支付订单超时处理
+     */
+    @XxlJob("acceptOrderStatus")
+    @Transactional(rollbackFor = Exception.class)
+    public void acceptOrderStatus() {
+        String format = DateUtils.format(shop.alien.util.common.DateUtils.calcDays(new Date(), -4), "yyyy-MM-dd");
+        LambdaQueryWrapper<LawyerConsultationOrder> lambdaQueryWrapper = new LambdaQueryWrapper<LawyerConsultationOrder>()
+                .eq(LawyerConsultationOrder::getOrderStatus, 1)
+                .like(LawyerConsultationOrder::getAcceptOrdersTime, format)
+                .eq(LawyerConsultationOrder::getDeleteFlag, 0);
+        List<LawyerConsultationOrder> lawyerConsultationOrders = lawyerConsultationOrderMapper.selectList(lambdaQueryWrapper);
+        for (LawyerConsultationOrder lawyerConsultationOrder : lawyerConsultationOrders) {
+            LawyerConsultationOrder order = new LawyerConsultationOrder();
+            order.setId(lawyerConsultationOrder.getId());
+            order.setOrderStatus(4);
+            lawyerConsultationOrderMapper.updateById(order);
+        }
+    }
+}
+

+ 66 - 0
alien-lawyer/src/main/java/shop/alien/lawyer/controller/FileUploadController.java

@@ -0,0 +1,66 @@
+package shop.alien.lawyer.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiOperationSupport;
+import io.swagger.annotations.ApiSort;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartRequest;
+import shop.alien.entity.result.R;
+import shop.alien.lawyer.util.FileUploadUtil;
+
+import java.util.List;
+
+/**
+ * 二期-文件上传
+ *
+ * @author ssk
+ * @version 1.0
+ * @date 2024/12/6 15:30
+ */
+@Slf4j
+@Api(tags = {"二期-文件上传"})
+@ApiSort(6)
+@CrossOrigin
+@RestController
+@RequestMapping("/file")
+@RequiredArgsConstructor
+public class FileUploadController {
+
+    private final FileUploadUtil fileUpload;
+
+    @ApiOperation("单个文件上传(图片或视频,返回路径)")
+    @ApiOperationSupport(order = 1)
+    @PostMapping("/upload")
+    public R<String> upload(@RequestParam("file") MultipartFile file) {
+        log.info("StoreFileUploadController.upload fileName:{}", file.getOriginalFilename());
+        return R.data(fileUpload.uploadOneFile(file));
+    }
+
+    @ApiOperation("多个文件上传(图片或视频,视频会截取第一秒图片,返回路径)")
+    @ApiOperationSupport(order = 2)
+    @PostMapping("/uploadMore")
+    public R<List<String>> uploadMore(MultipartRequest multipartRequest) {
+        log.info("StoreFileUploadController.upload uploadMore:{}", multipartRequest);
+        return R.data(fileUpload.uploadMoreFile(multipartRequest));
+    }
+
+    @ApiOperation(value = "图片上传(其实也可以传视频,不会截图), 返回图片id", notes = "文件格式: file_0,file_1, list格式: [{\"storeId\":1,\"imgType\":3,\"imgDescription\":\"菜品1\",\"imgSort\":1},{\"storeId\":1,\"imgType\":3,\"imgDescription\":\"菜品2\",\"imgSort\":2}]")
+    @ApiOperationSupport(order = 3)
+    @PostMapping("/uploadImg")
+    public R<List<Integer>> uploadImg(MultipartRequest multipartRequest, @RequestParam("list") String list) {
+        return R.data(fileUpload.uploadImg(multipartRequest, list));
+    }
+
+    @ApiOperation("上传app(格式包含apk,ipa,wgt,返回路径)")
+    @ApiOperationSupport(order = 4)
+    @PostMapping("/uploadApp")
+    public R<String> uploadApp(@RequestParam("file") MultipartFile file) {
+        log.info("StoreFileUploadController.uploadApp fileName:{}", file.getOriginalFilename());
+        return R.data(fileUpload.uploadApp(file));
+    }
+
+}

+ 73 - 0
alien-lawyer/src/main/java/shop/alien/lawyer/service/StoreImgService.java

@@ -0,0 +1,73 @@
+package shop.alien.lawyer.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import shop.alien.entity.result.R;
+import shop.alien.entity.store.StoreImg;
+import shop.alien.entity.store.vo.StoreImgTypeVo;
+
+import java.util.List;
+
+/**
+ * 二期-门店图片 服务类
+ *
+ * @author ssk
+ * @since 2024-12-05
+ */
+public interface StoreImgService extends IService<StoreImg> {
+
+    /**
+     * 获取门店图片
+     *
+     * @param storeId 门店id
+     * @param imgType 图片类型, 0:其他, 1:入口图, 2:相册, 3:菜品, 4:环境, 5:价目表, 6:推荐菜, 7:菜单, 8:用户评论, 9:商家申诉, 10:商家头像, 11:店铺轮播图
+     * @return list
+     */
+    List<StoreImg> getStoreImg(Integer storeId, Integer imgType);
+
+    /**
+     * 获取所有图片类型和数量
+     *
+     * @param storeId 门店id
+     * @return StoreImgTypeVo
+     */
+    List<StoreImgTypeVo> getStoreImgTypeCount(Integer storeId);
+
+    /**
+     * 获取轮播图
+     *
+     * @return List<StoreImg>
+     */
+    List<StoreImg> getCarouselImage();
+
+    /**
+     * @param id
+     * @param imgType
+     * @return
+     */
+    List<String> getUrl(String id, Integer imgType);
+
+    /**
+     * 获取用户打卡广场小人图片
+     *
+     * @param userId 用户ID,用于标识和获取特定用户的信息
+     * @return
+     */
+    R<String> getUserClockImg(Integer userId);
+
+    /**
+     * 通过businessId获取图片
+     *
+     * @param storeId 门店id
+     * @param imgType 图片类型, 0:其他, 1:入口图, 2:相册, 3:菜品, 4:环境, 5:价目表, 6:推荐菜, 7:菜单, 8:用户评论, 9:商家申诉, 10:商家头像, 11:店铺轮播图
+     * @return list
+     */
+    List<StoreImg> getByBusinessId(Integer storeId, Integer imgType, Integer businessId);
+
+    /**
+     * 删除图片
+     *
+     * @param storeId 门店id
+     * @param imgType 图片类型, 0:其他, 1:入口图, 2:相册, 3:菜品, 4:环境, 5:价目表, 6:推荐菜, 7:菜单, 8:用户评论, 9:商家申诉, 10:商家头像, 11:店铺轮播图
+     */
+    int saveOrUpdateImg(Integer storeId, Integer imgType);
+}

+ 177 - 0
alien-lawyer/src/main/java/shop/alien/lawyer/service/impl/StoreImgServiceImpl.java

@@ -0,0 +1,177 @@
+package shop.alien.lawyer.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import shop.alien.entity.result.R;
+import shop.alien.entity.store.LifeUser;
+import shop.alien.entity.store.StoreImg;
+import shop.alien.entity.store.StoreOfficialAlbum;
+import shop.alien.entity.store.vo.StoreImgTypeVo;
+import shop.alien.lawyer.service.StoreImgService;
+import shop.alien.mapper.LifeUserMapper;
+import shop.alien.mapper.StoreImgMapper;
+import shop.alien.mapper.StoreOfficialAlbumMapper;
+
+
+import java.util.Comparator;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+ * 二期-门店图片 服务实现类
+ *
+ * @author ssk
+ * @since 2024-12-05
+ */
+@Transactional
+@Service
+@RequiredArgsConstructor
+public class StoreImgServiceImpl extends ServiceImpl<StoreImgMapper, StoreImg> implements StoreImgService {
+
+    private final StoreImgMapper storeImgMapper;
+    private final StoreOfficialAlbumMapper storeOfficialAlbumMapper;
+    private final LifeUserMapper lifeUserMapper;
+
+    /**
+     * 获取门店图片
+     *
+     * @param storeId 门店id
+     * @param imgType 图片类型, 0:其他, 1:入口图, 2:相册, 3:菜品, 4:环境, 5:价目表, 6:推荐菜, 7:菜单, 8:用户评论, 9:商家申诉, 10:商家头像, 11:店铺轮播图
+     * @return list
+     */
+    @Override
+    public List<StoreImg> getStoreImg(Integer storeId, Integer imgType) {
+        LambdaQueryWrapper<StoreImg> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+        lambdaQueryWrapper.eq(StoreImg::getStoreId, storeId).eq(StoreImg::getImgType, imgType).orderByAsc(StoreImg::getImgSort);
+        return this.list(lambdaQueryWrapper);
+    }
+
+    /**
+     * 获取所有图片类型和数量
+     *
+     * @param storeId 门店id
+     * @return StoreImgTypeVo
+     */
+    @Override
+    public List<StoreImgTypeVo> getStoreImgTypeCount(Integer storeId) {
+        List<StoreImgTypeVo> storeImgTypeVoList = storeImgMapper.getStoreImgTypeCount(storeId);
+        for (StoreImgTypeVo storeImgTypeVo : storeImgTypeVoList) {
+            //图片类型, 0:其他, 1:入口图, 2:相册, 3:菜品, 4:环境, 5:价目表, 6:推荐菜, 7:菜单, 8:用户评论, 9:商家申诉, 10:商家头像, 11:店铺轮播图
+            switch (storeImgTypeVo.getImgType()) {
+                case 0:
+                    storeImgTypeVo.setImgTypeStr("其他");
+                    break;
+                case 3:
+                    storeImgTypeVo.setImgTypeStr("菜品");
+                    break;
+                case 4:
+                    storeImgTypeVo.setImgTypeStr("环境");
+                    break;
+                case 5:
+                    storeImgTypeVo.setImgTypeStr("价目表");
+                    break;
+            }
+        }
+        return storeImgTypeVoList.stream().sorted(Comparator.comparing(StoreImgTypeVo::getImgType)).collect(Collectors.toList());
+    }
+
+    /**
+     * 获取轮播图
+     *
+     * @return List<StoreImg>
+     */
+    @Override
+    public List<StoreImg> getCarouselImage() {
+        return this.list(new LambdaQueryWrapper<StoreImg>().eq(StoreImg::getImgType, 11));
+    }
+
+    @Override
+    public List<String> getUrl(String id, Integer imgType) {
+        QueryWrapper qw = new QueryWrapper<StoreImg>();
+        qw.eq(Objects.nonNull(id), "store_id", id).
+                eq(Objects.nonNull(imgType), "img_type", imgType);
+        List<StoreImg> resDb = storeImgMapper.selectList(qw);
+        return resDb.stream().map(StoreImg::getImgUrl).collect(Collectors.toList());
+
+    }
+
+    /**
+     * 获取用户打卡广场小人图片
+     *
+     * @param userId 用户ID,用于标识和获取特定用户的信息
+     * @return
+     */
+    @Override
+    public R<String> getUserClockImg(Integer userId) {
+        // 查询用户信息
+        LifeUser lifeUser = lifeUserMapper.selectById(userId);
+
+        // 判断用户是否存在
+        if (ObjectUtils.isNotEmpty(lifeUser)) {
+            // 检查用户是否设置了自定义打卡图片
+            if (ObjectUtils.isNotEmpty(lifeUser.getClockImgId())) {
+                // 查询用户设置的自定义图片
+                StoreImg storeImg = storeImgMapper.selectById(lifeUser.getClockImgId());
+                // 返回自定义图片URL或提示素材缺失
+                if (ObjectUtils.isNotEmpty(storeImg)) {
+                    return R.data(storeImg.getImgUrl());
+                } else {
+                    return R.fail("素材缺失");
+                }
+            } else {
+                /*// 查询默认打卡图片
+                StoreImg storeImg = storeImgMapper.selectOne(new QueryWrapper<StoreImg>().eq("img_type", 17).orderByAsc("img_sort").last("limit 1"));
+                // 设置默认图片给用户并返回图片URL或提示素材缺失
+                if (ObjectUtils.isNotEmpty(storeImg)) {
+                    lifeUser.setClockImgId(storeImg.getId());
+                    lifeUserMapper.updateById(lifeUser);
+                    return R.data(storeImg.getImgUrl());
+                } else {
+                    return R.fail("素材缺失");
+                }*/
+                return R.data("");
+            }
+        } else {
+            // 提示用户不存在
+            return R.fail("用户不存在");
+        }
+    }
+
+    /**
+     * 通过businessId获取图片
+     *
+     * @param storeId 门店id
+     * @param imgType 图片类型, 0:其他, 1:入口图, 2:相册, 3:菜品, 4:环境, 5:价目表, 6:推荐菜, 7:菜单, 8:用户评论, 9:商家申诉, 10:商家头像, 11:店铺轮播图
+     * @param businessId 业务ID
+     * @return list
+     */
+    @Override
+    public List<StoreImg> getByBusinessId(Integer storeId, Integer imgType, Integer businessId) {
+        LambdaQueryWrapper<StoreImg> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+        lambdaQueryWrapper.eq(StoreImg::getStoreId, storeId)
+                .eq(StoreImg::getImgType, imgType)
+                .eq(StoreImg::getBusinessId, businessId).orderByAsc(StoreImg::getImgSort);
+        List<StoreImg> storeImgList = this.list(lambdaQueryWrapper);
+        int imgCount = storeImgList.size();
+        LambdaUpdateWrapper<StoreOfficialAlbum> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.eq(StoreOfficialAlbum::getId, businessId).set(StoreOfficialAlbum::getImgCount, imgCount);
+        storeOfficialAlbumMapper.update(null, updateWrapper);
+        return this.list(lambdaQueryWrapper);
+    }
+
+    @Override
+    public int saveOrUpdateImg(Integer storeId, Integer imgType) {
+        int result = 0;
+        if(storeId !=null && storeId > 0 && imgType != null){
+            result = storeImgMapper.delete(new LambdaQueryWrapper<StoreImg>().eq(StoreImg::getStoreId, storeId).eq(StoreImg::getImgType, imgType));
+        }
+        return result;
+    }
+}

+ 234 - 0
alien-lawyer/src/main/java/shop/alien/lawyer/util/FileUploadUtil.java

@@ -0,0 +1,234 @@
+package shop.alien.lawyer.util;
+
+import com.alibaba.fastjson.JSONArray;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartRequest;
+import shop.alien.entity.store.vo.StoreImgVo;
+import shop.alien.lawyer.service.StoreImgService;
+import shop.alien.util.ali.AliOSSUtil;
+import shop.alien.util.common.RandomCreateUtil;
+import shop.alien.util.common.VideoUtils;
+import shop.alien.util.file.FileUtil;
+
+import java.io.File;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.*;
+
+/**
+ * 二期-文件上传
+ */
+@Slf4j
+@Component
+@RequiredArgsConstructor
+public class FileUploadUtil {
+
+    private final VideoUtils videoUtils;
+
+    private final StoreImgService storeImgService;
+
+    @Value("${spring.web.resources.static-locations}")
+    private String uploadDir;
+
+    private final AliOSSUtil aliOSSUtil;
+
+    List<String> imageFileType = Arrays.asList("jpg", "jpeg", "png", "bmp", "webp", "gif", "svg");
+    List<String> videoFileType = Arrays.asList("mp4", "avi", "flv", "mkv", "rmvb", "wmv", "3gp", "mov");
+    List<String> appFileType = Arrays.asList("apk", "ipk", "wgt");
+
+    /**
+     * 上传文件
+     *
+     * @param multipartFile 文件名
+     * @return 文件路径
+     */
+    public String uploadOneFile(MultipartFile multipartFile) {
+        try {
+            Map<String, String> fileNameAndType = FileUtil.getFileNameAndType(multipartFile);
+            String prefix = "";
+            if (imageFileType.contains(fileNameAndType.get("type").toLowerCase())) {
+                prefix = "image/";
+            } else if (videoFileType.contains(fileNameAndType.get("type").toLowerCase())) {
+                prefix = "video/";
+            }
+            return aliOSSUtil.uploadFile(multipartFile, prefix + fileNameAndType.get("name") + RandomCreateUtil.getRandomNum(6) + "." + fileNameAndType.get("type"));
+        } catch (Exception e) {
+            log.error("FileUpload.uploadOneFile ERROR Msg={}", e.getMessage());
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * 上传app文件
+     *
+     * @param multipartFile 文件名
+     * @return 文件路径
+     */
+    public String uploadApp(MultipartFile multipartFile) {
+        try {
+            Map<String, String> fileNameAndType = FileUtil.getFileNameAndType(multipartFile);
+            if (!appFileType.contains(fileNameAndType.get("type").toLowerCase())) {
+                log.error("FileUpload.uploadApp ERROR 该文件不是app格式文件");
+                return null;
+            }
+            String prefix = "app/";
+            return aliOSSUtil.uploadFile(multipartFile, prefix + fileNameAndType.get("name") + RandomCreateUtil.getRandomNum(6) + "." + fileNameAndType.get("type"));
+        } catch (Exception e) {
+            log.error("FileUpload.uploadApp ERROR Msg={}", e.getMessage());
+            return null;
+        }
+    }
+
+    /**
+     * 上传多个文件
+     *
+     * @param multipartRequest 多文件
+     * @return List<String>
+     */
+    public List<String> uploadMoreFile(MultipartRequest multipartRequest) {
+        try {
+            log.info("FileUpload.uploadMoreFile multipartRequest={}", multipartRequest.getFileNames());
+            Set<String> fileNameSet = multipartRequest.getMultiFileMap().keySet();
+            List<String> filePathList = new ArrayList<>();
+            for (String s : fileNameSet) {
+                MultipartFile multipartFile = multipartRequest.getFileMap().get(s);
+                log.info("FileUpload.uploadMoreFile fileName={}", multipartFile.getOriginalFilename());
+                String uploadDir = this.uploadDir.replace("file:///", "").replace("\\", "/");
+                String prefix;
+                Map<String, String> fileNameAndType = FileUtil.getFileNameAndType(multipartFile);
+                //区分文件类型
+                if (imageFileType.contains(fileNameAndType.get("type").toLowerCase())) {
+                    uploadDir += "/image";
+                    prefix = "image/";
+                    log.info("FileUpload.uploadMoreFile 获取到图片文件准备复制 {} {} {}", uploadDir, prefix, multipartFile.getOriginalFilename());
+                    filePathList.add(aliOSSUtil.uploadFile(multipartFile, prefix + fileNameAndType.get("name") + RandomCreateUtil.getRandomNum(6) + "." + fileNameAndType.get("type")));
+                    ;
+                } else if (videoFileType.contains(fileNameAndType.get("type").toLowerCase())) {
+                    uploadDir += "/video/";
+                    prefix = "video/";
+                    //上传视频文件
+                    log.info("FileUpload.uploadMoreFile 获取到视频文件准备复制 {} {} {}", uploadDir, prefix, multipartFile.getOriginalFilename());
+                    String videoFileName = fileNameAndType.get("name") + RandomCreateUtil.getRandomNum(6);
+                    String cacheVideoPath = copyFile(uploadDir, multipartFile);
+                    filePathList.add(aliOSSUtil.uploadFile(multipartFile, prefix + videoFileName + "." + fileNameAndType.get("type")));
+                    //缓存视频截图使用
+                    File videoFile = new File(cacheVideoPath);
+                    //获取视频某帧截图
+                    log.info("FileUpload.uploadMoreFile 视频文件复制完毕, 获取第一秒图片 {}", videoFile.getName());
+                    String videoPath = videoUtils.getImg(uploadDir + videoFile.getName());
+                    log.info("FileUpload.uploadMoreFile 视频文件复制完毕, 图片位置 {}", videoPath);
+                    if (!videoPath.isEmpty()) {
+                        File videoImgFile = new File(videoPath);
+                        Map<String, String> videoImg = FileUtil.getFileNameAndType(videoImgFile);
+                        filePathList.add(aliOSSUtil.uploadFile(videoImgFile, prefix + videoFileName + "." + videoImg.get("type")));
+                        videoImgFile.delete();
+                        videoFile.delete();
+                    } else {
+                        throw new RuntimeException("视频截图失败");
+                    }
+                }
+            }
+            return filePathList;
+        } catch (Exception e) {
+            log.error("FileUpload.uploadMoreFile ERROR Msg={}", e.getMessage());
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * 上传图片
+     *
+     * @param multipartRequest 文件
+     * @param list             图片List
+     * @return 图片id
+     */
+    public List<Integer> uploadImg(MultipartRequest multipartRequest, String list) {
+        JSONArray jsonArray = JSONArray.parseArray(list);
+        List<StoreImgVo> storeImgList = jsonArray.toJavaList(StoreImgVo.class);
+        List<Integer> resultList = new ArrayList<>();
+        Set<String> fileNameSet = multipartRequest.getMultiFileMap().keySet();
+        if (fileNameSet.size() != storeImgList.size()) {
+            log.error("FileUpload.uploadImg ERROR 文件数量与参数数量不匹配 fileNameSet{}, storeImgList={}", fileNameSet.size(), storeImgList.size());
+            throw new RuntimeException("文件数量与参数数量不匹配");
+        }
+        //匹配文件与数据
+        for (String s : fileNameSet) {
+            String[] split = s.split("_");
+            int index = Integer.parseInt(split[1]);
+            storeImgList.get(index).setName(s);
+        }
+        for (StoreImgVo storeImgVo : storeImgList) {
+            //获取文件
+            MultipartFile multipartFile = multipartRequest.getFileMap().get(storeImgVo.getName());
+            Map<String, String> fileInfo = FileUtil.getFileNameAndType(multipartFile);
+            String videoFileName = fileInfo.get("name") + RandomCreateUtil.getRandomNum(6);
+            String prefix;
+            String filePath = "";
+            if (imageFileType.contains(fileInfo.get("type").toLowerCase())) {
+                prefix = "image/";
+                filePath = aliOSSUtil.uploadFile(multipartFile, prefix + videoFileName + "." + fileInfo.get("type"));
+            } else if (videoFileType.contains(fileInfo.get("type").toLowerCase())) {
+                prefix = "video/";
+                filePath = aliOSSUtil.uploadFile(multipartFile, prefix + videoFileName + "." + fileInfo.get("type"));
+            }
+            storeImgVo.setImgUrl(filePath);
+            storeImgService.save(storeImgVo);
+            resultList.add(storeImgVo.getId());
+        }
+        return resultList;
+    }
+
+    /**
+     * 复制文件, 返回url链接
+     *
+     * @param localFilePath 本地路径
+     * @param file          文件
+     * @return 访问url路径
+     */
+    private String copyFile(String localFilePath, MultipartFile file) {
+        try {
+            File cacheFilePath = new File(localFilePath);
+            if (!cacheFilePath.exists()) {
+                cacheFilePath.mkdirs();
+            }
+            String fileName = file.getOriginalFilename().substring(0, file.getOriginalFilename().lastIndexOf('.'));
+            log.info("FileUpload.copyFile fileName={}", fileName);
+            String fileType = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf('.'));
+            log.info("FileUpload.copyFile fileType={}", fileType);
+            System.out.println(file.getOriginalFilename());
+            Path path = Paths.get(localFilePath, file.getOriginalFilename());
+            Files.createDirectories(path.getParent());
+            Files.write(path, file.getBytes());
+            return localFilePath + file.getOriginalFilename();
+        } catch (Exception e) {
+            log.error("FileUpload.copyFile ERROR Msg={}", e.getMessage());
+            return e.getMessage();
+        }
+    }
+
+    private String copyFile(String localFilePath, String urlPath, MultipartFile file) {
+        try {
+            String fileName = file.getOriginalFilename().substring(0, file.getOriginalFilename().lastIndexOf('.'));
+            log.info("FileUpload.copyFile fileName={}", fileName);
+            String fileType = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf('.'));
+            log.info("FileUpload.copyFile fileType={}", fileType);
+            String newFileName = fileName + RandomCreateUtil.getRandomNum(6) + fileType;
+            log.info("FileUpload.copyFile newFileName={}", newFileName);
+            newFileName = newFileName.replaceAll(",", "");
+            log.info("FileUpload.copyFile newFileName={}", newFileName);
+            Path path = Paths.get(localFilePath, newFileName);
+            Files.createDirectories(path.getParent());
+            Files.write(path, file.getBytes());
+            return urlPath + newFileName;
+        } catch (Exception e) {
+            log.error("FileUpload.copyFile ERROR Msg={}", e.getMessage());
+            return e.getMessage();
+        }
+    }
+
+}