瀏覽代碼

问题修复

huzhe 1 年之前
父節點
當前提交
84e1b7999f

+ 24 - 14
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/file/FileUtils.java

@@ -6,7 +6,12 @@ import cn.hutool.core.util.StrUtil;
 import jakarta.servlet.http.HttpServletResponse;
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
+import org.dromara.common.core.utils.StringUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.multipart.MultipartFile;
 
+import java.io.File;
+import java.io.IOException;
 import java.net.URLEncoder;
 import java.nio.charset.StandardCharsets;
 import java.util.regex.Matcher;
@@ -51,23 +56,28 @@ public class FileUtils extends FileUtil {
      * @return 新文件名
      */
     public static String getNewFileName(String oldName){
+        String extension = StringUtils.substringAfter(oldName, ".");
+        return UUID.randomUUID().toString() + "." + extension;
+    }
 
-        //1.旧名称判空(这里使用了 hutools)
-        if (StrUtil.isEmpty(oldName)){
-            return null;
+    /**
+     * 上传文件
+     * @param file
+     * @param path
+     * @param fileName
+     * @throws IOException
+     */
+    public static void upload(MultipartFile file, String path, String fileName) throws IOException {
+        //1. 判断文件夹是否存在,不存在则创建
+        File imageDir = new File(path);
+        if (!imageDir.exists()){
+            imageDir.mkdirs();
         }
 
-        //2.正则匹配获取文件后缀
-        Pattern sufixPattern = Pattern.compile(".*(\\..*)");
-        Matcher matcher = sufixPattern.matcher(oldName);
-
-        //3.UUID 生成文件新名称(这里使用了 hutools)
-        String newFileName = UUID.randomUUID().toString();
-        if (matcher.find()){
-            newFileName += matcher.group(1);
-        }
+        //2. 拼接文件完整路径
+        String imageFilePath = path + fileName;
 
-        //4.返回新名称
-        return newFileName;
+        //3. 保存照片
+        file.transferTo(new File(imageDir.getAbsoluteFile(), fileName));
     }
 }

+ 0 - 1
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/domain/bo/PtMealTypeBo.java

@@ -52,7 +52,6 @@ public class PtMealTypeBo extends BaseEntity {
     /**
      * 类别说明
      */
-    @NotBlank(message = "类别说明不能为空", groups = { AddGroup.class, EditGroup.class })
     private String mealNotes;
 
 

+ 0 - 4
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/domain/bo/PtWorkstationBo.java

@@ -53,7 +53,6 @@ public class PtWorkstationBo extends BaseEntity {
     /**
      * MAC地址
      */
-    @NotBlank(message = "MAC地址不能为空", groups = { AddGroup.class, EditGroup.class })
     private String mac;
 
     /**
@@ -71,13 +70,11 @@ public class PtWorkstationBo extends BaseEntity {
     /**
      * 计算机名称
      */
-    @NotBlank(message = "计算机名称不能为空", groups = { AddGroup.class, EditGroup.class })
     private String computerName;
 
     /**
      * 最大充值金额
      */
-    @NotNull(message = "最大充值金额不能为空", groups = { AddGroup.class, EditGroup.class })
     private Long maxAmount;
 
     /**
@@ -95,7 +92,6 @@ public class PtWorkstationBo extends BaseEntity {
     /**
      * 工作站说明
      */
-    @NotBlank(message = "工作站说明不能为空", groups = { AddGroup.class, EditGroup.class })
     private String remark;
 
 

+ 12 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/mapper/PtMealtypeMapper.java

@@ -1,9 +1,13 @@
 package org.dromara.backstage.basics.mapper;
 
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
 import org.dromara.backstage.basics.domain.PtMealType;
 import org.dromara.backstage.basics.domain.vo.PtMealTypeVo;
 import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
 
+import java.util.List;
+
 /**
  * 营业时段Mapper接口
  *
@@ -12,4 +16,12 @@ import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
  */
 public interface PtMealtypeMapper extends BaseMapperPlus<PtMealType, PtMealTypeVo> {
 
+    @Select("SELECT * FROM t_pt_mealType WHERE" +
+        " ((#{beginTime} >= begin_Time AND #{beginTime} <end_time)" +
+        " OR (#{endTime} > begin_Time AND #{endTime} <= end_time)" +
+        " OR type_id = #{typeId})" +
+        " AND meal_id != #{mealId} AND del_flag = 0")
+    List<PtMealTypeVo> validataSelect(@Param("typeId") String typeId, @Param("mealId") Long mealId
+        , @Param("beginTime") String beginTime, @Param("endTime") String endTime);
+
 }

+ 8 - 1
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/service/impl/PtMealtypeServiceImpl.java

@@ -3,6 +3,7 @@ package org.dromara.backstage.basics.service.impl;
 import cn.hutool.core.convert.Convert;
 import cn.hutool.core.util.ObjectUtil;
 import org.dromara.common.core.constant.CacheNames;
+import org.dromara.common.core.exception.ServiceException;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
@@ -57,6 +58,7 @@ public class PtMealtypeServiceImpl implements IPtMealtypeService {
     @Override
     public TableDataInfo<PtMealTypeVo> queryPageList(PtMealTypeBo bo, PageQuery pageQuery) {
         LambdaQueryWrapper<PtMealType> lqw = buildQueryWrapper(bo);
+        lqw.orderByAsc(PtMealType::getBeginTime);
         Page<PtMealTypeVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
         return TableDataInfo.build(result);
     }
@@ -116,7 +118,12 @@ public class PtMealtypeServiceImpl implements IPtMealtypeService {
      * 保存前的数据校验
      */
     private void validEntityBeforeSave(PtMealType entity){
-        //TODO 做一些数据校验,如唯一约束
+       // 校验餐类是否存在
+        List<PtMealTypeVo> list = baseMapper.validataSelect(entity.getTypeId(), entity.getMealId()
+            ,entity.getBeginTime(), entity.getEndTime());
+       if(!list.isEmpty()){
+           throw new ServiceException("餐类名称不允许重复,并且开始结束时间不能交叉!");
+       }
     }
 
     /**

+ 1 - 1
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/domain/bo/PtSubsidyBo.java

@@ -86,5 +86,5 @@ public class PtSubsidyBo extends BaseEntity {
      */
     private String remark;
 
-    private List<PtSubsidyitemBo> subsidyitemBoList;
+    private List<PtSubsidyitemBo> ptSubsidyItemList;
 }

+ 11 - 4
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/service/impl/PtSubsidyServiceImpl.java

@@ -94,7 +94,7 @@ public class PtSubsidyServiceImpl implements IPtSubsidyService {
         validEntityBeforeSave(add);
         boolean flag = baseMapper.insert(add) > 0;
         if (flag) {
-            List<PtSubsidyitemBo> subsidyitemBoList = bo.getSubsidyitemBoList();
+            List<PtSubsidyitemBo> subsidyitemBoList = bo.getPtSubsidyItemList();
             bo.setMainId(add.getMainId());
             subsidyitemBoList.stream().forEach(subsidyitemBo ->{
                 subsidyitemBo.setMainId(add.getMainId());
@@ -111,12 +111,14 @@ public class PtSubsidyServiceImpl implements IPtSubsidyService {
      * @return 是否修改成功
      */
     @Override
+    @Transactional
     public Boolean updateByBo(PtSubsidyBo bo) {
         PtSubsidy update = MapstructUtils.convert(bo, PtSubsidy.class);
         validEntityBeforeSave(update);
         boolean flag = baseMapper.updateById(update) > 0;
-        if(flag){
-            List<PtSubsidyitemBo> subsidyitemBoList = bo.getSubsidyitemBoList();
+
+        if(flag && bo.getPtSubsidyItemList() != null){
+            List<PtSubsidyitemBo> subsidyitemBoList = bo.getPtSubsidyItemList();
             subsidyitemBoList.stream().forEach(subsidyitemBo ->{
                 setSubsidyInfo(subsidyitemBo, bo);
                 if(subsidyitemBo.getItemId() == null){
@@ -158,7 +160,12 @@ public class PtSubsidyServiceImpl implements IPtSubsidyService {
     @Override
     public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
         if(isValid){
-            //TODO 做一些业务上的校验,判断是否需要校验
+            //已经完成审核的数据不能删除
+            LambdaQueryWrapper<PtSubsidy> wrapper = buildQueryWrapper(new PtSubsidyBo());
+            wrapper.in(PtSubsidy::getMainId, ids).eq(PtSubsidy::getAuditStatus, "1");
+            if(!baseMapper.selectList(wrapper).isEmpty()) {
+                return false;
+            }
         }
         return baseMapper.deleteByIds(ids) > 0;
     }

+ 45 - 51
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/controller/PtUserAccountController.java

@@ -1,52 +1,51 @@
 package org.dromara.backstage.payment.controller;
 
-import java.io.File;
-import java.io.IOException;
-import java.text.SimpleDateFormat;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.List;
-
+import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.lang.UUID;
 import cn.hutool.core.lang.tree.Tree;
-import lombok.RequiredArgsConstructor;
 import jakarta.servlet.http.HttpServletResponse;
-import jakarta.validation.constraints.*;
-import cn.dev33.satoken.annotation.SaCheckPermission;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.RequiredArgsConstructor;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.dromara.backstage.cardCenter.domain.bo.PtCardBo;
 import org.dromara.backstage.cardCenter.domain.vo.PtCardVo;
 import org.dromara.backstage.cardCenter.service.IPtCardService;
 import org.dromara.backstage.payment.domain.bo.PtBagBo;
+import org.dromara.backstage.payment.domain.bo.PtUserAccountBo;
 import org.dromara.backstage.payment.domain.vo.PtBagVo;
 import org.dromara.backstage.payment.domain.vo.PtUserAccount4SelectVo;
 import org.dromara.backstage.payment.domain.vo.PtUserAccountInfoVo;
+import org.dromara.backstage.payment.domain.vo.PtUserAccountVo;
 import org.dromara.backstage.payment.service.IPtBagService;
-import org.dromara.common.core.utils.StreamUtils;
+import org.dromara.backstage.payment.service.IPtUserAccountService;
+import org.dromara.common.core.domain.R;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.core.utils.file.FileUtils;
 import org.dromara.common.core.utils.file.MimeTypeUtils;
-import org.dromara.common.satoken.utils.LoginHelper;
-import org.dromara.system.api.RemoteDeptService;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.http.MediaType;
-import org.springframework.web.bind.annotation.*;
-import org.springframework.validation.annotation.Validated;
-import org.dromara.common.idempotent.annotation.RepeatSubmit;
-import org.dromara.common.log.annotation.Log;
-import org.dromara.common.web.core.BaseController;
-import org.dromara.common.mybatis.core.page.PageQuery;
-import org.dromara.common.core.domain.R;
 import org.dromara.common.core.validate.AddGroup;
 import org.dromara.common.core.validate.EditGroup;
-import org.dromara.common.log.enums.BusinessType;
 import org.dromara.common.excel.utils.ExcelUtil;
-import org.dromara.backstage.payment.domain.vo.PtUserAccountVo;
-import org.dromara.backstage.payment.domain.bo.PtUserAccountBo;
-import org.dromara.backstage.payment.service.IPtUserAccountService;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.system.api.RemoteDeptService;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.MediaType;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
 /**
  * 一卡通账户
  * 前端访问路由地址为:/payment/ptUserAccount
@@ -67,9 +66,9 @@ public class PtUserAccountController extends BaseController {
     @DubboReference
     private final RemoteDeptService remoteDeptService;
 
-    @Value("${upload.upload-path}/")
+    @Value("${upload.upload-path}/")    // 文件上传路径
     private String uploadPath;
-    @Value("${upload.image.user}/")
+    @Value("${upload.image.user}/")     // 用户头像路径
     private String userPath;
 
     /**
@@ -147,37 +146,23 @@ public class PtUserAccountController extends BaseController {
     @SaCheckPermission("payment:ptUserAccount:edit")
     @Log(title = "一卡通账户", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
-    @PostMapping(value = "/avatar", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
-    public R<String> avatar(@RequestPart("file") MultipartFile file,
+    @PostMapping(value = "/photoUpload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+    public R<String> photoUpload(@RequestPart("file") MultipartFile file,
                             @RequestParam("userId") Long userId) throws IOException {
         if (!file.isEmpty()) {
-            String extension = FileUtil.extName(file.getOriginalFilename());
+            String extension = FileUtils.extName(file.getOriginalFilename());
             if (!StringUtils.equalsAnyIgnoreCase(extension, MimeTypeUtils.IMAGE_EXTENSION)) {
                 return R.fail("文件格式不正确,请上传" + Arrays.toString(MimeTypeUtils.IMAGE_EXTENSION) + "格式");
             }
-            //1.获取日期字符串
-            String formatDate = sdf.format(new Date());
-
-            //2.获取新文件名
-            String newFileName = FileUtils.getNewFileName(file.getOriginalFilename());
-
-            //3.保存图片
-
-            //3.1 判断文件夹是否存在,不存在则创建
-            String imageDirPath = uploadPath + userPath + formatDate;
-            File imageDir = new File(imageDirPath);
-            if (!imageDir.exists()){
-                imageDir.mkdirs();
-            }
 
-            //3.2 拼接文件完整路径
-            String imageFilePath = imageDirPath + newFileName;
-
-            //3.3 保存照片
-            file.transferTo(new File(imageDir.getAbsoluteFile(), newFileName));
+            //1. 拼接文件完整路径
+            String path = uploadPath + userPath;
+            String newFileName = UUID.randomUUID() + "." + extension;
+            //2. 保存照片
+            FileUtils.upload(file, path, newFileName);
 
             //4.保存图片路径到数据库
-            String photoUrl = userPath + formatDate + newFileName;
+            String photoUrl = userPath + newFileName;
             ptUserAccountService.updateByBo(PtUserAccountBo.builder().userId(userId).photo(photoUrl).build());
 
             return R.ok("上传图片成功");
@@ -185,6 +170,15 @@ public class PtUserAccountController extends BaseController {
         return R.fail("上传图片异常,请联系管理员");
     }
 
+    @SaCheckPermission("payment:ptUserAccount:edit")
+    @Log(title = "一卡通账户", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PostMapping(value = "/photoBatchUpload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+    public R<String> photoBatchUpload(@RequestPart("file") MultipartFile[] files) throws IOException {
+        int okNum = ptUserAccountService.photoBatchUpload(files, uploadPath, userPath);
+        return R.ok("上传图片成功数量: "+ okNum);
+    }
+
     /**
      * 删除一卡通账户
      *

+ 9 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/service/IPtUserAccountService.java

@@ -5,7 +5,9 @@ import org.dromara.backstage.payment.domain.vo.PtUserAccountVo;
 import org.dromara.backstage.payment.domain.bo.PtUserAccountBo;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.core.page.PageQuery;
+import org.springframework.web.multipart.MultipartFile;
 
+import java.io.IOException;
 import java.util.Collection;
 import java.util.List;
 
@@ -141,4 +143,11 @@ public interface IPtUserAccountService {
      * @return
      */
     Boolean closeAccount(Long[] userIds);
+
+    /**
+     * 批量上传人脸照片
+     * @param files
+     * @return
+     */
+    int photoBatchUpload(MultipartFile[] files, String uploadPath, String userPath) throws IOException;
 }

+ 45 - 4
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/service/impl/PtUserAccountServiceImpl.java

@@ -1,5 +1,7 @@
 package org.dromara.backstage.payment.service.impl;
 
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.lang.UUID;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import lombok.extern.slf4j.Slf4j;
@@ -7,8 +9,11 @@ import org.apache.dubbo.config.annotation.DubboReference;
 import org.dromara.backstage.cardCenter.service.IPtCardService;
 import org.dromara.backstage.payment.domain.vo.PtUserAccount4SelectVo;
 import org.dromara.backstage.payment.service.IPtBagService;
+import org.dromara.common.core.domain.R;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.core.utils.file.FileUtils;
+import org.dromara.common.core.utils.file.MimeTypeUtils;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -22,12 +27,12 @@ import org.dromara.backstage.payment.domain.vo.PtUserAccountVo;
 import org.dromara.backstage.payment.domain.PtUserAccount;
 import org.dromara.backstage.payment.mapper.PtUserAccountMapper;
 import org.dromara.backstage.payment.service.IPtUserAccountService;
+import org.springframework.web.multipart.MultipartFile;
 
+import java.io.IOException;
 import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Collection;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * 一卡通账户Service业务层处理
@@ -343,4 +348,40 @@ public class PtUserAccountServiceImpl implements IPtUserAccountService {
         }
         return notCloseList.isEmpty();
     }
+
+    @Override
+    public int photoBatchUpload(MultipartFile[] files, String uploadPath, String userPath) throws IOException {
+        //1. 根据文件名查询账户信息
+        List<String> idCards = new ArrayList<>();
+        for (MultipartFile file : files){
+            String idCard = FileUtil.mainName(file.getOriginalFilename());
+            idCards.add(idCard);
+        }
+        Map<String, Long> idCardMap = baseMapper.selectList(Wrappers.lambdaQuery(PtUserAccount.class)
+            .select(PtUserAccount::getIdNumber)
+            .in(PtUserAccount::getIdNumber,idCards)
+        ).stream().collect(Collectors.toMap(PtUserAccount::getIdNumber, PtUserAccount:: getUserId));
+
+        //2. 循环上传照片,并更新账号的照片路径
+            //2.1. 拼接文件完整路径
+        String path = uploadPath + userPath;
+        int okNum = 0;
+        for (MultipartFile file : files){
+            String extension = FileUtils.extName(file.getOriginalFilename());
+            if (StringUtils.equalsAnyIgnoreCase(extension, MimeTypeUtils.IMAGE_EXTENSION)) {
+                //只上传指定格式文件
+                String idCard = FileUtil.mainName(file.getOriginalFilename());
+                if (idCardMap.containsKey(idCard)){
+                    //只上传根据身份证能匹配到对应账号的照片
+                    String newFileName = UUID.randomUUID() + "." + extension;
+                    //2. 保存照片
+                    FileUtils.upload(file, path, newFileName);
+                    //4.保存图片路径到数据库
+                    String photoUrl = userPath + newFileName;
+                        updateByBo(PtUserAccountBo.builder().userId(idCardMap.get(idCard)).photo(photoUrl).build());
+                }
+            }
+        }
+        return 0;
+    }
 }

+ 2 - 0
ruoyi-modules/ruoyi-backstage/src/main/resources/mapper/basicParameter/PtMealtypeMapper.xml

@@ -7,6 +7,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     <resultMap type="org.dromara.backstage.basics.domain.PtMealType" id="PtMealtypeResult">
             <result property="mealId"    column="meal_id"    />
             <result property="tenantId"    column="tenant_id"    />
+            <result property="typeId"    column="type_id"    />
             <result property="mealName"    column="meal_name"    />
             <result property="beginTime"    column="begin_Time"    />
             <result property="endTime"    column="end_time"    />
@@ -18,4 +19,5 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <result property="updateBy"    column="update_by"    />
             <result property="updateTime"    column="update_time"    />
     </resultMap>
+
 </mapper>