|
@@ -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());
|