Browse Source

对接拼团数据1

master
wangfukang 1 month ago
parent
commit
2abafa0f5b
  1. 16
      hiver-admin/test-output/test-report.html
  2. 19
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/AdminDataStatisticsController.java
  3. 3
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/ReturnCommissionController.java
  4. 7
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/MallRefundRecordMapper.java
  5. 2
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/ie/service/IeRealNameAuthRecordService.java
  6. 14
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/ie/service/impl/IeRealNameAuthRecordServiceImpl.java
  7. 30
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/ie/service/impl/IeRealNameAuthServiceImpl.java

16
hiver-admin/test-output/test-report.html

@ -35,7 +35,7 @@
<a href="#"><span class="badge badge-primary">Hiver</span></a> <a href="#"><span class="badge badge-primary">Hiver</span></a>
</li> </li>
<li class="m-r-10"> <li class="m-r-10">
<a href="#"><span class="badge badge-primary">八月 16, 2026 18:06:44</span></a> <a href="#"><span class="badge badge-primary">八月 17, 2026 12:43:15</span></a>
</li> </li>
</ul> </ul>
</div> </div>
@ -84,7 +84,7 @@
<div class="test-detail"> <div class="test-detail">
<span class="meta text-white badge badge-sm"></span> <span class="meta text-white badge badge-sm"></span>
<p class="name">passTest</p> <p class="name">passTest</p>
<p class="text-sm"><span>18:06:45 下午</span> / <span>0.022 secs</span></p> <p class="text-sm"><span>12:43:16 下午</span> / <span>0.026 secs</span></p>
</div> </div>
<div class="test-contents d-none"> <div class="test-contents d-none">
<div class="detail-head"> <div class="detail-head">
@ -92,9 +92,9 @@
<div class="info"> <div class="info">
<div class='float-right'><span class='badge badge-default'>#test-id=1</span></div> <div class='float-right'><span class='badge badge-default'>#test-id=1</span></div>
<h5 class="test-status text-pass">passTest</h5> <h5 class="test-status text-pass">passTest</h5>
<span class='badge badge-success'>08.16.2026 18:06:45</span> <span class='badge badge-success'>08.17.2026 12:43:16</span>
<span class='badge badge-danger'>08.16.2026 18:06:45</span> <span class='badge badge-danger'>08.17.2026 12:43:16</span>
<span class='badge badge-default'>0.022 secs</span> <span class='badge badge-default'>0.026 secs</span>
</div> </div>
<div class="m-t-10 m-l-5"></div> <div class="m-t-10 m-l-5"></div>
</div> </div>
@ -104,7 +104,7 @@
<tbody> <tbody>
<tr class="event-row"> <tr class="event-row">
<td><span class="badge log pass-bg">Pass</span></td> <td><span class="badge log pass-bg">Pass</span></td>
<td>18:06:45</td> <td>12:43:16</td>
<td> <td>
Test passed Test passed
</td> </td>
@ -128,13 +128,13 @@
<div class="col-md-3"> <div class="col-md-3">
<div class="card"><div class="card-body"> <div class="card"><div class="card-body">
<p class="m-b-0">Started</p> <p class="m-b-0">Started</p>
<h3>八月 16, 2026 18:06:44</h3> <h3>八月 17, 2026 12:43:15</h3>
</div></div> </div></div>
</div> </div>
<div class="col-md-3"> <div class="col-md-3">
<div class="card"><div class="card-body"> <div class="card"><div class="card-body">
<p class="m-b-0">Ended</p> <p class="m-b-0">Ended</p>
<h3>八月 16, 2026 18:06:45</h3> <h3>八月 17, 2026 12:43:16</h3>
</div></div> </div></div>
</div> </div>
<div class="col-md-3"> <div class="col-md-3">

19
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/AdminDataStatisticsController.java

@ -154,7 +154,7 @@ public class AdminDataStatisticsController {
.eq(StringUtils.isNotBlank(regionId), DealingsRecord::getRegionId, regionId) .eq(StringUtils.isNotBlank(regionId), DealingsRecord::getRegionId, regionId)
.ge(DealingsRecord::getDealingsTime, range.start) .ge(DealingsRecord::getDealingsTime, range.start)
.le(DealingsRecord::getDealingsTime, range.end) .le(DealingsRecord::getDealingsTime, range.end)
.in(DealingsRecord::getDealingsWay, REWARD_COLLEGE_RANK, REWARD_DELIVERY_RANK, REWARD_DRAW_POOL)); .in(DealingsRecord::getDealingsWay, REWARD_COLLEGE_RANK, REWARD_DRAW_POOL));
List<BillingUsageRecord> billingRecords = billingUsageRecordMapper.selectList(new LambdaQueryWrapper<BillingUsageRecord>() List<BillingUsageRecord> billingRecords = billingUsageRecordMapper.selectList(new LambdaQueryWrapper<BillingUsageRecord>()
.eq(StringUtils.isNotBlank(regionId), BillingUsageRecord::getRegionId, regionId) .eq(StringUtils.isNotBlank(regionId), BillingUsageRecord::getRegionId, regionId)
@ -316,6 +316,23 @@ public class AdminDataStatisticsController {
return new ResultUtil<Page<WorkerDailyBalanceRecord>>().setData(page); return new ResultUtil<Page<WorkerDailyBalanceRecord>>().setData(page);
} }
@PostMapping("/workerPositiveBalancePage")
@ApiOperation(value = "分页查询正余额配送员每日余额记录")
public Result<Page<WorkerDailyBalanceRecord>> workerPositiveBalancePage(@RequestBody WorkerDebtQuery query) {
DateRange range = resolveDateRange(query);
String regionId = query == null ? null : query.getRegionId();
Page<WorkerDailyBalanceRecord> page = workerDailyBalanceRecordService.page(
new Page<>(pageNumber(query), pageSize(query)),
new LambdaQueryWrapper<WorkerDailyBalanceRecord>()
.eq(StringUtils.isNotBlank(regionId), WorkerDailyBalanceRecord::getRegionId, regionId)
.ge(WorkerDailyBalanceRecord::getBalanceDate, range.startDate)
.le(WorkerDailyBalanceRecord::getBalanceDate, range.endDate)
.gt(WorkerDailyBalanceRecord::getDailyBalance, BigDecimal.ZERO)
.orderByAsc(WorkerDailyBalanceRecord::getBalanceDate)
.orderByAsc(WorkerDailyBalanceRecord::getWorkerName));
return new ResultUtil<Page<WorkerDailyBalanceRecord>>().setData(page);
}
private BigDecimal sumPositiveWorkerBalance(List<WorkerDailyBalanceRecord> records) { private BigDecimal sumPositiveWorkerBalance(List<WorkerDailyBalanceRecord> records) {
return records.stream() return records.stream()
.map(WorkerDailyBalanceRecord::getDailyBalance) .map(WorkerDailyBalanceRecord::getDailyBalance)

3
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/ReturnCommissionController.java

@ -384,6 +384,9 @@ public class ReturnCommissionController {
return ResultUtil.error("配送员不存在!"); return ResultUtil.error("配送员不存在!");
} }
returnCommission.setRemark("配送员" + worker.getWorkerName() + "提现"); returnCommission.setRemark("配送员" + worker.getWorkerName() + "提现");
if (worker.getDepoBal() != null && worker.getDepoBal().compareTo(BigDecimal.ZERO) < 0) {
return ResultUtil.error("今日佣金有欠款,不可提现");
}
if (worker.getDepoBalRel().compareTo(returnCommission.getCommission()) < 0) { if (worker.getDepoBalRel().compareTo(returnCommission.getCommission()) < 0) {
// 如果提现金额大于余额,则不允许提现 // 如果提现金额大于余额,则不允许提现
return ResultUtil.error("提现金额不可大于佣金余额!"); return ResultUtil.error("提现金额不可大于佣金余额!");

7
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/MallRefundRecordMapper.java

@ -20,12 +20,7 @@ public interface MallRefundRecordMapper extends BaseMapper<MallRefundRecord> {
IPage<MallRefundRecord> selectPageVO(IPage<?> page, @Param("q") MallRefundRecordPageQuery q); IPage<MallRefundRecord> selectPageVO(IPage<?> page, @Param("q") MallRefundRecordPageQuery q);
@Update("UPDATE t_worker " @Update("UPDATE t_worker "
+ "SET depo_bal_rel = CASE " + "SET depo_bal = COALESCE(depo_bal, 0) - #{amount} "
+ "WHEN COALESCE(depo_bal, 0) >= #{amount} THEN COALESCE(depo_bal_rel, 0) "
+ "ELSE COALESCE(depo_bal_rel, 0) - (#{amount} - COALESCE(depo_bal, 0)) END, "
+ "depo_bal = CASE "
+ "WHEN COALESCE(depo_bal, 0) >= #{amount} THEN COALESCE(depo_bal, 0) - #{amount} "
+ "ELSE 0 END "
+ "WHERE worker_id = #{workerId}") + "WHERE worker_id = #{workerId}")
int deductWorkerBalanceAtomic(@Param("workerId") String workerId, @Param("amount") BigDecimal amount); int deductWorkerBalanceAtomic(@Param("workerId") String workerId, @Param("amount") BigDecimal amount);

2
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/ie/service/IeRealNameAuthRecordService.java

@ -12,4 +12,6 @@ public interface IeRealNameAuthRecordService {
void recordResult(Long recordId, Integer authStatus, String providerRequestId, void recordResult(Long recordId, Integer authStatus, String providerRequestId,
String providerResultCode, String failReason); String providerResultCode, String failReason);
int countFailedByResultCode(Long userId, String providerResultCode);
} }

14
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/ie/service/impl/IeRealNameAuthRecordServiceImpl.java

@ -3,6 +3,7 @@ package cc.hiver.mall.ie.service.impl;
import cc.hiver.mall.ie.entity.IeRealNameAuthRecord; import cc.hiver.mall.ie.entity.IeRealNameAuthRecord;
import cc.hiver.mall.ie.mapper.IeRealNameAuthRecordMapper; import cc.hiver.mall.ie.mapper.IeRealNameAuthRecordMapper;
import cc.hiver.mall.ie.service.IeRealNameAuthRecordService; import cc.hiver.mall.ie.service.IeRealNameAuthRecordService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Propagation;
@ -50,6 +51,19 @@ public class IeRealNameAuthRecordServiceImpl implements IeRealNameAuthRecordServ
realNameAuthRecordMapper.updateById(record); realNameAuthRecordMapper.updateById(record);
} }
@Override
public int countFailedByResultCode(Long userId, String providerResultCode) {
if (userId == null || providerResultCode == null || providerResultCode.trim().isEmpty()) {
return 0;
}
Long count = realNameAuthRecordMapper.selectCount(new LambdaQueryWrapper<IeRealNameAuthRecord>()
.eq(IeRealNameAuthRecord::getUserId, userId)
.eq(IeRealNameAuthRecord::getProvider, PROVIDER_ALIYUN_THREE_ELEMENT)
.eq(IeRealNameAuthRecord::getAuthStatus, AUTH_STATUS_FAILED)
.eq(IeRealNameAuthRecord::getProviderResultCode, providerResultCode.trim()));
return count == null ? 0 : count.intValue();
}
private String truncate(String value, int maxLength) { private String truncate(String value, int maxLength) {
if (value == null || value.length() <= maxLength) { if (value == null || value.length() <= maxLength) {
return value; return value;

30
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/ie/service/impl/IeRealNameAuthServiceImpl.java

@ -61,6 +61,9 @@ public class IeRealNameAuthServiceImpl implements IeRealNameAuthService {
private static final DateTimeFormatter BIRTHDAY_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd"); private static final DateTimeFormatter BIRTHDAY_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
private static final int MAX_CERT_PICTURE_BASE64_BYTES = 50 * 1024; private static final int MAX_CERT_PICTURE_BASE64_BYTES = 50 * 1024;
private static final String REAL_NAME_AUDIT_ENABLED_KEY = "IE:REVIEW:REAL_NAME_AUDIT_ENABLED"; private static final String REAL_NAME_AUDIT_ENABLED_KEY = "IE:REVIEW:REAL_NAME_AUDIT_ENABLED";
private static final String ALIYUN_CONSISTENT_PASS = "1";
private static final String ALIYUN_CONSISTENT_PHOTO_MISMATCH = "0";
private static final String REPEATED_PHOTO_MISMATCH_AUTO_PASS_REASON = "连续两次照片识别为非同一人,系统默认通过实名认证";
private final OkHttpClient httpClient = new OkHttpClient(); private final OkHttpClient httpClient = new OkHttpClient();
private final SecureRandom secureRandom = new SecureRandom(); private final SecureRandom secureRandom = new SecureRandom();
@ -144,7 +147,21 @@ public class IeRealNameAuthServiceImpl implements IeRealNameAuthService {
// 阿里云返回 Data.IsConsistent = "1" 才代表姓名、身份证号、人像照片为同一人。 // 阿里云返回 Data.IsConsistent = "1" 才代表姓名、身份证号、人像照片为同一人。
verifyResult = callAliyunThreeElement(normalizedName, normalizedCertNo, normalizedPicture, normalizedRegionId, userId); verifyResult = callAliyunThreeElement(normalizedName, normalizedCertNo, normalizedPicture, normalizedRegionId, userId);
if (!"1".equals(verifyResult.getIsConsistent())) { if (!ALIYUN_CONSISTENT_PASS.equals(verifyResult.getIsConsistent())) {
if (shouldAutoPassRepeatedPhotoMismatch(userId, verifyResult)) {
profile = ensureProfile(userId);
Date now = new Date();
profile.setUpdateTime(now);
userProfileMapper.updateById(profile);
user = saveRealNameToUser(userId, User.REAL_NAME_AUTH_STATUS_VERIFIED, normalizedName, normalizedCertNo, birthday, age, now);
realNameAuthRecordService.recordResult(authRecordId,
IeRealNameAuthRecordService.AUTH_STATUS_VERIFIED,
verifyResult.getRequestId(), verifyResult.getIsConsistent(), REPEATED_PHOTO_MISMATCH_AUTO_PASS_REASON);
recordedResult = true;
IeRealNameAuthVO vo = buildAuthVO(user, profile);
vo.setMessage("实名认证已通过");
return vo;
}
throw new IeBusinessException(aliyunResultMessage(verifyResult.getIsConsistent())); throw new IeBusinessException(aliyunResultMessage(verifyResult.getIsConsistent()));
} }
@ -309,7 +326,7 @@ public class IeRealNameAuthServiceImpl implements IeRealNameAuthService {
AliyunThreeElementResult result = new AliyunThreeElementResult(); AliyunThreeElementResult result = new AliyunThreeElementResult();
result.setIsConsistent(data == null ? null : data.getStr("IsConsistent")); result.setIsConsistent(data == null ? null : data.getStr("IsConsistent"));
result.setRequestId(json.getStr("RequestId")); result.setRequestId(json.getStr("RequestId"));
recordRealNameBilling(regionId, userId, "1".equals(result.getIsConsistent()) ? "pass" : "failed", recordRealNameBilling(regionId, userId, ALIYUN_CONSISTENT_PASS.equals(result.getIsConsistent()) ? "pass" : "failed",
result.getRequestId(), "isConsistent=" + result.getIsConsistent()); result.getRequestId(), "isConsistent=" + result.getIsConsistent());
return result; return result;
} }
@ -393,8 +410,15 @@ public class IeRealNameAuthServiceImpl implements IeRealNameAuthService {
return value.trim(); return value.trim();
} }
private boolean shouldAutoPassRepeatedPhotoMismatch(Long userId, AliyunThreeElementResult verifyResult) {
if (verifyResult == null || !ALIYUN_CONSISTENT_PHOTO_MISMATCH.equals(verifyResult.getIsConsistent())) {
return false;
}
return realNameAuthRecordService.countFailedByResultCode(userId, ALIYUN_CONSISTENT_PHOTO_MISMATCH) >= 1;
}
private String aliyunResultMessage(String isConsistent) { private String aliyunResultMessage(String isConsistent) {
if ("0".equals(isConsistent)) { if (ALIYUN_CONSISTENT_PHOTO_MISMATCH.equals(isConsistent)) {
return "姓名与身份证号匹配,但照片识别为非同一人,请重新上传本人清晰照片"; return "姓名与身份证号匹配,但照片识别为非同一人,请重新上传本人清晰照片";
} }
if ("2".equals(isConsistent)) { if ("2".equals(isConsistent)) {

Loading…
Cancel
Save