|
|
@@ -16,8 +16,10 @@ import lombok.extern.slf4j.Slf4j;
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
import org.springframework.stereotype.Component;
|
|
|
import shop.alien.entity.store.AlipayZftCreateRecord;
|
|
|
+import shop.alien.entity.store.LawyerUser;
|
|
|
import shop.alien.entity.store.StoreInfo;
|
|
|
import shop.alien.mapper.AlipayZftCreateRecordMapper;
|
|
|
+import shop.alien.mapper.LawyerUserMapper;
|
|
|
import shop.alien.store.service.StoreInfoService;
|
|
|
|
|
|
import java.util.List;
|
|
|
@@ -27,10 +29,17 @@ import java.util.List;
|
|
|
@RequiredArgsConstructor
|
|
|
public class AlipayJob {
|
|
|
|
|
|
+ /** 进件主体:商户 */
|
|
|
+ private static final String PAYMENT_SUBJECT_MERCHANT = "0";
|
|
|
+ /** 进件主体:律师 */
|
|
|
+ private static final String PAYMENT_SUBJECT_LAWYER = "1";
|
|
|
+
|
|
|
private final AlipayZftCreateRecordMapper alipayZftCreateRecordMapper;
|
|
|
|
|
|
private final StoreInfoService storeInfoService;
|
|
|
|
|
|
+ private final LawyerUserMapper lawyerUserMapper;
|
|
|
+
|
|
|
/**
|
|
|
* 查询支付宝二级商户进件结果,并从响应中回写门店 smid。
|
|
|
*/
|
|
|
@@ -66,38 +75,84 @@ public class AlipayJob {
|
|
|
}
|
|
|
|
|
|
String body = response.getBody();
|
|
|
- String smid = extractSmidFromZftOrderQueryBody(body);
|
|
|
+ JSONObject firstOrder = firstOrderInZftOrderQueryBody(body);
|
|
|
+ String smid = firstOrder == null ? null : firstOrder.getString("smid");
|
|
|
if (StringUtils.isBlank(smid)) {
|
|
|
log.debug("order.query 未解析到 smid orderId={}", orderId);
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
- Integer storeId = record.getStoreId();
|
|
|
- if (storeId == null) {
|
|
|
- log.debug("进件记录无 storeId,跳过回写 orderId={}", orderId);
|
|
|
- continue;
|
|
|
+ String paymentSubject = record.getType() == null ? PAYMENT_SUBJECT_MERCHANT : record.getType();
|
|
|
+ if (PAYMENT_SUBJECT_LAWYER.equals(paymentSubject)) {
|
|
|
+ applySmidToLawyer(record, smid, firstOrder);
|
|
|
+ } else {
|
|
|
+ Integer storeId = record.getStoreId();
|
|
|
+ if (storeId == null) {
|
|
|
+ log.debug("进件记录无 storeId,跳过回写 orderId={}", orderId);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ StoreInfo storeInfo = storeInfoService.getById(storeId);
|
|
|
+ if (storeInfo == null) {
|
|
|
+ log.warn("门店不存在 storeId={} orderId={}", storeId, orderId);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (smid.equals(storeInfo.getAlipaySmid())) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ storeInfo.setAlipaySmid(smid);
|
|
|
+ storeInfoService.updateById(storeInfo);
|
|
|
+ log.info("已回写门店 alipay_smid storeId={} orderId={}", storeId, orderId);
|
|
|
}
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- StoreInfo storeInfo = storeInfoService.getById(storeId);
|
|
|
- if (storeInfo == null) {
|
|
|
- log.warn("门店不存在 storeId={} orderId={}", storeId, orderId);
|
|
|
+ /**
|
|
|
+ * 律师进件:law_firm 与进件 merchant_name 一致,且 zfb_secondary_merchant_account 为空时写入 smid。
|
|
|
+ * 若响应中带 order_id,则与进件记录 order_id 校验一致后再回写。
|
|
|
+ */
|
|
|
+ private void applySmidToLawyer(AlipayZftCreateRecord record, String smid, JSONObject firstOrder) {
|
|
|
+ String orderId = record.getOrderId();
|
|
|
+ String respOrderId = firstOrder != null ? firstOrder.getString("order_id") : null;
|
|
|
+ if (StringUtils.isNotBlank(respOrderId) && StringUtils.isNotBlank(orderId)
|
|
|
+ && !orderId.trim().equals(respOrderId.trim())) {
|
|
|
+ log.warn("order.query 返回 order_id 与进件记录不一致 recordOrderId={} respOrderId={}", orderId, respOrderId);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ String merchantName = record.getMerchantName();
|
|
|
+ if (StringUtils.isBlank(merchantName)) {
|
|
|
+ log.debug("律师进件记录无 merchant_name,跳过回写 orderId={}", orderId);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ LambdaQueryWrapper<LawyerUser> w = new LambdaQueryWrapper<>();
|
|
|
+ w.eq(LawyerUser::getLawFirm, merchantName.trim());
|
|
|
+ List<LawyerUser> lawyers = lawyerUserMapper.selectList(w);
|
|
|
+ if (lawyers == null || lawyers.isEmpty()) {
|
|
|
+ log.warn("未找到 law_firm 与 merchant_name 匹配的律师用户 merchantName={} orderId={}", merchantName, orderId);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (LawyerUser lawyer : lawyers) {
|
|
|
+ if (lawyer == null) {
|
|
|
continue;
|
|
|
}
|
|
|
-
|
|
|
- if (smid.equals(storeInfo.getAlipaySmid())) {
|
|
|
+ if (StringUtils.isNotBlank(lawyer.getZfbSecondaryMerchantAccount())) {
|
|
|
continue;
|
|
|
}
|
|
|
-
|
|
|
- storeInfo.setAlipaySmid(smid);
|
|
|
- storeInfoService.updateById(storeInfo);
|
|
|
- log.info("已回写门店 alipay_smid storeId={} orderId={}", storeId, orderId);
|
|
|
+ lawyer.setZfbSecondaryMerchantAccount(smid);
|
|
|
+ lawyerUserMapper.updateById(lawyer);
|
|
|
+ log.info("已回写律师 zfb_secondary_merchant_account lawyerUserId={} orderId={}", lawyer.getId(), orderId);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 从 ant.merchant.expand.indirect.zftorder.query 响应 body 中取 orders 首条的 smid。
|
|
|
+ * 从 ant.merchant.expand.indirect.zftorder.query 响应 body 中取 orders 首条对象。
|
|
|
*/
|
|
|
- private static String extractSmidFromZftOrderQueryBody(String body) {
|
|
|
+ private static JSONObject firstOrderInZftOrderQueryBody(String body) {
|
|
|
if (StringUtils.isBlank(body)) {
|
|
|
return null;
|
|
|
}
|
|
|
@@ -111,8 +166,7 @@ public class AlipayJob {
|
|
|
if (orders == null || orders.isEmpty()) {
|
|
|
return null;
|
|
|
}
|
|
|
- JSONObject first = orders.getJSONObject(0);
|
|
|
- return first == null ? null : first.getString("smid");
|
|
|
+ return orders.getJSONObject(0);
|
|
|
} catch (Exception e) {
|
|
|
log.warn("解析 zftorder.query 响应 body 失败: {}", e.getMessage());
|
|
|
return null;
|