yangdamao 2 vuotta sitten
vanhempi
commit
ba2801f95a
48 muutettua tiedostoa jossa 1943 lisäystä ja 76 poistoa
  1. 122 0
      zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/settle/TopInstSettleController.java
  2. 6 0
      zhongzheng-admin-saas/src/main/resources/application-dev.yml
  3. 6 0
      zhongzheng-admin-saas/src/main/resources/application-pre.yml
  4. 6 0
      zhongzheng-admin-saas/src/main/resources/application-prod.yml
  5. 11 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/common/CommonController.java
  6. 6 0
      zhongzheng-admin/src/main/resources/application-dev.yml
  7. 7 0
      zhongzheng-admin/src/main/resources/application-pre.yml
  8. 6 0
      zhongzheng-admin/src/main/resources/application-prod.yml
  9. 1 1
      zhongzheng-api/src/main/java/com/zhongzheng/controller/exam/ExamApplyController.java
  10. 7 1
      zhongzheng-api/src/main/resources/application-dev.yml
  11. 6 0
      zhongzheng-api/src/main/resources/application-pre.yml
  12. 6 0
      zhongzheng-api/src/main/resources/application-prod.yml
  13. 47 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/CdExamRoomBo.java
  14. 45 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/CdExamRoomUpdateBo.java
  15. 57 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/CdUserSubscribeBo.java
  16. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamApplySiteAddBo.java
  17. 1 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamApplySubscribeBo.java
  18. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/domain/ExamApply.java
  19. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/mapper/ExamApplyMapper.java
  20. 20 5
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/service/impl/ExamApplyServiceImpl.java
  21. 78 17
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/service/impl/ExamApplySiteServiceImpl.java
  22. 56 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/UserPeriodServiceImpl.java
  23. 45 26
      zhongzheng-system/src/main/java/com/zhongzheng/modules/schedule/service/impl/ScheduleServiceImpl.java
  24. 3 2
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/goods/service/impl/TopOldOrderServiceImpl.java
  25. 58 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/settle/bo/NumSettleBo.java
  26. 34 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/settle/bo/NumSettleOrderBo.java
  27. 41 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/settle/bo/SettleMoneyBo.java
  28. 34 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/settle/bo/SettleOrderImportBo.java
  29. 30 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/settle/bo/SettleOrderImportParamBo.java
  30. 29 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/settle/bo/SettleOrderInfoBo.java
  31. 52 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/settle/bo/SettleQueryBo.java
  32. 64 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/settle/bo/TimeSettleBo.java
  33. 69 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/settle/domian/TopInstSettle.java
  34. 48 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/settle/domian/TopInstSettleRelaiton.java
  35. 21 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/settle/mapper/TopInstSettleMapper.java
  36. 8 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/settle/mapper/TopInstSettleRelationMapper.java
  37. 8 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/settle/service/ITopInstSettleRelationService.java
  38. 26 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/settle/service/ITopInstSettleService.java
  39. 17 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/settle/service/impl/ITopInstSettleRelationServiceImpl.java
  40. 478 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/settle/service/impl/ITopInstSettleServiceImpl.java
  41. 47 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/settle/vo/SettleOrderImportVo.java
  42. 63 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/settle/vo/SettleVo.java
  43. 41 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/settle/vo/TopOrderInfoVo.java
  44. 37 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/settle/vo/TopOrderStudyInfoVo.java
  45. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserSubscribeService.java
  46. 126 23
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserSubscribeServiceImpl.java
  47. 14 0
      zhongzheng-system/src/main/resources/mapper/modules/exam/ExamApplyMapper.xml
  48. 48 0
      zhongzheng-system/src/main/resources/mapper/modules/settle/ExamActivityMapper.xml

+ 122 - 0
zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/settle/TopInstSettleController.java

@@ -0,0 +1,122 @@
+package com.zhongzheng.controller.settle;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.zhongzheng.common.core.controller.BaseController;
+import com.zhongzheng.common.core.domain.AjaxResult;
+import com.zhongzheng.common.core.domain.model.TopLoginUser;
+import com.zhongzheng.common.core.page.TableDataInfo;
+import com.zhongzheng.common.exception.CustomException;
+import com.zhongzheng.common.utils.ServletUtils;
+import com.zhongzheng.common.utils.poi.ExcelUtil;
+import com.zhongzheng.framework.web.service.TopTokenService;
+import com.zhongzheng.modules.top.goods.vo.TopOldOrderVo;
+import com.zhongzheng.modules.top.settle.bo.*;
+import com.zhongzheng.modules.top.settle.service.ITopInstSettleService;
+import com.zhongzheng.modules.top.settle.vo.SettleOrderImportVo;
+import com.zhongzheng.modules.top.settle.vo.SettleVo;
+import com.zhongzheng.modules.top.settle.vo.TopOrderInfoVo;
+import com.zhongzheng.modules.user.bo.UserImportAddBo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.math.BigDecimal;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * @author yangdamao
+ * @date 2023年07月24日 11:19
+ */
+@Api(value = "供应商结算", tags = {"供应商结算管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/settle")
+public class TopInstSettleController extends BaseController {
+
+    private final ITopInstSettleService ITopInstSettleService;
+    private final TopTokenService tokenService;
+
+    /**
+     * 获取订单详情信息
+     */
+    @ApiOperation("获取订单详细信息")
+    @GetMapping("/order/info")
+    public AjaxResult<TopOrderInfoVo> getOrderInfo(SettleOrderInfoBo bo) {
+        return AjaxResult.success(ITopInstSettleService.getOrderInfo(bo));
+    }
+
+    /**
+     * 结算金额计算
+     */
+    @ApiOperation("结算金额计算")
+    @GetMapping("/money")
+    public AjaxResult<BigDecimal> getSettleMoney(SettleMoneyBo bo) {
+        return AjaxResult.success(ITopInstSettleService.getSettleMoney(bo));
+    }
+
+    /**
+     * 订单批量导入
+     */
+    @ApiOperation("订单批量导入")
+    @PostMapping("/order/import")
+    public AjaxResult<List<SettleOrderImportVo>> batchOrderImport(MultipartFile file,String param) {
+        if (StringUtils.isBlank(param)){
+            throw new CustomException("参数不能未空");
+        }
+        ExcelUtil<SettleOrderImportBo> util = new ExcelUtil<SettleOrderImportBo>(SettleOrderImportBo.class);
+        List<SettleOrderImportBo> orderImportBo = null;
+        try{
+            orderImportBo = util.importExcel(file.getInputStream());
+        }catch (Exception e){
+            e.printStackTrace();
+            throw new IllegalArgumentException("模板格式不正确,请重新下载模板");
+        }
+        Collections.reverse(orderImportBo);
+        if (orderImportBo.stream().allMatch(item -> ObjectUtils.isNull(item))){
+            throw new IllegalArgumentException("模板格式不正确,请重新下载模板");
+        }
+        SettleOrderImportParamBo paramBo = JSON.parseObject(param, SettleOrderImportParamBo.class);
+        return AjaxResult.success(ITopInstSettleService.batchOrderImport(orderImportBo,paramBo));
+    }
+
+    /**
+     * 按数量保存结算订单
+     */
+    @ApiOperation("按数量保存结算订单")
+    @PostMapping("/num/save")
+    public AjaxResult<Void> numSettleOrderSave(@RequestBody NumSettleBo bo) {
+        TopLoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setLoginId(loginUser.getUser().getUserId());
+        bo.setLoginName(loginUser.getUser().getUserName());
+        return toAjax(ITopInstSettleService.numSettleOrderSave(bo) ? 1 : 0);
+    }
+
+    /**
+     * 按时间保存结算订单
+     */
+    @ApiOperation("按时间保存结算订单")
+    @PostMapping("/time/save")
+    public AjaxResult<Void> timeSettleOrderSave(@RequestBody TimeSettleBo bo) {
+        TopLoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setLoginId(loginUser.getUser().getUserId());
+        bo.setLoginName(loginUser.getUser().getUserName());
+        return toAjax(ITopInstSettleService.timeSettleOrderSave(bo) ? 1 : 0);
+    }
+
+    /**
+     * 结算订单列表
+     */
+    @ApiOperation("结算订单列表")
+    @GetMapping("/list")
+    public TableDataInfo<SettleVo> list(SettleQueryBo bo) {
+        startPage();
+        List<SettleVo> list = ITopInstSettleService.getSettleList(bo);
+        return getDataTable(list);
+    }
+}

+ 6 - 0
zhongzheng-admin-saas/src/main/resources/application-dev.yml

@@ -172,3 +172,9 @@ invoice:
     host: http://192.168.1.222:7077/sys/common/openMplatform/log
 
 liveHost: http://192.168.1.222:6009
+
+exam:
+    applySave: http://192.168.1.7:9099/cd/exam/save
+    applyUpdate: http://192.168.1.7:9099/cd/exam/update
+    applyDelete: http://192.168.1.7:9099/cd/exam/delete
+    subscribeSave: http://192.168.1.7:9099/cd/subscribe/save

+ 6 - 0
zhongzheng-admin-saas/src/main/resources/application-pre.yml

@@ -170,3 +170,9 @@ oldSys:
 
 invoice:
     host: http://192.168.1.222:8077/sys/common/openMplatform/log
+
+exam:
+    applySave: http://192.168.1.7:9099/cd/exam/save
+    applyUpdate: http://192.168.1.7:9099/cd/exam/update
+    applyDelete: http://192.168.1.7:9099/cd/exam/delete
+    subscribeSave: http://192.168.1.7:9099/cd/subscribe/save

+ 6 - 0
zhongzheng-admin-saas/src/main/resources/application-prod.yml

@@ -172,3 +172,9 @@ invoice:
     host: https://ptapi.gdzzkj.net/sys/common/openMplatform/log
 
 liveHost: https://sso.xyyxt.net
+
+exam:
+    applySave: http://192.168.1.7:9099/cd/exam/save
+    applyUpdate: http://192.168.1.7:9099/cd/exam/update
+    applyDelete: http://192.168.1.7:9099/cd/exam/delete
+    subscribeSave: http://192.168.1.7:9099/cd/subscribe/save

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

@@ -285,6 +285,17 @@ public class CommonController extends BaseController {
         return AjaxResult.success();
     }
 
+    @ApiOperation("七大员考试预约取消")
+    @PostMapping("common/apply/subscribe/cancel")
+    public AjaxResult examApplySubscribeCancel(@RequestBody ExamApplySubscribeBo bo) {
+        if (!ToolsUtils.checkSignFromOldSys(bo.getStamp().toString(), bo.getSign())) {
+            return AjaxResult.error("签名错误");
+        }
+        ServletUtils.getResponse().setHeader("TenantId",bo.getTenantId().toString());
+        iUserSubscribeService.examApplySubscribeCancel(bo);
+        return AjaxResult.success();
+    }
+
 
     @ApiOperation("学员学时图片修改")
     @PostMapping("common/student/image/update")

+ 6 - 0
zhongzheng-admin/src/main/resources/application-dev.yml

@@ -174,3 +174,9 @@ invoice:
     host: http://192.168.1.222:7077/sys/common/openMplatform/log
 
 liveHost: http://192.168.1.222:6009
+
+exam:
+    applySave: http://192.168.1.7:9099/cd/exam/save
+    applyUpdate: http://192.168.1.7:9099/cd/exam/update
+    applyDelete: http://192.168.1.7:9099/cd/exam/delete
+    subscribeSave: http://192.168.1.7:9099/cd/subscribe/save

+ 7 - 0
zhongzheng-admin/src/main/resources/application-pre.yml

@@ -170,3 +170,10 @@ oldSys:
 
 invoice:
     host: http://192.168.1.222:8077/sys/common/openMplatform/log
+
+exam:
+    applySave: http://192.168.1.7:9099/cd/exam/save
+    applyUpdate: http://192.168.1.7:9099/cd/exam/update
+    applyDelete: http://192.168.1.7:9099/cd/exam/delete
+    subscribeSave: http://192.168.1.7:9099/cd/subscribe/save
+

+ 6 - 0
zhongzheng-admin/src/main/resources/application-prod.yml

@@ -172,3 +172,9 @@ invoice:
     host: https://ptapi.gdzzkj.net/sys/common/openMplatform/log
 
 liveHost: https://sso.xyyxt.net
+
+exam:
+    applySave: http://192.168.1.7:9099/cd/exam/save
+    applyUpdate: http://192.168.1.7:9099/cd/exam/update
+    applyDelete: http://192.168.1.7:9099/cd/exam/delete
+    subscribeSave: http://192.168.1.7:9099/cd/subscribe/save

+ 1 - 1
zhongzheng-api/src/main/java/com/zhongzheng/controller/exam/ExamApplyController.java

@@ -122,7 +122,7 @@ public class ExamApplyController extends BaseController {
      */
     @ApiOperation("新增用户预约考试")
     @Log(title = "用户预约考试", businessType = BusinessType.INSERT)
-    @PostMapping("save")
+    @PostMapping("/save")
     public AjaxResult<Long> saveApply(@RequestBody UserSubscribeAddBo bo) throws ParseException {
         ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
         bo.setUserId(loginUser.getUser().getUserId());

+ 7 - 1
zhongzheng-api/src/main/resources/application-dev.yml

@@ -174,4 +174,10 @@ oldSys:
 invoice:
     host: http://192.168.1.222:7077/sys/common/openMplatform/log
 
-liveHost: http://192.168.1.222:6009
+liveHost: http://192.168.1.222:6009
+
+exam:
+    applySave: http://192.168.1.7:9099/cd/exam/save
+    applyUpdate: http://192.168.1.7:9099/cd/exam/update
+    applyDelete: http://192.168.1.7:9099/cd/exam/delete
+    subscribeSave: http://192.168.1.7:9099/cd/subscribe/save

+ 6 - 0
zhongzheng-api/src/main/resources/application-pre.yml

@@ -170,3 +170,9 @@ oldSys:
 
 invoice:
     host: http://192.168.1.222:8077/sys/common/openMplatform/log
+
+exam:
+    applySave: http://192.168.1.7:9099/cd/exam/save
+    applyUpdate: http://192.168.1.7:9099/cd/exam/update
+    applyDelete: http://192.168.1.7:9099/cd/exam/delete
+    subscribeSave: http://192.168.1.7:9099/cd/subscribe/save

+ 6 - 0
zhongzheng-api/src/main/resources/application-prod.yml

@@ -184,3 +184,9 @@ invoice:
     host: https://ptapi.gdzzkj.net/sys/common/openMplatform/log
 
 liveHost: https://sso.xyyxt.net
+
+exam:
+    applySave: http://192.168.1.7:9099/cd/exam/save
+    applyUpdate: http://192.168.1.7:9099/cd/exam/update
+    applyDelete: http://192.168.1.7:9099/cd/exam/delete
+    subscribeSave: http://192.168.1.7:9099/cd/subscribe/save

+ 47 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/CdExamRoomBo.java

@@ -0,0 +1,47 @@
+package com.zhongzheng.modules.exam.bo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2023年07月11日 16:53
+ */
+@Data
+public class CdExamRoomBo implements Serializable {
+
+    @ApiModelProperty("标识ID")
+    private Long signId;
+
+    @ApiModelProperty("考场类型:1普通场 2专场")
+    private Integer examType;
+
+    @ApiModelProperty("考试日期")
+    private Long examTime;
+
+    @ApiModelProperty("考试开始时间段")
+    private String examStartTime;
+
+    @ApiModelProperty("考试结束时间段")
+    private String examEndTime;
+
+    @ApiModelProperty("考试地点名称")
+    private String examSite;
+
+    @ApiModelProperty("考场人数")
+    private Integer examNum;
+
+    @ApiModelProperty("已约人数")
+    private Integer scheduledNum;
+
+    @ApiModelProperty("数据来源:1新系统 2旧系统 ")
+    private Integer dataFrom;
+
+    @ApiModelProperty("机构ID")
+    private Long tenantId;
+    @ApiModelProperty("类型:1七大员新考")
+    private Integer type;
+
+}

+ 45 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/CdExamRoomUpdateBo.java

@@ -0,0 +1,45 @@
+package com.zhongzheng.modules.exam.bo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2023年07月11日 16:53
+ */
+@Data
+public class CdExamRoomUpdateBo implements Serializable {
+
+    @ApiModelProperty("标识ID")
+    private Long signId;
+
+    @ApiModelProperty("考场类型:1普通场 2专场")
+    private Integer examType;
+
+    @ApiModelProperty("机构ID")
+    private Long tenantId;
+
+    @ApiModelProperty("考试日期")
+    private Long examTime;
+
+    @ApiModelProperty("考试开始时间段")
+    private String examStartTime;
+
+    @ApiModelProperty("考试结束时间段")
+    private String examEndTime;
+
+    @ApiModelProperty("考场人数")
+    private Integer examNum;
+
+    @ApiModelProperty("已约人数")
+    private Integer scheduledNum;
+
+    @ApiModelProperty("数据来源:1新系统 2旧系统 ")
+    private Integer dataFrom;
+
+    @ApiModelProperty("考试地点名称")
+    private String examSite;
+
+}

+ 57 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/CdUserSubscribeBo.java

@@ -0,0 +1,57 @@
+package com.zhongzheng.modules.exam.bo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2023年07月17日 8:59
+ */
+@Data
+public class CdUserSubscribeBo implements Serializable {
+
+    /** 用户ID */
+    @ApiModelProperty("用户ID")
+    private Long userId;
+    /** 用户姓名 */
+    @ApiModelProperty("用户姓名")
+    private String userName;
+    /** 用户身份证 */
+    @ApiModelProperty("用户身份证")
+    private String userCard;
+    /** 用户手机号码 */
+    @ApiModelProperty("用户手机号码")
+    private String userPhone;
+    /** 商品名称 */
+    @ApiModelProperty("商品名称")
+    private String goodsName;
+    /** 业务层次名称 */
+    @ApiModelProperty("业务层次名称")
+    private String businessName;
+    @ApiModelProperty("专业")
+    private String major;
+    /** 考试次数 */
+    @ApiModelProperty("考试次数")
+    private Integer examNum;
+    /** 补考次数 */
+    @ApiModelProperty("补考次数")
+    private Integer replenishExamNum;
+    /** 刷题次数 */
+    @ApiModelProperty("刷题次数")
+    private Integer doQuestionNum;
+    /** 题库商家名称 */
+    @ApiModelProperty("题库商家名称")
+    private String questionMerchant;
+    /** 机构Id */
+    @ApiModelProperty("机构Id")
+    private Long tenantId;
+    @ApiModelProperty("数据来源:1新系统 2旧系统")
+    private Integer dataFrom;
+    @ApiModelProperty("类型:1七大员新考")
+    private Integer type;
+    /** 公司名称 */
+    @ApiModelProperty("公司名称")
+    private String companyName;
+}

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamApplySiteAddBo.java

@@ -21,6 +21,8 @@ public class ExamApplySiteAddBo {
     /** 考试地点 */
     @ApiModelProperty("考试地点")
     private Long siteId;
+    @ApiModelProperty("考试地点")
+    private String siteAddress;
     /** 考试安排ID */
     @ApiModelProperty("考试安排ID")
     private Long applyId;

+ 1 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamApplySubscribeBo.java

@@ -20,7 +20,7 @@ public class ExamApplySubscribeBo implements Serializable {
     private String telphone;
 
     @ApiModelProperty("标识ID")
-    private Integer signId;
+    private Long signId;
 
     @ApiModelProperty("学员类型:1非补考 2补考")
     private Integer studentType;

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/domain/ExamApply.java

@@ -63,4 +63,6 @@ private static final long serialVersionUID=1L;
     private Integer applyNature;
     /** 专场学员资料地址 */
     private String natureUrl;
+
+    private Long tenantId;
 }

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/mapper/ExamApplyMapper.java

@@ -89,4 +89,6 @@ public interface ExamApplyMapper extends BaseMapper<ExamApply> {
     List<ExamApplyUserDetailVo> getExamUserInfo(ExamApplyDetailVo bo);
 
     List<Long> getApplyGoodsId(@Param("applyId") Long applyId,@Param("majorName")  String majorName);
+
+    UserSubscribe getHaveSubscribe(ExamApplyQueryBo queryBo);
 }

+ 20 - 5
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/service/impl/ExamApplyServiceImpl.java

@@ -18,6 +18,7 @@ import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.common.utils.JavaMailUtils;
 import com.zhongzheng.common.utils.ServletUtils;
 import com.zhongzheng.common.utils.file.FileUtils;
+import com.zhongzheng.common.utils.http.HttpUtils;
 import com.zhongzheng.common.utils.poi.EasyPoiUtil;
 import com.zhongzheng.common.utils.poi.ExcelUtil;
 import com.zhongzheng.modules.activity.domain.ActivityRecommend;
@@ -49,6 +50,7 @@ import com.zhongzheng.modules.user.vo.UserStudyRecordExport;
 import org.apache.commons.io.IOUtils;
 import org.apache.http.entity.ContentType;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.mock.web.MockMultipartFile;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -103,6 +105,8 @@ public class ExamApplyServiceImpl extends ServiceImpl<ExamApplyMapper, ExamApply
     private OssService ossService;
     @Autowired
     private ISysConfigService iSysConfigService;
+    @Value("${exam.applyDelete}")
+    private String EXAM_APPLY_DELETE;
 
     @Override
     public ExamApplyVo queryById(Long applyId) {
@@ -271,6 +275,17 @@ public class ExamApplyServiceImpl extends ServiceImpl<ExamApplyMapper, ExamApply
             if (countApplySubscribe(queryBo) > 0) {
                 throw new RuntimeException("该考试计划存在预约数据,无法删除");
             }
+
+            //通知B端
+            //删除考场同步B端
+            CdExamRoomUpdateBo roomBo = new CdExamRoomUpdateBo();
+            roomBo.setSignId(bo.getApplyId());
+            roomBo.setDataFrom(1);
+            roomBo.setTenantId(Long.valueOf(ServletUtils.getRequest().getHeader("TenantId")));
+            String param = JSONObject.toJSONString(roomBo);
+            Map<String, String> headersMap = new HashMap<>();
+            HttpUtils.sendPostJsonHeaderAsync(EXAM_APPLY_DELETE, param, headersMap);
+
         }
         validEntityBeforeSave(update);
         update.setUpdateTime(DateUtils.getNowTime());
@@ -407,13 +422,13 @@ public class ExamApplyServiceImpl extends ServiceImpl<ExamApplyMapper, ExamApply
                 .eq(UserSubscribe::getGoodsId, bo.getGoodsId())
                 .eq(UserSubscribe::getSubscribeStatus, 1)
                 .eq(UserSubscribe::getOrderGoodsId, bo.getOrderGoodsId())
-                .eq(UserSubscribe::getResult, 2)
+                .ne(UserSubscribe::getExamStatus, 1)
                 .orderByDesc(UserSubscribe::getCreateTime)
                 .last("limit 1"));
         if (ObjectUtils.isNotNull(subscribe)) {
             Long examTime = subscribe.getApplySiteExamTime();
             //向后推15个工作日
-            Long applyEndTime = getApplyEndTime(examTime * 1000, 15);
+            Long applyEndTime = getApplyEndTime(examTime, 20);
             if (DateUtils.getNowTime() < applyEndTime){
                 throw new CustomException("成绩审核中,请等待15个工作日后再预约!");
             }
@@ -433,7 +448,7 @@ public class ExamApplyServiceImpl extends ServiceImpl<ExamApplyMapper, ExamApply
 
     private Long getApplyEndTime(Long millisecond, Integer day) {
         for (Integer i = 0; i < day; i++) {
-            Long dayAfter = DateUtils.getDayBefore(millisecond, 1);
+            Long dayAfter = DateUtils.getDayAfter(millisecond, 1);
             Calendar calendar = Calendar.getInstance();
             calendar.setTime(DateUtils.timeToDate(dayAfter));
             int index = calendar.get(Calendar.DAY_OF_WEEK) - 1;
@@ -930,8 +945,8 @@ public class ExamApplyServiceImpl extends ServiceImpl<ExamApplyMapper, ExamApply
                 examUserInfo.forEach(user -> {
                     //身份证隐藏
                     String decrypt = EncryptHandler.decrypt(user.getIdCard());
-                    String content = decrypt.replaceAll("(\\d{4})\\d{10}(\\w{4})", "$1****$2");
-                    user.setIdCard(content);
+//                    String content = decrypt.replaceAll("(\\d{4})\\d{10}(\\w{4})", "$1****$2");
+                    user.setIdCard(decrypt);
                 });
                 item.setUserDetailVos(examUserInfo);
             }

+ 78 - 17
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/service/impl/ExamApplySiteServiceImpl.java

@@ -2,25 +2,31 @@ package com.zhongzheng.modules.exam.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.json.JSONUtil;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.github.pagehelper.Page;
 import com.zhongzheng.common.utils.DateUtils;
+import com.zhongzheng.common.utils.http.HttpUtils;
 import com.zhongzheng.modules.exam.bo.*;
+import com.zhongzheng.modules.exam.domain.ExamApply;
 import com.zhongzheng.modules.exam.domain.ExamApplySite;
 import com.zhongzheng.modules.exam.domain.ExamApplySiteTime;
+import com.zhongzheng.modules.exam.domain.ExamSite;
 import com.zhongzheng.modules.exam.mapper.ExamApplySiteMapper;
+import com.zhongzheng.modules.exam.service.IExamApplyService;
 import com.zhongzheng.modules.exam.service.IExamApplySiteService;
 import com.zhongzheng.modules.exam.service.IExamApplySiteTimeService;
+import com.zhongzheng.modules.exam.service.IExamSiteService;
 import com.zhongzheng.modules.exam.vo.ExamApplySiteVo;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -34,9 +40,15 @@ public class ExamApplySiteServiceImpl extends ServiceImpl<ExamApplySiteMapper, E
 
     @Autowired
     private IExamApplySiteTimeService examApplySiteTimeService;
+    @Autowired
+    private IExamApplyService iExamApplyService;
+    @Autowired
+    private IExamSiteService iExamSiteService;
+    @Value("${exam.applySave}")
+    private String EXAM_APPLY_SAVE;
 
     @Override
-    public ExamApplySiteVo queryById(Long id){
+    public ExamApplySiteVo queryById(Long id) {
         ExamApplySite db = this.baseMapper.selectById(id);
         return BeanUtil.toBean(db, ExamApplySiteVo.class);
     }
@@ -51,19 +63,19 @@ public class ExamApplySiteServiceImpl extends ServiceImpl<ExamApplySiteMapper, E
     }
 
     /**
-    * 实体类转化成视图对象
-    *
-    * @param collection 实体类集合
-    * @return
-    */
+     * 实体类转化成视图对象
+     *
+     * @param collection 实体类集合
+     * @return
+     */
     private List<ExamApplySiteVo> entity2Vo(Collection<ExamApplySite> collection) {
         List<ExamApplySiteVo> voList = collection.stream()
                 .map(any -> BeanUtil.toBean(any, ExamApplySiteVo.class))
                 .collect(Collectors.toList());
         if (collection instanceof Page) {
-            Page<ExamApplySite> page = (Page<ExamApplySite>)collection;
+            Page<ExamApplySite> page = (Page<ExamApplySite>) collection;
             Page<ExamApplySiteVo> pageVo = new Page<>();
-            BeanUtil.copyProperties(page,pageVo);
+            BeanUtil.copyProperties(page, pageVo);
             pageVo.addAll(voList);
             voList = pageVo;
         }
@@ -92,13 +104,13 @@ public class ExamApplySiteServiceImpl extends ServiceImpl<ExamApplySiteMapper, E
      *
      * @param entity 实体类数据
      */
-    private void validEntityBeforeSave(ExamApplySite entity){
+    private void validEntityBeforeSave(ExamApplySite entity) {
         //TODO 做一些数据校验,如唯一约束
     }
 
     @Override
     public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
-        if(isValid){
+        if (isValid) {
             //TODO 做一些业务上的校验,判断是否需要校验
         }
         return this.removeByIds(ids);
@@ -106,12 +118,13 @@ public class ExamApplySiteServiceImpl extends ServiceImpl<ExamApplySiteMapper, E
 
     @Override
     public boolean addSite(List<ExamApplySiteAddBo> bo) {
+        Long applyId = bo.get(0).getApplyId();
         //删除之前的地点
         LambdaQueryWrapper<ExamApplySite> lqw = Wrappers.lambdaQuery();
-        lqw.eq( ExamApplySite::getApplyId,bo.get(0).getApplyId());
-        lqw.eq( ExamApplySite::getStatus,bo.get(0).getStatus());
+        lqw.eq(ExamApplySite::getApplyId, applyId);
+        lqw.eq(ExamApplySite::getStatus, bo.get(0).getStatus());
         this.remove(lqw);
-        examApplySiteTimeService.remove(new LambdaQueryWrapper<ExamApplySiteTime>().eq(ExamApplySiteTime::getApplyId,bo.get(0).getApplyId()));
+        boolean remove = examApplySiteTimeService.remove(new LambdaQueryWrapper<ExamApplySiteTime>().eq(ExamApplySiteTime::getApplyId, bo.get(0).getApplyId()));
         //增加地点
         for (ExamApplySiteAddBo examApplySiteAddBo : bo) {
             ExamApplySite add = BeanUtil.toBean(examApplySiteAddBo, ExamApplySite.class);
@@ -120,7 +133,7 @@ public class ExamApplySiteServiceImpl extends ServiceImpl<ExamApplySiteMapper, E
             add.setUpdateTime(DateUtils.getNowTime());
             this.save(add);
             for (ExamApplySiteTimeAddBo examApplySiteTimeAddBo : examApplySiteAddBo.getExamApplySiteTime()) {
-                if (CollectionUtils.isNotEmpty(examApplySiteTimeAddBo.getExamApplySiteTimeTwo())){
+                if (CollectionUtils.isNotEmpty(examApplySiteTimeAddBo.getExamApplySiteTimeTwo())) {
                     for (ExamApplySiteTimeTwoAddBo examApplySiteTimeTwoAddBo : examApplySiteTimeAddBo.getExamApplySiteTimeTwo()) {
                         ExamApplySiteTime examApplySiteTime = BeanUtil.toBean(examApplySiteTimeAddBo, ExamApplySiteTime.class);
                         examApplySiteTime.setApplySiteId(add.getId());
@@ -133,6 +146,54 @@ public class ExamApplySiteServiceImpl extends ServiceImpl<ExamApplySiteMapper, E
                 }
             }
         }
+
+        List<ExamApplySiteTimeAddBo> examApplySiteTime = bo.get(0).getExamApplySiteTime();
+        ExamSite site = iExamSiteService.getById(bo.get(0).getSiteId());
+        ExamApplySiteTimeAddBo timeAddBo = examApplySiteTime.stream().findFirst().orElse(null);
+        if (ObjectUtils.isNotNull(timeAddBo)) {
+            if (remove) {
+                //修改
+                //修改考场同步B端
+                ExamApply apply = iExamApplyService.getById(applyId);
+                CdExamRoomUpdateBo roomBo = new CdExamRoomUpdateBo();
+                roomBo.setSignId(apply.getApplyId());
+                roomBo.setDataFrom(1);
+                roomBo.setTenantId(apply.getTenantId());
+                roomBo.setExamType(apply.getApplyNature());
+                roomBo.setExamTime(timeAddBo.getExamTime());
+                ExamApplySiteTimeTwoAddBo twoAddBo = timeAddBo.getExamApplySiteTimeTwo().stream().findFirst().orElse(null);
+                roomBo.setExamStartTime(twoAddBo.getStartTime());
+                roomBo.setExamEndTime(twoAddBo.getEndTime());
+                roomBo.setExamSite(site.getSiteAddress());
+                roomBo.setExamNum(twoAddBo.getNum().intValue());
+                roomBo.setScheduledNum(0);
+                String param = JSONObject.toJSONString(roomBo);
+                Map<String, String> headersMap = new HashMap<>();
+                HttpUtils.sendPostJsonHeaderAsync(EXAM_APPLY_SAVE, param, headersMap);
+
+            } else {
+                //新增
+                //考场创建同步B端
+                ExamApply apply = iExamApplyService.getById(applyId);
+                CdExamRoomBo roomBo = new CdExamRoomBo();
+                roomBo.setSignId(apply.getApplyId());
+                roomBo.setDataFrom(1);
+                roomBo.setTenantId(apply.getTenantId());
+                roomBo.setType(1);//七大员预约
+                roomBo.setExamType(apply.getApplyNature());
+                roomBo.setExamTime(timeAddBo.getExamTime());
+                ExamApplySiteTimeTwoAddBo twoAddBo = timeAddBo.getExamApplySiteTimeTwo().stream().findFirst().orElse(null);
+                roomBo.setExamStartTime(twoAddBo.getStartTime());
+                roomBo.setExamEndTime(twoAddBo.getEndTime());
+                roomBo.setExamSite(site.getSiteAddress());
+                roomBo.setExamNum(twoAddBo.getNum().intValue());
+                roomBo.setScheduledNum(0);
+                String param = JSONObject.toJSONString(roomBo);
+                Map<String, String> headersMap = new HashMap<>();
+                HttpUtils.sendPostJsonHeaderAsync(EXAM_APPLY_SAVE, param, headersMap);
+            }
+
+        }
         return true;
     }
 }

+ 56 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/UserPeriodServiceImpl.java

@@ -14,6 +14,7 @@ import com.github.pagehelper.Page;
 import com.zhongzheng.common.core.domain.model.LoginUser;
 import com.zhongzheng.common.core.redis.RedisCache;
 import com.zhongzheng.common.exception.CustomException;
+import com.zhongzheng.common.type.EncryptHandler;
 import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.common.utils.SecurityUtils;
 import com.zhongzheng.common.utils.ServletUtils;
@@ -26,11 +27,15 @@ import com.zhongzheng.modules.course.bo.CourseMenuQueryBo;
 import com.zhongzheng.modules.course.domain.CourseBusiness;
 import com.zhongzheng.modules.course.domain.CourseEducationType;
 import com.zhongzheng.modules.course.domain.CourseProjectType;
+import com.zhongzheng.modules.course.domain.Major;
 import com.zhongzheng.modules.course.service.*;
 import com.zhongzheng.modules.course.vo.CourseChapterSectionVo;
 import com.zhongzheng.modules.course.vo.CourseMenuVo;
 import com.zhongzheng.modules.course.vo.CourseModuleChapterVo;
 import com.zhongzheng.modules.course.vo.CourseVo;
+import com.zhongzheng.modules.exam.bo.CdUserSubscribeBo;
+import com.zhongzheng.modules.exam.domain.ExamApplyGoods;
+import com.zhongzheng.modules.exam.service.IExamApplyGoodsService;
 import com.zhongzheng.modules.goods.bo.GoodsCourseQueryBo;
 import com.zhongzheng.modules.goods.domain.Goods;
 import com.zhongzheng.modules.goods.service.IGoodsCourseService;
@@ -60,7 +65,10 @@ import com.zhongzheng.modules.order.service.IOrderGoodsService;
 import com.zhongzheng.modules.system.domain.SysOldOrg;
 import com.zhongzheng.modules.system.service.ISysOldOrgService;
 import com.zhongzheng.modules.user.bo.UserStudyRecordQueryBo;
+import com.zhongzheng.modules.user.domain.User;
+import com.zhongzheng.modules.user.domain.UserExamGoods;
 import com.zhongzheng.modules.user.domain.UserStudyRecordPhoto;
+import com.zhongzheng.modules.user.service.IUserExamGoodsService;
 import com.zhongzheng.modules.user.service.IUserService;
 import com.zhongzheng.modules.user.service.IUserStudyRecordPhotoService;
 import com.zhongzheng.modules.user.vo.UserVo;
@@ -107,12 +115,18 @@ public class UserPeriodServiceImpl extends ServiceImpl<UserPeriodMapper, UserPer
     @Autowired
     private IClassGradeUserService iClassGradeUserService;
 
+    @Autowired
+    private IUserExamGoodsService iUserExamGoodsService;
+
     @Autowired
     private ICertificateTpService iCertificateTpService;
 
     @Autowired
     private IUserService iUserService;
 
+    @Autowired
+    private IExamApplyGoodsService iExamApplyGoodsService;
+
     @Value("${aliyun.sms.schoolHoursCode}")
     private String schoolHoursCode;
 
@@ -140,6 +154,9 @@ public class UserPeriodServiceImpl extends ServiceImpl<UserPeriodMapper, UserPer
     @Autowired
     private ICourseBusinessService iCourseBusinessService;
 
+    @Autowired
+    private IMajorService iMajorService;
+
     @Value("${aliyun.oss.endpoint}")
     private String ossHost;
 
@@ -176,6 +193,9 @@ public class UserPeriodServiceImpl extends ServiceImpl<UserPeriodMapper, UserPer
     @Value("${oldStudySys.syncPath}")
     private String SYNC_PATH;
 
+    @Value("${exam.subscribeSave}")
+    private String EXAM_SUBSCRIBE_SAVE;
+
     @Override
     public UserPeriodVo queryById(Long id) {
         UserPeriod db = this.baseMapper.selectById(id);
@@ -463,6 +483,42 @@ public class UserPeriodServiceImpl extends ServiceImpl<UserPeriodMapper, UserPer
             sendPeriodSMS(bo);
             sendPeriodSevenSMS(bo);
         }
+        int count = iExamApplyGoodsService.count(new LambdaQueryWrapper<ExamApplyGoods>().eq(ExamApplyGoods::getGoodsId, goods.getGoodsId()));
+        if (count > 0){
+            //商品存在考试计划
+            //学员信息推送B端
+            CdUserSubscribeBo subscribeBo = new CdUserSubscribeBo();
+            User user = iUserService.getById(classGradeUser.getUserId());
+            subscribeBo.setUserId(user.getUserId());
+            subscribeBo.setUserCard(EncryptHandler.decrypt(user.getIdCard()));
+            subscribeBo.setUserPhone(EncryptHandler.decrypt(user.getTelphone()));
+            subscribeBo.setUserName(user.getRealname());
+            subscribeBo.setGoodsName(goods.getGoodsName());
+            CourseBusinessQueryBo courseBusinessQueryBo = new CourseBusinessQueryBo();
+            courseBusinessQueryBo.setId(goods.getBusinessId());
+            String businessName = iCourseBusinessService.queryFullName(courseBusinessQueryBo);
+            subscribeBo.setBusinessName(businessName);
+            if (ObjectUtils.isNotNull(goods.getMajorId())){
+                Major major = iMajorService.getById(goods.getMajorId());
+                subscribeBo.setMajor(major.getCategoryName());
+            }
+            subscribeBo.setTenantId(goods.getTenantId());
+            subscribeBo.setDataFrom(1);
+            subscribeBo.setCompanyName(user.getCompanyName());
+            subscribeBo.setType(1);//七大员新考
+            //考试和补考次数
+            UserExamGoods examGoods = iUserExamGoodsService
+                    .getOne(new LambdaQueryWrapper<UserExamGoods>()
+                    .eq(UserExamGoods::getUserId, bo.getUserId())
+                    .eq(UserExamGoods::getOrderGoodsId, classGradeUser.getOrderGoodsId())
+                    .last("limit 1"));
+            if (ObjectUtils.isNotNull(examGoods)){
+                subscribeBo.setExamNum(examGoods.getExamNumber().intValue());
+            }
+            String param = JSONObject.toJSONString(subscribeBo);
+            Map<String, String> headersMap = new HashMap<>();
+            HttpUtils.sendPostJsonHeaderAsync(EXAM_SUBSCRIBE_SAVE, param, headersMap);
+        }
         return true;
     }
 

+ 45 - 26
zhongzheng-system/src/main/java/com/zhongzheng/modules/schedule/service/impl/ScheduleServiceImpl.java

@@ -5,6 +5,7 @@ import cn.hutool.core.convert.Convert;
 import cn.hutool.core.lang.Validator;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
@@ -15,6 +16,7 @@ import com.zhongzheng.common.core.redis.RedisCache;
 import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.common.utils.ServletUtils;
+import com.zhongzheng.common.utils.http.HttpUtils;
 import com.zhongzheng.modules.alisms.vo.ResultBean;
 import com.zhongzheng.modules.base.service.IProfileTpService;
 import com.zhongzheng.modules.base.vo.ProfileTpVo;
@@ -36,10 +38,7 @@ import com.zhongzheng.modules.distribution.service.IDistributionCashLogService;
 import com.zhongzheng.modules.distribution.service.IDistributionRebateService;
 import com.zhongzheng.modules.distribution.service.IDistributionSellerService;
 import com.zhongzheng.modules.distribution.vo.DistributionRebateVo;
-import com.zhongzheng.modules.exam.bo.ExamApplyQueryBo;
-import com.zhongzheng.modules.exam.bo.ExamApplySiteTimeTwoAddBo;
-import com.zhongzheng.modules.exam.bo.ExamBeforeQueryBo;
-import com.zhongzheng.modules.exam.bo.ExamTodayRecordBo;
+import com.zhongzheng.modules.exam.bo.*;
 import com.zhongzheng.modules.exam.domain.*;
 import com.zhongzheng.modules.exam.mapper.ExamApplyMapper;
 import com.zhongzheng.modules.exam.mapper.ExamBeforeMapper;
@@ -380,6 +379,9 @@ public class ScheduleServiceImpl extends ServiceImpl<PolyvVideoMapper, PolyvVide
     @Value("${aliyun.sms.signCommitmentRemind}")
     private String signCommitmentRemind;
 
+    @Value("${exam.applySave}")
+    private String EXAM_APPLY_SAVE;
+
 
     @Override
     public String updateGoodsSend(UserQueryBo bo) {
@@ -1705,7 +1707,7 @@ public class ScheduleServiceImpl extends ServiceImpl<PolyvVideoMapper, PolyvVide
                 //创建考试
                 ExamApply examApply = new ExamApply();
                 examApply.setApplyUrl("oss/images/avatar/20211013/1634097664410_1397766697");//默认图片地址
-                examApply.setApplyName(String.format("【%s-%s】【%s】的考试",getTimeStr(millisecond,item.getStartTime()),getTimeStr(millisecond,item.getEndTime()),getWeeks(millisecond)));
+                examApply.setApplyName(String.format("【%s-%s】【%s】",getTimeStr(millisecond,item.getStartTime()),getTimeStr(millisecond,item.getEndTime()),getWeeks(millisecond)));
                 examApply.setApplyIntroduce("系统生成");
                 examApply.setApplyStatus("1,2");
 
@@ -1745,28 +1747,45 @@ public class ScheduleServiceImpl extends ServiceImpl<PolyvVideoMapper, PolyvVide
 
                 //考点
                 ExamSite examSite = iExamSiteService.getOne(new LambdaQueryWrapper<ExamSite>().eq(ExamSite::getSign, 1).last("limit 1"));
-                if (ObjectUtils.isNotNull(examSite)){
-                    ExamApplySite applySite = new ExamApplySite();
-                    applySite.setApplyId(examApply.getApplyId());
-                    applySite.setSiteId(examSite.getSiteId());
-                    applySite.setStatus(1);
-                    applySite.setUpdateTime(DateUtils.getNowTime());
-                    applySite.setCreateTime(DateUtils.getNowTime());
-                    iExamApplySiteService.save(applySite);
-
-
-                    //考试时间
-                    ExamApplySiteTime siteTime = new ExamApplySiteTime();
-                    siteTime.setApplyId(examApply.getApplyId());
-                    siteTime.setApplySiteId(applySite.getId());
-                    siteTime.setExamTime(millisecond);
-                    siteTime.setSiteTime(JSONArray.toJSONString(Arrays.asList(item)));
-                    siteTime.setCreateTime(DateUtils.getNowTime());
-                    siteTime.setUpdateTime(DateUtils.getNowTime());
-                    siteTime.setSendmail(0);
-                    iExamApplySiteTimeService.save(siteTime);
+                if (ObjectUtils.isNull(examSite)){
+                    continue;
                 }
-
+                ExamApplySite applySite = new ExamApplySite();
+                applySite.setApplyId(examApply.getApplyId());
+                applySite.setSiteId(examSite.getSiteId());
+                applySite.setStatus(1);
+                applySite.setUpdateTime(DateUtils.getNowTime());
+                applySite.setCreateTime(DateUtils.getNowTime());
+                iExamApplySiteService.save(applySite);
+
+                //考试时间
+                ExamApplySiteTime siteTime = new ExamApplySiteTime();
+                siteTime.setApplyId(examApply.getApplyId());
+                siteTime.setApplySiteId(applySite.getId());
+                siteTime.setExamTime(millisecond);
+                siteTime.setSiteTime(JSONArray.toJSONString(Arrays.asList(item)));
+                siteTime.setCreateTime(DateUtils.getNowTime());
+                siteTime.setUpdateTime(DateUtils.getNowTime());
+                siteTime.setSendmail(0);
+                iExamApplySiteTimeService.save(siteTime);
+
+                //考场创建同步B端
+                ExamApply apply = iExamApplyService.getById(examApply.getApplyId());
+                CdExamRoomBo roomBo = new CdExamRoomBo();
+                roomBo.setSignId(apply.getApplyId());
+                roomBo.setDataFrom(1);
+                roomBo.setTenantId(apply.getTenantId());
+                roomBo.setType(1);//七大员预约
+                roomBo.setExamType(apply.getApplyNature());
+                roomBo.setExamTime(millisecond);
+                roomBo.setExamStartTime(item.getStartTime());
+                roomBo.setExamEndTime(item.getEndTime());
+                roomBo.setExamSite(examSite.getSiteAddress());
+                roomBo.setExamNum(item.getNum().intValue());
+                roomBo.setScheduledNum(0);
+                String param = JSONObject.toJSONString(roomBo);
+                Map<String, String> headersMap = new HashMap<>();
+                HttpUtils.sendPostJsonHeaderAsync(EXAM_APPLY_SAVE, param,headersMap);
 
             }
         }

+ 3 - 2
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/goods/service/impl/TopOldOrderServiceImpl.java

@@ -1053,7 +1053,7 @@ public class TopOldOrderServiceImpl extends ServiceImpl<TopOldOrderMapper, TopOl
                         .eq(TopOldOrderCheckLog::getRefundSn, orderRefund.getRefundSn())
                         .eq(TopOldOrderCheckLog::getStatus, 1));
                 if (CollectionUtils.isNotEmpty(logList)){
-                    String collect = logList.stream().map(TopOldOrderCheckLog::getCheckReason).collect(Collectors.joining(","));
+                    String collect = logList.stream().filter(x -> StringUtils.isNotBlank(x.getCheckReason())).map(TopOldOrderCheckLog::getCheckReason).collect(Collectors.joining(","));
                     item.setCheckReason(collect);
                 }
             }
@@ -2268,7 +2268,8 @@ public class TopOldOrderServiceImpl extends ServiceImpl<TopOldOrderMapper, TopOl
                 //处理订单状态
                 List<OrderGoodsRefund> refundList = orderGoodsRefundService
                         .list(new LambdaQueryWrapper<OrderGoodsRefund>()
-                                .eq(OrderGoodsRefund::getRefundSn, checkLog.getRefundSn())
+                                .eq(OrderGoodsRefund::getOrderSn, oldOrder.getOrderSn())
+                                .eq(OrderGoodsRefund::getPeriodStatus,0)
                                 .eq(OrderGoodsRefund::getStatus, 1));
                 List<Long> orderGoodsIds = refundList.stream().map(OrderGoodsRefund::getOrderGoodsId).collect(Collectors.toList());
                 for (OrderGoodsRefund item : refundList) {

+ 58 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/settle/bo/NumSettleBo.java

@@ -0,0 +1,58 @@
+package com.zhongzheng.modules.top.settle.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * @author yangdamao
+ * @date 2023年07月25日 14:13
+ */
+@Data
+@ApiModel("数量保存Bo")
+public class NumSettleBo implements Serializable {
+
+    @ApiModelProperty("标题")
+    private String title;
+
+    @ApiModelProperty("结算方式:1数量 2时间")
+    private Integer settleType;
+
+    @ApiModelProperty("供应商ID")
+    private Long instId;
+
+    @ApiModelProperty("供应商成本分类id")
+    private Long costCatId;
+
+    @ApiModelProperty("教育类型")
+    private Long educationTypeId;
+
+    @ApiModelProperty("业务层次")
+    private Long businessId;
+
+    @ApiModelProperty("项目ID")
+    private Long projectId;
+
+    @ApiModelProperty("结算金额")
+    private BigDecimal settleMoney;
+
+    @ApiModelProperty("创建人")
+    private String loginName;
+
+    @ApiModelProperty("创建人ID")
+    private Long loginId;
+
+    @ApiModelProperty("结算订单信息")
+    private List<NumSettleOrderBo> settleOrders;
+
+    @ApiModelProperty("1提交审核 0草稿")
+    private Integer status;
+
+    @ApiModelProperty("备注")
+    private String remark;
+
+}

+ 34 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/settle/bo/NumSettleOrderBo.java

@@ -0,0 +1,34 @@
+package com.zhongzheng.modules.top.settle.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * @author yangdamao
+ * @date 2023年07月25日 14:13
+ */
+@Data
+@ApiModel("数量保存Bo")
+public class NumSettleOrderBo implements Serializable {
+
+    @ApiModelProperty("订单号")
+    private String orderSn;
+
+    @ApiModelProperty("订单商品ID")
+    private Long orderGoodsId;
+
+    @ApiModelProperty("供应商ID")
+    private Long orderFrom;
+
+    @ApiModelProperty("提交资料日期")
+    private Long submitDataTime;
+
+    @ApiModelProperty("结算金额")
+    private BigDecimal settleMoney;
+
+
+}

+ 41 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/settle/bo/SettleMoneyBo.java

@@ -0,0 +1,41 @@
+package com.zhongzheng.modules.top.settle.bo;
+
+import com.zhongzheng.common.annotation.Log;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2023年07月24日 16:35
+ */
+@ApiModel("供应商结算BO")
+@Data
+public class SettleMoneyBo implements Serializable {
+
+    @ApiModelProperty("订单号")
+    private String orderSn;
+
+    @ApiModelProperty("订单来源 1新系统C端订单,2旧系统C端订单,3旧系统B端订单 ")
+    private Integer orderFrom;
+
+    @ApiModelProperty("订单商品ID")
+    private Long orderGoodsId;
+
+    @ApiModelProperty("供应商ID")
+    private Long instId;
+
+    @ApiModelProperty("供应商成本分类id")
+    private Long costCatId;
+
+    @ApiModelProperty("教育类型id")
+    private Long educationTypeId;
+
+    @ApiModelProperty("项目ID")
+    private Long projectId;
+
+    @ApiModelProperty("业务层ID")
+    private Long businessId;
+}

+ 34 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/settle/bo/SettleOrderImportBo.java

@@ -0,0 +1,34 @@
+package com.zhongzheng.modules.top.settle.bo;
+
+import com.zhongzheng.common.annotation.Excel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2023年07月25日 9:31
+ */
+@Data
+@ApiModel("结算订单导入对象")
+public class SettleOrderImportBo implements Serializable {
+
+    /** 订单号 */
+    @Excel(name = "*订单号")
+    @ApiModelProperty("订单号")
+    private String orderSn;
+    /** 身份证号 */
+    @Excel(name = "学员身份证号码")
+    @ApiModelProperty("身份证号")
+    private String userCard;
+    /** 学员姓名 */
+    @Excel(name = "学员姓名")
+    @ApiModelProperty("学员姓名")
+    private String userName;
+    /** 提交资料日期 */
+    @Excel(name = "提交资料日期(yyyy-MM-dd HH:ss:mm)")
+    @ApiModelProperty("提交资料日期")
+    private String submitDataTime;
+}

+ 30 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/settle/bo/SettleOrderImportParamBo.java

@@ -0,0 +1,30 @@
+package com.zhongzheng.modules.top.settle.bo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2023年07月25日 9:58
+ */
+@Data
+public class SettleOrderImportParamBo implements Serializable {
+
+    @ApiModelProperty("供应商ID")
+    private Long instId;
+
+    @ApiModelProperty("供应商成本分类id")
+    private Long costCatId;
+
+    @ApiModelProperty("教育类型id")
+    private Long educationTypeId;
+
+    @ApiModelProperty("项目ID")
+    private Long projectId;
+
+    @ApiModelProperty("业务层ID")
+    private Long businessId;
+
+}

+ 29 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/settle/bo/SettleOrderInfoBo.java

@@ -0,0 +1,29 @@
+package com.zhongzheng.modules.top.settle.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2023年07月24日 15:21
+ */
+@ApiModel("订单查询对象")
+@Data
+public class SettleOrderInfoBo implements Serializable {
+
+    @ApiModelProperty("订单号")
+    private String orderSn;
+
+    @ApiModelProperty("教育类型id")
+    private Long educationTypeId;
+
+    @ApiModelProperty("项目ID")
+    private Long projectId;
+
+    @ApiModelProperty("业务层ID")
+    private Long businessId;
+
+}

+ 52 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/settle/bo/SettleQueryBo.java

@@ -0,0 +1,52 @@
+package com.zhongzheng.modules.top.settle.bo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * @author yangdamao
+ * @date 2023年07月25日 17:21
+ */
+@Data
+public class SettleQueryBo implements Serializable {
+
+    @ApiModelProperty("标题")
+    private String title;
+
+    @ApiModelProperty("结算方式:1数量 2时间")
+    private Integer settleType;
+
+    @ApiModelProperty("供应商ID")
+    private Long instId;
+
+    @ApiModelProperty("供应商成本分类id")
+    private Long costCatId;
+
+    @ApiModelProperty("教育类型")
+    private Long educationTypeId;
+
+    @ApiModelProperty("业务层次")
+    private Long businessId;
+
+    @ApiModelProperty("项目ID")
+    private Long projectId;
+
+    @ApiModelProperty("审核状态:1待提交 2待审核 3审核中 4未通过 5待支付 6支付失败 7已结算")
+    private Integer checkStatus;
+
+    @ApiModelProperty("开始时间")
+    private Long startTime;
+
+    @ApiModelProperty("结束时间")
+    private Long endTime;
+
+    /** 分页大小 */
+    @ApiModelProperty("分页大小")
+    private Integer pageSize;
+    /** 当前页数 */
+    @ApiModelProperty("当前页数")
+    private Integer pageNum;
+}

+ 64 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/settle/bo/TimeSettleBo.java

@@ -0,0 +1,64 @@
+package com.zhongzheng.modules.top.settle.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * @author yangdamao
+ * @date 2023年07月25日 14:13
+ */
+@Data
+@ApiModel("时间保存Bo")
+public class TimeSettleBo implements Serializable {
+
+    @ApiModelProperty("标题")
+    private String title;
+
+    @ApiModelProperty("结算方式:1数量 2时间")
+    private Integer settleType;
+
+    @ApiModelProperty("供应商ID")
+    private Long instId;
+
+    @ApiModelProperty("供应商成本分类id")
+    private Long costCatId;
+
+    @ApiModelProperty("教育类型")
+    private Long educationTypeId;
+
+    @ApiModelProperty("业务层次")
+    private Long businessId;
+
+    @ApiModelProperty("项目ID")
+    private Long projectId;
+
+    @ApiModelProperty("结算金额")
+    private BigDecimal settleMoney;
+
+    @ApiModelProperty("创建人")
+    private String loginName;
+
+    @ApiModelProperty("创建人ID")
+    private Long loginId;
+
+    @ApiModelProperty("1提交审核 0草稿")
+    private Integer status;
+
+    @ApiModelProperty("备注")
+    private String remark;
+
+    @ApiModelProperty("签约开始时间")
+    private Long signStartTime;
+
+    @ApiModelProperty("签约结束时间")
+    private Long signEndTime;
+
+    @ApiModelProperty("结算订单类型:1全部 2代运营订单 3独立订单")
+    private Integer settleOrderType;
+
+}

+ 69 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/settle/domian/TopInstSettle.java

@@ -0,0 +1,69 @@
+package com.zhongzheng.modules.top.settle.domian;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ *
+ *
+ * @author zhongzheng
+ */
+
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+@TableName("top_inst_settle")
+public class TopInstSettle implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "settle_id")
+    private Long settleId;
+
+    /** 标题 */
+    private String title;
+    /** 结算号 */
+    private String settleSn;
+    /** 结算方式:1数量 2时间 */
+    private Integer settleType;
+    /** 教育类型 */
+    private Long educationTypeId;
+    /** 业务层次 */
+    private Long businessId;
+    /** 项目ID */
+    private Long projectId;
+    /** 结算金额 */
+    private BigDecimal settleMoney;
+    /** 供应商ID */
+    private Long instId;
+    /** 供应商结算分成模板ID */
+    private Long instTpId;
+    /** 供应商成本分类id */
+    private Long costCatId;
+    /** 审核状态:1待提交 2待审核 3审核中 4未通过 5待支付 6支付失败 7已结算 */
+    private Integer checkStatus;
+    /** 1有效 0草稿 */
+    private Integer status;
+    /** 创建时间 */
+    private Long createTime;
+    /** 更新时间 */
+    private Long updateTime;
+    /** 创建人 */
+    private String createBy;
+    /** 创建人ID */
+    private Long createUserId;
+    /** 备注 */
+    private String remark;
+    /** 签约开始时间 */
+    private Long signStartTime;
+    /** 签约结束时间 */
+    private Long signEndTime;
+    /** 结算订单类型:1全部 2代运营订单 3独立订单 */
+    private Integer settleOrderType;
+
+
+}

+ 48 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/settle/domian/TopInstSettleRelaiton.java

@@ -0,0 +1,48 @@
+package com.zhongzheng.modules.top.settle.domian;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ *
+ *
+ * @author zhongzheng
+ */
+
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+@TableName("top_inst_settle_relation")
+public class TopInstSettleRelaiton implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id")
+    private Long id;
+
+    /** 结算ID */
+    private Long settleId;
+    /** 订单号 */
+    private String orderSn;
+    /** 订单商品ID */
+    private Long orderGoodsId;
+    /** 订单来源 1新系统C端订单,2旧系统C端订单,3旧系统B端订单  */
+    private Integer orderFrom;
+    /** 提交资料日期 */
+    private String submitDataTime;
+    /** 结算金额 */
+    private BigDecimal settleMoney;
+    /** 1有效 0草稿 */
+    private Integer status;
+    /** 创建时间 */
+    private Long createTime;
+    /** 更新时间 */
+    private Long updateTime;
+
+
+}

+ 21 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/settle/mapper/TopInstSettleMapper.java

@@ -0,0 +1,21 @@
+package com.zhongzheng.modules.top.settle.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zhongzheng.modules.top.settle.domian.TopInstSettle;
+import com.zhongzheng.modules.top.settle.vo.TopOrderInfoVo;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface TopInstSettleMapper extends BaseMapper<TopInstSettle> {
+
+    TopOrderInfoVo getOrderInfo(@Param("orderSn") String orderSn);
+
+    List<String> getOrderBusiness(@Param("orderSn") String orderSn);
+
+    String geTopCostBusinessName(Long id);
+
+    String getGoodsBusinessName(@Param("orderSn") String orderSn,@Param("orderGoodsId") Long orderGoodsId);
+
+    List<Long> getOrderGoodsByBusiness(@Param("orderSn") String orderSn,@Param("tpBusinessName") String tpBusinessName);
+}

+ 8 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/settle/mapper/TopInstSettleRelationMapper.java

@@ -0,0 +1,8 @@
+package com.zhongzheng.modules.top.settle.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zhongzheng.modules.top.settle.domian.TopInstSettle;
+import com.zhongzheng.modules.top.settle.domian.TopInstSettleRelaiton;
+
+public interface TopInstSettleRelationMapper extends BaseMapper<TopInstSettleRelaiton> {
+}

+ 8 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/settle/service/ITopInstSettleRelationService.java

@@ -0,0 +1,8 @@
+package com.zhongzheng.modules.top.settle.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zhongzheng.modules.top.settle.domian.TopInstSettle;
+import com.zhongzheng.modules.top.settle.domian.TopInstSettleRelaiton;
+
+public interface ITopInstSettleRelationService extends IService<TopInstSettleRelaiton> {
+}

+ 26 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/settle/service/ITopInstSettleService.java

@@ -0,0 +1,26 @@
+package com.zhongzheng.modules.top.settle.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zhongzheng.modules.top.settle.bo.*;
+import com.zhongzheng.modules.top.settle.domian.TopInstSettle;
+import com.zhongzheng.modules.top.settle.vo.SettleOrderImportVo;
+import com.zhongzheng.modules.top.settle.vo.SettleVo;
+import com.zhongzheng.modules.top.settle.vo.TopOrderInfoVo;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+public interface ITopInstSettleService extends IService<TopInstSettle> {
+
+    TopOrderInfoVo getOrderInfo(SettleOrderInfoBo bo);
+
+    BigDecimal getSettleMoney(SettleMoneyBo bo);
+
+    List<SettleOrderImportVo> batchOrderImport(List<SettleOrderImportBo> orderImportBo, SettleOrderImportParamBo paramBo);
+
+    boolean numSettleOrderSave(NumSettleBo bo);
+
+    boolean timeSettleOrderSave(TimeSettleBo bo);
+
+    List<SettleVo> getSettleList(SettleQueryBo bo);
+}

+ 17 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/settle/service/impl/ITopInstSettleRelationServiceImpl.java

@@ -0,0 +1,17 @@
+package com.zhongzheng.modules.top.settle.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zhongzheng.modules.top.settle.domian.TopInstSettleRelaiton;
+import com.zhongzheng.modules.top.settle.mapper.TopInstSettleRelationMapper;
+import com.zhongzheng.modules.top.settle.service.ITopInstSettleRelationService;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author yangdamao
+ * @date 2023年07月24日 11:13
+ */
+@Service
+public class ITopInstSettleRelationServiceImpl extends ServiceImpl<TopInstSettleRelationMapper, TopInstSettleRelaiton> implements ITopInstSettleRelationService {
+
+
+}

+ 478 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/settle/service/impl/ITopInstSettleServiceImpl.java

@@ -0,0 +1,478 @@
+package com.zhongzheng.modules.top.settle.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zhongzheng.common.exception.CustomException;
+import com.zhongzheng.common.type.EncryptHandler;
+import com.zhongzheng.common.utils.DateUtils;
+import com.zhongzheng.modules.goods.domain.Goods;
+import com.zhongzheng.modules.goods.service.IGoodsService;
+import com.zhongzheng.modules.order.domain.Order;
+import com.zhongzheng.modules.order.domain.OrderGoods;
+import com.zhongzheng.modules.order.service.IOrderGoodsService;
+import com.zhongzheng.modules.order.service.IOrderService;
+import com.zhongzheng.modules.top.financial.domain.TopCostInstTp;
+import com.zhongzheng.modules.top.financial.domain.TopCostInstTpItem;
+import com.zhongzheng.modules.top.financial.service.ITopCostInstTpItemService;
+import com.zhongzheng.modules.top.financial.service.ITopCostInstTpService;
+import com.zhongzheng.modules.top.goods.domain.*;
+import com.zhongzheng.modules.top.goods.service.*;
+import com.zhongzheng.modules.top.settle.bo.*;
+import com.zhongzheng.modules.top.settle.domian.TopInstSettle;
+import com.zhongzheng.modules.top.settle.domian.TopInstSettleRelaiton;
+import com.zhongzheng.modules.top.settle.mapper.TopInstSettleMapper;
+import com.zhongzheng.modules.top.settle.service.ITopInstSettleRelationService;
+import com.zhongzheng.modules.top.settle.service.ITopInstSettleService;
+import com.zhongzheng.modules.top.settle.vo.SettleOrderImportVo;
+import com.zhongzheng.modules.top.settle.vo.SettleVo;
+import com.zhongzheng.modules.top.settle.vo.TopOrderInfoVo;
+import com.zhongzheng.modules.top.settle.vo.TopOrderStudyInfoVo;
+import com.zhongzheng.modules.top.user.domain.TopSysUserRole;
+import com.zhongzheng.modules.top.user.service.ITopSysUserRoleService;
+import com.zhongzheng.modules.top.user.service.ITopSysUserService;
+import com.zhongzheng.modules.user.domain.User;
+import com.zhongzheng.modules.user.service.IUserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @author yangdamao
+ * @date 2023年07月24日 11:13
+ */
+@Service
+public class ITopInstSettleServiceImpl extends ServiceImpl<TopInstSettleMapper, TopInstSettle> implements ITopInstSettleService {
+
+    @Autowired
+    private ITopOldOrderService topOldOrderService;
+    @Autowired
+    private ITopOldOrderGoodsService topOldOrderGoodsService;
+    @Autowired
+    private IOrderGoodsService orderGoodsService;
+    @Autowired
+    private IOrderService orderService;
+    @Autowired
+    private IUserService userService;
+    @Autowired
+    private IGoodsService goodsService;
+    @Autowired
+    private ITopCostInstTpService topCostInstTpService;
+    @Autowired
+    private ITopCostInstTpItemService topCostInstTpItemService;
+    @Autowired
+    private ITopCourseEducationTypeService topCourseEducationTypeService;
+    @Autowired
+    private ITopCourseProjectTypeService topCourseProjectTypeService;
+    @Autowired
+    private ITopCourseBusinessService topCourseBusinessService;
+    @Autowired
+    private ITopInstSettleRelationService topInstSettleRelationService;
+    @Autowired
+    private ITopOldOrderCheckService topOldOrderCheckService;
+    @Autowired
+    private ITopOldOrderCheckLogService topOldOrderCheckLogService;
+    @Autowired
+    private ITopSysUserRoleService topSysUserRoleService;
+
+
+    @Override
+    public TopOrderInfoVo getOrderInfo(SettleOrderInfoBo bo) {
+        TopOrderInfoVo orderInfoVo = baseMapper.getOrderInfo(bo.getOrderSn());
+        if (ObjectUtils.isNull(orderInfoVo)){
+            throw new CustomException("订单信息获取有误!");
+        }
+        if (orderInfoVo.getCheckStatus() != 1){
+            throw new CustomException("订单未通过审核,请检查!");
+        }
+        //订单业务层次
+        List<String> businessNames = baseMapper.getOrderBusiness(bo.getOrderSn());
+        if (CollectionUtils.isEmpty(businessNames)){
+            throw new CustomException("订单不存在业务层,请检查!");
+        }
+        String eduName = getBusinessFullName(bo.getEducationTypeId(),bo.getProjectId(),bo.getBusinessId());
+        if (businessNames.stream().noneMatch(x -> x.contains(eduName))){
+            throw new CustomException("订单业务层次不匹配,请检查!");
+        }
+
+        //订单学员信息
+        if (orderInfoVo.getOrderFrom() == 1){
+            //新系统订单
+            List<OrderGoods> list = orderGoodsService
+                    .list(new LambdaQueryWrapper<OrderGoods>()
+                    .eq(OrderGoods::getOrderSn, bo.getOrderSn()));
+            if (CollectionUtils.isNotEmpty(list)){
+                Order order = orderService.getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderSn, bo.getOrderSn()));
+                User user = userService.getById(order.getUserId());
+                List<TopOrderStudyInfoVo> infoVoList = list.stream().map(item -> {
+                    TopOrderStudyInfoVo studyInfoVo = new TopOrderStudyInfoVo();
+                    studyInfoVo.setUserCard(EncryptHandler.decrypt(user.getIdCard()));
+                    studyInfoVo.setUserPhone(EncryptHandler.decrypt(user.getTelphone()));
+                    studyInfoVo.setUserName(user.getRealname());
+                    studyInfoVo.setOrderSn(bo.getOrderSn());
+                    Goods goods = goodsService.getById(item.getGoodsId());
+                    studyInfoVo.setGoodsName(goods.getGoodsName());
+                    studyInfoVo.setOrderGoodsId(item.getOrderGoodsId());
+                    return studyInfoVo;
+                }).collect(Collectors.toList());
+                orderInfoVo.setOrderStudyList(infoVoList);
+            }
+        }else {
+            //旧系统订单
+            List<TopOldOrderGoods> list = topOldOrderGoodsService
+                    .list(new LambdaQueryWrapper<TopOldOrderGoods>()
+                    .eq(TopOldOrderGoods::getOrderSn, bo.getOrderSn()));
+            if (CollectionUtils.isNotEmpty(list)){
+                List<TopOrderStudyInfoVo> infoVoList = list.stream().map(item -> {
+                    TopOrderStudyInfoVo studyInfoVo = new TopOrderStudyInfoVo();
+                    studyInfoVo.setUserCard(EncryptHandler.decrypt(item.getUserCard()));
+                    studyInfoVo.setUserPhone(item.getUserPhone());
+                    studyInfoVo.setUserName(item.getUserName());
+                    studyInfoVo.setOrderSn(bo.getOrderSn());
+                    studyInfoVo.setGoodsName(item.getGoodsName());
+                    studyInfoVo.setOrderGoodsId(item.getOrderGoodsId());
+                    return studyInfoVo;
+                }).collect(Collectors.toList());
+                orderInfoVo.setOrderStudyList(infoVoList);
+            }
+        }
+        return orderInfoVo;
+    }
+
+    @Override
+    public BigDecimal getSettleMoney(SettleMoneyBo bo) {
+        TopOrderInfoVo orderInfo = baseMapper.getOrderInfo(bo.getOrderSn());
+        if (ObjectUtils.isNull(orderInfo)){
+            throw new CustomException("订单信息有误!");
+        }
+        //供应商默认结算模版
+        TopCostInstTp instTp = topCostInstTpService
+                .getOne(new LambdaQueryWrapper<TopCostInstTp>()
+                .eq(TopCostInstTp::getInstId, bo.getInstId())
+                .eq(TopCostInstTp::getDefaultStatus, 1)
+                .eq(TopCostInstTp::getStatus, 1));
+        if (ObjectUtils.isNull(instTp)){
+            return new BigDecimal("0.00");
+        }
+
+        TopCostInstTpItem tpItem = topCostInstTpItemService
+                .getOne(new LambdaQueryWrapper<TopCostInstTpItem>()
+                .eq(TopCostInstTpItem::getTpId, instTp.getTpId())
+                .eq(TopCostInstTpItem::getEducationTypeId, bo.getEducationTypeId())
+                .eq(TopCostInstTpItem::getProjectId, bo.getProjectId())
+                .eq(TopCostInstTpItem::getBusinessId, bo.getBusinessId())
+                .eq(TopCostInstTpItem::getCostCatId, bo.getCostCatId())
+                .eq(TopCostInstTpItem::getStatus,1));
+        if (ObjectUtils.isNull(tpItem)){
+            throw new CustomException("模版结算成本不存在!");
+        }
+
+        //模板业务层次全称
+        String businessName = baseMapper.geTopCostBusinessName(tpItem.getId());
+        //订单业务层次
+        String orderBusiness =  baseMapper.getGoodsBusinessName(bo.getOrderSn(),bo.getOrderGoodsId());
+        if (!orderBusiness.contains(businessName)){
+            throw new CustomException("学员和结算成本的业务层次不匹配!");
+        }
+
+        //换算结算金额
+        BigDecimal settleMoney = BigDecimal.ZERO;
+        switch (tpItem.getItemType()){
+            case 1://百分比
+                //订单商品价格-佣金
+                BigDecimal realPrice = BigDecimal.ZERO;
+                if (orderInfo.getOrderFrom() == 1){
+                    //新系统
+                    OrderGoods orderGoods = orderGoodsService.getById(bo.getOrderGoodsId());
+                    realPrice = orderGoods.getGoodsRealPrice();
+                }else {
+                    //订单金额
+                    TopOldOrderGoods orderGoods = topOldOrderGoodsService.getById(bo.getOrderGoodsId());
+                    realPrice = orderGoods.getGoodsRealPrice();
+
+                    TopOldOrder oldOrder = topOldOrderService
+                            .getOne(new LambdaQueryWrapper<TopOldOrder>()
+                            .eq(TopOldOrder::getOrderSn, bo.getOrderSn()));
+                    if (ObjectUtils.isNotNull(oldOrder.getPretaxBrokerage())
+                            && oldOrder.getPretaxBrokerage().compareTo(BigDecimal.ZERO)>0){
+                        int count = topOldOrderGoodsService.count(new LambdaQueryWrapper<TopOldOrderGoods>()
+                                .eq(TopOldOrderGoods::getOrderSn, bo.getOrderSn())
+                                .in(TopOldOrderGoods::getCheckStatus, Arrays.asList(0, 1))
+                                .eq(TopOldOrderGoods::getStatus, 1));
+                        BigDecimal divide = oldOrder.getPretaxBrokerage().divide(new BigDecimal(count));
+                        realPrice = realPrice.subtract(divide);
+                    }
+                }
+                BigDecimal divide = tpItem.getTypeValue().divide(new BigDecimal("100.00"));
+                settleMoney = realPrice.multiply(divide);
+                break;
+            case 2://固定的金额
+                settleMoney = tpItem.getTypeValue();
+                break;
+            default :
+                break;
+        }
+
+        return settleMoney;
+    }
+
+    @Override
+    public List<SettleOrderImportVo> batchOrderImport(List<SettleOrderImportBo> orderImportBo, SettleOrderImportParamBo paramBo) {
+        List<SettleOrderImportVo> result = new ArrayList<>();
+        //供应商默认结算模版
+        String tpBusinessName = "";
+        TopCostInstTpItem tpItem = null;
+        TopCostInstTp instTp = topCostInstTpService
+                .getOne(new LambdaQueryWrapper<TopCostInstTp>()
+                        .eq(TopCostInstTp::getInstId, paramBo.getInstId())
+                        .eq(TopCostInstTp::getDefaultStatus, 1)
+                        .eq(TopCostInstTp::getStatus, 1));
+        if (ObjectUtils.isNotNull(instTp)){
+                     tpItem = topCostInstTpItemService
+                    .getOne(new LambdaQueryWrapper<TopCostInstTpItem>()
+                            .eq(TopCostInstTpItem::getTpId, instTp.getTpId())
+                            .eq(TopCostInstTpItem::getEducationTypeId, paramBo.getEducationTypeId())
+                            .eq(TopCostInstTpItem::getProjectId, paramBo.getProjectId())
+                            .eq(TopCostInstTpItem::getBusinessId, paramBo.getBusinessId())
+                            .eq(TopCostInstTpItem::getCostCatId, paramBo.getCostCatId())
+                            .eq(TopCostInstTpItem::getStatus,1));
+            if (ObjectUtils.isNull(tpItem)){
+                throw new CustomException("模版结算成本不存在!");
+            }
+            //模板业务层次全称
+            tpBusinessName = baseMapper.geTopCostBusinessName(tpItem.getId());
+        }else {
+            //模板业务层次全称
+            tpBusinessName = getBusinessFullName(paramBo.getEducationTypeId(),paramBo.getProjectId(),paramBo.getBusinessId());
+        }
+
+        for (SettleOrderImportBo bo : orderImportBo) {
+            //导入校验
+            importCheck(bo,tpBusinessName);
+            SettleOrderImportVo vo = new SettleOrderImportVo();
+            vo.setOrderSn(bo.getOrderSn());
+            TopOrderInfoVo orderInfoVo = baseMapper.getOrderInfo(bo.getOrderSn());
+            vo.setCreateNo(orderInfoVo.getCreateNo());
+            vo.setCreateUsername(orderInfoVo.getCreateUsername());
+            vo.setClientName(orderInfoVo.getClientName());
+            vo.setUserName(bo.getUserName());
+            vo.setUserCard(bo.getUserCard());
+            vo.setOrderFrom(orderInfoVo.getOrderFrom());
+            Long time = DateUtils.dateTimeSec("yyyy-MM-dd HH:ss:mm", bo.getSubmitDataTime());
+            vo.setSubmitDataTime(time);
+            //结算金额
+            if (ObjectUtil.isNull(tpItem)){
+                vo.setSettleMoney(BigDecimal.ZERO);
+            }else {
+                //换算结算金额
+                BigDecimal settleMoney = BigDecimal.ZERO;
+                List<Long> orderGoodsIds = baseMapper.getOrderGoodsByBusiness(bo.getOrderSn(),tpBusinessName);
+                if (CollectionUtils.isNotEmpty(orderGoodsIds)){
+                    switch (tpItem.getItemType()){
+                        case 1://百分比
+                            //订单商品价格-佣金
+                            BigDecimal realPrice = BigDecimal.ZERO;
+                            if (orderInfoVo.getOrderFrom() == 1){
+                                //新系统
+                                OrderGoods orderGoods = orderGoodsService.getById(orderGoodsIds.get(0));
+                                realPrice = orderGoods.getGoodsRealPrice();
+                                vo.setOrderGoodsId(orderGoodsIds.get(0));
+                            }else {
+                                //订单金额
+                                Long orderGoodsId = orderGoodsIds.stream().filter(item -> {
+                                    TopOldOrderGoods one = topOldOrderGoodsService.getById(item);
+                                    return EncryptHandler.decrypt(one.getUserCard()).equals(bo.getUserCard()) && one.getUserName().equals(bo.getUserName());
+                                }).findFirst().orElse(null);
+                                if (ObjectUtils.isNotNull(orderGoodsId)){
+                                    TopOldOrderGoods orderGoods = topOldOrderGoodsService.getById(orderGoodsId);
+                                    realPrice = orderGoods.getGoodsRealPrice();
+                                    TopOldOrder oldOrder = topOldOrderService
+                                            .getOne(new LambdaQueryWrapper<TopOldOrder>()
+                                                    .eq(TopOldOrder::getOrderSn, bo.getOrderSn()));
+                                    if (ObjectUtils.isNotNull(oldOrder.getPretaxBrokerage())
+                                            && oldOrder.getPretaxBrokerage().compareTo(BigDecimal.ZERO)>0){
+                                        int count = topOldOrderGoodsService.count(new LambdaQueryWrapper<TopOldOrderGoods>()
+                                                .eq(TopOldOrderGoods::getOrderSn, bo.getOrderSn())
+                                                .in(TopOldOrderGoods::getCheckStatus, Arrays.asList(0, 1))
+                                                .eq(TopOldOrderGoods::getStatus, 1));
+                                        BigDecimal divide = oldOrder.getPretaxBrokerage().divide(new BigDecimal(count));
+                                        realPrice = realPrice.subtract(divide);
+                                    }
+                                    vo.setOrderGoodsId(orderGoodsId);
+                                }
+                            }
+                            BigDecimal divide = tpItem.getTypeValue().divide(new BigDecimal("100.00"));
+                            settleMoney = realPrice.multiply(divide);
+                            break;
+                        case 2://固定的金额
+                            settleMoney = tpItem.getTypeValue();
+                            break;
+                        default :
+                            break;
+                    }
+                }
+                vo.setSettleMoney(settleMoney);
+            }
+            result.add(vo);
+        }
+        return result;
+    }
+
+    @Override
+    public boolean numSettleOrderSave(NumSettleBo bo) {
+        //结算信息
+        TopInstSettle entity = BeanUtil.toBean(bo, TopInstSettle.class);
+        entity.setSettleSn(DateUtils.getDateOrderSn());
+        entity.setStatus(bo.getStatus());
+        entity.setCreateTime(DateUtils.getNowTime());
+        entity.setUpdateTime(DateUtils.getNowTime());
+        entity.setCheckStatus(1);
+        save(entity);
+        //结算订单信息
+        if (CollectionUtils.isNotEmpty(bo.getSettleOrders())){
+            List<TopInstSettleRelaiton> relaitonList = bo.getSettleOrders().stream().map(item -> {
+                TopInstSettleRelaiton relaiton = BeanUtil.toBean(item, TopInstSettleRelaiton.class);
+                relaiton.setSettleId(entity.getSettleId());
+                relaiton.setCreateTime(DateUtils.getNowTime());
+                relaiton.setUpdateTime(DateUtils.getNowTime());
+                relaiton.setStatus(1);
+                return relaiton;
+            }).collect(Collectors.toList());
+            topInstSettleRelationService.saveBatch(relaitonList);
+        }
+        if (bo.getStatus() == 1){
+            //提交审核
+            createCheckLog(entity.getSettleSn(),bo.getLoginId(),bo.getLoginName());
+        }
+        return true;
+    }
+
+    private void createCheckLog(String settleSn,Long loginId,String loginName){
+        //获取审核和支付流程
+        List<TopOldOrderCheck> list = topOldOrderCheckService
+                .list(new LambdaQueryWrapper<TopOldOrderCheck>()
+                        .in(TopOldOrderCheck::getCheckType, Arrays.asList(7, 8))
+                        .eq(TopOldOrderCheck::getStatus, 1)
+                        .orderByAsc(TopOldOrderCheck::getCheckSort));
+        if (CollectionUtils.isEmpty(list)){
+            throw new CustomException("请先配置供应商结算的审核流程!");
+        }
+        //当前创建人的角色
+        List<TopSysUserRole> userRoles = topSysUserRoleService
+                .list(new LambdaQueryWrapper<TopSysUserRole>()
+                        .eq(TopSysUserRole::getUserId, loginId));
+        List<TopOldOrderCheckLog> checkLogList = new ArrayList<>();
+        for (TopOldOrderCheck orderCheck : list) {
+            TopOldOrderCheckLog checkLog = new TopOldOrderCheckLog();
+            checkLog.setRoleId(orderCheck.getCheckRole());
+            checkLog.setType(orderCheck.getCheckType());
+            checkLog.setCheckSort(orderCheck.getCheckSort());
+            checkLog.setCheckFrom(5);//供应商结算
+            checkLog.setOrderSn(settleSn);
+            checkLog.setCreateTime(DateUtils.getNowTime());
+            checkLog.setUpdateTime(DateUtils.getNowTime());
+            checkLog.setCheckSign(0);
+            if (userRoles.stream().anyMatch(x -> x.getRoleId().equals(orderCheck.getCheckRole())) && orderCheck.getCheckType() == 7){
+                //创建人包含审核角色(跳过审核)
+                checkLog.setCheckStatus(1);
+                checkLog.setCheckReason("系统自动审核");
+                checkLog.setCheckTime(DateUtils.getNowTime());
+                checkLog.setCheckUsername(loginName);
+            }else {
+                checkLog.setCheckStatus(orderCheck.getCheckType() == 7?0:2);
+            }
+            checkLogList.add(checkLog);
+        }
+        topOldOrderCheckLogService.saveBatch(checkLogList);
+        //当前审核标签
+        TopOldOrderCheckLog checkLog = checkLogList.stream()
+                .filter(x -> x.getCheckStatus() != 1).sorted(Comparator.comparing(TopOldOrderCheckLog::getCheckSort)).findFirst().orElse(null);
+        checkLog.setCheckSign(1);
+        topOldOrderCheckLogService.updateById(checkLog);
+        //订单审核状态
+        Integer checkStatus = 2;//待审核
+        for (TopOldOrderCheckLog item : checkLogList) {
+            if (item.getId().equals(checkLog.getId()) && item.getType() == 7 && item.getCheckSort() > 1){
+                checkStatus = 3;//审核中
+            }
+            if (item.getId().equals(checkLog.getId()) && item.getType() == 8 ){
+                checkStatus = 5;//待支付
+            }
+        }
+        update(new LambdaUpdateWrapper<TopInstSettle>()
+        .set(TopInstSettle::getCheckStatus,checkStatus)
+        .eq(TopInstSettle::getSettleSn,settleSn));
+    }
+
+    @Override
+    public boolean timeSettleOrderSave(TimeSettleBo bo) {
+        //结算信息
+        TopInstSettle entity = BeanUtil.toBean(bo, TopInstSettle.class);
+        entity.setSettleSn(DateUtils.getDateOrderSn());
+        entity.setStatus(bo.getStatus());
+        entity.setCreateTime(DateUtils.getNowTime());
+        entity.setUpdateTime(DateUtils.getNowTime());
+        save(entity);
+        if (bo.getStatus() == 1){
+            //提交审核
+            createCheckLog(entity.getSettleSn(),bo.getLoginId(),bo.getLoginName());
+        }
+        return true;
+    }
+
+    @Override
+    public List<SettleVo> getSettleList(SettleQueryBo bo) {
+
+        return null;
+    }
+
+    //结算订单导入校验
+    private void importCheck(SettleOrderImportBo bo,String tpBusinessName) {
+        TopOrderInfoVo orderInfoVo = baseMapper.getOrderInfo(bo.getOrderSn());
+        if (ObjectUtils.isNull(orderInfoVo)){
+            throw new CustomException(String.format("订单【%s】信息获取有误!",bo.getOrderSn()));
+        }
+        if (orderInfoVo.getCheckStatus() != 1){
+            throw new CustomException(String.format("订单【%s】未通过审核,请检查!",bo.getOrderSn()));
+        }
+        //订单业务层次
+        List<String> businessNames = baseMapper.getOrderBusiness(bo.getOrderSn());
+        if (CollectionUtils.isEmpty(businessNames)){
+            throw new CustomException(String.format("订单【%s】不存在业务层,请检查!",bo.getOrderSn()));
+        }
+        if (businessNames.stream().noneMatch(x -> x.contains(tpBusinessName))){
+            throw new CustomException(String.format("订单【%s】业务层次不匹配,请检查!",bo.getOrderSn()));
+        }
+
+        if (orderInfoVo.getOrderFrom() == 1){
+            Order order = orderService.getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderSn, bo.getOrderSn()));
+            User user = userService.getById(order.getUserId());
+            if (!EncryptHandler.decrypt(user.getIdCard()).equals(bo.getUserCard())){
+                throw new CustomException(String.format("订单【%s】和学员【%s】不匹配,请检查!",bo.getOrderSn(),bo.getUserName()));
+            }
+        }else {
+            List<TopOldOrderGoods> list = topOldOrderGoodsService.list(new LambdaQueryWrapper<TopOldOrderGoods>().eq(TopOldOrderGoods::getOrderSn, bo.getOrderSn()));
+            if (list.stream().noneMatch(item -> EncryptHandler.decrypt(item.getUserCard()).equals(bo.getUserCard()))){
+                throw new CustomException(String.format("订单【%s】和学员【%s】不匹配,请检查!",bo.getOrderSn(),bo.getUserName()));
+            }
+        }
+
+    }
+
+    private String getBusinessFullName(Long educationId,Long projectId,Long businessId){
+        TopCourseEducationType educationType = topCourseEducationTypeService.getById(educationId);
+        TopCourseProjectType projectType = topCourseProjectTypeService.getById(projectId);
+        TopCourseBusiness business = topCourseBusinessService.getById(businessId);
+        return educationType.getEducationName()+business.getBusinessName()+projectType.getProjectName();
+    }
+}

+ 47 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/settle/vo/SettleOrderImportVo.java

@@ -0,0 +1,47 @@
+package com.zhongzheng.modules.top.settle.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * @author yangdamao
+ * @date 2023年07月25日 9:31
+ */
+@Data
+@ApiModel("结算订单导入对象")
+public class SettleOrderImportVo implements Serializable {
+
+    @ApiModelProperty("订单号")
+    private String orderSn;
+
+    @ApiModelProperty("订单来源 1新系统C端订单,2旧系统C端订单,3旧系统B端订单 ")
+    private Integer orderFrom;
+
+    @ApiModelProperty("业务号")
+    private String createNo;
+
+    @ApiModelProperty("业务员名称")
+    private String createUsername;
+
+    @ApiModelProperty("客户名称")
+    private String clientName;
+
+    @ApiModelProperty("身份证号")
+    private String userCard;
+
+    @ApiModelProperty("学员姓名")
+    private String userName;
+
+    @ApiModelProperty("提交资料日期")
+    private Long submitDataTime;
+
+    @ApiModelProperty("结算金额")
+    private BigDecimal settleMoney;
+
+    @ApiModelProperty("订单商品ID")
+    private Long orderGoodsId;
+}

+ 63 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/settle/vo/SettleVo.java

@@ -0,0 +1,63 @@
+package com.zhongzheng.modules.top.settle.vo;
+
+import com.zhongzheng.modules.top.settle.bo.NumSettleOrderBo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * @author yangdamao
+ * @date 2023年07月25日 17:57
+ */
+@Data
+@ApiModel("结算列表")
+public class SettleVo implements Serializable {
+
+    private Long id;
+
+    @ApiModelProperty("标题")
+    private String title;
+
+    @ApiModelProperty("结算方式:1数量 2时间")
+    private Integer settleType;
+
+    @ApiModelProperty("供应商名称")
+    private String instName;
+
+    @ApiModelProperty("供应商成本分类id")
+    private String costCatId;
+
+    @ApiModelProperty("开户名")
+    private String bankName;
+
+    @ApiModelProperty("开户行")
+    private String bank;
+
+    @ApiModelProperty("开户账号")
+    private String bankAccount;
+
+    @ApiModelProperty("业务层次")
+    private String businessName;
+
+    @ApiModelProperty("结算金额")
+    private BigDecimal settleMoney;
+
+    @ApiModelProperty("审核状态:1待提交 2待审核 3审核中 4未通过 5待支付 6支付失败 7已结算")
+    private Integer checkStatus;
+
+    @ApiModelProperty("审核角色")
+    private String checkRole;
+
+    @ApiModelProperty("审核时间")
+    private Long checkTime;
+
+    @ApiModelProperty("备注")
+    private String remark;
+
+    @ApiModelProperty("添加时间")
+    private Long createTime;
+}

+ 41 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/settle/vo/TopOrderInfoVo.java

@@ -0,0 +1,41 @@
+package com.zhongzheng.modules.top.settle.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+
+/**
+ * 订单视图对象 mall_package
+ *
+ * @author ruoyi
+ * @date 2023-04-20
+ */
+@Data
+@ApiModel("订单视图对象")
+public class TopOrderInfoVo {
+	private static final long serialVersionUID = 1L;
+
+	@ApiModelProperty("订单编号")
+	private String orderSn;
+
+	@ApiModelProperty("业务号")
+	private String createNo;
+
+	@ApiModelProperty("业务员名称")
+	private String createUsername;
+
+	@ApiModelProperty("客户名称")
+	private String clientName;
+
+	@ApiModelProperty("订单来源 1新系统C端订单,2旧系统C端订单,3旧系统B端订单 ")
+	private Integer orderFrom;
+
+	@ApiModelProperty("审核状态:0待审核,1已通过,2未通过,3已撤销")
+	private Integer checkStatus;
+
+	@ApiModelProperty("订单学员信息")
+	private List<TopOrderStudyInfoVo> orderStudyList;
+}

+ 37 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/settle/vo/TopOrderStudyInfoVo.java

@@ -0,0 +1,37 @@
+package com.zhongzheng.modules.top.settle.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+/**
+ * 订单视图对象 mall_package
+ *
+ * @author ruoyi
+ * @date 2023-04-20
+ */
+@Data
+@ApiModel("订单学员对象")
+public class TopOrderStudyInfoVo {
+	private static final long serialVersionUID = 1L;
+
+	@ApiModelProperty("订单编号")
+	private Long orderGoodsId;
+
+	@ApiModelProperty("订单编号")
+	private String orderSn;
+
+	@ApiModelProperty("学员名称")
+	private String userName;
+
+	@ApiModelProperty("学员身份证")
+	private String userCard;
+
+	@ApiModelProperty("学员手机号码")
+	private String userPhone;
+
+	@ApiModelProperty("商品名称")
+	private String goodsName;
+
+}

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

@@ -110,4 +110,6 @@ public interface IUserSubscribeService extends IService<UserSubscribe> {
     void examApplySubscribe(ExamApplySubscribeBo bo);
 
     String updateStudentImage(UpdateStudentImageBo bo);
+
+	void examApplySubscribeCancel(ExamApplySubscribeBo bo);
 }

+ 126 - 23
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserSubscribeServiceImpl.java

@@ -408,24 +408,24 @@ public class UserSubscribeServiceImpl extends ServiceImpl<UserSubscribeMapper, U
             }
             if (informRemindVo.getNoteStatus().equals(1)) {
                 //暂时不发送短信
-//                InformUserAddBo informUserAddBo = new InformUserAddBo();
-//                informUserAddBo.setUserId(bo.getUserId());
-//                informUserAddBo.setSendTime(DateUtils.getNowTime());
-//                informUserAddBo.setSendStatus(1);
-//                informUserAddBo.setCreateTime(DateUtils.getNowTime());
-//                informUserAddBo.setUpdateTime(DateUtils.getNowTime());
-//                informUserAddBo.setRemindId(informRemindVo.getId());
-//                informUserAddBo.setSystemStatus(3);
-//                informUserAddBo.setRemind("考试预约成功提醒");
-//                informUserAddBo.setGoodsId(bo.getGoodsId());
-//                GoodsVo goodsVo1 = iGoodsService.queryById(bo.getGoodsId());
-//                informUserAddBo.setText("尊敬的用户:已成功预约施工现场专业人员" + goodsVo1.getGoodsName() + "考试");
-//                content = "尊敬的用户:已成功预约施工现场专业人员" + goodsVo1.getGoodsName() + "考试";
-//                iInformUserService.insertByAddBo(informUserAddBo);
-//                UserVo userVo = iUserService.queryById(bo.getUserId());
-//                Map<String, Object> param = new HashMap<>();
-//                param.put("goods", goodsVo1.getGoodsName());
-//                IAliSmsService.sendInformSms(userVo.getTelphone(), JSON.toJSONString(param), reservationSuccess);
+                InformUserAddBo informUserAddBo = new InformUserAddBo();
+                informUserAddBo.setUserId(bo.getUserId());
+                informUserAddBo.setSendTime(DateUtils.getNowTime());
+                informUserAddBo.setSendStatus(1);
+                informUserAddBo.setCreateTime(DateUtils.getNowTime());
+                informUserAddBo.setUpdateTime(DateUtils.getNowTime());
+                informUserAddBo.setRemindId(informRemindVo.getId());
+                informUserAddBo.setSystemStatus(3);
+                informUserAddBo.setRemind("考试预约成功提醒");
+                informUserAddBo.setGoodsId(bo.getGoodsId());
+                GoodsVo goodsVo1 = iGoodsService.queryById(bo.getGoodsId());
+                informUserAddBo.setText("尊敬的用户:已成功预约施工现场专业人员" + goodsVo1.getGoodsName() + "考试");
+                content = "尊敬的用户:已成功预约施工现场专业人员" + goodsVo1.getGoodsName() + "考试";
+                iInformUserService.insertByAddBo(informUserAddBo);
+                UserVo userVo = iUserService.queryById(bo.getUserId());
+                Map<String, Object> param = new HashMap<>();
+                param.put("goods", goodsVo1.getGoodsName());
+                IAliSmsService.sendInformSms(userVo.getTelphone(), JSON.toJSONString(param), reservationSuccess);
             }
             if (informRemindVo.getGzhTpStatus().equals(1)) {
                 InformUserAddBo informUserAddBo = new InformUserAddBo();
@@ -757,6 +757,14 @@ public class UserSubscribeServiceImpl extends ServiceImpl<UserSubscribeMapper, U
             throw new IllegalArgumentException("不可取消预约");
         }
 
+        //考试前7个工作日不可取消预约
+        Long examTime = update.getApplySiteExamTime();
+        //向前推7个工作日
+        Long applyEndTime = getApplyEndTime(examTime, 7);
+        if (DateUtils.getNowTime() >= applyEndTime){
+            throw new CustomException("考前7个工作日不可取消预约!");
+        }
+
         //用户取消预约考试发送消息
         if (bo.getSubscribeStatus() != null && bo.getSubscribeStatus().equals(2)) {
             UserSubscribeEditBo userSubscribeEditBo = new UserSubscribeEditBo();
@@ -771,6 +779,30 @@ public class UserSubscribeServiceImpl extends ServiceImpl<UserSubscribeMapper, U
         return this.updateById(update);
     }
 
+    private Long getApplyEndTime(Long millisecond, Integer day) {
+        for (Integer i = 0; i < day; i++) {
+            Long dayAfter = DateUtils.getDayBefore(millisecond, 1);
+            Calendar calendar = Calendar.getInstance();
+            calendar.setTime(DateUtils.timeToDate(dayAfter));
+            int index = calendar.get(Calendar.DAY_OF_WEEK) - 1;
+            String[] weeks = new String[]{"星期天", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
+
+            if (weeks[index].equals("星期六") || weeks[index].equals("星期天")) {
+                day += 1;
+
+            }
+            //判断当前是否为工作日
+            if (!DateUtils.isWorkingDay(dayAfter)) {
+                day += 1;
+            }
+            millisecond = dayAfter;
+        }
+
+        return millisecond;
+    }
+
+
+
     /**
      * 保存前的数据校验
      *
@@ -2088,6 +2120,11 @@ public class UserSubscribeServiceImpl extends ServiceImpl<UserSubscribeMapper, U
                     .eq(ExamApplySiteTime::getApplySiteId, site.getId())
                     .last("limit 1"));
             if (ObjectUtils.isNotNull(siteTime)){
+                Long examTime = siteTime.getExamTime();
+                Long applyEndTime = getApplyEndTime(examTime, 7);
+                if (DateUtils.getNowTime() >= applyEndTime){
+                    throw new CustomException("该考试场次已停止预约,请选择其他场次");
+                }
                 List<ExamApplySiteTimeTwoAddBo> timeTwoAddBos = JSONArray.parseArray(siteTime.getSiteTime(), ExamApplySiteTimeTwoAddBo.class);
                 ExamApplySiteTimeTwoAddBo twoAddBo = timeTwoAddBos.stream().findFirst().orElse(null);
                 if (ObjectUtils.isNotNull(twoAddBo)){
@@ -2381,6 +2418,73 @@ public class UserSubscribeServiceImpl extends ServiceImpl<UserSubscribeMapper, U
         sendExamSucceed(userSubscribeAddBo);
     }
 
+    @Override
+    public void examApplySubscribeCancel(ExamApplySubscribeBo bo) {
+        //学员校验
+        User user = iUserService.getOne(new LambdaQueryWrapper<User>()
+                .eq(ObjectUtils.isNotNull(bo.getIdCard()), User::getIdCard, EncryptHandler.encrypt(bo.getIdCard()))
+                .eq(ObjectUtil.isNotNull(bo.getTelphone()), User::getTelphone, EncryptHandler.encrypt(bo.getTelphone()))
+                .last("limit 1"));
+        if (ObjectUtil.isNull(user)){
+            throw new CustomException("学员信息查询不到!请检查");
+        }
+
+        //考场信息
+        ExamApply examApply = iExamApplyService.getById(bo.getSignId());
+        if (ObjectUtil.isNull(examApply)){
+            throw new CustomException("考场信息查询不到!请检查");
+        }
+        List<Long> goodsIds = iExamApplyService.getApplyGoodsId(examApply.getApplyId(),bo.getMajorName());
+        if (CollectionUtils.isEmpty(goodsIds)){
+            throw new CustomException("该专业下找不到考试对应的课程!请检查");
+        }
+
+        //是否存在订单
+        List<OrderGoods> orderGoodsList = iOrderGoodsService.getApplyOrderGoods(goodsIds,user.getUserId());
+        if (CollectionUtils.isEmpty(orderGoodsList)){
+            throw new CustomException("当前学员没有购买该专业下的课程!请检查");
+        }
+        OrderGoods applyOrder = null;
+        for (OrderGoods orderGoods : orderGoodsList) {
+            ClassGradeUser gradeUser = iClassGradeUserService
+                    .getOne(new LambdaQueryWrapper<ClassGradeUser>()
+                            .eq(ClassGradeUser::getUserId, user.getUserId())
+                            .eq(ClassGradeUser::getGradeId, orderGoods.getGradeId())
+                            .eq(ClassGradeUser::getOrderGoodsId, orderGoods.getOrderGoodsId())
+                            .last("limit 1"));
+            if (ObjectUtil.isNotNull(gradeUser)){
+                //学时是否通过审核
+                if (ObjectUtils.isNotNull(gradeUser.getPeriodStatus()) && gradeUser.getPeriodStatus() == 1){
+                    applyOrder = orderGoods;
+                }
+            }
+        }
+
+        if(Validator.isEmpty(applyOrder)){
+            throw new CustomException("该学员未预约考试!");
+        }
+
+        //查询是否已预约考试
+        ExamApplyQueryBo queryBo = new ExamApplyQueryBo();
+        queryBo.setUserId(user.getUserId());
+        queryBo.setGoodsId(applyOrder.getGoodsId());
+        queryBo.setOrderGoodsId(applyOrder.getOrderGoodsId());
+        UserSubscribe subscribe = examApplyMapper.getHaveSubscribe(queryBo);
+        if (ObjectUtils.isNull(subscribe)) {
+            throw new CustomException("该学员未预约考试,请检查数据!");
+        }
+        //取消预约
+        subscribe.setSubscribeStatus(2);
+        updateById(subscribe);
+
+        //B端取消 消息通知
+        UserSubscribeEditBo userSubscribeEditBo = new UserSubscribeEditBo();
+        Long[] subIds = new Long[1];
+        subIds[0] = subscribe.getSubscribeId();
+        userSubscribeEditBo.setSubscribeId(subIds);
+        sendExamcancel(userSubscribeEditBo);
+    }
+
     /**
      * 学员学时图片修改
      * @author change
@@ -2405,12 +2509,9 @@ public class UserSubscribeServiceImpl extends ServiceImpl<UserSubscribeMapper, U
             throw new CustomException("照片和学员不匹配,请检查!");
         }
         try {
-            String upload = String.format("%s?x-oss-process=image/rotate,%s",bo.getImageUrl(),bo.getDegree());
-
-            List<Long> ids = recordPhotos.stream().map(UserStudyRecordPhoto::getId).collect(Collectors.toList());
-            iUserStudyRecordPhotoService.updateBatchByIdNotTenant(ids,upload);
+            ossService.processObject(bo.getImageUrl(),bo.getImageUrl(),String.format("image/rotate,%s",bo.getDegree()));
 
-            InputStream newUpload = ossService.getStreamByObject(upload);
+            InputStream newUpload = ossService.getStreamByObject(bo.getImageUrl());
             ByteArrayOutputStream swapStream = new ByteArrayOutputStream();
             byte[] buff = new byte[100];
             int rc = 0;
@@ -2427,6 +2528,8 @@ public class UserSubscribeServiceImpl extends ServiceImpl<UserSubscribeMapper, U
     }
 
 
+
+
     private Integer getSeatNumber(UserSubscribeAddBo bo,Long userNum) {
         List<UserSubscribe> list = list(new LambdaQueryWrapper<UserSubscribe>().eq(UserSubscribe::getApplyId, bo.getApplyId())
                 .eq(UserSubscribe::getApplySiteStartTime, bo.getApplySiteStartTime())

+ 14 - 0
zhongzheng-system/src/main/resources/mapper/modules/exam/ExamApplyMapper.xml

@@ -270,6 +270,20 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
           and us.apply_id = #{applyId}
     </select>
 
+    <select id="getHaveSubscribe" parameterType="com.zhongzheng.modules.exam.bo.ExamApplyQueryBo" resultType="com.zhongzheng.modules.user.domain.UserSubscribe">
+        SELECT
+            *
+        FROM
+            user_subscribe us
+        WHERE
+            1 =1
+          and us.user_id = #{userId}
+          and us.exam_status = 0
+          and subscribe_status = 1
+          and us.goods_id = #{goodsId}
+          and us.order_goods_id = #{orderGoodsId}
+    </select>
+
     <select id="countHaveSubscribe" parameterType="com.zhongzheng.modules.exam.bo.ExamApplyQueryBo" resultType="integer">
         SELECT
             COUNT(1)

+ 48 - 0
zhongzheng-system/src/main/resources/mapper/modules/settle/ExamActivityMapper.xml

@@ -0,0 +1,48 @@
+<?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.top.settle.mapper.TopInstSettleMapper">
+
+    <select id="getOrderInfo" parameterType="java.lang.String" resultType="com.zhongzheng.modules.top.settle.vo.TopOrderInfoVo">
+        SELECT
+            order_sn,
+            create_no,
+            create_username,
+            purchase_org AS clientName,
+            order_from,
+            check_status
+        FROM
+            v_top_order
+        WHERE
+            order_sn = #{orderSn}
+    </select>
+
+    <select id="getOrderBusiness" parameterType="java.lang.String" resultType="java.lang.String">
+        SELECT
+            business_full_name
+        FROM
+            v_top_order_business
+        WHERE
+            order_sn = #{orderSn}
+    </select>
+
+    <select id="geTopCostBusinessName" parameterType="java.lang.Long" resultType="java.lang.String">
+        SELECT CONCAT(( SELECT education_name FROM top_course_education_type WHERE id = ct.education_type_id ),
+                      ( SELECT business_name FROM top_course_business WHERE id = ct.business_id ),
+                      ( SELECT project_name FROM top_course_project_type WHERE id = ct.project_id )
+                   )
+        FROM
+            top_cost_tp_item ct
+        WHERE
+            ct.tp_id = #{id}
+    </select>
+
+    <select id="getGoodsBusinessName" parameterType="map" resultType="java.lang.String">
+        SELECT business_full_name FROM v_top_order_business WHERE order_goods_id = #{orderGoodsId} AND order_sn = #{orderSn}
+    </select>
+
+    <select id="getOrderGoodsByBusiness" parameterType="map" resultType="java.lang.Long">
+        SELECT order_goods_id FROM v_top_order_business WHERE order_sn = #{orderSn} AND INSTR(business_full_name,#{tpBusinessName})
+    </select>
+</mapper>