Pārlūkot izejas kodu

Merge remote-tracking branch 'origin/saas' into saas

zouxuan 3 gadi atpakaļ
vecāks
revīzija
ecef13af7a

+ 1 - 0
.gitignore

@@ -11,3 +11,4 @@ bin
 .idea
 *.iml
 /lib/
+/mec-web/src/main/resources/rebel.xml

+ 9 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CloudTeacherOrderDao.java

@@ -7,7 +7,9 @@ import java.util.Map;
 import java.util.Set;
 
 import com.ym.mec.biz.dal.dto.CloudTeacherActiveTargetDetailDto;
+import com.ym.mec.biz.dal.entity.CloudTeacherStudent;
 import com.ym.mec.biz.dal.page.CloudTeacherActiveQueryInfo;
+import com.ym.mec.biz.dal.page.CloudTeacherOrderQueryInfo;
 import org.apache.ibatis.annotations.Param;
 
 import com.ym.mec.biz.dal.dto.CloudTeacherOrderDto;
@@ -84,8 +86,15 @@ public interface CloudTeacherOrderDao extends BaseDAO<Long, CloudTeacherOrder> {
 
     /**
      * 获取学员云教练活动金额
+     * @MapKey
      * @param studentIds
      * @return
      */
     List<Map<Long, BigDecimal>> queryActiveAmountMap(@Param("studentIds") List<Integer> studentIds);
+
+    int findInactiveCount(Map<String, Object> params);
+
+    List<CloudTeacherStudent> queryInactive(Map<String, Object> params);
+
+    int updateCloudTeacherOrder(@Param("payStudentIds") String payStudentIds);
 }

+ 20 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CloudTeacherOrderRecordDao.java

@@ -0,0 +1,20 @@
+package com.ym.mec.biz.dal.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ym.mec.biz.dal.entity.CloudTeacherOrderRecord;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 机构付款记录表(CloudTeacherOrderRecord)表数据库访问层
+ *
+ * @author makejava
+ * @since 2021-12-21 18:13:47
+ */
+public interface CloudTeacherOrderRecordDao extends BaseMapper<CloudTeacherOrderRecord> {
+
+    int insertBatch(@Param("entities") List<CloudTeacherOrderRecord> entities);
+
+}
+

+ 195 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CloudTeacherOrderRecord.java

@@ -0,0 +1,195 @@
+package com.ym.mec.biz.dal.entity;
+
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.baomidou.mybatisplus.annotation.TableId;
+
+import java.io.Serializable;
+
+/**
+ * 机构付款记录表(CloudTeacherOrderRecord)表实体类
+ *
+ * @author makejava
+ * @since 2021-12-21 18:13:47
+ */
+@ApiModel(value = "cloud_teacher_order_record-机构付款记录表")
+public class CloudTeacherOrderRecord implements Serializable {
+    @TableId(value = "id_", type = IdType.AUTO)
+    @ApiModelProperty(value = "主键")
+    private Integer id;
+
+    @TableField("tenant_id_")
+    @ApiModelProperty(value = "机构产品设置表id")
+    private Integer tenantId;
+
+    @TableField("order_no_")
+    @ApiModelProperty(value = "订单编号(付款前生成订单时生成的编号)")
+    private String orderNo;
+
+    @TableField("trans_no_")
+    @ApiModelProperty(value = "支付编号(付款后第三方支付给予的)")
+    private String transNo;
+
+    @TableField("order_type_")
+    @ApiModelProperty(value = "订单类型/机构开通缴费、续费、充值、激活团练宝")
+    private String orderType;
+
+    @TableField("payment_channel_")
+    @ApiModelProperty(value = "付款渠道/惠支付、双乾")
+    private String paymentChannel;
+
+    @TableField("pay_channel_")
+    @ApiModelProperty(value = "付款渠道/微信、支付宝、等")
+    private String payChannel;
+
+    @TableField("expect_amount")
+    @ApiModelProperty(value = "应付金额")
+    private BigDecimal expectAmount;
+
+    @TableField("actual_amount")
+    @ApiModelProperty(value = "实付金额")
+    private BigDecimal actualAmount;
+
+    @TableField("order_state_")
+    @ApiModelProperty(value = "订单状态/0待支付、1已支付")
+    private Integer orderState;
+
+    @TableField("pay_date_")
+    @ApiModelProperty(value = "支付日期")
+    private Date payDate;
+
+    @TableField("pay_time_")
+    @ApiModelProperty(value = "支付时间")
+    private Date payTime;
+
+    @TableField("created_time_")
+    @ApiModelProperty(value = "订单创建时间")
+    private Date createdTime;
+
+    @TableField("pay_student_ids_")
+    @ApiModelProperty(value = "${column.comment}")
+    private String payStudentIds;
+
+    private static final long serialVersionUID = 1L;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(Integer tenantId) {
+        this.tenantId = tenantId;
+    }
+
+    public String getOrderNo() {
+        return orderNo;
+    }
+
+    public void setOrderNo(String orderNo) {
+        this.orderNo = orderNo;
+    }
+
+    public String getTransNo() {
+        return transNo;
+    }
+
+    public void setTransNo(String transNo) {
+        this.transNo = transNo;
+    }
+
+    public String getOrderType() {
+        return orderType;
+    }
+
+    public void setOrderType(String orderType) {
+        this.orderType = orderType;
+    }
+
+    public String getPaymentChannel() {
+        return paymentChannel;
+    }
+
+    public void setPaymentChannel(String paymentChannel) {
+        this.paymentChannel = paymentChannel;
+    }
+
+    public String getPayChannel() {
+        return payChannel;
+    }
+
+    public void setPayChannel(String payChannel) {
+        this.payChannel = payChannel;
+    }
+
+    public BigDecimal getExpectAmount() {
+        return expectAmount;
+    }
+
+    public void setExpectAmount(BigDecimal expectAmount) {
+        this.expectAmount = expectAmount;
+    }
+
+    public BigDecimal getActualAmount() {
+        return actualAmount;
+    }
+
+    public void setActualAmount(BigDecimal actualAmount) {
+        this.actualAmount = actualAmount;
+    }
+
+    public Integer getOrderState() {
+        return orderState;
+    }
+
+    public void setOrderState(Integer orderState) {
+        this.orderState = orderState;
+    }
+
+    public Date getPayDate() {
+        return payDate;
+    }
+
+    public void setPayDate(Date payDate) {
+        this.payDate = payDate;
+    }
+
+    public Date getPayTime() {
+        return payTime;
+    }
+
+    public void setPayTime(Date payTime) {
+        this.payTime = payTime;
+    }
+
+    public Date getCreatedTime() {
+        return createdTime;
+    }
+
+    public void setCreatedTime(Date createdTime) {
+        this.createdTime = createdTime;
+    }
+
+    public String getPayStudentIds() {
+        return payStudentIds;
+    }
+
+    public void setPayStudentIds(String payStudentIds) {
+        this.payStudentIds = payStudentIds;
+    }
+
+
+}
+

+ 122 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CloudTeacherStudent.java

@@ -0,0 +1,122 @@
+package com.ym.mec.biz.dal.entity;
+
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * Description
+ * 团练宝查询学生
+ * @author: feng-ji
+ * @date: 2021-12-21
+ */
+public class CloudTeacherStudent {
+
+    @ApiModelProperty(value = "学生Id")
+    private Integer studentId;
+
+    @ApiModelProperty(value = "机构编号")
+    private Integer tenantId;
+
+    @ApiModelProperty(value = "团练宝订单Id")
+    private Integer cloudTeacherOrderId;
+
+    @ApiModelProperty(value = "姓名")
+    private String name;
+
+    @ApiModelProperty(value = "手机号")
+    private String phone;
+
+    @ApiModelProperty(value = "声部Id")
+    private Integer subject;
+
+    @ApiModelProperty(value = "声部")
+    private String subjectLabel;
+
+    @ApiModelProperty(value = "团练宝类型")
+    private Integer type;
+
+    @ApiModelProperty(value = "数量")
+    private Integer time;
+
+    @ApiModelProperty(value = "金额")
+    private Double amount;
+
+    public Integer getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(Integer tenantId) {
+        this.tenantId = tenantId;
+    }
+
+    public Integer getStudentId() {
+        return studentId;
+    }
+
+    public void setStudentId(Integer studentId) {
+        this.studentId = studentId;
+    }
+
+    public Integer getCloudTeacherOrderId() {
+        return cloudTeacherOrderId;
+    }
+
+    public void setCloudTeacherOrderId(Integer cloudTeacherOrderId) {
+        this.cloudTeacherOrderId = cloudTeacherOrderId;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public Double getAmount() {
+        return amount;
+    }
+
+    public void setAmount(Double amount) {
+        this.amount = amount;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public Integer getTime() {
+        return time;
+    }
+
+    public void setTime(Integer time) {
+        this.time = time;
+    }
+
+    public Integer getSubject() {
+        return subject;
+    }
+
+    public void setSubject(Integer subject) {
+        this.subject = subject;
+    }
+
+    public String getSubjectLabel() {
+        return subjectLabel;
+    }
+
+    public void setSubjectLabel(String subjectLabel) {
+        this.subjectLabel = subjectLabel;
+    }
+}

+ 24 - 2
mec-biz/src/main/java/com/ym/mec/biz/dal/page/CloudTeacherOrderQueryInfo.java

@@ -6,12 +6,18 @@ import com.ym.mec.common.page.QueryInfo;
 
 public class CloudTeacherOrderQueryInfo extends QueryInfo {
 
-	@ApiModelProperty(value = "交易状态(0-待生效 1-生效中 2-已生效 3-已退)", required = false)
+	@ApiModelProperty(value = "交易状态(0-待生效 1-生效中 2-已生效 3-已退)")
 	private Integer status;
 
-	@ApiModelProperty(value = "学生编号", required = false)
+	@ApiModelProperty(value = "学生编号")
 	private Integer studentId;
 
+	@ApiModelProperty(value = "学员姓名/编号/电话")
+	private String queryCondition;
+
+	@ApiModelProperty(value = "声部Id")
+	private Integer subjectId;
+
 	public Integer getStatus() {
 		return status;
 	}
@@ -27,4 +33,20 @@ public class CloudTeacherOrderQueryInfo extends QueryInfo {
 	public void setStudentId(Integer studentId) {
 		this.studentId = studentId;
 	}
+
+	public String getQueryCondition() {
+		return queryCondition;
+	}
+
+	public void setQueryCondition(String queryCondition) {
+		this.queryCondition = queryCondition;
+	}
+
+	public Integer getSubjectId() {
+		return subjectId;
+	}
+
+	public void setSubjectId(Integer subjectId) {
+		this.subjectId = subjectId;
+	}
 }

+ 15 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/CloudTeacherOrderRecordService.java

@@ -0,0 +1,15 @@
+package com.ym.mec.biz.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ym.mec.biz.dal.entity.CloudTeacherOrderRecord;
+
+/**
+ * 机构付款记录表(CloudTeacherOrderRecord)表服务接口
+ *
+ * @author makejava
+ * @since 2021-12-21 18:13:47
+ */
+public interface CloudTeacherOrderRecordService extends IService<CloudTeacherOrderRecord> {
+
+}
+

+ 21 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/CloudTeacherOrderService.java

@@ -3,8 +3,12 @@ package com.ym.mec.biz.service;
 import com.ym.mec.biz.dal.dto.CloudTeacherOrderDto;
 import com.ym.mec.biz.dal.entity.CloudTeacher;
 import com.ym.mec.biz.dal.entity.CloudTeacherOrder;
+import com.ym.mec.biz.dal.entity.CloudTeacherStudent;
 import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
+import com.ym.mec.biz.dal.page.CloudTeacherOrderQueryInfo;
+import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.BaseService;
+import com.ym.mec.thirdparty.yqpay.Msg;
 
 import java.math.BigDecimal;
 import java.util.List;
@@ -14,6 +18,14 @@ import java.util.Set;
 
 public interface CloudTeacherOrderService extends BaseService<Long, CloudTeacherOrder> {
 
+    /**
+     * 查询未激活用户
+     */
+    PageInfo<CloudTeacherStudent> queryInactive(CloudTeacherOrderQueryInfo cloudTeacherOrderQueryInfo);
+
+    /**
+     * 机构付款指定学生并激活
+     */
 
     /**
      * 将订单详情云教练加入云教练购买列表
@@ -96,4 +108,13 @@ public interface CloudTeacherOrderService extends BaseService<Long, CloudTeacher
      * @return
      */
     String queryActiveOrderPage(Integer userId, Integer activeRemark, String remark);
+
+    /**
+     * 支付未激活用户
+     * @param cloudTeacherStudents 选择中用户清单
+     * @return 是否成功
+     */
+    Map<String, Object> pay(List<CloudTeacherStudent> cloudTeacherStudents) throws Exception;
+
+    Msg payNotify(Msg msg);
 }

+ 26 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CloudTeacherOrderRecordServiceImpl.java

@@ -0,0 +1,26 @@
+package com.ym.mec.biz.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ym.mec.biz.dal.dao.CloudTeacherOrderRecordDao;
+import com.ym.mec.biz.dal.entity.CloudTeacherOrderRecord;
+import com.ym.mec.biz.service.CloudTeacherOrderRecordService;
+import org.springframework.stereotype.Service;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * 机构付款记录表(CloudTeacherOrderRecord)表服务实现类
+ *
+ * @author makejava
+ * @since 2021-12-21 18:13:47
+ */
+@Service("cloudTeacherOrderRecordService")
+public class CloudTeacherOrderRecordServiceImpl extends ServiceImpl<CloudTeacherOrderRecordDao, CloudTeacherOrderRecord>
+        implements CloudTeacherOrderRecordService {
+
+    private final static Logger logger = LoggerFactory.getLogger(CloudTeacherOrderRecordServiceImpl.class);
+
+
+}
+

+ 198 - 15
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CloudTeacherOrderServiceImpl.java

@@ -1,27 +1,31 @@
 package com.ym.mec.biz.service.impl;
 
 import java.math.BigDecimal;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 import java.util.stream.Collectors;
 
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.ym.mec.biz.dal.dao.*;
+import com.ym.mec.biz.dal.entity.*;
+import com.ym.mec.biz.dal.enums.PaymentChannelEnum;
+import com.ym.mec.biz.dal.enums.TenantOrderRecordEnum;
+import com.ym.mec.biz.dal.page.CloudTeacherOrderQueryInfo;
+import com.ym.mec.biz.service.*;
+import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.service.IdGeneratorService;
+import com.ym.mec.thirdparty.yqpay.Msg;
+import com.ym.mec.util.collection.MapUtil;
+import org.joda.time.LocalDateTime;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import com.ym.mec.biz.dal.dao.CloudTeacherDao;
-import com.ym.mec.biz.dal.dao.CloudTeacherOrderDao;
-import com.ym.mec.biz.dal.dao.CourseScheduleDao;
 import com.ym.mec.biz.dal.dto.CloudTeacherOrderDto;
-import com.ym.mec.biz.dal.entity.CloudTeacher;
-import com.ym.mec.biz.dal.entity.CloudTeacherOrder;
-import com.ym.mec.biz.dal.entity.CourseSchedule;
-import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
 import com.ym.mec.biz.dal.enums.PeriodEnum;
-import com.ym.mec.biz.service.CloudTeacherOrderService;
-import com.ym.mec.biz.service.StudentService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
@@ -29,7 +33,7 @@ import com.ym.mec.util.date.DateUtil;
 
 @Service
 public class CloudTeacherOrderServiceImpl extends BaseServiceImpl<Long, CloudTeacherOrder> implements CloudTeacherOrderService {
-
+    private static final Logger log = LoggerFactory.getLogger(TenantInfoServiceImpl.class);
     @Autowired
     private CloudTeacherOrderDao cloudTeacherOrderDao;
     @Autowired
@@ -39,7 +43,16 @@ public class CloudTeacherOrderServiceImpl extends BaseServiceImpl<Long, CloudTea
     
     @Autowired
     private StudentService studentService;
-
+    @Autowired
+    private SysConfigDao sysConfigDao;
+    @Autowired
+    private TenantConfigService tenantConfigService;
+    @Autowired
+    private PayService payService;
+    @Autowired
+    private IdGeneratorService idGenerator;
+    @Autowired
+    private CloudTeacherOrderRecordService cloudTeacherOrderRecordService;
 
     @Override
     public BaseDAO<Long, CloudTeacherOrder> getDAO() {
@@ -47,6 +60,176 @@ public class CloudTeacherOrderServiceImpl extends BaseServiceImpl<Long, CloudTea
     }
 
     @Override
+    public PageInfo<CloudTeacherStudent> queryInactive(CloudTeacherOrderQueryInfo queryInfo) {
+        PageInfo<CloudTeacherStudent> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<>();
+        MapUtil.populateMap(params, queryInfo);
+        List<CloudTeacherStudent> dataList = null;
+        int count = cloudTeacherOrderDao.findInactiveCount(params);
+        if (count > 0) {
+            pageInfo.setTotal(count);
+            params.put("offset", pageInfo.getOffset());
+            dataList = cloudTeacherOrderDao.queryInactive(params);
+        }
+        if (count == 0) {
+            dataList = new ArrayList<>();
+        }
+        pageInfo.setRows(dataList);
+
+        // List<TenantConfig> tenCfg = tenantConfigService.list(new Wrapper<TenantConfig>());
+        assert dataList != null;
+        for (CloudTeacherStudent cst: dataList) {
+            if (cst.getTime() == null) continue;
+            TenantConfig tenantConfig = tenantConfigService.getById(cst.getTenantId());
+            if (tenantConfig == null) continue;
+            JSONObject cfg = JSON.parseObject(tenantConfig.getConfig());
+            JSONObject memberConfig = (JSONObject) cfg.get("member_config");
+            if (cst.getType() == 1) {
+                double divide = memberConfig.getDouble("month_divide");
+                cst.setAmount(divide * cst.getTime());
+            } else if (cst.getType() == 2) { // 月
+                double divide = memberConfig.getDouble("month_divide");
+                cst.setAmount(divide * cst.getTime());
+            } else if (cst.getType() == 3) {
+                double divide = memberConfig.getDouble("quarter_divide");
+                cst.setAmount(divide * cst.getTime());
+            } else if (cst.getType() == 4) {
+                double divide = memberConfig.getDouble("half_year_divide");
+                cst.setAmount(divide * cst.getTime());
+            } else if (cst.getType() == 5) {
+                double divide = memberConfig.getDouble("year_divide");
+                cst.setAmount(divide * cst.getTime());
+            }
+        }
+        return pageInfo;
+    }
+
+    @Override
+    public Map<String, Object> pay(List<CloudTeacherStudent> cloudTeacherStudents) throws Exception {
+
+        BigDecimal sumAmount = new BigDecimal(0);
+        Integer tenantId = null;
+        StringBuilder payStudentIds = new StringBuilder();
+        StringBuilder payStudentIdsZero = new StringBuilder();
+        for (CloudTeacherStudent cts: cloudTeacherStudents) {
+            if (cts.getAmount() == null) {
+                throw new Exception("金额错误在 " + cts.getStudentId().toString() );
+            }
+            if (tenantId == null) {
+                tenantId = cts.getTenantId();
+            } else {
+                if (!tenantId.equals(cts.getTenantId())) {
+                    throw new Exception("分部Id 错误 " + cts.getStudentId().toString() );
+                }
+            }
+            if (cts.getAmount() == 0) {
+                payStudentIdsZero.append(cts.getStudentId());
+                continue;
+            } else {
+                sumAmount.add(BigDecimal.valueOf(cts.getAmount()));
+                payStudentIds.append(cts.getStudentId().toString()).append(",");
+
+            }
+        }
+        // 金额为 0 的
+        if (payStudentIdsZero.length() > 0) {
+            this.updateCloudTeacherOrder(payStudentIdsZero.toString());
+            createOrderRecord(tenantId, new BigDecimal(0), "", TenantOrderRecordEnum.CLOUD_TEACHER, 1, payStudentIdsZero.toString());
+        }
+        return this.payExec(sumAmount, tenantId, payStudentIds.toString());
+    }
+
+    /**
+     * 团练宝支付
+     * @param payAmount 金额
+     * @param tenantId 分部
+     * @return
+     */
+    private Map<String, Object> payExec(BigDecimal payAmount, Integer tenantId, String payStudentIds) throws Exception {
+        //生成订单编号
+        String orderNo = idGenerator.generatorId("payment") + "";
+        String baseApiUrl = sysConfigDao.findConfigValue("base_api_url");
+        TenantOrderRecordEnum tenantEnum = TenantOrderRecordEnum.CLOUD_TEACHER;
+
+        Map<String, Object> payMap = new HashMap<>();
+        int orderState = 0;
+        //消费大于0元则拉起支付
+        if (payAmount.compareTo(BigDecimal.ZERO) > 0) {
+            payMap = payService.getPayMap(
+                    payAmount,
+                    BigDecimal.ZERO,
+                    orderNo,
+                    baseApiUrl + "/api-web/cloudTeacherOrder/payNotify",
+                    baseApiUrl + "/api-student/studentOrder/paymentResult?orderNo=" + orderNo,
+                    tenantEnum.getMsg(),
+                    tenantEnum.getMsg(),
+                    1,//临时写死
+                    tenantEnum.getCode()
+            );
+            createOrderRecord(tenantId, payAmount, orderNo, tenantEnum, orderState, payStudentIds);
+            log.info("tenant pay >>>>> " + JSON.toJSONString(payMap));
+        } else {
+            //已支付 直接激活
+            orderState = 1;
+
+        }
+        return payMap;
+    }
+
+    private Integer updateCloudTeacherOrder(String payStudentIds) {
+        return cloudTeacherOrderDao.updateCloudTeacherOrder(payStudentIds);
+    }
+
+    public Msg payNotify(Msg msg) {
+        log.info("tenant orderNotify >>>>> " + msg.toString());
+        msg.setMsg("fail");
+        Map<String, String> notifyMap = JSON.parseObject(msg.getResponseParameters(), Map.class);
+        CloudTeacherOrderRecord record = cloudTeacherOrderRecordService.getOne(
+                new QueryWrapper<CloudTeacherOrderRecord>().eq("order_no_", notifyMap.get("orderNo")));
+        record.setOrderNo(notifyMap.get("merMerOrderNo"));
+        record.setTransNo(notifyMap.get("orderNo"));
+        String channelType = notifyMap.get("channelType").equals("1") ? "WXPay" : (notifyMap.get("channelType").equals("2") ? "Alipay" : "quickPay");
+        record.setPayChannel(channelType);
+
+        //支付中订单存在,更新状态
+        if (msg.getResponseType().equals("1") && notifyMap.size() > 0 && msg.getCode().equals("88")) {
+            //tradeState 88就是正确的 其他错误的
+            //            DealStatusEnum
+            //            notifyMap.put("totalMoney", notifyMap.get("payAmount"));
+            if (record.getPayStudentIds() != null) {
+                this.updateCloudTeacherOrder(record.getPayStudentIds());
+            }
+            record.setOrderState(1);
+            msg.setCode("000000");
+            msg.setMsg("success");
+        } else {
+            //支付失败
+            record.setOrderState(2);
+        }
+        cloudTeacherOrderRecordService.update(record, new QueryWrapper<CloudTeacherOrderRecord>()
+                .eq("order_no_", record.getOrderNo()));
+        log.info("tenant orderNotify return>>>>> " + msg.toString());
+        return msg;
+    }
+
+    private void createOrderRecord(Integer tenantId, BigDecimal payAmount, String orderNo, TenantOrderRecordEnum tenantEnum, Integer orderState, String payStudentIds) {
+        LocalDateTime now = LocalDateTime.now();
+        CloudTeacherOrderRecord record = new CloudTeacherOrderRecord();
+        record.setTenantId(tenantId);
+        record.setOrderNo(orderNo);
+        record.setOrderType(tenantEnum.getCode());
+        record.setPaymentChannel(PaymentChannelEnum.ADAPAY.getCode());
+        record.setExpectAmount(payAmount);
+        record.setActualAmount(payAmount);
+        record.setOrderState(orderState);
+        record.setPayDate(now.toLocalDate().toDate());
+        record.setPayTime(now.toDate());
+        record.setCreatedTime(now.toDate());
+        record.setPayStudentIds(payStudentIds);
+        cloudTeacherOrderRecordService.save(record);
+    }
+
+    @Override
     @Transactional(rollbackFor = Exception.class)
 	public Boolean addOrderDetail2CloudTeacher(StudentPaymentOrder order,BigDecimal cloudTeacherFee) {
 		CloudTeacherOrder cloudTeacherOrder = cloudTeacherOrderDao.queryByOrderId(order.getId());

+ 10 - 4
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantInfoServiceImpl.java

@@ -253,7 +253,7 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoDao, TenantInfo
         RBucket<Object> bucket = redissonClient.getBucket(key);
         //原子操作 抢锁成功为true
         if (!bucket.trySet(tenantId, 3L, TimeUnit.MINUTES)) {
-            throw new BizException("机构正在开通中请勿频繁操作");
+            throw new BizException("机构正在开通中请勿频繁操作");
         }
         //获取产品信息得到服务id
         TenantProductInfo productInfo = tenantProductInfoService.getOne(new WrapperUtil<TenantProductInfo>()
@@ -269,7 +269,7 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoDao, TenantInfo
         //拆分菜单获取菜单ID
         List<Integer> collectMenuId = getMenuId(menuIdList);
         //建立角色
-        Integer roleId = createRole(tenantId);
+        Integer roleId = createRole(tenantInfo);
         //建立角色和菜单关系数据
         employeeService.batchInsertRoleMenu(roleId, collectMenuId);
         // 创建账号、用户信息、用户和角色关系
@@ -287,13 +287,15 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoDao, TenantInfo
     }
 
     //创建角色
-    private Integer createRole(Integer tenantId) {
+    private Integer createRole(TenantInfo tenantInfo) {
         SysRole sysRole = new SysRole();
         sysRole.setRoleName("管理员");
         sysRole.setRoleDesc("管理员");
         sysRole.setCreateTime(new Date());
         sysRole.setDelFlag("0");
-        sysRole.setTenantId(tenantId);
+        sysRole.setTenantId(tenantInfo.getId());
+        Organization organization = organizationDao.getByName(tenantInfo.getName(), tenantInfo.getId());
+        sysRole.setOrganId(organization.getId());
         employeeService.insertSysRole(sysRole);
         return sysRole.getId();
     }
@@ -306,6 +308,7 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoDao, TenantInfo
         e.setJobNature(JobNatureEnum.FULL_TIME);
         e.setEntryDate(LocalDate.now().toDate());
         e.setRoles(roles);
+        e.setRoleIds(roles);
         try {
             employeeService.add(e);
         } catch (Exception ex) {
@@ -342,6 +345,9 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoDao, TenantInfo
         RBucket<Object> bucket = redissonClient.getBucket(key);
         //原子操作 抢锁成功为true
         if (!bucket.trySet(tenantId, 10, TimeUnit.SECONDS)) {
+            if(tenantInfo.getPayState() == 1){
+                throw new BizException("已缴费请勿重复缴费!");
+            }
             throw new BizException("该机构数正在缴费中请勿频繁操作");
         }
         //机构产品信息

+ 55 - 0
mec-biz/src/main/resources/config/mybatis/CloudTeacherOrderMapper.xml

@@ -115,6 +115,10 @@
         where id_ = #{id} AND version_ = #{version}
     </update>
 
+    <update id="updateCloudTeacherOrder">
+        update cloud_teacher_order set status_ = 2 where student_id_ in (#{payStudentIds})
+    </update>
+
     <!-- 全查询 -->
     <select id="findAll" resultMap="CloudTeacherOrder">
         SELECT *
@@ -275,6 +279,57 @@
         </if>
         GROUP BY student_id_
     </select>
+
+    <select id="queryInactive" resultType="com.ym.mec.biz.dal.entity.CloudTeacherStudent">
+        select
+               cto.id_ as cloudTeacherOrderId,
+               cto.student_id_ as studentId,
+               cto.type_ as type,
+               case cto.type_
+                   when 1 then '天'
+                   when 2 then '月'
+                   when 3 then '季'
+                   when 4 then '半年'
+                   when 5 then '年'
+                   else ''
+               end as typeLabel,
+               cto.time_ as time,
+               sj.id_ as subject,
+               sj.name_ as subjectLabel,
+               u.tenant_id_ as tenantId,
+               u.username_ as name,
+               u.phone_ as phone
+        from cloud_teacher_order cto
+        left join student s on cto.student_id_ = s.user_id_
+        left join sys_user u on cto.student_id_ = u.id_
+        left join subject sj on s.subject_id_list_ = sj.id_
+        <where>
+            cto.status_ = #{status}
+            <if test="queryCondition != nul and queryCondition != ''">
+                AND (u.username_ LIKE CONCAT('%', #{queryCondition}, '%') or u.phone_ = #{queryCondition} or u.id_ = #{queryCondition})
+            </if>
+            <if test="subjectId">
+                AND (s.subject_id_list_ = #{subjectId})
+            </if>
+        </where>
+        <include refid="global.limit"/>
+    </select>
+
+    <select id="findInactiveCount" resultType="java.lang.Integer">
+        select count(1) from cloud_teacher_order cto
+        left join student s on cto.student_id_ = s.user_id_
+        left join sys_user u on cto.student_id_ = u.id_
+        <where>
+            cto.status_ = #{status}
+            <if test="queryCondition != nul and queryCondition != ''">
+                AND (u.username_ LIKE CONCAT('%', #{queryCondition}, '%') or u.phone_ = #{queryCondition} or u.id_ = #{queryCondition})
+            </if>
+            <if test="subjectId">
+                AND (s.subject_id_list_ = #{subjectId})
+            </if>
+        </where>
+    </select>
+
     <sql id="queryCloudTeacherActiveDetailSql">
         <where>
             cto.status_ != 0 AND cto.active_remark_ = '202109'

+ 37 - 0
mec-biz/src/main/resources/config/mybatis/CloudTeacherOrderRecordMapper.xml

@@ -0,0 +1,37 @@
+<?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.CloudTeacherOrderRecordDao">
+    <resultMap id="BaseResultMap" type="com.ym.mec.biz.dal.entity.CloudTeacherOrderRecord">
+        <id column="id_" jdbcType="INTEGER" property="id"/>
+        <result column="tenant_id_" jdbcType="INTEGER" property="tenantId"/>
+        <result column="order_no_" jdbcType="VARCHAR" property="orderNo"/>
+        <result column="trans_no_" jdbcType="VARCHAR" property="transNo"/>
+        <result column="order_type_" jdbcType="VARCHAR" property="orderType"/>
+        <result column="payment_channel_" jdbcType="VARCHAR" property="paymentChannel"/>
+        <result column="pay_channel_" jdbcType="VARCHAR" property="payChannel"/>
+        <result column="expect_amount" jdbcType="VARCHAR" property="expectAmount"/>
+        <result column="actual_amount" jdbcType="VARCHAR" property="actualAmount"/>
+        <result column="order_state_" jdbcType="INTEGER" property="orderState"/>
+        <result column="pay_date_" jdbcType="TIMESTAMP" property="payDate"/>
+        <result column="pay_time_" jdbcType="TIMESTAMP" property="payTime"/>
+        <result column="created_time_" jdbcType="TIMESTAMP" property="createdTime"/>
+        <result column="pay_student_ids_" jdbcType="VARCHAR" property="payStudentIds"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id_, tenant_id_, order_no_, trans_no_, order_type_, payment_channel_, pay_channel_, expect_amount, actual_amount, order_state_, pay_date_, pay_time_, created_time_, pay_student_ids_
+    </sql>
+
+    <insert id="insertBatch" keyColumn="id_" keyProperty="id" useGeneratedKeys="true"
+            parameterType="com.ym.mec.biz.dal.entity.CloudTeacherOrderRecord">
+        insert into cloud_teacher_order_record(tenant_id_, order_no_, trans_no_, order_type_, payment_channel_,
+        pay_channel_, expect_amount, actual_amount, order_state_, pay_date_, pay_time_, created_time_, pay_student_ids_)
+        values
+        <foreach collection="entities" item="entity" separator=",">
+            (#{entity.tenantId}, #{entity.orderNo}, #{entity.transNo}, #{entity.orderType}, #{entity.paymentChannel},
+            #{entity.payChannel}, #{entity.expectAmount}, #{entity.actualAmount}, #{entity.orderState},
+            #{entity.payDate}, #{entity.payTime}, #{entity.createdTime}, #{entity.payStudentId})
+        </foreach>
+    </insert>
+
+</mapper>

+ 2 - 2
mec-biz/src/main/resources/config/mybatis/EmployeeMapper.xml

@@ -94,8 +94,8 @@
             useGeneratedKeys="true">
         INSERT INTO `sys_role` (`role_name_`, `role_code_`, `role_desc_`, `create_time_`,
                                 `update_time_`, `del_flag_`, `organ_id_`, `tenant_id_`)
-        VALUES (#{RoleName}, #{RoleCode}, #{RoleDesc}, #{CreateTime},
-                #{UpdateTime}, #{DelFlag}, #{OrganId}, #{TenantId});
+        VALUES (#{roleName}, #{roleCode}, #{roleDesc}, #{createTime},
+                #{updateTime}, #{delFlag}, #{organId}, #{tenantId});
     </insert>
 
     <select id="queryByPhone" resultMap="SysUser">

+ 67 - 0
mec-web/src/main/java/com/ym/mec/web/controller/CloudTeacherOrderController.java

@@ -0,0 +1,67 @@
+package com.ym.mec.web.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.support.spring.annotation.FastJsonView;
+import com.ym.mec.biz.dal.entity.CloudTeacherStudent;
+import com.ym.mec.biz.dal.entity.TenantConfig;
+import com.ym.mec.biz.dal.page.CloudTeacherOrderQueryInfo;
+import com.ym.mec.biz.service.CloudTeacherOrderService;
+import com.ym.mec.biz.service.TenantConfigService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.thirdparty.yqpay.Msg;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.sql.Wrapper;
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @author: feng-ji
+ * @date: 2021-12-21
+ */
+@RequestMapping("cloudTeacherOrder")
+@Api(tags = "团练宝注册用户查询")
+@RestController
+public class CloudTeacherOrderController extends BaseController {
+
+    @Autowired
+    private CloudTeacherOrderService cloudTeacherOrderService;
+
+
+    @ApiOperation(value ="查询未激活团练宝用户")
+    @PostMapping("/queryInactive")
+    // @PreAuthorize("@pcs.hasPermissions('cloudTeacherOrder/queryUnActive')")
+    public Object queryInactive(CloudTeacherOrderQueryInfo cloudTeacherOrderQueryInfo) {
+        cloudTeacherOrderQueryInfo.setStatus(1);
+        return succeed(cloudTeacherOrderService.queryInactive(cloudTeacherOrderQueryInfo));
+    }
+
+    @ApiOperation(value ="查询已激活团练宝用户")
+    @PostMapping("/queryActive")
+    // @PreAuthorize("@pcs.hasPermissions('cloudTeacherOrder/queryActive')")
+    public Object queryActive(CloudTeacherOrderQueryInfo cloudTeacherOrderQueryInfo) {
+        cloudTeacherOrderQueryInfo.setStatus(2);
+        return succeed(cloudTeacherOrderService.queryInactive(cloudTeacherOrderQueryInfo));
+    }
+
+    @ApiOperation(value ="激活团练宝用户")
+    @PostMapping("/pay")
+    // @PreAuthorize("@pcs.hasPermissions('cloudTeacherOrder/pay')")
+    public Object pay(List<CloudTeacherStudent> cloudTeacherStudents) throws Exception {
+        return succeed(cloudTeacherOrderService.pay(cloudTeacherStudents));
+    }
+
+    @ApiOperation(value ="支付回调")
+    @PostMapping("/payNotify")
+    // @PreAuthorize("@pcs.hasPermissions('cloudTeacherOrder/payNotify')")
+    public Msg payNotify(@ModelAttribute Msg msg) {
+        return cloudTeacherOrderService.payNotify(msg);
+    }
+}

+ 27 - 0
mec-web/src/main/java/com/ym/mec/web/controller/CloudTeacherOrderRecordController.java

@@ -0,0 +1,27 @@
+package com.ym.mec.web.controller;
+
+
+import com.ym.mec.biz.dal.entity.CloudTeacherOrderRecord;
+import com.ym.mec.biz.service.CloudTeacherOrderRecordService;
+import org.springframework.web.bind.annotation.*;
+import com.ym.mec.common.controller.BaseController;
+
+import javax.annotation.Resource;
+
+/**
+ * 机构付款记录表(CloudTeacherOrderRecord)表控制层
+ *
+ * @author makejava
+ * @since 2021-12-21 18:13:47
+ */
+@RestController
+@RequestMapping("/cloudTeacherOrderRecord")
+public class CloudTeacherOrderRecordController extends BaseController {
+    /**
+     * 服务对象
+     */
+    @Resource
+    private CloudTeacherOrderRecordService cloudTeacherOrderRecordService;
+
+}
+

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

@@ -1,16 +1,18 @@
 package com.ym.mec.web.controller;
 
-
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.ym.mec.biz.dal.entity.SysManual;
 import com.ym.mec.biz.dal.page.SysManualQueryInfo;
 import com.ym.mec.biz.service.SysManualService;
+import com.ym.mec.common.page.WrapperUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 import com.ym.mec.common.controller.BaseController;
 
+import java.util.List;
+
 /**
  * (SysManual)表控制层
  *
@@ -31,11 +33,9 @@ public class SysManualController extends BaseController {
     @ApiOperation(value = "查询操作手册")
     @GetMapping("/list")
     public Object list(SysManualQueryInfo queryInfo) {
-        if (queryInfo.getMenuId() != 0) {
-            return succeed(sysManualService.list(new QueryWrapper<SysManual>().eq("menu_id_", queryInfo.getMenuId())));
-        } else {
-            return succeed(sysManualService.list(new QueryWrapper<SysManual>()));
-        }
+        QueryWrapper<SysManual> queryWrapper = new WrapperUtil<SysManual>().hasEq("menu_id_", queryInfo.getMenuId()).queryWrapper();
+        List<SysManual> result = sysManualService.list(queryWrapper);
+        return succeed(result);
     }
 
     @ApiOperation(value = "新增帮助手册")