Merge remote-tracking branch 'origin/master'

This commit is contained in:
张松 2025-02-17 18:27:30 +08:00
commit 33930a96e8
19 changed files with 319 additions and 39 deletions

View File

@ -7,6 +7,7 @@ import com.czg.account.dto.shopuser.ShopUserSummaryDTO;
import com.czg.account.entity.ShopUser;
import com.czg.account.service.ShopUserService;
import com.czg.annotation.SaAdminCheckPermission;
import com.czg.enums.ShopUserFlowBizEnum;
import com.czg.resp.CzgResult;
import com.czg.sa.StpKit;
import com.mybatisflex.core.paginate.Page;
@ -75,6 +76,7 @@ public class ShopUserController {
@SaAdminCheckPermission("shopUser:editFlow")
@PutMapping("/money")
public CzgResult<Boolean> editMoney(@RequestBody @Validated ShopUserMoneyEditDTO shopUserMoneyEditDTO) {
shopUserMoneyEditDTO.setBizEnum(ShopUserFlowBizEnum.ADMIN_IN);
return CzgResult.success(shopUserService.updateMoney(StpKit.USER.getShopId(), shopUserMoneyEditDTO));
}

View File

@ -22,7 +22,7 @@ import java.util.Map;
*/
@RestController
@RequestMapping("/pay")
public class PayController {
public class OrderPayController {
@Resource
private PayService payService;

View File

@ -0,0 +1,75 @@
package com.czg.controller;
import com.czg.resp.CzgResult;
import com.czg.sa.StpKit;
import com.czg.service.order.dto.VipPayParamDTO;
import com.czg.service.order.service.PayService;
import com.czg.utils.ServletUtil;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
/**
* 会员 支付
*
* @author ww
* @description
*/
@RestController
@RequestMapping("/pay")
public class VipPayController {
@Resource
private PayService payService;
/**
* js支付
* payType 必填 支付方式aliPay 支付宝wechatPay 微信
* openId 必填
*/
@PostMapping("jsPayVip")
public CzgResult<Map<String, Object>> jsPayVip(HttpServletRequest request, @Validated @RequestBody VipPayParamDTO payParam) {
payParam.setUserId(StpKit.USER.getLoginIdAsLong());
payParam.setPlatformType(ServletUtil.getHeaderIgnoreCase(ServletUtil.getRequest(),"platformType"));
return payService.jsPayVip(ServletUtil.getClientIPByHeader(request), payParam);
}
/**
* 小程序支付
* payType 必填 支付方式aliPay 支付宝wechatPay 微信
* openId 必填
*/
@PostMapping("ltPayVip")
public CzgResult<Map<String, Object>> ltPayVip(HttpServletRequest request, @Validated @RequestBody VipPayParamDTO payParam) {
payParam.setUserId(StpKit.USER.getLoginIdAsLong());
payParam.setPlatformType(ServletUtil.getHeaderIgnoreCase(ServletUtil.getRequest(),"platformType"));
return payService.ltPayVip(ServletUtil.getClientIPByHeader(request), payParam);
}
/**
* 正扫
*/
@PostMapping("scanPayVip")
public CzgResult<Map<String, Object>> scanPayVip(HttpServletRequest request, @Validated @RequestBody VipPayParamDTO payParam) {
payParam.setUserId(StpKit.USER.getLoginIdAsLong());
payParam.setPlatformType(ServletUtil.getHeaderIgnoreCase(ServletUtil.getRequest(),"platformType"));
return payService.scanPayVip(ServletUtil.getClientIPByHeader(request), payParam);
}
/**
* 反扫
* authCode 必填 扫描码
*/
@PostMapping("microPayVip")
public CzgResult<Map<String, Object>> microPayVip(@Validated @RequestBody VipPayParamDTO payParam) {
payParam.setUserId(StpKit.USER.getLoginIdAsLong());
payParam.setPlatformType(ServletUtil.getHeaderIgnoreCase(ServletUtil.getRequest(),"platformType"));
return payService.microPayVip(payParam);
}
}

View File

@ -30,7 +30,7 @@ dubbo:
application:
name: order-server
qos-port: 22231
qos-enable: true
# qos-enable: true
registry:
address: nacos://121.40.109.122:8848 # Nacos 服务地址
group: server

View File

@ -31,7 +31,7 @@ dubbo:
application:
name: order-server
qos-port: 22232
qos-enable: true
# qos-enable: true
registry:
address: nacos://121.40.109.122:8848 # Nacos 服务地址
group: server-test

View File

@ -1,9 +1,10 @@
package com.czg.account.dto.shopuser;
import com.czg.enums.ShopUserFlowBizEnum;
import jakarta.validation.constraints.DecimalMax;
import jakarta.validation.constraints.DecimalMin;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull;
import lombok.Builder;
import lombok.Data;
import java.math.BigDecimal;
@ -12,6 +13,7 @@ import java.math.BigDecimal;
* @author Administrator
*/
@Data
@Builder
public class ShopUserMoneyEditDTO {
/**
* 对应shopUserid
@ -30,6 +32,8 @@ public class ShopUserMoneyEditDTO {
@DecimalMin("0.01")
@DecimalMax("9999")
private BigDecimal money;
private ShopUserFlowBizEnum bizEnum;
/**
* 备注
*/

View File

@ -84,7 +84,7 @@ public class OrderPayment implements Serializable {
public OrderPayment() {
}
public OrderPayment(@NonNull Long shopId, @NonNull Long sourceId, @NotBlank String payType, @NotBlank String orderNo,
public OrderPayment(@NonNull Long shopId,@NonNull Long sourceId, @NotBlank String payType, @NotBlank String orderNo,
String authCode, @NonNull BigDecimal amount) {
this.shopId = shopId;
this.sourceId = sourceId;

View File

@ -16,6 +16,7 @@ import java.io.Serializable;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.List;
import java.util.Map;
/**
* 商品分组
@ -99,4 +100,9 @@ public class ProdGroupDTO implements Serializable {
* 商品简要信息列表
*/
private List<ProductBriefDTO> productList;
/**
* 分组商品信息用于小程序首页展示
*/
private List<Map<String,Object>> products;
}

View File

@ -137,9 +137,9 @@ public class ProductDTO implements Serializable {
@JSONField(format = "HH:mm:ss")
private LocalTime endTime;
/**
* 规格详情
* 选中规格
*/
private String specInfo;
private Object selectSpecInfo;
/**
* 排序
*/
@ -200,7 +200,23 @@ public class ProductDTO implements Serializable {
private List<ProductGroupVo> proGroupVo;
/**
* 创建开始时间
*/
private LocalDateTime createBeginTime;
/**
* 创建结束时间
*/
private LocalDateTime createEndTime;
public Object getImages() {
return JSON.parseArray(Convert.toStr(images, "[]"));
}
/**
* {"口味":[{"甜度":["少甜","中甜","多甜"]},{"辣度":["微辣","重辣","变态辣"]},{"小料":["葱花","香菜","折耳根"]}]}
*/
public Object getSelectSpecInfo() {
return JSON.parseObject(Convert.toStr(selectSpecInfo, "{}"));
}
}

View File

@ -103,9 +103,9 @@ public class Product implements Serializable {
*/
private LocalTime endTime;
/**
* 规格详情
* 选中规格
*/
private String specInfo;
private String selectSpecInfo;
/**
* 排序
*/

View File

@ -2,13 +2,21 @@ package com.czg.product.vo;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalTime;
import java.util.ArrayList;
import java.util.List;
/**
* @author Administrator
*/
@Data
public class ProductGroupVo {
public class ProductGroupVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
private Integer count;
//选几个

View File

@ -66,12 +66,7 @@ public class CzgBaseResp {
* 微信 / 支付宝订单号
*/
private String channelTradeNo;
/**
* 扩展参数
* {
* "pay_type": "order/vip"
* }
*/
private String extParam;

View File

@ -4,6 +4,7 @@ import com.mybatisflex.spring.service.impl.ServiceImpl;
import com.czg.account.entity.ShopUserFlow;
import com.czg.account.service.ShopUserFlowService;
import com.czg.service.account.mapper.ShopUserFlowMapper;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.stereotype.Service;
/**
@ -12,7 +13,7 @@ import org.springframework.stereotype.Service;
* @author zs
* @since 2025-02-13
*/
@Service
@DubboService
public class ShopUserFlowServiceImpl extends ServiceImpl<ShopUserFlowMapper, ShopUserFlow> implements ShopUserFlowService{
}

View File

@ -22,6 +22,7 @@ import com.czg.utils.PageUtil;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.spring.service.impl.ServiceImpl;
import jakarta.annotation.Resource;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.stereotype.Service;
import java.math.RoundingMode;
@ -32,7 +33,7 @@ import java.math.RoundingMode;
* @author Administrator
* @since 2025-02-08
*/
@Service
@DubboService
public class ShopUserServiceImpl extends ServiceImpl<ShopUserMapper, ShopUser> implements ShopUserService {
@Resource
private ShopUserFlowService shopUserFlowService;
@ -82,7 +83,7 @@ public class ShopUserServiceImpl extends ServiceImpl<ShopUserMapper, ShopUser> i
userFlow.setShopId(userInfo.getShopId());
userFlow.setAmount(shopUserEditDTO.getMoney());
userFlow.setBalance(shopUserEditDTO.getType() == 0 ? userInfo.getAmount().subtract(shopUserEditDTO.getMoney()) : userInfo.getAmount().add(shopUserEditDTO.getMoney()));
userFlow.setBizCode(ShopUserFlowBizEnum.ADMIN_IN.getCode());
userFlow.setBizCode(shopUserEditDTO.getBizEnum().getCode());
userFlow.setType(shopUserEditDTO.getType() == 0 ? "-" : "+");
userFlow.setRemark(shopUserEditDTO.getRemark());
return shopUserFlowService.save(userFlow);

View File

@ -0,0 +1,32 @@
package com.czg.service.order.dto;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.math.BigDecimal;
/**
* 支付接收参数 实体类
*
* @author ww
* @description
*/
@Data
public class VipPayParamDTO {
@NotNull(message = "店铺不能为空")
private Long shopId;
private Long shopUserId;
private Long userId;
@NotNull(message = "充值金额不为空")
private BigDecimal amount;
private String buyerRemark;
private String returnUrl;
/**
* 平台类型 pc 收银机客户端 wechat 微信小程序 alipay 支付宝小程序 admin-pc PC管理端 admin-app APP管理端
*/
private String platformType;
private String payType;
private String openId;
private String authCode;
}

View File

@ -3,6 +3,7 @@ package com.czg.service.order.service;
import com.czg.entity.resp.*;
import com.czg.resp.CzgResult;
import com.czg.service.order.dto.OrderPayParamDTO;
import com.czg.service.order.dto.VipPayParamDTO;
import java.math.BigDecimal;
import java.util.Map;
@ -38,6 +39,26 @@ public interface PayService {
*/
CzgResult<Map<String, Object>> microPayOrder(OrderPayParamDTO payParam);
/**
* js支付
*/
CzgResult<Map<String, Object>> jsPayVip(String clintIp, VipPayParamDTO payParam);
/**
* 小程序支付
*/
CzgResult<Map<String, Object>> ltPayVip(String clintIp, VipPayParamDTO payParam);
/**
* PC扫码支付
*/
CzgResult<Map<String, Object>> scanPayVip(String clintIp, VipPayParamDTO payParam);
/**
* 聚合反扫
*/
CzgResult<Map<String, Object>> microPayVip(VipPayParamDTO payParam);
/**
* 订单退款

View File

@ -3,7 +3,11 @@ package com.czg.service.order.service.impl;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson2.JSONObject;
import com.czg.account.dto.shopuser.ShopUserMoneyEditDTO;
import com.czg.account.entity.ShopUser;
import com.czg.account.service.ShopUserService;
import com.czg.entity.notify.CzgPayNotifyDTO;
import com.czg.enums.ShopUserFlowBizEnum;
import com.czg.order.dto.OrderInfoQueryDTO;
import com.czg.order.entity.OrderDetail;
import com.czg.order.entity.OrderInfo;
@ -21,6 +25,8 @@ import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.spring.service.impl.ServiceImpl;
import jakarta.annotation.Resource;
import jakarta.validation.constraints.NotBlank;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@ -33,6 +39,7 @@ import java.util.List;
* @author ww
* @since 2025-02-13
*/
@Slf4j
@Service
public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo> implements OrderInfoService {
@ -41,6 +48,8 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
@Resource
private OrderPaymentService paymentService;
@DubboReference
private ShopUserService shopUserService;
@Override
public Page<OrderInfoVo> getOrderByPage(OrderInfoQueryDTO param) {
@ -95,9 +104,28 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
.where(OrderInfo::getId).eq(payment.getSourceId())
.update();
//发送打票信息
} else if ("memberIn".equals(payment.getPayType())) {
ShopUser shopUser = shopUserService.getById(payment.getSourceId());
if (shopUser == null) {
log.error("会员充值失败会员不存在会员id{}", payment.getSourceId());
} else {
shopUserService.updateChain()
.set(ShopUser::getIsVip, 1)
.eq(ShopUser::getId, payment.getSourceId())
.update();
ShopUserMoneyEditDTO shopUserMoneyEditDTO = ShopUserMoneyEditDTO.builder()
.id(payment.getSourceId())
.money(new BigDecimal(czgCallBackDto.getAmount() / 100L))
.type(1)
.build();
if ("WECHAT".equals(czgCallBackDto.getPayType())) {
shopUserMoneyEditDTO.setBizEnum(ShopUserFlowBizEnum.WECHAT_IN);
}else if("ALIPAY".equals(czgCallBackDto.getPayType())){
shopUserMoneyEditDTO.setBizEnum(ShopUserFlowBizEnum.ADMIN_IN);
}
shopUserService.updateMoney(shopUser.getShopId(),shopUserMoneyEditDTO);
}
}
} else {
}
}

View File

@ -1,9 +1,12 @@
package com.czg.service.order.service.impl;
import cn.hutool.core.exceptions.ValidateException;
import cn.hutool.core.util.IdUtil;
import com.alibaba.fastjson2.JSONObject;
import com.czg.account.entity.ShopMerchant;
import com.czg.account.entity.ShopUser;
import com.czg.account.service.ShopMerchantService;
import com.czg.account.service.ShopUserService;
import com.czg.entity.req.*;
import com.czg.entity.resp.*;
import com.czg.order.entity.OrderInfo;
@ -13,6 +16,7 @@ import com.czg.order.service.OrderPaymentService;
import com.czg.resp.CzgResult;
import com.czg.service.CzgPayService;
import com.czg.service.order.dto.OrderPayParamDTO;
import com.czg.service.order.dto.VipPayParamDTO;
import com.czg.service.order.enums.PayEnums;
import com.czg.service.order.service.PayService;
import com.czg.system.enums.SysParamCodeEnum;
@ -39,6 +43,8 @@ public class PayServiceImpl implements PayService {
private ShopMerchantService shopMerchantService;
@DubboReference
private SysParamsService sysParamsService;
@DubboReference
private ShopUserService shopUserService;
@Resource
private CzgPayService czgPayService;
@Resource
@ -47,8 +53,6 @@ public class PayServiceImpl implements PayService {
private OrderPaymentService paymentService;
private final BigDecimal MONEY_RATE = new BigDecimal("100");
private final String payJsonExtParam = "{\"payType\":\"1\"}";
private final String refundJsonExtParam = "{\"payType\":\"1\"}";
@Override
public CzgResult<Map<String, Object>> h5PayOrder(@NonNull String clintIp, OrderPayParamDTO payParam) {
@ -58,7 +62,7 @@ public class PayServiceImpl implements PayService {
initOrderPayment(new OrderPayment(payParam.getShopId(), payParam.getOrderId(), "order", payOrderNo, "", orderInfo.getOrderAmount()));
upOrderPayInfo(orderInfo.getId(), PayEnums.H5_PAY.getValue(), payOrderNo);
return h5Pay(payParam.getShopId(), new CzgH5PayReq(payOrderNo, orderInfo.getOrderAmount().multiply(MONEY_RATE).longValue(),
"点餐支付", clintIp, payParam.getReturnUrl(), payParam.getBuyerRemark(), payJsonExtParam));
"点餐支付", clintIp, payParam.getReturnUrl(), payParam.getBuyerRemark(), ""));
}
@ -66,11 +70,13 @@ public class PayServiceImpl implements PayService {
public CzgResult<Map<String, Object>> jsPayOrder(@NonNull String clintIp, OrderPayParamDTO payParam) {
OrderInfo orderInfo = orderInfoService.getById(payParam.getOrderId());
AssertUtil.isNull(orderInfo, "订单不存在");
AssertUtil.isBlank(payParam.getOpenId(), "用户小程序ID不能为空");
AssertUtil.isBlank(payParam.getPayType(), "支付方式不能为空");
String payOrderNo = orderInfo.getPlatformType() + IdUtil.getSnowflakeNextId();
initOrderPayment(new OrderPayment(payParam.getShopId(), payParam.getOrderId(), "order", payOrderNo, "", orderInfo.getOrderAmount()));
upOrderPayInfo(orderInfo.getId(), "aliPay".equals(payParam.getPayType()) ? PayEnums.ALIPAY_MINI.getValue() : PayEnums.WECHAT_MINI.getValue(), payOrderNo);
return jsPay(payParam.getShopId(), payParam.getPayType(), new CzgJsPayReq(payOrderNo, orderInfo.getOrderAmount().multiply(MONEY_RATE).longValue(),
"点餐支付", payParam.getOpenId(), clintIp, payParam.getReturnUrl(), payParam.getBuyerRemark(), payJsonExtParam));
"点餐支付", payParam.getOpenId(), clintIp, payParam.getReturnUrl(), payParam.getBuyerRemark(), ""));
}
@Override
@ -81,7 +87,7 @@ public class PayServiceImpl implements PayService {
initOrderPayment(new OrderPayment(payParam.getShopId(), payParam.getOrderId(), "order", payOrderNo, "", orderInfo.getOrderAmount()));
upOrderPayInfo(orderInfo.getId(), "aliPay".equals(payParam.getPayType()) ? PayEnums.ALIPAY_MINI.getValue() : PayEnums.WECHAT_MINI.getValue(), payOrderNo);
return ltPay(payParam.getShopId(), payParam.getPayType(), new CzgLtPayReq(payOrderNo, orderInfo.getOrderAmount().multiply(MONEY_RATE).longValue(),
"点餐支付", payParam.getOpenId(), clintIp, payParam.getReturnUrl(), payParam.getBuyerRemark(), payJsonExtParam));
"点餐支付", payParam.getOpenId(), clintIp, payParam.getReturnUrl(), payParam.getBuyerRemark(), ""));
}
@Override
@ -92,20 +98,71 @@ public class PayServiceImpl implements PayService {
initOrderPayment(new OrderPayment(payParam.getShopId(), payParam.getOrderId(), "order", payOrderNo, "", orderInfo.getOrderAmount()));
upOrderPayInfo(orderInfo.getId(), PayEnums.MAIN_SCAN.getValue(), payOrderNo);
return scanPay(payParam.getShopId(), new CzgScanPayReq(payOrderNo, orderInfo.getOrderAmount().multiply(MONEY_RATE).longValue(),
"点餐支付", clintIp, payParam.getReturnUrl(), payParam.getBuyerRemark(), payJsonExtParam));
"点餐支付", clintIp, payParam.getReturnUrl(), payParam.getBuyerRemark(), ""));
}
@Override
public CzgResult<Map<String, Object>> microPayOrder(OrderPayParamDTO payParam) {
OrderInfo orderInfo = orderInfoService.getById(payParam.getOrderId());
AssertUtil.isNull(orderInfo, "订单不存在");
AssertUtil.isBlank(payParam.getAuthCode(), "扫描码不能为空");
String payOrderNo = orderInfo.getPlatformType() + IdUtil.getSnowflakeNextId();
initOrderPayment(new OrderPayment(payParam.getShopId(), payParam.getOrderId(), "order", payOrderNo, payParam.getAuthCode(), orderInfo.getOrderAmount()));
upOrderPayInfo(orderInfo.getId(), PayEnums.BACK_SCAN.getValue(), payOrderNo);
return microPay(payParam.getShopId(), new CzgMicroPayReq(payOrderNo, orderInfo.getOrderAmount().multiply(MONEY_RATE).longValue(),
"点餐支付", payParam.getAuthCode(), payParam.getBuyerRemark(), payJsonExtParam));
"点餐支付", payParam.getAuthCode(), payParam.getBuyerRemark(), ""));
}
@Override
public CzgResult<Map<String, Object>> jsPayVip(String clintIp, VipPayParamDTO payParam) {
ShopUser shopUser = shopUserService.queryChain().eq(ShopUser::getShopId, payParam.getShopId())
.eq(ShopUser::getUserId, payParam.getShopUserId()).one();
AssertUtil.isNull(shopUser,"充值失败 该店铺用户不存在");
AssertUtil.isBlank(payParam.getOpenId(), "用户小程序ID不能为空");
AssertUtil.isBlank(payParam.getPayType(), "支付方式不能为空");
String payOrderNo = payParam.getPlatformType() + IdUtil.getSnowflakeNextId();
initOrderPayment(new OrderPayment(payParam.getShopId(), shopUser.getId(), "memberIn", payOrderNo, "", payParam.getAmount()));
return jsPay(payParam.getShopId(), payParam.getPayType(), new CzgJsPayReq(payOrderNo, payParam.getAmount().multiply(MONEY_RATE).longValue(),
"会员充值", payParam.getOpenId(), clintIp, payParam.getReturnUrl(), payParam.getBuyerRemark(), ""));
}
@Override
public CzgResult<Map<String, Object>> ltPayVip(String clintIp, VipPayParamDTO payParam) {
ShopUser shopUser = shopUserService.queryChain().eq(ShopUser::getShopId, payParam.getShopId())
.eq(ShopUser::getUserId, payParam.getShopUserId()).one();
AssertUtil.isNull(shopUser,"充值失败 该店铺用户不存在");
AssertUtil.isBlank(payParam.getOpenId(), "用户小程序ID不能为空");
AssertUtil.isBlank(payParam.getPayType(), "支付方式不能为空");
String payOrderNo = payParam.getPlatformType() + IdUtil.getSnowflakeNextId();
initOrderPayment(new OrderPayment(payParam.getShopId(), shopUser.getId(), "memberIn", payOrderNo, "", payParam.getAmount()));
return ltPay(payParam.getShopId(), payParam.getPayType(), new CzgLtPayReq(payOrderNo, payParam.getAmount().multiply(MONEY_RATE).longValue(),
"会员充值", payParam.getOpenId(), clintIp, payParam.getReturnUrl(), payParam.getBuyerRemark(), ""));
}
@Override
public CzgResult<Map<String, Object>> scanPayVip(String clintIp, VipPayParamDTO payParam) {
ShopUser shopUser = shopUserService.queryChain().eq(ShopUser::getShopId, payParam.getShopId())
.eq(ShopUser::getUserId, payParam.getShopUserId()).one();
AssertUtil.isNull(shopUser,"充值失败 该店铺用户不存在");
String payOrderNo = payParam.getPlatformType() + IdUtil.getSnowflakeNextId();
initOrderPayment(new OrderPayment(payParam.getShopId(), shopUser.getId(), "memberIn", payOrderNo, "", payParam.getAmount()));
return scanPay(payParam.getShopId(), new CzgScanPayReq(payOrderNo, payParam.getAmount().multiply(MONEY_RATE).longValue(),
"会员充值", clintIp, payParam.getReturnUrl(), payParam.getBuyerRemark(), ""));
}
@Override
public CzgResult<Map<String, Object>> microPayVip(VipPayParamDTO payParam) {
ShopUser shopUser = shopUserService.queryChain().eq(ShopUser::getShopId, payParam.getShopId())
.eq(ShopUser::getUserId, payParam.getShopUserId()).one();
AssertUtil.isNull(shopUser,"充值失败 该店铺用户不存在");
AssertUtil.isBlank(payParam.getAuthCode(), "扫描码不能为空");
String payOrderNo = payParam.getPlatformType() + IdUtil.getSnowflakeNextId();
initOrderPayment(new OrderPayment(payParam.getShopId(), shopUser.getId(), "memberIn", payOrderNo, payParam.getAuthCode(), payParam.getAmount()));
return microPay(payParam.getShopId(), new CzgMicroPayReq(payOrderNo, payParam.getAmount().multiply(MONEY_RATE).longValue(),
"会员充值", payParam.getAuthCode(), payParam.getBuyerRemark(), ""));
}
@Override
public CzgResult<CzgRefundResp> refundOrder(@NonNull Long shopId, @NonNull Long orderId, @NonNull String refundReason, @NonNull BigDecimal refundAmount) {
@ -150,20 +207,20 @@ public class PayServiceImpl implements PayService {
private CzgResult<Map<String, Object>> jsPay(@NonNull Long shopId, @NonNull String payType, CzgJsPayReq bizData) {
ShopMerchant shopMerchant = shopMerchantService.getById(shopId);
bizData.setSubAppid("aliPay".equals(payType) ? shopMerchant.getAlipaySmallAppid() : shopMerchant.getWechatSmallAppid());
AssertUtil.isBlank(bizData.getSubAppid(), "暂不可用,请联系商家配置" + ("aliPay".equals(payType) ? "支付宝" : "微信") + "小程序");
bizData.assignMerchant(shopMerchant.getStoreId(), shopMerchant.getMerchantName(),
sysParamsService.getSysParamValue(SysParamCodeEnum.PAY_CZG_NOTIFY_URL.getCode()));
bizData.setSubAppid("aliPay".equals(payType) ? shopMerchant.getAlipaySmallAppid() : shopMerchant.getWechatSmallAppid());
CzgResult<CzgJsPayResp> jsPayRespCzgResult = czgPayService.jsPay(shopMerchant.getAppId(), shopMerchant.getAppSecret(), bizData);
return execPayResult(jsPayRespCzgResult);
}
private CzgResult<Map<String, Object>> ltPay(@NonNull Long shopId, String payType, CzgLtPayReq bizData) {
ShopMerchant shopMerchant = shopMerchantService.getById(shopId);
bizData.setSubAppid("aliPay".equals(payType) ? shopMerchant.getAlipaySmallAppid() : shopMerchant.getWechatSmallAppid());
AssertUtil.isBlank(bizData.getSubAppid(), "暂不可用,请联系商家配置" + ("aliPay".equals(payType) ? "支付宝" : "微信") + "小程序");
bizData.assignMerchant(shopMerchant.getStoreId(), shopMerchant.getMerchantName(),
sysParamsService.getSysParamValue(SysParamCodeEnum.PAY_CZG_NOTIFY_URL.getCode()));
bizData.setSubAppid("aliPay".equals(payType) ? shopMerchant.getAlipaySmallAppid() : shopMerchant.getWechatSmallAppid());
CzgResult<CzgLtPayResp> ltPayRespCzgResult = czgPayService.ltPay(shopMerchant.getAppId(), shopMerchant.getAppSecret(), bizData);
return execPayResult(ltPayRespCzgResult);
}
@ -177,10 +234,10 @@ public class PayServiceImpl implements PayService {
}
private CzgResult<Map<String, Object>> microPay(@NonNull Long shopId, CzgMicroPayReq bizData) {
AssertUtil.isBlank(bizData.getAuthCode(), "扫码失败,请重试");
ShopMerchant shopMerchant = shopMerchantService.getById(shopId);
bizData.assignMerchant(shopMerchant.getStoreId(), shopMerchant.getMerchantName(),
sysParamsService.getSysParamValue(SysParamCodeEnum.PAY_CZG_NOTIFY_URL.getCode()));
AssertUtil.isBlank(bizData.getAuthCode(), "扫码失败,请重试");
String firstTwoDigitsStr = bizData.getAuthCode().substring(0, 2);
// 将截取的字符串转换为整数
@ -193,6 +250,8 @@ public class PayServiceImpl implements PayService {
} else if (firstTwoDigits >= 25 && firstTwoDigits <= 30) {
//支付宝支付
bizData.setSubAppid(shopMerchant.getAlipaySmallAppid());
}else {
throw new ValidateException("扫描码非法或暂不支持");
}
CzgResult<CzgMicroPayResp> czgScanPayResult = czgPayService.microPay(shopMerchant.getAppId(), shopMerchant.getAppSecret(), bizData);
@ -224,13 +283,16 @@ public class PayServiceImpl implements PayService {
}
return result;
}
case CzgH5PayResp h5PayResp -> map = JSONObject.parseObject(JSONObject.toJSONString(h5PayResp.getPayInfo()));
case CzgJsPayResp jsPayResp -> map = JSONObject.parseObject(JSONObject.toJSONString(jsPayResp.getPayInfo()));
case CzgH5PayResp h5PayResp ->
map = JSONObject.parseObject(JSONObject.toJSONString(h5PayResp.getPayInfo()));
case CzgJsPayResp jsPayResp ->
map = JSONObject.parseObject(JSONObject.toJSONString(jsPayResp.getPayInfo()));
case CzgLtPayResp ltPayResp -> {
map.put("payInfo", JSONObject.toJSONString(ltPayResp.getPayInfo()));
map.put("liteInfo", JSONObject.toJSONString(ltPayResp.getLiteInfo()));
}
case CzgScanPayResp scanPayResp -> map = JSONObject.parseObject(JSONObject.toJSONString(scanPayResp.getPayInfo()));
case CzgScanPayResp scanPayResp ->
map = JSONObject.parseObject(JSONObject.toJSONString(scanPayResp.getPayInfo()));
default -> throw new IllegalStateException("Unexpected value: " + data);
}

View File

@ -58,6 +58,12 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
if (ObjUtil.isNotNull(param.getSpecId())) {
queryWrapper.like(Product::getSpecId, param.getSpecId());
}
if (ObjUtil.isNotNull(param.getCreateBeginTime())) {
queryWrapper.ge(Product::getCreateTime, param.getCreateBeginTime());
}
if (ObjUtil.isNotNull(param.getCreateEndTime())) {
queryWrapper.le(Product::getCreateTime, param.getCreateEndTime());
}
Long shopId = StpKit.USER.getLoginIdAsLong();
queryWrapper.eq(Product::getShopId, shopId);
queryWrapper.eq(Product::getIsDel, DeleteEnum.NORMAL.value());
@ -72,7 +78,7 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
queryWrapper.select(PRODUCT.DEFAULT_COLUMNS)
.select(SHOP_PROD_UNIT.NAME.as(ProductDTO::getUnitName))
.select(SHOP_PROD_CATEGORY.NAME.as(ProductDTO::getCategoryName))
.select(SHOP_PROD_SPEC.NAME.as(ProductDTO::getSpecName),SHOP_PROD_SPEC.FULL_NAME.as(ProductDTO::getSpecFullName))
.select(SHOP_PROD_SPEC.NAME.as(ProductDTO::getSpecName), SHOP_PROD_SPEC.FULL_NAME.as(ProductDTO::getSpecFullName))
.from(PRODUCT)
.leftJoin(SHOP_PROD_UNIT).on(SHOP_PROD_UNIT.ID.eq(PRODUCT.UNIT_ID))
.leftJoin(SHOP_PROD_CATEGORY).on(SHOP_PROD_CATEGORY.ID.eq(PRODUCT.CATEGORY_ID))
@ -110,13 +116,11 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
entity.setGroupSnap(JSON.toJSONString(dto.getProGroupVo()));
}
}
entity.setSpecInfo(JSON.toJSONString(dto.getSkuList()));
entity.setIsDel(DeleteEnum.NORMAL.value());
entity.setShopId(shopId);
super.save(entity);
List<ProdSkuDTO> skuList = dto.getSkuList();
if(CollUtil.isNotEmpty(skuList)){
if (CollUtil.isNotEmpty(skuList)) {
List<ProdSku> prodSkuList = new ArrayList<>();
for (ProdSkuDTO prodSkuDTO : skuList) {
ProdSku prodSku = BeanUtil.copyProperties(prodSkuDTO, ProdSku.class);
@ -142,7 +146,32 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
throw new CzgException("商品已存在");
}
Product entity = BeanUtil.copyProperties(dto, Product.class);
return super.updateById(entity);
//套餐
if (ProductTypeEnum.PACKAGE.value().equals(dto.getType())) {
//套餐内容
if (CollUtil.isNotEmpty(dto.getProGroupVo())) {
entity.setGroupSnap(JSON.toJSONString(dto.getProGroupVo()));
}
}
entity.setIsDel(DeleteEnum.NORMAL.value());
entity.setShopId(shopId);
super.save(entity);
List<ProdSkuDTO> skuList = dto.getSkuList();
if (CollUtil.isNotEmpty(skuList)) {
List<ProdSku> prodSkuList = new ArrayList<>();
for (ProdSkuDTO prodSkuDTO : skuList) {
ProdSku prodSku = BeanUtil.copyProperties(prodSkuDTO, ProdSku.class);
prodSku.setShopId(entity.getShopId());
prodSku.setProductId(entity.getId());
prodSku.setRealSalesNumber(BigDecimal.ZERO);
prodSku.setIsPauseSale(YesNoEnum.NO.value());
prodSku.setIsGrounding(YesNoEnum.YES.value());
prodSku.setIsDel(DeleteEnum.NORMAL.value());
prodSkuList.add(prodSku);
}
prodSkuMapper.insertBatch(prodSkuList);
}
return true;
}
@Override