zouxuan 5 lat temu
rodzic
commit
cddec3cc4f
20 zmienionych plików z 756 dodań i 60 usunięć
  1. 7 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SporadicChargeInfoDao.java
  2. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentPaymentOrderDao.java
  3. 51 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/SporadicPayDto.java
  4. 137 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SporadicChargeInfo.java
  5. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/GroupType.java
  6. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/OrderTypeEnum.java
  7. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/PlatformCashAccountDetailTypeEnum.java
  8. 29 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/SporadicChargeInfoQueryInfo.java
  9. 8 6
      mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupService.java
  10. 23 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SporadicChargeInfoService.java
  11. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentPaymentOrderService.java
  12. 90 51
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
  13. 88 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SporadicChargeInfoImpl.java
  14. 5 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderServiceImpl.java
  15. 97 0
      mec-biz/src/main/resources/config/mybatis/SporadicChargeInfo.xml
  16. 9 0
      mec-biz/src/main/resources/config/mybatis/StudentPaymentOrderMapper.xml
  17. 2 1
      mec-student/src/main/java/com/ym/mec/student/controller/MusicGroupController.java
  18. 87 0
      mec-student/src/main/java/com/ym/mec/student/controller/SporadicChargeInfoController.java
  19. 4 1
      mec-student/src/main/java/com/ym/mec/student/controller/StudentOrderController.java
  20. 97 0
      mec-web/src/main/java/com/ym/mec/web/controller/SporadicChargeInfoController.java

+ 7 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SporadicChargeInfoDao.java

@@ -0,0 +1,7 @@
+package com.ym.mec.biz.dal.dao;
+
+import com.ym.mec.biz.dal.entity.SporadicChargeInfo;
+import com.ym.mec.common.dal.BaseDAO;
+
+public interface SporadicChargeInfoDao extends BaseDAO<Integer, SporadicChargeInfo> {
+}

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentPaymentOrderDao.java

@@ -147,4 +147,14 @@ public interface StudentPaymentOrderDao extends BaseDAO<Long, StudentPaymentOrde
                                  @Param("groupType") String groupType);
 
     List<StudentPaymentOrder> findStudentPaymentOrder(@Param("groupType") String groupType,@Param("musicGroupId") String musicGroupId);
+
+    /**
+     * 获取零星订单
+     * @param userId
+     * @param sporadicId
+     * @param groupType
+     * @param status
+     * @return
+     */
+    Integer findOrderByGroupType(@Param("userId") Integer userId, @Param("sporadicId") Integer sporadicId, @Param("groupType") String groupType, @Param("status") DealStatusEnum status);
 }

+ 51 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/SporadicPayDto.java

@@ -0,0 +1,51 @@
+package com.ym.mec.biz.dal.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.math.BigDecimal;
+
+public class SporadicPayDto {
+    @ApiModelProperty(value = "金额",required = false)
+    private BigDecimal amount;
+
+    @ApiModelProperty(value = "用户编号",required = false)
+    private Integer userId;
+
+    @ApiModelProperty(value = "支付项编号",required = false)
+    private Integer sporadicId;
+
+    @ApiModelProperty(value = "是否余额支付",required = false)
+    Boolean isUseBalancePayment = false;
+
+    public BigDecimal getAmount() {
+        return amount;
+    }
+
+    public void setAmount(BigDecimal amount) {
+        this.amount = amount;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Integer getSporadicId() {
+        return sporadicId;
+    }
+
+    public void setSporadicId(Integer sporadicId) {
+        this.sporadicId = sporadicId;
+    }
+
+    public Boolean getUseBalancePayment() {
+        return isUseBalancePayment;
+    }
+
+    public void setUseBalancePayment(Boolean useBalancePayment) {
+        isUseBalancePayment = useBalancePayment;
+    }
+}

+ 137 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SporadicChargeInfo.java

@@ -0,0 +1,137 @@
+package com.ym.mec.biz.dal.entity;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 对应数据库表(sporadic_charge_info):
+ */
+public class SporadicChargeInfo {
+	/**  */
+	private Integer id;
+
+	@ApiModelProperty(value = "标题", required = true)
+	private String title;
+
+	@ApiModelProperty(value = "收费类型", required = true)
+	private String chargeType;
+
+	private Integer organId;
+
+	private String organName;
+
+	private BigDecimal amount;
+
+	private BigDecimal balance;
+
+	@ApiModelProperty(value = "收费详情", required = true)
+	private String detail;
+
+	private Date createTime;
+
+	private Date updateTime;
+
+	@ApiModelProperty(value = "操作人编号", required = true)
+	private Integer operatorId;
+
+	@ApiModelProperty(value = "操作人", required = true)
+	private String operatorName;
+
+	public String getOrganName() {
+		return organName;
+	}
+
+	public void setOrganName(String organName) {
+		this.organName = organName;
+	}
+
+	public String getOperatorName() {
+		return operatorName;
+	}
+
+	public void setOperatorName(String operatorName) {
+		this.operatorName = operatorName;
+	}
+
+	public BigDecimal getBalance() {
+		return balance;
+	}
+
+	public void setBalance(BigDecimal balance) {
+		this.balance = balance;
+	}
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public String getTitle() {
+		return title;
+	}
+
+	public void setTitle(String title) {
+		this.title = title;
+	}
+
+	public String getChargeType() {
+		return chargeType;
+	}
+
+	public void setChargeType(String chargeType) {
+		this.chargeType = chargeType;
+	}
+
+	public Integer getOrganId() {
+		return organId;
+	}
+
+	public void setOrganId(Integer organId) {
+		this.organId = organId;
+	}
+
+	public BigDecimal getAmount() {
+		return amount;
+	}
+
+	public void setAmount(BigDecimal amount) {
+		this.amount = amount;
+	}
+
+	public String getDetail() {
+		return detail;
+	}
+
+	public void setDetail(String detail) {
+		this.detail = detail;
+	}
+
+	public Date getCreateTime() {
+		return createTime;
+	}
+
+	public void setCreateTime(Date createTime) {
+		this.createTime = createTime;
+	}
+
+	public Date getUpdateTime() {
+		return updateTime;
+	}
+
+	public void setUpdateTime(Date updateTime) {
+		this.updateTime = updateTime;
+	}
+
+	public Integer getOperatorId() {
+		return operatorId;
+	}
+
+	public void setOperatorId(Integer operatorId) {
+		this.operatorId = operatorId;
+	}
+}

+ 1 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/GroupType.java

@@ -3,7 +3,7 @@ package com.ym.mec.biz.dal.enums;
 import com.ym.mec.common.enums.BaseEnum;
 
 public enum GroupType implements BaseEnum<String, GroupType> {
-	MUSIC("乐团课"), VIP("VIP课"), DEMO("试听课");
+	MUSIC("乐团课"), VIP("VIP课"), DEMO("试听课"), SPORADIC("零星收费");
 
 	private String desc;
 

+ 1 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/OrderTypeEnum.java

@@ -8,6 +8,7 @@ import com.ym.mec.common.enums.BaseEnum;
 public enum OrderTypeEnum implements BaseEnum<String, OrderTypeEnum> {
 	APPLY("APPLY", "报名"),
 	RENEW("RENEW", "续费"),
+	SPORADIC("SPORADIC", "零星收费"),
 	OTHER("OTHER", "其他"),
 	SMALL_CLASS_TO_BUY("SMALL_CLASS_TO_BUY", "小课购买");
 

+ 1 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/PlatformCashAccountDetailTypeEnum.java

@@ -9,6 +9,7 @@ public enum PlatformCashAccountDetailTypeEnum implements BaseEnum<String, Platfo
 	RECHARGE("RECHARGE", "充值"),
 	WITHDRAW("WITHDRAW", "提现"),
 	PAY_FEE("PAY_FEE", "缴费"),
+	SPORADIC("SPORADIC", "零星收费"),
 	FILL_ACCOUNT("FILL_ACCOUNT", "人工补账"),
 	REFUNDS("REFUNDS", "退费"),
 	REWARDS("REWARDS", "奖励"),

+ 29 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/SporadicChargeInfoQueryInfo.java

@@ -0,0 +1,29 @@
+package com.ym.mec.biz.dal.page;
+
+import com.ym.mec.common.page.QueryInfo;
+import io.swagger.annotations.ApiModelProperty;
+
+public class SporadicChargeInfoQueryInfo extends QueryInfo {
+
+    @ApiModelProperty(value = "分部编号",required = false)
+    private String organId;
+
+    @ApiModelProperty(value = "收费类型",required = false)
+    private Integer chargeType;
+
+    public String getOrganId() {
+        return organId;
+    }
+
+    public void setOrganId(String organId) {
+        this.organId = organId;
+    }
+
+    public Integer getChargeType() {
+        return chargeType;
+    }
+
+    public void setChargeType(Integer chargeType) {
+        this.chargeType = chargeType;
+    }
+}

+ 8 - 6
mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupService.java

@@ -7,15 +7,10 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import com.ym.mec.biz.dal.dto.*;
 import org.springframework.web.bind.annotation.RequestBody;
 
 import com.ym.mec.auth.api.entity.SysUser;
-import com.ym.mec.biz.dal.dto.BasicUserDto;
-import com.ym.mec.biz.dal.dto.CourseScheduleTeachersDto;
-import com.ym.mec.biz.dal.dto.MusicCardDto;
-import com.ym.mec.biz.dal.dto.RegisterPayDto;
-import com.ym.mec.biz.dal.dto.SubFeeSettingDto;
-import com.ym.mec.biz.dal.dto.UpdateExpectedNumDto;
 import com.ym.mec.biz.dal.entity.ApprovalStatus;
 import com.ym.mec.biz.dal.entity.MusicGroup;
 import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
@@ -33,6 +28,13 @@ public interface MusicGroupService extends BaseService<String, MusicGroup> {
 	String createGroup(SubFeeSettingDto subFeeSettingDto) throws Exception;
 
 	/**
+	 * 零星缴费
+	 * @param sporadicPayDto
+	 * @return
+	 */
+	Map sporadicPay(SporadicPayDto sporadicPayDto) throws Exception;
+
+	/**
 	 * 缴费
 	 * @param registerPayDto
 	 * @return

+ 23 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/SporadicChargeInfoService.java

@@ -0,0 +1,23 @@
+package com.ym.mec.biz.service;
+
+import com.ym.mec.biz.dal.entity.SporadicChargeInfo;
+import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
+import com.ym.mec.biz.dal.page.SporadicChargeInfoQueryInfo;
+import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.service.BaseService;
+
+public interface SporadicChargeInfoService extends BaseService<Integer, SporadicChargeInfo> {
+
+    /**
+     * 零星支付订单
+     * @param order
+     */
+    Boolean renewForCallback(StudentPaymentOrder order);
+
+    /**
+     * 分页查询
+     * @param queryInfo
+     * @return
+     */
+    PageInfo queryDetailPage(SporadicChargeInfoQueryInfo queryInfo);
+}

+ 9 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/StudentPaymentOrderService.java

@@ -68,4 +68,13 @@ public interface StudentPaymentOrderService extends BaseService<Long, StudentPay
 
 	void updateOrder(Map<String, String> rpMap) throws Exception;
 
+	/**
+	 * 获取零星订单
+	 * @param userId
+	 * @param sporadicId
+	 * @param sporadic
+	 * @param status
+	 * @return
+	 */
+	Integer findOrderByGroupType(Integer userId, Integer sporadicId, String sporadic, DealStatusEnum status);
 }

+ 90 - 51
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java

@@ -13,6 +13,9 @@ import java.util.Map;
 import java.util.Set;
 import java.util.stream.Collectors;
 
+import com.ym.mec.biz.dal.dao.*;
+import com.ym.mec.biz.dal.dto.*;
+import com.ym.mec.biz.dal.entity.*;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -24,58 +27,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.auth.api.entity.SysUserRole;
-import com.ym.mec.biz.dal.dao.ChargeTypeDao;
-import com.ym.mec.biz.dal.dao.ClassGroupDao;
-import com.ym.mec.biz.dal.dao.ClassGroupStudentMapperDao;
-import com.ym.mec.biz.dal.dao.CooperationOrganDao;
-import com.ym.mec.biz.dal.dao.CourseScheduleDao;
-import com.ym.mec.biz.dal.dao.CourseScheduleStudentPaymentDao;
-import com.ym.mec.biz.dal.dao.CourseScheduleTeacherSalaryDao;
-import com.ym.mec.biz.dal.dao.EmployeeDao;
-import com.ym.mec.biz.dal.dao.MusicGroupBuildLogDao;
-import com.ym.mec.biz.dal.dao.MusicGroupDao;
-import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderDao;
-import com.ym.mec.biz.dal.dao.MusicGroupPaymentEntitiesDao;
-import com.ym.mec.biz.dal.dao.MusicGroupPurchaseListDao;
-import com.ym.mec.biz.dal.dao.MusicGroupQuitDao;
-import com.ym.mec.biz.dal.dao.MusicGroupStudentFeeDao;
-import com.ym.mec.biz.dal.dao.MusicGroupSubjectGoodsGroupDao;
-import com.ym.mec.biz.dal.dao.MusicGroupSubjectPlanDao;
-import com.ym.mec.biz.dal.dao.OrganizationDao;
-import com.ym.mec.biz.dal.dao.SchoolDao;
-import com.ym.mec.biz.dal.dao.StudentPaymentOrderDao;
-import com.ym.mec.biz.dal.dao.StudentPaymentOrderDetailDao;
-import com.ym.mec.biz.dal.dao.StudentRegistrationDao;
-import com.ym.mec.biz.dal.dao.SysConfigDao;
-import com.ym.mec.biz.dal.dao.TeacherAttendanceDao;
-import com.ym.mec.biz.dal.dao.TeacherDao;
-import com.ym.mec.biz.dal.dto.BasicUserDto;
-import com.ym.mec.biz.dal.dto.CourseScheduleTeachersDto;
-import com.ym.mec.biz.dal.dto.MusicCardDto;
-import com.ym.mec.biz.dal.dto.RegisterPayDto;
-import com.ym.mec.biz.dal.dto.SubFeeSettingDto;
-import com.ym.mec.biz.dal.dto.SubjectRegisterDto;
-import com.ym.mec.biz.dal.dto.UpdateExpectedNumDto;
-import com.ym.mec.biz.dal.entity.ApprovalStatus;
-import com.ym.mec.biz.dal.entity.ChargeType;
-import com.ym.mec.biz.dal.entity.CourseSchedule;
-import com.ym.mec.biz.dal.entity.CourseScheduleTeacherSalary;
-import com.ym.mec.biz.dal.entity.Goods;
-import com.ym.mec.biz.dal.entity.MusicGroup;
-import com.ym.mec.biz.dal.entity.MusicGroupBuildLog;
-import com.ym.mec.biz.dal.entity.MusicGroupQuit;
-import com.ym.mec.biz.dal.entity.MusicGroupStudentFee;
 import com.ym.mec.biz.dal.entity.MusicGroupStudentFee.PaymentStatus;
-import com.ym.mec.biz.dal.entity.MusicGroupSubjectGoodsGroup;
-import com.ym.mec.biz.dal.entity.MusicGroupSubjectPlan;
-import com.ym.mec.biz.dal.entity.Organization;
-import com.ym.mec.biz.dal.entity.School;
-import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
-import com.ym.mec.biz.dal.entity.StudentPaymentOrderDetail;
-import com.ym.mec.biz.dal.entity.StudentRegistration;
-import com.ym.mec.biz.dal.entity.SysUserCashAccount;
-import com.ym.mec.biz.dal.entity.SysUserCashAccountDetail;
-import com.ym.mec.biz.dal.entity.Teacher;
 import com.ym.mec.biz.dal.enums.ClassGroupStudentStatusEnum;
 import com.ym.mec.biz.dal.enums.ClassGroupTypeEnum;
 import com.ym.mec.biz.dal.enums.CourseStatusEnum;
@@ -218,6 +170,8 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     @Autowired
     private StudentRegistrationService studentRegistrationService;
     @Autowired
+    private SporadicChargeInfoDao sporadicChargeInfoDao;
+    @Autowired
     private MusicGroupSubjectGoodsGroupService musicGroupSubjectGoodsGroupService;
     @Autowired
     private GoodsService goodsService;
@@ -336,6 +290,91 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
     @Override
     @Transactional(rollbackFor = Exception.class)
+    public Map sporadicPay(SporadicPayDto sporadicPayDto) throws Exception {
+        //获取收费项价格
+        SporadicChargeInfo chargeInfo = sporadicChargeInfoDao.get(sporadicPayDto.getSporadicId());
+        if(chargeInfo == null){
+            throw new BizException("支付项不存在");
+        }
+        BigDecimal amount = sporadicPayDto.getAmount();
+        if(!(amount.compareTo(chargeInfo.getAmount())==0)){
+            throw new BizException("订单金额异常");
+        }
+        Integer userId = sporadicPayDto.getUserId();
+        String orderNo = idGeneratorService.generatorId("payment") + "";
+        String channelType = "";
+        StudentPaymentOrder studentPaymentOrder = new StudentPaymentOrder();
+        studentPaymentOrder.setUserId(userId);
+        studentPaymentOrder.setGroupType(GroupType.SPORADIC);
+        studentPaymentOrder.setOrderNo(orderNo);
+        studentPaymentOrder.setType(OrderTypeEnum.SPORADIC);
+        studentPaymentOrder.setExpectAmount(amount);
+        studentPaymentOrder.setActualAmount(amount);
+        studentPaymentOrder.setStatus(DealStatusEnum.ING);
+        studentPaymentOrder.setMusicGroupId(sporadicPayDto.getSporadicId().toString());
+        studentPaymentOrderService.insert(studentPaymentOrder);
+
+        studentPaymentOrder.setVersion(0);
+        Date date = new Date();
+        if(sporadicPayDto.getUseBalancePayment() || amount.doubleValue() == 0){
+            studentPaymentOrder.setPaymentChannel("BALANCE");
+            SysUserCashAccount userCashAccount = sysUserCashAccountService.getLocked(userId);
+            if(userCashAccount == null){
+                throw new BizException("用户账户找不到");
+            }
+            if(userCashAccount.getBalance().subtract(amount).doubleValue() > 0){
+                // 更新订单信息
+                studentPaymentOrder.setActualAmount(new BigDecimal(0));
+                studentPaymentOrder.setBalancePaymentAmount(amount);
+                studentPaymentOrder.setStatus(DealStatusEnum.SUCCESS);
+                studentPaymentOrder.setUpdateTime(date);
+                sysUserCashAccountService.updateBalance(userId, amount.negate(),PlatformCashAccountDetailTypeEnum.SPORADIC,chargeInfo.getTitle());
+                studentPaymentOrderService.update(studentPaymentOrder);
+                Map result = new HashMap(1);
+                result.put("orderNo",orderNo);
+                return result;
+            }else{
+                if (userCashAccount.getBalance().doubleValue() > 0) {
+                    sysUserCashAccountService.updateBalance(userId, userCashAccount.getBalance().negate(), PlatformCashAccountDetailTypeEnum.SPORADIC, chargeInfo.getTitle());
+                    amount = amount.subtract(userCashAccount.getBalance());
+                    studentPaymentOrder.setBalancePaymentAmount(userCashAccount.getBalance());
+                } else {
+                    studentPaymentOrder.setBalancePaymentAmount(new BigDecimal(0));
+                }
+            }
+        }
+
+        studentPaymentOrderService.update(studentPaymentOrder);
+        if(amount.compareTo(BigDecimal.ZERO)==0) {
+            Map<String, String> notifyMap = new HashMap<>();
+            notifyMap.put("tradeState", "1");
+            notifyMap.put("merOrderNo", studentPaymentOrder.getOrderNo());
+            notifyMap.put("channelType", channelType);
+            notifyMap.put("orderNo", "");
+            studentPaymentOrderService.updateOrder(notifyMap);
+            return notifyMap;
+        }
+
+        studentPaymentOrder.setVersion(studentPaymentOrder.getVersion()+1);
+
+        String baseApiUrl = sysConfigDao.findConfigValue("base_api_url");
+        Map payMap = payService.getPayMap(
+                amount,
+                orderNo,
+                baseApiUrl+"/api-student/studentOrder/notify",
+                baseApiUrl+"/#/paymentresult?orderNo=" + orderNo,
+                chargeInfo.getTitle(),
+                chargeInfo.getTitle(),
+                userId);
+
+        studentPaymentOrder.setPaymentChannel((String) payMap.get("type"));
+        studentPaymentOrder.setUpdateTime(date);
+        studentPaymentOrderService.update(studentPaymentOrder);
+        return payMap;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
 	public Map pay(RegisterPayDto registerPayDto) throws Exception {
 
         StudentRegistration studentRegistration = studentRegistrationService.get(registerPayDto.getRegisterId().longValue());

+ 88 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SporadicChargeInfoImpl.java

@@ -0,0 +1,88 @@
+package com.ym.mec.biz.service.impl;
+
+import com.ym.mec.biz.dal.dao.*;
+import com.ym.mec.biz.dal.entity.*;
+import com.ym.mec.biz.dal.enums.DealStatusEnum;
+import com.ym.mec.biz.dal.enums.MessageTypeEnum;
+import com.ym.mec.biz.dal.enums.PlatformCashAccountDetailTypeEnum;
+import com.ym.mec.biz.dal.page.SporadicChargeInfoQueryInfo;
+import com.ym.mec.biz.service.SporadicChargeInfoService;
+import com.ym.mec.biz.service.SysUserCashAccountService;
+import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.exception.BizException;
+import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.service.impl.BaseServiceImpl;
+import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
+import com.ym.mec.util.collection.MapUtil;
+import com.ym.mec.util.http.HttpUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service
+public class SporadicChargeInfoImpl extends BaseServiceImpl<Integer, SporadicChargeInfo>  implements SporadicChargeInfoService {
+	
+	@Autowired
+	private SporadicChargeInfoDao sporadicChargeInfoDao;
+	@Autowired
+	private StudentPaymentOrderDao studentPaymentOrderDao;
+	@Autowired
+	private OrganizationDao organizationDao;
+	@Autowired
+	private TeacherDao teacherDao;
+
+	@Override
+	public BaseDAO<Integer, SporadicChargeInfo> getDAO() {
+		return sporadicChargeInfoDao;
+	}
+
+	@Override
+	@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+	public Boolean renewForCallback(StudentPaymentOrder studentPaymentOrder) {
+		studentPaymentOrderDao.update(studentPaymentOrder);
+//		Integer userId = studentPaymentOrder.getUserId();
+//		String musicGroupId = studentPaymentOrder.getMusicGroupId();
+
+//		Date date = new Date();
+		if(studentPaymentOrder.getStatus() == DealStatusEnum.SUCCESS){
+			// 发送续费结果通知
+//			sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_SMS_MUSIC_GROUP_RENEW_SUCCESS, push, null, 0, "1",
+//					studentRegistration.getParentsName(),studentPaymentOrder.getActualAmount());
+//			sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.YIMEI, MessageTypeEnum.STUDENT_SMS_MUSIC_GROUP_RENEW_SUCCESS, yimei, null, 0, "1",
+//					studentRegistration.getParentsName(),studentPaymentOrder.getActualAmount());
+			return true;
+		}
+		if(studentPaymentOrder.getStatus() == DealStatusEnum.CLOSE || studentPaymentOrder.getStatus() == DealStatusEnum.FAILED){
+//            String studentApplyUrl = sysConfigDao.findConfigValue(SysConfigService.STUDENT_APPLY_URL) + musicGroupId;
+//			String memo = "http://mstudev.dayaedu.com/#/renew?musicGroupId=" + musicGroupId;
+			//4?http://mstudev.dayaedu.com/#/renew?musicGroupId=" +musicGroupId
+//			sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_MUSIC_GROUP_RENEW_FAILED, push, null, 0, "4?" + memo,
+//					HttpUtil.getSortUrl(memo));
+//			sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.YIMEI, MessageTypeEnum.STUDENT_PUSH_MUSIC_GROUP_RENEW_FAILED, yimei, null, 0, "4?" + memo,
+//					HttpUtil.getSortUrl(memo));
+			return false;
+		}
+		return false;
+	}
+
+	@Override
+	public PageInfo queryDetailPage(SporadicChargeInfoQueryInfo queryInfo) {
+		PageInfo<SporadicChargeInfo> pageInfo = queryPage(queryInfo);
+		List<SporadicChargeInfo> rows = pageInfo.getRows();
+		Set<Integer> organIds = rows.stream().map(e -> e.getOrganId()).collect(Collectors.toSet());
+		Set<Integer> operatorIds = rows.stream().map(e -> e.getOperatorId()).collect(Collectors.toSet());
+        Map<Integer,String> organNames = MapUtil.convertMybatisMap(organizationDao.findOrganNameMap(StringUtils.join(organIds,",")));
+        Map<Integer,String> OperatorNames = MapUtil.convertMybatisMap(teacherDao.queryNameByIds(StringUtils.join(operatorIds,",")));
+		rows.forEach(e->{
+			e.setOrganName(organNames.get(e.getOrganId()));
+			e.setOperatorName(OperatorNames.get(e.getOperatorId()));
+		});
+		return pageInfo;
+	}
+}

+ 5 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderServiceImpl.java

@@ -189,6 +189,11 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
         }
     }
 
+    @Override
+    public Integer findOrderByGroupType(Integer userId, Integer sporadicId, String sporadic, DealStatusEnum status) {
+        return studentPaymentOrderDao.findOrderByGroupType(userId,sporadicId,sporadic,status);
+    }
+
     private void closeOrders(List<String> orderNoList) throws Exception {
         if (orderNoList.size() == 0) {
             return;

+ 97 - 0
mec-biz/src/main/resources/config/mybatis/SporadicChargeInfo.xml

@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!-- 这个文件是自动生成的。 不要修改此文件。所有改动将在下次重新自动生成时丢失。 -->
+<mapper namespace="com.ym.mec.biz.dal.dao.SporadicChargeInfoDao">
+
+	<resultMap type="com.ym.mec.biz.dal.entity.SporadicChargeInfo" id="SporadicChargeInfo">
+		<result column="id_" property="id" />
+		<result column="title_" property="title" />
+		<result column="charge_type_" property="chargeType"/>
+		<result column="organ_id_" property="organId"/>
+		<result column="amount_" property="amount" />
+		<result column="detail_" property="detail" />
+		<result column="create_time_" property="createTime" />
+		<result column="update_time_" property="updateTime" />
+		<result column="operator_id_" property="operatorId" />
+	</resultMap>
+
+	<!-- 根据主键查询一条记录 -->
+	<select id="get" resultMap="SporadicChargeInfo">
+		SELECT * FROM sporadic_charge_info WHERE id_ = #{id}
+	</select>
+
+	<!-- 全查询 -->
+	<select id="findAll" resultMap="SporadicChargeInfo">
+		SELECT * FROM sporadic_charge_info ORDER BY id_
+	</select>
+
+	<!-- 向数据库增加一条记录 -->
+	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.SporadicChargeInfo"
+		useGeneratedKeys="true" keyColumn="id" keyProperty="id">
+		INSERT INTO sporadic_charge_info
+		(title_,charge_type_,organ_id_,amount_,detail_,create_time_,update_time_,operator_id_)
+		VALUES(#{title},#{chargeType},#{organId},#{amount},#{detail},now(),now(),#{operatorId})
+	</insert>
+
+	<!-- 根据主键查询一条记录 -->
+	<update id="update" parameterType="com.ym.mec.biz.dal.entity.SporadicChargeInfo">
+		UPDATE sporadic_charge_info
+		<set>
+			<if test="title != null">
+				title_ = #{title},
+			</if>
+			<if test="chargeType != null">
+				charge_type_ = #{chargeType},
+			</if>
+			<if test="organId != null">
+				organ_id_ = #{organId},
+			</if>
+			<if test="amount != null">
+				amount_ = #{amount},
+			</if>
+			<if test="detail != null">
+				detail_ = #{detail},
+			</if>
+			<if test="updateTime != null">
+				update_time_ = now(),
+			</if>
+			<if test="operatorId != null">
+				operator_id_ = #{operatorId},
+			</if>
+		</set>
+		WHERE id_ = #{id}
+	</update>
+
+	<!-- 根据主键删除一条记录 -->
+	<delete id="delete">
+		DELETE FROM sporadic_charge_info WHERE id_ = #{id}
+	</delete>
+
+	<!-- 分页查询 -->
+	<select id="queryPage" resultMap="SporadicChargeInfo" parameterType="map">
+		SELECT * FROM sporadic_charge_info sci
+		<include refid="queryPageSql"/>
+		ORDER BY id_ DESC
+		<include refid="global.limit" />
+	</select>
+
+	<sql id="queryPageSql">
+		<where>
+			<if test="organId != null">
+				AND FIND_IN_SET(sci.organ_id_,#{organId})
+			</if>
+			<if test="chargeType != null">
+				AND sci.charge_type_ = #{chargeType}
+			</if>
+			<if test="search != null">
+				AND sci.title_ LIKE CONCAT('%',#{search},'%')
+			</if>
+		</where>
+	</sql>
+
+	<!-- 查询当前表的总记录数 -->
+	<select id="queryCount" resultType="int">
+		SELECT COUNT(id_) FROM sporadic_charge_info sci
+		<include refid="queryPageSql"/>
+	</select>
+</mapper>

+ 9 - 0
mec-biz/src/main/resources/config/mybatis/StudentPaymentOrderMapper.xml

@@ -323,5 +323,14 @@
         WHERE group_type_ = #{groupType} AND type_ = 'APPLY' AND music_group_id_ = #{musicGroupId} AND status_ = 'SUCCESS'
         ORDER BY id_ DESC) sp GROUP BY sp.user_id_)
     </select>
+    <select id="findOrderByGroupType" resultType="int">
+        SELECT COUNT(id_) FROM student_payment_order
+        WHERE group_type_ = #{groupType}
+        AND user_id_ = #{userId}
+        AND music_group_id_ = #{sporadicId}
+        <if test="status != null">
+            AND status_ = #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+        </if>
+    </select>
 
 </mapper>

+ 2 - 1
mec-student/src/main/java/com/ym/mec/student/controller/MusicGroupController.java

@@ -2,8 +2,10 @@ package com.ym.mec.student.controller;
 
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.auth.api.enums.SysUserType;
 import com.ym.mec.biz.dal.dao.MusicGroupStudentFeeDao;
 import com.ym.mec.biz.dal.dto.RegisterPayDto;
+import com.ym.mec.biz.dal.dto.SporadicPayDto;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.entity.MusicGroupStudentFee.PaymentStatus;
 import com.ym.mec.biz.dal.enums.DealStatusEnum;
@@ -188,7 +190,6 @@ public class MusicGroupController extends BaseController {
         return succeed(musicGroupService.applyQuitMusicGroup(musicGroupId));
     }
 
-
     @ApiOperation(value = "乐团报名支付")
     @PostMapping("/pay")
     @ApiImplicitParams({@ApiImplicitParam(name = "registerPayDto", value = "支付信息", required = true, dataType = "Integer")})

+ 87 - 0
mec-student/src/main/java/com/ym/mec/student/controller/SporadicChargeInfoController.java

@@ -0,0 +1,87 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.auth.api.enums.SysUserType;
+import com.ym.mec.biz.dal.dao.SysUserCashAccountDao;
+import com.ym.mec.biz.dal.dto.SporadicPayDto;
+import com.ym.mec.biz.dal.entity.SporadicChargeInfo;
+import com.ym.mec.biz.dal.entity.SysUserCashAccount;
+import com.ym.mec.biz.dal.enums.DealStatusEnum;
+import com.ym.mec.biz.service.MusicGroupService;
+import com.ym.mec.biz.service.SporadicChargeInfoService;
+import com.ym.mec.biz.service.StudentPaymentOrderService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.exception.BizException;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Map;
+
+@RequestMapping("sporadicChargeInfo")
+@Api(tags = "零星收费")
+@RestController
+public class SporadicChargeInfoController extends BaseController {
+
+	@Autowired
+	private SporadicChargeInfoService sporadicChargeInfoService;
+	@Autowired
+	private SysUserFeignService sysUserFeignService;
+	@Autowired
+	private SysUserCashAccountDao sysUserCashAccountDao;
+	@Autowired
+	private StudentPaymentOrderService studentPaymentOrderService;
+	@Autowired
+	private MusicGroupService musicGroupService;
+
+	@ApiOperation(value = "单查询")
+	@GetMapping("/get")
+	public Object get(Integer id) {
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		if (sysUser == null) {
+			return failed("用户不存在");
+		}
+		SporadicChargeInfo chargeInfo = sporadicChargeInfoService.get(id);
+		if(chargeInfo != null){
+			SysUserCashAccount locked = sysUserCashAccountDao.getLocked(sysUser.getId());
+			chargeInfo.setBalance(locked.getBalance());
+		}else {
+			throw new BizException("信息不存在");
+		}
+		return succeed(chargeInfo);
+	}
+
+
+	@ApiOperation(value = "零星支付")
+	@PostMapping("/sporadicPay")
+	public HttpResponseResult sporadicPay(@RequestBody SporadicPayDto sporadicPayDto) throws Exception {
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		if (sysUser == null) {
+			return failed("用户不存在");
+		}
+		if(sporadicPayDto == null ||
+				sporadicPayDto.getSporadicId() == null ||
+				sporadicPayDto.getAmount() == null){
+			throw new BizException("参数校验失败");
+		}
+		if(sysUser.getUserType() != SysUserType.STUDENT){
+			return failed("用户信息异常");
+		}
+		sporadicPayDto.setUserId(sysUser.getId());
+		Integer ingOrder = studentPaymentOrderService.findOrderByGroupType(sporadicPayDto.getUserId(),sporadicPayDto.getSporadicId(),"SPORADIC", DealStatusEnum.ING);
+		if (ingOrder != null && ingOrder > 0){
+			return failed("您有支付中的订单");
+		}
+		Map payMap = musicGroupService.sporadicPay(sporadicPayDto);
+		if(payMap.containsKey("tradeState")){
+			return failed(HttpStatus.CREATED, "恭喜您,购买成功!");
+		}
+		return succeed(payMap);
+	}
+
+}

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

@@ -47,10 +47,11 @@ public class StudentOrderController extends BaseController {
     private StudentRegistrationService studentRegistrationService;
     @Autowired
     private VipGroupService vipGroupService;
-
     @Autowired
     private MusicGroupService musicGroupService;
     @Autowired
+    private SporadicChargeInfoService sporadicChargeInfoService;
+    @Autowired
     private YqPayFeignService yqQueryService;
     @Autowired
     private StudentPaymentOrderDetailService studentPaymentOrderDetailService;
@@ -216,6 +217,8 @@ public class StudentOrderController extends BaseController {
             vipGroupService.orderCallback(order);
         } else if (order.getType().equals(OrderTypeEnum.RENEW)) {
             musicGroupService.renewForCallback(order);
+        } else if (order.getType().equals(OrderTypeEnum.SPORADIC)) {
+            sporadicChargeInfoService.renewForCallback(order);
         }
     }
 

+ 97 - 0
mec-web/src/main/java/com/ym/mec/web/controller/SporadicChargeInfoController.java

@@ -0,0 +1,97 @@
+package com.ym.mec.web.controller;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.EmployeeDao;
+import com.ym.mec.biz.dal.entity.Employee;
+import com.ym.mec.biz.dal.entity.SporadicChargeInfo;
+import com.ym.mec.biz.dal.page.SporadicChargeInfoQueryInfo;
+import com.ym.mec.biz.service.SporadicChargeInfoService;
+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.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Arrays;
+import java.util.List;
+
+@RequestMapping("sporadicChargeInfo")
+@Api(tags = "零星收费管理")
+@RestController
+public class SporadicChargeInfoController extends BaseController {
+
+	@Autowired
+	private SporadicChargeInfoService sporadicChargeInfoService;
+	@Autowired
+	private SysUserFeignService sysUserFeignService;
+	@Autowired
+	private EmployeeDao employeeDao;
+
+	@ApiOperation(value = "查询零星收费列表")
+	@GetMapping("/queryPage")
+	@PreAuthorize("@pcs.hasPermissions('sporadicChargeInfo/queryPage')")
+	public Object queryPage(SporadicChargeInfoQueryInfo queryInfo) {
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		if (sysUser == null) {
+			return failed("用户信息获取失败");
+		}
+		if(!sysUser.getIsSuperAdmin()){
+			Employee employee = employeeDao.get(sysUser.getId());
+			if (StringUtils.isEmpty(queryInfo.getOrganId())) {
+				queryInfo.setOrganId(employee.getOrganIdList());
+			}else if(StringUtils.isEmpty(employee.getOrganIdList())){
+				return failed("用户所在分部异常");
+			}else {
+				List<String> list = Arrays.asList(employee.getOrganIdList().split(","));
+				if(!list.containsAll(Arrays.asList(queryInfo.getOrganId().split(",")))){
+					return failed("非法请求");
+				}
+			}
+		}
+		return succeed(sporadicChargeInfoService.queryDetailPage(queryInfo));
+	}
+
+	@ApiOperation(value = "单查询")
+	@GetMapping("/get")
+	@PreAuthorize("@pcs.hasPermissions('sporadicChargeInfo/get')")
+	public Object get(Integer id) {
+		return succeed(sporadicChargeInfoService.get(id));
+	}
+
+	@ApiOperation(value = "新增")
+	@PostMapping("/add")
+	@PreAuthorize("@pcs.hasPermissions('sporadicChargeInfo/add')")
+	public Object add(SporadicChargeInfo sporadicChargeInfo) {
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		if (sysUser == null) {
+			return failed("用户信息获取失败");
+		}
+		sporadicChargeInfo.setOperatorId(sysUser.getId());
+		return succeed(sporadicChargeInfoService.insert(sporadicChargeInfo));
+	}
+
+	@ApiOperation(value = "修改")
+	@PostMapping("/update")
+	@PreAuthorize("@pcs.hasPermissions('sporadicChargeInfo/update')")
+	public Object update(SporadicChargeInfo sporadicChargeInfo) {
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		if (sysUser == null) {
+			return failed("用户信息获取失败");
+		}
+		sporadicChargeInfo.setOperatorId(sysUser.getId());
+		return succeed(sporadicChargeInfoService.update(sporadicChargeInfo));
+	}
+
+	@ApiOperation(value = "删除")
+	@PostMapping("/delete")
+	@PreAuthorize("@pcs.hasPermissions('sporadicChargeInfo/delete')")
+	public Object delete(Integer id) {
+		return succeed(sporadicChargeInfoService.delete(id));
+	}
+}