微信支付

pull/2/head
perry 2023-05-24 14:10:41 +08:00
parent fc9922c264
commit f1fbbcf36d
12 changed files with 286 additions and 28 deletions

View File

@ -39,14 +39,7 @@ public class TopUpOrderController {
log.info("initOrder会员充值===>{}", request);
return CommonResult.success(storeOrderService.memberTopUp(request, servletRequest));
}
@TenantIgnore
@PreAuthenticated
@Operation(summary = "退款")
@RequestMapping(value = "/memberRefund", method = RequestMethod.POST)
public CommonResult<Object> memberRefund(@Valid @RequestBody RefundRequest request, HttpServletRequest servletRequest) throws Exception {
log.info("memberRefund会员退款===>{}", request);
return CommonResult.success(storeOrderService.memberRefund(request, servletRequest));
}
@TenantIgnore
@PreAuthenticated
@Operation(summary = "申请退款")

View File

@ -0,0 +1,40 @@
package cn.iocoder.yudao.module.shop.controller.app.recharge;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
import cn.iocoder.yudao.module.shop.controller.admin.recharge.vo.*;
import cn.iocoder.yudao.module.shop.convert.recharge.PhoneRecordConvert;
import cn.iocoder.yudao.module.shop.dal.dataobject.recharge.PhoneRecordDO;
import cn.iocoder.yudao.module.shop.service.recharge.PhoneRecordService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.IOException;
import java.util.Collection;
import java.util.List;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
@Tag(name = "用户APP - 充值档位记录")
@RestController
@RequestMapping("/shop/phone-record")
@Validated
public class AppPhoneRecordController {
@Resource
private PhoneRecordService phoneRecordService;
}

View File

@ -0,0 +1,93 @@
package cn.iocoder.yudao.module.shop.controller.app.recharge;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpUtil;
import cn.iocoder.yudao.framework.common.exception.ServiceException;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.http.HttpUtils;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
import cn.iocoder.yudao.module.member.api.user.MemberUserApi;
import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
import cn.iocoder.yudao.module.shop.controller.admin.recharge.vo.*;
import cn.iocoder.yudao.module.shop.convert.recharge.RefundFeeRecordConvert;
import cn.iocoder.yudao.module.shop.dal.dataobject.recharge.RefundFeeRecordDO;
import cn.iocoder.yudao.module.shop.service.recharge.RefundFeeRecordService;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.IOException;
import java.util.Collection;
import java.util.List;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
@Tag(name = "用户APP - 权益充值返费记录")
@RestController
@RequestMapping("/shop/refund-fee-record")
@Validated
public class AppRefundFeeRecordController {
@Resource
private MemberUserApi memberUserApi;
@Value("${phone.query-url}")
private String phoneUrl;
@Value("${phone.token}")
private String token;
@GetMapping("/query")
@Operation(summary = "查询档位信息")
public CommonResult<JSONArray> query(@RequestParam String phone) {
if(StrUtil.isBlank(phone)){
MemberUserRespDTO memberUserRespDTO = memberUserApi.getUser(SecurityFrameworkUtils.getLoginUserId());
phone = memberUserRespDTO.getMobile();
}
JSONObject param = new JSONObject();
param.put("phone",phone);
String result = HttpRequest.post(phoneUrl+"query/info")
.header("token",token)
.body(JSONObject.toJSONString(param))
.execute()
.body();
JSONObject resultJson = JSONObject.parseObject(result);
if("0000".equals(resultJson.get("code"))){
return success(resultJson.getJSONArray("body"));
}
return success(null);
}
@GetMapping("/query-item")
@Operation(summary = "查询档位返费信息")
public CommonResult<JSONArray> queryItem(@RequestParam String reportId) {
if(StrUtil.isBlank(reportId)){
throw new ServiceException("reportId不能为空");
}
JSONObject param = new JSONObject();
param.put("reportId",reportId);
String result = HttpRequest.post(phoneUrl+"query/item")
.header("token",token)
.body(JSONObject.toJSONString(param))
.execute()
.body();
JSONObject resultJson = JSONObject.parseObject(result);
if("0000".equals(resultJson.get("code"))){
return success(resultJson.getJSONArray("body"));
}
return success(null);
}
}

View File

@ -0,0 +1,24 @@
package cn.iocoder.yudao.module.shop.controller.app.recharge.vo;
import cn.iocoder.yudao.module.shop.controller.admin.recharge.vo.PhoneRecordBaseVO;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import java.time.LocalDateTime;
@Schema(description = "用户APP - 充值档位记录 Response VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class PhoneRecordRespVO extends PhoneRecordBaseVO {
@Schema(description = "主键", required = true, example = "24509")
private Long id;
@Schema(description = "创建时间", required = true)
private LocalDateTime createTime;
}

View File

@ -22,9 +22,11 @@ import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
import cn.iocoder.yudao.module.member.api.user.MemberUserApi;
import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
import cn.iocoder.yudao.module.member.api.user.dto.PromoterDTO;
import cn.iocoder.yudao.module.shop.controller.admin.recharge.vo.RechargeGearExportReqVO;
import cn.iocoder.yudao.module.shop.dal.dataobject.express.ExpressDO;
import cn.iocoder.yudao.module.shop.dal.dataobject.order.StoreOrder;
import cn.iocoder.yudao.module.shop.dal.dataobject.recharge.PhoneRecordDO;
import cn.iocoder.yudao.module.shop.dal.dataobject.recharge.RechargeGearDO;
import cn.iocoder.yudao.module.shop.dal.dataobject.recharge.RechargeOrderDO;
import cn.iocoder.yudao.module.shop.dal.dataobject.recharge.RechargeOrderInfoDO;
import cn.iocoder.yudao.module.shop.dal.mysql.order.StoreOrderMapper;
@ -44,6 +46,8 @@ import cn.iocoder.yudao.module.shop.service.order.StoreOrderInfoService;
import cn.iocoder.yudao.module.shop.service.order.StoreOrderRefundService;
import cn.iocoder.yudao.module.shop.service.order.StoreOrderService;
import cn.iocoder.yudao.module.shop.service.order.StoreOrderStatusService;
import cn.iocoder.yudao.module.shop.service.recharge.PhoneRecordService;
import cn.iocoder.yudao.module.shop.service.recharge.RechargeGearService;
import cn.iocoder.yudao.module.shop.support.StrategySupport;
import cn.iocoder.yudao.module.shop.support.pay.IPayStrategy;
import cn.iocoder.yudao.module.shop.utils.CommonPage;
@ -148,9 +152,15 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderMapper, StoreOr
@Autowired
private WxMpService wxMpService;
@Autowired
private DeptApi deptApi;
@Resource
private PhoneRecordService phoneRecordService;
@Resource
private RechargeGearService rechargeGearService;
/**
* PC
*
@ -1389,7 +1399,7 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderMapper, StoreOr
orderDO.setProTotalPrice(sum);
orderDO.setBeforePayPrice(sum);
orderDO.setPromoterId(user.getPromoterId());
orderDO.setDeptId(promoterDTO.getDeptId());
orderDO.setDeptId(deptId);
orderDO.setTenantId(tenantId);
rechargeOrderMapper.insert(orderDO);
List<RechargeOrderInfoDO> infoDOS = new ArrayList<>();
@ -1415,11 +1425,23 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderMapper, StoreOr
private void orderCheck(OrderContentRequest request, MemberUserRespDTO user) {
List<OrderContentRequest.OrderInfo> orderInfos = request.getOrderInfos();
Assert.isTrue(!CollectionUtils.isEmpty(orderInfos), "订单信息不能为空!");
//先查询提报总表
List<Long> collect = orderInfos.stream().map(OrderContentRequest.OrderInfo::getGearId).collect(Collectors.toList());
List<RechargeGearDO> rechargeGearDOList = rechargeGearService.getRechargeGearList(collect);
rechargeGearDOList.forEach(rechargeGearDO->{
Boolean flag = phoneRecordService.verifyPhone(request.getConfirmPhone(),rechargeGearDO.getRefundAmount().intValue()+"");
if (flag) {
throw new ServiceException("该挡位:" + rechargeGearDO.getName() + "你已购买,请勿重复操作");
}
});
List<PhoneRecordDO> infoDOS = phoneRecordMapper.selectList(Wrappers.<PhoneRecordDO>lambdaQuery()
.eq(PhoneRecordDO::getUserId, user.getId())
.in(PhoneRecordDO::getRechargeGearId, collect));
if (!CollectionUtils.isEmpty(infoDOS)) {
Map<Long, List<PhoneRecordDO>> collect1 = infoDOS.stream().collect(Collectors.groupingBy(PhoneRecordDO::getRechargeGearId));
orderInfos.forEach(info -> {
if (!CollectionUtils.isEmpty(collect1.get(info.getGearId()))) {

View File

@ -67,4 +67,41 @@ public interface PhoneRecordService {
*/
List<PhoneRecordDO> getPhoneRecordList(PhoneRecordExportReqVO exportReqVO);
/**
* <pre>
* <b>verifyPhone</b>
* <b>Description:</b>
* <b>@author:</b> zenghuapei
* <b>@date:</b> 2023/5/24 11:44
* @param phone:
* @param gear:
* @return
* </pre>
*/
Boolean verifyPhone(String phone,String gear);
/**
* <pre>
* <b>deletePhoneGear</b>
* <b>Description:</b>
* <b>@author:</b> zenghuapei
* <b>@date:</b> 2023/5/24 12:44
* @param phone:
* @param gear:
* @return
* </pre>
*/
Boolean deletePhoneGear(String phone, String gear);
/**
* <pre>
* <b>insertPhone</b>
* <b>Description:</b>
* <b>@author:</b> zenghuapei
* <b>@date:</b> 2023/5/24 12:45
* @param phone:
* @param gear:
* @return
* </pre>
*/
Boolean insertPhone(String phone, String gear);
}

View File

@ -1,6 +1,14 @@
package cn.iocoder.yudao.module.shop.service.recharge;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpRequest;
import cn.iocoder.yudao.framework.common.exception.ServiceException;
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
import cn.iocoder.yudao.module.member.api.user.MemberUserApi;
import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
@ -14,6 +22,7 @@ import cn.iocoder.yudao.module.shop.convert.recharge.PhoneRecordConvert;
import cn.iocoder.yudao.module.shop.dal.mysql.recharge.PhoneRecordMapper;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.module.shop.enums.ErrorCodeConstants.*;
/**
@ -27,6 +36,13 @@ public class PhoneRecordServiceImpl implements PhoneRecordService {
@Resource
private PhoneRecordMapper phoneRecordMapper;
@Resource
private MemberUserApi memberUserApi;
@Value("${phone.query-url}")
private String phoneUrl;
@Value("${phone.token}")
private String token;
@Override
public Long createPhoneRecord(PhoneRecordCreateReqVO createReqVO) {
@ -82,4 +98,32 @@ public class PhoneRecordServiceImpl implements PhoneRecordService {
return phoneRecordMapper.selectList(exportReqVO);
}
/**
* <pre>
* <b>verifyPhone</b>
* <b>Description:</b>
* <b>@author:</b> zenghuapei
* <b>@date:</b> 2023/5/24 11:44
* @param phone :
* @param gear :
* @return
* </pre>
*/
@Override
public Boolean verifyPhone(String phone, String gear) {
JSONObject param = new JSONObject();
param.put("phone",phone);
param.put("gear",gear);
String result = HttpRequest.post(phoneUrl+"query/verify")
.header("token",token)
.body(JSONObject.toJSONString(param))
.execute()
.body();
JSONObject resultJson = JSONObject.parseObject(result);
if("0000".equals(resultJson.get("code"))){
return resultJson.getBoolean("body");
}else{
throw new ServiceException("手机号档位验证失败");
}
}
}

View File

@ -49,7 +49,7 @@ public interface RechargeGearService {
* @param ids
* @return
*/
List<RechargeGearDO> getRechargeGearList(Collection<String> ids);
List<RechargeGearDO> getRechargeGearList(List<Long> ids);
/**
*

View File

@ -148,7 +148,7 @@ public class RechargeOrderServiceImpl implements RechargeOrderService {
public MemberHeadResponse memberHeadInfo() {
MemberHeadResponse response = new MemberHeadResponse();
LoginUser loginUser = SecurityFrameworkUtils.getLoginUser();
Assert.notNull(loginUser, "登录失效,请重新登录!");
if(loginUser!=null){
List<RechargeOrderDO> orderDOS = rechargeOrderMapper.selectList(Wrappers.<RechargeOrderDO>lambdaQuery().eq(RechargeOrderDO::getUid, loginUser.getId()));
if (!CollectionUtils.isEmpty(orderDOS)) {
BigDecimal amount = new BigDecimal("0");
@ -166,6 +166,7 @@ public class RechargeOrderServiceImpl implements RechargeOrderService {
response.setIntegral(amount.stripTrailingZeros().toPlainString() + "/" + "1040");
}
}
}
return response;
}

View File

@ -67,4 +67,5 @@ public interface RefundFeeRecordService {
*/
List<RefundFeeRecordDO> getRefundFeeRecordList(RefundFeeRecordExportReqVO exportReqVO);
}

View File

@ -197,7 +197,7 @@ public class PromoterServiceImpl implements PromoterService {
memberUserDO.setNickname(importUser.getNickName());
memberUserDO.setMobile(importUser.getMobile());
memberUserDO.setPassword(importUser.getMobile().substring(importUser.getMobile().length() - 6));
memberUserDO.setStatus(1);
memberUserDO.setStatus(0);
memberUserService.createUserIfAbsent(importUser.getMobile(), importUser.getNickName(), getClientIP());
}
// 插入

View File

@ -254,3 +254,6 @@ justauth:
prefix: 'social_auth_state:' # 缓存前缀,目前只对 Redis 缓存生效,默认 JUSTAUTH::STATE::
timeout: 24h # 超时时长,目前只对 Redis 缓存生效,默认 3 分钟
phone:
query-url: http://192.168.1.189:4006/cyywl-phone-query-api/
token: eyIwLnR5cCI6IkpXVCIsImFsZyI6IkhTNTEyIn0