Selaa lähdekoodia

add 微信PC扫码

he2802 3 vuotta sitten
vanhempi
commit
4024d52179
47 muutettua tiedostoa jossa 1604 lisäystä ja 540 poistoa
  1. 6 49
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/grade/ClassGradeController.java
  2. 14 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/tool/TestController.java
  3. 12 1
      zhongzheng-api/src/main/java/com/zhongzheng/controller/cmmon/ActivityAdvertisingController.java
  4. 49 0
      zhongzheng-api/src/main/java/com/zhongzheng/controller/cmmon/ActivityHomeController.java
  5. 48 0
      zhongzheng-api/src/main/java/com/zhongzheng/controller/cmmon/ActivityRecommendController.java
  6. 33 4
      zhongzheng-api/src/main/java/com/zhongzheng/controller/order/OrderController.java
  7. 9 0
      zhongzheng-api/src/main/java/com/zhongzheng/controller/user/UserController.java
  8. 5 0
      zhongzheng-common/src/main/java/com/zhongzheng/common/utils/DateUtils.java
  9. 22 0
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/UserServiceImpl.java
  10. 8 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/activity/vo/ActivityRecommendGoodsVo.java
  11. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/alioss/service/OssService.java
  12. 138 79
      zhongzheng-system/src/main/java/com/zhongzheng/modules/alioss/service/impl/OssServiceImpl.java
  13. 1 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/base/service/impl/ActivityAdvertisingLocationServiceImpl.java
  14. 1 4
      zhongzheng-system/src/main/java/com/zhongzheng/modules/base/service/impl/CertificateTpServiceImpl.java
  15. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/domain/ClassGradeUser.java
  16. 4 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/IClassGradeUserService.java
  17. 19 19
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/ClassGradeServiceImpl.java
  18. 278 231
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/ClassGradeUserServiceImpl.java
  19. 39 37
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/UserPeriodServiceImpl.java
  20. 10 10
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/UserPeriodStatusServiceImpl.java
  21. 10 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/vo/ClassPeriodStudentExportVo.java
  22. 6 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/vo/ClassPeriodStudentVo.java
  23. 47 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/OrderPayAddBo.java
  24. 51 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/OrderPayEditBo.java
  25. 58 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/OrderPayQueryBo.java
  26. 5 2
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/domain/Order.java
  27. 47 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/domain/OrderPay.java
  28. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/mapper/OrderMapper.java
  29. 14 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/mapper/OrderPayMapper.java
  30. 52 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/IOrderPayService.java
  31. 6 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/IOrderService.java
  32. 2 2
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderGoodsRefundServiceImpl.java
  33. 102 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderPayServiceImpl.java
  34. 202 3
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderServiceImpl.java
  35. 53 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/vo/OrderPayVo.java
  36. 32 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserAppUpdatePwdBo.java
  37. 4 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/mapper/UserStudyRecordPhotoMapper.java
  38. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserService.java
  39. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserStudyRecordPhotoService.java
  40. 5 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserStudyRecordPhotoServiceImpl.java
  41. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/wx/service/IWxPayService.java
  42. 154 95
      zhongzheng-system/src/main/java/com/zhongzheng/modules/wx/service/impl/WxPayServiceImpl.java
  43. 5 1
      zhongzheng-system/src/main/resources/mapper/modules/activity/ActivityRecommendMapper.xml
  44. 1 0
      zhongzheng-system/src/main/resources/mapper/modules/grade/ClassGradeUserMapper.xml
  45. 3 0
      zhongzheng-system/src/main/resources/mapper/modules/order/OrderMapper.xml
  46. 20 0
      zhongzheng-system/src/main/resources/mapper/modules/order/OrderPayMapper.xml
  47. 14 1
      zhongzheng-system/src/main/resources/mapper/modules/user/UserStudyRecordPhotoMapper.xml

+ 6 - 49
zhongzheng-admin/src/main/java/com/zhongzheng/controller/grade/ClassGradeController.java

@@ -180,7 +180,7 @@ public class ClassGradeController extends BaseController {
     @PreAuthorize("@ss.hasPermi('system:profile:export')")
     @Log(title = "导出学员学时列表", businessType = BusinessType.EXPORT)
     @GetMapping("/export")
-    public AjaxResult<UserProfileExportGaiVo> export(ClassGradeUserQueryBo bo) {
+    public AjaxResult<Map<String,Object>> export(ClassGradeUserQueryBo bo) {
         String fileName = "";
         if(Validator.isEmpty(bo.getStudyStatus())){
             bo.setStudyStatus(0);
@@ -197,7 +197,8 @@ public class ClassGradeController extends BaseController {
             }
         }
         bo.setUserPhoto(1);
-        List<ClassPeriodStudentExportAllVo> list = iClassGradeUserService.exportPo(bo);
+        Map<String,Object> map = iClassGradeUserService.exportPo(bo);
+        List<ClassPeriodStudentExportAllVo> list = (List<ClassPeriodStudentExportAllVo>)map.get("list");
         ExcelUtil<ClassPeriodStudentExportAllVo> util = new ExcelUtil<ClassPeriodStudentExportAllVo>(ClassPeriodStudentExportAllVo.class);
         ExportParams deptExportParams = new ExportParams();
         // 设置sheet得名称
@@ -211,7 +212,9 @@ public class ClassGradeController extends BaseController {
         List<Map<String, Object>> sheetsList = new ArrayList<>();
         sheetsList.add(deptExportMap);
         String businessName = Validator.isNotEmpty(bo.getBusinessName())?bo.getBusinessName():"";
-        return util.exportEasyExcel(sheetsList, businessName+"-"+fileName+"-学员学习记录-"+timeStr);
+        map.put("excel",util.exportEasyExcel(sheetsList, businessName+"-"+fileName+"-学员学习记录-"+timeStr));
+        map.remove("list");
+        return AjaxResult.success(map);
     }
 
     /**
@@ -389,54 +392,8 @@ public class ClassGradeController extends BaseController {
         return toAjax(iClassGradeUserService.updateByEditBo(bo) ? 1 : 0);
     }
 
-    /*    *//**
-     * 删除班级
-     *//*
-    @ApiOperation("删除班级")
-    @PreAuthorize("@ss.hasPermi('modules.grade:grade:remove')")
-    @Log(title = "班级" , businessType = BusinessType.DELETE)
-    @DeleteMapping("/{classIds}")
-    public AjaxResult<Void> remove(@PathVariable Long[] classIds) {
-        return toAjax(iClassGradeService.deleteWithValidByIds(Arrays.asList(classIds), true) ? 1 : 0);
-    }*/
 
 
-   /* *//**
-     * 学时审核
-     *//*
-    @ApiOperation("学时审核第一次請求獲得商品的章節")
-    @PreAuthorize("@ss.hasPermi('grade:user:list')")
-    @GetMapping("/listPeriodAuditOne")
-    public TableDataInfo<ClassPeriodVo> listPeriodAuditOne(ClassGradeUserQueryBo bo) {
-        startPage();
-        List<ClassPeriodVo> list = iClassGradeUserService.listPeriodAuditOne(bo);
-        return getDataTable(list);
-    }
-
-    *//**
-     * 学时审核
-     *//*
-    @ApiOperation("学时审核獲得商品模塊下的章")
-    @PreAuthorize("@ss.hasPermi('grade:user:list')")
-    @GetMapping("/listPeriodAuditChapter")
-    public TableDataInfo<ClassPeriodChapterVo> listPeriodAuditChapter(ClassGradeUserQueryBo bo) {
-        startPage();
-        List<ClassPeriodChapterVo> list = iClassGradeUserService.listPeriodAuditChapter(bo);
-        return getDataTable(list);
-    }
-
-    *//**
-     * 学时审核
-     *//*
-    @ApiOperation("学时审核獲得商品章下面的節")
-    @PreAuthorize("@ss.hasPermi('grade:user:list')")
-    @GetMapping("/listPeriodAuditSection")
-    public TableDataInfo<ClassPeriodSectionVo> listPeriodAuditSection(ClassGradeUserQueryBo bo) {
-        startPage();
-        List<ClassPeriodSectionVo> list = iClassGradeUserService.listPeriodAuditSection(bo);
-        return getDataTable(list);
-    }
-*/
     /**
      * 学时审核獲得商品節下面的審核記錄
      */

+ 14 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/tool/TestController.java

@@ -3,7 +3,11 @@ package com.zhongzheng.controller.tool;
 import cn.hutool.core.lang.Validator;
 import com.zhongzheng.common.core.controller.BaseController;
 import com.zhongzheng.common.core.domain.AjaxResult;
+import com.zhongzheng.modules.alioss.service.OssService;
+import com.zhongzheng.modules.order.service.IOrderBillGoodsService;
 import io.swagger.annotations.*;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.ArrayList;
@@ -18,9 +22,12 @@ import java.util.Map;
  */
 
 @RestController
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
 @RequestMapping("/test/user")
 public class TestController extends BaseController
 {
+    private final OssService ossService;
+
     private final static Map<Integer, UserEntity> users = new LinkedHashMap<Integer, UserEntity>();
     {
         users.put(1, new UserEntity(1, "admin", "admin123", "15888888888"));
@@ -49,6 +56,13 @@ public class TestController extends BaseController
         }
     }
 
+    @ApiOperation("压缩图片")
+    @PostMapping("/zip")
+    public AjaxResult zip(UserEntity user)
+    {
+    //    ossService.zipPeopleDownload(18L,523L,"李盛仁","445224199901040003");
+        return AjaxResult.success(users.put(user.getUserId(), user));
+    }
 
     @PostMapping("/save")
     public AjaxResult save(UserEntity user)

+ 12 - 1
zhongzheng-api/src/main/java/com/zhongzheng/controller/cmmon/ActivityAdvertisingController.java

@@ -7,6 +7,7 @@ import com.zhongzheng.common.core.page.TableDataInfo;
 import com.zhongzheng.common.enums.BusinessType;
 import com.zhongzheng.modules.base.bo.ActivityAdvertisingAddBo;
 import com.zhongzheng.modules.base.bo.ActivityAdvertisingEditBo;
+import com.zhongzheng.modules.base.bo.ActivityAdvertisingLocationQueryBo;
 import com.zhongzheng.modules.base.bo.ActivityAdvertisingQueryBo;
 import com.zhongzheng.modules.base.service.IActivityAdvertisingLocationService;
 import com.zhongzheng.modules.base.service.IActivityAdvertisingService;
@@ -55,12 +56,22 @@ public class ActivityAdvertisingController extends BaseController {
     /**
      * 获取广告位详细信息
      */
-    @ApiOperation("获取首页广告位详细信息")
+    @ApiOperation("获取小程序首页广告位详细信息")
     @PreAuthorize("@ss.hasPermi('system:location:query')")
     @GetMapping("/homeLocation")
     public AjaxResult<ActivityAdvertisingLocationVo> homeLocation() {
         return AjaxResult.success(iActivityAdvertisingLocationService.queryByKey("home-banner"));
     }
 
+    /**
+     * 获取广告位详细信息
+     */
+    @ApiOperation("获取广告位列表信息")
+    @PreAuthorize("@ss.hasPermi('system:location:query')")
+    @GetMapping("/adLocation")
+    public AjaxResult<List<ActivityAdvertisingLocationVo>> homePcLocation(ActivityAdvertisingLocationQueryBo bo) {
+        bo.setStatus(new ArrayList<Integer>(Arrays.asList(1)));
+        return AjaxResult.success(iActivityAdvertisingLocationService.queryList(bo));
+    }
 
 }

+ 49 - 0
zhongzheng-api/src/main/java/com/zhongzheng/controller/cmmon/ActivityHomeController.java

@@ -0,0 +1,49 @@
+package com.zhongzheng.controller.cmmon;
+
+import com.zhongzheng.common.core.controller.BaseController;
+import com.zhongzheng.common.core.domain.AjaxResult;
+import com.zhongzheng.common.core.page.TableDataInfo;
+import com.zhongzheng.modules.base.bo.ActivityAdvertisingQueryBo;
+import com.zhongzheng.modules.base.service.IActivityAdvertisingLocationService;
+import com.zhongzheng.modules.base.service.IActivityAdvertisingService;
+import com.zhongzheng.modules.base.vo.ActivityAdvertisingLocationVo;
+import com.zhongzheng.modules.base.vo.ActivityAdvertisingVo;
+import com.zhongzheng.modules.system.domain.SysConfig;
+import com.zhongzheng.modules.system.service.ISysConfigService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+
+@Api(value = "首页控制器", tags = {"首页控制器"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/app/common/base/home")
+public class ActivityHomeController extends BaseController {
+
+    @Autowired
+    private ISysConfigService configService;
+
+    /**
+     * 获取参数配置列表
+     */
+    @ApiOperation("首页配置列表")
+    @PreAuthorize("@ss.hasPermi('system:config:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(SysConfig config)
+    {
+        startPage();
+        config.setConfigModule("home");
+        List<SysConfig> list = configService.selectConfigList(config);
+        return getDataTable(list);
+    }
+}

+ 48 - 0
zhongzheng-api/src/main/java/com/zhongzheng/controller/cmmon/ActivityRecommendController.java

@@ -0,0 +1,48 @@
+package com.zhongzheng.controller.cmmon;
+
+import com.zhongzheng.common.core.controller.BaseController;
+import com.zhongzheng.common.core.page.TableDataInfo;
+import com.zhongzheng.modules.activity.bo.ActivityRecommendQueryBo;
+import com.zhongzheng.modules.activity.service.IActivityRecommendService;
+import com.zhongzheng.modules.activity.vo.ActivityRecommendVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * 商品推荐Controller
+ *
+ * @author hjl
+ * @date 2022-04-13
+ */
+@Api(value = "商品推荐控制器", tags = {"商品推荐管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/app/common/activity/recommend")
+public class ActivityRecommendController extends BaseController {
+
+    private final IActivityRecommendService iActivityRecommendService;
+
+    /**
+     * 查询商品推荐列表
+     */
+    @ApiOperation("查询商品推荐列表")
+    @PreAuthorize("@ss.hasPermi('system:recommend:list')")
+    @GetMapping("/list")
+    public TableDataInfo<ActivityRecommendVo> list(ActivityRecommendQueryBo bo) {
+        startPage();
+        List<ActivityRecommendVo> list = iActivityRecommendService.selectList(bo);
+        return getDataTable(list);
+    }
+
+
+
+
+}

+ 33 - 4
zhongzheng-api/src/main/java/com/zhongzheng/controller/order/OrderController.java

@@ -71,7 +71,7 @@ public class OrderController extends BaseController {
      */
     @ApiOperation("修改订单商品")
     @Log(title = "订单商品", businessType = BusinessType.UPDATE)
-    @PostMapping("editOrderGood")
+    @PostMapping("/editOrderGood")
     public AjaxResult<Void> editOrderGood(@RequestBody OrderGoodsEditBo bo) {
         return toAjax(iOrderGoodsService.updateByEditBo(bo) ? 1 : 0);
     }
@@ -81,7 +81,7 @@ public class OrderController extends BaseController {
      */
     @ApiOperation("修改订单")
     @Log(title = "订单", businessType = BusinessType.UPDATE)
-    @PostMapping("edit")
+    @PostMapping("/edit")
     public AjaxResult<Void> edit(@RequestBody OrderEditBo bo) {
         return toAjax(iOrderService.updateByEditBo(bo) ? 1 : 0);
     }
@@ -90,7 +90,7 @@ public class OrderController extends BaseController {
      * 新增订单
      */
     @ApiOperation("新增小程序订单")
-    @PostMapping("placeSmallOrder")
+    @PostMapping("/placeSmallOrder")
     public AjaxResult add(@RequestBody OrderAddBo bo) {
         ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
         bo.setUserId(loginUser.getUser().getUserId());
@@ -98,10 +98,39 @@ public class OrderController extends BaseController {
     }
 
     @ApiOperation("继续支付小程序订单")
-    @PostMapping("resumeSmallOrder")
+    @PostMapping("/resumeSmallOrder")
     public AjaxResult resumeSmallOrder(@RequestBody OrderAddBo bo) {
         ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
         bo.setUserId(loginUser.getUser().getUserId());
         return AjaxResult.success(iOrderService.resumeSmallOrder(bo));
     }
+
+    /**
+     * 新增订单
+     */
+    @ApiOperation("新增PC网站订单")
+    @PostMapping("/placePcOrder")
+    public AjaxResult addPc(@RequestBody OrderAddBo bo) {
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setUserId(loginUser.getUser().getUserId());
+        return AjaxResult.success(iOrderService.placePcOrder(bo));
+    }
+
+    /**
+     * 支付轮询查看支付状态
+     */
+    @ApiOperation("查看支付状态")
+    @PreAuthorize("@ss.hasPermi('system:order:query')")
+    @GetMapping("/{orderSn}")
+    public AjaxResult<Integer> getOrderStatus(@PathVariable("orderSn" ) String orderSn) {
+        return AjaxResult.success(iOrderService.queryByOrderSn(orderSn));
+    }
+
+    @ApiOperation("继续支付PC订单")
+    @PostMapping("/resumePCOrder")
+    public AjaxResult resumePCOrder(@RequestBody OrderAddBo bo) {
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setUserId(loginUser.getUser().getUserId());
+        return AjaxResult.success(iOrderService.resumePcOrder(bo));
+    }
 }

+ 9 - 0
zhongzheng-api/src/main/java/com/zhongzheng/controller/user/UserController.java

@@ -106,4 +106,13 @@ public class UserController extends BaseController {
         bo.setUserId(loginUser.getUser().getUserId());
         return toAjax(iUserService.bindNewTel(bo)? 1 : 0);
     }
+
+
+    @ApiOperation("修改密码")
+    @PostMapping("/updatePwd")
+    public AjaxResult<Void> updatePwd(@RequestBody UserAppUpdatePwdBo bo) {
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setUserId(loginUser.getUser().getUserId());
+        return toAjax(iUserService.updatePwd(bo)? 1 : 0);
+    }
 }

+ 5 - 0
zhongzheng-common/src/main/java/com/zhongzheng/common/utils/DateUtils.java

@@ -207,6 +207,11 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
         return "LD"+getDateOrderSn();
     }
 
+    public static String getPayOrderSn()
+    {
+        return "P"+getDateOrderSn();
+    }
+
     public static String secToTime(int time) {
         String timeStr = null;
         int hour = 0;

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

@@ -37,6 +37,7 @@ import com.zhongzheng.modules.goods.vo.GoodsUserVo;
 import com.zhongzheng.modules.grade.bo.ClassGradeUserQueryBo;
 import com.zhongzheng.modules.grade.service.IClassGradeUserService;
 import com.zhongzheng.modules.grade.vo.ClassGradeUserGoodsVo;
+import com.zhongzheng.modules.order.domain.OrderBillGoods;
 import com.zhongzheng.modules.user.bo.*;
 import com.zhongzheng.modules.user.domain.User;
 import com.zhongzheng.modules.user.domain.UserBankRecord;
@@ -655,6 +656,27 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
         return resultMap;
     }
 
+    @Override
+    public Boolean updatePwd(UserAppUpdatePwdBo bo) {
+        LambdaQueryWrapper<User> queryWrapper =new LambdaQueryWrapper<User>();
+        User user = getOne(new LambdaQueryWrapper<User>().eq(User::getUserId, bo.getUserId()));
+        if(Validator.isEmpty(user)){
+            throw new BaseException("用户不存在");
+        }
+        if (!SecurityUtils.matchesPassword(bo.getOldPwd(),user.getPassword() ))
+        {
+            throw new BaseException("密码错误");
+        }
+        if (Validator.isEmpty(bo.getNewPwd()))
+        {
+            throw new BaseException("新密码格式错误");
+        }
+        user.setPassword(SecurityUtils.encryptPassword(bo.getNewPwd()));
+        user.setUpdateTime(DateUtils.getNowTime());
+        updateById(user);
+        return true;
+    }
+
     private Long findSubjectId(String subject){
 
         if(subject!=null){

+ 8 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/activity/vo/ActivityRecommendGoodsVo.java

@@ -46,4 +46,12 @@ public class ActivityRecommendGoodsVo {
 	private BigDecimal standPrice;
 	@ApiModelProperty("商品编码")
 	private String code;
+	/** 年份 */
+	@Excel(name = "年份")
+	@ApiModelProperty("年份")
+	private Long year;
+	/** 封面地址 */
+	@Excel(name = "封面地址")
+	@ApiModelProperty("封面地址")
+	private String coverUrl;
 }

+ 4 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/alioss/service/OssService.java

@@ -4,12 +4,14 @@ package com.zhongzheng.modules.alioss.service;
 
 import com.zhongzheng.modules.alioss.bo.OssRequest;
 import com.zhongzheng.modules.alioss.vo.ResultBean;
+import com.zhongzheng.modules.grade.vo.ClassPeriodStudentExportVo;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletRequest;
 import java.io.FileNotFoundException;
 import java.io.InputStream;
 import java.util.Map;
+import java.util.zip.ZipOutputStream;
 
 public interface OssService {
     ResultBean getPolicy(OssRequest ossRequest);
@@ -23,4 +25,6 @@ public interface OssService {
     String uploadBase64(String fileStr,OssRequest ossRequest);
 
     void closeClient();
+
+    void zipPeopleDownload(ClassPeriodStudentExportVo vo, ZipOutputStream outStream);
 }

+ 138 - 79
zhongzheng-system/src/main/java/com/zhongzheng/modules/alioss/service/impl/OssServiceImpl.java

@@ -16,6 +16,8 @@ import com.zhongzheng.modules.alioss.bo.OssCallbackParam;
 import com.zhongzheng.modules.alioss.bo.OssRequest;
 import com.zhongzheng.modules.alioss.service.OssService;
 import com.zhongzheng.modules.alioss.vo.ResultBean;
+import com.zhongzheng.modules.grade.vo.ClassPeriodStudentExportVo;
+import com.zhongzheng.modules.user.service.IUserStudyRecordPhotoService;
 import org.apache.commons.io.IOUtils;
 import org.apache.xmlbeans.impl.values.XmlValueNotNillableException;
 import org.slf4j.Logger;
@@ -24,6 +26,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.util.Base64Utils;
+import org.springframework.util.CollectionUtils;
 import org.springframework.web.multipart.MultipartFile;
 import sun.misc.BASE64Decoder;
 
@@ -35,6 +38,11 @@ import java.io.*;
 import java.sql.SQLException;
 import java.text.SimpleDateFormat;
 import java.util.*;
+import java.util.List;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
+
+import static jdk.nashorn.internal.objects.NativeError.getFileName;
 
 @Service
 public class OssServiceImpl implements OssService {
@@ -59,13 +67,16 @@ public class OssServiceImpl implements OssService {
     @Autowired
     private OSSClient ossClient;
 
+    @Autowired
+    private IUserStudyRecordPhotoService iUserStudyRecordPhotoService;
+
 
     @Override
     public ResultBean getPolicy(OssRequest ossRequest) {
         JSONObject resultBean = new JSONObject();
         // 存储目录
 
-        String dir = ALIYUN_OSS_DIR_PREFIX+ this.generateRandomDirname(ossRequest);
+        String dir = ALIYUN_OSS_DIR_PREFIX + this.generateRandomDirname(ossRequest);
         // 签名有效期
         long expireEndTime = System.currentTimeMillis() + ALIYUN_OSS_EXPIRE * 1000;
         Date expiration = new Date(expireEndTime);
@@ -90,8 +101,8 @@ public class OssServiceImpl implements OssService {
             String now = String.valueOf(System.currentTimeMillis()) + "_";
             Random rand = new Random();
             int random = rand.nextInt();
-            resultBean.set("accessid",ossClient.getCredentialsProvider().getCredentials().getAccessKeyId()).set("policy",policy).set("signature",signature)
-            .set("dir",dir+"/"+now + String.valueOf(random > 0 ? random : (-1) * random)).set("expire",String.valueOf(expireEndTime / 1000)).set("callback",callbackData).set("host",action);
+            resultBean.set("accessid", ossClient.getCredentialsProvider().getCredentials().getAccessKeyId()).set("policy", policy).set("signature", signature)
+                    .set("dir", dir + "/" + now + String.valueOf(random > 0 ? random : (-1) * random)).set("expire", String.valueOf(expireEndTime / 1000)).set("callback", callbackData).set("host", action);
             // 返回结果
         } catch (Exception e) {
             LOGGER.error("签名生成失败", e);
@@ -104,10 +115,10 @@ public class OssServiceImpl implements OssService {
     //生成存储目录
     public String generateRandomDirname(OssRequest ossRequest) {
         String prefixName = "";
-        if(Validator.isNotEmpty(ossRequest.getUserId())&&ossRequest.getUserId().longValue()>0){
+        if (Validator.isNotEmpty(ossRequest.getUserId()) && ossRequest.getUserId().longValue() > 0) {
             prefixName = prefixName + ossRequest.getUserId();
         }
-        if(Validator.isNotEmpty(ossRequest.getGradeId())&&ossRequest.getGradeId().longValue()>0){
+        if (Validator.isNotEmpty(ossRequest.getGradeId()) && ossRequest.getGradeId().longValue() > 0) {
             prefixName = prefixName + "/" + ossRequest.getGradeId();
         }
         String RandomFilename = "";
@@ -119,33 +130,33 @@ public class OssServiceImpl implements OssService {
         int intDay = calCurrent.get(Calendar.DATE);
         int intMonth = calCurrent.get(Calendar.MONTH) + 1;
         int intYear = calCurrent.get(Calendar.YEAR);
-        String now = String.valueOf(System.currentTimeMillis()) ;
+        String now = String.valueOf(System.currentTimeMillis());
 
         RandomFilename = now + String.valueOf(random > 0 ? random : (-1) * random);
-        switch(ossRequest.getImageStatus()){
-            case 0 :
-                RandomFilename = "avatar"+"/"+prefixName+(Validator.isNotEmpty(prefixName)?"":(sdf.format(new Date())+"/"+now));
+        switch (ossRequest.getImageStatus()) {
+            case 0:
+                RandomFilename = "avatar" + "/" + prefixName + (Validator.isNotEmpty(prefixName) ? "" : (sdf.format(new Date()) + "/" + now));
                 break;
-            case 1 :
-                RandomFilename = "IDNumber"+"/"+prefixName+(Validator.isNotEmpty(prefixName)?"":(sdf.format(new Date())+"/"+now));
+            case 1:
+                RandomFilename = "IDNumber" + "/" + prefixName + (Validator.isNotEmpty(prefixName) ? "" : (sdf.format(new Date()) + "/" + now));
                 break;
-            case 2 :
-                RandomFilename = "QuestionBank"+"/"+prefixName+(Validator.isNotEmpty(prefixName)?"":(sdf.format(new Date())+"/"+now));
+            case 2:
+                RandomFilename = "QuestionBank" + "/" + prefixName + (Validator.isNotEmpty(prefixName) ? "" : (sdf.format(new Date()) + "/" + now));
                 break;
-            case 3 :
-                RandomFilename = "guide"+"/"+prefixName+(Validator.isNotEmpty(prefixName)?"":(sdf.format(new Date())+"/"+now));
+            case 3:
+                RandomFilename = "guide" + "/" + prefixName + (Validator.isNotEmpty(prefixName) ? "" : (sdf.format(new Date()) + "/" + now));
                 break;
-            case 4 :
-                RandomFilename = "advertising"+"/"+prefixName+(Validator.isNotEmpty(prefixName)?"":(sdf.format(new Date())+"/"+now));
+            case 4:
+                RandomFilename = "advertising" + "/" + prefixName + (Validator.isNotEmpty(prefixName) ? "" : (sdf.format(new Date()) + "/" + now));
                 break;
-            case 5 :
-                RandomFilename = "IDCard"+"/"+prefixName+(Validator.isNotEmpty(prefixName)?"":(sdf.format(new Date())+"/"+now));
+            case 5:
+                RandomFilename = "IDCard" + "/" + prefixName + (Validator.isNotEmpty(prefixName) ? "" : (sdf.format(new Date()) + "/" + now));
                 break;
-            case 6 :
-                RandomFilename = "file"+"/"+prefixName+(Validator.isNotEmpty(prefixName)?"":(sdf.format(new Date())+"/"+now));
+            case 6:
+                RandomFilename = "file" + "/" + prefixName + (Validator.isNotEmpty(prefixName) ? "" : (sdf.format(new Date()) + "/" + now));
                 break;
-            case 7 :
-                RandomFilename = "certificate"+"/"+prefixName+(Validator.isNotEmpty(prefixName)?"":(sdf.format(new Date())+"/"+now));
+            case 7:
+                RandomFilename = "certificate" + "/" + prefixName + (Validator.isNotEmpty(prefixName) ? "" : (sdf.format(new Date()) + "/" + now));
                 break;
         }
 
@@ -156,10 +167,10 @@ public class OssServiceImpl implements OssService {
     //生成存储文件名
     public String generateRandomFilename(OssRequest ossRequest) {
         String prefixName = "";
-        if(Validator.isNotEmpty(ossRequest.getUserId())&&ossRequest.getUserId().longValue()>0){
+        if (Validator.isNotEmpty(ossRequest.getUserId()) && ossRequest.getUserId().longValue() > 0) {
             prefixName = prefixName + ossRequest.getUserId();
         }
-        if(Validator.isNotEmpty(ossRequest.getGradeId())&&ossRequest.getGradeId().longValue()>0){
+        if (Validator.isNotEmpty(ossRequest.getGradeId()) && ossRequest.getGradeId().longValue() > 0) {
             prefixName = prefixName + "/" + ossRequest.getGradeId();
         }
         String RandomFilename = "";
@@ -171,33 +182,33 @@ public class OssServiceImpl implements OssService {
         int intDay = calCurrent.get(Calendar.DATE);
         int intMonth = calCurrent.get(Calendar.MONTH) + 1;
         int intYear = calCurrent.get(Calendar.YEAR);
-        String now = String.valueOf(System.currentTimeMillis()) ;
+        String now = String.valueOf(System.currentTimeMillis());
 
         RandomFilename = now + String.valueOf(random > 0 ? random : (-1) * random);
-        switch(ossRequest.getImageStatus()){
-            case 0 :
-                RandomFilename = "avatar"+"/"+prefixName+(Validator.isNotEmpty(prefixName)?"":(sdf.format(new Date())))+"/"+now;
+        switch (ossRequest.getImageStatus()) {
+            case 0:
+                RandomFilename = "avatar" + "/" + prefixName + (Validator.isNotEmpty(prefixName) ? "" : (sdf.format(new Date()))) + "/" + now;
                 break;
-            case 1 :
-                RandomFilename = "IDNumber"+"/"+prefixName+(Validator.isNotEmpty(prefixName)?"":(sdf.format(new Date())))+"/"+now;
+            case 1:
+                RandomFilename = "IDNumber" + "/" + prefixName + (Validator.isNotEmpty(prefixName) ? "" : (sdf.format(new Date()))) + "/" + now;
                 break;
-            case 2 :
-                RandomFilename = "QuestionBank"+"/"+prefixName+(Validator.isNotEmpty(prefixName)?"":(sdf.format(new Date())))+"/"+now;
+            case 2:
+                RandomFilename = "QuestionBank" + "/" + prefixName + (Validator.isNotEmpty(prefixName) ? "" : (sdf.format(new Date()))) + "/" + now;
                 break;
-            case 3 :
-                RandomFilename = "guide"+"/"+prefixName+(Validator.isNotEmpty(prefixName)?"":(sdf.format(new Date())))+"/"+now;
+            case 3:
+                RandomFilename = "guide" + "/" + prefixName + (Validator.isNotEmpty(prefixName) ? "" : (sdf.format(new Date()))) + "/" + now;
                 break;
-            case 4 :
-                RandomFilename = "advertising"+"/"+prefixName+(Validator.isNotEmpty(prefixName)?"":(sdf.format(new Date())))+"/"+now;
+            case 4:
+                RandomFilename = "advertising" + "/" + prefixName + (Validator.isNotEmpty(prefixName) ? "" : (sdf.format(new Date()))) + "/" + now;
                 break;
-            case 5 :
-                RandomFilename = "IDCard"+"/"+prefixName+(Validator.isNotEmpty(prefixName)?"":(sdf.format(new Date())))+"/"+now;
+            case 5:
+                RandomFilename = "IDCard" + "/" + prefixName + (Validator.isNotEmpty(prefixName) ? "" : (sdf.format(new Date()))) + "/" + now;
                 break;
-            case 6 :
-                RandomFilename = "file"+"/"+prefixName+(Validator.isNotEmpty(prefixName)?"":(sdf.format(new Date())))+"/"+now;
+            case 6:
+                RandomFilename = "file" + "/" + prefixName + (Validator.isNotEmpty(prefixName) ? "" : (sdf.format(new Date()))) + "/" + now;
                 break;
-            case 7 :
-                RandomFilename = "certificate"+"/"+prefixName+(Validator.isNotEmpty(prefixName)?"":(sdf.format(new Date())))+"/"+now;
+            case 7:
+                RandomFilename = "certificate" + "/" + prefixName + (Validator.isNotEmpty(prefixName) ? "" : (sdf.format(new Date()))) + "/" + now;
                 break;
         }
 
@@ -209,33 +220,33 @@ public class OssServiceImpl implements OssService {
         JSONObject resultBean = new JSONObject();
         String filename = request.getParameter("filename");
         filename = ALIYUN_OSS_ENDPOINT.concat("/").concat(filename);
-        resultBean.put("filename",filename);
-        resultBean.put("size",request.getParameter("size"));
-        resultBean.put("mimeType",request.getParameter("mimeType"));
-        resultBean.put("width",request.getParameter("width"));
-        resultBean.put("height",request.getParameter("height"));
+        resultBean.put("filename", filename);
+        resultBean.put("size", request.getParameter("size"));
+        resultBean.put("mimeType", request.getParameter("mimeType"));
+        resultBean.put("width", request.getParameter("width"));
+        resultBean.put("height", request.getParameter("height"));
         return new ResultBean(resultBean);
     }
 
     @Override
-    public String upload(OssRequest file){
-        try{
+    public String upload(OssRequest file) {
+        try {
             //获取上传文件输入流
             InputStream inputStream = file.getFile().getInputStream();
             String originalFilename = file.getFile().getOriginalFilename();
             String suffix = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
 
-            String fileName = ALIYUN_OSS_DIR_PREFIX+generateRandomFilename(file)+"."+suffix;
+            String fileName = ALIYUN_OSS_DIR_PREFIX + generateRandomFilename(file) + "." + suffix;
 
             //调用oss方法实现上传
             //第一个参数  Bucket名称
             //第二个参数  上传到oss文件路径和文件名称   aa/bb/1.jpg
             //第三个参数  上传文件输入流
-             PutObjectResult putObjectResult = ossClient.putObject(ALIYUN_OSS_BUCKET_NAME, fileName, inputStream);
-             // 关闭OSSClient。
+            PutObjectResult putObjectResult = ossClient.putObject(ALIYUN_OSS_BUCKET_NAME, fileName, inputStream);
+            // 关闭OSSClient。
             //ossClient.shutdown();
             return fileName;
-        }catch(Exception e) {
+        } catch (Exception e) {
             e.printStackTrace();
             throw new IllegalStateException("上传失败");
         }
@@ -243,83 +254,131 @@ public class OssServiceImpl implements OssService {
 
     @Override
     public String uploadInputStream(InputStream inputStream, Integer imageStatus) throws Exception {
-        try{
-            for(int i=0;i<3;i++){         // 失败重试3次数
-                String path = uploadInputStreamAction(inputStream,imageStatus);
-                if(Validator.isNotEmpty(path)){
+        try {
+            for (int i = 0; i < 3; i++) {         // 失败重试3次数
+                String path = uploadInputStreamAction(inputStream, imageStatus);
+                if (Validator.isNotEmpty(path)) {
                     return path;
                 }
             }
             return null;
-        }catch(Exception e) {
+        } catch (Exception e) {
             return null;
         }
     }
 
     private String uploadInputStreamAction(InputStream inputStream, Integer imageStatus) throws Exception {
-        try{
+        try {
             OssRequest ossRequest = new OssRequest();
             ossRequest.setImageStatus(7);
-            String fileName = generateRandomFilename(ossRequest)+".jpg";
+            String fileName = generateRandomFilename(ossRequest) + ".jpg";
 
             //调用oss方法实现上传
             //第一个参数  Bucket名称
             //第二个参数  上传到oss文件路径和文件名称   aa/bb/1.jpg
             //第三个参数  上传文件输入流
             ObjectMetadata metadata = new ObjectMetadata();
-            metadata.setHeader("Content-Disposition", "attachment;filename="+fileName);
-            fileName = ALIYUN_OSS_DIR_PREFIX+fileName;
-            PutObjectResult putObjectResult = ossClient.putObject(ALIYUN_OSS_BUCKET_NAME, fileName, inputStream,metadata);
+            metadata.setHeader("Content-Disposition", "attachment;filename=" + fileName);
+            fileName = ALIYUN_OSS_DIR_PREFIX + fileName;
+            PutObjectResult putObjectResult = ossClient.putObject(ALIYUN_OSS_BUCKET_NAME, fileName, inputStream, metadata);
             // 关闭OSSClient。
             //ossClient.shutdown();
             return fileName;
-        }catch(Exception e) {
+        } catch (Exception e) {
             return null;
         }
     }
 
     @Override
-    public void closeClient(){
+    public void closeClient() {
         ossClient.shutdown();
     }
 
     @Override
-    public String uploadBase64(String fileStr,OssRequest ossRequest) {
-        try{
-            for(int i=0;i<3;i++){         // 失败重试3次数
-                String path = uploadBase64Action(fileStr,ossRequest);
-                if(Validator.isNotEmpty(path)){
+    public String uploadBase64(String fileStr, OssRequest ossRequest) {
+        try {
+            for (int i = 0; i < 3; i++) {         // 失败重试3次数
+                String path = uploadBase64Action(fileStr, ossRequest);
+                if (Validator.isNotEmpty(path)) {
                     return path;
                 }
             }
             return null;
-        }catch(Exception e) {
+        } catch (Exception e) {
             return null;
         }
-
     }
 
-
-    private String uploadBase64Action(String fileStr,OssRequest ossRequest) {
-        try{
+    private String uploadBase64Action(String fileStr, OssRequest ossRequest) {
+        try {
             BASE64Decoder decoder = new BASE64Decoder();
             byte[] imageByte = decoder.decodeBuffer(fileStr);
             SerialBlob serialBlob = new SerialBlob(imageByte);
             InputStream binaryStream = serialBlob.getBinaryStream();
-            String fileName = ALIYUN_OSS_DIR_PREFIX+generateRandomFilename(ossRequest)+".jpg";
+            String fileName = ALIYUN_OSS_DIR_PREFIX + generateRandomFilename(ossRequest) + ".jpg";
             ObjectMetadata metadata = new ObjectMetadata();
-            metadata.setHeader("Content-Type","image/jpeg");
+            metadata.setHeader("Content-Type", "image/jpeg");
             PutObjectResult putObjectResult = ossClient.putObject(ALIYUN_OSS_BUCKET_NAME, fileName, binaryStream, metadata);
             //        ossClient.shutdown();
             return fileName;
-        }catch (SerialException throwables) {
+        } catch (SerialException throwables) {
             return null;
         } catch (SQLException throwables) {
             return null;
         } catch (IOException e) {
             return null;
         }
+    }
 
+    public InputStream getStreamByObject(String filePath) throws Exception {
+            OSSObject ossObject = ossClient.getObject(ALIYUN_OSS_BUCKET_NAME, filePath);
+            return ossObject.getObjectContent();
+    }
+
+    public void zipFile(List<String> fileList, ZipOutputStream zipOut,String dir) {
+        if (CollectionUtils.isEmpty(fileList)) {
+            return;
+        }
+        for (String filePath : fileList) {
+            try (InputStream in = getStreamByObject(filePath)) {
+                zipOut.putNextEntry(new ZipEntry(getFileName(filePath,dir)));
+                byte[] bytes = new byte[1024];
+                int len;
+                while ((len = in.read(bytes)) != -1) {
+                    zipOut.write(bytes, 0, len);
+                }
+                zipOut.closeEntry();
+            }catch (Exception e){
+                System.out.println(e.getMessage()+"压缩错误");
+            }
+        }
+    }
+
+    private String getFileName(String filePath,String dir) {
+        String filename = filePath.substring(filePath.lastIndexOf("/") + 1)+".jpg";
+        if(Validator.isNotEmpty(dir)){
+            filename = dir + "/" + filename;
+        }
+        return filename;
+    }
+
+    @Override
+    public void zipPeopleDownload(ClassPeriodStudentExportVo vo, ZipOutputStream outStream) {
+        //学时照片
+        List<String> list = iUserStudyRecordPhotoService.selectGradePhoto(vo.getUserId(),vo.getGradeId());
+        zipFile(list, outStream,vo.getRealName()+"-"+vo.getIdCard()+"-"+vo.getGradeId()+"/"+"学习照片");  //
+        //个人资料
+        List<String> listInfo = new ArrayList<>();
+        if(Validator.isNotEmpty(vo.getOneInchPhotosOss())){
+            listInfo.add(vo.getOneInchPhotosOss());
+        }
+        if(Validator.isNotEmpty(vo.getIdCardImg1Oss())){
+            listInfo.add(vo.getIdCardImg1Oss());
+        }
+        if(Validator.isNotEmpty(vo.getIdCardImg2Oss())){
+            listInfo.add(vo.getIdCardImg2Oss());
+        }
+        zipFile(listInfo, outStream,vo.getRealName()+"-"+vo.getIdCard()+"-"+vo.getGradeId()+"/"+"资料照片");  //
     }
 
 }

+ 1 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/base/service/impl/ActivityAdvertisingLocationServiceImpl.java

@@ -40,6 +40,7 @@ public class ActivityAdvertisingLocationServiceImpl extends ServiceImpl<Activity
     public ActivityAdvertisingLocationVo queryByKey(String key) {
         LambdaQueryWrapper<ActivityAdvertisingLocation> lqw = Wrappers.lambdaQuery();
         lqw.eq(ActivityAdvertisingLocation::getLocationKey, key);
+        lqw.eq(ActivityAdvertisingLocation::getPlatform, 1);
         ActivityAdvertisingLocation db = this.baseMapper.selectOne(lqw.last("limit 1"));
         return BeanUtil.toBean(db, ActivityAdvertisingLocationVo.class);
     }

+ 1 - 4
zhongzheng-system/src/main/java/com/zhongzheng/modules/base/service/impl/CertificateTpServiceImpl.java

@@ -518,9 +518,7 @@ public class CertificateTpServiceImpl extends ServiceImpl<CertificateTpMapper, C
 
     private  String drawPicOneBuild(CertificatePhotoVo entity){
         Font font = new Font("宋体", Font.BOLD, 20);// 添加字体的属性设置 微软雅黑
-
-        String projectUrl = "D:\\test\\";
-        String imgName = projectUrl + "out02.jpg";
+        String imgName = null;
         try {
             // 加载本地图片
             InputStream imgStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("static/003.jpg");
@@ -562,7 +560,6 @@ public class CertificateTpServiceImpl extends ServiceImpl<CertificateTpMapper, C
             // 完成模板修改
             g.dispose();
             // 获取新文件的地址
-            File outputfile = new File(imgName);
             // 生成新的合成过的用户二维码并写入新图片
     //        ImageIO.write(imageLocal, "jpg", outputfile);
             //上传OSS

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/domain/ClassGradeUser.java

@@ -74,6 +74,8 @@ private static final long serialVersionUID=1L;
     private Long periodStatusNum;
     /** 学时变为审核中时间 */
     private Long periodIngTime;
+    /** 审核用户名 */
+    private String auditUserName;
 
 }
 

+ 4 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/IClassGradeUserService.java

@@ -1,5 +1,6 @@
 package com.zhongzheng.modules.grade.service;
 
+import com.zhongzheng.common.core.domain.AjaxResult;
 import com.zhongzheng.modules.base.bo.UserProfileQueryBo;
 import com.zhongzheng.modules.base.vo.UserProfileExportGaiVo;
 import com.zhongzheng.modules.course.vo.CourseChapterVo;
@@ -14,6 +15,7 @@ import com.zhongzheng.modules.user.domain.User;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
+import java.util.zip.ZipOutputStream;
 
 /**
  * 学员记录Service接口
@@ -56,7 +58,8 @@ public interface IClassGradeUserService extends IService<ClassGradeUser> {
 
 	String pushOfficialPeriodMore(List<ClassGradeUserQueryBo> list);
 
-	List<ClassPeriodStudentExportAllVo> exportPo(ClassGradeUserQueryBo bo);
+	Map<String,Object> exportPo(ClassGradeUserQueryBo bo);
+
 
 	/**
 	 * 根据编辑业务对象修改学员记录

+ 19 - 19
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/ClassGradeServiceImpl.java

@@ -227,20 +227,20 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
             ClassGradeUserQueryBo classGradeUserQueryBo = new ClassGradeUserQueryBo();
             classGradeUserQueryBo.setGradeId(bo.getGradeId());
             List<ClassGradeStudentVo> list = this.listGrade(classGradeUserQueryBo);
-            if(list.size()>0){
+            if (list.size() > 0) {
                 throw new RuntimeException("班级还有学员,无法删除");
             }
         }
         if (bo.getStatus() == 0) {  //更新为无效
-           ClassGradeVo oldGrade =  this.queryById(bo.getGradeId());
-           if(oldGrade.getStatus()==1){
-               ClassGradeUserQueryBo classGradeUserQueryBo = new ClassGradeUserQueryBo();
-               classGradeUserQueryBo.setGradeId(bo.getGradeId());
-               List<ClassGradeStudentVo> list = this.listGrade(classGradeUserQueryBo);
-               if(list.size()>0){
-                   throw new RuntimeException("班级还有学员,无法设置为无效");
-               }
-           }
+            ClassGradeVo oldGrade = this.queryById(bo.getGradeId());
+            if (oldGrade.getStatus() == 1) {
+                ClassGradeUserQueryBo classGradeUserQueryBo = new ClassGradeUserQueryBo();
+                classGradeUserQueryBo.setGradeId(bo.getGradeId());
+                List<ClassGradeStudentVo> list = this.listGrade(classGradeUserQueryBo);
+                if (list.size() > 0) {
+                    throw new RuntimeException("班级还有学员,无法设置为无效");
+                }
+            }
         }
         //更改班主任
         if (bo.getSysUserId() != null) {
@@ -272,7 +272,7 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
         ClassGradeVo classGradeVo = this.queryById(bo.getGradeId());
 
         //开班发送短信
-        if ( update.getClassStatus() != null && update.getClassStatus().equals(1) && (classGradeVo.getClassStatus() == null || classGradeVo.getClassStatus().equals(0))) {
+        if (update.getClassStatus() != null && update.getClassStatus().equals(1) && (classGradeVo.getClassStatus() == null || classGradeVo.getClassStatus().equals(0))) {
             classGradeVo.setClassStartTime(update.getClassStartTime());
             classGradeVo.setClassEndTime(update.getClassEndTime());
             sendClassSMS(classGradeVo);
@@ -282,7 +282,7 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
 
     private void sendClassSMS(ClassGradeVo classGradeVo) {
         InformRemindVo informRemindVo = informRemindService.queryById(19L);
-        if (CollectionUtils.isEmpty(classGradeVo.getGoodsList())){
+        if (CollectionUtils.isEmpty(classGradeVo.getGoodsList())) {
             return;
         }
         if (!CollectionUtils.isEmpty(informRemindVo.getInformRemindBusiness())) {
@@ -294,10 +294,10 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
             String endTime;
             String startTime;
             SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
-            Long timeId = classGradeVo.getClassEndTime()*1000;
+            Long timeId = classGradeVo.getClassEndTime() * 1000;
             Date date = new Date(timeId);
             endTime = simpleDateFormat.format(date);
-            Long timeSId = classGradeVo.getClassStartTime()*1000;
+            Long timeSId = classGradeVo.getClassStartTime() * 1000;
             Date dateS = new Date(timeSId);
             startTime = simpleDateFormat.format(dateS);
             List<Long> userIds = baseMapper.queryUser(classGradeVo.getGradeId());
@@ -315,7 +315,7 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
                         informUserAddBo.setRemind("二建继教开班提醒");
                         informUserAddBo.setGoodsId(classGradeVo.getGoodsList().get(0).getGoodsId());
                         GoodsVo goodsVo1 = iGoodsService.queryById(classGradeVo.getGoodsList().get(0).getGoodsId());
-                        informUserAddBo.setText("尊敬的用户:您购买的"+goodsVo1.getGoodsName()+"课程已开班,班级有效期为"+startTime+"至"+endTime+",请及时完成学习,如过期未完成学习,则需要重新购买学习,马上点击“立即学习”进行学习。");
+                        informUserAddBo.setText("尊敬的用户:您购买的" + goodsVo1.getGoodsName() + "课程已开班,班级有效期为" + startTime + "至" + endTime + ",请及时完成学习,如过期未完成学习,则需要重新购买学习,马上点击“立即学习”进行学习。");
                         iInformUserService.insertByAddBo(informUserAddBo);
                     }
                     if (informRemindVo.getNoteStatus().equals(1)) {
@@ -330,12 +330,12 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
                         informUserAddBo.setRemind("二建继教开班提醒");
                         informUserAddBo.setGoodsId(classGradeVo.getGoodsList().get(0).getGoodsId());
                         GoodsVo goodsVo1 = iGoodsService.queryById(classGradeVo.getGoodsList().get(0).getGoodsId());
-                        informUserAddBo.setText("尊敬的用户:您购买的"+goodsVo1.getGoodsName()+"课程已开班,班级有效期为"+startTime+"至"+endTime+",请及时完成学习,如过期未完成学习,则需要重新购买学习,马上点击“立即学习”进行学习。");
+                        informUserAddBo.setText("尊敬的用户:您购买的" + goodsVo1.getGoodsName() + "课程已开班,班级有效期为" + startTime + "至" + endTime + ",请及时完成学习,如过期未完成学习,则需要重新购买学习,马上点击“立即学习”进行学习。");
                         iInformUserService.insertByAddBo(informUserAddBo);
                         UserVo userVo = iUserService.queryById(userId);
                         Map<String, Object> param = new HashMap<>();
                         param.put("goods", goodsVo1.getGoodsName());
-                        param.put("time", startTime+"至"+endTime);
+                        param.put("time", startTime + "至" + endTime);
                         IAliSmsService.sendInformSms(userVo.getTelphone(), JSON.toJSONString(param), classRemind);
                     }
                 }
@@ -386,8 +386,8 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
             UserUpdateQueryBo userUpdateQueryBo = new UserUpdateQueryBo();
             userUpdateQueryBo.setUserId(classGradeStudentVo.getUserId());
             classGradeStudentVo.setUserUpdates(iUserUpdateService.queryList(userUpdateQueryBo));
-            if(Validator.isNotEmpty(classGradeStudentVo.getRebuyOrderGoodsId())&&classGradeStudentVo.getRebuyOrderGoodsId().longValue()>0){
-                classGradeStudentVo.setRebuy(orderMapper.getGradePeriod(classGradeStudentVo.getRebuyOrderGoodsId(),classGradeStudentVo.getUserId()));
+            if (Validator.isNotEmpty(classGradeStudentVo.getRebuyOrderGoodsId()) && classGradeStudentVo.getRebuyOrderGoodsId().longValue() > 0) {
+                classGradeStudentVo.setRebuy(orderMapper.getGradePeriod(classGradeStudentVo.getRebuyOrderGoodsId(), classGradeStudentVo.getUserId()));
             }
         }
         return classGradeStudentVos;

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 278 - 231
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/ClassGradeUserServiceImpl.java


+ 39 - 37
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/UserPeriodServiceImpl.java

@@ -166,14 +166,14 @@ public class UserPeriodServiceImpl extends ServiceImpl<UserPeriodMapper, UserPer
     public Boolean updateByEditBo(UserPeriodEditBo bo) {
         LoginUser loginUser = SecurityUtils.getLoginUser();
         //查询此人学时审核是否有权限
-        if(!loginUser.getUser().isAdmin()){
-            if (baseMapper.selectCountPeriod(loginUser.getUser().getUserId(),bo.getId()) < 1){
+        if (!loginUser.getUser().isAdmin()) {
+            if (baseMapper.selectCountPeriod(loginUser.getUser().getUserId(), bo.getId()) < 1) {
                 throw new IllegalArgumentException("您没有审核权限");
             }
         }
         //获取旧的状态
         UserPeriodStatusVo oldData = userPeriodStatusService.queryById(bo.getId());
-        if(oldData.getStatus()!=2){
+        if (oldData.getStatus() != 2) {
             throw new CustomException("无法修改非待审核记录");
         }
         //更改审核状态
@@ -196,7 +196,7 @@ public class UserPeriodServiceImpl extends ServiceImpl<UserPeriodMapper, UserPer
         classGradeUserQueryBo.setGoodsId(userPeriodVo.getGoodsId());
         Integer gradePeriodStatus = iClassGradeUserService.updateUserPeriodStatus(classGradeUserQueryBo);
         //发送审核不通过消息
-        if(gradePeriodStatus==0){
+        if (gradePeriodStatus == 0) {
             bo.setStatus(gradePeriodStatus);
             sendPeriodSMS(bo);
             sendPeriodSevenSMS(bo);
@@ -225,14 +225,14 @@ public class UserPeriodServiceImpl extends ServiceImpl<UserPeriodMapper, UserPer
     @Transactional(rollbackFor = Exception.class)
     public boolean editPeriodAll(UserPeriodEditBo bo) {
         LoginUser loginUser = SecurityUtils.getLoginUser();
-        if(Validator.isEmpty(bo.getIds())||bo.getIds().size()<1){
+        if (Validator.isEmpty(bo.getIds()) || bo.getIds().size() < 1) {
             throw new CustomException("您没有勾选数据");
         }
         Long firstId = bo.getIds().get(0);
 
         //查询此人学时审核是否有权限
-        if(!loginUser.getUser().isAdmin()){
-            if (baseMapper.selectCountPeriod(loginUser.getUser().getUserId(),firstId) < 1){
+        if (!loginUser.getUser().isAdmin()) {
+            if (baseMapper.selectCountPeriod(loginUser.getUser().getUserId(), firstId) < 1) {
                 throw new IllegalArgumentException("您没有审核权限");
             }
         }
@@ -246,7 +246,7 @@ public class UserPeriodServiceImpl extends ServiceImpl<UserPeriodMapper, UserPer
         for (Long id : bo.getIds()) {
             //获取旧的状态
             UserPeriodStatusVo oldData = userPeriodStatusService.queryById(id);
-            if(oldData.getStatus()!=2){
+            if (oldData.getStatus() != 2) {
                 throw new CustomException("无法修改非待审核记录");
             }
             UserPeriodStatus userPeriodStatus = new UserPeriodStatus();
@@ -269,7 +269,7 @@ public class UserPeriodServiceImpl extends ServiceImpl<UserPeriodMapper, UserPer
         classGradeUserQueryBo.setGoodsId(bo.getGoodsId());
         Integer gradePeriodStatus = iClassGradeUserService.updateUserPeriodStatus(classGradeUserQueryBo);
         //发送审核不通过消息
-        if(gradePeriodStatus==0){
+        if (gradePeriodStatus == 0) {
             bo.setStatus(gradePeriodStatus);
             sendPeriodSMS(bo);
             sendPeriodSevenSMS(bo);
@@ -281,41 +281,42 @@ public class UserPeriodServiceImpl extends ServiceImpl<UserPeriodMapper, UserPer
     //学时审核确定通过
     @Override
     public Boolean confirmPeriod(UserPeriodEditBo bo) {
-        if(Validator.isEmpty(bo.getUserId())||Validator.isEmpty(bo.getGoodsId())||Validator.isEmpty(bo.getGradeId())){
+        if (Validator.isEmpty(bo.getUserId()) || Validator.isEmpty(bo.getGoodsId()) || Validator.isEmpty(bo.getGradeId())) {
             throw new CustomException("参数不全");
         }
         ClassGradeUser classGradeUser = iClassGradeUserService.getOne(new LambdaQueryWrapper<ClassGradeUser>()
                 .eq(ClassGradeUser::getUserId, bo.getUserId())
                 .eq(ClassGradeUser::getGradeId, bo.getGradeId())
                 .last("limit 1"));
-        if(Validator.isEmpty(classGradeUser)||classGradeUser.getPeriodStatus()!=3){
+        if (Validator.isEmpty(classGradeUser) || classGradeUser.getPeriodStatus() != 3) {
             throw new CustomException("非审核中状态无法确认审核");
         }
         LoginUser loginUser = SecurityUtils.getLoginUser();
         //查询此人学时审核是否有权限
-        if(!loginUser.getUser().isAdmin()){
-            if (baseMapper.selectCountConfirmPeriod(loginUser.getUser().getUserId(),bo.getId()) < 1){
+        if (!loginUser.getUser().isAdmin()) {
+            if (baseMapper.selectCountConfirmPeriod(loginUser.getUser().getUserId(), bo.getId()) < 1) {
                 throw new CustomException("您没有确认审核权限");
             }
         }
         LambdaUpdateWrapper<ClassGradeUser> objectLambdaUpdateWrapper = Wrappers.lambdaUpdate();
         objectLambdaUpdateWrapper.eq(ClassGradeUser::getId, classGradeUser.getId());
         objectLambdaUpdateWrapper.set(ClassGradeUser::getPeriodStatus, 1);
-        objectLambdaUpdateWrapper.set(ClassGradeUser::getUpdateTime,DateUtils.getNowTime());
-        objectLambdaUpdateWrapper.set(ClassGradeUser::getPeriodTime,DateUtils.getNowTime());
+        objectLambdaUpdateWrapper.set(ClassGradeUser::getUpdateTime, DateUtils.getNowTime());
+        objectLambdaUpdateWrapper.set(ClassGradeUser::getPeriodTime, DateUtils.getNowTime());
+        objectLambdaUpdateWrapper.set(ClassGradeUser::getAuditUserName, SecurityUtils.getUsername());
         //判断结业
-        long nowTime = System.currentTimeMillis()/1000;
+        long nowTime = System.currentTimeMillis() / 1000;
         ClassGradeUserQueryBo queryBo = new ClassGradeUserQueryBo();
         queryBo.setGradeId(bo.getGradeId());
         queryBo.setUserId(bo.getUserId());
         ClassPeriodStudentVo classPeriodStudentVo = classGradeUserMapper.userPeriodStatus(queryBo);
-        if(Validator.isEmpty(classPeriodStudentVo.getClassStartTime())){
+        if (Validator.isEmpty(classPeriodStudentVo.getClassStartTime())) {
             //没设置永久有效
-            objectLambdaUpdateWrapper.set(ClassGradeUser::getFinishStatus,1);
+            objectLambdaUpdateWrapper.set(ClassGradeUser::getFinishStatus, 1);
         }
-        if(Validator.isNotEmpty(classPeriodStudentVo.getClassEndTime())&&Validator.isNotEmpty(classPeriodStudentVo.getClassStartTime())){
-            if(nowTime<classPeriodStudentVo.getClassEndTime()&&nowTime>classPeriodStudentVo.getClassStartTime()){
-                objectLambdaUpdateWrapper.set(ClassGradeUser::getFinishStatus,1);
+        if (Validator.isNotEmpty(classPeriodStudentVo.getClassEndTime()) && Validator.isNotEmpty(classPeriodStudentVo.getClassStartTime())) {
+            if (nowTime < classPeriodStudentVo.getClassEndTime() && nowTime > classPeriodStudentVo.getClassStartTime()) {
+                objectLambdaUpdateWrapper.set(ClassGradeUser::getFinishStatus, 1);
             }
         }
         iClassGradeUserService.update(null, objectLambdaUpdateWrapper);
@@ -333,27 +334,28 @@ public class UserPeriodServiceImpl extends ServiceImpl<UserPeriodMapper, UserPer
 
     /**
      * 打回操作
+     *
      * @param bo
      * @return
      */
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Boolean rollbackPeriod(UserPeriodEditBo bo) {
-        if(Validator.isEmpty(bo.getUserId())||Validator.isEmpty(bo.getGoodsId())||Validator.isEmpty(bo.getGradeId())){
+        if (Validator.isEmpty(bo.getUserId()) || Validator.isEmpty(bo.getGoodsId()) || Validator.isEmpty(bo.getGradeId())) {
             throw new CustomException("参数不全");
         }
         ClassGradeUser classGradeUser = iClassGradeUserService.getOne(new LambdaQueryWrapper<ClassGradeUser>()
                 .eq(ClassGradeUser::getUserId, bo.getUserId())
                 .eq(ClassGradeUser::getGradeId, bo.getGradeId())
                 .last("limit 1"));
-        if(Validator.isEmpty(classGradeUser)||classGradeUser.getPeriodStatus()!=3){
+        if (Validator.isEmpty(classGradeUser) || classGradeUser.getPeriodStatus() != 3) {
             throw new CustomException("非审核中状态无法打回操作");
         }
         LoginUser loginUser = SecurityUtils.getLoginUser();
         Long upId = bo.getIds().get(0);
         //查询此人学时审核是否有权限
-        if(!loginUser.getUser().isAdmin()){
-            if (baseMapper.selectCountConfirmPeriod(loginUser.getUser().getUserId(),upId) < 1){
+        if (!loginUser.getUser().isAdmin()) {
+            if (baseMapper.selectCountConfirmPeriod(loginUser.getUser().getUserId(), upId) < 1) {
                 throw new CustomException("您没有确认审核权限");
             }
         }
@@ -378,16 +380,16 @@ public class UserPeriodServiceImpl extends ServiceImpl<UserPeriodMapper, UserPer
 
     @Override
     public Long todayStudySectionNum(UserPeriodQueryBo bo) {
-        long current=System.currentTimeMillis();
-        long zero=current/(1000*3600*24)*(1000*3600*24)-TimeZone.getDefault().getRawOffset();//今天零点零分零秒的毫秒数
-        long twelve=zero+24*60*60*1000-1;//今天23点59分59秒的毫秒数
-        bo.setTodayStartTime(zero/1000);
-        bo.setTodayEndTime(twelve/1000);
+        long current = System.currentTimeMillis();
+        long zero = current / (1000 * 3600 * 24) * (1000 * 3600 * 24) - TimeZone.getDefault().getRawOffset();//今天零点零分零秒的毫秒数
+        long twelve = zero + 24 * 60 * 60 * 1000 - 1;//今天23点59分59秒的毫秒数
+        bo.setTodayStartTime(zero / 1000);
+        bo.setTodayEndTime(twelve / 1000);
         return baseMapper.todayStudySectionNum(bo);
     }
 
     //学时通过处理事件
-    private void periodPass(ClassGradeUserQueryBo classGradeUserQueryBo){
+    private void periodPass(ClassGradeUserQueryBo classGradeUserQueryBo) {
         //生成证书
         iCertificateTpService.makeCertificatePhoto(classGradeUserQueryBo);
         //官方学时推送
@@ -395,12 +397,12 @@ public class UserPeriodServiceImpl extends ServiceImpl<UserPeriodMapper, UserPer
     }
 
     private void sendPeriodSMS(UserPeriodEditBo bo) {
-        String key = "Period-"+bo.getGoodsId()+"-"+bo.getUserId();
+        String key = "Period-" + bo.getGoodsId() + "-" + bo.getUserId();
         Long value = redisCache.getCacheObject(key);
-        if(Validator.isNotEmpty(value)){
+        if (Validator.isNotEmpty(value)) {
             return;
         }
-        redisCache.setCacheObject(key,1L,1, TimeUnit.MINUTES);//1分钟
+        redisCache.setCacheObject(key, 1L, 1, TimeUnit.MINUTES);//1分钟
         GoodsVo goodsVo1 = iGoodsService.queryById(bo.getGoodsId());
         if (bo.getStatus().equals(1)) {
             InformRemindVo informRemindVo = informRemindService.queryById(9L);
@@ -478,12 +480,12 @@ public class UserPeriodServiceImpl extends ServiceImpl<UserPeriodMapper, UserPer
     }
 
     private void sendPeriodSevenSMS(UserPeriodEditBo bo) {
-        String key = "PeriodSeven-"+bo.getGoodsId()+"-"+bo.getUserId();
+        String key = "PeriodSeven-" + bo.getGoodsId() + "-" + bo.getUserId();
         Long value = redisCache.getCacheObject(key);
-        if(Validator.isNotEmpty(value)){
+        if (Validator.isNotEmpty(value)) {
             return;
         }
-        redisCache.setCacheObject(key,1L,1, TimeUnit.MINUTES);//1分钟
+        redisCache.setCacheObject(key, 1L, 1, TimeUnit.MINUTES);//1分钟
         GoodsVo goodsVo1 = iGoodsService.queryById(bo.getGoodsId());
         if (bo.getStatus().equals(1)) {
             InformRemindVo informRemindVo = informRemindService.queryById(11L);

+ 10 - 10
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/UserPeriodStatusServiceImpl.java

@@ -32,7 +32,7 @@ import java.util.stream.Collectors;
 public class UserPeriodStatusServiceImpl extends ServiceImpl<UserPeriodStatusMapper, UserPeriodStatus> implements IUserPeriodStatusService {
 
     @Override
-    public UserPeriodStatusVo queryById(Long id){
+    public UserPeriodStatusVo queryById(Long id) {
         UserPeriodStatus db = this.baseMapper.selectById(id);
         return BeanUtil.toBean(db, UserPeriodStatusVo.class);
     }
@@ -49,19 +49,19 @@ public class UserPeriodStatusServiceImpl extends ServiceImpl<UserPeriodStatusMap
     }
 
     /**
-    * 实体类转化成视图对象
-    *
-    * @param collection 实体类集合
-    * @return
-    */
+     * 实体类转化成视图对象
+     *
+     * @param collection 实体类集合
+     * @return
+     */
     private List<UserPeriodStatusVo> entity2Vo(Collection<UserPeriodStatus> collection) {
         List<UserPeriodStatusVo> voList = collection.stream()
                 .map(any -> BeanUtil.toBean(any, UserPeriodStatusVo.class))
                 .collect(Collectors.toList());
         if (collection instanceof Page) {
-            Page<UserPeriodStatus> page = (Page<UserPeriodStatus>)collection;
+            Page<UserPeriodStatus> page = (Page<UserPeriodStatus>) collection;
             Page<UserPeriodStatusVo> pageVo = new Page<>();
-            BeanUtil.copyProperties(page,pageVo);
+            BeanUtil.copyProperties(page, pageVo);
             pageVo.addAll(voList);
             voList = pageVo;
         }
@@ -90,13 +90,13 @@ public class UserPeriodStatusServiceImpl extends ServiceImpl<UserPeriodStatusMap
      *
      * @param entity 实体类数据
      */
-    private void validEntityBeforeSave(UserPeriodStatus entity){
+    private void validEntityBeforeSave(UserPeriodStatus entity) {
         //TODO 做一些数据校验,如唯一约束
     }
 
     @Override
     public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
-        if(isValid){
+        if (isValid) {
             //TODO 做一些业务上的校验,判断是否需要校验
         }
         return this.removeByIds(ids);

+ 10 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/vo/ClassPeriodStudentExportVo.java

@@ -63,4 +63,14 @@ public class ClassPeriodStudentExportVo {
 
 	@ExcelCollection(name = "学习记录")
 	private List<UserPeriodExportVo> periodVoList;
+
+	private Long userId;
+
+	private Long gradeId;
+
+	private String idCardImg1Oss;
+
+	private String idCardImg2Oss;
+
+	private String oneInchPhotosOss;
 }

+ 6 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/vo/ClassPeriodStudentVo.java

@@ -191,4 +191,10 @@ public class ClassPeriodStudentVo {
 	@Excel(name = "服务有效期结束")
 	@ApiModelProperty("服务有效期结束")
 	private Long serviceEndTime;
+
+	private String idCardImg1Oss;
+
+	private String idCardImg2Oss;
+
+	private String oneInchPhotosOss;
 }

+ 47 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/OrderPayAddBo.java

@@ -0,0 +1,47 @@
+package com.zhongzheng.modules.order.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+
+
+/**
+ * 订单支付单号添加对象 order_pay
+ *
+ * @author hjl
+ * @date 2022-04-18
+ */
+@Data
+@ApiModel("订单支付单号添加对象")
+public class OrderPayAddBo {
+
+    /** 订单编号 */
+    @ApiModelProperty("订单编号")
+    private String orderSn;
+    /** 支付单号 */
+    @ApiModelProperty("支付单号")
+    private String paySn;
+    /** 创建时间 */
+    @ApiModelProperty("创建时间")
+    private Long createTime;
+    /** 更新时间 */
+    @ApiModelProperty("更新时间")
+    private Long updateTime;
+    /** 0未支付 1已支付 */
+    @ApiModelProperty("0未支付 1已支付")
+    private Integer status;
+    /** 支付方式 1微信  */
+    @ApiModelProperty("支付方式 1微信 ")
+    private Integer payFrom;
+    /** 支付价格(成交价) */
+    @ApiModelProperty("支付价格(成交价)")
+    private BigDecimal payPrice;
+    /** 微信流水号 */
+    @ApiModelProperty("微信流水号")
+    private String transid;
+}

+ 51 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/OrderPayEditBo.java

@@ -0,0 +1,51 @@
+package com.zhongzheng.modules.order.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+
+/**
+ * 订单支付单号编辑对象 order_pay
+ *
+ * @author hjl
+ * @date 2022-04-18
+ */
+@Data
+@ApiModel("订单支付单号编辑对象")
+public class OrderPayEditBo {
+
+    /** $column.columnComment */
+    @ApiModelProperty("$column.columnComment")
+    private Long id;
+
+    /** 订单编号 */
+    @ApiModelProperty("订单编号")
+    private String orderSn;
+
+    /** 支付单号 */
+    @ApiModelProperty("支付单号")
+    private String paySn;
+
+    /** 更新时间 */
+    @ApiModelProperty("更新时间")
+    private Long updateTime;
+
+    /** 0未支付 1已支付 */
+    @ApiModelProperty("0未支付 1已支付")
+    private Integer status;
+
+    /** 支付方式 1微信  */
+    @ApiModelProperty("支付方式 1微信 ")
+    private Integer payFrom;
+    /** 支付价格(成交价) */
+    @ApiModelProperty("支付价格(成交价)")
+    private BigDecimal payPrice;
+    /** 微信流水号 */
+    @ApiModelProperty("微信流水号")
+    private String transid;
+}

+ 58 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/OrderPayQueryBo.java

@@ -0,0 +1,58 @@
+package com.zhongzheng.modules.order.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.Map;
+import java.util.HashMap;
+
+import com.zhongzheng.common.core.domain.BaseEntity;
+
+/**
+ * 订单支付单号分页查询对象 order_pay
+ *
+ * @author hjl
+ * @date 2022-04-18
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("订单支付单号分页查询对象")
+public class OrderPayQueryBo extends BaseEntity {
+
+	/** 分页大小 */
+	@ApiModelProperty("分页大小")
+	private Integer pageSize;
+	/** 当前页数 */
+	@ApiModelProperty("当前页数")
+	private Integer pageNum;
+	/** 排序列 */
+	@ApiModelProperty("排序列")
+	private String orderByColumn;
+	/** 排序的方向desc或者asc */
+	@ApiModelProperty(value = "排序的方向", example = "asc,desc")
+	private String isAsc;
+
+
+	/** 订单编号 */
+	@ApiModelProperty("订单编号")
+	private String orderSn;
+	/** 支付单号 */
+	@ApiModelProperty("支付单号")
+	private String paySn;
+	/** 0未支付 1已支付 */
+	@ApiModelProperty("0未支付 1已支付")
+	private Integer status;
+	/** 支付方式 1微信  */
+	@ApiModelProperty("支付方式 1微信 ")
+	private Integer payFrom;
+	/** 支付价格(成交价) */
+	@ApiModelProperty("支付价格(成交价)")
+	private BigDecimal payPrice;
+	/** 微信流水号 */
+	@ApiModelProperty("微信流水号")
+	private String transid;
+}

+ 5 - 2
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/domain/Order.java

@@ -31,15 +31,18 @@ private static final long serialVersionUID=1L;
     public static final Integer PAY_PART =1;  //1部分收费(支付状态)
     public static final Integer PAY_FULL =2;  //2完全收费(支付状态)
     public static final Integer PAY_FREE =3;  //3免费(支付状态)
-    public static final Integer REFUND_PART =3;  //1部分收费
-    public static final Integer REFUND_FULL =4;  //2完全收费
+    public static final Integer REFUND_PART =3;  //1部分退款
+    public static final Integer REFUND_FULL =4;  //2完全退款
     public static final Integer ORDER_STATUS_PAY =1;  //1已支付(订单状态)
 
 
     public static final Integer FROM_PLAT =1;  //业务员普通单
     public static final Integer FROM_SMALL =2;  //祥粤云学堂小程序
+    public static final Integer FROM_PC =3;  //祥粤云学堂网站
     public static final Integer FROM_INPUT =5;  //业务员录单
 
+    public static final Integer PAY_WECHAT =1;  //微信支付
+
     /** $column.columnComment */
     @TableId(value = "order_id")
     private Long orderId;

+ 47 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/domain/OrderPay.java

@@ -0,0 +1,47 @@
+package com.zhongzheng.modules.order.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import java.io.Serializable;
+import java.util.Date;
+import java.math.BigDecimal;
+import com.zhongzheng.common.annotation.Excel;
+
+/**
+ * 订单支付单号对象 order_pay
+ *
+ * @author hjl
+ * @date 2022-04-18
+ */
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+@TableName("order_pay")
+public class OrderPay implements Serializable {
+
+private static final long serialVersionUID=1L;
+
+    /** $column.columnComment */
+    @TableId(value = "id")
+    private Long id;
+    /** 订单编号 */
+    private String orderSn;
+    /** 支付单号 */
+    private String paySn;
+    /** 创建时间 */
+    @TableField(fill = FieldFill.INSERT)
+    private Long createTime;
+    /** 更新时间 */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Long updateTime;
+    /** 0未支付 1已支付 */
+    private Integer status;
+    /** 支付方式 1微信  */
+    private Integer payFrom;
+    /** 支付价格(成交价) */
+    private BigDecimal payPrice;
+    /** 微信流水号 */
+    private String transid;
+}

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/mapper/OrderMapper.java

@@ -23,4 +23,6 @@ public interface OrderMapper extends BaseMapper<Order> {
     List<OrderListVo> selectListApp(OrderQueryBo bo);
 
     Integer getGradePeriod(@Param("orderGoodsId") Long orderGoodsId,@Param("userId") Long userId);
+
+    Integer queryByOrderSn(String orderSn);
 }

+ 14 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/mapper/OrderPayMapper.java

@@ -0,0 +1,14 @@
+package com.zhongzheng.modules.order.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zhongzheng.modules.order.domain.OrderPay;
+
+/**
+ * 订单支付单号Mapper接口
+ *
+ * @author hjl
+ * @date 2022-04-18
+ */
+public interface OrderPayMapper extends BaseMapper<OrderPay> {
+
+}

+ 52 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/IOrderPayService.java

@@ -0,0 +1,52 @@
+package com.zhongzheng.modules.order.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zhongzheng.modules.order.bo.OrderPayAddBo;
+import com.zhongzheng.modules.order.bo.OrderPayEditBo;
+import com.zhongzheng.modules.order.bo.OrderPayQueryBo;
+import com.zhongzheng.modules.order.domain.OrderPay;
+import com.zhongzheng.modules.order.vo.OrderPayVo;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 订单支付单号Service接口
+ *
+ * @author hjl
+ * @date 2022-04-18
+ */
+public interface IOrderPayService extends IService<OrderPay> {
+	/**
+	 * 查询单个
+	 * @return
+	 */
+	OrderPayVo queryById(Long id);
+
+	/**
+	 * 查询列表
+	 */
+	List<OrderPayVo> queryList(OrderPayQueryBo bo);
+
+	/**
+	 * 根据新增业务对象插入订单支付单号
+	 * @param bo 订单支付单号新增业务对象
+	 * @return
+	 */
+	Boolean insertByAddBo(OrderPayAddBo bo);
+
+	/**
+	 * 根据编辑业务对象修改订单支付单号
+	 * @param bo 订单支付单号编辑业务对象
+	 * @return
+	 */
+	Boolean updateByEditBo(OrderPayEditBo bo);
+
+	/**
+	 * 校验并删除数据
+	 * @param ids 主键集合
+	 * @param isValid 是否校验,true-删除前校验,false-不校验
+	 * @return
+	 */
+	Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 6 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/IOrderService.java

@@ -57,6 +57,8 @@ public interface IOrderService extends IService<Order> {
 	 */
 	Map<String, String> placeSmallOrder(OrderAddBo bo);
 
+	Map<String, String> placePcOrder(OrderAddBo bo);
+
 	Map<String, String> resumeSmallOrder(OrderAddBo bo);
 
 	/**
@@ -75,4 +77,8 @@ public interface IOrderService extends IService<Order> {
 	Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
 
 	List<OrderListVo> selectListApp(OrderQueryBo bo);
+
+	Integer queryByOrderSn(String orderSn);
+
+	Map<String, String> resumePcOrder(OrderAddBo bo);
 }

+ 2 - 2
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderGoodsRefundServiceImpl.java

@@ -143,8 +143,8 @@ public class OrderGoodsRefundServiceImpl extends ServiceImpl<OrderGoodsRefundMap
         if(order.getStatus()==0){
             throw new CustomException("订单无效");
         }
-        if(order.getOrderFrom()!=2){
-            throw new CustomException("不支持非小程序订单退款");
+        if(order.getOrderFrom()!=2&&order.getOrderFrom()!=3){
+            throw new CustomException("不支持非客户端订单退款");
         }
         //订单商品
         Goods goods = iGoodsService.getOne(new LambdaQueryWrapper<Goods>().eq(Goods::getGoodsId,bo.getGoodsId()));

+ 102 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderPayServiceImpl.java

@@ -0,0 +1,102 @@
+package com.zhongzheng.modules.order.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.StrUtil;
+import com.zhongzheng.common.utils.DateUtils;
+import com.zhongzheng.modules.order.bo.OrderPayAddBo;
+import com.zhongzheng.modules.order.bo.OrderPayEditBo;
+import com.zhongzheng.modules.order.bo.OrderPayQueryBo;
+import com.zhongzheng.modules.order.domain.OrderPay;
+import com.zhongzheng.modules.order.mapper.OrderPayMapper;
+import com.zhongzheng.modules.order.service.IOrderPayService;
+import com.zhongzheng.modules.order.vo.OrderPayVo;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.github.pagehelper.Page;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 订单支付单号Service业务层处理
+ *
+ * @author hjl
+ * @date 2022-04-18
+ */
+@Service
+public class OrderPayServiceImpl extends ServiceImpl<OrderPayMapper, OrderPay> implements IOrderPayService {
+
+    @Override
+    public OrderPayVo queryById(Long id){
+        OrderPay db = this.baseMapper.selectById(id);
+        return BeanUtil.toBean(db, OrderPayVo.class);
+    }
+
+    @Override
+    public List<OrderPayVo> queryList(OrderPayQueryBo bo) {
+        LambdaQueryWrapper<OrderPay> lqw = Wrappers.lambdaQuery();
+        lqw.eq(StrUtil.isNotBlank(bo.getOrderSn()), OrderPay::getOrderSn, bo.getOrderSn());
+        lqw.eq(StrUtil.isNotBlank(bo.getPaySn()), OrderPay::getPaySn, bo.getPaySn());
+        lqw.eq(bo.getStatus() != null, OrderPay::getStatus, bo.getStatus());
+        lqw.eq(bo.getPayFrom() != null, OrderPay::getPayFrom, bo.getPayFrom());
+        return entity2Vo(this.list(lqw));
+    }
+
+    /**
+    * 实体类转化成视图对象
+    *
+    * @param collection 实体类集合
+    * @return
+    */
+    private List<OrderPayVo> entity2Vo(Collection<OrderPay> collection) {
+        List<OrderPayVo> voList = collection.stream()
+                .map(any -> BeanUtil.toBean(any, OrderPayVo.class))
+                .collect(Collectors.toList());
+        if (collection instanceof Page) {
+            Page<OrderPay> page = (Page<OrderPay>)collection;
+            Page<OrderPayVo> pageVo = new Page<>();
+            BeanUtil.copyProperties(page,pageVo);
+            pageVo.addAll(voList);
+            voList = pageVo;
+        }
+        return voList;
+    }
+
+    @Override
+    public Boolean insertByAddBo(OrderPayAddBo bo) {
+        OrderPay add = BeanUtil.toBean(bo, OrderPay.class);
+        validEntityBeforeSave(add);
+        add.setCreateTime(DateUtils.getNowTime());
+        add.setUpdateTime(DateUtils.getNowTime());
+        return this.save(add);
+    }
+
+    @Override
+    public Boolean updateByEditBo(OrderPayEditBo bo) {
+        OrderPay update = BeanUtil.toBean(bo, OrderPay.class);
+        validEntityBeforeSave(update);
+        update.setUpdateTime(DateUtils.getNowTime());
+        return this.updateById(update);
+    }
+
+    /**
+     * 保存前的数据校验
+     *
+     * @param entity 实体类数据
+     */
+    private void validEntityBeforeSave(OrderPay entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return this.removeByIds(ids);
+    }
+}

+ 202 - 3
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderServiceImpl.java

@@ -103,6 +103,9 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
     @Autowired
     private IOrderInputService iOrderInputService;
 
+    @Autowired
+    private IOrderPayService iOrderPayService;
+
     @Autowired
     private RedisCache redisCache;
 
@@ -591,14 +594,23 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
         add.setOrderSn(out_trade_no);
         add.setOrderFrom(Order.FROM_SMALL);
         add.setPayPrice(payPrice);
-
+        add.setPayType(Order.PAY_WECHAT);
         add.setOrderPrice(totalPrice);
+        //生成支付单号
+        String pay_no = DateUtils.getPayOrderSn();
         //订单0元
         if(payPrice.compareTo(BigDecimal.ZERO)==0){
             //完全收费
             add.setOrderStatus(Order.ORDER_STATUS_PAY);
             add.setPayStatus(Order.PAY_FREE);
             add.setStatus(1);
+        }else{
+            OrderPayAddBo payAddBo = new OrderPayAddBo();
+            payAddBo.setPaySn(pay_no);
+            payAddBo.setOrderSn(out_trade_no);
+            payAddBo.setStatus(0);
+            payAddBo.setPayPrice(payPrice);
+            iOrderPayService.insertByAddBo(payAddBo);
         }
         this.save(add);
         //处理免费商品
@@ -614,7 +626,144 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
         Map<String, String> payResult = new HashMap<>();
         //大于0元,获取微信支付信息
         if(payPrice.compareTo(BigDecimal.ZERO)!=0){
-            payResult =  iWxPayService.payment(out_trade_no,userVo.getOpenId(),body,payPrice);
+            payResult =  iWxPayService.payment(pay_no,userVo.getOpenId(),body,payPrice);
+        }
+
+        payResult.put("orderSn",out_trade_no);
+        return payResult;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Map<String, String> placePcOrder(OrderAddBo bo) {
+        List<OrderGoodsAddBo> goodsList = bo.getGoodsList();
+        if(goodsList==null||goodsList.size()<1){
+            throw new CustomException("商品列表为空");
+        }
+        Order add = BeanUtil.toBean(bo, Order.class);
+        validEntityBeforeSave(add);
+        add.setCreateTime(DateUtils.getNowTime());
+        add.setUpdateTime(DateUtils.getNowTime());
+
+
+        //生成订单号
+        String out_trade_no = DateUtils.getDateOrderSn();
+        BigDecimal totalPrice = new BigDecimal(0);
+        BigDecimal payPrice = new BigDecimal(0);
+        String body = "中正祥粤云-";
+        List<OrderGoods> freeList = new ArrayList<>();
+        //生成订单
+        for (OrderGoodsAddBo g : goodsList) {
+            //订单商品
+            Goods goods = iGoodsService.getOne(new LambdaQueryWrapper<Goods>().eq(Goods::getGoodsId,g.getGoodsId()));
+            if(goods.getGoodsStatus()!=1){
+                throw new CustomException("商品尚未上架");
+            }
+            body = "中正祥粤云-"+goods.getGoodsName();
+            OrderGoods orderGoods = BeanUtil.toBean(g, OrderGoods.class);
+            orderGoods.setOrderSn(out_trade_no);
+            if(g.getGoodsInputData()!=null){
+                orderGoods.setGoodsInputData(JSON.toJSONString(g.getGoodsInputData()));
+            }
+            //赋值业务信息
+           /* orderGoods.setBusinessOwner(bo.getOrderBusiness().getBusinessOwner());
+            orderGoods.setDept(bo.getOrderBusiness().getDept());
+            orderGoods.setSource(bo.getOrderBusiness().getSource());
+            orderGoods.setSchool(bo.getOrderBusiness().getSchool());*/
+
+            //收货公司信息
+           /* orderGoods.setAddress(bo.getOrderStudent().getAddress());
+            orderGoods.setCompany(bo.getOrderStudent().getCompany());*/
+            //成交价
+            orderGoods.setStatus(1);
+            orderGoods.setGoodsRealPrice(goods.getStandPrice());
+            orderGoods.setGoodsPrice(goods.getStandPrice());
+            orderGoods.setCreateTime(DateUtils.getNowTime());
+            orderGoods.setUpdateTime(DateUtils.getNowTime());
+            //订单价格不计算优惠
+            totalPrice = totalPrice.add(goods.getStandPrice());
+            //暂不计算优惠券
+            payPrice = payPrice.add(goods.getStandPrice());
+            boolean orderGoodsRs = iOrderGoodsService.save(orderGoods);
+
+            boolean canRepeatBuy = false;
+            //视频商品安排班级
+            if(goods.getGoodsType()==1){
+                if(Validator.isNotEmpty(goods.getStudyCount())){
+                    orderGoods.setStudyCount(goods.getStudyCount()-1); //默认分班消耗一次学习机会
+                }else{
+                    orderGoods.setStudyCount(0L);//没配置则为0
+                }
+                Long gradeId = null;
+                //判断是否购买历史班级都过期
+                canRepeatBuy =this.canBuyRepeatGoods(g.getGoodsId(),bo.getUserId());
+                if(g.getGoodsInputData()!=null){
+                    gradeId = g.getGoodsInputData().getGradeId();
+                    //判断是否有购买过
+                    Long oldOrderGoodsId = getHaveBuyGoods(g.getGoodsId(),bo.getUserId());
+                    if(Validator.isNotEmpty(oldOrderGoodsId)){
+                        //有指定选班模板且视频商品班级已过期,记录复购状态
+                        orderGoods.setRebuyOrderGoodsId(oldOrderGoodsId);
+                    }
+                }
+                String requestId = IdUtil.simpleUUID();
+                RedisLockEntity redisLockEntity = new RedisLockEntity();
+                redisLockEntity.setLockKey(RedisLockEntity.KEY_LOCK_GRADE);
+                redisLockEntity.setRequestId(requestId);
+                if(redisCache.lock(redisLockEntity)){
+                    arrangeGrade(goods.getGoodsName(),goods.getGoodsId(),orderGoods.getOrderGoodsId(),gradeId,add.getUserId(),out_trade_no,goods.getBusinessId());
+                    redisCache.unlockLua(redisLockEntity);
+                }
+                iOrderGoodsService.updateById(orderGoods);
+            }
+
+            if(!canRepeatBuy&&goods.getGoodsType()!=3&&goods.getGoodsType()!=4){
+                this.checkBuyGoods(g.getGoodsId(),bo.getUserId(),goods.getGoodsType());
+            }
+            iShoppingCartService.deleteByGoodsId(g.getGoodsId(),bo.getUserId());
+            //商品0元加入免费商品列表
+            if(orderGoods.getGoodsPrice().compareTo(BigDecimal.ZERO)==0){
+                freeList.add(orderGoods);
+            }
+        }
+
+        add.setOrderSn(out_trade_no);
+        add.setOrderFrom(Order.FROM_PC);
+        add.setPayPrice(payPrice);
+        add.setPayType(Order.PAY_WECHAT);
+        add.setOrderPrice(totalPrice);
+        //生成支付单号
+        String pay_no = DateUtils.getPayOrderSn();
+        //订单0元
+        if(payPrice.compareTo(BigDecimal.ZERO)==0){
+            //完全收费
+            add.setOrderStatus(Order.ORDER_STATUS_PAY);
+            add.setPayStatus(Order.PAY_FREE);
+            add.setStatus(1);
+        }else{
+            OrderPayAddBo payAddBo = new OrderPayAddBo();
+            payAddBo.setPaySn(pay_no);
+            payAddBo.setOrderSn(out_trade_no);
+            payAddBo.setStatus(0);
+            payAddBo.setPayPrice(payPrice);
+            iOrderPayService.insertByAddBo(payAddBo);
+        }
+        this.save(add);
+
+        //处理免费商品
+        for( OrderGoods orderGoods : freeList){
+            dealFreeGoods(orderGoods,add);
+        }
+
+        Map<String, Object> result = new HashMap<>();
+        result.put("oderId",add.getOrderId());
+        result.put("orderSn",out_trade_no);
+        UserVo userVo = iUserService.queryById(add.getUserId());
+        //    String price = "1";
+        Map<String, String> payResult = new HashMap<>();
+        //大于0元,获取微信支付信息
+        if(payPrice.compareTo(BigDecimal.ZERO)!=0){
+            payResult =  iWxPayService.paymentPc(pay_no,userVo.getOpenId(),body,payPrice);
         }
 
         payResult.put("orderSn",out_trade_no);
@@ -644,7 +793,15 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
             throw new CustomException("无法继续支付");
         }
         UserVo userVo = iUserService.queryById(bo.getUserId());
-        Map<String, String> payResult =  iWxPayService.payment(bo.getOrderSn(),userVo.getOpenId(),body,order.getPayPrice());
+        //生成支付单号
+        String pay_no = DateUtils.getPayOrderSn();
+        OrderPayAddBo payAddBo = new OrderPayAddBo();
+        payAddBo.setPaySn(pay_no);
+        payAddBo.setOrderSn(bo.getOrderSn());
+        payAddBo.setStatus(0);
+        payAddBo.setPayPrice(order.getPayPrice());
+        iOrderPayService.insertByAddBo(payAddBo);
+        Map<String, String> payResult =  iWxPayService.payment(pay_no,userVo.getOpenId(),body,order.getPayPrice());
         payResult.put("orderSn",bo.getOrderSn());
         return payResult;
     }
@@ -725,6 +882,48 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
         return orderListVos;
     }
 
+    @Override
+    public Integer queryByOrderSn(String orderSn) {
+        return baseMapper.queryByOrderSn(orderSn);
+    }
+
+    @Override
+    public Map<String, String> resumePcOrder(OrderAddBo bo) {
+        if(bo.getOrderSn()==null){
+            throw new CustomException("订单数据错误");
+        }
+        Order order = this.getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderSn, bo.getOrderSn()));
+        String body = "";
+        if(order!=null&&order.getOrderStatus()==0){
+            Map<String,Object> map = new HashMap<>();
+            map.put("order_sn",bo.getOrderSn());
+            List<OrderGoods> goodsList = iOrderGoodsService.listByMap(map);
+            for (OrderGoods g : goodsList) {
+                Goods goods = iGoodsService.getOne(new LambdaQueryWrapper<Goods>().eq(Goods::getGoodsId,g.getGoodsId()));
+                if(goods.getGoodsStatus()!=1){
+                    throw new CustomException("商品尚未上架");
+                }
+                body = "中正祥粤云-"+goods.getGoodsName();
+                break;
+            }
+        }else{
+            throw new CustomException("无法继续支付");
+        }
+        UserVo userVo = iUserService.queryById(bo.getUserId());
+        //生成支付单号
+        String pay_no = DateUtils.getPayOrderSn();
+        OrderPayAddBo payAddBo = new OrderPayAddBo();
+        payAddBo.setPaySn(pay_no);
+        payAddBo.setOrderSn(bo.getOrderSn());
+        payAddBo.setStatus(0);
+        payAddBo.setPayPrice(order.getPayPrice());
+        iOrderPayService.insertByAddBo(payAddBo);
+
+        Map<String, String> payResult =  iWxPayService.paymentPc(pay_no,userVo.getOpenId(),body,order.getPayPrice());
+        payResult.put("orderSn",bo.getOrderSn());
+        return payResult;
+    }
+
     //判断视频商品是否购买过
     public Long getHaveBuyGoods(Long goodsId,Long userId){
         OrderGoodsQueryBo orderGoodsQueryBo = new OrderGoodsQueryBo();

+ 53 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/vo/OrderPayVo.java

@@ -0,0 +1,53 @@
+package com.zhongzheng.modules.order.vo;
+
+import com.zhongzheng.common.annotation.Excel;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+
+
+/**
+ * 订单支付单号视图对象 mall_package
+ *
+ * @author hjl
+ * @date 2022-04-18
+ */
+@Data
+@ApiModel("订单支付单号视图对象")
+public class OrderPayVo {
+	private static final long serialVersionUID = 1L;
+
+	/** $pkColumn.columnComment */
+	@ApiModelProperty("$pkColumn.columnComment")
+	private Long id;
+
+	/** 订单编号 */
+	@Excel(name = "订单编号")
+	@ApiModelProperty("订单编号")
+	private String orderSn;
+	/** 支付单号 */
+	@Excel(name = "支付单号")
+	@ApiModelProperty("支付单号")
+	private String paySn;
+	/** 0未支付 1已支付 */
+	@Excel(name = "0未支付 1已支付")
+	@ApiModelProperty("0未支付 1已支付")
+	private Integer status;
+	/** 支付方式 1微信  */
+	@Excel(name = "支付方式 1微信 ")
+	@ApiModelProperty("支付方式 1微信 ")
+	private Integer payFrom;
+	/** 支付价格(成交价) */
+	@Excel(name = "支付价格(成交价)")
+	@ApiModelProperty("支付价格(成交价)")
+	private BigDecimal payPrice;
+	/** 微信流水号 */
+	@Excel(name = "微信流水号")
+	@ApiModelProperty("微信流水号")
+	private String transid;
+}

+ 32 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserAppUpdatePwdBo.java

@@ -0,0 +1,32 @@
+package com.zhongzheng.modules.user.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+
+/**
+ * 客户端用户编辑对象 user
+ *
+ * @author ruoyi
+ * @date 2021-06-08
+ */
+@Data
+@ApiModel("客户端修改密码")
+public class UserAppUpdatePwdBo {
+
+    @ApiModelProperty("新密码")
+    @NotNull(message = "新密码")
+    private String newPwd;
+
+    @ApiModelProperty("旧密码")
+    @NotNull(message = "旧密码")
+    private String oldPwd;
+
+    @ApiModelProperty("用户ID")
+    private Long userId;
+
+
+}

+ 4 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/mapper/UserStudyRecordPhotoMapper.java

@@ -2,6 +2,9 @@ package com.zhongzheng.modules.user.mapper;
 
 import com.zhongzheng.modules.user.domain.UserStudyRecordPhoto;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * 学习拍摄照片Mapper接口
@@ -10,5 +13,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  * @date 2021-12-16
  */
 public interface UserStudyRecordPhotoMapper extends BaseMapper<UserStudyRecordPhoto> {
-
+    List<String> selectGradePhoto(@Param("userId") Long userId,@Param("gradeId") Long gradeId);
 }

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

@@ -105,4 +105,6 @@ public interface IUserService extends IService<User> {
 
 	Map<String, Object> importUser(List<UserImportAddBo> list, String importNo);
 
+	Boolean updatePwd(UserAppUpdatePwdBo bo);
+
 }

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

@@ -6,6 +6,7 @@ import com.zhongzheng.modules.user.bo.UserStudyRecordPhotoQueryBo;
 import com.zhongzheng.modules.user.bo.UserStudyRecordPhotoAddBo;
 import com.zhongzheng.modules.user.bo.UserStudyRecordPhotoEditBo;
 import com.baomidou.mybatisplus.extension.service.IService;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.Collection;
 import java.util.List;
@@ -51,4 +52,6 @@ public interface IUserStudyRecordPhotoService extends IService<UserStudyRecordPh
 	 * @return
 	 */
 	Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+	List<String> selectGradePhoto(Long userId,Long gradeId);
 }

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

@@ -125,4 +125,9 @@ public class UserStudyRecordPhotoServiceImpl extends ServiceImpl<UserStudyRecord
         }
         return this.removeByIds(ids);
     }
+
+    @Override
+    public List<String> selectGradePhoto(Long userId, Long gradeId) {
+        return this.baseMapper.selectGradePhoto(userId,gradeId);
+    }
 }

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/wx/service/IWxPayService.java

@@ -29,6 +29,8 @@ public interface IWxPayService {
 	 */
 	Map<String, String> payment(String out_trade_no,String openid,String body,BigDecimal price);
 
+	Map<String, String> paymentPc(String out_trade_no,String openid,String body,BigDecimal price);
+
 	Map<String, String> paymentGzh(String out_trade_no, String openid, String body, BigDecimal price, String url);
 
 	String paymentCallBack(String notifyData);

+ 154 - 95
zhongzheng-system/src/main/java/com/zhongzheng/modules/wx/service/impl/WxPayServiceImpl.java

@@ -14,6 +14,10 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.github.pagehelper.Page;
+import com.google.zxing.BarcodeFormat;
+import com.google.zxing.client.j2se.MatrixToImageWriter;
+import com.google.zxing.common.BitMatrix;
+import com.google.zxing.qrcode.QRCodeWriter;
 import com.zhongzheng.common.config.WxSmallConfig;
 import com.zhongzheng.common.core.redis.RedisCache;
 import com.zhongzheng.common.exception.CustomException;
@@ -42,7 +46,9 @@ import com.zhongzheng.modules.grade.service.IStudyCountLogService;
 import com.zhongzheng.modules.order.bo.OrderGoodsQueryBo;
 import com.zhongzheng.modules.order.domain.Order;
 import com.zhongzheng.modules.order.domain.OrderGoods;
+import com.zhongzheng.modules.order.domain.OrderPay;
 import com.zhongzheng.modules.order.service.IOrderGoodsService;
+import com.zhongzheng.modules.order.service.IOrderPayService;
 import com.zhongzheng.modules.order.service.IOrderService;
 import com.zhongzheng.modules.order.vo.OrderGoodsVo;
 import com.zhongzheng.modules.polyv.bo.PolyvVideoAddBo;
@@ -73,6 +79,8 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.math.BigDecimal;
 import java.util.*;
@@ -88,7 +96,7 @@ import static com.squareup.okhttp.internal.Util.md5Hex;
  * @date 2021-06-11
  */
 @Service
-public class WxPayServiceImpl  implements IWxPayService {
+public class WxPayServiceImpl implements IWxPayService {
 
     @Value("${wx.small.appid}")
     private String appid;
@@ -123,7 +131,7 @@ public class WxPayServiceImpl  implements IWxPayService {
     private WXPayConstants.SignType signType;
 
 
- //   private String notifyUrl = "http://42.192.164.187:19005/wx/pay/callback";
+    //   private String notifyUrl = "http://42.192.164.187:19005/wx/pay/callback";
 
     private WXPayRequest wxPayRequest;
 
@@ -156,7 +164,8 @@ public class WxPayServiceImpl  implements IWxPayService {
     @Autowired
     private IClassGradeUserService iClassGradeUserService;
 
-
+    @Autowired
+    private IOrderPayService iOrderPayService;
 
 
     private String gzh_tokenUrl = "https://api.weixin.qq.com/cgi-bin/token";
@@ -164,8 +173,8 @@ public class WxPayServiceImpl  implements IWxPayService {
     private String gzh_tokenParam = "grant_type=client_credential&appid=%s&secret=%s";
 
     @Override
-    public Map<String, String> payment(String out_trade_no,String openid,String body,BigDecimal price) {
-        WxSmallConfig config = new WxSmallConfig(appid,mchid,key);
+    public Map<String, String> payment(String out_trade_no, String openid, String body, BigDecimal price) {
+        WxSmallConfig config = new WxSmallConfig(appid, mchid, key);
         BigDecimal unit = new BigDecimal(100);
         price = price.multiply(unit);
         try {
@@ -175,7 +184,7 @@ public class WxPayServiceImpl  implements IWxPayService {
             data.put("out_trade_no", out_trade_no);
             data.put("device_info", "");
             data.put("fee_type", "CNY");
-            data.put("total_fee",price.intValue()+"");
+            data.put("total_fee", price.intValue() + "");
             data.put("openid", openid);
             data.put("spbill_create_ip", IpUtils.getIpAddr(ServletUtils.getRequest()));
             data.put("notify_url", notifyUrl);
@@ -186,12 +195,12 @@ public class WxPayServiceImpl  implements IWxPayService {
             Map<String, String> resp = wxpay.unifiedOrder(data);
             System.out.println(resp);
             Map<String, String> result = new HashMap<>();
-   //         result.put("provider","wxpay");
-            result.put("appId",appid);
-            result.put("timeStamp",String.valueOf(DateUtils.getNowTime()));
-            result.put("nonceStr",resp.get("nonce_str"));
-            result.put("package","prepay_id="+resp.get("prepay_id"));
-            result.put("signType","MD5");
+            //         result.put("provider","wxpay");
+            result.put("appId", appid);
+            result.put("timeStamp", String.valueOf(DateUtils.getNowTime()));
+            result.put("nonceStr", resp.get("nonce_str"));
+            result.put("package", "prepay_id=" + resp.get("prepay_id"));
+            result.put("signType", "MD5");
             System.out.println(result);
             System.out.println(key);
             result.put("sign", WXPayUtil.generateSignature(result, key, WXPayConstants.SignType.MD5));
@@ -203,9 +212,52 @@ public class WxPayServiceImpl  implements IWxPayService {
         return null;
     }
 
+    @Override
+    public Map<String, String> paymentPc(String out_trade_no, String openid, String body, BigDecimal price) {
+        WxSmallConfig config = new WxSmallConfig(appid, mchid, key);
+        BigDecimal unit = new BigDecimal(100);
+        price = price.multiply(unit);
+        try {
+            WXPay wxpay = new WXPay(config);
+            Map<String, String> data = new HashMap<String, String>();
+            data.put("body", body);
+            data.put("out_trade_no", out_trade_no);
+            data.put("device_info", "");
+            data.put("fee_type", "CNY");
+            data.put("total_fee", price.intValue() + "");
+            data.put("openid", openid);
+            data.put("spbill_create_ip", IpUtils.getIpAddr(ServletUtils.getRequest()));
+            data.put("notify_url", notifyUrl);
+            data.put("trade_type", "NATIVE");
+            String TenantId = ServletUtils.getRequest().getHeader("TenantId");
+            data.put("attach", TenantId);
+            Map<String, String> resp = wxpay.unifiedOrder(data);
+            Map<String, String> result = new HashMap<>();
+            String code_url = resp.get("code_url");
+            if (Validator.isEmpty(code_url)) {
+                throw new CustomException("支付错误");
+            }
+            QRCodeWriter qrCodeWriter = new QRCodeWriter();
+            BitMatrix bitMatrix = qrCodeWriter.encode(code_url, BarcodeFormat.QR_CODE, 120, 120);
+            // 写到输出流
+            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+            MatrixToImageWriter.writeToStream(bitMatrix, "jpg", outputStream);
+            //转换为base64
+            Base64.Encoder encoder1 = Base64.getEncoder();
+            String urlBase64 = "data:image/jpeg;base64,"
+                    + encoder1.encodeToString(outputStream.toByteArray());
+            result.put("urlBase64", urlBase64);
+            return result;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        return null;
+    }
+
     @Override
     public Map<String, String> paymentGzh(String out_trade_no, String openid, String body, BigDecimal price, String url) {
-        WxSmallConfig config = new WxSmallConfig(gzhAppid,mchid,key);
+        WxSmallConfig config = new WxSmallConfig(gzhAppid, mchid, key);
         try {
             WXPay wxpay = new WXPay(config);
             BigDecimal unit = new BigDecimal(100);
@@ -215,7 +267,7 @@ public class WxPayServiceImpl  implements IWxPayService {
             data.put("out_trade_no", out_trade_no);
             data.put("device_info", "");
             data.put("fee_type", "CNY");
-            data.put("total_fee", price.intValue()+"");
+            data.put("total_fee", price.intValue() + "");
             data.put("openid", openid);
             data.put("spbill_create_ip", IpUtils.getIpAddr(ServletUtils.getRequest()));
             data.put("notify_url", notifyUrl);
@@ -225,28 +277,28 @@ public class WxPayServiceImpl  implements IWxPayService {
             Map<String, String> resp = wxpay.unifiedOrder(data);
             Map<String, String> result = new HashMap<>();
             //         result.put("provider","wxpay");
-            result.put("appId",gzhAppid);
-            result.put("timeStamp",String.valueOf(DateUtils.getNowTime()));
-            result.put("nonceStr",resp.get("nonce_str"));
-            result.put("package","prepay_id="+resp.get("prepay_id"));
-            result.put("signType","MD5");
+            result.put("appId", gzhAppid);
+            result.put("timeStamp", String.valueOf(DateUtils.getNowTime()));
+            result.put("nonceStr", resp.get("nonce_str"));
+            result.put("package", "prepay_id=" + resp.get("prepay_id"));
+            result.put("signType", "MD5");
             result.put("paySign", WXPayUtil.generateSignature(result, key, WXPayConstants.SignType.MD5));
-            result.put("configPaySign", wx_config_sign(result,url));
+            result.put("configPaySign", wx_config_sign(result, url));
             return result;
         } catch (Exception e) {
             e.printStackTrace();
-            throw new CustomException("错误"+e.getMessage());
+            throw new CustomException("错误" + e.getMessage());
         }
 
-    //    return null;
+        //    return null;
     }
 
-    public String wx_config_sign(Map<String, String> result,String url) {
+    public String wx_config_sign(Map<String, String> result, String url) {
         String jsapi_ticket = wx_get_jsapi_ticket();
-        if(!Validator.isNotNull(jsapi_ticket)){
-            throw new CustomException("jsapi_ticket错误"+jsapi_ticket);
+        if (!Validator.isNotNull(jsapi_ticket)) {
+            throw new CustomException("jsapi_ticket错误" + jsapi_ticket);
         }
-        String str = "jsapi_ticket="+jsapi_ticket+"&noncestr="+result.get("nonceStr")+"&timestamp="+result.get("timeStamp")+"&url="+url;
+        String str = "jsapi_ticket=" + jsapi_ticket + "&noncestr=" + result.get("nonceStr") + "&timestamp=" + result.get("timeStamp") + "&url=" + url;
         String signature = AES.SHA1(str);
         return signature;
     }
@@ -254,7 +306,7 @@ public class WxPayServiceImpl  implements IWxPayService {
     @Override
     public String paymentCallBack(String notifyData) {
         String xmlBack = "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[报文为空]]></return_msg></xml> ";
-        WxSmallConfig config = new WxSmallConfig(appid,mchid,key);
+        WxSmallConfig config = new WxSmallConfig(appid, mchid, key);
         try {
             WXPay wxpay = new WXPay(config);
 
@@ -262,18 +314,26 @@ public class WxPayServiceImpl  implements IWxPayService {
 
             if (wxpay.isPayResultNotifySignatureValid(notifyMap)) {
                 String result_code = notifyMap.get("result_code");
-                if("SUCCESS".equals(result_code)){
+                if ("SUCCESS".equals(result_code)) {
                     String out_trade_no = notifyMap.get("out_trade_no");
                     String transaction_id = notifyMap.get("transaction_id");
                     String TenantId = notifyMap.get("attach");
-                    ServletUtils.getRequestAttributes().getResponse().setHeader("TenantId",TenantId);
-                    if(dealOrder(out_trade_no,transaction_id)){
-                        xmlBack = "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
-                        return xmlBack;
+                    ServletUtils.getRequestAttributes().getResponse().setHeader("TenantId", TenantId);
+
+                    OrderPay orderPay = iOrderPayService.getOne(new LambdaQueryWrapper<OrderPay>().eq(OrderPay::getPaySn, out_trade_no));
+                    if(Validator.isNotEmpty(orderPay)){
+                        String orderSn = orderPay.getOrderSn();
+                        orderPay.setTransid(transaction_id);
+                        orderPay.setStatus(1);
+                        orderPay.setUpdateTime(DateUtils.getNowTime());
+                        iOrderPayService.updateById(orderPay);
+                        if (dealOrder(orderSn, transaction_id)) {
+                            xmlBack = "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
+                            return xmlBack;
+                        }
                     }
                 }
-            }
-            else {
+            } else {
                 // 签名错误,如果数据里没有sign字段,也认为是签名错误
             }
         } catch (Exception e) {
@@ -286,59 +346,58 @@ public class WxPayServiceImpl  implements IWxPayService {
     public String wx_get_jsapi_ticket() {
         String key = "gzh_ticket";
         String ticket = redisCache.getCacheObject(key);
-        if(!Validator.isNotNull(ticket)){
+        if (!Validator.isNotNull(ticket)) {
             String access_token = wx_get_token();
             String param = String.format("access_token=%s&type=jsapi", access_token);
-            String resultString  = HttpUtils.sendGet("https://api.weixin.qq.com/cgi-bin/ticket/getticket",param);
+            String resultString = HttpUtils.sendGet("https://api.weixin.qq.com/cgi-bin/ticket/getticket", param);
             JSONObject jsonObject = (JSONObject) JSONObject.parse(resultString);
             ticket = String.valueOf(jsonObject.get("ticket"));
-            if(ticket!=null){
-                redisCache.setCacheObject(key, ticket, 2*50, TimeUnit.MINUTES);//2个小时
+            if (ticket != null) {
+                redisCache.setCacheObject(key, ticket, 2 * 50, TimeUnit.MINUTES);//2个小时
             }
         }
         return ticket;
     }
 
     //获取微信公众号access_token
-    public String wx_get_token()
-    {
+    public String wx_get_token() {
         String key = "gzh_access_token";
         String access_token = redisCache.getCacheObject(key);
-        if(!Validator.isNotNull(access_token)){
+        if (!Validator.isNotNull(access_token)) {
             String param = String.format(gzh_tokenParam, gzhAppid, gzh_appsrcret);
-            String resultString  = HttpUtils.sendGet(gzh_tokenUrl,param);
+            String resultString = HttpUtils.sendGet(gzh_tokenUrl, param);
             //解析json
             JSONObject jsonObject = (JSONObject) JSONObject.parse(resultString);
             access_token = String.valueOf(jsonObject.get("access_token"));  //这里应该把access_token缓存起来,至于要怎么缓存就看各位了,有效期是7200s
-            if(access_token!=null){
-                redisCache.setCacheObject(key, access_token, 2*50, TimeUnit.MINUTES);//2个小时
+            if (access_token != null) {
+                redisCache.setCacheObject(key, access_token, 2 * 50, TimeUnit.MINUTES);//2个小时
             }
         }
-        if(!Validator.isNotNull(access_token)){
-            throw new CustomException("access_token错误"+access_token);
+        if (!Validator.isNotNull(access_token)) {
+            throw new CustomException("access_token错误" + access_token);
         }
         return access_token;
     }
 
     @Transactional(rollbackFor = Exception.class)
-    public boolean dealOrder(String out_trade_no,String transaction_id){
+    public boolean dealOrder(String out_trade_no, String transaction_id) {
         String key = out_trade_no;
         String ticket = redisCache.getCacheObject(key);
-        if(Validator.isNotEmpty(ticket)){
+        if (Validator.isNotEmpty(ticket)) {
             return false;
         }
-        redisCache.setCacheObject(key, "dealing", 1, TimeUnit.MINUTES);//1分钟
+        redisCache.setCacheObject(key, "dealing", 30, TimeUnit.SECONDS);//30秒
         Order order = iOrderService.getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderSn, out_trade_no));
-        if(order!=null&&order.getOrderStatus()==0){
+        if (order != null && order.getOrderStatus() == 0) {
             order.setOrderStatus(Order.ORDER_STATUS_PAY);
             order.setPayStatus(Order.PAY_FULL);
             order.setPayTime(DateUtils.getNowTime());
             order.setTransid(transaction_id);
             order.setOrderGeneral(out_trade_no);
             order.setStatus(1);
-            if(iOrderService.updateById(order)){
-                Map<String,Object> map = new HashMap<>();
-                map.put("order_sn",out_trade_no);
+            if (iOrderService.updateById(order)) {
+                Map<String, Object> map = new HashMap<>();
+                map.put("order_sn", out_trade_no);
                 List<OrderGoods> goodsList = iOrderGoodsService.listByMap(map);
                 for (OrderGoods g : goodsList) {
                     g.setPayStatus(OrderGoods.PAY_FULL);
@@ -347,8 +406,9 @@ public class WxPayServiceImpl  implements IWxPayService {
                     g = setServiceTime(g);
                     iOrderGoodsService.updateById(g);
                     //给用户增加商品考试次数前培次数
-                    updateUserExamGoods(g,order);
-                    joinLockGrade(order.getOrderSn(),g.getGoodsId(),g.getOrderGoodsId());
+                    updateUserExamGoods(g, order);
+                    joinLockGrade(order.getOrderSn(), g.getGoodsId(), g.getOrderGoodsId());
+
 
                 }
             }
@@ -359,32 +419,30 @@ public class WxPayServiceImpl  implements IWxPayService {
 
     //设置服务期
     @Override
-    public OrderGoods setServiceTime(OrderGoods g){
+    public OrderGoods setServiceTime(OrderGoods g) {
         GoodsVo goodsVo = iGoodsService.queryById(g.getGoodsId());
         //视频商品题库商品设置服务有效期
-        if (goodsVo.getGoodsType().equals(1L)||goodsVo.getGoodsType().equals(2L)){
-            if(Validator.isNotEmpty(goodsVo.getServiceTimeType())){
-                if(Validator.isNotEmpty(goodsVo.getServiceTimeNum())){
-                    if(goodsVo.getServiceTimeType()==1){ //年
+        if (goodsVo.getGoodsType().equals(1) || goodsVo.getGoodsType().equals(2)) {
+            if (Validator.isNotEmpty(goodsVo.getServiceTimeType())) {
+                if (Validator.isNotEmpty(goodsVo.getServiceTimeNum())) {
+                    if (goodsVo.getServiceTimeType() == 1) { //年
                         Calendar cal = new GregorianCalendar();
-                        cal.add(Calendar.YEAR,goodsVo.getServiceTimeNum().intValue());
+                        cal.add(Calendar.YEAR, goodsVo.getServiceTimeNum().intValue());
                         g.setServiceStartTime(DateUtils.getNowTime());
-                        g.setServiceEndTime(cal.getTimeInMillis()/1000);
-                    }
-                    else if(goodsVo.getServiceTimeType()==2){ //月
+                        g.setServiceEndTime(cal.getTimeInMillis() / 1000);
+                    } else if (goodsVo.getServiceTimeType() == 2) { //月
                         Calendar cal = new GregorianCalendar();
-                        cal.add(Calendar.MONTH,goodsVo.getServiceTimeNum().intValue());
+                        cal.add(Calendar.MONTH, goodsVo.getServiceTimeNum().intValue());
                         g.setServiceStartTime(DateUtils.getNowTime());
-                        g.setServiceEndTime(cal.getTimeInMillis()/1000);
-                    }
-                    else if(goodsVo.getServiceTimeType()==3){ //天
+                        g.setServiceEndTime(cal.getTimeInMillis() / 1000);
+                    } else if (goodsVo.getServiceTimeType() == 3) { //天
                         Calendar cal = new GregorianCalendar();
-                        cal.add(Calendar.DATE,goodsVo.getServiceTimeNum().intValue());
+                        cal.add(Calendar.DATE, goodsVo.getServiceTimeNum().intValue());
                         g.setServiceStartTime(DateUtils.getNowTime());
-                        g.setServiceEndTime(cal.getTimeInMillis()/1000);
+                        g.setServiceEndTime(cal.getTimeInMillis() / 1000);
                     }
                 }
-                if(goodsVo.getServiceTimeType()==4){ //区间
+                if (goodsVo.getServiceTimeType() == 4) { //区间
                     g.setServiceStartTime(goodsVo.getStudyStartTime());
                     g.setServiceEndTime(goodsVo.getStudyEndTime());
                 }
@@ -394,13 +452,13 @@ public class WxPayServiceImpl  implements IWxPayService {
     }
 
     @Override
-    public void updateUserExamGoods(OrderGoods g,Order order) {
+    public void updateUserExamGoods(OrderGoods g, Order order) {
         GoodsVo goodsVo = iGoodsService.queryById(g.getGoodsId());
         //添加商品考试次数和补考次数
-        if (goodsVo.getGoodsType().equals(1L)){
-            if (userExamGoodsService.queryExamGoods(goodsVo.getGoodsId(),order.getUserId()) < 1){
+        if (goodsVo.getGoodsType().equals(1)) {
+            if (userExamGoodsService.queryExamGoods(goodsVo.getGoodsId(), order.getUserId()) < 1) {
                 ExamNumber examNumber = userExamGoodsService.queryExam(goodsVo.getGoodsId());
-                if (examNumber != null) {
+                if ( Validator.isNotEmpty(examNumber)) {
                     UserExamGoods add = new UserExamGoods();
                     add.setGoodsId(g.getGoodsId());
                     add.setUserId(order.getUserId());
@@ -417,7 +475,7 @@ public class WxPayServiceImpl  implements IWxPayService {
                     userExamGoodsSupplementAddBo.setDoNumber(examNumber.getDoNumber());
                     userExamGoodsSupplementAddBo.setStatus(3);
                     userExamGoodsSupplementService.insertByAddBo(userExamGoodsSupplementAddBo);
-                }else{
+                } else {
                     //默认生成一条,避免商品以后才配置考试次数
                     UserExamGoods add = new UserExamGoods();
                     add.setGoodsId(g.getGoodsId());
@@ -432,12 +490,12 @@ public class WxPayServiceImpl  implements IWxPayService {
             }
         }
         //增加前培次数
-        if (goodsVo.getGoodsType().equals(4L)){
+        if (goodsVo.getGoodsType().equals(4)) {
             UserExamGoodsQueryBo userExamGoodsQueryBo = new UserExamGoodsQueryBo();
             userExamGoodsQueryBo.setUserId(order.getUserId());
             userExamGoodsQueryBo.setGoodsId(goodsVo.getMakeGoodsId());
             List<UserExamGoodsVo> userExamGoodsVos = userExamGoodsService.queryList(userExamGoodsQueryBo);
-            if (!CollectionUtils.isEmpty(userExamGoodsVos)){
+            if (!CollectionUtils.isEmpty(userExamGoodsVos)) {
                 UserExamGoodsVo userExamGoodsVo = userExamGoodsVos.get(0);
                 UserExamGoodsSupplementAddBo userExamGoodsSupplementAddBo = new UserExamGoodsSupplementAddBo();
                 userExamGoodsSupplementAddBo.setGoodsId(goodsVo.getGoodsId());
@@ -447,17 +505,17 @@ public class WxPayServiceImpl  implements IWxPayService {
                 userExamGoodsSupplementService.insertByAddBo(userExamGoodsSupplementAddBo);
                 UserExamGoods userExamGoods = new UserExamGoods();
                 userExamGoods.setUserExamGoodsId(userExamGoodsVo.getUserExamGoodsId());
-                userExamGoods.setDoNumber(userExamGoodsVo.getDoNumber()+goodsVo.getStudyCount());
+                userExamGoods.setDoNumber(userExamGoodsVo.getDoNumber() + goodsVo.getStudyCount());
                 userExamGoodsService.updateById(userExamGoods);
             }
         }
         //增加考试次数
-        if (goodsVo.getGoodsType().equals(3L)){
+        if (goodsVo.getGoodsType().equals(3)) {
             UserExamGoodsQueryBo userExamGoodsQueryBo = new UserExamGoodsQueryBo();
             userExamGoodsQueryBo.setUserId(order.getUserId());
             userExamGoodsQueryBo.setGoodsId(goodsVo.getMakeGoodsId());
             List<UserExamGoodsVo> userExamGoodsVos = userExamGoodsService.queryList(userExamGoodsQueryBo);
-            if (!CollectionUtils.isEmpty(userExamGoodsVos)){
+            if (!CollectionUtils.isEmpty(userExamGoodsVos)) {
                 UserExamGoodsVo userExamGoodsVo = userExamGoodsVos.get(0);
                 UserExamGoodsSupplementAddBo userExamGoodsSupplementAddBo = new UserExamGoodsSupplementAddBo();
                 userExamGoodsSupplementAddBo.setGoodsId(goodsVo.getGoodsId());
@@ -467,7 +525,7 @@ public class WxPayServiceImpl  implements IWxPayService {
                 userExamGoodsSupplementService.insertByAddBo(userExamGoodsSupplementAddBo);
                 UserExamGoods userExamGoods = new UserExamGoods();
                 userExamGoods.setUserExamGoodsId(userExamGoodsVo.getUserExamGoodsId());
-                userExamGoods.setExamNumber(userExamGoodsVo.getExamNumber()+goodsVo.getStudyCount());
+                userExamGoods.setExamNumber(userExamGoodsVo.getExamNumber() + goodsVo.getStudyCount());
                 userExamGoodsService.updateById(userExamGoods);
             }
         }
@@ -475,18 +533,19 @@ public class WxPayServiceImpl  implements IWxPayService {
 
     //加入锁定班级
     @Override
-    public boolean joinLockGrade(String orderSn,Long goodsId,Long orderGoodsId){
+    public boolean joinLockGrade(String orderSn, Long goodsId, Long orderGoodsId) {
         GoodsVo goodsVo = iGoodsService.queryById(goodsId);
-        if (goodsVo.getGoodsType().equals(1L)){
+        if (goodsVo.getGoodsType().equals(1)) {
             LambdaQueryWrapper<ClassGradeUserTemp> lqwLock = new LambdaQueryWrapper<>();
-            lqwLock.eq(ClassGradeUserTemp::getOrderSn,orderSn);
-            lqwLock.eq(ClassGradeUserTemp::getGoodsId,goodsId);
+            lqwLock.eq(ClassGradeUserTemp::getOrderSn, orderSn);
+            lqwLock.eq(ClassGradeUserTemp::getGoodsId, goodsId);
+            lqwLock.eq(ClassGradeUserTemp::getStatus, ClassGradeUserTemp.STATUS_LOCK);
             ClassGradeUserTemp classGradeUserTemp = iClassGradeUserTempService.getOne(lqwLock);
-            if(classGradeUserTemp!=null&&classGradeUserTemp.getStatus()==ClassGradeUserTemp.STATUS_LOCK){
+            if (classGradeUserTemp != null) {
                 classGradeUserTemp.setStatus(ClassGradeUserTemp.STATUS_USE); //
                 classGradeUserTemp.setUpdateTime(DateUtils.getNowTime());
                 iClassGradeUserTempService.updateById(classGradeUserTemp);//关闭锁定状态
-                iOrderService.joinGrade(orderGoodsId,classGradeUserTemp.getGradeId(),classGradeUserTemp.getUserId());
+                iOrderService.joinGrade(orderGoodsId, classGradeUserTemp.getGradeId(), classGradeUserTemp.getUserId());
             }
             //记录消耗一次学习机会
             StudyCountLog studyCountLog = new StudyCountLog();
@@ -509,8 +568,8 @@ public class WxPayServiceImpl  implements IWxPayService {
     }
 
     @Override
-    public Map<String, String> refund(String out_refund_no,String transaction_id, BigDecimal refund_fee, BigDecimal total_fee) {
-        WxSmallConfig config = new WxSmallConfig(appid,mchid,key);
+    public Map<String, String> refund(String out_refund_no, String transaction_id, BigDecimal refund_fee, BigDecimal total_fee) {
+        WxSmallConfig config = new WxSmallConfig(appid, mchid, key);
         BigDecimal unit = new BigDecimal(100);
         refund_fee = refund_fee.multiply(unit);
         total_fee = total_fee.multiply(unit);
@@ -521,12 +580,12 @@ public class WxPayServiceImpl  implements IWxPayService {
             data.put("transaction_id", transaction_id);
             data.put("device_info", "");
             data.put("fee_type", "CNY");
-            data.put("refund_fee", refund_fee.intValue()+"");
-            data.put("total_fee", total_fee.intValue()+"");
+            data.put("refund_fee", refund_fee.intValue() + "");
+            data.put("total_fee", total_fee.intValue() + "");
             Map<String, String> result = new HashMap<>();
-            result.put("appId",appid);
-            result.put("nonceStr",WXPayUtil.generateNonceStr());
-            result.put("signType","MD5");
+            result.put("appId", appid);
+            result.put("nonceStr", WXPayUtil.generateNonceStr());
+            result.put("signType", "MD5");
             result.put("sign", WXPayUtil.generateSignature(result, key, WXPayConstants.SignType.MD5));
             Map rMap = wxpay.refund(data);
             System.out.println(rMap);

+ 5 - 1
zhongzheng-system/src/main/resources/mapper/modules/activity/ActivityRecommendMapper.xml

@@ -40,6 +40,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="standPrice" column="stand_price"/>
         <result property="code" column="code"/>
         <result property="sort" column="sort"/>
+        <result property="year" column="year"/>
+        <result property="coverUrl" column="cover_url"/>
     </resultMap>
 
     <select id="findGoodsList" resultMap="GoodsListResult">
@@ -48,7 +50,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             g.goods_name,
             g.stand_price,
             rg.sort,
-            g.code
+            g.code,
+            g.year,
+            g.cover_url
         FROM
             activity_recommend_goods rg
                 LEFT JOIN goods g ON rg.goods_id = g.goods_id

+ 1 - 0
zhongzheng-system/src/main/resources/mapper/modules/grade/ClassGradeUserMapper.xml

@@ -29,6 +29,7 @@
         <result property="officialStatusNum" column="official_status_num"/>
         <result property="periodStatusNum" column="period_status_num"/>
         <result property="periodIngTime" column="period_ing_time"/>
+        <result property="auditUserName" column="audit_user_name"/>
     </resultMap>
 
     <resultMap type="com.zhongzheng.modules.grade.vo.ClassGradeUserVo" id="ClassGradeUserVoResult">

+ 3 - 0
zhongzheng-system/src/main/resources/mapper/modules/order/OrderMapper.xml

@@ -228,4 +228,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         ORDER BY o.order_id DESC
     </select>
 
+    <select id="queryByOrderSn" parameterType="String" resultType="Integer">
+        SELECT order_status from `order` where order_sn = #{orderSn}
+    </select>
 </mapper>

+ 20 - 0
zhongzheng-system/src/main/resources/mapper/modules/order/OrderPayMapper.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zhongzheng.modules.order.mapper.OrderPayMapper">
+
+    <resultMap type="com.zhongzheng.modules.order.domain.OrderPay" id="OrderPayResult">
+        <result property="id" column="id"/>
+        <result property="orderSn" column="order_sn"/>
+        <result property="paySn" column="pay_sn"/>
+        <result property="createTime" column="create_time"/>
+        <result property="updateTime" column="update_time"/>
+        <result property="status" column="status"/>
+        <result property="payFrom" column="pay_from"/>
+        <result property="payPrice" column="pay_price"/>
+        <result property="transid" column="transid"/>
+    </resultMap>
+
+
+</mapper>

+ 14 - 1
zhongzheng-system/src/main/resources/mapper/modules/user/UserStudyRecordPhotoMapper.xml

@@ -14,5 +14,18 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="userId" column="user_id"/>
     </resultMap>
 
-
+    <select id="selectGradePhoto" parameterType="map" resultType="string">
+        SELECT
+            rp.photo,
+            ups.id,
+            ups.period_id
+        FROM
+            user_period up
+                LEFT JOIN user_period_status ups ON up.id = ups.period_id
+                LEFT JOIN user_study_record_photo rp ON ups.id = rp.period_id
+        WHERE
+            up.user_id = #{userId}
+          AND up.grade_id = #{gradeId}
+          AND rp.photo IS NOT NULL
+    </select>
 </mapper>

Kaikkia tiedostoja ei voida näyttää, sillä liian monta tiedostoa muuttui tässä diffissä