Переглянути джерело

Merge branch 'master' into yonge

# Conflicts:
#	mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java
Joburgess 5 роки тому
батько
коміт
245c922164
18 змінених файлів з 458 додано та 32 видалено
  1. 6 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentDao.java
  2. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentPaymentRouteOrderDao.java
  3. 33 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentPaymentOrderExportDto.java
  4. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/VipGroup.java
  5. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentManageService.java
  6. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
  7. 44 5
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/PayServiceImpl.java
  8. 42 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentManageServiceImpl.java
  9. 24 4
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderServiceImpl.java
  10. 15 5
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java
  11. 48 0
      mec-biz/src/main/resources/config/mybatis/StudentMapper.xml
  12. 4 1
      mec-biz/src/main/resources/config/mybatis/StudentPaymentOrderMapper.xml
  13. 18 0
      mec-biz/src/main/resources/config/mybatis/StudentPaymentRouteOrderMapper.xml
  14. 4 1
      mec-biz/src/main/resources/config/mybatis/VipGroupMapper.xml
  15. 4 4
      mec-student/src/main/java/com/ym/mec/student/controller/StudentOrderController.java
  16. 18 4
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherVipGroupController.java
  17. 2 2
      mec-thirdparty/src/main/java/com/ym/mec/thirdparty/eseal/provider/TsignPlugin.java
  18. 176 6
      mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java

+ 6 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentDao.java

@@ -1,6 +1,7 @@
 package com.ym.mec.biz.dal.dao;
 
 import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dto.SimpleUserDto;
 import com.ym.mec.biz.dal.dto.Student4operating;
 import com.ym.mec.biz.dal.dto.StudentServeCourseDto;
 import com.ym.mec.biz.dal.dto.StudentServeDto;
@@ -50,6 +51,11 @@ public interface StudentDao extends com.ym.mec.common.dal.BaseDAO<Integer, Stude
      */
     List<Map<Integer,Integer>> getTeacherOperatingStudentsNum(@Param("teacherIds") String teacherIds);
 
+    List<String> getStudentNames(@Param("studentIds") List<Integer> studentIds);
+
+    List<SimpleUserDto> getStudentsWithOrgan(Map<String, Object> params);
+    int countStudentsWithOrgan(Map<String, Object> params);
+
     /**
      * 根据类型批量获取老师转化
      * @param teacherIds

+ 3 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentPaymentRouteOrderDao.java

@@ -1,6 +1,7 @@
 package com.ym.mec.biz.dal.dao;
 
 
+import com.ym.mec.biz.dal.dto.StudentPaymentOrderExportDto;
 import com.ym.mec.biz.dal.dto.StudentPaymentRouteOrderDto;
 import com.ym.mec.biz.dal.entity.StudentPaymentRouteOrder;
 import com.ym.mec.biz.dal.enums.PaymentChannelEnum;
@@ -41,4 +42,6 @@ public interface StudentPaymentRouteOrderDao extends BaseDAO<Long, StudentPaymen
                                    @Param("paymentChannelEnumList") List<PaymentChannelEnum> paymentChannelEnumList,
                                    @Param("startTime") Date startTime
     );
+
+    List<StudentPaymentOrderExportDto> ExportQueryPage(Map<String, Object> params);
 }

+ 33 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentPaymentOrderExportDto.java

@@ -39,6 +39,15 @@ public class StudentPaymentOrderExportDto extends StudentPaymentOrder {
 
     private List<Goods> goodsList;
 
+    //收款账户
+    private String routeMerNo;
+
+    //分润金额
+    private BigDecimal routeAmount;
+
+    //分润余额
+    private BigDecimal routeBalance;
+
     public BigDecimal getSporadicAmount() {
         return sporadicAmount;
     }
@@ -150,4 +159,28 @@ public class StudentPaymentOrderExportDto extends StudentPaymentOrder {
     public void setCooperationOrganName(String cooperationOrganName) {
         this.cooperationOrganName = cooperationOrganName;
     }
+
+    public String getRouteMerNo() {
+        return routeMerNo;
+    }
+
+    public void setRouteMerNo(String routeMerNo) {
+        this.routeMerNo = routeMerNo;
+    }
+
+    public BigDecimal getRouteAmount() {
+        return routeAmount;
+    }
+
+    public void setRouteAmount(BigDecimal routeAmount) {
+        this.routeAmount = routeAmount;
+    }
+
+    public BigDecimal getRouteBalance() {
+        return routeBalance;
+    }
+
+    public void setRouteBalance(BigDecimal routeBalance) {
+        this.routeBalance = routeBalance;
+    }
 }

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/VipGroup.java

@@ -80,6 +80,8 @@ public class VipGroup {
 
 	@ApiModelProperty(value = "课程类型ID",required = false)
 	private Integer vipGroupCategoryId;
+
+	private String vipGroupCategoryName;
 	
 	@ApiModelProperty(value = "所属分部列表",required = false)
 	private String organIdList;
@@ -144,6 +146,14 @@ public class VipGroup {
 		this.enableDelete = enableDelete;
 	}
 
+	public String getVipGroupCategoryName() {
+		return vipGroupCategoryName;
+	}
+
+	public void setVipGroupCategoryName(String vipGroupCategoryName) {
+		this.vipGroupCategoryName = vipGroupCategoryName;
+	}
+
 	public BigDecimal getCourseUnitPrice() {
 		return courseUnitPrice;
 	}

+ 3 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/StudentManageService.java

@@ -28,6 +28,9 @@ public interface StudentManageService {
      */
     PageInfo<StudentManageListDto> findStudentsByOrganId(StudentManageQueryInfo queryInfo);
 
+
+    PageInfo<SimpleUserDto> queryStudentsWithTeacher(StudentManageQueryInfo queryInfo);
+
     /**
      * @Author: Joburgess
      * @Date: 2019/9/20

+ 4 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java

@@ -1945,6 +1945,10 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             musicGroupPageInfo = queryPage(queryInfo);
         }
         List<MusicGroup> musicGroupList = musicGroupPageInfo.getRows();
+        
+        if(musicGroupList == null || musicGroupList.size() == 0){
+        	return musicGroupPageInfo;
+        }
         // 获取学校编号列表
 //        Set<Integer> schoolIds = musicGroupList.stream().map(e -> e.getSchoolId()).collect(Collectors.toSet());
 //        List<Map<Integer, String>> schoolNames = schoolDao.queryNameByIds(StringUtils.join(schoolIds,","));

+ 44 - 5
mec-biz/src/main/java/com/ym/mec/biz/service/impl/PayServiceImpl.java

@@ -245,8 +245,17 @@ public class PayServiceImpl implements PayService {
 
     @Override
     public Map<String, Object> getPayMap(BigDecimal amount, BigDecimal balanceAmount, String orderNo, String notifyUrl, String returnUrl, String orderSubject, String orderBody, Integer organId, String receiver) throws Exception {
+        String usePaymentConfig = sysConfigDao.findConfigValue("use_payment_config");
+        List<RouteScaleDto> routeScaleDtos = null;
+        //使用配置开关
+        if (usePaymentConfig.equals("0")) {
+            routeScaleDtos = noUsePaymentConfig(organId, amount);
+        }
+
         //根据金额获取分润
-        List<RouteScaleDto> routeScaleDtos = getAmountChannel(organId, amount, receiver);
+        if (routeScaleDtos == null) {
+            routeScaleDtos = getAmountChannel(organId, amount, receiver);
+        }
         //零星支付,收到指定
         if (routeScaleDtos == null) {
             routeScaleDtos = getSporadicChannel(amount, receiver);
@@ -259,6 +268,26 @@ public class PayServiceImpl implements PayService {
         return getPayRoute(amount, balanceAmount, orderNo, notifyUrl, returnUrl, orderSubject, orderBody, routeScaleDtos);
     }
 
+    private List<RouteScaleDto> noUsePaymentConfig(Integer organId, BigDecimal amount) {
+        String paymentChannel = sysConfigDao.findConfigValue("payment_channel");
+        List<RouteScaleDto> routeScaleDtos = new ArrayList<>();
+        RouteScaleDto routeScaleDto = new RouteScaleDto();
+        routeScaleDto.setAmount(amount);
+        routeScaleDto.setOrganId(organId);
+        routeScaleDto.setScale(100);
+        if (paymentChannel.equals("YQPAY")) {
+            routeScaleDto.setMerNo(YqPayUtil.merNo);
+            routeScaleDto.setPayType(PaymentChannelEnum.YQPAY);
+            routeScaleDto.setFeeFlag("Y");
+        } else {
+            routeScaleDto.setMerNo(ConfigInit.merNo);
+            routeScaleDto.setPayType(PaymentChannelEnum.ADAPAY);
+            routeScaleDto.setFeeFlag("Y");
+        }
+        routeScaleDtos.add(routeScaleDto);
+        return routeScaleDtos;
+    }
+
     private List<RouteScaleDto> getPaymentConfigChannel(Integer organId, BigDecimal amount) {
         SysPaymentConfig paymentConfig = sysPaymentConfigService.findPaymentConfigByOrganId(organId);
         if (paymentConfig == null || StringUtils.isBlank(paymentConfig.getRouteScale())) {
@@ -274,6 +303,7 @@ public class PayServiceImpl implements PayService {
             if (paymentChannel.equals("YQPAY")) {
                 routeScaleDto.setMerNo(YqPayUtil.merNo);
                 routeScaleDto.setPayType(PaymentChannelEnum.YQPAY);
+                routeScaleDto.setFeeFlag("Y");
             } else {
                 routeScaleDto.setMerNo(ConfigInit.merNo);
                 routeScaleDto.setPayType(PaymentChannelEnum.ADAPAY);
@@ -472,6 +502,7 @@ public class PayServiceImpl implements PayService {
         List<Map<String, Object>> tempRoutingList = new ArrayList<>();
 
         PaymentChannelEnum patType = null;
+        boolean feeFlag = false;
         for (RouteScaleDto routeScaleDto : routeScaleDtos) {
             patType = routeScaleDto.getPayType();
             Map<String, Object> routingList = new HashMap<>();
@@ -483,22 +514,30 @@ public class PayServiceImpl implements PayService {
             }
             BigDecimal routingFee = routingAmount.multiply(new BigDecimal(routeScaleDto.getScale())).divide(new BigDecimal(100), 2, BigDecimal.ROUND_HALF_UP);
             BigDecimal routeBalanceAmount = balanceAmount.multiply(new BigDecimal(routeScaleDto.getScale())).divide(new BigDecimal(100), 2, BigDecimal.ROUND_HALF_UP);
-            BigDecimal routingMoney = routingAmount.multiply(new BigDecimal(routeScaleDto.getScale())).divide(new BigDecimal(100), 2, BigDecimal.ROUND_HALF_UP);
+            BigDecimal routingMoney = amount.multiply(new BigDecimal(routeScaleDto.getScale())).divide(new BigDecimal(100), 2, BigDecimal.ROUND_HALF_UP);
             if (i == routeScaleDtos.size()) {
                 routingFee = routingAmount.subtract(hasRouteAmount).setScale(2, BigDecimal.ROUND_HALF_UP);
                 routeBalanceAmount = balanceAmount.subtract(hasRouteBalanceAmount).setScale(2, BigDecimal.ROUND_HALF_UP);
                 routingMoney = amount.subtract(hasRouteMoney).setScale(2, BigDecimal.ROUND_HALF_UP);
             }
-            hasRouteAmount = hasRouteAmount.add(routingFee);
-            hasRouteBalanceAmount = hasRouteBalanceAmount.add(routeBalanceAmount);
 
             if (routingFee.compareTo(BigDecimal.ZERO) <= 0) {
                 continue;
             }
+
+            hasRouteAmount = hasRouteAmount.add(routingFee);
+            hasRouteBalanceAmount = hasRouteBalanceAmount.add(routeBalanceAmount);
+            hasRouteMoney = hasRouteMoney.add(routingMoney);
+
             routingList.put("routingMerNo", routeScaleDto.getMerNo());//分佣账户
             routingList.put("routingFee", routingFee); //分佣金额
-
             tempRoutingList.add(routingList);
+            if (routeScaleDto.getFeeFlag().equals("Y")) {
+                feeFlag = true;
+            }
+            if (i == routeScaleDtos.size() && !feeFlag) {
+                routeScaleDto.setFeeFlag("Y");
+            }
 
             StudentPaymentRouteOrder studentPaymentRouteOrder = new StudentPaymentRouteOrder();
             studentPaymentRouteOrder.setOrderNo(orderNo);

+ 42 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentManageServiceImpl.java

@@ -7,6 +7,7 @@ import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.Student;
 import com.ym.mec.biz.dal.entity.StudentRegistration;
 import com.ym.mec.biz.dal.entity.SysUserCashAccount;
+import com.ym.mec.biz.dal.entity.Teacher;
 import com.ym.mec.biz.dal.enums.YesOrNoEnum;
 import com.ym.mec.biz.dal.page.*;
 import com.ym.mec.biz.service.StudentManageService;
@@ -18,9 +19,11 @@ import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.im.ImFeignService;
 import com.ym.mec.util.collection.MapUtil;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.ss.formula.functions.T;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
 
 import java.util.*;
 import java.util.stream.Collectors;
@@ -162,6 +165,45 @@ public class StudentManageServiceImpl implements StudentManageService {
     }
 
     @Override
+    public PageInfo<SimpleUserDto> queryStudentsWithTeacher(StudentManageQueryInfo queryInfo) {
+        PageInfo<SimpleUserDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<String, Object>();
+        MapUtil.populateMap(params, queryInfo);
+
+        Teacher teacher = teacherDao.get(queryInfo.getTeacherId());
+        if(Objects.isNull(teacher)){
+            return null;
+        }
+        List<Integer> organIds=new ArrayList<>();
+        if(Objects.nonNull(teacher.getTeacherOrganId())){
+            organIds.add(teacher.getTeacherOrganId());
+        }
+        if(StringUtils.isNotBlank(teacher.getFlowOrganRange())){
+            List<Integer> flowOrganRangeIds = Arrays.stream(teacher.getFlowOrganRange().split(",")).map(e -> Integer.valueOf(e)).collect(Collectors.toList());
+            organIds.addAll(flowOrganRangeIds);
+        }
+
+        if(CollectionUtils.isEmpty(organIds)){
+            return null;
+        }
+
+        params.put("organIds", organIds);
+
+        List<SimpleUserDto> dataList = null;
+        int count = studentDao.countStudentsWithOrgan(params);
+        if (count > 0) {
+            pageInfo.setTotal(count);
+            params.put("offset", pageInfo.getOffset());
+            dataList = studentDao.getStudentsWithOrgan(params);
+        }
+        if (count == 0) {
+            dataList = new ArrayList<>();
+        }
+        pageInfo.setRows(dataList);
+        return pageInfo;
+    }
+
+    @Override
     public StudentManageListDto findStudentManageBaseInfo(Integer userId) {
         return studentManageDao.findStudentBaseInfoByUserID(userId);
     }

+ 24 - 4
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderServiceImpl.java

@@ -26,6 +26,7 @@ import com.ym.mec.util.collection.MapUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
 import java.util.*;
@@ -53,6 +54,8 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
     private SysUserCashAccountDao sysUserCashAccountDao;
     @Autowired
     private StudentRepairService studentRepairService;
+    @Autowired
+    private SysUserCashAccountService sysUserCashAccountService;
 
     @Override
     public BaseDAO<Long, StudentPaymentOrder> getDAO() {
@@ -193,9 +196,30 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
         closeOrders(orderNoList);
     }
 
+    @Transactional(rollbackFor = Exception.class)
     public void updateOrder(Map<String, String> rpMap) throws Exception {
         DealStatusEnum status = rpMap.get("tradeState").equals("1") ? DealStatusEnum.SUCCESS : DealStatusEnum.FAILED;
         StudentPaymentOrder order = findOrderByOrderNo(rpMap.get("merOrderNo"));
+        //关闭或失败的订单查询订单成功,订单改成成功,钱退到余额
+        if (order != null && (order.getStatus().equals(DealStatusEnum.CLOSE) || order.getStatus().equals(DealStatusEnum.FAILED)) && status.equals(DealStatusEnum.SUCCESS)) {
+            String memo = order.getStatus().equals(DealStatusEnum.CLOSE) ? "关闭订单" : "失败订单";
+            memo = memo+",实际支付成功,退到用户余额";
+            //更新订单状态
+            order.setStatus(status);
+            order.setTransNo(rpMap.get("orderNo"));
+            order.setPaymentBusinessChannel(rpMap.get("channelType"));
+            order.setPayTime(new Date());
+            order.setMemo(memo);
+            int updateCount = this.update(order);
+            if (updateCount <= 0) {
+                throw new BizException("订单更新失败");
+            }
+            //增加用户余额
+            sysUserCashAccountService.updateBalance(order.getUserId(), order.getActualAmount(),
+                    PlatformCashAccountDetailTypeEnum.REFUNDS, memo+",订单号:"+order.getOrderNo());
+            return;
+        }
+
         if (order == null || !order.getStatus().equals(DealStatusEnum.ING)) {
             return;
         }
@@ -335,10 +359,6 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
     @Override
     public Boolean getOrderStatus(Long id) throws Exception {
         StudentPaymentOrder studentPaymentOrder = studentPaymentOrderDao.get(id);
-        studentPaymentOrder.setStatus(DealStatusEnum.ING);
-        if (studentPaymentOrderDao.update(studentPaymentOrder) <= 0) {
-            throw new BizException("订单状态更新失败,请重试");
-        }
         List<StudentPaymentOrder> orderList = new ArrayList<>();
         orderList.add(studentPaymentOrder);
         if (studentPaymentOrder.getPaymentChannel().equals("ADAPAY")) {

+ 15 - 5
mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java

@@ -198,6 +198,10 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
             throw new BizException("请设置教师课酬");
         }
 
+		if(StringUtils.isBlank(vipGroupApplyBaseInfoDto.getStudentIdList())){
+			throw new BizException("请选择学员");
+		}
+
         if(Objects.isNull(vipGroupApplyBaseInfoDto.getOnlineTeacherSalary())){
         	vipGroupApplyBaseInfoDto.setOnlineTeacherSalary(new BigDecimal(0));
 		}
@@ -249,11 +253,20 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 			throw new BizException("请勿重复提交");
 		}
 
+		VipGroupCategory vipGroupCategory = vipGroupCategoryDao.get(vipGroupApplyBaseInfoDto.getVipGroupCategoryId());
+		if(Objects.isNull(vipGroupCategory)){
+			throw new BizException("课程形式不存在");
+		}
+
+		List<Integer> canBuyStudentIds = Arrays.stream(vipGroupApplyBaseInfoDto.getStudentIdList().split(",")).map(e -> Integer.valueOf(e)).collect(Collectors.toList());
+
+		List<String> studentNames = studentDao.getStudentNames(canBuyStudentIds);
+
 		//生成vip课信息
 		List<String> bySubIds = subjectDao.findBySubIds(vipGroupApplyBaseInfoDto.getSubjectIdList());
 		StringBuffer className=new StringBuffer(StringUtils.join(bySubIds,","));
-		className.append("•");
-		className.append(vipGroupApplyBaseInfoDto.getName());
+		className.append(vipGroupCategory.getName());
+		className.append(StringUtils.join(studentNames, ","));
 		vipGroupApplyBaseInfoDto.setName(className.toString());
 
 		//计算课程相关费用信息
@@ -318,9 +331,6 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 
 		vipGroupApplyBaseInfoDto.setPaymentExpireDate(DateUtil.getLastSecondWithDay(vipGroupApplyBaseInfoDto.getPaymentExpireDate()));
 
-        //获取vip课类型信息
-        VipGroupCategory vipGroupCategory = vipGroupCategoryDao.get(vipGroup.getVipGroupApplyBaseInfo().getVipGroupCategoryId().intValue());
-
         VipGroupDefaultClassesUnitPrice vipGroupDefaultClassesUnitPrice = vipGroupDefaultClassesUnitPriceDao.getByVipGroupCategory(vipGroup.getVipGroupApplyBaseInfo().getVipGroupCategoryId(), vipGroup.getVipGroupApplyBaseInfo().getOrganId());
 
         if(Objects.isNull(vipGroupDefaultClassesUnitPrice)){

+ 48 - 0
mec-biz/src/main/resources/config/mybatis/StudentMapper.xml

@@ -462,4 +462,52 @@
             LEFT JOIN student stu ON cssp.user_id_ = stu.user_id_
         WHERE stu.service_tag_=1 AND class_date_&gt;=#{monday}
     </select>
+
+    <select id="getStudentNames" resultType="string">
+        SELECT username_ FROM sys_user WHERE id_ IN
+        <foreach collection="studentIds" item="studentId" separator="," open="(" close=")">
+            #{studentId}
+        </foreach>
+    </select>
+    <select id="getStudentsWithOrgan" resultType="com.ym.mec.biz.dal.dto.SimpleUserDto">
+        SELECT
+            su.id_ userId,su.username_ userName, su.avatar_ avatar, su.phone_ phone
+        FROM
+            sys_user su
+        WHERE
+            1=1
+            AND su.del_flag_=0 AND su.lock_flag_=0
+            AND FIND_IN_SET('STUDENT',su.user_type_)
+            <if test="organIds!=null">
+                AND su.organ_id_ IN
+                <foreach collection="organIds" item="organId" open="(" close=")" separator=",">
+                    #{organId}
+                </foreach>
+            </if>
+            <if test="search != null">
+                AND (su.username_ LIKE CONCAT('%', #{search}, '%') OR su.phone_ LIKE CONCAT('%', #{search}, '%'))
+            </if>
+        ORDER BY su.id_
+        <include refid="global.limit"/>
+    </select>
+
+    <select id="countStudentsWithOrgan" resultType="int">
+        SELECT
+            COUNT(su.id_)
+        FROM
+            sys_user su
+        WHERE
+            1=1
+            AND su.del_flag_=0 AND su.lock_flag_=0
+            AND FIND_IN_SET('STUDENT',su.user_type_)
+            <if test="organIds!=null">
+                AND su.organ_id_ IN
+                <foreach collection="organIds" item="organId" open="(" close=")" separator=",">
+                    #{organId}
+                </foreach>
+            </if>
+            <if test="search != null">
+                AND (su.username_ LIKE CONCAT('%', #{search}, '%') OR su.phone_ LIKE CONCAT('%', #{search}, '%'))
+            </if>
+    </select>
 </mapper>

+ 4 - 1
mec-biz/src/main/resources/config/mybatis/StudentPaymentOrderMapper.xml

@@ -248,7 +248,7 @@
                 AND spo.order_no_ = #{orderNo}
             </if>
             <if test="merNos != null">
-                AND spo.mer_nos_ = #{merNos}
+                AND FIND_IN_SET(#{merNos},spo.mer_nos_)
             </if>
             <if test="transNo != null">
                 AND spo.trans_no_ = #{transNo}
@@ -454,6 +454,9 @@
         <result column="organ_name" property="organName"/>
         <result column="username_" property="user.username"/>
         <result column="charge_type_" property="chargeType"/>
+        <result column="routeMerNo" property="routeMerNo" />
+        <result column="routeAmount" property="routeAmount" />
+        <result column="routeBalance" property="routeBalance" />
         <collection property="orderDetailList" ofType="com.ym.mec.biz.dal.entity.StudentPaymentOrderDetail">
             <result column="detail_id_" property="id"/>
             <result column="detail_type_" property="type"/>

+ 18 - 0
mec-biz/src/main/resources/config/mybatis/StudentPaymentRouteOrderMapper.xml

@@ -185,4 +185,22 @@
         </if>
     </select>
 
+    <select id="ExportQueryPage" resultMap="com.ym.mec.biz.dal.dao.StudentPaymentOrderDao.orderAndDetail"
+            parameterType="map">
+        SELECT spo.*,u.username_,spod.id_ detail_id_,spod.type_ detail_type_,spod.price_
+        detail_price_,spod.kit_group_purchase_type_ detail_kit_group_purchase_type_,
+        sci.charge_type_,g.id_ goods_id, g.name_ goods_name,o.name_ organ_name,spro.route_amount_
+        routeAmount,spro.route_balance_amount_ routeBalance,
+        spro.mer_no_ routeMerNo
+        FROM student_payment_order spo
+        LEFT JOIN student_payment_route_order spro ON spro.order_no_ = spo.order_no_
+        LEFT JOIN sys_user u on spo.user_id_ = u.id_
+        LEFT JOIN student_payment_order_detail spod on spo.id_ = spod.payment_order_id_
+        LEFT JOIN organization o on spro.route_organ_id_ = o.id_
+        LEFT JOIN sporadic_charge_info sci on spo.music_group_id_ = sci.id_
+        LEFT JOIN goods g on FIND_IN_SET(g.id_,spod.goods_id_list_)
+        <include refid="queryPaymentOrder"/>
+        ORDER BY spo.id_ ASC
+    </select>
+
 </mapper>

+ 4 - 1
mec-biz/src/main/resources/config/mybatis/VipGroupMapper.xml

@@ -42,6 +42,7 @@
         <result column="school_name_" property="schoolName" />
         <result column="subject_name_" property="subjectName" />
         <result column="educational_teacher_id_" property="educationalTeacherId" />
+        <result column="vip_group_category_name_" property="vipGroupCategoryName"/>
     </resultMap>
     
     <resultMap type="com.ym.mec.biz.dal.entity.School" id="School">
@@ -196,11 +197,13 @@
 		SELECT
             vg.*,
             vga.name_ vip_group_activity_name_,
-            su.real_name_ username_
+            su.real_name_ username_,
+            vgc.name_ vip_group_category_name_
         FROM
             vip_group vg
             LEFT JOIN sys_user su ON vg.user_id_=su.id_
             LEFT JOIN vip_group_activity vga ON vg.vip_group_activity_id_=vga.id_
+            LEFT JOIN vip_group_category vgc ON vgc.id_=vg.vip_group_category_id_
         <include refid="vipGroupQueryCondition"/>
         ORDER BY vg.id_ DESC
         <include refid="global.limit"/>

+ 4 - 4
mec-student/src/main/java/com/ym/mec/student/controller/StudentOrderController.java

@@ -184,7 +184,7 @@ public class StudentOrderController extends BaseController {
         } else {
             createTime = tenantPaymentOrder.getCreateTime();
             merNos = tenantPaymentOrder.getMerNos();
-            payAmount = studentPaymentOrder.getActualAmount();
+            payAmount = tenantPaymentOrder.getActualAmount();
         }
 
         Calendar beforeTime = Calendar.getInstance();
@@ -201,7 +201,7 @@ public class StudentOrderController extends BaseController {
         paymentParams.put("app_id", ConfigInit.appId);
         paymentParams.put("order_no", orderNo);
         paymentParams.put("pay_channel", payChannel);
-        paymentParams.put("pay_amt", payAmount.setScale(2,BigDecimal.ROUND_HALF_UP));
+        paymentParams.put("pay_amt", payAmount.setScale(2, BigDecimal.ROUND_HALF_UP));
         paymentParams.put("goods_title", orderSubject);
         paymentParams.put("goods_desc", orderBody);
         paymentParams.put("time_expire", timeExpire);
@@ -211,8 +211,8 @@ public class StudentOrderController extends BaseController {
         for (StudentPaymentRouteOrder routeOrder : routeOrders) {
             Map<String, Object> divMember = new HashMap<>();
             divMember.put("member_id", routeOrder.getMerNo());//分佣账户
-            divMember.put("amount", routeOrder.getRouteAmount());//分佣金额
-            divMember.put("fee_flag",routeOrder.getFeeFlag());
+            divMember.put("amount", routeOrder.getRouteAmount().setScale(2, BigDecimal.ROUND_HALF_UP));//分佣金额
+            divMember.put("fee_flag", routeOrder.getFeeFlag());
             if (routeOrder.getMerNo().equals(ConfigInit.merNo)) {
                 divMember.put("member_id", 0);
             }

+ 18 - 4
mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherVipGroupController.java

@@ -6,16 +6,17 @@ import com.ym.mec.biz.dal.dao.TeacherDao;
 import com.ym.mec.biz.dal.dto.VipGroupApplyDto;
 import com.ym.mec.biz.dal.dto.VipGroupCostCountParamsDto;
 import com.ym.mec.biz.dal.entity.Teacher;
+import com.ym.mec.biz.dal.page.StudentManageQueryInfo;
+import com.ym.mec.biz.service.StudentManageService;
 import com.ym.mec.biz.service.VipGroupService;
 import com.ym.mec.common.controller.BaseController;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
 
 import java.util.Objects;
 
@@ -34,6 +35,8 @@ public class TeacherVipGroupController extends BaseController {
 	private SysUserFeignService sysUserFeignService;
 	@Autowired
 	private TeacherDao teacherDao;
+	@Autowired
+	private StudentManageService studentManageService;
 
 	@ApiOperation("vip课申请")
 	@PostMapping("/vipGroupApply")
@@ -69,4 +72,15 @@ public class TeacherVipGroupController extends BaseController {
 		return succeed(vipGroupService.querySchoolByUserId(user.getId()));
 	}
 
+	@ApiOperation(value = "获取教师所在分部学生列表")
+	@GetMapping("/queryStudentsWithTeacher")
+	public Object queryStudentsWithTeacher(StudentManageQueryInfo queryInfo){
+		SysUser user = sysUserFeignService.queryUserInfo();
+		if (Objects.isNull(user)) {
+			return failed(HttpStatus.FORBIDDEN, "请登录");
+		}
+		queryInfo.setTeacherId(user.getId());
+		return succeed(studentManageService.queryStudentsWithTeacher(queryInfo));
+	}
+
 }

+ 2 - 2
mec-thirdparty/src/main/java/com/ym/mec/thirdparty/eseal/provider/TsignPlugin.java

@@ -58,12 +58,12 @@ public class TsignPlugin implements ESealPlugin, InitializingBean, DisposableBea
 		projectconfig.setItsmApiUrl(apisUrl);
 		Result result = ServiceClientManager.registClient(projectconfig, null, null);
 		if (result.getErrCode() != 0) {
-//			throw new ThirdpartyException("e签宝客户端注册失败:{}", result.getMsg());
+			throw new ThirdpartyException("e签宝客户端注册失败:{}", result.getMsg());
 		}
 
 		serviceClient = ServiceClientManager.get(projectId);
 		if (serviceClient == null) {
-//			throw new ThirdpartyException("获取e签宝客户端失败");
+			throw new ThirdpartyException("获取e签宝客户端失败");
 		}
 	}
 

+ 176 - 6
mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java

@@ -92,7 +92,9 @@ public class ExportController extends BaseController {
 
     @Autowired
     private CooperationOrganService cooperationOrganService;
-    
+    @Autowired
+    private StudentPaymentRouteOrderDao studentPaymentRouteOrderDao;
+
     @Autowired
     private TeacherService teacherService;
 
@@ -492,16 +494,16 @@ public class ExportController extends BaseController {
         List<VipGroup> rows = vipGroupService.findVipGroups(queryInfo).getRows();
         OutputStream outputStream = response.getOutputStream();
         if (rows != null && rows.size() > 0) {
-            rows.forEach(e -> {
+            for (VipGroup e : rows) {
                 e.setSubClassTimes(e.getTotalClassTimes() == null ? 0 : e.getTotalClassTimes() - (e.getCurrentClassTimes() == null ? 0 : e.getCurrentClassTimes()));
-            });
+            }
         }
         try {
-            HSSFWorkbook workbook = POIUtil.exportExcel(new String[]{"VIP编号", "课程名称", "课程状态", "指导老师", "指导老师", "班级人数", "课程单价",
-                    "活动方案", "当前课次", "总课次", "剩余课次", "月消耗", "上次课时间", "开课时间", "结束时间", "申请时间", "学生姓名"}, new String[]{
+            HSSFWorkbook workbook = POIUtil.exportExcel(new String[]{"VIP编号", "课程名称", "课程状态", "指导老师", "教务老师", "班级人数", "课程单价",
+                    "活动方案", "当前课次", "总课次", "剩余课次", "月消耗", "上次课时间", "开课时间", "结束时间", "申请时间", "学生姓名", "课程形式", "备注"}, new String[]{
                     "id", "name", "status.msg", "userName", "educationalTeacherName", "studentNum", "courseUnitPrice",
                     "vipGroupActivityName", "currentClassTimes", "totalClassTimes", "subClassTimes", "monthConsumeRate", "lastOverTime",
-                    "courseStartDate", "coursesExpireDate", "registrationStartTime", "userInfo"}, rows);
+                    "courseStartDate", "coursesExpireDate", "registrationStartTime", "userInfo", "vipGroupCategoryName", "stopReason"}, rows);
             response.setContentType("application/octet-stream");
             response.setHeader("Content-Disposition", "attachment;filename=lender-" + DateUtil.getDate(new Date()) + ".xls");
             response.flushBuffer();
@@ -1803,6 +1805,174 @@ public class ExportController extends BaseController {
     }
 
 
+    @ApiOperation(value = "财务管理导出")
+    @RequestMapping("export/routeOrderList")
+    @PreAuthorize("@pcs.hasPermissions('export/routeOrderList')")
+    public void routeOrderList(StudentPaymentOrderQueryInfo queryInfo, HttpServletResponse response) throws IOException {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (!sysUser.getIsSuperAdmin()) {
+            Employee employee = employeeDao.get(sysUser.getId());
+            if (StringUtils.isEmpty(queryInfo.getRoutingOrganId()) && queryInfo.getOrderType().equals("3")) {
+                queryInfo.setRoutingOrganId(employee.getOrganIdList());
+            } else if (StringUtils.isEmpty(queryInfo.getOrganId())) {
+                queryInfo.setOrganId(employee.getOrganIdList());
+            }
+        }
+        queryInfo.setPage(1);
+        queryInfo.setRows(49999);
+        queryInfo.setIsExport(true);
+        queryInfo.setOrderType("3");
+        Map<String, Object> params = new HashMap<String, Object>();
+        MapUtil.populateMap(params, queryInfo);
+        List<StudentPaymentOrderExportDto> studentPaymentOrderExportDtos = studentPaymentRouteOrderDao.ExportQueryPage(params);
+        if (studentPaymentOrderExportDtos.size() > 50000) {
+            throw new BizException("数据集太大,不能导出.最大数据集不能超过50000");
+        }
+        OutputStream outputStream = response.getOutputStream();
+        long i = 1;
+        for (StudentPaymentOrderExportDto row : studentPaymentOrderExportDtos) {
+            if (queryInfo.getOrderType().equals("1")) {
+                BigDecimal comAmount = row.getComAmount() == null ? BigDecimal.ZERO : row.getComAmount();
+                row.setActualAmount(comAmount);
+            } else if (queryInfo.getOrderType().equals("2")) {
+                BigDecimal perAmount = row.getPerAmount() == null ? BigDecimal.ZERO : row.getPerAmount();
+                row.setActualAmount(perAmount);
+            }
+            if (row.getActualAmount() == null) {
+                row.setActualAmount(BigDecimal.ZERO);
+            }
+            if (row.getBalancePaymentAmount() == null) {
+                row.setBalancePaymentAmount(BigDecimal.ZERO);
+            }
+            BigDecimal transferFee = (row.getActualAmount().multiply(new BigDecimal("0.28")).divide(new BigDecimal(100))).setScale(2, BigDecimal.ROUND_HALF_UP);
+            row.setTransferFee(transferFee);
+            BigDecimal musicalFee = BigDecimal.ZERO;
+            BigDecimal teachingFee = BigDecimal.ZERO;
+            BigDecimal courseFee = BigDecimal.ZERO;
+            BigDecimal leaseFee = BigDecimal.ZERO;
+            String goodsName = "";
+            if (row.getOrderDetailList() != null) {
+                for (StudentPaymentOrderDetail orderDetail : row.getOrderDetailList()) {
+                    if (orderDetail.getType().equals(OrderDetailTypeEnum.MUSICAL)) {
+                        if (orderDetail.getKitGroupPurchaseType() != null && orderDetail.getKitGroupPurchaseType().equals(KitGroupPurchaseTypeEnum.LEASE)) {
+                            leaseFee = orderDetail.getPrice();
+                        } else {
+                            musicalFee = orderDetail.getPrice();
+                        }
+                    } else if (orderDetail.getType().equals(OrderDetailTypeEnum.COURSE)) {
+                        courseFee = courseFee.add(orderDetail.getPrice());
+                    } else if (orderDetail.getType().equals(OrderDetailTypeEnum.ACCESSORIES) || orderDetail.getType().equals(OrderDetailTypeEnum.TEACHING) || orderDetail.getType().equals(OrderDetailTypeEnum.OTHER)) {
+                        teachingFee = teachingFee.add(orderDetail.getPrice());
+                    }
+                }
+            }
+            if (row.getGoodsList() != null) {
+                goodsName = row.getGoodsList().stream().map(Goods::getName).collect(Collectors.joining("|"));
+            }
+            row.setCourseFee(courseFee);
+            row.setMusicalFee(musicalFee);
+            row.setTeachingFee(teachingFee);
+            row.setLeaseFee(leaseFee);
+            row.setMemo(goodsName);
+            //专业
+            if (row.getGroupType().equals(GroupType.MUSIC)) {
+                StudentRegistration studentRegistration = studentRegistrationDao.findStudentByMusicGroupIdAndUserId(row.getMusicGroupId(), row.getUserId());
+                if (studentRegistration != null) {
+                    row.setSubjectName(studentRegistration.getSubjectName());
+                    row.setSchoolName(studentRegistration.getSchoolName());
+                    row.setCooperationOrganName(studentRegistration.getRemark());
+                }
+            } else if (row.getGroupType().equals(GroupType.VIP)) {
+                row.setCourseFee(row.getActualAmount());
+                VipGroup vipGroupInfo = vipGroupDao.findVipGroupInfo(Integer.parseInt(row.getMusicGroupId()), row.getClassGroupId());
+                if (vipGroupInfo != null) {
+                    row.setSchoolName(vipGroupInfo.getSchoolName());
+                    row.setSubjectName(vipGroupInfo.getSubjectName());
+                }
+
+            } else if (row.getGroupType().equals(GroupType.SPORADIC)) {
+                row.setSporadicAmount(row.getActualAmount());
+                row.setMusicalFee(BigDecimal.ZERO);
+                row.setTeachingFee(BigDecimal.ZERO);
+                if (row.getChargeType() != null) {
+
+                    if (row.getChargeType().equals(1)) {
+                        row.setSporadicType("考级");
+                    } else if (row.getChargeType().equals(2)) {
+                        row.setSporadicType("声部更改");
+                    } else if (row.getChargeType().equals(3)) {
+                        row.setSporadicType("乐器更换");
+                    } else if (row.getChargeType().equals(4)) {
+                        row.setSporadicType("配件销售");
+                    } else if (row.getChargeType().equals(5)) {
+                        row.setSporadicType("维修费");
+                    } else if (row.getChargeType().equals(6)) {
+                        row.setSporadicType("福袋活动");
+                    } else if (row.getChargeType().equals(7)) {
+                        row.setSporadicType("上门费");
+                    } else if (row.getChargeType().equals(9)) {
+                        row.setSporadicType("账户充值");
+                    } else if (row.getChargeType().equals(10)) {
+                        row.setSporadicType("乐保服务");
+                    } else if (row.getChargeType().equals(11)) {
+                        row.setSporadicType("其他");
+                    }
+                }
+                School userSchool = musicGroupDao.findUserSchool(row.getUserId());
+                if (userSchool != null) {
+                    row.setSchoolName(userSchool.getName());
+                }
+            } else if (row.getGroupType().equals(GroupType.PRACTICE)) {
+                row.setCourseFee(row.getActualAmount());
+                School userSchool = musicGroupDao.findUserSchool(row.getUserId());
+                if (userSchool != null) {
+                    row.setSchoolName(userSchool.getName());
+                }
+                PracticeCourseDto practiceGroup = practiceGroupDao.findByGroupId(Integer.parseInt(row.getMusicGroupId()));
+                if (practiceGroup != null) {
+                    row.setSubjectName(practiceGroup.getSubjectName());
+                }
+            }
+            String paymentChannel = "";
+            if (row.getPaymentChannel() == null) {
+            } else if (row.getPaymentChannel().equals("YQPAY")) {
+                paymentChannel = "双乾";
+            } else if (row.getPaymentChannel().equals("ADAPAY")) {
+                paymentChannel = "汇付";
+            } else if (row.getPaymentChannel().equals("BALANCE")) {
+                paymentChannel = "余额";
+            }
+            row.setPaymentChannel(paymentChannel);
+            row.setId(i);
+            i++;
+        }
+
+        try {
+            String[] header = {"序号", "学生姓名", "交易流水号", "订单编号", "收款渠道", "收款账户", "应付金额", "现金支付", "余额支付","分润账户","分润金额","分润余额","到账时间",
+                    "关联乐团ID/VIP课ID", "课程形态", "课程费用", "减免费用", "押金", "乐器", "教辅费用", "零星收款费用", "零星收款类别", "手续费", "专业", "分部", "单位/学校", "合作机构", "备注"};
+            String[] body = {"id", "user.username", "transNo", "orderNo", "paymentChannel", "merNos", "expectAmount", "actualAmount", "balancePaymentAmount","routeMerNo","routeAmount","routeBalance", "payTime", "musicGroupId",
+                    "groupType.desc", "courseFee", "remitFee", "leaseFee", "musicalFee", "teachingFee", "sporadicAmount", "sporadicType", "transferFee", "subjectName", "organName", "schoolName", "cooperationOrganName", "memo"};
+            HSSFWorkbook workbook = POIUtil.exportExcel(header, body, studentPaymentOrderExportDtos);
+            response.setContentType("application/octet-stream");
+            response.setHeader("Content-Disposition", "attachment;filename=lender-" + DateUtil.getDate(new Date()) + ".xls"); //    //收款账户
+            response.flushBuffer();
+            outputStream = response.getOutputStream();
+            workbook.write(outputStream);
+            outputStream.flush();
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (outputStream != null) {
+                try {
+                    outputStream.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+
+
     @ApiOperation(value = "老师默认课酬导出")
     @RequestMapping("export/teacherDefaultSalary")
     @PreAuthorize("@pcs.hasPermissions('export/teacherDefaultSalary')")