From ab8930ea4c4eaef92c727f1be1e70ee5113eb674 Mon Sep 17 00:00:00 2001 From: Guoqs <123@jsowell.com> Date: Wed, 8 Apr 2026 14:30:11 +0800 Subject: [PATCH 01/14] update --- .../src/test/java/PaymentTestController.java | 203 +++++++++++++++++- .../jsowell/adapay/service/AdapayService.java | 70 +++++- 2 files changed, 270 insertions(+), 3 deletions(-) diff --git a/jsowell-admin/src/test/java/PaymentTestController.java b/jsowell-admin/src/test/java/PaymentTestController.java index 1ab1b3fa1..45eb56748 100644 --- a/jsowell-admin/src/test/java/PaymentTestController.java +++ b/jsowell-admin/src/test/java/PaymentTestController.java @@ -8,12 +8,18 @@ import com.huifu.adapay.core.exception.BaseAdaPayException; import com.huifu.adapay.model.Payment; import com.huifu.adapay.model.PaymentReverse; import com.huifu.adapay.model.Refund; +import com.jsowell.adapay.common.AdaPayment; import com.jsowell.JsowellApplication; import com.jsowell.adapay.common.DivMember; import com.jsowell.adapay.common.PaymentConfirmInfo; +import com.jsowell.adapay.common.RefundInfo; +import com.jsowell.adapay.config.AbstractAdapayConfig; import com.jsowell.adapay.dto.PaymentConfirmParam; +import com.jsowell.adapay.dto.QueryConfirmReverseDTO; import com.jsowell.adapay.dto.QueryPaymentConfirmDTO; +import com.jsowell.adapay.factory.AdapayConfigFactory; import com.jsowell.adapay.operation.PaymentReverseOperation; +import com.jsowell.adapay.response.ConfirmReverseResponse; import com.jsowell.adapay.response.PaymentConfirmResponse; import com.jsowell.adapay.response.PaymentReverseResponse; import com.jsowell.adapay.response.QueryPaymentConfirmDetailResponse; @@ -24,10 +30,12 @@ import com.jsowell.api.uniapp.customer.TempController; import com.jsowell.common.constant.CacheConstants; import com.jsowell.common.constant.Constants; import com.jsowell.common.core.redis.RedisCache; +import com.jsowell.common.enums.adapay.AdapayStatusEnum; import com.jsowell.common.enums.ykc.ScenarioEnum; import com.jsowell.common.util.AdapayUtil; import com.jsowell.common.util.DateUtils; import com.jsowell.common.util.PageUtils; +import com.jsowell.common.util.StringUtils; import com.jsowell.pile.domain.AdapayUnsplitRecord; import com.jsowell.pile.domain.OrderBasicInfo; import com.jsowell.pile.domain.OrderDetail; @@ -60,7 +68,7 @@ import java.util.concurrent.TimeUnit; /** * 专用处理汇付支付相关 */ -@ActiveProfiles("dev") +@ActiveProfiles("sit") @SpringBootTest(classes = JsowellApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @RunWith(SpringRunner.class) public class PaymentTestController { @@ -940,4 +948,197 @@ public class PaymentTestController { logger.info("{}", JSON.toJSONString(paymentConfirmInfo)); } + + @Test + public void queryPaymentAllInfoTest() throws BaseAdaPayException { + String paymentId = System.getProperty("paymentId"); + if (StringUtils.isBlank(paymentId)) { + throw new IllegalArgumentException("请通过 -DpaymentId=支付ID 传入 paymentId"); + } + JSONObject result = queryPaymentAllInfo(paymentId); + logger.info("paymentId:{}, result:{}", paymentId, JSON.toJSONString(result)); + } + + public JSONObject queryPaymentAllInfo(String paymentId) throws BaseAdaPayException { + if (StringUtils.isBlank(paymentId)) { + throw new IllegalArgumentException("paymentId不能为空"); + } + + PaymentQueryContext context = queryPaymentContext(paymentId); + if (context == null) { + throw new IllegalArgumentException("未匹配到支付单,paymentId:" + paymentId); + } + + QueryPaymentConfirmDTO queryPaymentConfirmDTO = new QueryPaymentConfirmDTO(); + queryPaymentConfirmDTO.setWechatAppId(context.getWechatAppId()); + queryPaymentConfirmDTO.setPaymentId(paymentId); + QueryPaymentConfirmDetailResponse confirmResponse = adapayService.queryPaymentConfirmList(queryPaymentConfirmDTO); + List paymentConfirms = confirmResponse == null || CollectionUtils.isEmpty(confirmResponse.getPaymentConfirms()) + ? Lists.newArrayList() + : paymentResponseToList(confirmResponse.getPaymentConfirms()); + + List paymentReverses = adapayService.queryPaymentReverse(paymentId, context.getWechatAppId()); + if (paymentReverses == null) { + paymentReverses = Lists.newArrayList(); + } + + List refunds = adapayService.queryPaymentRefund(paymentId, context.getWechatAppId()); + if (refunds == null) { + refunds = Lists.newArrayList(); + } + + AdaPayment payment = context.getPayment(); + BigDecimal payAmount = safeAmount(payment.getPay_amt()); + BigDecimal apiConfirmedAmount = safeAmount(payment.getConfirmed_amt()); + BigDecimal apiRefundedAmount = safeAmount(payment.getRefunded_amt()); + BigDecimal apiReservedAmount = safeAmount(payment.getReserved_amt()); + + BigDecimal successConfirmedAmount = sumConfirmedAmount(paymentConfirms, context.getWechatAppId()); + BigDecimal successRefundAmount = sumRefundAmount(refunds); + BigDecimal successReverseAmount = sumReverseAmount(paymentReverses); + + BigDecimal alreadySplitAmount = apiConfirmedAmount.compareTo(BigDecimal.ZERO) > 0 + ? apiConfirmedAmount + : successConfirmedAmount; + BigDecimal alreadyRefundAmount; + if (StringUtils.equals("delay", payment.getPay_mode())) { + alreadyRefundAmount = successReverseAmount.compareTo(BigDecimal.ZERO) > 0 + ? successReverseAmount + : apiReservedAmount; + } else { + alreadyRefundAmount = successRefundAmount.compareTo(BigDecimal.ZERO) > 0 + ? successRefundAmount + : apiRefundedAmount; + } + BigDecimal unsplitAmount = payAmount.subtract(alreadySplitAmount).subtract(alreadyRefundAmount); + if (unsplitAmount.compareTo(BigDecimal.ZERO) < 0) { + unsplitAmount = BigDecimal.ZERO; + } + + JSONObject summary = new JSONObject(); + summary.put("payMode", payment.getPay_mode()); + summary.put("payAmount", AdapayUtil.formatAmount(payAmount)); + summary.put("apiConfirmedAmount", AdapayUtil.formatAmount(apiConfirmedAmount)); + summary.put("apiRefundedAmount", AdapayUtil.formatAmount(apiRefundedAmount)); + summary.put("apiReservedAmount", AdapayUtil.formatAmount(apiReservedAmount)); + summary.put("successConfirmedAmount", AdapayUtil.formatAmount(successConfirmedAmount)); + summary.put("successRefundAmount", AdapayUtil.formatAmount(successRefundAmount)); + summary.put("successReverseAmount", AdapayUtil.formatAmount(successReverseAmount)); + summary.put("alreadySplitAmount", AdapayUtil.formatAmount(alreadySplitAmount)); + summary.put("alreadyRefundAmount", AdapayUtil.formatAmount(alreadyRefundAmount)); + summary.put("unsplitAmount", AdapayUtil.formatAmount(unsplitAmount)); + + JSONObject result = new JSONObject(); + result.put("paymentId", paymentId); + result.put("wechatAppId", context.getWechatAppId()); + result.put("adapayAppId", context.getAdapayAppId()); + result.put("payment", payment); + result.put("paymentRaw", JSON.parseObject(JSON.toJSONString(payment))); + result.put("paymentConfirms", paymentConfirms); + result.put("paymentReverses", paymentReverses); + result.put("refunds", refunds); + result.put("summary", summary); + return result; + } + + private PaymentQueryContext queryPaymentContext(String paymentId) throws BaseAdaPayException { + List configList = AdapayConfigFactory.getAllConfig(); + if (CollectionUtils.isEmpty(configList)) { + throw new IllegalStateException("未加载到汇付商户配置"); + } + + for (AbstractAdapayConfig config : configList) { + AdaPayment payment = adapayService.queryPaymentDetailWithFallback(paymentId, config.getWechatAppId()); + if (payment != null) { + return new PaymentQueryContext(config.getWechatAppId(), config.getAdapayAppId(), payment); + } + } + return null; + } + + private BigDecimal sumConfirmedAmount(List paymentConfirms, String wechatAppId) throws BaseAdaPayException { + BigDecimal totalAmount = BigDecimal.ZERO; + if (CollectionUtils.isEmpty(paymentConfirms)) { + return totalAmount; + } + for (PaymentConfirmInfo paymentConfirm : paymentConfirms) { + if (isConfirmReversed(paymentConfirm, wechatAppId)) { + continue; + } + totalAmount = totalAmount.add(safeAmount(paymentConfirm.getConfirmedAmt())); + } + return totalAmount; + } + + private boolean isConfirmReversed(PaymentConfirmInfo paymentConfirm, String wechatAppId) throws BaseAdaPayException { + QueryConfirmReverseDTO queryConfirmReverseDTO = QueryConfirmReverseDTO.builder() + .wechatAppId(wechatAppId) + .paymentConfirmId(paymentConfirm.getId()) + .build(); + ConfirmReverseResponse confirmReverseResponse = adapayService.queryConfirmReverse(queryConfirmReverseDTO); + return confirmReverseResponse != null && confirmReverseResponse.isSuccess(); + } + + private BigDecimal sumRefundAmount(List refunds) { + BigDecimal totalAmount = BigDecimal.ZERO; + if (CollectionUtils.isEmpty(refunds)) { + return totalAmount; + } + for (RefundInfo refund : refunds) { + if (!StringUtils.equals("S", refund.getTrans_status())) { + continue; + } + totalAmount = totalAmount.add(safeAmount(refund.getRefund_amt())); + } + return totalAmount; + } + + private BigDecimal sumReverseAmount(List paymentReverses) { + BigDecimal totalAmount = BigDecimal.ZERO; + if (CollectionUtils.isEmpty(paymentReverses)) { + return totalAmount; + } + for (PaymentReverseResponse paymentReverseResponse : paymentReverses) { + if (!StringUtils.equals(AdapayStatusEnum.SUCCEEDED.getValue(), paymentReverseResponse.getStatus())) { + continue; + } + totalAmount = totalAmount.add(safeAmount(paymentReverseResponse.getReverse_amt())); + } + return totalAmount; + } + + private BigDecimal safeAmount(String amount) { + if (StringUtils.isBlank(amount)) { + return BigDecimal.ZERO; + } + return new BigDecimal(amount); + } + + private List paymentResponseToList(List paymentConfirms) { + return Lists.newArrayList(paymentConfirms); + } + + private static class PaymentQueryContext { + private final String wechatAppId; + private final String adapayAppId; + private final AdaPayment payment; + + private PaymentQueryContext(String wechatAppId, String adapayAppId, AdaPayment payment) { + this.wechatAppId = wechatAppId; + this.adapayAppId = adapayAppId; + this.payment = payment; + } + + private String getWechatAppId() { + return wechatAppId; + } + + private String getAdapayAppId() { + return adapayAppId; + } + + private AdaPayment getPayment() { + return payment; + } + } } diff --git a/jsowell-pile/src/main/java/com/jsowell/adapay/service/AdapayService.java b/jsowell-pile/src/main/java/com/jsowell/adapay/service/AdapayService.java index 295b56d1c..5ff62e405 100644 --- a/jsowell-pile/src/main/java/com/jsowell/adapay/service/AdapayService.java +++ b/jsowell-pile/src/main/java/com/jsowell/adapay/service/AdapayService.java @@ -1345,7 +1345,74 @@ public class AdapayService { } /** - * 查询支付退款对象 + * 按汇付文档查询支付对象详情 + * Payment.query(paymentId, merchantKey) + */ + public AdaPayment queryPaymentDetail(String paymentId, String wechatAppId) throws BaseAdaPayException { + AbstractAdapayConfig config = AdapayConfigFactory.getConfig(wechatAppId); + if (config == null) { + throw new BusinessException(ReturnCodeEnum.CODE_ADAPAY_CONFIG_IS_NULL_ERROR); + } + Map response = Payment.query(paymentId, config.getWechatAppId()); + if (response == null || response.isEmpty()) { + return null; + } + String resultPaymentId = (String) response.get("id"); + String errorCode = (String) response.get("error_code"); + if (!StringUtils.equals(paymentId, resultPaymentId) || StringUtils.isNotBlank(errorCode)) { + return null; + } + return JSON.parseObject(JSON.toJSONString(response), AdaPayment.class); + } + + /** + * 按汇付文档通过 payment_id 查询支付对象列表 + * 作为 Payment.query 的补充,用于查询 3 天前的交易 + */ + public List queryPaymentListByPaymentId(String paymentId, String wechatAppId) throws BaseAdaPayException { + List resultList = Lists.newArrayList(); + AbstractAdapayConfig config = AdapayConfigFactory.getConfig(wechatAppId); + if (config == null) { + throw new BusinessException(ReturnCodeEnum.CODE_ADAPAY_CONFIG_IS_NULL_ERROR); + } + Map queryListParam = Maps.newHashMap(); + queryListParam.put("app_id", config.getAdapayAppId()); + queryListParam.put("payment_id", paymentId); + queryListParam.put("page_index", 1); + queryListParam.put("page_size", 1); + Map paymentListResult = Payment.queryList(queryListParam, config.getWechatAppId()); + if (paymentListResult == null || paymentListResult.isEmpty()) { + return resultList; + } + + JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(paymentListResult)); + List payments = jsonObject.getList("payments", AdaPayment.class, JSONReader.Feature.FieldBased); + if (CollectionUtils.isNotEmpty(payments)) { + resultList.addAll(payments); + } + return resultList; + } + + /** + * 查询支付对象详情 + * 先查 Payment.query,未命中时再按 payment_id 查询列表 + */ + public AdaPayment queryPaymentDetailWithFallback(String paymentId, String wechatAppId) throws BaseAdaPayException { + AdaPayment payment = queryPaymentDetail(paymentId, wechatAppId); + if (payment != null) { + return payment; + } + + List payments = queryPaymentListByPaymentId(paymentId, wechatAppId); + if (CollectionUtils.isEmpty(payments)) { + return null; + } + return payments.get(0); + } + + /** + * 按汇付文档通过 payment_id 查询退款对象 + * Refund.query({payment_id}, merchantKey) */ public List queryPaymentRefund(String paymentId, String wechatAppId) throws BaseAdaPayException { AbstractAdapayConfig config = AdapayConfigFactory.getConfig(wechatAppId); @@ -1354,7 +1421,6 @@ public class AdapayService { } Map refundParams = Maps.newHashMap(); refundParams.put("payment_id", paymentId); - refundParams.put("app_id", config.getAdapayAppId()); Map response = Refund.query(refundParams, config.getWechatAppId()); PaymentRefundResponse paymentRefundResponse = JSON.parseObject(JSON.toJSONString(response), PaymentRefundResponse.class); List refunds = paymentRefundResponse.getRefunds(); From 392b68b305adbe0068ca820e1e1d834473bab743 Mon Sep 17 00:00:00 2001 From: Lemon Date: Tue, 14 Apr 2026 15:48:31 +0800 Subject: [PATCH 02/14] =?UTF-8?q?update=20=20sit=E7=8E=AF=E5=A2=83?= =?UTF-8?q?=E6=9B=B4=E6=94=B9redis=E5=AF=86=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jsowell-admin/src/main/resources/application-sit.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jsowell-admin/src/main/resources/application-sit.yml b/jsowell-admin/src/main/resources/application-sit.yml index d1889bc1a..05046b21d 100644 --- a/jsowell-admin/src/main/resources/application-sit.yml +++ b/jsowell-admin/src/main/resources/application-sit.yml @@ -48,7 +48,7 @@ spring: # 数据库索引 database: 0 # 密码 - password: 123456 + password: js160829 # 连接超时时间 timeout: 10s lettuce: From 4a6d569f43f3f43da36fc82045bf22aead3b48d3 Mon Sep 17 00:00:00 2001 From: Guoqs <123@jsowell.com> Date: Wed, 15 Apr 2026 10:07:29 +0800 Subject: [PATCH 03/14] =?UTF-8?q?update=20dev=20nacos=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jsowell-admin/src/main/resources/application-dev.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jsowell-admin/src/main/resources/application-dev.yml b/jsowell-admin/src/main/resources/application-dev.yml index 5de23e895..8e9f06ea0 100644 --- a/jsowell-admin/src/main/resources/application-dev.yml +++ b/jsowell-admin/src/main/resources/application-dev.yml @@ -273,9 +273,9 @@ dubbo: registry: address: nacos://106.14.94.149:8848 parameters: - namespace: 200784c9-7e8f-4b2b-a44f-1eb52e675491 + namespace: e328faaf-8516-42d0-817a-7406232b3581 username: nacos - password: 3rtJPEb0KaUs5NAm + password: 79HMu!6nlOiLm^Q[ protocol: name: dubbo port: -1 From 2b804428110e6d2f99ce5c9bd51d7f7e4306f8ae Mon Sep 17 00:00:00 2001 From: Guoqs <123@jsowell.com> Date: Mon, 20 Apr 2026 13:50:36 +0800 Subject: [PATCH 04/14] =?UTF-8?q?update=20=E6=9F=A5=E8=AF=A2=E8=AE=A2?= =?UTF-8?q?=E5=8D=95sql?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/uniapp/customer/TempController.java | 5 +---- .../com/jsowell/pile/dto/QueryOrderDTO.java | 2 ++ .../service/impl/OrderBasicInfoServiceImpl.java | 3 ++- .../com/jsowell/pile/util/MerchantUtils.java | 17 +++++++++++++++++ .../mapper/pile/OrderBasicInfoMapper.xml | 6 ++++++ 5 files changed, 28 insertions(+), 5 deletions(-) diff --git a/jsowell-admin/src/main/java/com/jsowell/api/uniapp/customer/TempController.java b/jsowell-admin/src/main/java/com/jsowell/api/uniapp/customer/TempController.java index 2d8f1d8eb..e44e865bc 100644 --- a/jsowell-admin/src/main/java/com/jsowell/api/uniapp/customer/TempController.java +++ b/jsowell-admin/src/main/java/com/jsowell/api/uniapp/customer/TempController.java @@ -41,11 +41,8 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.math.BigDecimal; -import java.text.ParseException; import java.time.LocalDateTime; -import java.time.LocalTime; import java.time.format.DateTimeFormatter; -import java.util.Date; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -1114,7 +1111,7 @@ public class TempController extends BaseController { // 将startTime、endTime转换成localDateTime LocalDateTime localStartTime = LocalDateTime.parse(date + "T00:00:00", DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss"));; LocalDateTime localEndTime = LocalDateTime.parse(date + "T23:59:59", DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss"));; - int i = orderBasicInfoService.updateOrderReviewFlagTemp(localStartTime, localEndTime, null); + int i = orderBasicInfoService.updateOrderReviewFlagTemp(localStartTime, localEndTime, dto.getStationId()); } response = new RestApiResponse<>(); } catch (Exception e) { diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/dto/QueryOrderDTO.java b/jsowell-pile/src/main/java/com/jsowell/pile/dto/QueryOrderDTO.java index b7be18277..d0aab7425 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/dto/QueryOrderDTO.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/dto/QueryOrderDTO.java @@ -83,6 +83,8 @@ public class QueryOrderDTO extends BaseEntity { */ private String payMode; + private List payModeList; + /** * 订单编号列表 */ diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java index de3100f7a..bad974f29 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java @@ -1066,7 +1066,8 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService { QueryOrderDTO dto = QueryOrderDTO.builder() .startTime(DateUtils.formatDateTime(start)) .endTime(DateUtils.formatDateTime(end)) - .payMode(OrderPayModeEnum.PAYMENT_OF_WECHATPAY.getValue()) + // .payMode(OrderPayModeEnum.PAYMENT_OF_WECHATPAY.getValue()) + .payModeList(Lists.newArrayList(OrderPayModeEnum.PAYMENT_OF_WECHATPAY.getValue(), OrderPayModeEnum.PAYMENT_OF_ALIPAY.getValue())) .stationId(stationId) .orderStatus(OrderStatusEnum.ORDER_COMPLETE.getValue()) .build(); diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/util/MerchantUtils.java b/jsowell-pile/src/main/java/com/jsowell/pile/util/MerchantUtils.java index 505a8a7ab..c909339f1 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/util/MerchantUtils.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/util/MerchantUtils.java @@ -1,10 +1,12 @@ package com.jsowell.pile.util; import com.jsowell.common.util.StringUtils; +import com.jsowell.pile.vo.web.OrderListVO; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; /** * 运营商工具类 @@ -73,4 +75,19 @@ public class MerchantUtils { return new ArrayList<>(shuffled.subList(0, keepCount)); } + public static List getRandomNinetyPercentV2(List list) { + if (list == null || list.isEmpty()) { + return new ArrayList<>(); + } + int total = list.size(); + int removeCount = (int) Math.ceil(total * 0.1); + int keepCount = Math.max(1, total - removeCount); + List shuffled = new ArrayList<>(list); + Collections.shuffle(shuffled); + List orderListVOS = new ArrayList<>(shuffled.subList(0, keepCount)); + // 提取orderCode + List codeList = orderListVOS.stream().map(OrderListVO::getOrderCode).collect(Collectors.toList()); + return codeList; + } + } diff --git a/jsowell-pile/src/main/resources/mapper/pile/OrderBasicInfoMapper.xml b/jsowell-pile/src/main/resources/mapper/pile/OrderBasicInfoMapper.xml index 6b170f205..f71f30b27 100644 --- a/jsowell-pile/src/main/resources/mapper/pile/OrderBasicInfoMapper.xml +++ b/jsowell-pile/src/main/resources/mapper/pile/OrderBasicInfoMapper.xml @@ -2014,6 +2014,12 @@ and t1.pay_mode = #{payMode,jdbcType=VARCHAR} + + and t1.pay_mode in + + #{payMode} + + order by t1.create_time desc From 50210ab5c09e370e9240a8c405a08672ef30b137 Mon Sep 17 00:00:00 2001 From: Guoqs <123@jsowell.com> Date: Mon, 20 Apr 2026 14:49:25 +0800 Subject: [PATCH 05/14] =?UTF-8?q?=E6=89=93=E5=8D=B0=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/jsowell/api/uniapp/customer/TempController.java | 2 ++ .../jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java | 1 + 2 files changed, 3 insertions(+) diff --git a/jsowell-admin/src/main/java/com/jsowell/api/uniapp/customer/TempController.java b/jsowell-admin/src/main/java/com/jsowell/api/uniapp/customer/TempController.java index e44e865bc..18f6b8e97 100644 --- a/jsowell-admin/src/main/java/com/jsowell/api/uniapp/customer/TempController.java +++ b/jsowell-admin/src/main/java/com/jsowell/api/uniapp/customer/TempController.java @@ -1101,6 +1101,7 @@ public class TempController extends BaseController { @PostMapping("/batchUpdateOrderReviewByDatePoor") public RestApiResponse batchUpdateOrderReviewByDatePoor(@RequestBody UpdateOrderReviewDTO dto) { + logger.info("批量更新订单评价, param:{}", JSON.toJSONString(dto)); RestApiResponse response = null; try { // 根据传来的开始日期、结束日期按天划分为批次,对每个批次进行批量更新 @@ -1112,6 +1113,7 @@ public class TempController extends BaseController { LocalDateTime localStartTime = LocalDateTime.parse(date + "T00:00:00", DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss"));; LocalDateTime localEndTime = LocalDateTime.parse(date + "T23:59:59", DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss"));; int i = orderBasicInfoService.updateOrderReviewFlagTemp(localStartTime, localEndTime, dto.getStationId()); + logger.info("批量更新订单评价, 批次:{}, 影响行数:{}", date, i); } response = new RestApiResponse<>(); } catch (Exception e) { diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java index bad974f29..aeee8b14c 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java @@ -6331,6 +6331,7 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService { public int updateOrderReviewFlagTemp(LocalDateTime start, LocalDateTime end, String stationId) { if (StringUtils.isBlank(stationId)) { stationId = "1003"; // 目前只有 大坡中学举视超充站 这一个站点使用 + logger.info("校验或更新订单分账信息-使用默认站点id:{}", stationId); } List orderList = this.selectOrderListByDateTime(start, end, stationId); if (CollectionUtils.isEmpty(orderList)) { From 0eb026365efba8bb9eb92fac65fd3d3e0cb5b00f Mon Sep 17 00:00:00 2001 From: Guoqs <123@jsowell.com> Date: Mon, 20 Apr 2026 16:14:50 +0800 Subject: [PATCH 06/14] update --- .../pile/service/impl/OrderBasicInfoServiceImpl.java | 3 ++- .../src/main/java/com/jsowell/pile/util/MerchantUtils.java | 6 ++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java index aeee8b14c..24d86ed61 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java @@ -6339,7 +6339,8 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService { } List orderCodeList = orderList.stream().map(OrderListVO::getOrderCode).collect(Collectors.toList()); UpdateOrderReviewDTO dto = new UpdateOrderReviewDTO(); - dto.setOrderCodeList(MerchantUtils.getRandomNinetyPercent(orderCodeList)); + // dto.setOrderCodeList(MerchantUtils.getRandomNinetyPercent(orderCodeList)); + dto.setOrderCodeList(MerchantUtils.getRandomOrderCodes(orderList)); dto.setStationId(stationId); return batchUpdateOrderReview(dto); } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/util/MerchantUtils.java b/jsowell-pile/src/main/java/com/jsowell/pile/util/MerchantUtils.java index c909339f1..741214aaa 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/util/MerchantUtils.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/util/MerchantUtils.java @@ -75,12 +75,14 @@ public class MerchantUtils { return new ArrayList<>(shuffled.subList(0, keepCount)); } - public static List getRandomNinetyPercentV2(List list) { + public static List getRandomOrderCodes(List list) { if (list == null || list.isEmpty()) { return new ArrayList<>(); } + // 检查订单信息中的昵称,剔除不是以会员开头的订单 + // list = list.stream().filter(order -> order.getNickName().startsWith("会员")).collect(Collectors.toList()); int total = list.size(); - int removeCount = (int) Math.ceil(total * 0.1); + int removeCount = (int) Math.ceil(total * 0.65); int keepCount = Math.max(1, total - removeCount); List shuffled = new ArrayList<>(list); Collections.shuffle(shuffled); From 0eac2ab06a2d5d0eb2dd3aa0bc7a9b08f8b2a1ea Mon Sep 17 00:00:00 2001 From: Lemon Date: Tue, 21 Apr 2026 09:22:06 +0800 Subject: [PATCH 07/14] =?UTF-8?q?bugfix=20=E4=BD=99=E9=A2=9D=E6=94=AF?= =?UTF-8?q?=E4=BB=98=E9=80=80=E6=AC=BE=E6=97=B6=E7=A9=BA=E6=8C=87=E9=92=88?= =?UTF-8?q?=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pile/service/programlogic/DelayMerchantProgramLogic.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/DelayMerchantProgramLogic.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/DelayMerchantProgramLogic.java index 2abdd860e..4f058958f 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/DelayMerchantProgramLogic.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/DelayMerchantProgramLogic.java @@ -1084,9 +1084,11 @@ public class DelayMerchantProgramLogic extends AbstractProgramLogic { // 需要退回本金的金额 BigDecimal returnPrincipal = returnAmountMap.get("returnPrincipal"); + returnPrincipal = returnPrincipal == null ? BigDecimal.ZERO : returnPrincipal; // 需要退回赠送金的金额 BigDecimal returnGift = returnAmountMap.get("returnGift"); + returnGift = returnGift == null ? BigDecimal.ZERO : returnGift; // 更新会员钱包/余额退回到钱包 UpdateMemberBalanceDTO updateMemberBalanceDTO = UpdateMemberBalanceDTO.builder() From b2ec3fb29cffb44738d1e93f604bbdce2082f291 Mon Sep 17 00:00:00 2001 From: Lemon Date: Tue, 21 Apr 2026 09:33:22 +0800 Subject: [PATCH 08/14] =?UTF-8?q?bugfix=20=E4=BD=99=E9=A2=9D=E6=94=AF?= =?UTF-8?q?=E4=BB=98=E9=80=80=E6=AC=BE=E6=97=B6=E7=A9=BA=E6=8C=87=E9=92=88?= =?UTF-8?q?=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../programlogic/DelayMerchantProgramLogic.java | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/DelayMerchantProgramLogic.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/DelayMerchantProgramLogic.java index 4f058958f..e835a7243 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/DelayMerchantProgramLogic.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/DelayMerchantProgramLogic.java @@ -1103,17 +1103,22 @@ public class DelayMerchantProgramLogic extends AbstractProgramLogic { // 判断消费金额,如果消费金额 - 折扣金额小于 1 元,则将保险费也进行退回 if (orderBasicInfo.getOrderAmount().subtract(orderBasicInfo.getDiscountAmount()).compareTo(BigDecimal.ONE) < 0) { - // orderBasicInfoService.refundInsurance(orderBasicInfo); // 判断是否需要退保险费用 boolean checkResult = orderBasicInfoService.checkRefundInsuranceAmount(orderBasicInfo); if (checkResult) { - // 退保险, 计算退保金额 + // 退保险, 使用 calculateBalanceRefund 重新计算完整的退款金额(电费退款+保险费退款) + // 注意:不能在 calculateReturnAmount 的基础上叠加保险费,因为 calculateReturnAmount 不感知保险费, + // 算出的退款金额中已包含保险费部分,叠加会导致保险费被重复退还 Map refundMap = calculateBalanceRefund(principalPay, giftPay, orderBasicInfo.getOrderAmount(), orderBasicInfo.getDiscountAmount(), orderBasicInfo.getInsuranceAmount()); + BigDecimal refundPrincipal = refundMap.get("returnPrincipal"); + BigDecimal refundGift = refundMap.get("returnGift"); BigDecimal returnPrincipalForInsurance = refundMap.get("returnPrincipalForInsurance"); BigDecimal returnGiftForInsurance = refundMap.get("returnGiftForInsurance"); + refundPrincipal = refundPrincipal == null ? BigDecimal.ZERO : refundPrincipal; + refundGift = refundGift == null ? BigDecimal.ZERO : refundGift; - updateMemberBalanceDTO.setUpdatePrincipalBalance(returnPrincipal.add(returnPrincipalForInsurance)); - updateMemberBalanceDTO.setUpdateGiftBalance(returnGift.add(returnGiftForInsurance)); + updateMemberBalanceDTO.setUpdatePrincipalBalance(refundPrincipal.add(returnPrincipalForInsurance)); + updateMemberBalanceDTO.setUpdateGiftBalance(refundGift.add(returnGiftForInsurance)); } } // 统一退款 From f87f2f517681f6201bc392393c43dd66afaf718c Mon Sep 17 00:00:00 2001 From: Lemon Date: Tue, 21 Apr 2026 10:36:55 +0800 Subject: [PATCH 09/14] =?UTF-8?q?bugfix=20=E4=BD=99=E9=A2=9D=E6=94=AF?= =?UTF-8?q?=E4=BB=98=E9=80=80=E6=AC=BE=E6=97=B6=E7=A9=BA=E6=8C=87=E9=92=88?= =?UTF-8?q?=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jsowell/pile/mapper/MemberWalletInfoMapper.java | 2 ++ .../service/impl/MemberWalletInfoServiceImpl.java | 10 +++++++++- .../resources/mapper/pile/MemberWalletInfoMapper.xml | 11 +++++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/mapper/MemberWalletInfoMapper.java b/jsowell-pile/src/main/java/com/jsowell/pile/mapper/MemberWalletInfoMapper.java index 34faa8443..386913244 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/mapper/MemberWalletInfoMapper.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/mapper/MemberWalletInfoMapper.java @@ -38,6 +38,8 @@ public interface MemberWalletInfoMapper { */ MemberWalletInfo selectByMemberId(@Param("memberId") String memberId, @Param("merchantId") String merchantId); + List selectByMemberIdList(@Param("memberId") String memberId, @Param("merchantId") String merchantId); + List selectByMemberWalletList(@Param("memberId") String memberId); MemberWalletInfo selectByWalletCode(@Param("walletCode") String walletCode); diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/MemberWalletInfoServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/MemberWalletInfoServiceImpl.java index 37201480f..4be888a50 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/MemberWalletInfoServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/MemberWalletInfoServiceImpl.java @@ -46,7 +46,15 @@ public class MemberWalletInfoServiceImpl implements MemberWalletInfoService { @Override public MemberWalletInfo selectByMemberId(String memberId, String merchantId) { - return memberWalletInfoMapper.selectByMemberId(memberId, merchantId); + List list = memberWalletInfoMapper.selectByMemberIdList(memberId, merchantId); + if (CollectionUtils.isEmpty(list)) { + return null; + } + // 优先返回 merchantId 不为空的记录,避免脏数据干扰 + return list.stream() + .filter(w -> w.getMerchantId() != null) + .findFirst() + .orElse(list.get(0)); } @Override diff --git a/jsowell-pile/src/main/resources/mapper/pile/MemberWalletInfoMapper.xml b/jsowell-pile/src/main/resources/mapper/pile/MemberWalletInfoMapper.xml index 352b6a218..8f5cc314b 100644 --- a/jsowell-pile/src/main/resources/mapper/pile/MemberWalletInfoMapper.xml +++ b/jsowell-pile/src/main/resources/mapper/pile/MemberWalletInfoMapper.xml @@ -528,6 +528,17 @@ + +