package com.dsh.activity.service.impl; import cn.hutool.core.collection.CollUtil; import com.alipay.api.AlipayApiException; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dsh.activity.entity.HuiminPayQuery; import com.dsh.activity.entity.THuiminRecord; import com.dsh.activity.entity.TPayHuimin; import com.dsh.activity.entity.TStudent; import com.dsh.activity.enums.HuiminCardPaymentTypeEnum; import com.dsh.activity.feignclient.account.AppUserClient; import com.dsh.activity.feignclient.account.StudentClient; import com.dsh.activity.feignclient.account.model.AppUser; import com.dsh.activity.mapper.PayHuiminMapper; import com.dsh.activity.model.response.SalesDetailVO; import com.dsh.activity.service.HuiminRecordService; import com.dsh.activity.service.PayHuiminService; import com.dsh.activity.util.DateUtil; import com.dsh.activity.util.PayMoneyUtil; import com.dsh.activity.util.ResultUtil; import com.sun.org.apache.bcel.internal.generic.NEW; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import javax.annotation.Resource; import java.math.BigDecimal; import java.util.Date; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.stream.Collectors; /** * @author zhibing.pu * @date 2023/7/11 17:31 */ @Service public class PayHuiminServiceImpl extends ServiceImpl implements PayHuiminService { @Autowired private AppUserClient appUserClient; @Autowired private StudentClient studentClient; @Autowired private HuiminRecordService huiminRecordService; @Resource private PayMoneyUtil payMoneyUtil; @Override public Page selectPage(HuiminPayQuery query) { Page salesDetailVOPage = baseMapper.selectSalesDetailPage(new Page<>(query.getCurrent(), query.getSize()), query); List records = salesDetailVOPage.getRecords(); for (SalesDetailVO record : records) { List list = huiminRecordService.list(new LambdaQueryWrapper() .eq(THuiminRecord::getPayId, record.getId())); record.setUseTimes(list.size()); } for (SalesDetailVO record : records) { AppUser appUser = appUserClient.queryAppUser(record.getAppUserId()); if (Objects.nonNull(appUser)){ record.setUserName(appUser.getName()); record.setPhone(appUser.getPhone()); } StringBuilder stringBuilder = new StringBuilder(); String[] split = record.getStudentId().split(","); for (String s : split) { String replace = s.replace(" ", ""); List studentById = studentClient.getStudentByIds(replace); if (!studentById.isEmpty()){ stringBuilder.append(studentById.get(0).getName()+","); } } String string = stringBuilder.toString(); if (StringUtils.hasLength(string)) { String stringWithoutLastCharacter = string.substring(0, string.length() - 1); record.setStudentName(stringWithoutLastCharacter); } } // if (CollUtil.isNotEmpty(records)){ // List appUserIdList = records.stream().map(SalesDetailVO::getAppUserId).collect(Collectors.toList()); // List appUserList = appUserClient.queryAppUserBatch(appUserIdList); // Map appUserMap = appUserList.stream().collect(Collectors.toMap(AppUser::getId, appUser -> appUser)); // records.forEach(item->{ // AppUser appUser = appUserMap.get(item.getAppUserId()); // if (Objects.nonNull(appUser)){ // item.setUserName(appUser.getName()); // item.setPhone(appUser.getPhone()); // } // List studentList = studentClient.getStudentByIds(item.getStudentId()); // if (CollUtil.isNotEmpty(studentList)){ // item.setStudentName(studentList.stream().map(TStudent::getName).collect(Collectors.joining(","))); // } // }); // } return salesDetailVOPage; } @Override public Map getStaticsData(HuiminPayQuery query) { query.setGiftPaymentType(HuiminCardPaymentTypeEnum.GIFT.getCode()); return baseMapper.getStaticsData(query); } @Override public ResultUtil refund(Integer id) throws AlipayApiException { TPayHuimin payHuimin = this.getById(id); if (Objects.nonNull(payHuimin)) { // 赠送订单不产生支付金额,禁止退款。 if (HuiminCardPaymentTypeEnum.isGift(payHuimin.getPaymentType())){ throw new IllegalArgumentException("赠送惠民卡不允许退款"); } Integer count = huiminRecordService.lambdaQuery() .eq(THuiminRecord::getPayId, payHuimin.getId()) .count(); if (count > 0 || new Date().after(DateUtil.addDay(payHuimin.getPaymentTime(),7))) { //超过七日或者七日内有使用记录的退款:更改状态,实际退款线下操作。 payHuimin.setRefundStatus(3); } else { if (payHuimin.getPaymentType() == 1) { Map map = payMoneyUtil.wxRefund(payHuimin.getOrderNumber(), payHuimin.getCode(), payHuimin.getSalesMoney().toString(), payHuimin.getSalesMoney().toString(), "/base/huimin/callBack/wxRefundHuiminCallback"); if (!"SUCCESS".equals(map.get("return_code"))) { System.err.println("-------------微信退款失败---------"); System.err.println(map.get("return_msg")); return ResultUtil.error("微信退款失败"); } } else { Map map = payMoneyUtil.aliRefund(payHuimin.getOrderNumber(), payHuimin.getSalesMoney().toString()); String return_code = map.get("code"); if (!"10000".equals(return_code)) { return ResultUtil.error(map.get("msg")); } String refund_id = map.get("trade_no"); payHuimin.setRefundNumber(refund_id); } payHuimin.setRefundStatus(2); } payHuimin.setStatus(3); payHuimin.setRefundTime(new Date()); this.updateById(payHuimin); } return ResultUtil.success(); } /** * 导出数据 * @param query * @return */ @Override public List exportData(HuiminPayQuery query) { List records = baseMapper.exportData(query); if (CollUtil.isNotEmpty(records)){ List appUserIdList = records.stream().map(SalesDetailVO::getAppUserId).collect(Collectors.toList()); List appUserList = appUserClient.queryAppUserBatch(appUserIdList); Map appUserMap = appUserList.stream().collect(Collectors.toMap(AppUser::getId, appUser -> appUser)); records.forEach(item->{ AppUser appUser = appUserMap.get(item.getAppUserId()); if (Objects.nonNull(appUser)){ item.setUserName(appUser.getName()); item.setPhone(appUser.getPhone()); } List studentList = studentClient.getStudentByIds(item.getStudentId()); if (CollUtil.isNotEmpty(studentList)){ item.setStudentName(studentList.stream().map(TStudent::getName).collect(Collectors.joining(","))); } }); } return records; } }