From c40257a0992d649f622d7b8709418973ca837df5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=9D=BE?= <8605635+zhang3064194730@user.noreply.gitee.com> Date: Fri, 7 Mar 2025 17:56:34 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=94=AF=E4=BB=98=E5=AE=9D?= =?UTF-8?q?=E4=BB=A5=E5=8F=8A=E5=BE=AE=E4=BF=A1=E5=85=AC=E4=BC=97=E5=8F=B7?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application.yml | 9 +++ .../czg/order/entity/ShopOrderStatistic.java | 2 + .../impl/UserAuthorizationServiceImpl.java | 8 +- .../czg/service/account/util/AlipayUtil.java | 21 ++++-- .../service/account/util/WechatAuthUtil.java | 14 +++- .../impl/ShopOrderStatisticServiceImpl.java | 75 ++++++++++++++++++- 6 files changed, 113 insertions(+), 16 deletions(-) diff --git a/cash-api/account-server/src/main/resources/application.yml b/cash-api/account-server/src/main/resources/application.yml index da51c33f..cad80f8d 100644 --- a/cash-api/account-server/src/main/resources/application.yml +++ b/cash-api/account-server/src/main/resources/application.yml @@ -24,6 +24,9 @@ mybatis-flex: wx: appId: wxd88fffa983758a30 secrete: a34a61adc0602118b49400baa8812454 + account: + appId: wx212769170d2c6b2a + secrete: 8492a7e8d55bbb1b57f5c8276ea1add0 alipay: serverUrl: https://openapi.alipay.com/gateway.do @@ -31,6 +34,12 @@ alipay: privateKey: MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCAjDBuS8K/IJb9ui+KuNm/sTUdEiaji4BNpZ92avO1N5JpNlGmac6ec4p3tNFT950sBLcQkClcUpQxUHQzAT6DYNNXOKyvfI/EmcqwCw6PaMNLs/8cV//J2WWZBUhLaOsjKurpm9/3W5MnTh4BGxIfBoeBMA8f8K3BgKdmyKtvIEV2h2cyjsMskdn+g6oNZcmWcms0pvpPHyH46mRaGFhpp0v19wX3WsamGldh1L2VntmaDN3C2XbSrXv90XYp5bEUqwTbLwXpMAlzTibF56d/iqv9oYi8cpAKougUFLOymnbutLNs2tLrEDSFwHcmG2/wbZHybZyYcIgFgv4arf+tAgMBAAECggEAf7hKKlw1y6Z6vvAtalxNZUuRZSfyog3p1bwYWxTavZPQcZ7Zs0lvVDmiO1u5m/7q96BbryY9IhCeUv0H5uF2lhwu/3s9AEL3qTPQkeb6eXxyhhX6A9RfPdM1Qbtg4CQHdHKg4qjP9znSVHwmDZ0y/QaEvdPdQzPjv92u9c2tn4N4x6XyBYcU5gzxiJNnIugCmBgcJo/3H2fgV+XXEhORPvy5of9b4oATHEaLS/8dAS2wuOjhzaGS4MXp3VkXn3XaYjwSzaL03qYWA+xm+aO5sJv8bmqZW7sNVck5o3sPo7cQ4VkBFVzyrRdmJcxcSRJ9MsB9JsrhoKI8pgaXrVie4QKBgQDU2vai0lpBIK/0jzRpPNoqdT8lnafnnWni8nU4kfAh+gCLi+HBPhQRT0kv4unQc2q2/gALE7sgZVO00JGY5a3R0orsojPoUSZlpypGW7GGqKy576NHn0nw4o/PdfysT92VWgt1hlfTf6qfCDhfE9APU+RGvlSWXcT8nxVel3iUaQKBgQCamoJN6+4v+chJvL2nqV8NVVRLp0vDIHxs1QOtKwUodx8Qp1D6CJYtavCXn8aNUFVNQJPJ7TQPpJjXP2rI4SN01weDwx+I+wh8PBGHV6/234R+6TvFgY1PrYgCdfNP4i/E7B4uyEhAxdU73PB8qkqRAeJGok05p7oG71KCOBiYpQKBgEZfGflcuDAeAW5GRhqg3rP4zWa/R7qgZVh9tll8jjp9b96y4XFE99d9MgId8BVVgyt6sEL5Q/2C4ni+F9TH4n6jMADp42VkJuCmsqhOOlP9whU67+2G8Sgtj0QUivPg964f9ffl8XVgGOW5DwIIB9p5btggptCLscufQK5kP545AoGADBvf6tR4wl8w9b2HqTMV08iEIqzGvVC1Dh0c/Zop/EJgN4CzUfIMOSBwGaAVAApzs+pD6QPgGP2OTwWTioo/qa4R05sbxDHNN1XJFa2jhZV6HiqMWOrNs5jm1zJ/zRjtHuJTdtyO9CvKiLbESy9XScY4/8lEfSiK5HIoJzTXkFUCgYAkYkvkW6psJpWj05XWq44UN0n6QOU/Igl35Um/iuOMVhsTmIt09STQVTuzJzfH82+sCqoRsD1blE5unKNUC1DK77aNKTv3Z0dxN9R7FAyfZRiYQXTrbBPBqWjay6FCNxn8e8UsJN4Z6FIV2LGlQI114krSap1MALKLVvnld0NaUQ== alipayPublicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAiQkrz+emAuS1mB3KKDOMmAZRd/BlPbh7fAIHAqAj1+QCZNcV3o2BTLIIqnuKpSlFXDG3uDzp2VsBxcizXuBbFyPGylnD9CgCj5abyh3+FIHPAZ2IM3TtpqImZ0TSPGXrMli4Nir7MvZktgccCqQKCC4o6iaDGz+UwWwJUIPna8fm2tiTZ+KH150CZbKVj4ZGNpBh5XSV/1dRgyQIV9D/EwSbkZ0n6VgKQLJBi0C2UE3QB17aL1Ir6+gDXIDbknN8O7GUD3aMGdThYdSRUb5wp9CZ5qfV7vCS/CgaRo38nhH3NOzkTL+7v0m1ZDHPmqEkn9VzZN6sCQdL7PoAOjHOCwIDAQAB encryptKey: Hp1TbhOqevbHCA5ji/VlqQ== + account: + appId: 2021004174605036 + privateKey: MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQD48HaUoV7OH7os+9L01kHgxzwIhJick4OkFq4aHsntsXEJ J3gedhuEZtV8oHKZ30DPW12IJ4S8NXtpr8OWaqrAPFonf4wVaRY1d0yIAea57kfLEn9oOEEy4FzARgMNDkyxC+/3OUdGbLHpTjfVX3gusXsEhUDy1/WewihAkoNYF37+W3W/uVLzeWoPq0EcUbRv/G/t/p6gL69ltsMAiVFG4Q/Yk24YAN6lYgBPNLXUEwQ1Q+T+1omjfavHgvarKOp33z3JOUH+aGOmDsJ5Y9gyGtJzOCipAd8Zcv+T1ygsEzZYO1/gzcbPnfO1ShqStCHzssuw8FBVx2JdfQKXKMMNAgMBAAECggEAVTrO/pg5Q00titU1Jspsh67u6OOs9H605Ws2dI7yB8VmtAGlaJh7V1t14FN2qSP8poHbhhAxq9aLyGV7C3a9u09udnN+3J28EtYjh7VO732bavWMVXxdJjQWzWWrCb9JlpxFrlkYBA6W4w/6ob0sAqCVQ7jzwbEa0R4cde8ztOa5nysKSfr4YTSs0gqvoiC6fmg8eiRJraEQBoYz9VkKFtOhhh/4w5FhVcYQ2gQvZ3kK3QVuD1eJIQKlCtz8qaox9lXKDiZT4SCmnKshdUL0u5TYIcYeBjZmhJz0Q50KHcpZrCs5y7I0+vRBH3hU+TKSQt7ureymwhbwWMHScLV2gQKBgQD+58SHXhr5M8NGagAmTdsgmCnNv2kOYMd4STyPMY10SVwCv1Bk808ZuP+7e558J1b5/OuDLI5dLq6xrZ/1wLv1G++XqxI00hlFuWS5mUGJVcXotT1mw20rVeUILc7Qe3mLvbMGgfyKf4A7Qa5SSZ4bDeDTJYaFxyiQ281hMzDuPQKBgQD6AiL/Na2/uPH4CG6juwpjYvYVUcjK+7gbRwf3wWsWMpk90Z4ju2iUiP5c1J/oK9P+1T3PIr6M4Xjza8JJj+r9KC/PVB0gBv6vVM96cDpKUEy/UMpcn/T81vqj/Z+WEOODU8Ms6NiTTm+u9ldvpCjbu0u8M+9c0JeIyadJvSTFEQKBgQCsxmFyM3nq8YfpgU2qqNjfBeRH3faSVUy+nj1a/YZYjKS+A/i1BCnYUImeBVNN6chNV342ggvY4xxruDiU9Vcw8wd58O09Oi8BEIFSP6upL6cebUI6Fjo3xlegLJRiwV6INkNTJOYM5hD/mSxUACwXQFfkJipBINXBIgraWD1RLQKBgQCj49axWq0F6+WjZVOyPaD3uh37p9trRUxRhWTxw3fB23WdktaKMgbCqHOmwzP4bRLSEVQtf2dOz1gMqu14b8HqJvgAf/F/11YJ9hz09LEhmjZVjE68HZfqT7uK2W5OX8/lfXmK7TFcj6SjG5YB96lZMhTZ0WnufEd6QkdKDZYXIQKBgQD9GDTcIMbFwbEaKHnfZaTD3f876EGRgsgrCxwdEk7LBCRPwWo7yI929M4psIlpNwNeiyjBkBunWIVkpznp6qPtJqagIPUYesU4f5v6/okq5wcpaNKSkWbIvWVLaLGOiA1aeGJtbpMpyClbSr52puHpRRdvAiIEQ74yYh0JX8q96g== + publicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAiQkrz+emAuS1mB3KKDOMmAZRd/BlPbh7fAIHAqAj1+QCZNcV3o2BTLIIqnuKpSlFXDG3uDzp2VsBxcizXuBbFyPGylnD9CgCj5abyh3+FIHPAZ2IM3TtpqImZ0TSPGXrMli4Nir7MvZktgccCqQKCC4o6iaDGz+UwWwJUIPna8fm2tiTZ+KH150CZbKVj4ZGNpBh5XSV/1dRgyQIV9D/EwSbkZ0n6VgKQLJBi0C2UE3QB17aL1Ir6+gDXIDbknN8O7GUD3aMGdThYdSRUb5wp9CZ5qfV7vCS/CgaRo38nhH3NOzkTL+7v0m1ZDHPmqEkn9VzZN6sCQdL7PoAOjHOCwIDAQAB + + pagehelper: helper-dialect: mysql diff --git a/cash-common/cash-common-service/src/main/java/com/czg/order/entity/ShopOrderStatistic.java b/cash-common/cash-common-service/src/main/java/com/czg/order/entity/ShopOrderStatistic.java index d512deac..7ca2c049 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/order/entity/ShopOrderStatistic.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/order/entity/ShopOrderStatistic.java @@ -112,6 +112,8 @@ public class ShopOrderStatistic implements Serializable { * 主扫支付金额 */ private BigDecimal scanPayAmount; + private Long cashPayCount; + private BigDecimal cashPayAmount; /** * 店铺id diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/UserAuthorizationServiceImpl.java b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/UserAuthorizationServiceImpl.java index d0dfc9a5..20af2f8a 100644 --- a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/UserAuthorizationServiceImpl.java +++ b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/UserAuthorizationServiceImpl.java @@ -37,9 +37,9 @@ public class UserAuthorizationServiceImpl implements UserAuthorizationService { public String getOpenId(String code, String source) { String openId; if (UserAuthSourceEnum.WECHAT.getValue().equals(source)) { - openId = wechatAuthUtil.getSessionKeyOrOpenId(code); + openId = wechatAuthUtil.getSessionKeyOrOpenId(code, true); }else { - openId = alipayUtil.getOpenId(code); + openId = alipayUtil.getOpenId(code, true); } return openId; } @@ -50,7 +50,7 @@ public class UserAuthorizationServiceImpl implements UserAuthorizationService { UserInfo userInfo; String openId; if (UserAuthSourceEnum.WECHAT.getValue().equals(userAuthorizationLoginDTO.getSource())) { - openId = wechatAuthUtil.getSessionKeyOrOpenId(userAuthorizationLoginDTO.getCode()); + openId = wechatAuthUtil.getSessionKeyOrOpenId(userAuthorizationLoginDTO.getCode(), false); userInfo = userInfoService.queryChain().eq(UserInfo::getWechatOpenId, openId).one(); userInfo = userInfo == null ? new UserInfo() : userInfo; if (StrUtil.isNotBlank(userAuthorizationLoginDTO.getRawData())) { @@ -62,7 +62,7 @@ public class UserAuthorizationServiceImpl implements UserAuthorizationService { } userInfo.setWechatOpenId(openId); } else { - openId = alipayUtil.getOpenId(userAuthorizationLoginDTO.getCode()); + openId = alipayUtil.getOpenId(userAuthorizationLoginDTO.getCode(), false); userInfo = userInfoService.queryChain().eq(UserInfo::getAlipayOpenId, openId).one(); userInfo = userInfo == null ? new UserInfo() : userInfo; userInfo.setNickName("支付宝用户"); diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/util/AlipayUtil.java b/cash-service/account-service/src/main/java/com/czg/service/account/util/AlipayUtil.java index 08fed27b..7c790634 100644 --- a/cash-service/account-service/src/main/java/com/czg/service/account/util/AlipayUtil.java +++ b/cash-service/account-service/src/main/java/com/czg/service/account/util/AlipayUtil.java @@ -32,6 +32,7 @@ public class AlipayUtil { */ @Value("${alipay.appId}") private String appId; + /** * 应用私钥 */ @@ -48,30 +49,38 @@ public class AlipayUtil { @Value("${alipay.encryptKey}") private String encryptKey; + @Value("${alipay.account.appId}") + private String accountAppId; + @Value("${alipay.account.privateKey}") + private String accountPrivateKey; + @Value("${alipay.account.publicKey}") + private String accountPublicKey; + /** * 创建支付宝客户端 * @return AlipayClient */ @SneakyThrows - public AlipayClient createClient() { + public AlipayClient createClient(boolean isAccount) { AlipayConfig alipayConfig = new AlipayConfig(); //设置网关地址 alipayConfig.setServerUrl(serverUrl); //设置应用ID - alipayConfig.setAppId(appId); + alipayConfig.setAppId(isAccount ? accountAppId : appId); //设置应用私钥 - alipayConfig.setPrivateKey(privateKey); + alipayConfig.setPrivateKey(isAccount ? accountPrivateKey : privateKey); //设置支付宝公钥 - alipayConfig.setAlipayPublicKey(alipayPublicKey); + alipayConfig.setAlipayPublicKey(isAccount ? accountPublicKey : alipayPublicKey); return new DefaultAlipayClient(alipayConfig); } + /** * 获取支付宝用户的openId * @param code 用户信息授权码 * @return openId */ - public String getOpenId(String code){ + public String getOpenId(String code, boolean isAccount){ AlipaySystemOauthTokenRequest req = new AlipaySystemOauthTokenRequest(); //SDK已经封装掉了公共参数,这里只需要传入业务参数 req.setCode(code); @@ -80,7 +89,7 @@ public class AlipayUtil { //req.setBizContent(" {" + " \"primary_industry_name\":\"IT科技/IT软件与服务\"," + " \"primary_industry_code\":\"10001/20102\"," + " \"secondary_industry_code\":\"10001/20102\"," + " \"secondary_industry_name\":\"IT科技/IT软件与服务\"" + " }"); AlipaySystemOauthTokenResponse response; try { - response = createClient().execute(req); + response = createClient(isAccount).execute(req); }catch (Exception e){ log.error("获取支付宝用户信息失败", e); throw new RuntimeException(e); diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/util/WechatAuthUtil.java b/cash-service/account-service/src/main/java/com/czg/service/account/util/WechatAuthUtil.java index 408227c0..ebc819ed 100644 --- a/cash-service/account-service/src/main/java/com/czg/service/account/util/WechatAuthUtil.java +++ b/cash-service/account-service/src/main/java/com/czg/service/account/util/WechatAuthUtil.java @@ -21,10 +21,16 @@ public class WechatAuthUtil { @Value("${wx.appId}") private String appId; - @Value("${wx.secrete}") private String secrete; + @Value("${wx.account.appId}") + private String accountAppId; + @Value("${wx.account.secrete}") + private String accountSecrete; + + + static LinkedHashMap linkedHashMap=new LinkedHashMap<>(); static { @@ -41,14 +47,14 @@ public class WechatAuthUtil { } - public String getSessionKeyOrOpenId(String code) { + public String getSessionKeyOrOpenId(String code, boolean isAccount) { String requestUrl = "https://api.weixin.qq.com/sns/jscode2session"; Map requestUrlParam = new HashMap<>(); // https://mp.weixin.qq.com/wxopen/devprofile?action=get_profile&token=164113089&lang=zh_CN //小程序appId - requestUrlParam.put("appid", appId); + requestUrlParam.put("appid", isAccount ? accountAppId : appId); //小程序secret - requestUrlParam.put("secret", secrete); + requestUrlParam.put("secret", isAccount ? accountSecrete : secrete); //小程序端返回的code requestUrlParam.put("js_code", code); //默认参数 diff --git a/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/ShopOrderStatisticServiceImpl.java b/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/ShopOrderStatisticServiceImpl.java index 4ffa1e47..72ea7297 100644 --- a/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/ShopOrderStatisticServiceImpl.java +++ b/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/ShopOrderStatisticServiceImpl.java @@ -1,28 +1,99 @@ package com.czg.service.order.service.impl; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; import com.czg.order.entity.OrderInfo; +import com.czg.order.service.OrderInfoService; import com.mybatisflex.core.query.QueryWrapper; import com.mybatisflex.spring.service.impl.ServiceImpl; import com.czg.order.entity.ShopOrderStatistic; import com.czg.order.service.ShopOrderStatisticService; import com.czg.service.order.mapper.ShopOrderStatisticMapper; +import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import java.util.HashMap; import java.util.List; /** - * 服务层实现。 + * 服务层实现。 * * @author zs * @since 2025-03-07 */ @Service -public class ShopOrderStatisticServiceImpl extends ServiceImpl implements ShopOrderStatisticService{ +public class ShopOrderStatisticServiceImpl extends ServiceImpl implements ShopOrderStatisticService { + @Resource + private OrderInfoService orderInfoService; + + @Override public void statistic() { + // 获取前一天 + DateTime yesterday = DateUtil.yesterday(); + // 获取前一天的开始时间(00:00:00) + DateTime startOfDay = DateUtil.beginOfDay(yesterday); + // 获取前一天的结束时间(23:59:59) + DateTime endOfDay = DateUtil.endOfDay(yesterday); + List orderInfos = orderInfoService.list(new QueryWrapper() + .ge(OrderInfo::getCreateTime, startOfDay) + .le(OrderInfo::getCreateTime, endOfDay) + .ne(OrderInfo::getStatus, "unpaid").ne(OrderInfo::getStatus, "cancelled")); + + HashMap countInfo = new HashMap<>(); + for (OrderInfo item : orderInfos) { + ShopOrderStatistic statisticTask = countInfo.get(item.getShopId()); + if (statisticTask == null) { + countInfo.put(item.getShopId(), statisticTask = new ShopOrderStatistic()); + } + if ("refunding".equals(item.getStatus()) || "refund".equals(item.getStatus()) || "part-refund".equals(item.getStatus())) { + statisticTask.setRefundAmount(statisticTask.getRefundAmount().add(item.getRefundAmount())); + statisticTask.setRefundCount(statisticTask.getRefundCount() + 1); + if (item.getRefundAmount().compareTo(item.getPayAmount()) < 0) { + statisticTask.setSaleAmount(statisticTask.getSaleAmount().add(item.getPayAmount().subtract(item.getRefundAmount()))); + } + } else { + statisticTask.setSaleCount(statisticTask.getSaleCount() + 1); + statisticTask.setSaleAmount(statisticTask.getSaleAmount().add(item.getPayAmount())); + } + + switch (item.getPayType()) { + case "wechat-mini": + statisticTask.setWechatPayAmount(statisticTask.getWechatPayAmount().add(item.getPayAmount())); + statisticTask.setWechatPayCount(statisticTask.getWechatPayCount() + 1); + break; + case "main-scan", "back-scan": + statisticTask.setScanPayAmount(statisticTask.getScanPayAmount().add(item.getPayAmount())); + statisticTask.setScanPayCount(statisticTask.getScanPayCount() + 1); + break; + case "alipay-mini": + statisticTask.setAliPayAmount(statisticTask.getAliPayAmount().add(item.getPayAmount())); + statisticTask.setAliPayCount(statisticTask.getAliPayCount() + 1); + break; + case "vip-pay": + statisticTask.setMemberPayAmount(statisticTask.getMemberPayAmount().add(item.getPayAmount())); + statisticTask.setMemberPayCount(statisticTask.getMemberPayCount() + 1); + break; + case "credit-pay": + statisticTask.setCreditPayAmount(statisticTask.getCreditPayAmount().add(item.getPayAmount())); + statisticTask.setCreditPayCount(statisticTask.getCreditPayCount() + 1); + break; + case "cash-pay": + statisticTask.setCashPayAmount(statisticTask.getCashPayAmount().add(item.getPayAmount())); + statisticTask.setCashPayCount(statisticTask.getCashPayCount() + 1); + + } + + countInfo.forEach((shopId, info) -> { + ShopOrderStatistic statistic = getOne(new QueryWrapper().eq(ShopOrderStatistic::getShopId, shopId).eq(ShopOrderStatistic::getCreateDay, yesterday.toSqlDate())); + if (statistic == null) { + statistic = new ShopOrderStatistic(); + } + BeanUtil.copyProperties(info, statistic); + saveOrUpdate(statistic); + }); + } } }