he2802 2 éve
szülő
commit
21fd51f2ab
24 módosított fájl, 339 hozzáadás és 4 törlés
  1. 12 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/common/CommonController.java
  2. 9 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/goods/GoodsController.java
  3. 20 0
      zhongzheng-common/src/main/java/com/zhongzheng/common/utils/file/ImageUtils.java
  4. 1 0
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/config/SecurityConfig.java
  5. 5 0
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/UserServiceImpl.java
  6. 13 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/mapper/CourseHandoutsMapper.java
  7. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/ICourseHandoutsService.java
  8. 12 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseHandoutsServiceImpl.java
  9. 32 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/UpdateStudentImageBo.java
  10. 25 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/GoodsHandoutsCopyTenantBo.java
  11. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/mapper/GoodsMapper.java
  12. 1 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/IGoodsService.java
  13. 66 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/impl/GoodsServiceImpl.java
  14. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/mapper/UserMapper.java
  15. 7 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/mapper/UserStudyRecordPhotoMapper.java
  16. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserService.java
  17. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserStudyRecordPhotoService.java
  18. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserSubscribeService.java
  19. 10 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserStudyRecordPhotoServiceImpl.java
  20. 66 4
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserSubscribeServiceImpl.java
  21. 16 0
      zhongzheng-system/src/main/resources/mapper/modules/course/CourseHandoutsMapper.xml
  22. 4 0
      zhongzheng-system/src/main/resources/mapper/modules/goods/GoodsMapper.xml
  23. 12 0
      zhongzheng-system/src/main/resources/mapper/modules/user/UserMapper.xml
  24. 11 0
      zhongzheng-system/src/main/resources/mapper/modules/user/UserStudyRecordPhotoMapper.xml

+ 12 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/common/CommonController.java

@@ -34,6 +34,7 @@ import com.zhongzheng.modules.distribution.vo.DistributionSellerVo;
 import com.zhongzheng.modules.exam.bo.ExamApplyDetailBo;
 import com.zhongzheng.modules.exam.bo.ExamApplyResultBo;
 import com.zhongzheng.modules.exam.bo.ExamApplySubscribeBo;
+import com.zhongzheng.modules.exam.bo.UpdateStudentImageBo;
 import com.zhongzheng.modules.exam.service.IExamApplyService;
 import com.zhongzheng.modules.exam.vo.ExamApplyDetailVo;
 import com.zhongzheng.modules.goods.bo.AlikeGoodsBo;
@@ -285,6 +286,17 @@ public class CommonController extends BaseController {
     }
 
 
+    @ApiOperation("学员学时图片修改")
+    @PostMapping("common/student/image/update")
+    public AjaxResult updateStudentImage(@RequestBody UpdateStudentImageBo bo) {
+        if (!ToolsUtils.checkSignFromOldSys(bo.getStamp().toString(), bo.getSign())) {
+            return AjaxResult.error("签名错误");
+        }
+        iUserSubscribeService.updateStudentImage(bo);
+        return AjaxResult.success();
+    }
+
+
     @ApiOperation("获取某场考试信息")
     @PostMapping("common/apply/detail")
     public AjaxResult examApplyDetail(@RequestBody ExamApplyDetailBo bo) {

+ 9 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/goods/GoodsController.java

@@ -346,6 +346,15 @@ public class GoodsController extends BaseController {
         return toAjax(iGoodsService.goodsNodeCopyAddTenant(bo) ? 1 : 0);
     }
 
+    /**
+     * 商品讲义复制
+     */
+    @ApiOperation("商品讲义复制")
+    @PostMapping("/handouts/copy/add")
+    public AjaxResult<Void> goodsHandoutsCopyAddTenant(@RequestBody GoodsHandoutsCopyTenantBo bo) {
+        return toAjax(iGoodsService.goodsHandoutsCopyAddTenant(bo) ? 1 : 0);
+    }
+
     /**
      * 商品关系ID处理(全量复制后的处理方法)
      */

+ 20 - 0
zhongzheng-common/src/main/java/com/zhongzheng/common/utils/file/ImageUtils.java

@@ -9,6 +9,7 @@ import org.slf4j.LoggerFactory;
 import sun.misc.BASE64Encoder;
 
 import javax.imageio.ImageIO;
+import java.awt.*;
 import java.awt.image.BufferedImage;
 import java.io.*;
 import java.net.URL;
@@ -106,4 +107,23 @@ public class ImageUtils
         return s;
 
     }
+
+    /** * 旋转图片为指定角度  图片宽高不变*
+     * @param bufferedimage * 目标图像 *
+     * @param degree * 旋转角度 *
+     * @return */
+    public static BufferedImage rotateImage(final BufferedImage bufferedimage, final int degree)
+    {
+        int w= bufferedimage.getWidth(); // 得到图片宽度。
+        int h= bufferedimage.getHeight();// 得到图片高度。
+        int type= bufferedimage.getColorModel().getTransparency();// 得到图片透明度。
+        BufferedImage img;// 空的图片。
+        Graphics2D graphics2d;// 空的画笔。
+        (graphics2d= (img= new BufferedImage(w, h, type)).createGraphics()).setRenderingHint( RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
+        graphics2d.rotate(Math.toRadians(degree), w/2, h/2);// 旋转,degree是整型,度数,比如垂直90度。   •rotate(double arc,double x, double y):图形以点(x,y)为轴点,旋转arc弧度。
+        graphics2d.drawImage(bufferedimage, 0, 0, null);// 从bufferedimagecopy图片至img,0,0是img的坐标。
+        graphics2d.dispose();
+
+        return img;// 返回复制好的图片,原图片依然没有变,没有旋转,下次还可以使用。
+    }
 }

+ 1 - 0
zhongzheng-framework/src/main/java/com/zhongzheng/framework/config/SecurityConfig.java

@@ -140,6 +140,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
                 .antMatchers("/common/get/goods").anonymous()
                 .antMatchers("/common/get/goods/studyUrl").anonymous()
                 .antMatchers("/common/apply/detail").anonymous()
+                .antMatchers("/common/student/image/update").anonymous()
                 .antMatchers("/common/platform/pay").anonymous()
                 .antMatchers("/common/platform/pay/handle").anonymous()
                 .antMatchers("/common/alike/goods").anonymous()

+ 5 - 0
zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/UserServiceImpl.java

@@ -1568,6 +1568,11 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
         return vo;
     }
 
+    @Override
+    public List<User> listByIdsNotTenant(List<Long> userIds) {
+        return baseMapper.listByIdsNotTenant(userIds);
+    }
+
 
     @Override
     public Map<String, Object> accountLogin(UserAppAccountLoginBo bo) {

+ 13 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/mapper/CourseHandoutsMapper.java

@@ -27,4 +27,17 @@ public interface CourseHandoutsMapper extends BaseMapper<CourseHandouts> {
 
     @InterceptorIgnore(tenantLine = "true")
     CourseHandouts getHandoutsByTenant(@Param("encoder") String encoder,@Param("newTenantId") Long newTenantId);
+
+    @InterceptorIgnore(tenantLine = "true")
+    List<Long> getGoodsIds(@Param("handoutsId") Long handoutsId,@Param("tenantId") Long tenantId);
+
+    @InterceptorIgnore(tenantLine = "true")
+    void removeHandouts(@Param("handoutsId") Long handoutsId,@Param("tenantId") Long tenantId);
+
+    @InterceptorIgnore(tenantLine = "true")
+    void removeHandoutsBusiness(@Param("handoutsId") Long handoutsId,@Param("tenantId") Long tenantId);
+
+    @InterceptorIgnore(tenantLine = "true")
+    void removeHandoutsFile(@Param("handoutsId") Long handoutsId,@Param("tenantId") Long tenantId);
+
 }

+ 3 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/ICourseHandoutsService.java

@@ -57,4 +57,7 @@ public interface ICourseHandoutsService extends IService<CourseHandouts> {
 
     CourseHandouts getHandoutsByTenant(String encoder, Long newTenantId);
 
+    List<Long> getGoodsIds(Long handoutsId, Long tenantId);
+
+	void removeHandouts(Long handoutsId, Long tenantId);
 }

+ 12 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseHandoutsServiceImpl.java

@@ -325,5 +325,17 @@ public class CourseHandoutsServiceImpl extends ServiceImpl<CourseHandoutsMapper,
         return baseMapper.getHandoutsByTenant(encoder, newTenantId);
     }
 
+    @Override
+    public List<Long> getGoodsIds(Long handoutsId, Long tenantId) {
+        return baseMapper.getGoodsIds(handoutsId,tenantId);
+    }
+
+    @Override
+    public void removeHandouts(Long handoutsId, Long tenantId) {
+        baseMapper.removeHandouts(handoutsId, tenantId);
+        baseMapper.removeHandoutsBusiness(handoutsId, tenantId);
+        baseMapper.removeHandoutsFile(handoutsId, tenantId);
+    }
+
 
 }

+ 32 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/UpdateStudentImageBo.java

@@ -0,0 +1,32 @@
+package com.zhongzheng.modules.exam.bo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2023年07月18日 14:25
+ */
+@Data
+public class UpdateStudentImageBo implements Serializable {
+
+    @ApiModelProperty("当前时间戳")
+    @NotBlank(message = "当前时间戳不能为空")
+    private Long stamp;
+
+    @ApiModelProperty("签名")
+    @NotBlank(message = "签名不能为空")
+    private String sign;
+
+    @ApiModelProperty("图片地址")
+    private String imageUrl;
+
+    @ApiModelProperty("学员身份证")
+    private String idCard;
+
+    @ApiModelProperty("旋转角度")
+    private Integer degree;
+}

+ 25 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/GoodsHandoutsCopyTenantBo.java

@@ -0,0 +1,25 @@
+package com.zhongzheng.modules.goods.bo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author yangdamao
+ * @date 2022年12月28日 9:28
+ */
+@Data
+public class GoodsHandoutsCopyTenantBo implements Serializable {
+
+    @ApiModelProperty("机构ID")
+    private List<Long> tenantId;
+
+    @ApiModelProperty("讲义ID")
+    private Long handoutsId;
+
+    @ApiModelProperty("商品ID")
+    private Long goodsId;
+
+}

+ 3 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/mapper/GoodsMapper.java

@@ -75,4 +75,7 @@ public interface GoodsMapper extends BaseMapper<Goods> {
 
     @InterceptorIgnore(tenantLine = "true")
     Goods getGoodsByTenantTwo(@Param("goodsName") String goodsName,@Param("code") String code,@Param("tenantId") Long tenantId);
+
+    @InterceptorIgnore(tenantLine = "true")
+    void updateHandoutsId(@Param("goodsId") Long goodsId,@Param("tenantId") Long tenantId,@Param("handoutsId") Long handoutsId);
 }

+ 1 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/IGoodsService.java

@@ -141,4 +141,5 @@ public interface IGoodsService extends IService<Goods> {
 
 	Goods queryGoodsByIdTenant(Long goodsId, Long tenantId);
 
+    boolean goodsHandoutsCopyAddTenant(GoodsHandoutsCopyTenantBo bo);
 }

+ 66 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/impl/GoodsServiceImpl.java

@@ -1789,6 +1789,7 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
         }
     }
 
+    @Override
     public boolean goodsCopyOne(GoodsBatchCopyTenantBo bo){
 
         log.info("一建商品复制开始:"+ DateUtils.getTime());
@@ -4882,6 +4883,71 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
         return baseMapper.queryGoodsByIdTenant(goodsId,tenantId);
     }
 
+    @Override
+    public boolean goodsHandoutsCopyAddTenant(GoodsHandoutsCopyTenantBo bo) {
+        CourseHandouts handouts = iCourseHandoutsService.getById(bo.getHandoutsId());
+        if (ObjectUtils.isNull(handouts)){
+            throw new CustomException("讲义不存在,请检查!");
+        }
+        List<SysGoodsCopyRecord> array = new ArrayList<>();
+
+        Long oldId = handouts.getHandoutsId();
+        Goods goods = getById(bo.getGoodsId());
+        for (Long tenantId : bo.getTenantId()) {
+            //讲义复制
+            Goods goodsTwo = baseMapper.getGoodsByTenantTwo(goods.getGoodsName(), goods.getCode(), tenantId);
+            if (ObjectUtils.isNull(goodsTwo)){
+                continue;
+            }
+           List<Long> goodsIds = iCourseHandoutsService.getGoodsIds(goodsTwo.getHandoutsId(),tenantId);
+            if (goodsIds.stream().allMatch(x -> x.equals(goodsTwo.getGoodsId()))){
+                //删除讲义
+                iCourseHandoutsService.removeHandouts(goodsTwo.getHandoutsId(),tenantId);
+            }
+
+            //新增
+            handouts.setHandoutsId(null);
+            handouts.setTenantId(tenantId);
+            iCourseHandoutsService.save(handouts);
+            Long newId = handouts.getHandoutsId();
+
+            //业务层次
+            List<CourseHandoutsBusiness> list = iCourseHandoutsBusinessService
+                    .list(new LambdaQueryWrapper<CourseHandoutsBusiness>()
+                    .eq(CourseHandoutsBusiness::getHandoutsId, oldId));
+            if (CollectionUtils.isNotEmpty(list)){
+                List<CourseHandoutsBusiness> collect = list.stream().map(business -> {
+                    business.setId(null);
+                    business.setTenantId(tenantId);
+                    //项目
+                    business.setEducationId(getNewEducationTypeId(business.getEducationId(), tenantId,array));
+                    //业务
+                    business.setBusinessId(getNewBusinessId(business.getBusinessId(), tenantId,array));
+                    //科目
+                    business.setSubjectId(getNewSubjectId(business.getSubjectId(), tenantId,array));
+                    //讲义
+                    business.setHandoutsId(newId);
+                    return business;
+                }).collect(Collectors.toList());
+                iCourseHandoutsBusinessService.saveBatch(collect);
+            }
+
+            //讲义文件
+            List<CourseFile> courseFileList = iCourseFileService.list(new LambdaQueryWrapper<CourseFile>().eq(CourseFile::getHandoutsId, oldId).eq(CourseFile::getStatus, 1));
+            if (CollectionUtils.isNotEmpty(courseFileList)){
+                //重新添加讲义文件
+                handleCourseFile(courseFileList,newId,tenantId);
+            }
+
+            updateHandoutsId(goodsTwo.getGoodsId(),tenantId,newId);
+        }
+        return true;
+    }
+
+    private void updateHandoutsId(Long goodsId, Long tenantId, Long handoutsId) {
+        baseMapper.updateHandoutsId(goodsId,tenantId,handoutsId);
+    }
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public boolean updateGoodsRepair(UpdateGoodsRepairBo bo) {

+ 3 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/mapper/UserMapper.java

@@ -72,4 +72,7 @@ public interface UserMapper extends BaseMapper<User> {
 
     @InterceptorIgnore(tenantLine = "true")
     User getUserByAccount(@Param("userAccount")String userAccount);
+
+    @InterceptorIgnore(tenantLine = "true")
+    List<User> listByIdsNotTenant(@Param("userIds")List<Long> userIds);
 }

+ 7 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/mapper/UserStudyRecordPhotoMapper.java

@@ -1,5 +1,6 @@
 package com.zhongzheng.modules.user.mapper;
 
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
 import com.zhongzheng.modules.user.domain.UserStudyRecordPhoto;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Param;
@@ -18,4 +19,10 @@ public interface UserStudyRecordPhotoMapper extends BaseMapper<UserStudyRecordPh
     String selectGradeRecentOnePhoto(@Param("userId") Long userId,@Param("gradeId") Long gradeId);
 
     List<String> selectGradePhotoWeek(@Param("userId") Long userId,@Param("gradeId") Long gradeId,@Param("searchWeekStartTime") Long searchWeekStartTime,@Param("searchWeekEndTime") Long searchWeekEndTime);
+
+    @InterceptorIgnore(tenantLine = "true")
+    List<UserStudyRecordPhoto> listByPhoto(@Param("imageUrl") String imageUrl);
+
+    @InterceptorIgnore(tenantLine = "true")
+    void updateBatchByIdNotTenant(@Param("ids") List<Long> ids,@Param("upload") String upload);
 }

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserService.java

@@ -133,4 +133,6 @@ public interface IUserService extends IService<User> {
 	UserLiveAccountLoginVo smsLiveUnifyLogin(UserLiveAccountLoginBo bo);
 
 	UserLiveAccountLoginVo liveUnifyLoginRefresh(UserLiveAccountLoginBo bo);
+
+    List<User> listByIdsNotTenant(List<Long> userIds);
 }

+ 3 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserStudyRecordPhotoService.java

@@ -57,4 +57,7 @@ public interface IUserStudyRecordPhotoService extends IService<UserStudyRecordPh
 
 	List<String> selectGradePhotoWeek(Long userId,Long gradeId,Long searchWeekStartTime,Long searchWeekEndTime);
 
+    List<UserStudyRecordPhoto> getListByPhoto(String imageUrl);
+
+	void updateBatchByIdNotTenant(List<Long> ids, String upload);
 }

+ 3 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserSubscribeService.java

@@ -2,6 +2,7 @@ package com.zhongzheng.modules.user.service;
 
 import com.zhongzheng.modules.base.bo.ConsoleQueryBo;
 import com.zhongzheng.modules.exam.bo.ExamApplySubscribeBo;
+import com.zhongzheng.modules.exam.bo.UpdateStudentImageBo;
 import com.zhongzheng.modules.exam.vo.ExamSessionVo;
 import com.zhongzheng.modules.user.bo.*;
 import com.zhongzheng.modules.user.domain.UserSubscribe;
@@ -107,4 +108,6 @@ public interface IUserSubscribeService extends IService<UserSubscribe> {
 	List<ExamSessionVo> getExamSession(String applyDate);
 
     void examApplySubscribe(ExamApplySubscribeBo bo);
+
+    void updateStudentImage(UpdateStudentImageBo bo);
 }

+ 10 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserStudyRecordPhotoServiceImpl.java

@@ -135,4 +135,14 @@ public class UserStudyRecordPhotoServiceImpl extends ServiceImpl<UserStudyRecord
     public List<String> selectGradePhotoWeek(Long userId, Long gradeId,Long searchWeekStartTime,Long searchWeekEndTime) {
         return this.baseMapper.selectGradePhotoWeek(userId,gradeId,searchWeekStartTime,searchWeekEndTime);
     }
+
+    @Override
+    public List<UserStudyRecordPhoto> getListByPhoto(String imageUrl) {
+        return baseMapper.listByPhoto(imageUrl);
+    }
+
+    @Override
+    public void updateBatchByIdNotTenant(List<Long> ids, String upload) {
+        baseMapper.updateBatchByIdNotTenant(ids, upload);
+    }
 }

+ 66 - 4
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserSubscribeServiceImpl.java

@@ -24,6 +24,8 @@ import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.common.utils.ServletUtils;
 import com.zhongzheng.common.utils.ToolsUtils;
 import com.zhongzheng.common.utils.file.FileUtils;
+import com.zhongzheng.common.utils.file.ImageUtils;
+import com.zhongzheng.modules.alioss.bo.OssRequest;
 import com.zhongzheng.modules.alioss.service.OssService;
 import com.zhongzheng.modules.alioss.vo.FileBean;
 import com.zhongzheng.modules.base.bo.ConsoleQueryBo;
@@ -31,10 +33,7 @@ import com.zhongzheng.modules.base.bo.UserProfileFit;
 import com.zhongzheng.modules.course.domain.Major;
 import com.zhongzheng.modules.course.mapper.CourseMapper;
 import com.zhongzheng.modules.course.service.IMajorService;
-import com.zhongzheng.modules.exam.bo.ExamApplyQueryBo;
-import com.zhongzheng.modules.exam.bo.ExamApplySiteTimeJson;
-import com.zhongzheng.modules.exam.bo.ExamApplySiteTimeTwoAddBo;
-import com.zhongzheng.modules.exam.bo.ExamApplySubscribeBo;
+import com.zhongzheng.modules.exam.bo.*;
 import com.zhongzheng.modules.exam.domain.ExamApply;
 import com.zhongzheng.modules.exam.domain.ExamApplySite;
 import com.zhongzheng.modules.exam.domain.ExamApplySiteTime;
@@ -64,17 +63,21 @@ import com.zhongzheng.modules.order.service.IOrderGoodsService;
 import com.zhongzheng.modules.user.bo.*;
 import com.zhongzheng.modules.user.domain.User;
 import com.zhongzheng.modules.user.domain.UserExamGoods;
+import com.zhongzheng.modules.user.domain.UserStudyRecordPhoto;
 import com.zhongzheng.modules.user.domain.UserSubscribe;
 import com.zhongzheng.modules.user.mapper.UserSubscribeMapper;
 import com.zhongzheng.modules.user.service.IUserExamGoodsService;
 import com.zhongzheng.modules.user.service.IUserService;
+import com.zhongzheng.modules.user.service.IUserStudyRecordPhotoService;
 import com.zhongzheng.modules.user.service.IUserSubscribeService;
 import com.zhongzheng.modules.user.vo.*;
 import com.zhongzheng.modules.wx.service.IWxLoginService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.mock.web.MockMultipartFile;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
 import org.thymeleaf.util.StringUtils;
 
 import javax.imageio.ImageIO;
@@ -151,6 +154,8 @@ public class UserSubscribeServiceImpl extends ServiceImpl<UserSubscribeMapper, U
     private IOrderGoodsService iOrderGoodsService;
     @Autowired
     private IClassGradeUserService iClassGradeUserService;
+    @Autowired
+    private IUserStudyRecordPhotoService iUserStudyRecordPhotoService;
 
     @Value("${aliyun.sms.cancellationReminder}")
     private String cancellationReminder;
@@ -2376,6 +2381,63 @@ public class UserSubscribeServiceImpl extends ServiceImpl<UserSubscribeMapper, U
         sendExamSucceed(userSubscribeAddBo);
     }
 
+    /**
+     * 学员学时图片修改
+     * @author change
+     * @date 2023/7/18 14:29
+     * @param bo
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void updateStudentImage(UpdateStudentImageBo bo) {
+        //校验图片是否存在
+        List<UserStudyRecordPhoto> recordPhotos = iUserStudyRecordPhotoService.getListByPhoto(bo.getImageUrl());
+        if (CollectionUtils.isEmpty(recordPhotos)){
+            throw new CustomException("图片不存在,请检查图片!");
+        }
+        List<Long> userIds = recordPhotos.stream().map(UserStudyRecordPhoto::getUserId).collect(Collectors.toList());
+        List<User> users = iUserService.listByIdsNotTenant(userIds);
+        if (CollectionUtils.isEmpty(users)){
+            throw new CustomException("学员不存在,请检查!");
+        }
+        String encrypt = EncryptHandler.encrypt(bo.getIdCard());
+        if (users.stream().anyMatch(x -> !x.getIdCard().equals(encrypt))){
+            throw new CustomException("照片和学员不匹配,请检查!");
+        }
+        try {
+            InputStream in = ossService.getStreamByObject(bo.getImageUrl());
+            BufferedImage img = ImageIO.read(in);
+            BufferedImage bufferedImage = ImageUtils.rotateImage(img, bo.getDegree());
+            OssRequest oss = new OssRequest();
+            oss.setImageStatus(0);
+            oss.setGradeId(0L);
+            oss.setUserId(0L);
+
+            //创建一个ByteArrayOutputStream
+            ByteArrayOutputStream os = new ByteArrayOutputStream();
+            //把BufferedImage写入ByteArrayOutputStream
+            ImageIO.write(bufferedImage, "jpg", os);
+            //ByteArrayOutputStream转成InputStream
+            InputStream input = new ByteArrayInputStream(os.toByteArray());
+            //InputStream转成MultipartFile
+            MultipartFile multipartFile =new MockMultipartFile(DateUtils.getNowTime().toString(), DateUtils.getNowTime()+".jpg", "text/plain", input);
+
+//            //将newImage写入字节数组输出流
+//            ByteArrayOutputStream baos = new ByteArrayOutputStream();
+//            ImageIO.write( bufferedImage, "jpg", baos);
+//            //转换为MultipartFile
+//            MultipartFile multipartFile = new MockMultipartFile(DateUtils.getNowTime().toString(), baos.toByteArray());
+
+            oss.setFile(multipartFile);
+            String upload = ossService.upload(oss);
+            List<Long> ids = recordPhotos.stream().map(UserStudyRecordPhoto::getId).collect(Collectors.toList());
+            iUserStudyRecordPhotoService.updateBatchByIdNotTenant(ids,upload);
+        }catch (Exception e){
+            e.printStackTrace();
+            throw new CustomException("修改图片错误!");
+        }
+    }
+
 
     private Integer getSeatNumber(UserSubscribeAddBo bo,Long userNum) {
         List<UserSubscribe> list = list(new LambdaQueryWrapper<UserSubscribe>().eq(UserSubscribe::getApplyId, bo.getApplyId())

+ 16 - 0
zhongzheng-system/src/main/resources/mapper/modules/course/CourseHandoutsMapper.xml

@@ -127,4 +127,20 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         ORDER BY cf.sort
     </select>
 
+    <select id="getGoodsIds" parameterType="java.lang.Long"  resultType="java.lang.Long">
+        SELECT goods_id FROM goods WHERE handouts_id = #{handoutsId} AND `status` = 1 AND tenant_id = #{tenantId}
+    </select>
+
+    <delete id="removeHandouts" parameterType="java.lang.Long" >
+        DELETE FROM course_handouts WHERE handouts_id = #{handoutsId} AND tenant_id = #{tenantId}
+    </delete>
+
+    <delete id="removeHandoutsBusiness" parameterType="java.lang.Long" >
+        DELETE FROM course_handouts_business WHERE handouts_id = #{handoutsId} AND tenant_id = #{tenantId}
+    </delete>
+
+    <delete id="removeHandoutsFile" parameterType="java.lang.Long" >
+        DELETE FROM course_file WHERE handouts_id = #{handoutsId} AND tenant_id = #{tenantId}
+    </delete>
+
 </mapper>

+ 4 - 0
zhongzheng-system/src/main/resources/mapper/modules/goods/GoodsMapper.xml

@@ -935,4 +935,8 @@
               and g.tenant_id = #{tenantId}
     </select>
 
+    <update id="updateHandoutsId" parameterType="java.lang.Long">
+        UPDATE goods SET handouts_id = #{handoutsId} WHERE goods_id = #{goodsId} and tenant_id = #{tenantId}
+    </update>
+
 </mapper>

+ 12 - 0
zhongzheng-system/src/main/resources/mapper/modules/user/UserMapper.xml

@@ -484,6 +484,18 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
           AND user_account = #{userAccount}
     </select>
 
+    <select id="listByIdsNotTenant" parameterType="java.lang.Long" resultType="com.zhongzheng.modules.user.domain.User">
+        SELECT
+            *
+        FROM
+            `user`
+        WHERE
+            status = 1 AND user_id IN
+            <foreach collection="userIds" item="item" index="index" open="(" close=")" separator=",">
+                #{item}
+            </foreach>
+    </select>
+
     <select id="getUserOrderCount" parameterType="map" resultType="java.lang.Long">
         SELECT
             COUNT(o.order_sn)

+ 11 - 0
zhongzheng-system/src/main/resources/mapper/modules/user/UserStudyRecordPhotoMapper.xml

@@ -65,4 +65,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             rp.id DESC
             LIMIT 1
     </select>
+
+    <select id="listByPhoto" parameterType="java.lang.String" resultType="com.zhongzheng.modules.user.domain.UserStudyRecordPhoto">
+        SELECT * FROM `user_study_record_photo` WHERE photo = #{imageUrl}
+    </select>
+
+    <update id="updateBatchByIdNotTenant" parameterType="map" >
+        UPDATE user_study_record_photo SET photo = #{upload} WHERE id IN
+        <foreach collection="ids" item="item" index="index" open="(" close=")" separator=",">
+            #{item}
+        </foreach>
+    </update>
 </mapper>