yangdamao 2 gadi atpakaļ
vecāks
revīzija
a396505d70
31 mainītis faili ar 1313 papildinājumiem un 170 dzēšanām
  1. 26 9
      zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/common/CommonController.java
  2. 23 0
      zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/order/TopOldOrderController.java
  3. 10 0
      zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/system/SysTenantController.java
  4. 1 0
      zhongzheng-admin-saas/src/main/resources/application-dev.yml
  5. 3 0
      zhongzheng-admin/src/main/resources/application-dev.yml
  6. 5 0
      zhongzheng-api/src/main/resources/application-dev.yml
  7. 24 1
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/SysTenantServiceImpl.java
  8. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/domain/Order.java
  9. 5 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/domain/OrderGoods.java
  10. 97 4
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderGoodsRefundServiceImpl.java
  11. 122 24
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderServiceImpl.java
  12. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/system/service/ISysTenantService.java
  13. 0 20
      zhongzheng-system/src/main/java/com/zhongzheng/modules/system/vo/SysTenantAccountVo.java
  14. 24 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/system/vo/SysTenantBankAccountVo.java
  15. 2 7
      zhongzheng-system/src/main/java/com/zhongzheng/modules/system/vo/SysTenantVo.java
  16. 31 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/financial/bo/CheckOrderStudentBo.java
  17. 23 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/financial/bo/CheckOrderStudentDetailBo.java
  18. 34 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/financial/bo/OrderBrokerageBo.java
  19. 63 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/financial/bo/OrderRefundPayBo.java
  20. 36 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/financial/vo/OrderRefundPayDetailVo.java
  21. 11 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/goods/bo/TopOldOrderAddBo.java
  22. 9 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/goods/bo/TopUpdateRemarkBo.java
  23. 8 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/goods/domain/TopOldOrder.java
  24. 5 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/goods/domain/TopOldOrderGoods.java
  25. 8 8
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/goods/service/ITopOldOrderService.java
  26. 504 91
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/goods/service/impl/TopOldOrderServiceImpl.java
  27. 13 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/goods/vo/TopRefundOrderDetailVo.java
  28. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/order/domain/TopOrderBankPay.java
  29. 1 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/order/service/impl/TopOrderBankPayServiceImpl.java
  30. 179 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/wx/service/impl/WxPayServiceImpl.java
  31. 39 4
      zhongzheng-system/src/main/resources/mapper/modules/top/TopCostTpItemMapper.xml

+ 26 - 9
zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/common/CommonController.java

@@ -45,17 +45,10 @@ import com.zhongzheng.modules.sdk.service.NuonuoService;
 import com.zhongzheng.modules.system.bo.SysTenantQueryBo;
 import com.zhongzheng.modules.system.service.ISysConfigService;
 import com.zhongzheng.modules.system.service.ISysTenantService;
-import com.zhongzheng.modules.top.financial.bo.TopOrderProceedsBo;
-import com.zhongzheng.modules.top.financial.bo.TopOrderRemindBo;
-import com.zhongzheng.modules.top.financial.bo.TopOrderRevocationBo;
-import com.zhongzheng.modules.top.financial.bo.TopSellerDiscountBo;
+import com.zhongzheng.modules.top.financial.bo.*;
 import com.zhongzheng.modules.top.financial.vo.TopOrderRevocationVo;
 import com.zhongzheng.modules.top.financial.vo.TopSellerDiscountVo;
-import com.zhongzheng.modules.top.goods.bo.TopFinishOrderBo;
-import com.zhongzheng.modules.top.goods.bo.TopOldOrderAddBo;
-import com.zhongzheng.modules.top.goods.bo.TopOldOrderCheckBo;
-import com.zhongzheng.modules.top.goods.bo.TopOldOrderQueryBo;
-import com.zhongzheng.modules.top.goods.bo.TopOrderRefundApplyBo;
+import com.zhongzheng.modules.top.goods.bo.*;
 import com.zhongzheng.modules.top.goods.service.ITopOldOrderService;
 import com.zhongzheng.modules.top.order.bo.PayOrderCallBackBo;
 import com.zhongzheng.modules.wx.bo.WxInfoBo;
@@ -222,6 +215,30 @@ public class CommonController extends BaseController {
         return toAjax(iTopOldOrderService.editOrderCheck(bo) ? 1 : 0);
     }
 
+    /**
+     * 批量修改订单备注
+     */
+    @ApiOperation("批量修改订单备注")
+        @PostMapping("/update/order/remark")
+    public AjaxResult<Void> updateRemark(@RequestBody TopUpdateRemarkBo bo) {
+        if(!ToolsUtils.checkSignFromOldSys(bo.getStamp().toString(),bo.getSign())){
+            throw new CustomException("签名错误");
+        }
+        return toAjax(iTopOldOrderService.updateRemark(bo) ? 1 : 0);
+    }
+
+    /**
+     * 订单修改(不审核)
+     */
+    @ApiOperation("订单修改(不审核)")
+    @PostMapping("/update/order/info")
+    public AjaxResult<Void> updateOrderInfo(@RequestBody TopOldOrderAddBo bo) {
+        if(!ToolsUtils.checkOrderSignFromOldSys(bo.getOrderSn(),bo.getStamp().toString(),bo.getSign())){
+            throw new CustomException("签名错误");
+        }
+        return toAjax(iTopOldOrderService.updateOrderInfo(bo) ? 1 : 0);
+    }
+
     /**
      * B端订单审核修改通知
      */

+ 23 - 0
zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/order/TopOldOrderController.java

@@ -7,6 +7,8 @@ import com.zhongzheng.common.core.page.TableDataInfo;
 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.financial.bo.OrderRefundPayBo;
+import com.zhongzheng.modules.top.financial.vo.OrderRefundPayDetailVo;
 import com.zhongzheng.modules.top.financial.vo.TopCostTpVo;
 import com.zhongzheng.modules.top.financial.vo.TopOrderLogVo;
 import com.zhongzheng.modules.top.goods.bo.*;
@@ -268,4 +270,25 @@ public class TopOldOrderController extends BaseController {
         return getDataTable(list);
     }
 
+    /**
+     * 订单退款支付
+     */
+    @ApiOperation("订单退款支付")
+    @PostMapping("/refund/pay")
+    public AjaxResult<Void> orderRefundPay(@RequestBody OrderRefundPayBo bo) {
+        TopLoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setLoginId(loginUser.getUser().getUserId());
+        bo.setLoginName(loginUser.getUser().getUserName());
+        return toAjax(iTopOldOrderService.orderRefundPay(bo) ? 1 : 0);
+    }
+
+    /**
+     * 机构账号信息
+     */
+    @ApiOperation("机构账号信息")
+    @GetMapping("/refund/pay/detail/{orderSn}")
+    public AjaxResult<OrderRefundPayDetailVo> getOrderRefundPayDetail(@PathVariable("orderSn")String orderSn) {
+        return AjaxResult.success(iTopOldOrderService.getOrderRefundPayDetail(orderSn));
+    }
+
 }

+ 10 - 0
zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/system/SysTenantController.java

@@ -7,6 +7,7 @@ import com.zhongzheng.modules.system.bo.SysTenantAddBo;
 import com.zhongzheng.modules.system.bo.SysTenantEditBo;
 import com.zhongzheng.modules.system.bo.SysTenantQueryBo;
 import com.zhongzheng.modules.system.service.ISysTenantService;
+import com.zhongzheng.modules.system.vo.SysTenantBankAccountVo;
 import com.zhongzheng.modules.system.vo.SysTenantVo;
 import lombok.RequiredArgsConstructor;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -78,6 +79,15 @@ public class SysTenantController extends BaseController {
         return AjaxResult.success(iSysTenantService.queryById(tenantId));
     }
 
+    /**
+     * 获取系统商户银行账号信息
+     */
+    @ApiOperation("获取系统商户银行账号信息")
+    @GetMapping("/bank/{tenantId}")
+    public AjaxResult<List<SysTenantBankAccountVo>> getBankAccountList(@PathVariable("tenantId" ) Long tenantId) {
+        return AjaxResult.success(iSysTenantService.getBankAccountList(tenantId));
+    }
+
     /**
      * 新增系统商户
      */

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

@@ -159,6 +159,7 @@ oldOrder:
     finishOrder: http://gdxypx.xy.com/WitSystem/BussinessApi/CompleteOrder
     refuseCheck: http://gdxypx.xy.com/WitSystem/BussinessApi/ReFundAuditResult
     inputOrderSn: http://gdxypx.xy.com/WitSystem/BussinessApi/GetNewYxtinputOrderSn
+    checkOrderStudent: http://gdxypx.xy.com/WitSystem/BussinessApi/ReAuditUnderOrder
 
 oldSys:
     host: http://gdxypx.xy.com

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

@@ -158,6 +158,9 @@ oldOrder:
     studyRecord: http://gdxypx.xy.com/WitSystem/BussinessApi/GetStudyRecord
     orderCheck: http://gdxypx.xy.com/WitSystem/BussinessApi/AuditUnderOrder
     finishOrder: http://gdxypx.xy.com/WitSystem/BussinessApi/CompleteOrder
+    refuseCheck: http://gdxypx.xy.com/WitSystem/BussinessApi/ReFundAuditResult
+    inputOrderSn: http://gdxypx.xy.com/WitSystem/BussinessApi/GetNewYxtinputOrderSn
+    checkOrderStudent: http://gdxypx.xy.com/WitSystem/BussinessApi/ReAuditUnderOrder
 
 oldSys:
     host: http://gdxypx.xy.com

+ 5 - 0
zhongzheng-api/src/main/resources/application-dev.yml

@@ -158,6 +158,11 @@ Nuonuo:
 
 oldOrder:
     studyRecord: http://gdxypx.xy.com/WitSystem/BussinessApi/GetStudyRecord
+    orderCheck: http://gdxypx.xy.com/WitSystem/BussinessApi/AuditUnderOrder
+    finishOrder: http://gdxypx.xy.com/WitSystem/BussinessApi/CompleteOrder
+    refuseCheck: http://gdxypx.xy.com/WitSystem/BussinessApi/ReFundAuditResult
+    inputOrderSn: http://gdxypx.xy.com/WitSystem/BussinessApi/GetNewYxtinputOrderSn
+    checkOrderStudent: http://gdxypx.xy.com/WitSystem/BussinessApi/ReAuditUnderOrder
 
 oldSys:
     host: http://gdxypx.xy.com

+ 24 - 1
zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/SysTenantServiceImpl.java

@@ -4,9 +4,12 @@ import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.lang.Validator;
 import cn.hutool.core.util.StrUtil;
 
+import com.alibaba.fastjson.JSONArray;
+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.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.github.pagehelper.Page;
@@ -21,6 +24,8 @@ import com.zhongzheng.modules.system.domain.SysTenant;
 import com.zhongzheng.modules.system.mapper.SysRoleMenuMapper;
 import com.zhongzheng.modules.system.mapper.SysTenantMapper;
 import com.zhongzheng.modules.system.service.*;
+import com.zhongzheng.modules.system.vo.SysTenantAccountVo;
+import com.zhongzheng.modules.system.vo.SysTenantBankAccountVo;
 import com.zhongzheng.modules.system.vo.SysTenantVo;
 import org.apache.commons.lang3.RandomStringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -90,7 +95,12 @@ public class SysTenantServiceImpl extends ServiceImpl<SysTenantMapper, SysTenant
         List<SysTenantVo> voList = collection.stream()
                 .map(any -> {
                     SysTenantVo sysTenantVo = BeanUtil.toBean(any, SysTenantVo.class);
-                    String accountInformation = any.getAccountInformation();
+                    if (StringUtils.isNotBlank(any.getAccountInformation())){
+                        String accountInformation = any.getAccountInformation();
+                        List<SysTenantAccountVo> accountVo = JSONArray.parseArray(accountInformation, SysTenantAccountVo.class);
+                        sysTenantVo.setAccountList(accountVo);
+                    }
+
                     return sysTenantVo;
                 })
                 .collect(Collectors.toList());
@@ -396,6 +406,19 @@ public class SysTenantServiceImpl extends ServiceImpl<SysTenantMapper, SysTenant
         }
     }
 
+    @Override
+    public List<SysTenantBankAccountVo> getBankAccountList(Long tenantId) {
+        SysTenant tenant = getById(tenantId);
+        if (ObjectUtils.isNull(tenant)){
+            throw new CustomException("机构信息获取失败!");
+        }
+        if (StringUtils.isBlank(tenant.getAccountInformation())){
+            return new ArrayList<>();
+        }
+        String accountInformation = tenant.getAccountInformation();
+        return JSONArray.parseArray(accountInformation,SysTenantBankAccountVo.class);
+    }
+
     private void initRoles(Long newTenantId,Long tenantId) {
         List<String> roleKey = new ArrayList<>();
         roleKey.add("seller");

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

@@ -148,6 +148,8 @@ private static final long serialVersionUID=1L;
     private Integer invoiceStatus;
     /** 完单状态:0未完单,1已完单 */
     private Integer finishStatus;
+    /** 完单时间 */
+    private Long accomplishTime;
     /** 盈亏(元) */
     private BigDecimal orderProfit;
     /** 成本(元) */

+ 5 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/domain/OrderGoods.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.FieldFill;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import lombok.experimental.Accessors;
@@ -87,4 +88,8 @@ private static final long serialVersionUID=1L;
     private String distributionCode;
     /** 分销链编码 */
     private String distributionLinkCode;
+    @ApiModelProperty("分成模式 1机构分成 2业务员分成")
+    private Integer divideModel;
+    @ApiModelProperty("分成钱")
+    private BigDecimal divideMoney;
 }

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

@@ -57,6 +57,8 @@ import com.zhongzheng.modules.order.vo.OrderGoodsVo;
 import com.zhongzheng.modules.order.vo.OrderShareGoodsVo;
 import com.zhongzheng.modules.order.vo.OrderShareToOldVo;
 import com.zhongzheng.modules.system.service.ISysUserService;
+import com.zhongzheng.modules.top.goods.domain.TopOldOrderRefund;
+import com.zhongzheng.modules.top.goods.service.ITopOldOrderRefundService;
 import com.zhongzheng.modules.user.bo.UserExamGoodsQueryBo;
 import com.zhongzheng.modules.user.bo.UserExamRecordQueryBo;
 import com.zhongzheng.modules.user.bo.UserStudyRecordQueryBo;
@@ -125,6 +127,8 @@ public class OrderGoodsRefundServiceImpl extends ServiceImpl<OrderGoodsRefundMap
     private IDistributionSellerService iDistributionSellerService;
     @Autowired
     private IDistributionRebateService iDistributionRebateService;
+    @Autowired
+    private ITopOldOrderRefundService topOldOrderRefundService;
     @Value("${oldStudySys.shareCanclePath}")
     private String SHARE_CANCLE_PATH;
 
@@ -255,17 +259,31 @@ public class OrderGoodsRefundServiceImpl extends ServiceImpl<OrderGoodsRefundMap
             throw new CustomException("直播商品不能退款");
         }
 
-        OrderGoodsRefund add = BeanUtil.toBean(bo, OrderGoodsRefund.class);
-        validEntityBeforeSave(add);
+//        OrderGoodsRefund add = BeanUtil.toBean(bo, OrderGoodsRefund.class);
+//        validEntityBeforeSave(add);
+//        add.setCreateTime(DateUtils.getNowTime());
+//        add.setUpdateTime(DateUtils.getNowTime());
+//        //退款单号
+//        add.setRefundSn(DateUtils.getDateOrderSn());
+//        add.setRefundFee(orderGoods.getGoodsReceived());
+//        add.setUserId(order.getUserId());
+//        add.setType(OrderGoodsRefund.TYPE_SMALL);
+//        add.setOrderGoodsId(orderGoods.getOrderGoodsId());
+//        this.save(add);
+        //退款推送总平台
+        TopOldOrderRefund add = BeanUtil.toBean(bo, TopOldOrderRefund.class);
         add.setCreateTime(DateUtils.getNowTime());
         add.setUpdateTime(DateUtils.getNowTime());
         //退款单号
         add.setRefundSn(DateUtils.getDateOrderSn());
         add.setRefundFee(orderGoods.getGoodsReceived());
         add.setUserId(order.getUserId());
-        add.setType(OrderGoodsRefund.TYPE_SMALL);
+        add.setType(3);//新云学堂C端退款
+        add.setPeriodStatus(0);//待审核
         add.setOrderGoodsId(orderGoods.getOrderGoodsId());
-        this.save(add);
+        topOldOrderRefundService.save(add);
+
+
         //修改订单状态
         iOrderGoodsService.update(new LambdaUpdateWrapper<OrderGoods>()
         .set(OrderGoods::getRefundStatus,1)
@@ -690,6 +708,81 @@ public class OrderGoodsRefundServiceImpl extends ServiceImpl<OrderGoodsRefundMap
         return true;
     }
 
+
+//    public Boolean topOrderRefund(){
+//        if (ObjectUtils.isNull(bo.getRealRefundFee())){
+//            //如果实际退款金额为空 则默认全部退款
+//            bo.setRealRefundFee(bo.getRefundFee());
+//        }
+//        LambdaUpdateWrapper<OrderGoodsRefund> objectLambdaUpdateWrapper = Wrappers.lambdaUpdate();
+//        objectLambdaUpdateWrapper.eq(OrderGoodsRefund::getRefundId, bo.getRefundId());
+//        objectLambdaUpdateWrapper.set(OrderGoodsRefund::getPeriodStatus, bo.getPeriodStatus());
+//        objectLambdaUpdateWrapper.set(OrderGoodsRefund::getUpdateTime,DateUtils.getNowTime());
+//        objectLambdaUpdateWrapper.set(OrderGoodsRefund::getPeriodReviewUsername, SecurityUtils.getUsername());
+//        objectLambdaUpdateWrapper.set(OrderGoodsRefund::getPeriodReviewTime,DateUtils.getNowTime());
+//        if(Validator.isNotEmpty(bo.getPeriodReviewReason())){
+//            objectLambdaUpdateWrapper.set(OrderGoodsRefund::getPeriodReviewReason, bo.getPeriodReviewReason());
+//        }
+//        //上一次是待退款状态,本次已退款
+//        if(orderGoodsRefund.getPeriodStatus()==2&&bo.getPeriodStatus()==3){
+//            objectLambdaUpdateWrapper.set(OrderGoodsRefund::getRefundTime,DateUtils.getNowTime());
+//        }
+//        //上一次是初审状态,本次已退款
+//        if(orderGoodsRefund.getPeriodStatus()==1&&bo.getPeriodStatus()==3){
+//            objectLambdaUpdateWrapper.set(OrderGoodsRefund::getRefundTime,DateUtils.getNowTime())
+//                    .set(OrderGoodsRefund::getRealRefundFee,bo.getRealRefundFee());
+//        }
+//        //上一次是初审状态,本次待退款
+//        if(orderGoodsRefund.getPeriodStatus()==1&&bo.getPeriodStatus()==2){
+//            objectLambdaUpdateWrapper.set(OrderGoodsRefund::getPeriodReviewTime,DateUtils.getNowTime());
+//        }
+//
+//        this.update(null, objectLambdaUpdateWrapper);
+//
+//        //同意且已退款
+//        if(bo.getPeriodStatus()==3){
+//            //修改订单商品退款状态
+//            OrderGoods orderGoodsUpdate = new OrderGoods();
+//            orderGoodsUpdate.setOrderGoodsId(orderGoodsRefund.getOrderGoodsId());
+//            orderGoodsUpdate.setRefundStatus(2); //同意退款
+//            orderGoodsUpdate.setUpdateTime(DateUtils.getNowTime());
+//            iOrderGoodsService.updateById(orderGoodsUpdate);
+//            if (ObjectUtils.isNotNull(bo.getType()) && bo.getType() == 1){
+//                //小程序/H5/PC 同意退款处理
+//                Order order = iOrderService.getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderSn, bo.getOrderSn()));
+//                Map<String, String> payResult =  iWxPayService.refund(bo.getRefundSn(),order.getTransid(),bo.getRealRefundFee(),order.getPayPrice());
+//                if("OK".equals(payResult.get("return_msg"))&&Validator.isNotEmpty(payResult.get("refund_id"))){
+//                    OrderGoods orderGoods = iOrderGoodsService.getById(bo.getOrderGoodsId());
+//                    Goods goods = iGoodsService.getById(bo.getGoodsId());
+//                    if (StringUtils.isNotBlank(orderGoods.getDistributionCode())){
+//                        //处理分销订单
+//                        distributionRefund(orderGoods);
+//                    }
+//                    refundCall(payResult.get("refund_id"),bo.getRefundId(),orderGoods.getOrderGoodsId(),order,goods.getGoodsType(),orderGoods.getGradeId(),bo.getUserId(),goods.getGoodsId());
+//                    //关闭C端用户的分销返利
+//                    shareClientCancelOldSys(order,orderGoods,bo.getRealRefundFee());
+//                    return true;
+//                }else{
+//                    throw new CustomException("退款错误"+ JSON.toJSONString(payResult));
+//                }
+//            }else {
+//                //清除数据
+//                OrderGoods orderGoods = iOrderGoodsService.getOne(new LambdaQueryWrapper<OrderGoods>().eq(OrderGoods::getOrderGoodsId,orderGoodsRefund.getOrderGoodsId()));
+//                Goods goods = iGoodsService.getOne(new LambdaQueryWrapper<Goods>().eq(Goods::getGoodsId,orderGoodsRefund.getGoodsId()));
+//                clearData(orderGoods.getGradeId(),orderGoodsRefund.getUserId(),orderGoods.getOrderGoodsId(),orderGoodsRefund.getGoodsId(),goods.getGoodsType());
+//            }
+//        }
+//        if(bo.getPeriodStatus()==-2){
+//            //修改订单商品退款状态
+//            OrderGoods orderGoodsUpdate = new OrderGoods();
+//            orderGoodsUpdate.setOrderGoodsId(orderGoodsRefund.getOrderGoodsId());
+//            orderGoodsUpdate.setRefundStatus(ObjectUtils.isNotNull(bo.getType()) && bo.getType() == 2 ? 3:0); //拒绝退款
+//            orderGoodsUpdate.setUpdateTime(DateUtils.getNowTime());
+//            iOrderGoodsService.updateById(orderGoodsUpdate);
+//        }
+//        return true;
+//    }
+
     private void distributionRefund(OrderGoods orderGoods) {
         List<DistributionCashLog> cashLogList = iDistributionCashLogService
                 .list(new LambdaQueryWrapper<DistributionCashLog>()

+ 122 - 24
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderServiceImpl.java

@@ -69,7 +69,9 @@ import com.zhongzheng.modules.order.vo.OrderListVo;
 import com.zhongzheng.modules.order.vo.OrderPayVo;
 import com.zhongzheng.modules.order.vo.OrderVo;
 import com.zhongzheng.modules.system.domain.SysOldOrg;
+import com.zhongzheng.modules.system.domain.SysTenant;
 import com.zhongzheng.modules.system.service.ISysOldOrgService;
+import com.zhongzheng.modules.system.service.ISysTenantService;
 import com.zhongzheng.modules.top.financial.domain.TopCostTp;
 import com.zhongzheng.modules.top.financial.domain.TopCostTpItem;
 import com.zhongzheng.modules.top.financial.service.ITopCostTpItemService;
@@ -77,9 +79,9 @@ import com.zhongzheng.modules.top.financial.service.ITopCostTpService;
 import com.zhongzheng.modules.top.financial.vo.TopCostTpItemVo;
 import com.zhongzheng.modules.top.financial.vo.TopCostTpVo;
 import com.zhongzheng.modules.top.goods.bo.TopOldOrderGoodsAddBo;
-import com.zhongzheng.modules.top.goods.domain.TopCourseBusiness;
-import com.zhongzheng.modules.top.goods.domain.TopCourseEducationType;
-import com.zhongzheng.modules.top.goods.domain.TopCourseProjectType;
+import com.zhongzheng.modules.top.goods.domain.*;
+import com.zhongzheng.modules.top.goods.service.ITopOldOrderCheckLogService;
+import com.zhongzheng.modules.top.goods.service.ITopOldOrderCheckService;
 import com.zhongzheng.modules.user.domain.User;
 import com.zhongzheng.modules.user.domain.UserExamGoods;
 import com.zhongzheng.modules.user.service.IUserExamGoodsService;
@@ -185,6 +187,12 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
     private ITopCostTpService topCostTpService;
     @Autowired
     private ITopCostTpItemService topCostTpItemService;
+    @Autowired
+    private ISysTenantService sysTenantService;
+    @Autowired
+    private ITopOldOrderCheckService topOldOrderCheckService;
+    @Autowired
+    private ITopOldOrderCheckLogService topOldOrderCheckLogService;
 
 
     @Override
@@ -716,12 +724,8 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
             }
             add.setStatus(1);
         }
-        if (ObjectUtils.isNotNull(bo.getCreateSysUserId()) && bo.getCreateSysUserId() == -1){
-            //todo 旧系统订单
-
-
-        }else {
-            orderCostHandle(add);
+        if (bo.getOrderFrom() != 6){
+            orderCostHandle(add,1);
         }
         this.save(add);
         //处理收费商品,生成计费单
@@ -935,7 +939,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
             iOrderPayService.insertByAddBo(payAddBo);
         }
         //C端订单成本处理
-        orderCostHandle(add);
+        orderCostHandle(add,0);
         this.save(add);
 
         //判断是否红包活动订单
@@ -969,20 +973,32 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
         return payResult;
     }
 
-    private void orderCostHandle(Order add) {
+    private void orderCostHandle(Order add,Integer type) {
         add.setCheckStatus(1);//C端订单不需要审核
         add.setRefundStatus(1);
         add.setInvoiceStatus(0);
-        add.setFinishStatus(0);
+        add.setFinishStatus(type == 1? 1:0);
         add.setCreditStatus(0);
+        add.setOrderBase(1);
         add.setOrderRefund(BigDecimal.ZERO);
         add.setOrderRefunded(BigDecimal.ZERO);
-        add.setOrderUncollected(add.getPayPrice());
-        add.setOrderReceived(BigDecimal.ZERO);
+        if (ObjectUtils.isNotNull(type) && type == 1){
+            //后台录单
+            add.setOrderUncollected(BigDecimal.ZERO);
+            add.setOrderReceived(add.getPayPrice());
+        }else {
+            add.setOrderUncollected(add.getPayPrice());
+            add.setOrderReceived(BigDecimal.ZERO);
+        }
         add.setOrderCost(BigDecimal.ZERO);
         add.setOrderProfit(BigDecimal.ZERO);
 
         String TenantId = ServletUtils.getRequest().getHeader("TenantId");
+        //获取机构分成方式
+        SysTenant tenant = sysTenantService
+                .getOne(new LambdaQueryWrapper<SysTenant>()
+                        .eq(SysTenant::getTenantId,TenantId));
+        Integer divideModel = tenant.getDivideModel();
         //成本和盈亏
         // 获取企业默认成本模板
         TopCostTp costTp = topCostTpService.getOne(new LambdaQueryWrapper<TopCostTp>()
@@ -992,12 +1008,11 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
                     .list(new LambdaQueryWrapper<OrderGoods>()
                             .eq(OrderGoods::getOrderSn, add.getOrderSn())
                             .eq(OrderGoods::getStatus, 1));
-
             TopCostTpVo topCostTpVo = BeanUtil.toBean(costTp, TopCostTpVo.class);
-            List<TopCostTpItemVo> itemVoList = new ArrayList<>();
             //成本项
             BigDecimal costTotal = new BigDecimal("0.00");//成本
             BigDecimal profitTotal = new BigDecimal("0.00"); //盈亏
+            BigDecimal divideTotal = new BigDecimal("0.00");//分成
             for (OrderGoods orderGoods : orderGoodsList) {
                 BigDecimal goodsPrice = orderGoods.getGoodsRealPrice();
                 //商品业务层 新系统默认是学校业务
@@ -1008,10 +1023,14 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
                     continue;
                 }
                 //根据订单金额匹配成本阶梯
-                List<TopCostTpItem> tpItems = items.stream().filter(x ->
-                        (ObjectUtils.isNull(x.getMinValue()) && ObjectUtils.isNull(x.getMaxValue()))
-                                || (goodsPrice.compareTo(x.getMinValue()) > 0 && goodsPrice.compareTo(x.getMaxValue()) < 0)
-                                || (goodsPrice.compareTo(x.getMinValue()) == 0 && goodsPrice.compareTo(x.getMaxValue()) == 0)).collect(Collectors.toList());
+                List<TopCostTpItem> tpItems = new ArrayList<>();
+                for (TopCostTpItem x : items) {
+                    if ((ObjectUtils.isNull(x.getMinValue()) && ObjectUtils.isNull(x.getMaxValue()))
+                            || (goodsPrice.compareTo(x.getMinValue()) > 0 && goodsPrice.compareTo(x.getMaxValue()) < 0)
+                            || (goodsPrice.compareTo(x.getMinValue()) == 0 && goodsPrice.compareTo(x.getMaxValue()) == 0)){
+                        tpItems.add(x);
+                    }
+                }
                 if (CollectionUtils.isEmpty(tpItems)) {
                     //匹配不到成本项阶梯值
                     continue;
@@ -1024,29 +1043,108 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
                 TopCostTpItem topCostTpItem = tpItems.stream().findFirst().get();
                 BigDecimal cost = new BigDecimal("0.00");//成本
                 BigDecimal profit = new BigDecimal("0.00"); //盈亏
+                BigDecimal divideMoney = new BigDecimal("0.00");//分成
                 BigDecimal bigDecimal = new BigDecimal("100");
+                if (topCostTpItem.getDockStatus() == 1){
+                    //启用成本扣除项
+                    switch (topCostTpItem.getDockType()){
+                        case 1://百分比
+                            //成本扣除金额
+                            BigDecimal divide = topCostTpItem.getDockValue().divide(bigDecimal);
+                            BigDecimal multiply = goodsPrice.multiply(divide);
+                            goodsPrice = goodsPrice.subtract(multiply);
+                            break;
+                        case 2://固定金额
+                            goodsPrice = goodsPrice.subtract(topCostTpItem.getDockValue());
+                            break;
+                        default:
+                            break;
+                    }
+
+                }
                 switch (topCostTpItem.getItemType()) {
                     case 1://百分比
                         BigDecimal divide = topCostTpItem.getTypeValue().divide(bigDecimal);
                         cost = goodsPrice.multiply(divide);
                         profit = goodsPrice.subtract(cost);
+                        if (topCostTpItem.getItemCategory() == 1 && add.getFinishStatus() == 1){
+                            //订单已完单 并且是分成成本
+                            divideMoney = goodsPrice.multiply(divide);
+                        }
                         break;
                     case 2://固定金额
                         cost = topCostTpItem.getTypeValue();
                         profit = goodsPrice.subtract(cost);
+                        if (topCostTpItem.getItemCategory() == 1 && add.getFinishStatus() == 1){
+                            //分成
+                            divideMoney = topCostTpItem.getTypeValue();
+                        }
                         break;
                     default:
                         break;
                 }
+                if (add.getFinishStatus() == 1 && divideTotal.compareTo(BigDecimal.ZERO) >0 ){
+                    orderGoods.setDivideModel(divideModel);
+                    orderGoods.setDivideMoney(divideMoney);
+                    iOrderGoodsService.updateById(orderGoods);
+                }
                 costTotal = costTotal.add(cost);
                 profitTotal = profitTotal.add(profit);
-                itemVoList.add(BeanUtil.toBean(topCostTpItem, TopCostTpItemVo.class));
+                divideTotal = divideTotal.add(divideMoney);
+            }
+            List<TopCostTpItem> costTpItemList = topCostTpItemService
+                    .list(new LambdaQueryWrapper<TopCostTpItem>()
+                            .eq(TopCostTpItem::getTpId, costTp.getTpId())
+                            .eq(TopCostTpItem::getStatus, 1));
+            if (CollectionUtils.isNotEmpty(costTpItemList)) {
+                List<TopCostTpItemVo> itemVoList = costTpItemList.stream().map(x -> BeanUtil.toBean(x, TopCostTpItemVo.class)).collect(Collectors.toList());
                 topCostTpVo.setItemList(itemVoList);
             }
-
             add.setOrderCost(costTotal);
             add.setOrderProfit(profitTotal);
             add.setCostJson(JSONObject.toJSONString(topCostTpVo));
+            if (add.getFinishStatus() == 1 && divideTotal.compareTo(BigDecimal.ZERO) >0){
+                add.setDivideModel(divideModel);
+                add.setDivideStatus(2);//待审核
+                add.setCancelTime(DateUtils.getNowTime());
+                if (divideModel == 1) {
+                    //机构分成
+                    add.setDivideCompanyMoney(divideTotal);
+                } else {
+                    //业务员分成
+                    add.setDivideSellerMoney(divideTotal);
+                }
+
+                //创建订单分成审核流程
+                List<TopOldOrderCheck> checkList = topOldOrderCheckService
+                        .list(new LambdaQueryWrapper<TopOldOrderCheck>().in(TopOldOrderCheck::getCheckType, Arrays.asList(5, 6))
+                                .orderByAsc(TopOldOrderCheck::getCheckSort));
+                if (CollectionUtils.isNotEmpty(checkList)) {
+                    List<TopOldOrderCheckLog> logs = new ArrayList<>();
+                    for (int i = 0; i < checkList.size(); i++) {
+                        TopOldOrderCheck check = checkList.get(i);
+                        TopOldOrderCheckLog log = new TopOldOrderCheckLog();
+                        log.setOrderSn(add.getOrderSn());
+                        log.setRoleId(check.getCheckRole());
+                        log.setCheckFrom(divideModel == 1? 2:3);
+                        log.setUpdateTime(DateUtils.getNowTime());
+                        log.setCreateTime(DateUtils.getNowTime());
+                        log.setTenantId(add.getTenantId());
+                        log.setCheckSign(i > 0 ? 0 : 1);
+                        log.setCheckSort(check.getCheckSort());
+                        log.setType(check.getCheckType());
+                        log.setTenantId(Long.valueOf(TenantId));
+                        if (check.getCheckType() == 6) {
+                            //分成支付
+                            log.setCheckStatus(2);//待支付
+                        } else {
+                            log.setCheckStatus(0);//待审核
+                        }
+                        logs.add(log);
+                    }
+                    topOldOrderCheckLogService.saveBatch(logs);
+                }
+            }
         }
 
     }
@@ -1210,7 +1308,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
             iOrderPayService.insertByAddBo(payAddBo);
         }
         //C端订单成本处理
-        orderCostHandle(add);
+        orderCostHandle(add,0);
         this.save(add);
         //处理免费商品
         for (OrderGoods orderGoods : freeList) {
@@ -1365,7 +1463,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
             iOrderPayService.insertByAddBo(payAddBo);
         }
         //C端订单成本处理
-        orderCostHandle(add);
+        orderCostHandle(add,0);
         this.save(add);
 
         //处理免费商品

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

@@ -4,6 +4,7 @@ package com.zhongzheng.modules.system.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.zhongzheng.modules.system.bo.*;
 import com.zhongzheng.modules.system.domain.SysTenant;
+import com.zhongzheng.modules.system.vo.SysTenantBankAccountVo;
 import com.zhongzheng.modules.system.vo.SysTenantVo;
 
 import java.util.Collection;
@@ -60,4 +61,6 @@ public interface ISysTenantService extends IService<SysTenant> {
     void updateRoleTenant(List<Long> tenantIds);
 
 	void updateDictTenant(List<Long> tenantIds);
+
+	List<SysTenantBankAccountVo> getBankAccountList(Long tenantId);
 }

+ 0 - 20
zhongzheng-system/src/main/java/com/zhongzheng/modules/system/vo/SysTenantAccountVo.java

@@ -19,26 +19,6 @@ import lombok.Data;
 public class SysTenantAccountVo {
 	private static final long serialVersionUID = 1L;
 
-	/** 租户ID */
-	@ApiModelProperty("租户ID")
-	private Long tenantId;
-
-	/** 0 失效 1启用 */
-	@ApiModelProperty("0 失效 1启用")
-	private Integer status;
-	/** 名称 */
-	@ApiModelProperty("名称")
-	private String tenantName;
-
-	@ApiModelProperty("地址")
-	private String address;
-
-	@ApiModelProperty("分成模式 1机构分成 2业务员分成")
-	private Integer divideModel;
-
-	@ApiModelProperty("是否有商户号:1是,0否")
-	private Integer commercialTenant;
-
 	@ApiModelProperty("开户银行")
 	private String openingBank;
 

+ 24 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/system/vo/SysTenantBankAccountVo.java

@@ -0,0 +1,24 @@
+package com.zhongzheng.modules.system.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * @author yangdamao
+ * @date 2023年05月10日 18:55
+ */
+@Data
+public class SysTenantBankAccountVo implements Serializable {
+
+    @ApiModelProperty("开户银行")
+    private String openingBank;
+
+    @ApiModelProperty("开户名称")
+    private String openingName;
+
+    @ApiModelProperty("收款账号")
+    private String proceedsAccount;
+}

+ 2 - 7
zhongzheng-system/src/main/java/com/zhongzheng/modules/system/vo/SysTenantVo.java

@@ -7,6 +7,7 @@ import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.util.List;
 
 
 /**
@@ -44,12 +45,6 @@ public class SysTenantVo {
 	private Integer commercialTenant;
 
 	@ApiModelProperty("开户银行")
-	private String openingBank;
-
-	@ApiModelProperty("开户名称")
-	private String openingName;
-
-	@ApiModelProperty("收款账号")
-	private String proceedsAccount;
+	private List<SysTenantAccountVo> accountList;
 
 }

+ 31 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/financial/bo/CheckOrderStudentBo.java

@@ -0,0 +1,31 @@
+package com.zhongzheng.modules.top.financial.bo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author yangdamao
+ * @date 2023年05月10日 17:54
+ */
+@Data
+public class CheckOrderStudentBo implements Serializable {
+
+    @ApiModelProperty("当前时间戳")
+    private Long stamp;
+
+    @ApiModelProperty("签名")
+    private String sign;
+
+    @ApiModelProperty("订单号")
+    private String orderSn;
+
+    @ApiModelProperty("1通过,2不通过")
+    private Integer auditStatus;
+
+    @ApiModelProperty("订单学员数据")
+    private List<CheckOrderStudentDetailBo> data;
+
+}

+ 23 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/financial/bo/CheckOrderStudentDetailBo.java

@@ -0,0 +1,23 @@
+package com.zhongzheng.modules.top.financial.bo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author yangdamao
+ * @date 2023年05月10日 17:54
+ */
+@Data
+public class CheckOrderStudentDetailBo implements Serializable {
+
+    private Long GoodsId;
+
+    private String UserName;
+
+    private String idNum;
+
+    private Integer orderUserItemId;
+}

+ 34 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/financial/bo/OrderBrokerageBo.java

@@ -0,0 +1,34 @@
+package com.zhongzheng.modules.top.financial.bo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * @author yangdamao
+ * @date 2023年05月12日 8:59
+ */
+@Data
+public class OrderBrokerageBo implements Serializable {
+
+    @ApiModelProperty("当前时间戳")
+    @NotBlank(message = "当前时间戳不能为空")
+    private Long stamp;
+
+    @ApiModelProperty("签名")
+    @NotBlank(message = "签名不能为空")
+    private String sign;
+
+    @ApiModelProperty("订单号")
+    private String orderSn;
+
+    @ApiModelProperty("税前佣金")
+    private BigDecimal pretaxBrokerage;
+
+    @ApiModelProperty("税率")
+    private BigDecimal pretax;
+
+}

+ 63 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/financial/bo/OrderRefundPayBo.java

@@ -0,0 +1,63 @@
+package com.zhongzheng.modules.top.financial.bo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * @author yangdamao
+ * @date 2023年05月10日 18:55
+ */
+@Data
+public class OrderRefundPayBo implements Serializable {
+
+    /** 支付号 */
+    @ApiModelProperty("支付号")
+    private String paySn;
+    /** 订单号 */
+    @ApiModelProperty("订单号")
+    private String orderSn;
+    /** 银行账号 */
+    @ApiModelProperty("银行账号")
+    private String toBankAcount;
+    /** 账号名称 */
+    @ApiModelProperty("账号名称")
+    private String toBankName;
+    /** 银行名称 */
+    @ApiModelProperty("银行名称")
+    private String toBankTypeName;
+    /** 金额 */
+    @ApiModelProperty("金额")
+    private BigDecimal money;
+    /** 老机构ID */
+    @ApiModelProperty("老机构ID")
+    private String trainOrgId;
+    /** 创建时间 */
+    @ApiModelProperty("创建时间")
+    private Long createTime;
+    /** 更新时间 */
+    @ApiModelProperty("更新时间")
+    private Long updateTime;
+    /** 1有效 0无效 */
+    @ApiModelProperty("1有效 0无效")
+    private Integer status;
+    /** 参数 */
+    @ApiModelProperty("参数")
+    private String paramJson;
+    /** 支付结果 1成功 0失败 */
+    @ApiModelProperty("支付结果 1回调成功 0支付中未回调 -1回调失败")
+    private Integer resultStatus;
+    @ApiModelProperty("机构ID")
+    private String tenantId;
+    @ApiModelProperty("收方行联行号")
+    private String ToBankConnetNum;
+    @ApiModelProperty("备注")
+    private String remark;
+    private String loginName;
+
+    private Long loginId;
+    @ApiModelProperty("支付平台 1微信,2网银")
+    private Integer payType;
+}

+ 36 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/financial/vo/OrderRefundPayDetailVo.java

@@ -0,0 +1,36 @@
+package com.zhongzheng.modules.top.financial.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * @author yangdamao
+ * @date 2023年05月10日 18:55
+ */
+@Data
+public class OrderRefundPayDetailVo implements Serializable {
+
+    @ApiModelProperty("订单号")
+    private String orderSn;
+
+    @ApiModelProperty("开户银行")
+    private String openingBank;
+
+    @ApiModelProperty("开户名称")
+    private String openingName;
+
+    @ApiModelProperty("收款账号")
+    private String proceedsAccount;
+
+    @ApiModelProperty("退款金额")
+    private BigDecimal refundMoney;
+
+    @ApiModelProperty("支付平台 1微信,2转账")
+    private Integer payType;
+
+    @ApiModelProperty("下单时间")
+    private Long buyTime;
+}

+ 11 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/goods/bo/TopOldOrderAddBo.java

@@ -52,7 +52,7 @@ public class TopOldOrderAddBo {
     @ApiModelProperty("支付时间")
     private Long payTime;
     /** 支付平台  */
-    @ApiModelProperty("支付平台 ")
+    @ApiModelProperty("支付平台 1微信,2网银 ")
     private Integer payType;
     /** 微信流水号 */
     @ApiModelProperty("微信流水号")
@@ -172,4 +172,14 @@ public class TopOldOrderAddBo {
     /** 分成审核状态 1正常 2待审核 3审核中  4审核不通过 5审核通过待支付 6已支付 */
     @ApiModelProperty("分成审核状态 1正常 2待审核 3审核中  4审核不通过 5审核通过待支付 6已支付")
     private Integer divideStatus;
+
+    /** 税前佣金 */
+    @ApiModelProperty("税前佣金")
+    private BigDecimal pretaxBrokerage;
+    /** 税率 */
+    @ApiModelProperty("税率")
+    private BigDecimal pretax;
+    /** 佣金 */
+    @ApiModelProperty("佣金")
+    private BigDecimal brokerage;
 }

+ 9 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/goods/bo/TopUpdateRemarkBo.java

@@ -4,6 +4,7 @@ import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import javax.validation.constraints.NotBlank;
 import java.util.List;
 
 /**
@@ -16,6 +17,14 @@ import java.util.List;
 @ApiModel("订单审核对象")
 public class TopUpdateRemarkBo {
 
+    @ApiModelProperty("当前时间戳")
+    @NotBlank(message = "当前时间戳不能为空")
+    private Long stamp;
+
+    @ApiModelProperty("签名")
+    @NotBlank(message = "签名不能为空")
+    private String sign;
+
     @ApiModelProperty("$column.columnComment")
     private List<Long> orderIdList;
 

+ 8 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/goods/domain/TopOldOrder.java

@@ -86,6 +86,8 @@ private static final long serialVersionUID=1L;
     private Integer invoiceStatus;
     /** 完单状态:0未完单,1已完单 */
     private Integer finishStatus;
+    /** 完单时间 */
+    private Long accomplishTime;
     /** 盈亏(元) */
     private BigDecimal orderProfit;
     /** 成本(元) */
@@ -121,4 +123,10 @@ private static final long serialVersionUID=1L;
     /** 分成审核状态 1正常 2待审核 3审核中  4审核不通过 5审核通过待支付 6已支付 */
     private Integer divideStatus;
     private Long tenantId;
+    /** 税前佣金 */
+    private BigDecimal pretaxBrokerage;
+    /** 税率 */
+    private BigDecimal pretax;
+    /** 佣金 */
+    private BigDecimal brokerage;
 }

+ 5 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/goods/domain/TopOldOrderGoods.java

@@ -82,4 +82,9 @@ private static final long serialVersionUID=1L;
     @ApiModelProperty("学员手机号码")
     private String userPhone;
     private Long tenantId;
+    @ApiModelProperty("分成模式 1机构分成 2业务员分成")
+    private Integer divideModel;
+    @ApiModelProperty("分成钱")
+    private BigDecimal divideMoney;
+
 }

+ 8 - 8
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/goods/service/ITopOldOrderService.java

@@ -2,14 +2,8 @@ package com.zhongzheng.modules.top.goods.service;
 
 
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.zhongzheng.modules.top.financial.bo.TopOrderProceedsBo;
-import com.zhongzheng.modules.top.financial.bo.TopOrderRemindBo;
-import com.zhongzheng.modules.top.financial.bo.TopOrderRevocationBo;
-import com.zhongzheng.modules.top.financial.bo.TopSellerDiscountBo;
-import com.zhongzheng.modules.top.financial.vo.TopCostTpVo;
-import com.zhongzheng.modules.top.financial.vo.TopOrderLogVo;
-import com.zhongzheng.modules.top.financial.vo.TopOrderRevocationVo;
-import com.zhongzheng.modules.top.financial.vo.TopSellerDiscountVo;
+import com.zhongzheng.modules.top.financial.bo.*;
+import com.zhongzheng.modules.top.financial.vo.*;
 import com.zhongzheng.modules.top.goods.bo.*;
 import com.zhongzheng.modules.top.goods.domain.TopOldOrder;
 import com.zhongzheng.modules.top.goods.vo.TopOldOrderGoodsListVo;
@@ -122,4 +116,10 @@ public interface ITopOldOrderService extends IService<TopOldOrder> {
 	boolean orderProceeds(TopOrderProceedsBo bo);
 
 	boolean checkOrderStudent(TopOldOrderCheckBo bo);
+
+    boolean orderRefundPay(OrderRefundPayBo bo);
+
+	OrderRefundPayDetailVo getOrderRefundPayDetail(String orderSn);
+
+	boolean updateOrderInfo(TopOldOrderAddBo bo);
 }

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

@@ -38,6 +38,7 @@ import com.zhongzheng.modules.inform.service.IInformSysUserService;
 import com.zhongzheng.modules.inform.vo.InformRemindVo;
 import com.zhongzheng.modules.order.domain.Order;
 import com.zhongzheng.modules.order.domain.OrderGoods;
+import com.zhongzheng.modules.order.service.IOrderGoodsRefundService;
 import com.zhongzheng.modules.order.service.IOrderGoodsService;
 import com.zhongzheng.modules.system.domain.SysOldOrg;
 import com.zhongzheng.modules.system.domain.SysTenant;
@@ -45,10 +46,8 @@ import com.zhongzheng.modules.system.service.ISysOldOrgService;
 import com.zhongzheng.modules.system.service.ISysTenantService;
 import com.zhongzheng.modules.system.service.ISysUserService;
 import com.zhongzheng.modules.top.financial.bo.TopDivideLogQueryBo;
-import com.zhongzheng.modules.top.financial.bo.TopOrderProceedsBo;
-import com.zhongzheng.modules.top.financial.bo.TopOrderRemindBo;
-import com.zhongzheng.modules.top.financial.bo.TopOrderRevocationBo;
-import com.zhongzheng.modules.top.financial.bo.TopSellerDiscountBo;
+import com.zhongzheng.modules.system.vo.SysTenantAccountVo;
+import com.zhongzheng.modules.top.financial.bo.*;
 import com.zhongzheng.modules.top.financial.domain.*;
 import com.zhongzheng.modules.order.service.IOrderService;
 import com.zhongzheng.modules.top.financial.domain.TopCostTp;
@@ -183,6 +182,12 @@ public class TopOldOrderServiceImpl extends ServiceImpl<TopOldOrderMapper, TopOl
     @Autowired
     private ITopDivideLogService iTopDivideLogService;
 
+    @Autowired
+    private ITopOrderBankPayService topOrderBankPayService;
+
+    @Autowired
+    private IOrderGoodsRefundService orderGoodsRefundService;
+
     @Value("${oldOrder.studyRecord}")
     private String ORDER_STUDY;
 
@@ -201,6 +206,10 @@ public class TopOldOrderServiceImpl extends ServiceImpl<TopOldOrderMapper, TopOl
     @Value("${oldOrder.inputOrderSn}")
     private String INPUT_ORDER;
 
+    @Value("${oldOrder.checkOrderStudent}")
+    private String CHECK_ORDER_STUDENT;
+
+
     @Override
     public TopOldOrderVo queryById(String orderSn) {
         //查询视图 v_top_order
@@ -309,6 +318,14 @@ public class TopOldOrderServiceImpl extends ServiceImpl<TopOldOrderMapper, TopOl
         add.setStatus(1);
         add.setCreateTime(DateUtils.getNowTime());
         add.setUpdateTime(DateUtils.getNowTime());
+        //佣金计算
+        BigDecimal brokerage = new BigDecimal("0.0000");
+        if (ObjectUtils.isNotNull(bo.getPretaxBrokerage()) && ObjectUtils.isNotNull(bo.getPretax())){
+            BigDecimal multiply = bo.getPretaxBrokerage().multiply(bo.getPretax());
+            //总佣金
+            brokerage = bo.getPretaxBrokerage().subtract(multiply);
+            add.setBrokerage(brokerage);
+        }
         // 获取企业默认成本模板
         TopCostTp costTp = topCostTpService.getOne(new LambdaQueryWrapper<TopCostTp>()
                 .eq(TopCostTp::getTenantId, bo.getTenantId()).eq(TopCostTp::getDefaultStatus, 1).last("limit 1"));
@@ -317,18 +334,30 @@ public class TopOldOrderServiceImpl extends ServiceImpl<TopOldOrderMapper, TopOl
             //成本项
             BigDecimal costTotal = new BigDecimal("0.00");//成本
             BigDecimal profitTotal = new BigDecimal("0.00"); //盈亏
+            //平摊佣金
+            BigDecimal halveBrokerage = new BigDecimal("0.0000");
+            if (brokerage.compareTo(BigDecimal.ZERO) != 0){
+                halveBrokerage = brokerage.divide(new BigDecimal(bo.getOrderGoodsList().size()),4,BigDecimal.ROUND_DOWN);
+            }
             for (TopOldOrderGoodsAddBo orderGoods : bo.getOrderGoodsList()) {
-                BigDecimal goodsPrice = orderGoods.getGoodsRealPrice();
+                //扣除平摊佣金
+                BigDecimal goodsPrice = orderGoods.getGoodsRealPrice().subtract(halveBrokerage);
+
+                //查找业务ID
                 List<TopCostTpItem> items = topCostTpItemService.getCostByBusiness(orderGoods.getBusinessFullName(), costTp.getTpId());
                 if (CollectionUtils.isEmpty(items)) {
                     //匹配不到成本项
                     continue;
                 }
                 //根据订单金额匹配成本阶梯
-                List<TopCostTpItem> tpItems = items.stream().filter(x ->
-                        (ObjectUtils.isNull(x.getMinValue()) && ObjectUtils.isNull(x.getMaxValue()))
-                                || (goodsPrice.compareTo(x.getMinValue()) > 0 && goodsPrice.compareTo(x.getMaxValue()) < 0)
-                                || (goodsPrice.compareTo(x.getMinValue()) == 0 && goodsPrice.compareTo(x.getMaxValue()) == 0)).collect(Collectors.toList());
+                List<TopCostTpItem> tpItems = new ArrayList<>();
+                for (TopCostTpItem x : items) {
+                    if ((ObjectUtils.isNull(x.getMinValue()) && ObjectUtils.isNull(x.getMaxValue()))
+                            || (goodsPrice.compareTo(x.getMinValue()) > 0 && goodsPrice.compareTo(x.getMaxValue()) < 0)
+                            || (goodsPrice.compareTo(x.getMinValue()) == 0 && goodsPrice.compareTo(x.getMaxValue()) == 0)){
+                        tpItems.add(x);
+                    }
+                }
                 if (CollectionUtils.isEmpty(tpItems)) {
                     //匹配不到成本项阶梯值
                     continue;
@@ -338,10 +367,28 @@ public class TopOldOrderServiceImpl extends ServiceImpl<TopOldOrderMapper, TopOl
                     throw new CustomException(String.format("成本项阶梯匹配有误!(有多个)请检查【%s,价格:%s】", orderGoods.getBusinessFullName(), goodsPrice.toString()));
                 }
                 //换算订单成本和盈亏
-                TopCostTpItem topCostTpItem = tpItems.stream().findFirst().get();
                 BigDecimal cost = new BigDecimal("0.00");//成本
                 BigDecimal profit = new BigDecimal("0.00"); //盈亏
                 BigDecimal bigDecimal = new BigDecimal("100");
+                TopCostTpItem topCostTpItem = tpItems.stream().findFirst().get();
+                if (topCostTpItem.getDockStatus() == 1){
+                    //启用成本扣除项
+                    switch (topCostTpItem.getDockType()){
+                        case 1://百分比
+                            //成本扣除金额
+                            BigDecimal divide = topCostTpItem.getDockValue().divide(bigDecimal);
+                            BigDecimal multiply = goodsPrice.multiply(divide);
+                            goodsPrice = goodsPrice.subtract(multiply);
+                            break;
+                        case 2://固定金额
+                            goodsPrice = goodsPrice.subtract(topCostTpItem.getDockValue());
+                            break;
+                        default:
+                            break;
+                    }
+
+                }
+
                 switch (topCostTpItem.getItemType()) {
                     case 1://百分比
                         BigDecimal divide = topCostTpItem.getTypeValue().divide(bigDecimal);
@@ -415,7 +462,7 @@ public class TopOldOrderServiceImpl extends ServiceImpl<TopOldOrderMapper, TopOl
                 if (ObjectUtils.isNotNull(x.getUserCard())) {
                     x.setUserCard(EncryptHandler.encrypt(x.getUserCard()));
                 }
-                x.setCheckStatus(0);//待审核
+                x.setCheckStatus(add.getCheckStatus());//待审核
                 x.setStatus(1);
                 x.setTenantId(add.getTenantId());
             });
@@ -483,25 +530,45 @@ public class TopOldOrderServiceImpl extends ServiceImpl<TopOldOrderMapper, TopOl
         } else {
             edit.setOrderUncollected(bo.getPayPrice().subtract(bo.getOrderReceived()));
         }
+        //佣金计算
+        if (ObjectUtils.isNotNull(bo.getPretaxBrokerage()) && ObjectUtils.isNotNull(bo.getPretax())){
+            BigDecimal multiply = bo.getPretaxBrokerage().multiply(bo.getPretax());
+            //总佣金
+            BigDecimal brokerage = bo.getPretaxBrokerage().subtract(multiply);
+            edit.setBrokerage(brokerage);
+        }
         //订单商品
         if (CollectionUtils.isNotEmpty(bo.getOrderGoodsList())) {
-            bo.getOrderGoodsList().forEach(item -> {
-                if (item.getCheckStatus() == 0) {
-                    //新增
-                    TopOldOrderGoods oldOrderGoods = BeanUtil.toBean(item, TopOldOrderGoods.class);
-                    oldOrderGoods.setTenantId(edit.getTenantId());
-                    oldOrderGoods.setStatus(1);
-                    oldOrderGoods.setUserCard(EncryptHandler.encrypt(item.getUserCard()));
-                    oldOrderGoods.setCheckStatus(order.getCheckStatus());
-                    topOrderGoodsService.save(oldOrderGoods);
-                }else if (item.getCheckStatus() == -1){
-                    //取消
-                    topOrderGoodsService.update(new LambdaUpdateWrapper<TopOldOrderGoods>()
-                            .set(TopOldOrderGoods::getCheckStatus,-1)
-                            .eq(TopOldOrderGoods::getOrderSn,item.getOrderSn())
-                            .eq(TopOldOrderGoods::getSignId,item.getSignId()));
+//            bo.getOrderGoodsList().forEach(item -> {
+//                if (item.getCheckStatus() == 0) {
+//                    //新增
+//                    TopOldOrderGoods oldOrderGoods = BeanUtil.toBean(item, TopOldOrderGoods.class);
+//                    oldOrderGoods.setTenantId(edit.getTenantId());
+//                    oldOrderGoods.setStatus(1);
+//                    oldOrderGoods.setUserCard(EncryptHandler.encrypt(item.getUserCard()));
+//                    oldOrderGoods.setCheckStatus(order.getCheckStatus());
+//                    topOrderGoodsService.save(oldOrderGoods);
+//                }else if (item.getCheckStatus() == -1){
+//                    //取消
+//                    topOrderGoodsService.update(new LambdaUpdateWrapper<TopOldOrderGoods>()
+//                            .set(TopOldOrderGoods::getCheckStatus,-1)
+//                            .eq(TopOldOrderGoods::getOrderSn,item.getOrderSn())
+//                            .eq(TopOldOrderGoods::getSignId,item.getSignId()));
+//                }
+//            });
+            //删除之前关联重新添加
+           topOrderGoodsService.remove(new LambdaQueryWrapper<TopOldOrderGoods>().eq(TopOldOrderGoods::getOrderSn, edit.getOrderSn()));
+           List<TopOldOrderGoods> collect = bo.getOrderGoodsList().stream().map(item -> BeanUtil.toBean(item, TopOldOrderGoods.class)).collect(Collectors.toList());
+            //学员身份证加密
+            collect.forEach(x -> {
+                if (ObjectUtils.isNotNull(x.getUserCard())) {
+                    x.setUserCard(EncryptHandler.encrypt(x.getUserCard()));
                 }
+                x.setCheckStatus(edit.getCheckStatus());//待审核
+                x.setStatus(1);
+                x.setTenantId(edit.getTenantId());
             });
+            topOrderGoodsService.saveBatch(collect);
         }
 
         //订单附件
@@ -526,18 +593,51 @@ public class TopOldOrderServiceImpl extends ServiceImpl<TopOldOrderMapper, TopOl
         BigDecimal profitTotal = new BigDecimal("0.00"); //盈亏
         List<TopOldOrderGoods> orderGoodsList = topOrderGoodsService.list(new LambdaQueryWrapper<TopOldOrderGoods>()
                 .eq(TopOldOrderGoods::getOrderSn, order.getOrderSn()).ne(TopOldOrderGoods::getCheckStatus, -1).eq(TopOldOrderGoods::getStatus, 1));
+        //佣金
+        BigDecimal brokerage = order.getBrokerage();
+        //平摊佣金
+        BigDecimal halveBrokerage = new BigDecimal("0.0000");
+        if (ObjectUtils.isNotNull(order.getBrokerage()) && order.getBrokerage().compareTo(BigDecimal.ZERO) != 0){
+            halveBrokerage = brokerage.divide(new BigDecimal(orderGoodsList.size()),4,BigDecimal.ROUND_DOWN);
+        }
         for (TopOldOrderGoods orderGoods : orderGoodsList) {
-            BigDecimal goodsPrice = orderGoods.getGoodsRealPrice();
-            List<TopCostTpItemVo> items = topCostTpVo.getItemList();
+            //扣除佣金
+            BigDecimal goodsPrice = orderGoods.getGoodsRealPrice().subtract(halveBrokerage);
+            String businessFullName = orderGoods.getBusinessFullName();
+            //业务层次过滤
+            List<TopCostTpItemVo> items = topCostTpVo.getItemList().stream().filter(item -> {
+                //教育类型不限
+                if (item.getEducationTypeId() == -1){return true;}
+
+                TopCourseEducationType educationType = topCourseEducationTypeService.getById(item.getEducationTypeId());
+                if (!businessFullName.contains(educationType.getEducationName()) && !businessFullName.contains(educationType.getSchemeName())){
+                    //教育类型匹配失败
+                    return false;
+                }
+                //项目类型和业务层次
+                if (item.getProjectId() == -1 && item.getBusinessId() == -1){
+                    return true;
+                }
+                TopCourseProjectType projectType = topCourseProjectTypeService.getById(item.getProjectId());
+                TopCourseBusiness business = topCourseBusinessService.getById(item.getBusinessId());
+                if (businessFullName.contains(projectType.getProjectName()) && businessFullName.contains(business.getBusinessName())){
+                    return true;
+                }
+                return false;
+            }).collect(Collectors.toList());
             if (CollectionUtils.isEmpty(items)) {
                 //匹配不到成本项
                 continue;
             }
             //根据订单金额匹配成本阶梯
-            List<TopCostTpItemVo> tpItems = items.stream().filter(x ->
-                    (ObjectUtils.isNull(x.getMinValue()) && ObjectUtils.isNull(x.getMaxValue()))
-                            || (goodsPrice.compareTo(x.getMinValue()) > 0 && goodsPrice.compareTo(x.getMaxValue()) < 0)
-                            || (goodsPrice.compareTo(x.getMinValue()) == 0 && goodsPrice.compareTo(x.getMaxValue()) == 0)).collect(Collectors.toList());
+            List<TopCostTpItemVo> tpItems = new ArrayList<>();
+            for (TopCostTpItemVo x : items) {
+                if ((ObjectUtils.isNull(x.getMinValue()) && ObjectUtils.isNull(x.getMaxValue()))
+                        || (goodsPrice.compareTo(x.getMinValue()) > 0 && goodsPrice.compareTo(x.getMaxValue()) < 0)
+                        || (goodsPrice.compareTo(x.getMinValue()) == 0 && goodsPrice.compareTo(x.getMaxValue()) == 0)){
+                    tpItems.add(x);
+                }
+            }
             if (CollectionUtils.isEmpty(tpItems)) {
                 //匹配不到成本项阶梯值
                 continue;
@@ -551,6 +651,23 @@ public class TopOldOrderServiceImpl extends ServiceImpl<TopOldOrderMapper, TopOl
             BigDecimal cost = new BigDecimal("0.00");//成本
             BigDecimal profit = new BigDecimal("0.00"); //盈亏
             BigDecimal bigDecimal = new BigDecimal("100");
+            if (topCostTpItem.getDockStatus() == 1){
+                //启用成本扣除项
+                switch (topCostTpItem.getDockType()){
+                    case 1://百分比
+                        //成本扣除金额
+                        BigDecimal divide = topCostTpItem.getDockValue().divide(bigDecimal);
+                        BigDecimal multiply = goodsPrice.multiply(divide);
+                        goodsPrice = goodsPrice.subtract(multiply);
+                        break;
+                    case 2://固定金额
+                        goodsPrice = goodsPrice.subtract(topCostTpItem.getDockValue());
+                        break;
+                    default:
+                        break;
+                }
+
+            }
             switch (topCostTpItem.getItemType()) {
                 case 1://百分比
                     BigDecimal divide = topCostTpItem.getTypeValue().divide(bigDecimal);
@@ -581,37 +698,46 @@ public class TopOldOrderServiceImpl extends ServiceImpl<TopOldOrderMapper, TopOl
         if (order.getOrderFrom() == 1) {
             throw new CustomException("订单号无效:" + bo.getOrderSn());
         }
-        if (CollectionUtils.isEmpty(bo.getOrderGoodsList())) {
-            return false;
+        if (order.getFinishStatus() == 1) {
+            throw new CustomException("订单已完单不能修改:" + bo.getOrderSn());
         }
-        List<TopOldOrderGoods> add = new ArrayList<>();
-        List<Long> signIds = new ArrayList<>();
-        //订单学员情况
-        for (TopOldOrderGoodsAddBo orderGoods : bo.getOrderGoodsList()) {
-            switch (orderGoods.getCheckStatus()) {
-                case 0://新增
-                    orderGoods.setCheckStatus(0);//待审核
-                    TopOldOrderGoods oldOrderGoods = BeanUtil.toBean(orderGoods, TopOldOrderGoods.class);
-                    oldOrderGoods.setUserCard(EncryptHandler.encrypt(oldOrderGoods.getUserCard()));
-                    add.add(oldOrderGoods);
-                    break;
-                case -1://删除
-                    signIds.add(orderGoods.getSignId());
-                    break;
-                default:
-                    break;
-            }
+        //佣金计算
+        if (ObjectUtils.isNotNull(bo.getPretaxBrokerage()) && ObjectUtils.isNotNull(bo.getPretax())){
+            BigDecimal multiply = bo.getPretaxBrokerage().multiply(bo.getPretax());
+            //总佣金
+            BigDecimal brokerage = bo.getPretaxBrokerage().subtract(multiply);
+            order.setBrokerage(brokerage);
         }
-        if (CollectionUtils.isNotEmpty(add)) {
-            topOrderGoodsService.saveBatch(add);
-        }
-        if (CollectionUtils.isNotEmpty(signIds)) {
-            topOrderGoodsService.update(new LambdaUpdateWrapper<TopOldOrderGoods>()
-                    .set(TopOldOrderGoods::getCheckStatus, -1)//删除学员
-                    .eq(TopOldOrderGoods::getOrderSn, bo.getOrderSn())
-                    .in(TopOldOrderGoods::getSignId, signIds));
+        if (CollectionUtils.isNotEmpty(bo.getOrderGoodsList())) {
+            List<TopOldOrderGoods> add = new ArrayList<>();
+            List<Long> signIds = new ArrayList<>();
+            //订单学员情况
+            for (TopOldOrderGoodsAddBo orderGoods : bo.getOrderGoodsList()) {
+                switch (orderGoods.getCheckStatus()) {
+                    case 0://新增
+                        orderGoods.setCheckStatus(0);//待审核
+                        TopOldOrderGoods oldOrderGoods = BeanUtil.toBean(orderGoods, TopOldOrderGoods.class);
+                        oldOrderGoods.setUserCard(EncryptHandler.encrypt(oldOrderGoods.getUserCard()));
+                        add.add(oldOrderGoods);
+                        break;
+                    case -1://删除
+                        signIds.add(orderGoods.getSignId());
+                        break;
+                    default:
+                        break;
+                }
+            }
+            if (CollectionUtils.isNotEmpty(add)) {
+                topOrderGoodsService.saveBatch(add);
+            }
+            if (CollectionUtils.isNotEmpty(signIds)) {
+                topOrderGoodsService.update(new LambdaUpdateWrapper<TopOldOrderGoods>()
+                        .set(TopOldOrderGoods::getCheckStatus, -1)//删除学员
+                        .eq(TopOldOrderGoods::getOrderSn, bo.getOrderSn())
+                        .in(TopOldOrderGoods::getSignId, signIds));
+            }
+            order.setCheckRemark(bo.getOrderGoodsList().stream().map(x -> x.getSignId().toString()).collect(Collectors.joining(",")));
         }
-        order.setCheckRemark(bo.getOrderGoodsList().stream().map(x -> x.getSignId().toString()).collect(Collectors.joining(",")));
         //重新计算成本
         if (StringUtils.isNotBlank(order.getCostJson())) {
             recalculateCost(order.getCostJson(),order);
@@ -872,12 +998,13 @@ public class TopOldOrderServiceImpl extends ServiceImpl<TopOldOrderMapper, TopOl
         if (roleIdList.stream().noneMatch(x -> roles.contains(x)) && !"admin".equals(bo.getLoginName())) {
             throw new CustomException("当前账号没有审核权限");
         }
-
+        List<TopOldOrderGoods> list = topOrderGoodsService.listByIds(bo.getOrderGoodsIds());
+        list.forEach(x -> x.setCheckStatus(bo.getCheckStatus()));
+        topOrderGoodsService.updateBatchById(list);
         if (oldOrder.getOrderBase() == 1) {
             //处理退学学员 并且订单在新系统
             switch (bo.getCheckStatus()) {
                 case 1://审核通过
-                    List<TopOldOrderGoods> list = topOrderGoodsService.listByIds(bo.getOrderGoodsIds());
                     List<String> userNames = new ArrayList<>();
                     list.forEach(item -> {
                         User user = userService.getOne(new LambdaQueryWrapper<User>().eq(User::getIdCard, item.getUserCard()));
@@ -911,8 +1038,7 @@ public class TopOldOrderServiceImpl extends ServiceImpl<TopOldOrderMapper, TopOl
                     this.informRemind(userNames);
                     break;
                 case 2: //审核未通过
-                    List<TopOldOrderGoods> list2 = topOrderGoodsService.listByIds(bo.getOrderGoodsIds());
-                    list2.forEach(item -> {
+                    list.forEach(item -> {
                         User user = userService.getOne(new LambdaQueryWrapper<User>().eq(User::getIdCard, item.getUserCard()));
                         if (ObjectUtil.isNull(user)) {
                             return;
@@ -940,13 +1066,228 @@ public class TopOldOrderServiceImpl extends ServiceImpl<TopOldOrderMapper, TopOl
                     //清除标识IDs
                     oldOrder.setCheckRemark("");
                     break;
+                default:
+                    break;
+            }
+        }
+
+        // 订单审核通知业务系统
+        List<CheckOrderStudentDetailBo> studentDetailBos = list.stream().map(item -> {
+            CheckOrderStudentDetailBo detailBo = new CheckOrderStudentDetailBo();
+            detailBo.setGoodsId(item.getGoodsId());
+            detailBo.setOrderUserItemId(item.getSignId().intValue());
+            detailBo.setUserName(item.getUserName());
+            detailBo.setIdNum(item.getUserCard());
+            return detailBo;
+        }).collect(Collectors.toList());
+        CheckOrderStudentBo studentBo = new CheckOrderStudentBo();
+        Long nowTime = DateUtils.getNowTime();
+        String sign = ToolsUtils.EncoderByMd5(bo.getOrderSn() + nowTime.toString() + "pubilc2022");
+        studentBo.setStamp(nowTime);
+        studentBo.setSign(sign);
+        studentBo.setOrderSn(bo.getOrderSn());
+        studentBo.setAuditStatus(bo.getCheckStatus());
+        studentBo.setData(studentDetailBos);
+        String respone = "";
+        try {
+            respone = HttpUtils.sendPostHeader(CHECK_ORDER_STUDENT,JSONObject.parseObject(JSONObject.toJSONString(studentBo)),new HashMap<>());
+            if (!respone.contains("\"Status\":true")) {
+                throw new CustomException("旧系统重新审核接口接口请求错误");
             }
+        } catch (Exception e) {
+            log.error("旧系统重新审核接口接口请求错误" + respone);
+            throw new CustomException("旧系统重新审核接口接口请求错误");
+        }
+
+        return true;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean orderRefundPay(OrderRefundPayBo bo) {
+        if(Validator.isEmpty(bo.getOrderSn())||Validator.isEmpty(bo.getTenantId())||Validator.isEmpty(bo.getPayType())){
+            throw new CustomException("参数错误");
+        }
+        if(Validator.isEmpty(bo.getToBankAcount())||Validator.isEmpty(bo.getToBankName())||Validator.isEmpty(bo.getToBankTypeName())){
+            throw new CustomException("支付参数错误");
+        }
+        //校验当前角色审核权限
+        List<TopSysUserRole> userRoleList = topSysUserRoleService.list(new LambdaQueryWrapper<TopSysUserRole>().eq(TopSysUserRole::getUserId, bo.getLoginId()));
+        if (CollectionUtils.isEmpty(userRoleList) && !bo.getLoginName().equals("admin")) {
+            throw new CustomException("当前账号没有审核权限");
+        }
+        //退款详情
+        List<TopOldOrderRefund> orderRefundList = topOldOrderRefundService
+                .list(new LambdaQueryWrapper<TopOldOrderRefund>()
+                .eq(TopOldOrderRefund::getOrderSn, bo.getOrderSn())
+                .eq(TopOldOrderRefund::getPeriodStatus, 2)//待退款
+                .eq(TopOldOrderRefund::getStatus, 1));
+        List<Long> roleIds = userRoleList.stream().map(TopSysUserRole::getRoleId).collect(Collectors.toList());
+        TopOldOrderCheckLog checkLog = topOldOrderCheckLogService.getOne(new LambdaQueryWrapper<TopOldOrderCheckLog>()
+                .eq(TopOldOrderCheckLog::getRefundSn, orderRefundList.get(0).getRefundSn())
+                .eq(TopOldOrderCheckLog::getStatus, 1)
+                .eq(TopOldOrderCheckLog::getCheckSign, 1)
+                .last("limit 1"));
+        if(Validator.isEmpty(checkLog)){
+            throw new CustomException("审核数据错误");
         }
+        if (!roleIds.contains(checkLog.getRoleId()) && !bo.getLoginName().equals("admin") ) {
+            throw new CustomException("当前账号没有审核权限");
+        }
+
+        TopOldOrder order = baseMapper.getOrderBySn(bo.getOrderSn());
+        if(Validator.isEmpty(order)){
+            throw new CustomException("订单数据错误无法支付");
+        }
+        //退款金额
+        BigDecimal refundPrice = orderRefundList.stream().map(TopOldOrderRefund::getRefundFee).reduce(BigDecimal.ZERO, BigDecimal::add);
+        if (order.getOrderFrom() == 3 && bo.getPayType() == 2){
+            //旧系统B端网银退款处理
+            handleEnterpriseRefund(refundPrice,order,bo);
+            if (order.getOrderBase() == 1){
+                //底单在新系统 处理退款订单
+
+            }
+        }else if (order.getOrderFrom() == 1 && bo.getPayType() == 1){
+            //新系统C端微信退款处理
+            handleUserRefund(refundPrice,order,bo);
+        }else if (order.getOrderFrom() == 2 && bo.getPayType() == 1){
+            // todo 旧系统C端微信退款处理
+            if (order.getOrderBase() == 1){
+                //底单在新系统 处理退款订单
 
-        //todo 通知业务系统
+            }
+        }
         return true;
     }
 
+    private void handleUserRefund(BigDecimal refundPrice, TopOldOrder order, OrderRefundPayBo bo) {
+
+
+    }
+
+    private void handleEnterpriseRefund(BigDecimal refundPrice,TopOldOrder order,OrderRefundPayBo bo) {
+        if (ObjectUtils.isNotNull(order.getOrderUncollected()) && order.getOrderUncollected().compareTo(BigDecimal.ZERO) !=0){
+            //存在未收款金额
+            BigDecimal orderUncollected = order.getOrderUncollected();
+            if (refundPrice.compareTo(orderUncollected) > 0){
+                refundPrice = refundPrice.subtract(orderUncollected);
+                order.setOrderUncollected(BigDecimal.ZERO);
+            }else {
+                //未收比退款多或者相等
+                refundPrice = BigDecimal.ZERO;
+                order.setOrderUncollected(orderUncollected.subtract(refundPrice));
+            }
+        }
+        if (refundPrice.compareTo(BigDecimal.ZERO) > 0){
+            bo.setTrainOrgId(order.getTenantId().toString());//旧机构ID
+            String paySn = DateUtils.getTagOrderSn("CP");
+            TopOrderBankPay add = BeanUtil.toBean(bo, TopOrderBankPay.class);
+            add.setPaySn(paySn);
+            add.setCreateTime(DateUtils.getNowTime());
+            add.setUpdateTime(DateUtils.getNowTime());
+            add.setResultStatus(0);
+            add.setPayUsername(bo.getLoginName());
+            add.setType(2);//退款
+            add.setMoney(refundPrice);
+            Map<String, String> params = new HashMap<>();
+            Long nowTime = DateUtils.getNowTime();
+            String sign = ToolsUtils.EncoderByMd5(paySn+nowTime.toString()+"pubilc2022");
+            params.put("stamp", nowTime.toString());
+            params.put("sign", sign);
+            params.put("MainUniqueId", paySn);
+            params.put("ToBankAcount", bo.getToBankAcount());
+            params.put("ToBankName", bo.getToBankName());
+            params.put("ToBankTypeName", bo.getToBankTypeName());
+            params.put("Money", refundPrice.toString());
+            params.put("TrainOrgId", bo.getTrainOrgId());
+            if(Validator.isNotEmpty(bo.getToBankConnetNum())){
+                params.put("ToBankConnetNum", bo.getToBankConnetNum());
+            }
+            if(Validator.isNotEmpty(bo.getRemark())){
+                params.put("Remark", bo.getRemark());
+            }
+            String respone = "";
+            String paramStr = JSON.toJSONString(params);
+            add.setParamJson(paramStr);
+            String path = OLD_SYS_HOST+"/WitSystem/BussinessApi/NeedToPay";
+            try {
+                respone = HttpUtils.postFormBody(path, params);
+                if (!respone.contains("\"Status\":true")) {
+                    throw new CustomException("退款支付请求错误"+respone);
+                }
+            } catch (IOException e) {
+                throw new CustomException("退款支付请求错误"+e.getMessage());
+            }
+            topOrderBankPayService.save(add);
+        }
+    }
+
+    @Override
+    public OrderRefundPayDetailVo getOrderRefundPayDetail(String orderSn) {
+        TopOldOrder order = baseMapper.getOrderBySn(orderSn);
+        if (ObjectUtils.isNull(order)){
+            throw new CustomException("订单号有误!");
+        }
+        OrderRefundPayDetailVo vo = new OrderRefundPayDetailVo();
+        SysTenant tenant = sysTenantService.getById(order.getTenantId());
+        //账号信息
+        String information = tenant.getAccountInformation();
+        SysTenantAccountVo accountVo = JSONObject.parseObject(information, SysTenantAccountVo.class);
+        vo.setOpeningBank(accountVo.getOpeningBank());
+        vo.setOpeningName(accountVo.getOpeningName());
+        vo.setProceedsAccount(accountVo.getProceedsAccount());
+        //获取退款金额
+        List<TopOldOrderRefund> list = topOldOrderRefundService
+                .list(new LambdaQueryWrapper<TopOldOrderRefund>()
+                .eq(TopOldOrderRefund::getOrderSn, order.getOrderSn())
+                .eq(TopOldOrderRefund::getPeriodStatus, 2)//待退款
+                .eq(TopOldOrderRefund::getStatus, 1));
+        if (CollectionUtils.isEmpty(list)){
+            throw new CustomException("订单退款信息获取失败!");
+        }
+        BigDecimal reduce = list.stream().map(TopOldOrderRefund::getRealRefundFee).reduce(BigDecimal.ZERO, BigDecimal::add);
+        vo.setRefundMoney(reduce);
+        vo.setPayType(order.getPayType());
+        vo.setBuyTime(order.getBuyTime());
+        return vo;
+    }
+
+
+    @Override
+    public boolean updateOrderInfo(TopOldOrderAddBo bo) {
+        TopOldOrder order = getOne(new LambdaQueryWrapper<TopOldOrder>().eq(TopOldOrder::getOrderSn, bo.getOrderSn()));
+        if (ObjectUtils.isNull(order)){
+            throw new CustomException("订单信息获取有误!");
+        }
+        TopOldOrder edit = BeanUtil.toBean(bo, TopOldOrder.class);
+        edit.setUpdateTime(DateUtils.getNowTime());
+        //订单商品
+        if (CollectionUtils.isNotEmpty(bo.getOrderGoodsList())) {
+            //删除之前关联重新添加
+            topOrderGoodsService.remove(new LambdaQueryWrapper<TopOldOrderGoods>().eq(TopOldOrderGoods::getOrderSn, edit.getOrderSn()));
+            List<TopOldOrderGoods> collect = bo.getOrderGoodsList().stream().map(item -> BeanUtil.toBean(item, TopOldOrderGoods.class)).collect(Collectors.toList());
+            //学员身份证加密
+            collect.forEach(x -> {
+                if (ObjectUtils.isNotNull(x.getUserCard())) {
+                    x.setUserCard(EncryptHandler.encrypt(x.getUserCard()));
+                }
+                x.setStatus(1);
+                x.setTenantId(edit.getTenantId());
+            });
+            topOrderGoodsService.saveBatch(collect);
+        }
+
+        //订单附件
+        if (CollectionUtils.isNotEmpty(bo.getOrderAttachmentList())) {
+            //删除之前关联重新添加
+            topOrderAttachmentService.remove(new LambdaQueryWrapper<TopOldOrderAttachment>().eq(TopOldOrderAttachment::getOrderSn, edit.getOrderSn()));
+            List<TopOldOrderAttachment> collect = bo.getOrderAttachmentList().stream().map(item -> BeanUtil.toBean(item, TopOldOrderAttachment.class)).collect(Collectors.toList());
+            topOrderAttachmentService.saveBatch(collect);
+        }
+        return updateById(edit);
+    }
+
     public void informRemind(List<String> userNames) {
         //学员退学提醒
         List<InformRemindRelevance> remindRelevances = informRemindRelevanceService.list(new LambdaQueryWrapper<InformRemindRelevance>().eq(InformRemindRelevance::getType, 1));
@@ -1148,6 +1489,7 @@ public class TopOldOrderServiceImpl extends ServiceImpl<TopOldOrderMapper, TopOl
         SysTenant tenant = sysTenantService.getById(orderVo.getTenantId());
         vo.setApplyName(String.format("%s(%s)",tenant.getTenantName(),orderVo.getCreateUsername()));
         vo.setCheckType(1);
+        vo.setTenantId(tenant.getTenantId());
         //审核进度
         List<TopOldOrderCheckLog> checkLogs = topOldOrderCheckLogService
                 .list(new LambdaQueryWrapper<TopOldOrderCheckLog>()
@@ -1167,9 +1509,22 @@ public class TopOldOrderServiceImpl extends ServiceImpl<TopOldOrderMapper, TopOl
             List<TopOldOrderCheckLog> collect = checkLogs.stream().filter(x -> x.getType() == 3).collect(Collectors.toList());
             if (CollectionUtils.isNotEmpty(collect)) {
                 if (collect.stream().anyMatch(x -> x.getCheckSign() == 1)) {
-                    vo.setCheckType(2);
+                    vo.setCheckType(3);
+                    //获取退款金额
+                    List<TopOldOrderRefund> list = topOldOrderRefundService
+                            .list(new LambdaQueryWrapper<TopOldOrderRefund>()
+                                    .eq(TopOldOrderRefund::getOrderSn, orderSn)
+                                    .eq(TopOldOrderRefund::getPeriodStatus, 2)//待退款
+                                    .eq(TopOldOrderRefund::getStatus, 1));
+                    if (CollectionUtils.isEmpty(list)){
+                        throw new CustomException("订单退款信息获取失败!");
+                    }
+                    BigDecimal reduce = list.stream().map(TopOldOrderRefund::getRefundFee).reduce(BigDecimal.ZERO, BigDecimal::add);
+                    vo.setRefundMoney(reduce);
+                    vo.setPayType(orderVo.getPayType());
+                    vo.setBuyTime(orderVo.getBuyTime());
                 } else {
-                    vo.setCheckType(1);
+                    vo.setCheckType(2);
                 }
             }
         }
@@ -1413,7 +1768,9 @@ public class TopOldOrderServiceImpl extends ServiceImpl<TopOldOrderMapper, TopOl
                 topOldOrderCheckLogService.updateById(check);
             }
         }
-        checkInform(bo.getOrderSn(),type,bo.getCheckReason(),1,0,String.format("审核中(%s)",bo.getCheckRoleName()));
+        checkInform(bo.getOrderSn(),type,bo.getCheckReason(),1,0,String.format("%s(%s)",
+                periodStatus == 2?"待付款":"审核中",
+                bo.getCheckRoleName()));
 
         //处理订单状态
         List<TopOldOrderRefund> refundList = topOldOrderRefundService
@@ -1518,14 +1875,9 @@ public class TopOldOrderServiceImpl extends ServiceImpl<TopOldOrderMapper, TopOl
                             if (CollectionUtils.isEmpty(itemList)) {
                                 return;
                             }
-                            //返佣
-                            List<TopCostTpItemVo> voList = itemList.stream().filter(x -> x.getItemType() == 3).collect(Collectors.toList());
-                            BigDecimal rebateTotal = calculateRebate(voList, order);
-                            //可以分成的金额 = 订单金额 - 返佣金额
-                            BigDecimal divide = order.getPayPrice().subtract(rebateTotal);
                             //分成模板
-                            List<TopCostTpItemVo> divideList = itemList.stream().filter(x -> x.getItemType() == 1).collect(Collectors.toList());
-                            calculateDivide(divideList, order, divide, divideModel);
+                            List<TopCostTpItemVo> divideList = itemList.stream().filter(x -> x.getItemCategory() == 1).collect(Collectors.toList());
+                            calculateDivide(divideList, order, divideModel);
                     }
                 }
         );
@@ -1550,7 +1902,12 @@ public class TopOldOrderServiceImpl extends ServiceImpl<TopOldOrderMapper, TopOl
         return true;
     }
 
-    private void calculateDivide(List<TopCostTpItemVo> itemList, TopOldOrder order, BigDecimal dividePrice, Integer divideModel) {
+    private void calculateDivide(List<TopCostTpItemVo> itemList, TopOldOrder order, Integer divideModel) {
+        if (CollectionUtils.isEmpty(itemList)){return;}
+        //佣金
+        BigDecimal brokerage = order.getBrokerage();
+        //平摊佣金
+        BigDecimal halveBrokerage = new BigDecimal("0.0000");
         if (order.getOrderFrom() == 1) {
             //新系统订单
             List<OrderGoods> orderGoodsList = orderGoodsService
@@ -1560,16 +1917,31 @@ public class TopOldOrderServiceImpl extends ServiceImpl<TopOldOrderMapper, TopOl
 
             //成本项
             BigDecimal divideTotal = new BigDecimal("0.00");//分成
+            if (ObjectUtils.isNotNull(order.getBrokerage()) && order.getBrokerage().compareTo(BigDecimal.ZERO) != 0){
+                halveBrokerage = brokerage.divide(new BigDecimal(orderGoodsList.size()),4,BigDecimal.ROUND_DOWN);
+            }
             for (OrderGoods orderGoods : orderGoodsList) {
-                BigDecimal goodsPrice = orderGoods.getGoodsRealPrice();
+                //去除佣金
+                BigDecimal goodsPrice = orderGoods.getGoodsRealPrice().subtract(halveBrokerage);
                 //商品业务层 新系统默认是学校业务
                 String businessName = orderGoodsService.getBusinessById(orderGoods.getOrderGoodsId());
-                List<TopCostTpItemVo> items = itemList.stream().filter(x -> {
-                    TopCourseEducationType education = topCourseEducationTypeService.getById(x.getEducationTypeId());
-                    TopCourseProjectType projectType = topCourseProjectTypeService.getById(x.getProjectId());
-                    TopCourseBusiness business = topCourseBusinessService.getById(x.getBusinessId());
-                    String name = education.getSchemeName() + education.getEducationName() + projectType.getProjectName() + business.getBusinessName();
-                    if (name.equals(businessName)) {
+                //业务层次过滤
+                List<TopCostTpItemVo> items = itemList.stream().filter(item -> {
+                    //教育类型不限
+                    if (item.getEducationTypeId() == -1){return true;}
+
+                    TopCourseEducationType educationType = topCourseEducationTypeService.getById(item.getEducationTypeId());
+                    if (!businessName.contains(educationType.getEducationName()) && !businessName.contains(educationType.getSchemeName())){
+                        //教育类型匹配失败
+                        return false;
+                    }
+                    //项目类型和业务层次
+                    if (item.getProjectId() == -1 && item.getBusinessId() == -1){
+                        return true;
+                    }
+                    TopCourseProjectType projectType = topCourseProjectTypeService.getById(item.getProjectId());
+                    TopCourseBusiness business = topCourseBusinessService.getById(item.getBusinessId());
+                    if (businessName.contains(projectType.getProjectName()) && businessName.contains(business.getBusinessName())){
                         return true;
                     }
                     return false;
@@ -1579,10 +1951,14 @@ public class TopOldOrderServiceImpl extends ServiceImpl<TopOldOrderMapper, TopOl
                     continue;
                 }
                 //根据订单金额匹配成本阶梯
-                List<TopCostTpItemVo> tpItems = items.stream().filter(x ->
-                        (ObjectUtils.isNull(x.getMinValue()) && ObjectUtils.isNull(x.getMaxValue()))
-                                || (goodsPrice.compareTo(x.getMinValue()) > 0 && goodsPrice.compareTo(x.getMaxValue()) < 0)
-                                || (goodsPrice.compareTo(x.getMinValue()) == 0 && goodsPrice.compareTo(x.getMaxValue()) == 0)).collect(Collectors.toList());
+                List<TopCostTpItemVo> tpItems = new ArrayList<>();
+                for (TopCostTpItemVo x : items) {
+                    if ((ObjectUtils.isNull(x.getMinValue()) && ObjectUtils.isNull(x.getMaxValue()))
+                            || (goodsPrice.compareTo(x.getMinValue()) > 0 && goodsPrice.compareTo(x.getMaxValue()) < 0)
+                            || (goodsPrice.compareTo(x.getMinValue()) == 0 && goodsPrice.compareTo(x.getMaxValue()) == 0)){
+                        tpItems.add(x);
+                    }
+                }
                 if (CollectionUtils.isEmpty(tpItems)) {
                     //匹配不到成本项阶梯值
                     continue;
@@ -1593,12 +1969,29 @@ public class TopOldOrderServiceImpl extends ServiceImpl<TopOldOrderMapper, TopOl
                 }
                 //换算订单成本和盈亏
                 TopCostTpItemVo topCostTpItem = tpItems.stream().findFirst().get();
-                BigDecimal divide = new BigDecimal("0.00");//成
+                BigDecimal divide = new BigDecimal("0.00");//
                 BigDecimal bigDecimal = new BigDecimal("100");
+                if (topCostTpItem.getDockStatus() == 1){
+                    //启用成本扣除项
+                    switch (topCostTpItem.getDockType()){
+                        case 1://百分比
+                            //成本扣除金额
+                            BigDecimal divide1 = topCostTpItem.getDockValue().divide(bigDecimal);
+                            BigDecimal multiply = goodsPrice.multiply(divide1);
+                            goodsPrice = goodsPrice.subtract(multiply);
+                            break;
+                        case 2://固定金额
+                            goodsPrice = goodsPrice.subtract(topCostTpItem.getDockValue());
+                            break;
+                        default:
+                            break;
+                    }
+
+                }
                 switch (topCostTpItem.getItemType()) {
                     case 1://百分比
                         BigDecimal divideNum = topCostTpItem.getTypeValue().divide(bigDecimal);
-                        divide = dividePrice.multiply(divideNum);
+                        divide = goodsPrice.multiply(divideNum);
                         break;
                     case 2://固定金额
                         divide = topCostTpItem.getTypeValue();
@@ -1606,11 +1999,15 @@ public class TopOldOrderServiceImpl extends ServiceImpl<TopOldOrderMapper, TopOl
                     default:
                         break;
                 }
+                orderGoods.setDivideModel(divideModel);
+                orderGoods.setDivideMoney(divide);
+                orderGoodsService.updateById(orderGoods);
                 divideTotal = divideTotal.add(divide);
             }
             Order orgOrder = orderService.getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderSn, order.getOrderSn()));
             orgOrder.setDivideModel(divideModel);
             orgOrder.setDivideStatus(2);//待审核
+            orgOrder.setCancelTime(DateUtils.getNowTime());
             if (divideModel == 1) {
                 //机构分成
                 orgOrder.setDivideCompanyMoney(divideTotal);
@@ -1669,18 +2066,23 @@ public class TopOldOrderServiceImpl extends ServiceImpl<TopOldOrderMapper, TopOl
                 switch (topCostTpItem.getItemType()) {
                     case 1://百分比
                         BigDecimal divideNum = topCostTpItem.getTypeValue().divide(bigDecimal);
-                        divide = dividePrice.multiply(divideNum);
+                        divide = goodsPrice.multiply(divideNum);
                         break;
                     case 2://固定金额
+
                         divide = topCostTpItem.getTypeValue();
                         break;
                     default:
                         break;
                 }
+                orderGoods.setDivideModel(divideModel);
+                orderGoods.setDivideMoney(divide);
+                topOrderGoodsService.updateById(orderGoods);
                 divideTotal = divideTotal.add(divide);
             }
             order.setDivideModel(divideModel);
             order.setDivideStatus(2);//待审核
+            order.setCancelTime(DateUtils.getNowTime());
             if (divideModel == 1) {
                 //机构分成
                 order.setDivideCompanyMoney(divideTotal);
@@ -1691,6 +2093,11 @@ public class TopOldOrderServiceImpl extends ServiceImpl<TopOldOrderMapper, TopOl
             //修改订单分成
             updateById(order);
         }
+        //删除审核流程重新创建
+        topOldOrderCheckLogService.remove(new LambdaQueryWrapper<TopOldOrderCheckLog>()
+        .in(TopOldOrderCheckLog::getType,Arrays.asList(5, 6))
+        .eq(TopOldOrderCheckLog::getOrderSn,order.getOrderSn()));
+
         //创建订单分成审核流程
         List<TopOldOrderCheck> checkList = topOldOrderCheckService
                 .list(new LambdaQueryWrapper<TopOldOrderCheck>().in(TopOldOrderCheck::getCheckType, Arrays.asList(5, 6))
@@ -1702,13 +2109,14 @@ public class TopOldOrderServiceImpl extends ServiceImpl<TopOldOrderMapper, TopOl
                 TopOldOrderCheckLog log = new TopOldOrderCheckLog();
                 log.setOrderSn(order.getOrderSn());
                 log.setRoleId(check.getCheckRole());
-
+                log.setCheckFrom(divideModel == 1? 2:3);
                 log.setUpdateTime(DateUtils.getNowTime());
                 log.setCreateTime(DateUtils.getNowTime());
                 log.setTenantId(order.getTenantId());
                 log.setCheckSign(i > 0 ? 0 : 1);
                 log.setCheckSort(check.getCheckSort());
                 log.setType(check.getCheckType());
+                log.setTenantId(order.getTenantId());
                 if (check.getCheckType() == 6) {
                     //分成支付
                     log.setCheckStatus(2);//待支付
@@ -1716,6 +2124,11 @@ public class TopOldOrderServiceImpl extends ServiceImpl<TopOldOrderMapper, TopOl
                     log.setCheckStatus(0);//待审核
                 }
                 logs.add(log);
+                //佣金审核
+                if (brokerage.compareTo(BigDecimal.ZERO) > 0){
+                    log.setCheckFrom(4);
+                    logs.add(log);
+                }
             }
             topOldOrderCheckLogService.saveBatch(logs);
         }

+ 13 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/goods/vo/TopRefundOrderDetailVo.java

@@ -41,7 +41,19 @@ public class TopRefundOrderDetailVo {
     @ApiModelProperty("申请时间")
     private Long applyTime;
 
-    @ApiModelProperty("流程类型:1审核,2支付")
+    @ApiModelProperty("审核类型:1B端订单审核,2订单退款审核,3订单支付,4订单完单 5分成审核 6分成支付")
     private Integer checkType;
 
+    @ApiModelProperty("退款金额")
+    private BigDecimal refundMoney;
+
+    @ApiModelProperty("支付平台 1微信,2网银")
+    private Integer payType;
+
+    @ApiModelProperty("下单时间")
+    private Long buyTime;
+
+    @ApiModelProperty("机构ID")
+    private Long tenantId;
+
 }

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/order/domain/TopOrderBankPay.java

@@ -30,6 +30,8 @@ private static final long serialVersionUID=1L;
     private String paySn;
     /** 订单号 */
     private String orderSn;
+    /** 类型:1分成,2退款 */
+    private Integer type;
     /** 银行账号 */
     private String toBankAcount;
     /** 账号名称 */

+ 1 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/order/service/impl/TopOrderBankPayServiceImpl.java

@@ -194,6 +194,7 @@ public class TopOrderBankPayServiceImpl extends ServiceImpl<TopOrderBankPayMappe
         add.setUpdateTime(DateUtils.getNowTime());
         add.setResultStatus(0);
         add.setPayUsername(bo.getLoginName());
+        add.setType(1);//分成
         BigDecimal money = null;
         if(bo.getDivideModel()==1){
             money =order.getDivideCompanyMoney();

+ 179 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/wx/service/impl/WxPayServiceImpl.java

@@ -53,7 +53,13 @@ import com.zhongzheng.modules.order.service.IOrderService;
 import com.zhongzheng.modules.order.service.IOrderShareMoneyService;
 import com.zhongzheng.modules.order.vo.OrderShareGoodsVo;
 import com.zhongzheng.modules.order.vo.OrderShareToOldVo;
+import com.zhongzheng.modules.system.domain.SysTenant;
 import com.zhongzheng.modules.system.service.ISysConfigService;
+import com.zhongzheng.modules.system.service.ISysTenantService;
+import com.zhongzheng.modules.top.financial.vo.TopCostTpItemVo;
+import com.zhongzheng.modules.top.financial.vo.TopCostTpVo;
+import com.zhongzheng.modules.top.goods.domain.*;
+import com.zhongzheng.modules.top.goods.service.*;
 import com.zhongzheng.modules.user.bo.UserExamGoodsQueryBo;
 import com.zhongzheng.modules.user.bo.UserExamGoodsSupplementAddBo;
 import com.zhongzheng.modules.user.domain.UserExamGoods;
@@ -74,6 +80,7 @@ import java.io.IOException;
 import java.math.BigDecimal;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
 
 /**
  * 保利威视频信息Service业务层处理
@@ -200,6 +207,22 @@ public class WxPayServiceImpl implements IWxPayService {
     @Autowired
     private IDistributionSellerService iDistributionSellerService;
 
+    @Autowired
+    private ISysTenantService iSysTenantService;
+
+    @Autowired
+    private ITopCourseEducationTypeService topCourseEducationTypeService;
+
+    @Autowired
+    private ITopCourseProjectTypeService topCourseProjectTypeService;
+
+    @Autowired
+    private ITopCourseBusinessService topCourseBusinessService;
+    @Autowired
+    private ITopOldOrderCheckService topOldOrderCheckService;
+    @Autowired
+    private ITopOldOrderCheckLogService topOldOrderCheckLogService;
+
     private String gzh_tokenUrl = "https://api.weixin.qq.com/cgi-bin/token";
 
     private String gzh_tokenParam = "grant_type=client_credential&appid=%s&secret=%s";
@@ -462,6 +485,11 @@ public class WxPayServiceImpl implements IWxPayService {
             order.setOrderUncollected(order.getOrderUncollected().subtract(payPrice));//未收
             order.setOrderReceived(payPrice);//实收
             order.setCreditStatus(1);
+            order.setFinishStatus(1);//完单
+            //处理分成
+            if (StringUtils.isNotBlank(order.getCostJson())){
+                handleDivide(order);
+            }
             if (iOrderService.updateById(order)) {
                 Map<String, Object> map = new HashMap<>();
                 map.put("order_sn", out_trade_no);
@@ -496,6 +524,157 @@ public class WxPayServiceImpl implements IWxPayService {
         return true;
     }
 
+    private void handleDivide(Order order) {
+        //获取机构分成方式
+        SysTenant tenant = iSysTenantService
+                .getOne(new LambdaQueryWrapper<SysTenant>()
+                        .eq(SysTenant::getTenantId, order.getTenantId()));
+        if (ObjectUtils.isNull(tenant.getDivideModel())){
+            return;
+        }
+        Integer divideModel = tenant.getDivideModel();
+        //分成金额
+        TopCostTpVo topCostTpVo = JSONObject.parseObject(order.getCostJson(), TopCostTpVo.class);
+        List<TopCostTpItemVo> itemList = topCostTpVo.getItemList();
+        if (CollectionUtils.isEmpty(itemList)) {
+            return;
+        }
+        //分成模板
+        List<TopCostTpItemVo> divideList = itemList.stream().filter(x -> x.getItemCategory() == 1).collect(Collectors.toList());
+        if (CollectionUtils.isEmpty(divideList)){
+            return;
+        }
+        //新系统订单
+        List<OrderGoods> orderGoodsList = iOrderGoodsService
+                .list(new LambdaQueryWrapper<OrderGoods>()
+                        .eq(OrderGoods::getOrderSn, order.getOrderSn())
+                        .eq(OrderGoods::getStatus, 1));
+
+        //成本项
+        BigDecimal divideTotal = new BigDecimal("0.00");//分成
+        for (OrderGoods orderGoods : orderGoodsList) {
+            BigDecimal goodsPrice = orderGoods.getGoodsRealPrice();
+            //商品业务层 新系统默认是学校业务
+            String businessName = iOrderGoodsService.getBusinessById(orderGoods.getOrderGoodsId());
+            //业务层次过滤
+            List<TopCostTpItemVo> items = itemList.stream().filter(item -> {
+                //教育类型不限
+                if (item.getEducationTypeId() == -1){return true;}
+
+                TopCourseEducationType educationType = topCourseEducationTypeService.getById(item.getEducationTypeId());
+                if (!businessName.contains(educationType.getEducationName()) && !businessName.contains(educationType.getSchemeName())){
+                    //教育类型匹配失败
+                    return false;
+                }
+                //项目类型和业务层次
+                if (item.getProjectId() == -1 && item.getBusinessId() == -1){
+                    return true;
+                }
+                TopCourseProjectType projectType = topCourseProjectTypeService.getById(item.getProjectId());
+                TopCourseBusiness business = topCourseBusinessService.getById(item.getBusinessId());
+                if (businessName.contains(projectType.getProjectName()) && businessName.contains(business.getBusinessName())){
+                    return true;
+                }
+                return false;
+            }).collect(Collectors.toList());
+            if (CollectionUtils.isEmpty(items)) {
+                //匹配不到成本项
+                continue;
+            }
+            //根据订单金额匹配成本阶梯
+            List<TopCostTpItemVo> tpItems = new ArrayList<>();
+            for (TopCostTpItemVo x : items) {
+                if ((ObjectUtils.isNull(x.getMinValue()) && ObjectUtils.isNull(x.getMaxValue()))
+                        || (goodsPrice.compareTo(x.getMinValue()) > 0 && goodsPrice.compareTo(x.getMaxValue()) < 0)
+                        || (goodsPrice.compareTo(x.getMinValue()) == 0 && goodsPrice.compareTo(x.getMaxValue()) == 0)){
+                    tpItems.add(x);
+                }
+            }
+            if (CollectionUtils.isEmpty(tpItems)) {
+                //匹配不到成本项阶梯值
+                continue;
+            }
+            if (tpItems.size() > 1) {
+                //匹配到多个成本项
+                throw new CustomException(String.format("成本项阶梯匹配有误!(有多个)请检查【%s,价格:%s】", businessName, goodsPrice.toString()));
+            }
+            //换算订单成本和盈亏
+            TopCostTpItemVo topCostTpItem = tpItems.stream().findFirst().get();
+            BigDecimal divide = new BigDecimal("0.00");//分成
+            BigDecimal bigDecimal = new BigDecimal("100");
+            if (topCostTpItem.getDockStatus() == 1){
+                //启用成本扣除项
+                switch (topCostTpItem.getDockType()){
+                    case 1://百分比
+                        //成本扣除金额
+                        BigDecimal divide1 = topCostTpItem.getDockValue().divide(bigDecimal);
+                        BigDecimal multiply = goodsPrice.multiply(divide1);
+                        goodsPrice = goodsPrice.subtract(multiply);
+                        break;
+                    case 2://固定金额
+                        goodsPrice = goodsPrice.subtract(topCostTpItem.getDockValue());
+                        break;
+                    default:
+                        break;
+                }
+            }
+            switch (topCostTpItem.getItemType()) {
+                case 1://百分比
+                    BigDecimal divideNum = topCostTpItem.getTypeValue().divide(bigDecimal);
+                    divide = goodsPrice.multiply(divideNum);
+                    break;
+                case 2://固定金额
+                    divide = topCostTpItem.getTypeValue();
+                    break;
+                default:
+                    break;
+            }
+            orderGoods.setDivideModel(divideModel);
+            orderGoods.setDivideMoney(divide);
+            iOrderGoodsService.updateById(orderGoods);
+            divideTotal = divideTotal.add(divide);
+        }
+        order.setDivideModel(divideModel);
+        order.setDivideStatus(2);//待审核
+        if (divideModel == 1) {
+            //机构分成
+            order.setDivideCompanyMoney(divideTotal);
+        } else {
+            //业务员分成
+            order.setDivideSellerMoney(divideTotal);
+        }
+
+        //创建订单分成审核流程
+        List<TopOldOrderCheck> checkList = topOldOrderCheckService
+                .list(new LambdaQueryWrapper<TopOldOrderCheck>().in(TopOldOrderCheck::getCheckType, Arrays.asList(5, 6))
+                        .orderByAsc(TopOldOrderCheck::getCheckSort));
+        if (CollectionUtils.isNotEmpty(checkList)) {
+            List<TopOldOrderCheckLog> logs = new ArrayList<>();
+            for (int i = 0; i < checkList.size(); i++) {
+                TopOldOrderCheck check = checkList.get(i);
+                TopOldOrderCheckLog log = new TopOldOrderCheckLog();
+                log.setOrderSn(order.getOrderSn());
+                log.setRoleId(check.getCheckRole());
+                log.setCheckFrom(divideModel == 1? 2:3);
+                log.setUpdateTime(DateUtils.getNowTime());
+                log.setCreateTime(DateUtils.getNowTime());
+                log.setTenantId(order.getTenantId());
+                log.setCheckSign(i > 0 ? 0 : 1);
+                log.setCheckSort(check.getCheckSort());
+                log.setType(check.getCheckType());
+                log.setTenantId(order.getTenantId());
+                if (check.getCheckType() == 6) {
+                    //分成支付
+                    log.setCheckStatus(2);//待支付
+                } else {
+                    log.setCheckStatus(0);//待审核
+                }
+                logs.add(log);
+            }
+            topOldOrderCheckLogService.saveBatch(logs);
+        }
+    }
+
     private void distributionRebate(OrderGoods g) {
         //分销订单处理
         DistributionActivity activity = iDistributionActivityService

+ 39 - 4
zhongzheng-system/src/main/resources/mapper/modules/top/TopCostTpItemMapper.xml

@@ -29,13 +29,48 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             fct.*
         FROM
             top_cost_tp_item fct
-                LEFT JOIN top_course_education_type cet ON fct.education_type_id = cet.id
-                LEFT JOIN top_course_project_type cpt ON fct.project_id = cpt.id
-                LEFT JOIN top_course_business cb ON fct.business_id = cb.id
         WHERE
             fct.`status` = 1
           AND fct.tp_id = #{costId}
-          AND CONCAT( cet.scheme_name, cet.education_name, cb.business_name, cpt.project_name ) = #{businessFullName}
+          AND (
+                fct.education_type_id = - 1
+                OR (
+                       SELECT
+                           COUNT( cet.id )
+                       FROM
+                           top_course_education_type cet
+                       WHERE
+                           cet.id = fct.education_type_id
+                         AND cet.`status` = 1
+                         AND ( INSTR( #{businessFullName}, cet.education_name ) > 0 AND INSTR( #{businessFullName}, cet.scheme_name ) > 0 )
+                   ) > 0
+            )
+          AND (
+                fct.project_id = - 1
+                OR (
+                       SELECT
+                           COUNT( cpt.id )
+                       FROM
+                           top_course_project_type cpt
+                       WHERE
+                           cpt.id = fct.project_id
+                         AND cpt.`status` = 1
+                         AND INSTR( #{businessFullName}, cpt.project_name ) > 0
+                   ) > 0
+            )
+          AND (
+                fct.business_id = - 1
+                OR (
+                       SELECT
+                           COUNT( cb.id )
+                       FROM
+                           top_course_business cb
+                       WHERE
+                           cb.id = fct.business_id
+                         AND cb.`status` = 1
+                         AND INSTR( #{businessFullName}, cb.business_name ) > 0
+                   ) > 0
+            )
     </select>
 
 </mapper>