From 410c9bab0d4ddcdd19940755daad1b79ff736996 Mon Sep 17 00:00:00 2001 From: Tankaikai Date: Mon, 17 Feb 2025 18:12:29 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E5=95=86=E5=93=81=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/czg/product/dto/ProdGroupDTO.java | 6 ++++++ .../java/com/czg/product/dto/ProductDTO.java | 20 +++++++++++++++++-- .../java/com/czg/product/entity/Product.java | 4 ++-- .../com/czg/product/vo/ProductGroupVo.java | 10 +++++++++- .../service/impl/ProductServiceImpl.java | 6 ++++++ 5 files changed, 41 insertions(+), 5 deletions(-) diff --git a/cash-common/cash-common-service/src/main/java/com/czg/product/dto/ProdGroupDTO.java b/cash-common/cash-common-service/src/main/java/com/czg/product/dto/ProdGroupDTO.java index 867c3498..76485ba0 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/product/dto/ProdGroupDTO.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/product/dto/ProdGroupDTO.java @@ -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 productList; + + /** + * 分组商品信息,用于小程序首页展示 + */ + private List> products; } \ No newline at end of file diff --git a/cash-common/cash-common-service/src/main/java/com/czg/product/dto/ProductDTO.java b/cash-common/cash-common-service/src/main/java/com/czg/product/dto/ProductDTO.java index ba4bfa46..4dfe4c8a 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/product/dto/ProductDTO.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/product/dto/ProductDTO.java @@ -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 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, "{}")); + } } \ No newline at end of file diff --git a/cash-common/cash-common-service/src/main/java/com/czg/product/entity/Product.java b/cash-common/cash-common-service/src/main/java/com/czg/product/entity/Product.java index ee7795fc..f3d4d1d5 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/product/entity/Product.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/product/entity/Product.java @@ -103,9 +103,9 @@ public class Product implements Serializable { */ private LocalTime endTime; /** - * 规格详情 + * 选中规格 */ - private String specInfo; + private String selectSpecInfo; /** * 排序 */ diff --git a/cash-common/cash-common-service/src/main/java/com/czg/product/vo/ProductGroupVo.java b/cash-common/cash-common-service/src/main/java/com/czg/product/vo/ProductGroupVo.java index b84f47e7..6d3b0267 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/product/vo/ProductGroupVo.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/product/vo/ProductGroupVo.java @@ -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; //选几个 diff --git a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProductServiceImpl.java b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProductServiceImpl.java index 5fa34ae5..c4da214e 100644 --- a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProductServiceImpl.java +++ b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProductServiceImpl.java @@ -58,6 +58,12 @@ public class ProductServiceImpl extends ServiceImpl 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()); From 50f19eafbffe6d9ec9f5cd532eb29f9bbf3f4c59 Mon Sep 17 00:00:00 2001 From: Tankaikai Date: Mon, 17 Feb 2025 18:16:01 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E5=95=86=E5=93=81=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/ProductServiceImpl.java | 33 ++++++++++++++++--- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProductServiceImpl.java b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProductServiceImpl.java index c4da214e..2cae878f 100644 --- a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProductServiceImpl.java +++ b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProductServiceImpl.java @@ -78,7 +78,7 @@ public class ProductServiceImpl extends ServiceImpl 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)) @@ -116,13 +116,11 @@ public class ProductServiceImpl extends ServiceImpl 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 skuList = dto.getSkuList(); - if(CollUtil.isNotEmpty(skuList)){ + if (CollUtil.isNotEmpty(skuList)) { List prodSkuList = new ArrayList<>(); for (ProdSkuDTO prodSkuDTO : skuList) { ProdSku prodSku = BeanUtil.copyProperties(prodSkuDTO, ProdSku.class); @@ -148,7 +146,32 @@ public class ProductServiceImpl extends ServiceImpl 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 skuList = dto.getSkuList(); + if (CollUtil.isNotEmpty(skuList)) { + List 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 From 9b19329e6934624b5960d9af7c433d27fa88e9b7 Mon Sep 17 00:00:00 2001 From: wangw <1594593906@qq.com> Date: Mon, 17 Feb 2025 18:25:12 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E4=BC=9A=E5=91=98=E5=85=85=E5=80=BC=20?= =?UTF-8?q?=E5=89=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/admin/ShopUserController.java | 2 + ...ontroller.java => OrderPayController.java} | 2 +- .../com/czg/controller/VipPayController.java | 75 ++++++++++++++++ .../src/main/resources/application-dev.yml | 2 +- .../src/main/resources/application-test.yml | 2 +- .../dto/shopuser/ShopUserMoneyEditDTO.java | 6 +- .../com/czg/order/entity/OrderPayment.java | 2 +- .../java/com/czg/entity/resp/CzgBaseResp.java | 7 +- .../service/impl/ShopUserFlowServiceImpl.java | 3 +- .../service/impl/ShopUserServiceImpl.java | 5 +- .../czg/service/order/dto/VipPayParamDTO.java | 32 +++++++ .../czg/service/order/service/PayService.java | 21 +++++ .../service/impl/OrderInfoServiceImpl.java | 32 ++++++- .../order/service/impl/PayServiceImpl.java | 88 ++++++++++++++++--- 14 files changed, 250 insertions(+), 29 deletions(-) rename cash-api/order-server/src/main/java/com/czg/controller/{PayController.java => OrderPayController.java} (98%) create mode 100644 cash-api/order-server/src/main/java/com/czg/controller/VipPayController.java create mode 100644 cash-service/order-service/src/main/java/com/czg/service/order/dto/VipPayParamDTO.java diff --git a/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopUserController.java b/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopUserController.java index 721a8c32..b5533af5 100644 --- a/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopUserController.java +++ b/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopUserController.java @@ -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 editMoney(@RequestBody @Validated ShopUserMoneyEditDTO shopUserMoneyEditDTO) { + shopUserMoneyEditDTO.setBizEnum(ShopUserFlowBizEnum.ADMIN_IN); return CzgResult.success(shopUserService.updateMoney(StpKit.USER.getShopId(), shopUserMoneyEditDTO)); } diff --git a/cash-api/order-server/src/main/java/com/czg/controller/PayController.java b/cash-api/order-server/src/main/java/com/czg/controller/OrderPayController.java similarity index 98% rename from cash-api/order-server/src/main/java/com/czg/controller/PayController.java rename to cash-api/order-server/src/main/java/com/czg/controller/OrderPayController.java index e2c22989..7ba63d12 100644 --- a/cash-api/order-server/src/main/java/com/czg/controller/PayController.java +++ b/cash-api/order-server/src/main/java/com/czg/controller/OrderPayController.java @@ -22,7 +22,7 @@ import java.util.Map; */ @RestController @RequestMapping("/pay") -public class PayController { +public class OrderPayController { @Resource private PayService payService; diff --git a/cash-api/order-server/src/main/java/com/czg/controller/VipPayController.java b/cash-api/order-server/src/main/java/com/czg/controller/VipPayController.java new file mode 100644 index 00000000..eb2195d2 --- /dev/null +++ b/cash-api/order-server/src/main/java/com/czg/controller/VipPayController.java @@ -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> 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> 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> 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> microPayVip(@Validated @RequestBody VipPayParamDTO payParam) { + payParam.setUserId(StpKit.USER.getLoginIdAsLong()); + payParam.setPlatformType(ServletUtil.getHeaderIgnoreCase(ServletUtil.getRequest(),"platformType")); + return payService.microPayVip(payParam); + } +} diff --git a/cash-api/order-server/src/main/resources/application-dev.yml b/cash-api/order-server/src/main/resources/application-dev.yml index 1512f691..e9b78476 100644 --- a/cash-api/order-server/src/main/resources/application-dev.yml +++ b/cash-api/order-server/src/main/resources/application-dev.yml @@ -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 diff --git a/cash-api/order-server/src/main/resources/application-test.yml b/cash-api/order-server/src/main/resources/application-test.yml index 07ae8d3a..eb8d30bb 100644 --- a/cash-api/order-server/src/main/resources/application-test.yml +++ b/cash-api/order-server/src/main/resources/application-test.yml @@ -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 diff --git a/cash-common/cash-common-service/src/main/java/com/czg/account/dto/shopuser/ShopUserMoneyEditDTO.java b/cash-common/cash-common-service/src/main/java/com/czg/account/dto/shopuser/ShopUserMoneyEditDTO.java index dddb13a2..ed444b4d 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/account/dto/shopuser/ShopUserMoneyEditDTO.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/dto/shopuser/ShopUserMoneyEditDTO.java @@ -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; /** * 备注 */ diff --git a/cash-common/cash-common-service/src/main/java/com/czg/order/entity/OrderPayment.java b/cash-common/cash-common-service/src/main/java/com/czg/order/entity/OrderPayment.java index 7025bbb0..6a4d53f4 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/order/entity/OrderPayment.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/order/entity/OrderPayment.java @@ -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; diff --git a/cash-sdk/czg-pay/src/main/java/com/czg/entity/resp/CzgBaseResp.java b/cash-sdk/czg-pay/src/main/java/com/czg/entity/resp/CzgBaseResp.java index 74f7a528..625640c5 100644 --- a/cash-sdk/czg-pay/src/main/java/com/czg/entity/resp/CzgBaseResp.java +++ b/cash-sdk/czg-pay/src/main/java/com/czg/entity/resp/CzgBaseResp.java @@ -66,12 +66,7 @@ public class CzgBaseResp { * 微信 / 支付宝订单号 */ private String channelTradeNo; - /** - * 扩展参数 - * { - * "pay_type": "order/vip" - * } - */ + private String extParam; diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopUserFlowServiceImpl.java b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopUserFlowServiceImpl.java index 9d3b562e..cad26f82 100644 --- a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopUserFlowServiceImpl.java +++ b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopUserFlowServiceImpl.java @@ -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 implements ShopUserFlowService{ } diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopUserServiceImpl.java b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopUserServiceImpl.java index e82eedd9..b71c3d7b 100644 --- a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopUserServiceImpl.java +++ b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopUserServiceImpl.java @@ -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 implements ShopUserService { @Resource private ShopUserFlowService shopUserFlowService; @@ -82,7 +83,7 @@ public class ShopUserServiceImpl extends ServiceImpl 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); diff --git a/cash-service/order-service/src/main/java/com/czg/service/order/dto/VipPayParamDTO.java b/cash-service/order-service/src/main/java/com/czg/service/order/dto/VipPayParamDTO.java new file mode 100644 index 00000000..4f8c0217 --- /dev/null +++ b/cash-service/order-service/src/main/java/com/czg/service/order/dto/VipPayParamDTO.java @@ -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; +} diff --git a/cash-service/order-service/src/main/java/com/czg/service/order/service/PayService.java b/cash-service/order-service/src/main/java/com/czg/service/order/service/PayService.java index c20d3721..2cdb342c 100644 --- a/cash-service/order-service/src/main/java/com/czg/service/order/service/PayService.java +++ b/cash-service/order-service/src/main/java/com/czg/service/order/service/PayService.java @@ -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> microPayOrder(OrderPayParamDTO payParam); + /** + * js支付 + */ + CzgResult> jsPayVip(String clintIp, VipPayParamDTO payParam); + + /** + * 小程序支付 + */ + CzgResult> ltPayVip(String clintIp, VipPayParamDTO payParam); + + /** + * PC扫码支付 + */ + CzgResult> scanPayVip(String clintIp, VipPayParamDTO payParam); + + /** + * 聚合反扫 + */ + CzgResult> microPayVip(VipPayParamDTO payParam); + /** * 订单退款 diff --git a/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/OrderInfoServiceImpl.java b/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/OrderInfoServiceImpl.java index a7f9746a..0a5d2bb4 100644 --- a/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/OrderInfoServiceImpl.java +++ b/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/OrderInfoServiceImpl.java @@ -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 implements OrderInfoService { @@ -41,6 +48,8 @@ public class OrderInfoServiceImpl extends ServiceImpl getOrderByPage(OrderInfoQueryDTO param) { @@ -95,9 +104,28 @@ public class OrderInfoServiceImpl extends ServiceImpl> 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> 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> 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> 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> 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> 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> 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 refundOrder(@NonNull Long shopId, @NonNull Long orderId, @NonNull String refundReason, @NonNull BigDecimal refundAmount) { @@ -150,20 +207,20 @@ public class PayServiceImpl implements PayService { private CzgResult> 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 jsPayRespCzgResult = czgPayService.jsPay(shopMerchant.getAppId(), shopMerchant.getAppSecret(), bizData); return execPayResult(jsPayRespCzgResult); } private CzgResult> 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 ltPayRespCzgResult = czgPayService.ltPay(shopMerchant.getAppId(), shopMerchant.getAppSecret(), bizData); return execPayResult(ltPayRespCzgResult); } @@ -177,10 +234,10 @@ public class PayServiceImpl implements PayService { } private CzgResult> 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 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); }