Browse Source

对接拼团数据1

master
wangfukang 4 weeks ago
parent
commit
6668810646
  1. 14
      hiver-admin/test-output/test-report.html
  2. 13
      hiver-core/src/main/java/cc/hiver/core/common/constant/DealingsRecordConstant.java
  3. 4
      hiver-core/src/main/java/cc/hiver/core/dao/WorkerDao.java
  4. 4
      hiver-core/src/main/java/cc/hiver/core/entity/User.java
  5. 7
      hiver-core/src/main/java/cc/hiver/core/entity/Worker.java
  6. 2
      hiver-core/src/main/java/cc/hiver/core/service/WorkerService.java
  7. 5
      hiver-core/src/main/java/cc/hiver/core/serviceimpl/WorkerServiceImpl.java
  8. 2
      hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/manage/UserController.java
  9. 4
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/bill/service/impl/BillServiceImpl.java
  10. 13
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/bill/vo/CustomerBillQueryVo.java
  11. 73
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/MallCouponController.java
  12. 63
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/MallDeliveryOrderController.java
  13. 207
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/ReturnCommissionController.java
  14. 13
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/SaleController.java
  15. 13
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/SupplierControlller.java
  16. 47
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/WorkerController.java
  17. 2
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/DealingsRecordMapper.java
  18. 6
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/MallDeliveryOrderMapper.java
  19. 2
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/MallOrderGoodsMapper.java
  20. 77
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/debt/service/impl/DebtServiceImpl.java
  21. 37
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/DealingsRecord.java
  22. 4
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallOrder.java
  23. 6
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/ReturnCommission.java
  24. 26
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/AdminUserVo.java
  25. 26
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/MallOrderFreeVO.java
  26. 7
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/MallOrderVO.java
  27. 18
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/WorkerRewardVO.java
  28. 25
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/quartz/MerchantSettlementTask.java
  29. 108
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/quartz/WorkerRewardTask.java
  30. 2
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/DealingsRecordService.java
  31. 8
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/MallDeliveryOrderService.java
  32. 13
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/SalesAndDetailsServiceImpl.java
  33. 13
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/SupplierServiceImpl.java
  34. 13
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/CustomerServiceImpl.java
  35. 6
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/DealingsRecordServiceImpl.java
  36. 387
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallDeliveryOrderServiceImpl.java
  37. 2
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderGroupServiceImpl.java
  38. 104
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderServiceImpl.java
  39. 122
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallRefundRecordServiceImpl.java
  40. 17
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallSettlementRecordServiceImpl.java
  41. 26
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/PurchaseServiceImpl.java
  42. 29
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/SaleServiceImpl.java
  43. 90
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/FreeOrderCacheUtil.java
  44. 38
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/MallOrderFreeUtil.java
  45. 54
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/RedisLuaScripts.java
  46. 90
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/WorkerRewardCacheUtil.java
  47. 54
      hiver-modules/hiver-mall/src/main/resources/mapper/DealingsRecordMapper.xml
  48. 30
      hiver-modules/hiver-mall/src/main/resources/mapper/MallDeliveryOrderMapper.xml
  49. 9
      hiver-modules/hiver-mall/src/main/resources/mapper/MallOrderGoodsMapper.xml
  50. 7
      hiver-modules/hiver-mall/src/main/resources/mapper/MallOrderMapper.xml
  51. 41
      hiver-modules/hiver-mall/src/main/resources/mapper/ReturnCommissionMapper.xml
  52. 5
      pom.xml

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

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

13
hiver-core/src/main/java/cc/hiver/core/common/constant/DealingsRecordConstant.java

@ -8,13 +8,18 @@ package cc.hiver.core.common.constant;
*/
public interface DealingsRecordConstant {
/**
* 类型( 0-上游供货商1-下游客户)
* 类型类型0 用户 1 配送员 2商家
*/
Integer[] TYPE = {0, 1};
Integer[] TYPE = {0,1,2};
/**
* 交易类型0:开单1退货(应该是没用到)2回款3新增客户/供应商欠款4充值5追加欠款;6:撤销订单;7:入库8删除交易记录; 9:入库退货10撤销入库退货;99:撤销欠款记录
*
*/
Integer[] DEALINGS_TYPE = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,99};
String[] TYPE_REMARK = {"配送订单佣金","售后退款","配送排名奖励","商家提现","配送员提现","免单奖励","商家结算","用户提现"};
/**
*交易类型0:增加 1 提现 2消费 3售后
*/
Integer[] DEALINGS_TYPE = {0, 1, 2,3};
}

4
hiver-core/src/main/java/cc/hiver/core/dao/WorkerDao.java

@ -15,6 +15,10 @@ public interface WorkerDao extends HiverBaseDao<Worker, String> {
Worker findByUserId(String userId);
@Modifying
@Query("update Worker w set w.geolocation=?2 where w.workerId=?1")
void changeLocation(String workerId, String geolocation);
@Modifying
@Query("update Worker w set w.isOnLine=?2 where w.workerId=?1")
void changeOnLine(String id, Integer onLine);

4
hiver-core/src/main/java/cc/hiver/core/entity/User.java

@ -22,6 +22,7 @@ import javax.persistence.Table;
import javax.persistence.Transient;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
@ -140,4 +141,7 @@ public class User extends HiverBaseEntity {
@ApiModelProperty(value = "邀请人Id")
private String inviterId;
@ApiModelProperty("当前账户余额")
private BigDecimal depoBal = new BigDecimal(0);
}

7
hiver-core/src/main/java/cc/hiver/core/entity/Worker.java

@ -60,6 +60,13 @@ public class Worker implements Serializable {
@Column(name = "depo_bal")
private BigDecimal depoBal = new BigDecimal(0);
/**
* 当前可提现佣金余额
*/
@ApiModelProperty("当前可提现佣金余额")
@Column(name = "depo_bal_rel")
private BigDecimal depoBalRel = new BigDecimal(0);
/**
* 接单状态 1-可抢单 2-不可接单() 3-已禁用(手工预置状态)
*/

2
hiver-core/src/main/java/cc/hiver/core/service/WorkerService.java

@ -32,6 +32,8 @@ public interface WorkerService extends HiverBaseService<Worker, String> {
Worker findByWorkerId(String workerId);
void changeLocation(String workerId, String geolocation);
List<Worker> getWXByCondition(WorkerQueryVO worker);
/**

5
hiver-core/src/main/java/cc/hiver/core/serviceimpl/WorkerServiceImpl.java

@ -162,6 +162,11 @@ public class WorkerServiceImpl implements WorkerService {
return workerDao.findByWorkerId(orderId);
}
@Override
public void changeLocation(String workerId, String geolocation) {
workerDao.changeLocation(workerId, geolocation);
}
@Override
public List<Worker> getWXByCondition(WorkerQueryVO worker) {
final List<Worker> workerList = workerDao.findAll(new Specification<Worker>() {

2
hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/manage/UserController.java

@ -695,7 +695,7 @@ public class UserController {
resultMap.put("shop", shop);
}
Worker worker = workerService.findByUserId(wechatUser.getId());
if(worker!= null && worker.getGetPushOrder() == 1){
if(worker!= null && worker.getGetPushOrder() != null && worker.getGetPushOrder() == 1){
final List<WorkerRelaPrice> workerRelaPriceList = workerRelaPriceService.selectByWorkerId(worker.getWorkerId());
List<WorkerRelaPrice> workerRelaPriceListWaimai = new ArrayList<>();
List<WorkerRelaPrice> workerRelaPriceListKuaidi = new ArrayList<>();

4
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/bill/service/impl/BillServiceImpl.java

@ -78,9 +78,9 @@ public class BillServiceImpl implements BillService {
}
final CustomerBillDataVo customerBillDataVo = new CustomerBillDataVo();
customerBillDataVo.setUserId(customerBillQueryVo.getCustomerId());
customerBillDataVo.setUserId(customerBillQueryVo.getRegionId());
// 获取客户信息
final Customer customer = customerService.getById(customerBillQueryVo.getCustomerId());
final Customer customer = customerService.getById(customerBillQueryVo.getRegionId());
customerBillDataVo.setUserName(customer.getName());
customerBillDataVo.setQueryDate(DateUtil.COMMON_FULL.getDateText(new Date()));
// 获取本期全部欠款及拿货总金额

13
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/bill/vo/CustomerBillQueryVo.java

@ -12,15 +12,24 @@ import lombok.Data;
@Data
public class CustomerBillQueryVo extends HiverBasePageQuery {
@ApiModelProperty(value = "客户id")
private String customerId;
@ApiModelProperty(value = "店铺id")
private String regionId;
@ApiModelProperty(value = "店铺id")
private String shopId;
@ApiModelProperty(value = "店铺id")
private String customerId;
@ApiModelProperty(value = "关联id")
private String linkUserId;
@ApiModelProperty(value = "开始时间")
private String startDate;
@ApiModelProperty(value = "结束时间")
private String endDate;
@ApiModelProperty(value = "结束时间")
private String dealingsWay;
}

73
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/MallCouponController.java

@ -2,14 +2,22 @@ package cc.hiver.mall.controller;
import cc.hiver.core.common.utils.ResultUtil;
import cc.hiver.core.common.vo.Result;
import cc.hiver.mall.bill.vo.CustomerBillQueryVo;
import cc.hiver.mall.entity.DealingsRecord;
import cc.hiver.mall.entity.MallCoupon;
import cc.hiver.mall.entity.MallUserCoupon;
import cc.hiver.mall.mq.CouponMqConfig;
import cc.hiver.mall.pojo.query.MallCouponQuery;
import cc.hiver.mall.pojo.vo.MallOrderFreeVO;
import cc.hiver.mall.pojo.vo.WorkerRewardVO;
import cc.hiver.mall.service.mybatis.DealingsRecordService;
import cc.hiver.mall.service.mybatis.MallCouponService;
import cc.hiver.mall.service.mybatis.MallUserCouponService;
import cc.hiver.mall.utils.FreeOrderCacheUtil;
import cc.hiver.mall.utils.WorkerRewardCacheUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.Data;
@ -36,6 +44,15 @@ public class MallCouponController {
@Autowired
private RabbitTemplate rabbitTemplate;
@Autowired
private WorkerRewardCacheUtil workerRewardCacheUtil;
@Autowired
private DealingsRecordService dealingsRecordService;
@Autowired
private FreeOrderCacheUtil freeOrderCacheUtil;
@Data
public static class SendCouponReq {
private String userPhones;
@ -101,4 +118,60 @@ public class MallCouponController {
public Result<IPage<MallCoupon>> list(MallCouponQuery query) {
return new ResultUtil<IPage<MallCoupon>>().setData(mallUserCouponService.selectPageVO(query));
}
@PostMapping("/addFreeOrder")
@ApiOperation(value = "开启免单优惠")
public Result<Object> addFreeOrder(@RequestBody MallOrderFreeVO freeOrder) {
if(freeOrderCacheUtil.exists(freeOrder.getRegionId())){
freeOrderCacheUtil.removeAll(freeOrder.getRegionId());
}
freeOrderCacheUtil.put(freeOrder.getRegionId(), freeOrder);
return ResultUtil.success("开启免单优惠成功");
}
@GetMapping("/selectFreeOrder")
@ApiOperation(value = "查询免单优惠")
public Result<MallOrderFreeVO> selectFreeOrder(@RequestParam String regionId) {
return ResultUtil.data(freeOrderCacheUtil.get(regionId));
}
@PostMapping("/closeFreeOrder")
@ApiOperation(value = "关闭免单优惠")
public Result<Object> closeFreeOrder(@RequestBody MallOrderFreeVO freeOrder) {
if(freeOrderCacheUtil.exists(freeOrder.getRegionId())){
freeOrderCacheUtil.removeAll(freeOrder.getRegionId());
}
return ResultUtil.success("关闭免单优惠成功");
}
@PostMapping("/addWorkerReward")
@ApiOperation(value = "开启配送员奖励")
public Result<Object> addWorkerReward(@RequestBody WorkerRewardVO freeOrder) {
if(workerRewardCacheUtil.exists(freeOrder.getRegionId())){
workerRewardCacheUtil.removeAll(freeOrder.getRegionId());
}
workerRewardCacheUtil.put(freeOrder.getRegionId(), freeOrder);
return ResultUtil.success("开启配送员奖励成功");
}
@GetMapping("/selectWorkerReward")
@ApiOperation(value = "查询配送员奖励")
public Result<WorkerRewardVO> selectWorkerReward(@RequestParam String regionId) {
return ResultUtil.data(workerRewardCacheUtil.get(regionId));
}
@PostMapping("/closeWorkerReward")
@ApiOperation(value = "关闭配送员奖励")
public Result<Object> closeWorkerReward(@RequestBody WorkerRewardVO freeOrder) {
if(workerRewardCacheUtil.exists(freeOrder.getRegionId())){
workerRewardCacheUtil.removeAll(freeOrder.getRegionId());
}
return ResultUtil.success("关闭配送员奖励成功");
}
@PostMapping("/selectRewardByRegionId")
@ApiOperation(value = "奖励记录")
public Result<Page<DealingsRecord>> selectRewardByRegionId(@RequestBody CustomerBillQueryVo customerBillQueryVo) {
final Page<DealingsRecord> dealingRecordPage = dealingsRecordService.getDealingsRecordPageByRegionId(customerBillQueryVo);
return new ResultUtil<Page<DealingsRecord>>().setData(dealingRecordPage);
}
}

63
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/MallDeliveryOrderController.java

@ -12,12 +12,17 @@ import cc.hiver.mall.entity.MallDeliveryOrder;
import cc.hiver.mall.entity.MallOrder;
import cc.hiver.mall.pojo.query.MallDeliveryOrderPageQuery;
import cc.hiver.mall.pojo.vo.WorkerRedisVo;
import cc.hiver.mall.pojo.vo.WorkerRewardVO;
import cc.hiver.mall.quartz.WorkerRewardTask;
import cc.hiver.mall.service.mybatis.DealingsRecordService;
import cc.hiver.mall.service.mybatis.MallAdPositionService;
import cc.hiver.mall.service.mybatis.MallDeliveryOrderService;
import cc.hiver.mall.utils.WaitOrderCacheUtil;
import cc.hiver.mall.utils.WorkerOrderCacheUtil;
import cc.hiver.mall.utils.WorkerRedisCacheUtil;
import cc.hiver.mall.utils.WorkerRewardCacheUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@ -44,6 +49,9 @@ public class MallDeliveryOrderController {
@Autowired
private MallDeliveryOrderService mallDeliveryOrderService;
@Autowired
private DealingsRecordService dealingsRecordService;
@Autowired
private SecurityUtil securityUtil;
@ -53,6 +61,9 @@ public class MallDeliveryOrderController {
@Autowired
private MallAdPositionService mallAdPositionService;
@Autowired
private WorkerRewardCacheUtil workerRewardCacheUtil;
@Autowired
WorkerRedisCacheUtil workerRedisCacheUtil;
@ -144,6 +155,19 @@ public class MallDeliveryOrderController {
return new ResultUtil<List<Map<String, Object>>>().setData(mallDeliveryOrderService.countOrdersByStatus(workerId, regionId));
}
@PostMapping("/countOrderByStatusIndex")
@ApiOperation(value = "查询当前配送员主页数量")
public Result<List<Map<String, Object>>> countOrderByStatusIndex(@RequestParam(value = "workerId") String workerId,
@RequestParam(value = "regionId") String regionId) {
List<Map<String, Object>> result = mallDeliveryOrderService.countOrdersByStatus1(workerId, regionId);
//查询配送员今日数据
Map<String, Object> workerIndex = new HashMap<>();
workerIndex.put("workerIndex", mallDeliveryOrderService.countOrdersWorkerIndex(workerId));
workerIndex.put("status", 5);
result.add(workerIndex);
return new ResultUtil<List<Map<String, Object>>>().setData(result);
}
@PostMapping("/pagebyworker")
@ApiOperation(value = "分页查询配送员配送单")
public Result<Object> pageByWorker(@RequestBody MallDeliveryOrderPageQuery q) {
@ -171,17 +195,17 @@ public class MallDeliveryOrderController {
*/
@PostMapping("/accept")
@ApiOperation(value = "配送员接单", notes = "抢单大厅单或指派单均通过此接口接单")
public Result<Worker> accept(@RequestParam String deliveryId,@RequestParam String geolocation,
public Result<Worker> accept(@RequestParam String deliveryId,
@RequestParam String workerId,@RequestParam String workerPhone,@RequestParam String workerName,@RequestParam String regionId,@RequestParam String groupId) {
try {
Worker worker1 = workerService.findByWorkerId(workerId);
/*Worker worker1 = workerService.findByWorkerId(workerId);
worker1.setGeolocation(geolocation);
workerService.update(worker1);
WorkerRedisVo workerRedisVo = workerRedisCacheUtil.get(regionId, workerId);
if(workerRedisVo != null){
workerRedisVo.setWorker(worker1);
}
workerRedisCacheUtil.update(regionId, workerRedisVo);
workerRedisCacheUtil.update(regionId, workerRedisVo);*/
if(StrUtil.isBlank(workerId)){
//当前人没有注册兼职,先赋予兼职身份
final User user = securityUtil.getCurrUser();
@ -234,17 +258,17 @@ public class MallDeliveryOrderController {
*/
@PostMapping("/arriveShop")
@ApiOperation("配送员到店)")
public Result arriveShop(@RequestParam String deliveryId,@RequestParam String geolocation,
public Result arriveShop(@RequestParam String deliveryId,
@RequestParam String regionId,@RequestParam String workerId) {
try {
Worker worker1 = workerService.findByWorkerId(workerId);
/*Worker worker1 = workerService.findByWorkerId(workerId);
worker1.setGeolocation(geolocation);
workerService.update(worker1);
WorkerRedisVo workerRedisVo = workerRedisCacheUtil.get(regionId, workerId);
if(workerRedisVo != null){
workerRedisVo.setWorker(worker1);
}
workerRedisCacheUtil.update(regionId, workerRedisVo);
workerRedisCacheUtil.update(regionId, workerRedisVo);*/
mallDeliveryOrderService.arriveShop(deliveryId, workerId);
return ResultUtil.success("到店成功");
} catch (Exception e) {
@ -273,17 +297,17 @@ public class MallDeliveryOrderController {
*/
@PostMapping("/pickup")
@ApiOperation("配送员取货(待取货 -> 配送中)")
public Result pickup(@RequestParam String deliveryId,@RequestParam String geolocation,
public Result pickup(@RequestParam String deliveryId,
@RequestParam String regionId,@RequestParam String workerId) {
try {
Worker worker1 = workerService.findByWorkerId(workerId);
/*Worker worker1 = workerService.findByWorkerId(workerId);
worker1.setGeolocation(geolocation);
workerService.update(worker1);
WorkerRedisVo workerRedisVo = workerRedisCacheUtil.get(regionId, workerId);
if(workerRedisVo != null){
workerRedisVo.setWorker(worker1);
}
workerRedisCacheUtil.update(regionId, workerRedisVo);
workerRedisCacheUtil.update(regionId, workerRedisVo);*/
mallDeliveryOrderService.workerPickup(deliveryId, workerId);
return ResultUtil.success("取货成功");
} catch (Exception e) {
@ -297,17 +321,17 @@ public class MallDeliveryOrderController {
*/
@PostMapping("/complete")
@ApiOperation("配送员确认送达(配送中 -> 已送达)")
public Result complete(@RequestParam String deliveryId,@RequestParam String geolocation,
public Result complete(@RequestParam String deliveryId,
@RequestParam String regionId,@RequestParam String workerId) {
try {
Worker worker1 = workerService.findByWorkerId(workerId);
/*Worker worker1 = workerService.findByWorkerId(workerId);
worker1.setGeolocation(geolocation);
workerService.update(worker1);
WorkerRedisVo workerRedisVo = workerRedisCacheUtil.get(regionId, workerId);
if(workerRedisVo != null){
workerRedisVo.setWorker(worker1);
}
workerRedisCacheUtil.update(regionId, workerRedisVo);
workerRedisCacheUtil.update(regionId, workerRedisVo);*/
mallDeliveryOrderService.workerComplete(deliveryId, workerId);
return ResultUtil.success("送达成功");
} catch (Exception e) {
@ -383,4 +407,19 @@ public class MallDeliveryOrderController {
return ResultUtil.error(e.getMessage());
}
}
@RequestMapping(value = "/countOrdersLimit", method = RequestMethod.GET)
@ApiOperation(value = "查询配送员配送排名")
public Result<Map<String, Object>> countOrdersLimit(@RequestParam(value = "regionId")String regionId) {
Map<String, Object> result = new HashMap<>();
WorkerRewardVO vo = workerRewardCacheUtil.get(regionId);
if(vo != null){
String rules = vo.getRules();
List<WorkerRewardTask.RewardRule> rewardRules = JSON.parseArray(rules, WorkerRewardTask.RewardRule.class);
result.put("reward", rewardRules);
}
result.put("data", mallDeliveryOrderService.countOrdersLimit(regionId));
return new ResultUtil<Map<String, Object>>().setData(result);
}
}

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

@ -1,12 +1,19 @@
package cc.hiver.mall.controller;
import cc.hiver.core.common.constant.DealingsRecordConstant;
import cc.hiver.core.common.utils.ResultUtil;
import cc.hiver.core.common.utils.SecurityUtil;
import cc.hiver.core.common.utils.StringUtils;
import cc.hiver.core.common.vo.Result;
import cc.hiver.core.entity.User;
import cc.hiver.core.entity.Worker;
import cc.hiver.core.service.UserService;
import cc.hiver.core.serviceimpl.WorkerServiceImpl;
import cc.hiver.mall.entity.DealingsRecord;
import cc.hiver.mall.entity.ReturnCommission;
import cc.hiver.mall.entity.Shop;
import cc.hiver.mall.service.ShopService;
import cc.hiver.mall.service.mybatis.DealingsRecordService;
import cc.hiver.mall.service.mybatis.ReturnCommissionService;
import cc.hiver.mall.utils.AliPayNewUtil;
import com.alipay.api.AlipayApiException;
@ -21,6 +28,7 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
@Slf4j
@ -35,9 +43,18 @@ public class ReturnCommissionController {
@Autowired
private ShopService shopService;
@Autowired
private UserService userService;
@Autowired
private SecurityUtil securityUtil;
@Autowired
private WorkerServiceImpl workerServiceImpl;
@Autowired
private DealingsRecordService dealingsRecordService;
@RequestMapping(value = "/save", method = RequestMethod.POST)
@ApiOperation("新增店铺提现")
public Result save(ReturnCommission returnCommission) {
@ -116,8 +133,9 @@ public class ReturnCommissionController {
boolean result = false;
String aliResult = "";
final Shop shop = shopService.findById(returnCommission.getShopId());
returnCommission.setRemark("商家" + shop.getShopName() + "提现");
if (shop.getBalance().compareTo(returnCommission.getCommission()) < 0) {
// 如果提现金额大于返佣余额,则不允许提现
// 如果提现金额大于余额,则不允许提现
return ResultUtil.error("提现金额不可大于佣金余额!");
}
//支付宝户名(姓名)
@ -144,7 +162,194 @@ public class ReturnCommissionController {
//returnCommission.setShopAfterRebateAmount(shopAfterRebateAmount);
// 3. 更新店铺返佣金额
//shop.setRebateAmount(shopAfterRebateAmount);
shop.setBalance(shop.getBalance().subtract(commission));
shopService.update(shop);
//增加余额变动记录
DealingsRecord dealingsRecord = new DealingsRecord();
dealingsRecord.setDealingsWay(DealingsRecordConstant.TYPE_REMARK[3]);
dealingsRecord.setAmount(commission);
dealingsRecord.setLinkUserId(shop.getId());
dealingsRecord.setDealingsTime(new Date());
dealingsRecord.setLinkId(returnCommission.getId());
dealingsRecord.setLinkType(DealingsRecordConstant.TYPE[2]);
dealingsRecord.setDealingsType(DealingsRecordConstant.DEALINGS_TYPE[1]);
dealingsRecord.setCreateBy(shop.getId());
dealingsRecordService.save(dealingsRecord);
} else {
returnCommission.setStatus("2");
returnCommission.setFailMessage("支付宝转账失败");
returnCommission.setRemark(payResult.getSubMsg());
aliResult = "支付宝转账失败,请联系管理员!";
}
} catch (AlipayApiException e) {
returnCommission.setStatus("2");
returnCommission.setFailMessage("支付宝转账失败");
returnCommission.setRemark(e.getErrMsg());
aliResult = "支付宝转账失败,请联系管理员!";
}
//2.修改提现记录
result = returnCommissionService.save(returnCommission);
if (result) {
return ResultUtil.success("处理完成," + aliResult);
} else {
return ResultUtil.error("修改提现数据失败," + aliResult);
}
}
@Transactional
@RequestMapping(value = "/handleReturnUser", method = RequestMethod.POST)
@ApiOperation("用户提现处理")
public Result handleReturnUser(@RequestBody ReturnCommission returnCommission) {
//final String shopId = securityUtil.getShopId();
if(returnCommission.getCommission() == null ){
return ResultUtil.error("提现金额不能为空!");
}
if(returnCommission.getCommission().compareTo(BigDecimal.ZERO) == 0){
return ResultUtil.error("提现金额不能为0!");
}
if(StringUtils.isEmpty(returnCommission.getAliName())){
return ResultUtil.error("支付宝实名名称不能为空!");
}
if(StringUtils.isEmpty(returnCommission.getAliAccount())){
return ResultUtil.error("支付宝手机号不能为空!");
}
boolean result = false;
String aliResult = "";
final User user = userService.findById(returnCommission.getUserId());
returnCommission.setRemark("用户" + user.getUsername() + "提现");
if (user.getDepoBal().compareTo(returnCommission.getCommission()) < 0) {
// 如果提现金额大于余额,则不允许提现
return ResultUtil.error("提现金额不可大于佣金余额!");
}
//支付宝户名(姓名)
final String name = returnCommission.getAliName(); //shop.getAliName();
//支付宝账号(手机号)
final String phoneNumber = returnCommission.getAliAccount();// shop.getAliAccount();
// 提现金额
final BigDecimal commission = returnCommission.getCommission();
// 店铺当前返佣余额
//final BigDecimal shopBefRebateAmount = shop.getRebateAmount();
// 店铺当前返佣余额
/* final BigDecimal shopAfterRebateAmount = shopBefRebateAmount.subtract(commission);
if (shopBefRebateAmount.compareTo(commission) < 0) {
// 如果提现金额大于返佣余额,则不允许提现
return ResultUtil.error("提现金额不可大于佣金余额!");
}*/
try {
final AlipayFundTransUniTransferResponse payResult = AliPayNewUtil.pay(phoneNumber, name, String.valueOf(commission), returnCommission.getId());
if ("SUCCESS".equals(payResult.getStatus())) {
returnCommission.setStatus("1");
aliResult = "支付宝转账成功";
//.setShopBefRebateAmount(shopBefRebateAmount);
//returnCommission.setShopAfterRebateAmount(shopAfterRebateAmount);
// 3. 更新店铺返佣金额
//shop.setRebateAmount(shopAfterRebateAmount);
user.setDepoBal(user.getDepoBal().subtract(commission));
userService.update(user);
//增加余额变动记录
DealingsRecord dealingsRecord = new DealingsRecord();
dealingsRecord.setDealingsWay(DealingsRecordConstant.TYPE_REMARK[7]);
dealingsRecord.setAmount(commission);
dealingsRecord.setLinkUserId(user.getId());
dealingsRecord.setDealingsTime(new Date());
dealingsRecord.setLinkId(returnCommission.getId());
dealingsRecord.setLinkType(DealingsRecordConstant.TYPE[0]);
dealingsRecord.setDealingsType(DealingsRecordConstant.DEALINGS_TYPE[1]);
dealingsRecord.setCreateBy(user.getId());
dealingsRecordService.save(dealingsRecord);
} else {
returnCommission.setStatus("2");
returnCommission.setFailMessage("支付宝转账失败");
returnCommission.setRemark(payResult.getSubMsg());
aliResult = "支付宝转账失败,请联系管理员!";
}
} catch (AlipayApiException e) {
returnCommission.setStatus("2");
returnCommission.setFailMessage("支付宝转账失败");
returnCommission.setRemark(e.getErrMsg());
aliResult = "支付宝转账失败,请联系管理员!";
}
//2.修改提现记录
result = returnCommissionService.save(returnCommission);
if (result) {
return ResultUtil.success("处理完成," + aliResult);
} else {
return ResultUtil.error("修改提现数据失败," + aliResult);
}
}
@Transactional
@RequestMapping(value = "/handleReturnWorker", method = RequestMethod.POST)
@ApiOperation("配送员提现处理")
public Result handleReturnWorker(@RequestBody ReturnCommission returnCommission) {
//final String shopId = securityUtil.getShopId();
if(returnCommission.getCommission() == null ){
return ResultUtil.error("提现金额不能为空!");
}
if(returnCommission.getCommission().compareTo(BigDecimal.ZERO) == 0){
return ResultUtil.error("提现金额不能为0!");
}
if(StringUtils.isEmpty(returnCommission.getAliName())){
return ResultUtil.error("支付宝实名名称不能为空!");
}
if(StringUtils.isEmpty(returnCommission.getAliAccount())){
return ResultUtil.error("支付宝手机号不能为空!");
}
boolean result = false;
String aliResult = "";
Worker worker = workerServiceImpl.findByWorkerId(returnCommission.getWorkerId());
returnCommission.setRemark("配送员" + worker.getWorkerName() + "提现");
if (worker.getDepoBalRel().compareTo(returnCommission.getCommission()) < 0) {
// 如果提现金额大于余额,则不允许提现
return ResultUtil.error("提现金额不可大于佣金余额!");
}
//支付宝户名(姓名)
final String name = returnCommission.getAliName(); //shop.getAliName();
//支付宝账号(手机号)
final String phoneNumber = returnCommission.getAliAccount();// shop.getAliAccount();
// 提现金额
final BigDecimal commission = returnCommission.getCommission();
// 店铺当前返佣余额
//final BigDecimal shopBefRebateAmount = shop.getRebateAmount();
// 店铺当前返佣余额
/* final BigDecimal shopAfterRebateAmount = shopBefRebateAmount.subtract(commission);
if (shopBefRebateAmount.compareTo(commission) < 0) {
// 如果提现金额大于返佣余额,则不允许提现
return ResultUtil.error("提现金额不可大于佣金余额!");
}*/
try {
final AlipayFundTransUniTransferResponse payResult = AliPayNewUtil.pay(phoneNumber, name, String.valueOf(commission), returnCommission.getId());
if ("SUCCESS".equals(payResult.getStatus())) {
returnCommission.setStatus("1");
aliResult = "支付宝转账成功";
//.setShopBefRebateAmount(shopBefRebateAmount);
//returnCommission.setShopAfterRebateAmount(shopAfterRebateAmount);
// 3. 更新店铺返佣金额
//shop.setRebateAmount(shopAfterRebateAmount);
worker.setDepoBalRel(worker.getDepoBalRel().subtract(commission));
workerServiceImpl.update(worker);
//增加余额变动记录
DealingsRecord dealingsRecord = new DealingsRecord();
dealingsRecord.setDealingsWay(DealingsRecordConstant.TYPE_REMARK[4]);
dealingsRecord.setAmount(commission);
dealingsRecord.setLinkUserId(worker.getWorkerId());
dealingsRecord.setDealingsTime(new Date());
dealingsRecord.setLinkId(returnCommission.getId());
dealingsRecord.setLinkType(DealingsRecordConstant.TYPE[1]);
dealingsRecord.setDealingsType(DealingsRecordConstant.DEALINGS_TYPE[1]);
dealingsRecord.setCreateBy(worker.getWorkerId());
dealingsRecordService.save(dealingsRecord);
} else {
returnCommission.setStatus("2");
returnCommission.setFailMessage("支付宝转账失败");

13
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/SaleController.java

@ -176,19 +176,6 @@ public class SaleController {
dealingsRecord.setCreateBy(user.getId());
dealingsRecord.setCreateByName(user.getNickname());
dealingsRecord.setCreateTime(new Date());
dealingsRecord.setDealingsUserId(saleQueryDTO.getSale().getUserId());
dealingsRecord.setDealingsUserName(saleQueryDTO.getSale().getUserName());
dealingsRecord.setUserType(DealingsRecordConstant.TYPE[1]);
dealingsRecord.setDealingsWay("新增客户");
dealingsRecord.setShopId(shopId);
// 销售金额
dealingsRecord.setSaleAmount(BigDecimal.ZERO);
// 退货金额
dealingsRecord.setReturnAmount(BigDecimal.ZERO);
// 上次欠款
dealingsRecord.setLastDebtAmount(BigDecimal.ZERO);
// 最新欠款
dealingsRecord.setBalanceDue(BigDecimal.ZERO);
dealingsRecord.setAmount(BigDecimal.ZERO);
dealingsRecord.setDealingsType(DealingsRecordConstant.DEALINGS_TYPE[3]);
dealingsRecordService.save(dealingsRecord);

13
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/SupplierControlller.java

@ -110,19 +110,6 @@ public class SupplierControlller {
dealingsRecord.setCreateBy(user.getId());
dealingsRecord.setCreateByName(user.getNickname());
dealingsRecord.setCreateTime(new Date());
dealingsRecord.setDealingsUserId(supplier.getId());
dealingsRecord.setDealingsUserName(supplier.getConsigneeName());
dealingsRecord.setUserType(DealingsRecordConstant.TYPE[1]);
dealingsRecord.setDealingsWay("新增供应商欠款");
dealingsRecord.setShopId(shopId);
// 销售金额
dealingsRecord.setSaleAmount(BigDecimal.ZERO);
// 退货金额
dealingsRecord.setReturnAmount(BigDecimal.ZERO);
// 上次欠款
dealingsRecord.setLastDebtAmount(BigDecimal.ZERO);
// 最新欠款
dealingsRecord.setBalanceDue(noEarn);
dealingsRecord.setAmount(noEarn);
dealingsRecord.setDealingsType(DealingsRecordConstant.DEALINGS_TYPE[3]);
dealingsRecordService.save(dealingsRecord);

47
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/WorkerController.java

@ -8,19 +8,19 @@ import cc.hiver.core.common.utils.SecurityUtil;
import cc.hiver.core.common.vo.Result;
import cc.hiver.core.entity.User;
import cc.hiver.core.entity.Worker;
import cc.hiver.core.service.UserService;
import cc.hiver.core.service.WorkerService;
import cc.hiver.core.vo.WorkerAppVO;
import cc.hiver.core.vo.WorkerQueryVO;
import cc.hiver.mall.dao.mapper.WorkerRelaPriceMapper;
import cc.hiver.mall.entity.MallDeliveryOrder;
import cc.hiver.mall.entity.Recharge;
import cc.hiver.mall.entity.ShopArea;
import cc.hiver.mall.entity.WorkerRelaPrice;
import cc.hiver.mall.entity.*;
import cc.hiver.mall.pojo.vo.AdminUserVo;
import cc.hiver.mall.pojo.vo.WorkerAreaOnlineCountVO;
import cc.hiver.mall.pojo.vo.WorkerMatchVO;
import cc.hiver.mall.pojo.vo.WorkerRedisVo;
import cc.hiver.mall.service.RechargeService;
import cc.hiver.mall.service.ShopAreaService;
import cc.hiver.mall.service.ShopService;
import cc.hiver.mall.service.mybatis.WorkerRelaPriceService;
import cc.hiver.mall.utils.WaitOrderCacheUtil;
import cc.hiver.mall.utils.WorkerOrderCacheUtil;
@ -58,12 +58,18 @@ public class WorkerController {
@Autowired
private WorkerService workerService;
@Autowired
private UserService userService;
@Autowired
private RechargeService rechargeService;
@Autowired
WorkerRedisCacheUtil workerRedisCacheUtil;
@Autowired
private ShopService shopService;
@Autowired
private WorkerRelaPriceService workerRelaPriceService;
@ -165,6 +171,20 @@ public class WorkerController {
return ResultUtil.success("修改成功");
}
@RequestMapping(value = "/admin/editLocation", method = RequestMethod.POST)
@ApiOperation(value = "修改配送员信息", notes = "需要通过下单编号获取订单信息")
public Result editLocation(@RequestBody Worker u) {
workerService.changeLocation(u.getWorkerId(), u.getGeolocation());
Worker worker = workerService.findByWorkerId(u.getWorkerId());
WorkerRedisVo workerRedisVo = workerRedisCacheUtil.get(worker.getRegion(), worker.getWorkerId());
if(workerRedisVo != null){
workerRedisVo.setWorker(worker);
}
workerRedisCacheUtil.update(worker.getRegion(), workerRedisVo);
return ResultUtil.success("修改成功");
}
@RequestMapping(value = "/admin/editApp", method = RequestMethod.POST)
@ApiOperation(value = "修改配送员信息-APP", notes = "需要通过下单编号获取订单信息")
public Result editApp(WorkerAppVO u) {
@ -506,4 +526,23 @@ public class WorkerController {
List<WorkerAreaOnlineCountVO> list = workerRelaPriceMapper.getOnlineWorkerCountByCanteenArea(parentId);
return new ResultUtil<List<WorkerAreaOnlineCountVO>>().setData(list);
}
@RequestMapping(value = "/getByWorkerId", method = RequestMethod.GET)
@ApiOperation(value = "查询配送员信息")
public Result<Worker> getByWorkerId(@RequestParam(value = "workerId")String workerId) {
return new ResultUtil<Worker>().setData(workerService.findByWorkerId(workerId));
}
@RequestMapping(value = "/getAllDepo", method = RequestMethod.GET)
@ApiOperation(value = "查询个人信息以及账户余额")
public Result<AdminUserVo> getAllDepo(@RequestParam(value = "userId")String userId) {
User user = userService.findById(userId);
Worker worker = workerService.findByUserId(userId);
List<Shop> shops = shopService.getShopByUserid(userId);
AdminUserVo vo = new AdminUserVo();
vo.setWorker(worker);
vo.setShop(shops);
vo.setUser(user);
return new ResultUtil<AdminUserVo>().setData(vo);
}
}

2
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/DealingsRecordMapper.java

@ -50,6 +50,8 @@ public interface DealingsRecordMapper extends BaseMapper<DealingsRecord> {
*/
Page<CustomerBillSaleVo> getDealingsRecordPageByUserId(Page<CustomerBillSaleVo> page, @Param("customerBillQueryVo") CustomerBillQueryVo customerBillQueryVo);
Page<DealingsRecord> getDealingsRecordPageByRegionId(Page<DealingsRecord> page, @Param("customerBillQueryVo") CustomerBillQueryVo customerBillQueryVo);
/**
* 分页获取供应商交易记录
*

6
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/MallDeliveryOrderMapper.java

@ -1,5 +1,6 @@
package cc.hiver.mall.dao.mapper;
import cc.hiver.core.entity.Worker;
import cc.hiver.mall.entity.MallDeliveryOrder;
import cc.hiver.mall.pojo.query.MallDeliveryOrderPageQuery;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
@ -7,6 +8,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@ -33,10 +35,14 @@ public interface MallDeliveryOrderMapper extends BaseMapper<MallDeliveryOrder> {
List<Map<Integer, Integer>> countOrdersByType(@Param("regionId") String regionId);
List<Worker> countOrdersLimit(@Param("regionId") String regionId);
List<Map<String, Object>> countOrdersByStatus(@Param("workerId") String workerId);
MallDeliveryOrder selectByGroupId(@Param("orderId") String orderId);
List<MallDeliveryOrder> selectByOrderIds(@Param("ids") List<String> ids);
HashMap<String, Object> countOrdersWorkerIndex(@Param("workerId") String workerId);
}

2
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/MallOrderGoodsMapper.java

@ -23,6 +23,8 @@ public interface MallOrderGoodsMapper extends BaseMapper<MallOrderGoods> {
*/
List<MallOrderGoods> selectByOrderIds(@Param("orderIds") List<String> orderIds);
List<MallOrderGoods> selectPagesByOrderIds(@Param("orderIds") List<String> orderIds);
/**
* 按订单ID集合批量查询
*/

77
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/debt/service/impl/DebtServiceImpl.java

@ -138,18 +138,10 @@ public class DebtServiceImpl extends ServiceImpl<DebtMapper, Debt> implements De
dealingsRecord.setCreateBy(user.getId());
dealingsRecord.setCreateByName(user.getNickname());
dealingsRecord.setCreateTime(new Date());
dealingsRecord.setDealingsUserId(dealingsUserId);
dealingsRecord.setDealingsUserName(dealingsUserName);
dealingsRecord.setDealingsWay(dealingsWay);
dealingsRecord.setShopId(shopId);
// 上次欠款
dealingsRecord.setLastDebtAmount(lastDebtAmount);
// 最新欠款
dealingsRecord.setBalanceDue(newDebtAmount);
// 金额
dealingsRecord.setAmount(debt.getAmountOwed());
dealingsRecord.setDealingsType(DealingsRecordConstant.DEALINGS_TYPE[0]);
dealingsRecord.setUserType(DealingsRecordConstant.TYPE[1]);
dealingsRecordService.save(dealingsRecord);
return debt;
}
@ -207,29 +199,8 @@ public class DebtServiceImpl extends ServiceImpl<DebtMapper, Debt> implements De
dealingsRecord.setCreateBy(user.getId());
dealingsRecord.setCreateByName(user.getNickname());
dealingsRecord.setCreateTime(new Date());
dealingsRecord.setSaleId(saleQueryDTO.getSale().getId());
dealingsRecord.setDealingsUserId(saleQueryDTO.getSale().getUserId());
dealingsRecord.setDealingsUserName(saleQueryDTO.getSale().getUserName());
dealingsRecord.setUserType(DealingsRecordConstant.TYPE[1]);
dealingsRecord.setDealingsWay("开单");
dealingsRecord.setShopId(shopId);
// 销售金额
if (!saleQueryDTO.getSaleDetailList().isEmpty()) {
dealingsRecord.setSaleAmount(saleQueryDTO.getSale().getTotalAmount());
} else {
dealingsRecord.setSaleAmount(BigDecimal.ZERO);
}
// 退货金额
if (saleQueryDTO.getSaleReturnDTO() != null) {
dealingsRecord.setReturnAmount(saleQueryDTO.getSaleReturnDTO().getReturnSale().getTotalAmount());
} else {
dealingsRecord.setReturnAmount(BigDecimal.ZERO);
}
// 上次欠款
dealingsRecord.setLastDebtAmount(lastDebtAmount);
// 最新欠款
dealingsRecord.setBalanceDue(newDebtAmount);
dealingsRecord.setAmount(debt.getAmountOwed());
dealingsRecord.setDealingsType(DealingsRecordConstant.DEALINGS_TYPE[0]);
dealingsRecordService.save(dealingsRecord);
@ -268,16 +239,6 @@ public class DebtServiceImpl extends ServiceImpl<DebtMapper, Debt> implements De
dealingsRecord.setCreateBy(user.getId());
dealingsRecord.setCreateByName(user.getNickname());
dealingsRecord.setCreateTime(new Date());
dealingsRecord.setSaleId(purchase.getId());
dealingsRecord.setDealingsUserId(purchase.getSupplierId());
dealingsRecord.setDealingsUserName(purchase.getSupplierName());
dealingsRecord.setUserType(DealingsRecordConstant.TYPE[0]);
dealingsRecord.setDealingsWay("入库");
dealingsRecord.setShopId(shopId);
// 上次欠款
dealingsRecord.setLastDebtAmount(lastDebtAmount);
// 最新欠款
dealingsRecord.setBalanceDue(newDebtAmount);
// 本次欠款
dealingsRecord.setAmount(noPay);
dealingsRecord.setDealingsType(DealingsRecordConstant.DEALINGS_TYPE[7]);
@ -339,22 +300,12 @@ public class DebtServiceImpl extends ServiceImpl<DebtMapper, Debt> implements De
dealingsRecord.setCreateBy(user.getId());
dealingsRecord.setCreateByName(user.getNickname());
dealingsRecord.setCreateTime(new Date());
dealingsRecord.setDealingsUserId(oldDebt.getUserId());
dealingsRecord.setDealingsUserName(oldDebt.getUserName());
dealingsRecord.setDealingsWay(dealingsWay);
dealingsRecord.setShopId(shopId);
// 上次欠款
dealingsRecord.setLastDebtAmount(lastDebtAmount);
// 最新欠款
dealingsRecord.setBalanceDue(newDebtAmount);
// 金额
dealingsRecord.setAmount(debt.getAmountOwed());
// 充值
dealingsRecord.setDealingsType(dealingsType);
dealingsRecord.setDealingsTime(debt.getDealingsTime());
dealingsRecord.setRemark(debt.getRemark());
dealingsRecord.setUserType(DealingsRecordConstant.TYPE[1]);
dealingsRecordService.save(dealingsRecord);
return debt;
}
@ -407,20 +358,11 @@ public class DebtServiceImpl extends ServiceImpl<DebtMapper, Debt> implements De
dealingsRecord.setCreateBy(user.getId());
dealingsRecord.setCreateByName(user.getNickname());
dealingsRecord.setCreateTime(new Date());
dealingsRecord.setSaleId(putOutPurchase.getId());
dealingsRecord.setDealingsUserId(putOutPurchase.getSupplierId());
dealingsRecord.setDealingsUserName(putOutPurchase.getSupplierName());
dealingsRecord.setUserType(DealingsRecordConstant.TYPE[0]);
if (PurchaseReturnConstant.TYPE[0].equals(type)) {
dealingsRecord.setDealingsWay("入库退货");
} else {
dealingsRecord.setDealingsWay("撤销入库退货");
}
dealingsRecord.setShopId(shopId);
// 上次欠款
dealingsRecord.setLastDebtAmount(lastDebtAmount);
// 最新欠款
dealingsRecord.setBalanceDue(newDebtAmount);
// 本次欠款
dealingsRecord.setAmount(alreadyPay);
if (PurchaseReturnConstant.TYPE[0].equals(type)) {
@ -462,20 +404,12 @@ public class DebtServiceImpl extends ServiceImpl<DebtMapper, Debt> implements De
// 获取当前欠款
final String shopId = securityUtil.getShopId();
final User user = securityUtil.getCurrUser();
final Debt oldDebt = debtMapper.selectByUserId(shopId, oldDealingsRecord.getDealingsUserId());
// 回退金额
// 需要回退的金额
final BigDecimal needRevokeAmount = oldDealingsRecord.getAmount();
BigDecimal lastDebtAmount = BigDecimal.ZERO;
BigDecimal newDebtAmount = BigDecimal.ZERO;
lastDebtAmount = oldDebt.getAmountOwed() == null ? BigDecimal.ZERO : oldDebt.getAmountOwed();
// 计算欠款
if (oldDebt.getAmountOwed() != null) {
newDebtAmount = oldDebt.getAmountOwed().add(needRevokeAmount);
}
oldDebt.setAmountOwed(newDebtAmount);
debtMapper.updateById(oldDebt);
// 获取欠款记录
// 2. 新增欠款记录
// 创建人
@ -483,23 +417,12 @@ public class DebtServiceImpl extends ServiceImpl<DebtMapper, Debt> implements De
dealingsRecord.setCreateBy(user.getId());
dealingsRecord.setCreateByName(user.getNickname());
dealingsRecord.setCreateTime(new Date());
dealingsRecord.setDelFlag(CommonConstant.DEL_FLAG_FALSE);
dealingsRecord.setDealingsUserId(oldDebt.getUserId());
dealingsRecord.setDealingsUserName(oldDebt.getUserName());
dealingsRecord.setDealingsWay("撤销欠款记录");
dealingsRecord.setShopId(shopId);
// 上次欠款
dealingsRecord.setLastDebtAmount(lastDebtAmount);
// 最新欠款
dealingsRecord.setBalanceDue(newDebtAmount);
// 金额
dealingsRecord.setAmount(needRevokeAmount);
// 充值
dealingsRecord.setDealingsType(DealingsRecordConstant.DEALINGS_TYPE[11]);
dealingsRecord.setDealingsTime(new Date());
dealingsRecord.setRemark(remark);
dealingsRecord.setUserType(DealingsRecordConstant.TYPE[1]);
dealingsRecordService.save(dealingsRecord);
// 原来的交易记录变为已撤销
oldDealingsRecord.setDelFlag(CommonConstant.DEL_FLAG_TRUE);

37
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/DealingsRecord.java

@ -31,40 +31,25 @@ public class DealingsRecord extends HiverBaseEntity {
@ApiModelProperty(value = "创建人姓名")
private String createByName;
@ApiModelProperty(value = "入库单id/销售单id")
private String saleId;
@ApiModelProperty(value = "关联订单id")
private String linkId;
@ApiModelProperty(value = "交易对象id;上游供应商id/下游客户id")
private String dealingsUserId;
@ApiModelProperty(value = "关联方id")
private String linkUserId;
@ApiModelProperty(value = "交易对象名称")
private String dealingsUserName;
@ApiModelProperty(value = "关联方id")
private String regionId;
@ApiModelProperty(value = "类型( 0-上游供货商;1-下游客户)")
private Integer userType;
@ApiModelProperty(value = "本单欠款")
private BigDecimal amount;
@ApiModelProperty(value = "类型0 用户 1 配送员")
private Integer linkType;
@ApiModelProperty(value = "交易方式/附言")
private String dealingsWay;
@ApiModelProperty(value = "店铺id")
private String shopId;
@ApiModelProperty(value = "销售金额")
private BigDecimal saleAmount;
@ApiModelProperty(value = "退货金额")
private BigDecimal returnAmount;
@ApiModelProperty(value = "上次欠款")
private BigDecimal lastDebtAmount;
@ApiModelProperty(value = "剩余欠款-更新后欠款")
private BigDecimal balanceDue;
@ApiModelProperty(value = "金额")
private BigDecimal amount;
@ApiModelProperty(value = "交易类型:0:开单;1:退货;2:回款")
@ApiModelProperty(value = "交易类型:0:增加 1 提现 2消费")
private Integer dealingsType;
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")

4
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallOrder.java

@ -82,6 +82,10 @@ public class MallOrder implements Serializable {
private Integer userRequireMake;
@ApiModelProperty(value = "学校id")
private String regionId;
@ApiModelProperty("是否免单")
private Integer isFreeOrder;
@ApiModelProperty("免单金额")
private BigDecimal freeAmount;
@ApiModelProperty(value = "面对面配送 退款 参团用户订单id集合")
@Transient

6
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/ReturnCommission.java

@ -43,6 +43,12 @@ public class ReturnCommission implements Serializable {
@ApiModelProperty(value = "商铺")
private String shopId;
@ApiModelProperty(value = "配送员id")
private String workerId;
@ApiModelProperty(value = "用户id")
private String userId;
@ApiModelProperty(value = "提现金额")
private BigDecimal commission;

26
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/AdminUserVo.java

@ -0,0 +1,26 @@
package cc.hiver.mall.pojo.vo;
import cc.hiver.core.entity.User;
import cc.hiver.core.entity.Worker;
import cc.hiver.mall.entity.Shop;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.List;
/**
* @author Yazhi Li
*/
@Data
@Accessors(chain = true)
public class AdminUserVo {
@ApiModelProperty(value = "登录用户信息")
private User user;
@ApiModelProperty(value = "配送员信息")
private Worker worker;
@ApiModelProperty(value = "用户所属店铺")
private List<Shop> shop;
}

26
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/MallOrderFreeVO.java

@ -0,0 +1,26 @@
package cc.hiver.mall.pojo.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
/**
* 订单免单 响应 VO
*/
@ApiModel("订单免单VO")
@Data
@EqualsAndHashCode(callSuper = false)
public class MallOrderFreeVO{
@ApiModelProperty("人数")
private Long orderNumber;
@ApiModelProperty("免单金额")
private BigDecimal freeAmount;
@ApiModelProperty("区域Id")
private String regionId;
}

7
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/MallOrderVO.java

@ -6,6 +6,7 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
import java.util.List;
/**
@ -22,6 +23,12 @@ public class MallOrderVO extends MallOrder {
@ApiModelProperty("拼团信息(拼团订单时返回)")
private MallOrderGroup groupInfo;
@ApiModelProperty("是否免单")
private Integer isFreeOrder;
@ApiModelProperty("免单金额")
private BigDecimal freeAmount;
@ApiModelProperty("配送信息(外卖订单时返回)")
private MallDeliveryOrder deliveryInfo;

18
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/WorkerRewardVO.java

@ -0,0 +1,18 @@
package cc.hiver.mall.pojo.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ApiModel("配送员奖励")
@Data
@EqualsAndHashCode(callSuper = false)
public class WorkerRewardVO {
@ApiModelProperty("区域Id")
private String regionId;
@ApiModelProperty("奖励规则")
private String rules;
}

25
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/quartz/MerchantSettlementTask.java

@ -1,5 +1,7 @@
package cc.hiver.mall.quartz;
import cc.hiver.core.entity.Worker;
import cc.hiver.core.serviceimpl.WorkerServiceImpl;
import cc.hiver.mall.dao.mapper.MallReturnOrderGoodsMapper;
import cc.hiver.mall.entity.*;
import cc.hiver.mall.service.ShopService;
@ -31,6 +33,8 @@ public class MerchantSettlementTask {
@Autowired
private ShopTakeawayService shopTakeawayService;
@Autowired
private WorkerServiceImpl workerServiceImpl;
@Autowired
private ShopService shopService;
@Scheduled(cron = "0 0 2 * * ?")
@ -71,6 +75,25 @@ public class MerchantSettlementTask {
} catch (Exception e) {
log.error("[MerchantSettlementTask] Error processing settled refunds", e);
}
// 配送员余额
try {
List<Worker> workers = workerServiceImpl.getAll();
for (Worker worker : workers) {
try {
if(worker.getWorkerStatus() != null && worker.getWorkerStatus() != 3 && worker.getDepoBal().signum() > 0){
worker.setDepoBalRel(worker.getDepoBal().add(worker.getDepoBalRel()));
worker.setDepoBal(BigDecimal.ZERO);
workerServiceImpl.update(worker);
}
} catch (Exception e) {
log.error("[MerchantSettlementTask] Failed to process unsettled order {}", worker.getWorkerId(), e);
}
}
} catch (Exception e) {
log.error("[MerchantSettlementTask] Error processing unsettled orders", e);
}
log.info("[MerchantSettlementTask] Daily settlement calculation finished.");
}
@ -121,7 +144,7 @@ public class MerchantSettlementTask {
BigDecimal actualCommission = BigDecimal.ZERO;
if (baseAmount.compareTo(BigDecimal.ZERO) > 0) {
actualCommission = baseAmount.multiply(commissionRate);
actualCommission = baseAmount.multiply(commissionRate.divide(BigDecimal.TEN.multiply(BigDecimal.TEN)));
} else {
baseAmount = BigDecimal.ZERO;
}

108
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/quartz/WorkerRewardTask.java

@ -0,0 +1,108 @@
package cc.hiver.mall.quartz;
import cc.hiver.core.common.constant.DealingsRecordConstant;
import cc.hiver.core.entity.Worker;
import cc.hiver.core.service.WorkerService;
import cc.hiver.mall.dao.ShopAreaDao;
import cc.hiver.mall.entity.DealingsRecord;
import cc.hiver.mall.entity.ShopArea;
import cc.hiver.mall.pojo.vo.WorkerRewardVO;
import cc.hiver.mall.service.mybatis.DealingsRecordService;
import cc.hiver.mall.service.mybatis.MallDeliveryOrderService;
import cc.hiver.mall.utils.WorkerRewardCacheUtil;
import com.alibaba.fastjson.JSON;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
@Slf4j
@Component
public class WorkerRewardTask {
@Autowired
private WorkerRewardCacheUtil workerRewardCacheUtil;
@Autowired
public ShopAreaDao shopAreaDao;
@Autowired
private WorkerService workerService;
@Autowired
private DealingsRecordService dealingsRecordService;
@Autowired
private MallDeliveryOrderService mallDeliveryOrderService;
@Scheduled(cron = "0 0 22 * * ?")
public void executeSettlement() {
log.info("[WorkerRewardTask] Starting daily settlement calculation...配送员排名奖励");
// 配送员排名奖励
try {
List<ShopArea> areas = shopAreaDao.findByParentIdOrderBySortOrder("0");
for (ShopArea area : areas) {
// 该区域配置了配送员奖励
if (workerRewardCacheUtil.exists(area.getId())) {
WorkerRewardVO vo = workerRewardCacheUtil.get(area.getId());
String rules = vo.getRules(); // 假设是JSON字符串: [{'orderNum':1,'reward':5},{'orderNum':2,'reward':3}]
// 将JSON字符串解析为List对象 (这里以 Fastjson 为例,如果你用的是 Jackson 或 Gson 请替换对应方法)
List<RewardRule> rewardRules = JSON.parseArray(rules, RewardRule.class);
// 查询该区域配送员排名 (假设返回的List已经是按接单量降序排好序的)
List<Worker> countOrdersLimit = mallDeliveryOrderService.countOrdersLimit(area.getId());
if (countOrdersLimit != null && !countOrdersLimit.isEmpty()) {
// 遍历排名列表,给对应的配送员发放奖励
for (int i = 0; i < countOrdersLimit.size(); i++) {
Worker worker = countOrdersLimit.get(i);
int currentRank = i + 1; // 排名是从 1 开始的,而循环下标是从 0 开始的
// 在奖励规则中查找当前排名是否有对应的奖励
for (RewardRule rule : rewardRules) {
if (rule.getOrderNum() == currentRank) {
// 找到了对应的奖励规则,执行发放逻辑
BigDecimal rewardAmount = new BigDecimal(rule.getReward());
log.info("区域[{}] 配送员[{}] 获得第{}名,奖励金额: {}", area.getId(), worker.getWorkerId(), currentRank, rewardAmount);
// 生成奖励记录
Worker worker1 = workerService.findByWorkerId(worker.getWorkerId());
worker1.setDepoBal(worker1.getDepoBal().add(rewardAmount));
workerService.update(worker1);
//增加余额变动记录
DealingsRecord dealingsRecord = new DealingsRecord();
dealingsRecord.setDealingsWay(DealingsRecordConstant.TYPE_REMARK[2]);
dealingsRecord.setAmount(rewardAmount);
dealingsRecord.setRegionId(area.getId());
dealingsRecord.setLinkUserId(worker.getWorkerId());
dealingsRecord.setDealingsTime(new Date());
dealingsRecord.setLinkType(DealingsRecordConstant.TYPE[1]);
dealingsRecord.setDealingsType(DealingsRecordConstant.DEALINGS_TYPE[0]);
dealingsRecord.setCreateBy(worker.getWorkerId());
dealingsRecordService.save(dealingsRecord);
break; // 匹配到一个规则即可,跳出内层循环
}
}
}
}
}
}
} catch (Exception e) {
log.error("[MerchantSettlementTask] Error processing unsettled orders", e);
}
log.info("[MerchantSettlementTask] Daily settlement calculation finished.");
}
@Data
public static class RewardRule {
private Integer orderNum; // 排名名次
private Integer reward; // 奖励金额
}
}

2
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/DealingsRecordService.java

@ -45,6 +45,8 @@ public interface DealingsRecordService extends IService<DealingsRecord> {
*/
Page<CustomerBillSaleVo> getDealingsRecordPageByUserId(CustomerBillQueryVo customerBillQueryVo);
Page<DealingsRecord> getDealingsRecordPageByRegionId(CustomerBillQueryVo customerBillQueryVo);
/**
* 对账单分页获取
*

8
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/MallDeliveryOrderService.java

@ -1,5 +1,6 @@
package cc.hiver.mall.service.mybatis;
import cc.hiver.core.entity.Worker;
import cc.hiver.mall.entity.MallDeliveryOrder;
import cc.hiver.mall.entity.MallOrder;
import cc.hiver.mall.pojo.query.MallDeliveryOrderPageQuery;
@ -7,6 +8,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@ -61,10 +63,14 @@ public interface MallDeliveryOrderService extends IService<MallDeliveryOrder> {
*/
long countWaitGrabOrders(int deliveryType);
List<Worker> countOrdersLimit(String regionId);
List<Map<Integer, Integer>> countOrdersByType(String regionId);
List<Map<String, Object>> countOrdersByStatus(String workerId,String regionId);
List<Map<String, Object>> countOrdersByStatus1(String workerId,String regionId);
/**
* 用户增加配送费在现有 deliveryFee 基础上追加
* @param additionalFee 追加的配送费金额
@ -85,4 +91,6 @@ public interface MallDeliveryOrderService extends IService<MallDeliveryOrder> {
MallOrder insertDeliveryOrder(MallDeliveryOrder deliveryOrder);
List<MallDeliveryOrder> selectByOrderIds(List<String> ids);
HashMap<String, Object> countOrdersWorkerIndex(String workerId);
}

13
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/SalesAndDetailsServiceImpl.java

@ -522,19 +522,6 @@ public class SalesAndDetailsServiceImpl implements SalesAndDetailsService {
debtService.save(debt);
// 新增交易记录
dealingsRecord.setCreateTime(new Date());
dealingsRecord.setDealingsUserId(customer.getId());
dealingsRecord.setDealingsUserName(customer.getName());
dealingsRecord.setUserType(DealingsRecordConstant.TYPE[1]);
dealingsRecord.setDealingsWay("新增客户");
dealingsRecord.setShopId(saleQueryDTO.getSale().getShopId());
// 销售金额
dealingsRecord.setSaleAmount(BigDecimal.ZERO);
// 退货金额
dealingsRecord.setReturnAmount(BigDecimal.ZERO);
// 上次欠款
dealingsRecord.setLastDebtAmount(BigDecimal.ZERO);
// 最新欠款
dealingsRecord.setBalanceDue(amountOwed);
dealingsRecord.setAmount(amountOwed);
dealingsRecord.setDealingsType(DealingsRecordConstant.DEALINGS_TYPE[3]);
dealingsRecordService.save(dealingsRecord);

13
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/SupplierServiceImpl.java

@ -169,19 +169,6 @@ public class SupplierServiceImpl implements SupplierService {
dealingsRecord.setCreateBy(supplier.getCreateBy());
// dealingsRecord.setCreateByName(supplier);
dealingsRecord.setCreateTime(new Date());
dealingsRecord.setDealingsUserId(supplier.getId());
dealingsRecord.setDealingsUserName(supplier.getConsigneeName());
dealingsRecord.setUserType(DealingsRecordConstant.TYPE[0]);
dealingsRecord.setDealingsWay("新增供应商");
dealingsRecord.setShopId(supplier.getShopId());
// 销售金额
dealingsRecord.setSaleAmount(BigDecimal.ZERO);
// 退货金额
dealingsRecord.setReturnAmount(BigDecimal.ZERO);
// 上次欠款
dealingsRecord.setLastDebtAmount(BigDecimal.ZERO);
// 最新欠款
dealingsRecord.setBalanceDue(amountOwed);
dealingsRecord.setAmount(amountOwed);
dealingsRecord.setDealingsType(DealingsRecordConstant.DEALINGS_TYPE[3]);
dealingsRecordService.save(dealingsRecord);

13
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/CustomerServiceImpl.java

@ -175,19 +175,6 @@ public class CustomerServiceImpl extends ServiceImpl<CustomerMapper, Customer> i
dealingsRecord.setCreateBy(createBy);
dealingsRecord.setCreateByName(createByName);
dealingsRecord.setCreateTime(new Date());
dealingsRecord.setDealingsUserId(customer.getId());
dealingsRecord.setDealingsUserName(customer.getName());
dealingsRecord.setUserType(DealingsRecordConstant.TYPE[1]);
dealingsRecord.setDealingsWay("新增客户");
dealingsRecord.setShopId(shopId);
// 销售金额
dealingsRecord.setSaleAmount(BigDecimal.ZERO);
// 退货金额
dealingsRecord.setReturnAmount(BigDecimal.ZERO);
// 上次欠款
dealingsRecord.setLastDebtAmount(BigDecimal.ZERO);
// 最新欠款
dealingsRecord.setBalanceDue(amountOwed);
dealingsRecord.setAmount(amountOwed);
dealingsRecord.setDealingsType(DealingsRecordConstant.DEALINGS_TYPE[3]);
dealingsRecordService.save(dealingsRecord);

6
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/DealingsRecordServiceImpl.java

@ -67,6 +67,12 @@ public class DealingsRecordServiceImpl extends ServiceImpl<DealingsRecordMapper,
return dealingsRecordMapper.getDealingsRecordPageByUserId(page, customerBillQueryVo);
}
@Override
public Page<DealingsRecord> getDealingsRecordPageByRegionId(CustomerBillQueryVo customerBillQueryVo) {
final Page<DealingsRecord> page = new Page<>(customerBillQueryVo.getPageNum(), customerBillQueryVo.getPageSize());
return dealingsRecordMapper.getDealingsRecordPageByRegionId(page, customerBillQueryVo);
}
@Override
public Page<SupplierBillPurchaseVo> getDealingsRecordPageBySupplierId(SupplierBillQueryVo supplierBillQueryVo) {
final Page<SupplierBillPurchaseVo> page = new Page<>(supplierBillQueryVo.getPageNum(), supplierBillQueryVo.getPageSize());

387
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallDeliveryOrderServiceImpl.java

@ -1,5 +1,6 @@
package cc.hiver.mall.serviceimpl.mybatis;
import cc.hiver.core.common.constant.DealingsRecordConstant;
import cc.hiver.core.common.constant.SettingConstant;
import cc.hiver.core.common.sms.SmsUtil;
import cc.hiver.core.entity.Worker;
@ -14,10 +15,7 @@ import cc.hiver.mall.pojo.vo.MallOrderVO;
import cc.hiver.mall.pojo.vo.WorkerRedisVo;
import cc.hiver.mall.service.CommentService;
import cc.hiver.mall.service.ShopService;
import cc.hiver.mall.service.mybatis.MallDeliveryOrderService;
import cc.hiver.mall.service.mybatis.MallOrderService;
import cc.hiver.mall.service.mybatis.MallRefundRecordService;
import cc.hiver.mall.service.mybatis.MallUserCouponService;
import cc.hiver.mall.service.mybatis.*;
import cc.hiver.mall.utils.*;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@ -28,12 +26,12 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.sql.Timestamp;
import java.text.DecimalFormat;
import java.time.LocalDateTime;
import java.time.ZoneId;
@ -69,6 +67,9 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM
@Autowired
JPushServiceImpl jPushService;
@Autowired
private DealingsRecordService dealingsRecordService;
@Autowired
private OrderAsyncProducer orderAsyncProducer;
@ -78,6 +79,9 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM
@Autowired
private ShopTakeawayMapper shopTakeawayMapper;
@Autowired
private FreeOrderCacheUtil freeOrderCacheUtil;
@Autowired
private DeliveryRejectUtil deliveryRejectUtil;
@ -105,6 +109,9 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM
@Autowired
private WaitOrderCacheUtil waitOrderCacheUtil;
@Autowired
private RedisLuaScripts redisLuaScripts;
@Autowired
private ShopIndexCountCacheUtil shopIndexCountCacheUtil;
@ -126,6 +133,9 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM
@Autowired
private MallUserCouponService mallUserCouponService;
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Autowired
private RefundOrderCacheUtil refundOrderCacheUtil;
@ -165,153 +175,174 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Integer workerAccept(String workerPhone, String deliveryId, String workerId,String workerName, String groupId) {
public Integer workerAccept(String workerPhone, String deliveryId, String workerId, String workerName, String groupId) {
Worker worker = workerServiceImpl.findByWorkerId(workerId);
if(worker != null && worker.getWorkerStatus() == 3){
if (worker != null && worker.getWorkerStatus() == 3) {
return 5;
}
MallDeliveryOrder delivery = this.getById(deliveryId);
if (delivery == null) return 0;//throw new RuntimeException("配送单不存在");
if (delivery.getStatus() != STATUS_WAIT_ACCEPT) return 1;//throw new RuntimeException("配送单已被接取或已取消");
if (delivery == null) return 0;
if (delivery.getStatus() != STATUS_WAIT_ACCEPT) return 1;
// 指派单校验
if (StringUtils.isNotBlank(delivery.getWorkerId()) && !delivery.getWorkerId().equals(workerId)) {
return 2;//throw new RuntimeException("该单已指定其他配送员,无法抢单");
return 2;
}
List<String> orderIdsSend = new ArrayList<>();
// 更新配送单
Date createTime = new Timestamp(System.currentTimeMillis());
// 1. 获取当前时间 (LocalDateTime)
// 计算必须完成时间
LocalDateTime now = LocalDateTime.now();
// 2. 加40分钟
LocalDateTime futureTime = now.plusMinutes(40);
// 3. 如果需要转回 java.util.Date (为了兼容旧代码)
Date mustFinishTime = Date.from(futureTime.atZone(ZoneId.systemDefault()).toInstant());
Date mustFinishTime = Date.from(now.plusMinutes(40).atZone(ZoneId.systemDefault()).toInstant());
Date acceptTime = new Date();
// 预先更新 delivery 对象字段(后续 buildVO 和缓存复用同一对象)
delivery.setWorkerPhone(workerPhone);
delivery.setStatus(STATUS_WAIT_PICKUP);
delivery.setWorkerId(workerId);
delivery.setWorkerName(workerName);
delivery.setAcceptTime(acceptTime);
delivery.setMustFinishTime(mustFinishTime);
LambdaUpdateWrapper<MallDeliveryOrder> uw = new LambdaUpdateWrapper<>();
uw.eq(MallDeliveryOrder::getId, deliveryId)
.set(MallDeliveryOrder::getStatus, STATUS_WAIT_PICKUP)
.set(MallDeliveryOrder::getWorkerId, workerId).set(MallDeliveryOrder::getWorkerName, workerName).set(MallDeliveryOrder::getWorkerPhone, workerPhone)
.set(MallDeliveryOrder::getAcceptTime, new Date())
.set(MallDeliveryOrder::getMustFinishTime, mustFinishTime);
.set(MallDeliveryOrder::getWorkerId, workerId)
.set(MallDeliveryOrder::getWorkerName, workerName)
.set(MallDeliveryOrder::getWorkerPhone, workerPhone)
.set(MallDeliveryOrder::getAcceptTime, acceptTime)
.set(MallDeliveryOrder::getMustFinishTime, mustFinishTime);
MallOrder order = mallOrderService.getById(delivery.getOrderId());
String numberCode = "";
List<MallOrderGoods> goodsList = new ArrayList<>();
//需要查询该group的所有关联订单,如果是面对面拼团需要更新订单序号
if(delivery.getGroupId() != null){
// 提前查好 Shop,避免重复查询(后续推送复用)
Shop cachedShop = null;
String pushClientId = null;
if (order != null && StringUtils.isNotBlank(order.getShopId())) {
cachedShop = shopService.findById(order.getShopId());
pushClientId = cachedShop != null ? cachedShop.getClientId() : null;
}
// 推送 orderId 列表,待事务提交后异步推送
List<String> pushOrderIds = new ArrayList<>();
if (delivery.getGroupId() != null) {
// ---- 有 groupId ----
LambdaQueryWrapper<MallOrderGroup> gq = new LambdaQueryWrapper<>();
gq.eq(MallOrderGroup::getId, delivery.getGroupId());
MallOrderGroup group = mallOrderGroupMapper.selectOne(gq);
if(group.getIsFace() == 1){
if (group.getIsFace() == 1) {
// ---- 面对面拼团 ----
List<String> orderIds = Arrays.asList(group.getGroupOrderIds().split(","));
orderIdsSend = orderIds;
// 2. 一次 IN 查询所有商品明细
// 一次批量查询所有商品明细
goodsList = mallOrderGoodsMapper.selectByOrderIds(orderIds);
// 批量查询所有子订单,避免循环内 N+1
List<MallOrder> orderInnerList = mallOrderService.listByIds(orderIds);
Map<String, MallOrder> orderInnerMap = new HashMap<>(orderInnerList.size());
for (MallOrder o : orderInnerList) {
orderInnerMap.put(o.getId(), o);
}
// 收集需要更新的订单 id,批量 UPDATE
List<String> toUpdateOrderIds = new ArrayList<>();
Map<String, String> orderSeqMap = new HashMap<>();
StringBuilder numberCodeBuilder = new StringBuilder();
for (String orderId : orderIds) {
MallOrder orderInner = mallOrderService.getById(orderId);
MallOrder orderInner = orderInnerMap.get(orderId);
if (orderInner != null && orderInner.getStatus() == ORDER_STATUS_WAIT_DELIVERY) {
String latestSeq = merchantOrderSeqUtil.generateOrderSequence(order.getShopId(), 1);
LambdaUpdateWrapper<MallOrder> oUw = new LambdaUpdateWrapper<>();
oUw.eq(MallOrder::getId, orderId)
.set(MallOrder::getNumberCode, latestSeq).set(MallOrder::getStatus, 3);
mallOrderService.update(oUw);
//更新缓存
delivery.setWorkerPhone(workerPhone);
delivery.setStatus(STATUS_WAIT_PICKUP);
delivery.setWorkerId(workerId);
delivery.setWorkerName(workerName);
delivery.setAcceptTime(new Date());
delivery.setMustFinishTime(mustFinishTime);
toUpdateOrderIds.add(orderId);
orderSeqMap.put(orderId, latestSeq);
numberCodeBuilder.append(latestSeq).append("+");
// 更新用户缓存
MallOrderVO orderVO = buildVO(orderInner, null, null, delivery);
orderVO.setStatus(3);
userPendingOrderCacheUtil.update(orderInner.getUserId(), orderVO);
//极光推送
if(StringUtils.isNotBlank(order.getShopId())){
Shop shop = shopService.findById(order.getShopId());
jPushService.sendPushNotification(shop.getClientId(), "您有一笔新的订单",orderId);
}
numberCode+=latestSeq+"+";
// 收集推送 orderId
pushOrderIds.add(orderId);
}
}
}else{
// 同步更新关联订单状态:待配送员接单 -> 配送中(或待取货)
if (StringUtils.isNotBlank(delivery.getOrderId())) {
if (order != null && order.getStatus() == ORDER_STATUS_WAIT_DELIVERY) {
orderIdsSend.add(delivery.getOrderId());
String latestSeq = merchantOrderSeqUtil.generateOrderSequence(order.getShopId(), 1);
LambdaUpdateWrapper<MallOrder> oUw = new LambdaUpdateWrapper<>();
oUw.eq(MallOrder::getId, delivery.getOrderId())
.set(MallOrder::getNumberCode, latestSeq).set(MallOrder::getStatus, 3); // 待取货
//缺少根据groupId更新面对面团所有订单状态
mallOrderService.update(oUw);
//更新缓存
delivery.setWorkerPhone(workerPhone);
delivery.setStatus(STATUS_WAIT_PICKUP);
delivery.setWorkerId(workerId);
delivery.setWorkerName(workerName);
delivery.setAcceptTime(new Date());
delivery.setMustFinishTime(mustFinishTime);
MallOrderVO orderVO = buildVO(order, null, null, delivery);
orderVO.setStatus(3);
userPendingOrderCacheUtil.update(order.getUserId(), orderVO);
//极光推送
if(StringUtils.isNotBlank(order.getShopId())){
Shop shop = shopService.findById(order.getShopId());
jPushService.sendPushNotification(shop.getClientId(), "您有一笔新的订单",delivery.getOrderId());
}
numberCode = latestSeq;
goodsList = mallOrderGoodsMapper.selectByOrderId(delivery.getOrderId());
}
// 逐条 UPDATE(各订单 numberCode 不同,无法单条 IN 批量更新 numberCode)
for (String orderId : toUpdateOrderIds) {
LambdaUpdateWrapper<MallOrder> oUw = new LambdaUpdateWrapper<>();
oUw.eq(MallOrder::getId, orderId)
.set(MallOrder::getNumberCode, orderSeqMap.get(orderId))
.set(MallOrder::getStatus, 3);
mallOrderService.update(oUw);
}
}
}else{
// 同步更新关联订单状态:待配送员接单 -> 配送中(或待取货)
if (StringUtils.isNotBlank(delivery.getOrderId())) {
if (order != null && order.getStatus() == ORDER_STATUS_WAIT_DELIVERY) {
numberCode = numberCodeBuilder.toString();
} else {
// ---- 非面对面拼团(有 groupId 但 isFace != 1)----
if (StringUtils.isNotBlank(delivery.getOrderId()) && order != null
&& order.getStatus() == ORDER_STATUS_WAIT_DELIVERY) {
orderIdsSend.add(delivery.getOrderId());
String latestSeq = merchantOrderSeqUtil.generateOrderSequence(order.getShopId(), 1);
LambdaUpdateWrapper<MallOrder> oUw = new LambdaUpdateWrapper<>();
oUw.eq(MallOrder::getId, delivery.getOrderId())
.set(MallOrder::getNumberCode, latestSeq).set(MallOrder::getStatus, 3); // 待取货
//缺少根据groupId更新面对面团所有订单状态
.set(MallOrder::getNumberCode, latestSeq)
.set(MallOrder::getStatus, 3);
mallOrderService.update(oUw);
//更新缓存
delivery.setWorkerPhone(workerPhone);
delivery.setStatus(STATUS_WAIT_PICKUP);
delivery.setWorkerId(workerId);
delivery.setWorkerName(workerName);
delivery.setAcceptTime(new Date());
delivery.setMustFinishTime(mustFinishTime);
MallOrderVO orderVO = buildVO(order, null, null, delivery);
orderVO.setStatus(3);
userPendingOrderCacheUtil.update(order.getUserId(), orderVO);
//极光推送
if(StringUtils.isNotBlank(order.getShopId())){
Shop shop = shopService.findById(order.getShopId());
jPushService.sendPushNotification(shop.getClientId(), "您有一笔新的订单",delivery.getOrderId());
}
pushOrderIds.add(delivery.getOrderId());
numberCode = latestSeq;
//商品明细
goodsList = mallOrderGoodsMapper.selectByOrderId(delivery.getOrderId());
}
}
} else {
// ---- 无 groupId(普通单)----
if (StringUtils.isNotBlank(delivery.getOrderId()) && order != null
&& order.getStatus() == ORDER_STATUS_WAIT_DELIVERY) {
orderIdsSend.add(delivery.getOrderId());
String latestSeq = merchantOrderSeqUtil.generateOrderSequence(order.getShopId(), 1);
LambdaUpdateWrapper<MallOrder> oUw = new LambdaUpdateWrapper<>();
oUw.eq(MallOrder::getId, delivery.getOrderId())
.set(MallOrder::getNumberCode, latestSeq)
.set(MallOrder::getStatus, 3);
mallOrderService.update(oUw);
MallOrderVO orderVO = buildVO(order, null, null, delivery);
orderVO.setStatus(3);
userPendingOrderCacheUtil.update(order.getUserId(), orderVO);
pushOrderIds.add(delivery.getOrderId());
numberCode = latestSeq;
goodsList = mallOrderGoodsMapper.selectByOrderId(delivery.getOrderId());
}
}
//更新订单编号
// 更新配送单(含订单编号)
uw.set(MallDeliveryOrder::getNumberCode, numberCode);
this.update(uw);
//触发商家出餐超时提醒
triggerShopCookTimeoutEvent(orderIdsSend);
//放进缓存
// 触发商家出餐超时提醒(传入已有订单,避免重复查 DB)
triggerShopCookTimeoutEvent(orderIdsSend, order);
// 放进配送员缓存
delivery.setGoodsList(goodsList);
delivery.setNumberCode(numberCode);
workerOrderCacheUtil.put(workerId, delivery);
//抢单大厅缓存去掉
// 抢单大厅缓存去掉
waitOrderCacheUtil.remove(delivery.getRegionId(), delivery.getId());
// 极光推送:异步执行,不阻塞主事务(clientId 已在上方查好)
final String finalPushClientId = pushClientId;
if (StringUtils.isNotBlank(finalPushClientId) && !pushOrderIds.isEmpty()) {
String firstOrderId = pushOrderIds.get(0);
new Thread(() -> {
try {
jPushService.sendPushNotification(finalPushClientId, "您有一笔新的订单", firstOrderId);
} catch (Exception e) {
log.warn("极光推送失败, orderId={}, err={}", firstOrderId, e.getMessage());
}
}).start();
}
log.info("配送员 {} 接单成功,deliveryId={}", workerId, deliveryId);
return 3;
}
@ -329,25 +360,53 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM
return vo;
}
//设置商家出餐超时提醒
//设置商家出餐超时提醒(原始版,供其他调用方使用)
private void triggerShopCookTimeoutEvent(List<String> orderId) {
orderId.forEach(id -> {
MallOrder order = mallOrderService.getById(id);
if (order != null) {
long cookTimeMins = 10; // default
triggerShopCookTimeoutEvent(orderId, null);
}
/**
* 设置商家出餐超时提醒
* @param orderIds 需要触发的订单 ID 列表
* @param knownOrder 若调用方已持有该 shopId 对应的订单对象可直接传入以复用避免重复查 DB null 时自行查询
*/
private void triggerShopCookTimeoutEvent(List<String> orderIds, MallOrder knownOrder) {
if (orderIds == null || orderIds.isEmpty()) return;
// 若调用方已知 shopId,仅查一次 ShopTakeaway
String knownShopId = knownOrder != null ? knownOrder.getShopId() : null;
Long sharedCookTimeMins = null;
if (StringUtils.isNotBlank(knownShopId)) {
try {
LambdaQueryWrapper<ShopTakeaway> qw = new LambdaQueryWrapper<>();
qw.eq(ShopTakeaway::getShopId, knownShopId);
ShopTakeaway shopTakeaway = shopTakeawayMapper.selectOne(qw);
sharedCookTimeMins = shopTakeaway != null ? shopTakeaway.getCookingTime() : 10L;
} catch (Exception e) {
log.error("获取 ShopTakeaway cookingTime 异常: {}", e.getMessage());
sharedCookTimeMins = 10L;
}
}
for (String id : orderIds) {
long cookTimeMins = 10L;
if (sharedCookTimeMins != null) {
// 所有订单同属一个商家,直接复用已查好的数值
cookTimeMins = sharedCookTimeMins;
} else {
// 无法复用:逐条查订单 + ShopTakeaway(兼容外部调用)
try {
LambdaQueryWrapper<ShopTakeaway> qw = new LambdaQueryWrapper<>();
qw.eq(ShopTakeaway::getShopId, order.getShopId());
ShopTakeaway shopTakeaway = shopTakeawayMapper.selectOne(qw);
if (shopTakeaway != null) {
cookTimeMins = shopTakeaway.getCookingTime();
MallOrder o = mallOrderService.getById(id);
if (o != null && StringUtils.isNotBlank(o.getShopId())) {
LambdaQueryWrapper<ShopTakeaway> qw = new LambdaQueryWrapper<>();
qw.eq(ShopTakeaway::getShopId, o.getShopId());
ShopTakeaway shopTakeaway = shopTakeawayMapper.selectOne(qw);
if (shopTakeaway != null) cookTimeMins = shopTakeaway.getCookingTime();
}
} catch (Exception e) {
log.error("获取 ShopTakeaway cookingTime 异常: {}", e.getMessage());
}
orderAsyncProducer.sendDelayMessage(id, "Shop_Cook_Timeout", cookTimeMins * 60 * 1000L);
}
});
orderAsyncProducer.sendDelayMessage(id, "Shop_Cook_Timeout", cookTimeMins * 60 * 1000L);
}
}
/**
@ -436,6 +495,8 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM
.set(MallDeliveryOrder::getFinishTime, new Date());
this.update(uw);
Boolean isFantuan = true;
//如果是有groupId证明是面对面配送,需要更新所有子订单状态为完成
if(StringUtils.isNotBlank(delivery.getGroupId())){
MallOrderGroup group = mallOrderGroupMapper.selectById(delivery.getGroupId());
@ -465,6 +526,9 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM
MallOrder orderInner = mallOrderService.getById(delivery.getOrderId());
userPendingOrderCacheUtil.remove(orderInner.getUserId(),orderInner.getId());
if(orderInner.getOtherOrder() != null){
isFantuan = false;
}
//优惠券变成已使用
mallUserCouponService.useCoupon(delivery.getOrderId());
}
@ -496,6 +560,17 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM
String formattedResult = df.format(newAvgTime);
worker.setAvgTime(new BigDecimal(formattedResult));
workerServiceImpl.update(worker);
//增加余额变动记录
DealingsRecord dealingsRecord = new DealingsRecord();
dealingsRecord.setDealingsWay(DealingsRecordConstant.TYPE_REMARK[0]);
dealingsRecord.setAmount(delivery.getDeliveryFee());
dealingsRecord.setDealingsTime(new Date());
dealingsRecord.setLinkId(deliveryId);
dealingsRecord.setLinkUserId(worker.getWorkerId());
dealingsRecord.setLinkType(DealingsRecordConstant.TYPE[1]);
dealingsRecord.setDealingsType(DealingsRecordConstant.DEALINGS_TYPE[0]);
dealingsRecord.setCreateBy(worker.getWorkerId());
dealingsRecordService.save(dealingsRecord);
//更新缓存
workerOrderCacheUtil.remove(workerId,deliveryId);
//更新缓存
@ -504,6 +579,16 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM
workerRedisVo.setWorker(worker);
workerRedisCacheUtil.update(worker.getRegion(), workerRedisVo);
}
//是否开启了免单活动
if(isFantuan){
if(freeOrderCacheUtil.exists(delivery.getRegionId())){
stringRedisTemplate.execute(
redisLuaScripts.getIncrementScript(),
Arrays.asList("free_order:count", "free_order:flag"), // 两个 key:计数器和免单开关
String.valueOf(freeOrderCacheUtil.get(delivery.getRegionId()).getOrderNumber())// N = 100
);
}
}
}
/**
@ -647,6 +732,11 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM
return this.count(query);
}
@Override
public List<Worker> countOrdersLimit(String regionId) {
return this.baseMapper.countOrdersLimit(regionId);
}
@Override
public List<Map<Integer, Integer>> countOrdersByType(String regionId) {
return this.baseMapper.countOrdersByType(regionId);
@ -720,6 +810,78 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM
return returnList;
}
@Override
public List<Map<String, Object>> countOrdersByStatus1(String workerId,String regionId) {
List<Map<String, Object>> returnList = new ArrayList<>();
// ---- 从订单缓存获取该配送员的待完成订单,统计各状态数量 ----
List<MallDeliveryOrder> workerOrders = workerOrderCacheUtil.getAllAsList(workerId);
if(workerOrders != null){
int orderWaitCount = waitOrderCacheUtil.getAllByWorkerId(workerId,regionId); // status=0 待接单
int orderGetCount = 0; // status=1 待取货
int orderPutCount = 0; // status=2 待送达
for (MallDeliveryOrder order : workerOrders) {
if (order.getStatus() == null) continue;
else if (order.getStatus() == 1) orderGetCount++;
else if (order.getStatus() == 2) orderPutCount++;
}
Map<String, Object> newRecord = new HashMap<>();
newRecord.put("status", 0); // 状态
newRecord.put("orderCount", orderWaitCount);
returnList.add(newRecord);
Map<String, Object> newRecord1 = new HashMap<>();
newRecord1.put("status", 1); // 状态
newRecord1.put("orderCount", orderGetCount);
returnList.add(newRecord1);
Map<String, Object> newRecord2 = new HashMap<>();
newRecord2.put("status", 2); // 状态
newRecord2.put("orderCount", orderPutCount);
returnList.add(newRecord2);
}else{
returnList = this.baseMapper.countOrdersByStatus(workerId);
}
Integer pendingBadReviewCount = 0;
List<MallRefundRecord> all = refundOrderCacheUtil.getAll(workerId);
if(all != null){
pendingBadReviewCount = all.size();
}else{
//查待售后待退款数
MallRefundRecordPageQuery q = new MallRefundRecordPageQuery();
q.setPageSize(PAGE_SIZE);
IPage<MallRefundRecord> page = new Page<>(q.getPageNum(), q.getPageSize());
q.setLinkId(workerId);
List<Integer> statusList = new ArrayList<>();
statusList.add(STATUS_WAIT_ACCEPT);
statusList.add(STATUS_DONE);
q.setStatusList(statusList);
IPage<MallRefundRecord> result = mallRefundRecordService.selectPageVO(q);
if(result != null && !result.getRecords().isEmpty()){
pendingBadReviewCount = result.getRecords().size();
}
}
Map<String, Object> newRecord = new HashMap<>();
newRecord.put("status", STATUS_DONE); // 状态
newRecord.put("orderCount", pendingBadReviewCount);
returnList.add(newRecord);
Integer pendingBadReviewCount1 = 0;
List<Comment> all1 = commentCacheUtil.getAll(workerId);
if(all1 != null){
pendingBadReviewCount1 += all1.size();
}else{
//查询待回复差评
pendingBadReviewCount1 += mallOrderMapper.selectPendingBadReviewCount(workerId);
}
Map<String, Object> newRecord1 = new HashMap<>();
newRecord1.put("status", 4); // 状态
newRecord1.put("orderCount", pendingBadReviewCount1);
returnList.add(newRecord1);
return returnList;
}
/**
* 用户增加配送费在现有 deliveryFee 基础上追加
*/
@ -837,4 +999,9 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM
public List<MallDeliveryOrder> selectByOrderIds(List<String> ids) {
return this.baseMapper.selectByOrderIds(ids);
}
@Override
public HashMap<String, Object> countOrdersWorkerIndex(String workerId) {
return this.baseMapper.countOrdersWorkerIndex(workerId);
}
}

2
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderGroupServiceImpl.java

@ -190,6 +190,8 @@ public class MallOrderGroupServiceImpl extends ServiceImpl<MallOrderGroupMapper,
if (!isValid) {
// 配送员下线或规则关闭 -> 去掉 workerId 进入抢单大厅,保留原有补贴金
delivery.setWorkerId("");
delivery.setWorkerPhone("");
delivery.setWorkerName("");
smsUtil.sendCode(delivery.getReceiverPhone(), null, SettingConstant.SMS_TYPE.SMS_WORKEROUT.name());
}
}

104
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderServiceImpl.java

@ -1,5 +1,6 @@
package cc.hiver.mall.serviceimpl.mybatis;
import cc.hiver.core.common.constant.DealingsRecordConstant;
import cc.hiver.core.common.constant.SettingConstant;
import cc.hiver.core.common.redis.RedisTemplateHelper;
import cc.hiver.core.common.sms.SmsUtil;
@ -17,6 +18,7 @@ import cc.hiver.mall.pojo.query.MallOrderPageQuery;
import cc.hiver.mall.pojo.vo.MallOrderVO;
import cc.hiver.mall.service.CommentService;
import cc.hiver.mall.service.ShopService;
import cc.hiver.mall.service.mybatis.DealingsRecordService;
import cc.hiver.mall.service.mybatis.MallDeliveryOrderService;
import cc.hiver.mall.service.mybatis.MallOrderGroupService;
import cc.hiver.mall.service.mybatis.MallOrderService;
@ -33,6 +35,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@ -87,6 +90,9 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
@Autowired
private MallOrderGoodsMapper mallOrderGoodsMapper;
@Autowired
private RedisLuaScripts redisLuaScripts;
@Autowired
private MallDeliveryOrderService mallDeliveryOrderService;
@ -99,6 +105,9 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
@Autowired
private RefundOrderCacheUtil refundOrderCacheUtil;
@Autowired
private DealingsRecordService dealingsRecordService;
@Autowired
JPushServiceImpl jPushService;
@ -141,6 +150,12 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
@Autowired
private CommentService commentService;
@Autowired
private FreeOrderCacheUtil freeOrderCacheUtil;
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Autowired
private MallReturnOrderGoodsMapper mallReturnOrderGoodsMapper;
@ -271,6 +286,33 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
// 待支付
order.setStatus(STATUS_WAIT_PAY);
order.setRegionId(dto.getRegionId());
// 1. 【核心】调用判断脚本,看能不能免单
String canFree = stringRedisTemplate.execute(
redisLuaScripts.getCheckScript(),
Collections.singletonList("free_order:flag"), // 检查免单开关
"" // 不需要额外参数
);
boolean isFreeOrder = "true".equals(canFree);
order.setIsFreeOrder(isFreeOrder ? 1 : 0);
if(isFreeOrder){
order.setFreeAmount(freeOrderCacheUtil.get(order.getRegionId()).getFreeAmount());
BigDecimal finalAmount = order.getTotalAmount().subtract(freeOrderCacheUtil.get(order.getRegionId()).getFreeAmount());
order.setTotalAmount(finalAmount.signum() <= 0 ? BigDecimal.valueOf(0.01) : finalAmount);
//增加奖励记录
DealingsRecord dealingsRecord = new DealingsRecord();
dealingsRecord.setDealingsWay(DealingsRecordConstant.TYPE_REMARK[6]);
dealingsRecord.setAmount(freeOrderCacheUtil.get(order.getRegionId()).getFreeAmount());
dealingsRecord.setDealingsTime(new Date());
dealingsRecord.setLinkId(order.getId());
dealingsRecord.setLinkUserId(order.getUserId());
dealingsRecord.setRegionId(order.getRegionId());
dealingsRecord.setLinkType(DealingsRecordConstant.TYPE[0]);
dealingsRecord.setDealingsType(DealingsRecordConstant.DEALINGS_TYPE[0]);
dealingsRecord.setCreateBy(order.getUserId());
dealingsRecordService.save(dealingsRecord);
}
this.save(order);
if (StringUtils.isNotBlank(order.getUserCouponId()) && order.getCouponDiscountFee() != null) {
@ -336,6 +378,31 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
MallOrder order = buildBaseOrder(dto, orderType, goodsAmount, deliveryFee, packageFee);
order.setStatus(STATUS_WAIT_PAY);
order.setRegionId(dto.getRegionId());
// 1. 【核心】调用判断脚本,看能不能免单
String canFree = stringRedisTemplate.execute(
redisLuaScripts.getCheckScript(),
Collections.singletonList("free_order:flag"), // 检查免单开关
"" // 不需要额外参数
);
boolean isFreeOrder = "true".equals(canFree);
order.setIsFreeOrder(isFreeOrder ? 1 : 0);
if(isFreeOrder){
order.setFreeAmount(freeOrderCacheUtil.get(order.getRegionId()).getFreeAmount());
BigDecimal finalAmount = order.getTotalAmount().subtract(freeOrderCacheUtil.get(order.getRegionId()).getFreeAmount());
order.setTotalAmount(finalAmount.signum() <= 0 ? BigDecimal.valueOf(0.01) : finalAmount);
//增加奖励记录
DealingsRecord dealingsRecord = new DealingsRecord();
dealingsRecord.setDealingsWay(DealingsRecordConstant.TYPE_REMARK[7]);
dealingsRecord.setAmount(freeOrderCacheUtil.get(order.getRegionId()).getFreeAmount());
dealingsRecord.setDealingsTime(new Date());
dealingsRecord.setLinkId(order.getId());
dealingsRecord.setLinkUserId(order.getUserId());
dealingsRecord.setRegionId(order.getRegionId());
dealingsRecord.setLinkType(DealingsRecordConstant.TYPE[0]);
dealingsRecord.setDealingsType(DealingsRecordConstant.DEALINGS_TYPE[0]);
dealingsRecord.setCreateBy(order.getUserId());
dealingsRecordService.save(dealingsRecord);
}
this.save(order);
if (StringUtils.isNotBlank(order.getUserCouponId()) && order.getCouponDiscountFee() != null) {
@ -448,6 +515,32 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
MallOrder order = buildBaseOrder(dto, orderType, goodsAmount, deliveryFee, packageFee);
order.setStatus(STATUS_WAIT_PAY);
order.setRegionId(dto.getRegionId());
// 1. 【核心】调用判断脚本,看能不能免单
String canFree = stringRedisTemplate.execute(
redisLuaScripts.getCheckScript(),
Collections.singletonList("free_order:flag"), // 检查免单开关
"" // 不需要额外参数
);
boolean isFreeOrder = "true".equals(canFree);
order.setIsFreeOrder(isFreeOrder ? 1 : 0);
if(isFreeOrder){
order.setFreeAmount(freeOrderCacheUtil.get(order.getRegionId()).getFreeAmount());
BigDecimal finalAmount = order.getTotalAmount().subtract(freeOrderCacheUtil.get(order.getRegionId()).getFreeAmount());
order.setTotalAmount(finalAmount.signum() <= 0 ? BigDecimal.valueOf(0.01) : finalAmount);
//增加奖励记录
DealingsRecord dealingsRecord = new DealingsRecord();
dealingsRecord.setDealingsWay(DealingsRecordConstant.TYPE_REMARK[6]);
dealingsRecord.setAmount(freeOrderCacheUtil.get(order.getRegionId()).getFreeAmount());
dealingsRecord.setDealingsTime(new Date());
dealingsRecord.setLinkId(order.getId());
dealingsRecord.setLinkUserId(order.getUserId());
dealingsRecord.setRegionId(order.getRegionId());
dealingsRecord.setLinkType(DealingsRecordConstant.TYPE[0]);
dealingsRecord.setDealingsType(DealingsRecordConstant.DEALINGS_TYPE[0]);
dealingsRecord.setCreateBy(order.getUserId());
dealingsRecordService.save(dealingsRecord);
}
this.save(order);
if (StringUtils.isNotBlank(order.getUserCouponId()) && order.getCouponDiscountFee() != null) {
@ -1080,6 +1173,14 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
updateOrderStatus(orderId, STATUS_DONE);
//更新缓存
userPendingOrderCacheUtil.remove(order.getUserId(),order.getId());
//免单计数
if(freeOrderCacheUtil.exists(order.getRegionId())){
stringRedisTemplate.execute(
redisLuaScripts.getIncrementScript(),
Arrays.asList("free_order:count", "free_order:flag"), // 两个 key:计数器和免单开关
String.valueOf(freeOrderCacheUtil.get(order.getRegionId()).getOrderNumber())// N = 100
);
}
}
@Override
@ -1170,7 +1271,7 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
.collect(java.util.stream.Collectors.toList());
// 2. 一次 IN 查询所有商品明细
List<MallOrderGoods> allGoods = mallOrderGoodsMapper.selectByOrderIds(orderIds);
List<MallOrderGoods> allGoods = mallOrderGoodsMapper.selectPagesByOrderIds(orderIds);
// 3. 按 orderId 分组
java.util.Map<String, List<MallOrderGoods>> goodsMap = allGoods.stream()
@ -1225,6 +1326,7 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
CommentQuery commentQuery = new CommentQuery();
commentQuery.setPageNum(1);
commentQuery.setPageSize(10);
commentQuery.setPicture(0);
commentQuery.setOrderId(order.getId());
Page<Comment> commentsPage = commentService.getCommentList(commentQuery);
List<String> parentIds = new ArrayList<>();

122
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallRefundRecordServiceImpl.java

@ -1,5 +1,6 @@
package cc.hiver.mall.serviceimpl.mybatis;
import cc.hiver.core.common.constant.DealingsRecordConstant;
import cc.hiver.core.common.utils.SnowFlakeUtil;
import cc.hiver.core.entity.Worker;
import cc.hiver.core.serviceimpl.WorkerServiceImpl;
@ -7,6 +8,7 @@ import cc.hiver.mall.dao.mapper.*;
import cc.hiver.mall.entity.*;
import cc.hiver.mall.pojo.query.MallRefundRecordPageQuery;
import cc.hiver.mall.pojo.vo.MallOrderVO;
import cc.hiver.mall.service.mybatis.DealingsRecordService;
import cc.hiver.mall.service.mybatis.MallOrderService;
import cc.hiver.mall.service.mybatis.MallRefundRecordService;
import cc.hiver.mall.service.mybatis.MallUserCouponService;
@ -62,6 +64,9 @@ public class MallRefundRecordServiceImpl extends ServiceImpl<MallRefundRecordMap
@Autowired
private ShopIndexCountCacheUtil shopIndexCountCacheUtil;
@Autowired
private DealingsRecordService dealingsRecordService;
@Autowired
private MallOrderService mallOrderService;
@ -274,7 +279,28 @@ public class MallRefundRecordServiceImpl extends ServiceImpl<MallRefundRecordMap
if(mallRefundRecord.getLinkId().toUpperCase().startsWith("W")){
//配送员同意退款。扣掉余额
Worker worker = workerServiceImpl.findByWorkerId(mallRefundRecord.getLinkId());
worker.setDepoBal(worker.getDepoBal().subtract(mallRefundRecord.getRefundAmount()));
BigDecimal refundAmount = mallRefundRecord.getRefundAmount();
// 获取当前的待结算金额(depoBal)和实际可提现金额(depoBalRel)
BigDecimal currentDepoBal = worker.getDepoBal();
BigDecimal currentDepoBalRel = worker.getDepoBalRel();
// 1. 优先从待结算金额(depoBal)中扣除
if (currentDepoBal.compareTo(refundAmount) >= 0) {
// 情况一:待结算金额足够全额抵扣退款
worker.setDepoBal(currentDepoBal.subtract(refundAmount));
// 可提现金额保持不变
worker.setDepoBalRel(currentDepoBalRel);
} else {
// 情况二:待结算金额不足,需要联合扣款
// 先把待结算金额扣成 0
worker.setDepoBal(BigDecimal.ZERO);
// 计算还需要从可提现金额中扣除的部分
BigDecimal remainingRefund = refundAmount.subtract(currentDepoBal);
// 用可提现金额减去剩余退款
worker.setDepoBalRel(currentDepoBalRel.subtract(remainingRefund));
}
// 执行更新
workerServiceImpl.update(worker);
}
}else{
@ -371,8 +397,41 @@ public class MallRefundRecordServiceImpl extends ServiceImpl<MallRefundRecordMap
if(mallRefundRecord.getLinkId().toUpperCase().startsWith("W")){
//配送员同意退款。扣掉余额
Worker worker = workerServiceImpl.findByWorkerId(mallRefundRecord.getLinkId());
worker.setDepoBal(worker.getDepoBal().subtract(mallRefundRecord.getRefundAmount()));
BigDecimal refundAmount = mallRefundRecord.getRefundAmount();
// 获取当前的待结算金额(depoBal)和实际可提现金额(depoBalRel)
BigDecimal currentDepoBal = worker.getDepoBal();
BigDecimal currentDepoBalRel = worker.getDepoBalRel();
// 1. 优先从待结算金额(depoBal)中扣除
if (currentDepoBal.compareTo(refundAmount) >= 0) {
// 情况一:待结算金额足够全额抵扣退款
worker.setDepoBal(currentDepoBal.subtract(refundAmount));
// 可提现金额保持不变
worker.setDepoBalRel(currentDepoBalRel);
} else {
// 情况二:待结算金额不足,需要联合扣款
// 先把待结算金额扣成 0
worker.setDepoBal(BigDecimal.ZERO);
// 计算还需要从可提现金额中扣除的部分
BigDecimal remainingRefund = refundAmount.subtract(currentDepoBal);
// 用可提现金额减去剩余退款
worker.setDepoBalRel(currentDepoBalRel.subtract(remainingRefund));
}
// 执行更新
workerServiceImpl.update(worker);
//增加余额变动记录
DealingsRecord dealingsRecord = new DealingsRecord();
dealingsRecord.setDealingsWay(DealingsRecordConstant.TYPE_REMARK[1]);
dealingsRecord.setAmount(refundAmount);
dealingsRecord.setDealingsTime(new Date());
dealingsRecord.setLinkUserId(worker.getWorkerId());
dealingsRecord.setLinkId(mallRefundRecord.getId());
dealingsRecord.setLinkType(DealingsRecordConstant.TYPE[1]);
dealingsRecord.setDealingsType(DealingsRecordConstant.DEALINGS_TYPE[3]);
dealingsRecord.setCreateBy(worker.getWorkerId());
dealingsRecordService.save(dealingsRecord);
}
}
//都处理了
@ -481,9 +540,29 @@ public class MallRefundRecordServiceImpl extends ServiceImpl<MallRefundRecordMap
}
wechatPayUtil.refund(mallRefundRecord.getOrderId(), mallRefundRecord.getRefundAmount().multiply(new BigDecimal(100)).longValue(), mallRefundRecord.getRefundAmount().multiply(new BigDecimal(100)).longValue());
if(mallRefundRecord.getLinkId().toUpperCase().startsWith("W")){
//配送员同意退款。扣掉余额
Worker worker = workerServiceImpl.findByWorkerId(mallRefundRecord.getLinkId());
worker.setDepoBal(worker.getDepoBal().subtract(mallRefundRecord.getRefundAmount()));
BigDecimal refundAmount = mallRefundRecord.getRefundAmount();
// 获取当前的待结算金额(depoBal)和实际可提现金额(depoBalRel)
BigDecimal currentDepoBal = worker.getDepoBal();
BigDecimal currentDepoBalRel = worker.getDepoBalRel();
// 1. 优先从待结算金额(depoBal)中扣除
if (currentDepoBal.compareTo(refundAmount) >= 0) {
// 情况一:待结算金额足够全额抵扣退款
worker.setDepoBal(currentDepoBal.subtract(refundAmount));
// 可提现金额保持不变
worker.setDepoBalRel(currentDepoBalRel);
} else {
// 情况二:待结算金额不足,需要联合扣款
// 先把待结算金额扣成 0
worker.setDepoBal(BigDecimal.ZERO);
// 计算还需要从可提现金额中扣除的部分
BigDecimal remainingRefund = refundAmount.subtract(currentDepoBal);
// 用可提现金额减去剩余退款
worker.setDepoBalRel(currentDepoBalRel.subtract(remainingRefund));
}
// 执行更新
workerServiceImpl.update(worker);
}
}
@ -495,10 +574,41 @@ public class MallRefundRecordServiceImpl extends ServiceImpl<MallRefundRecordMap
updateOrderStatus(mallRefundRecord.getOrderId(), STATUS_LAST_REFUNDED);
wechatPayUtil.refund(mallRefundRecord.getOrderId(), order.getTotalAmount().multiply(new BigDecimal(100)).longValue(), mallRefundRecord.getRefundAmount().multiply(new BigDecimal(100)).longValue());
if(mallRefundRecord.getLinkId().toUpperCase().startsWith("W")){
//配送员同意退款。扣掉余额
Worker worker = workerServiceImpl.findByWorkerId(mallRefundRecord.getLinkId());
worker.setDepoBal(worker.getDepoBal().subtract(mallRefundRecord.getRefundAmount()));
BigDecimal refundAmount = mallRefundRecord.getRefundAmount();
// 获取当前的待结算金额(depoBal)和实际可提现金额(depoBalRel)
BigDecimal currentDepoBal = worker.getDepoBal();
BigDecimal currentDepoBalRel = worker.getDepoBalRel();
// 1. 优先从待结算金额(depoBal)中扣除
if (currentDepoBal.compareTo(refundAmount) >= 0) {
// 情况一:待结算金额足够全额抵扣退款
worker.setDepoBal(currentDepoBal.subtract(refundAmount));
// 可提现金额保持不变
worker.setDepoBalRel(currentDepoBalRel);
} else {
// 情况二:待结算金额不足,需要联合扣款
// 先把待结算金额扣成 0
worker.setDepoBal(BigDecimal.ZERO);
// 计算还需要从可提现金额中扣除的部分
BigDecimal remainingRefund = refundAmount.subtract(currentDepoBal);
// 用可提现金额减去剩余退款
worker.setDepoBalRel(currentDepoBalRel.subtract(remainingRefund));
}
// 执行更新
workerServiceImpl.update(worker);
//增加余额变动记录
DealingsRecord dealingsRecord = new DealingsRecord();
dealingsRecord.setDealingsWay(DealingsRecordConstant.TYPE_REMARK[1]);
dealingsRecord.setAmount(refundAmount);
dealingsRecord.setLinkUserId(worker.getWorkerId());
dealingsRecord.setDealingsTime(new Date());
dealingsRecord.setLinkId(mallRefundRecord.getId());
dealingsRecord.setLinkType(DealingsRecordConstant.TYPE[1]);
dealingsRecord.setDealingsType(DealingsRecordConstant.DEALINGS_TYPE[2]);
dealingsRecord.setCreateBy(worker.getWorkerId());
dealingsRecordService.save(dealingsRecord);
}
}else{
//订单还是变成已完成状态

17
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallSettlementRecordServiceImpl.java

@ -1,10 +1,13 @@
package cc.hiver.mall.serviceimpl.mybatis;
import cc.hiver.core.common.constant.DealingsRecordConstant;
import cc.hiver.mall.dao.mapper.MallSettlementRecordMapper;
import cc.hiver.mall.entity.DealingsRecord;
import cc.hiver.mall.entity.MallOrder;
import cc.hiver.mall.entity.MallSettlementRecord;
import cc.hiver.mall.entity.Shop;
import cc.hiver.mall.service.ShopService;
import cc.hiver.mall.service.mybatis.DealingsRecordService;
import cc.hiver.mall.service.mybatis.MallOrderService;
import cc.hiver.mall.service.mybatis.MallSettlementRecordService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@ -29,6 +32,9 @@ public class MallSettlementRecordServiceImpl extends ServiceImpl<MallSettlementR
@Autowired
private MallOrderService mallOrderService;
@Autowired
private DealingsRecordService dealingsRecordService;
@Autowired
private ShopService shopService;
@ -62,6 +68,17 @@ public class MallSettlementRecordServiceImpl extends ServiceImpl<MallSettlementR
BigDecimal balance = shop.getBalance() != null ? shop.getBalance() : BigDecimal.ZERO;
shop.setBalance(balance.add(record.getSettlementAmount()));
shopService.update(shop);
//增加余额变动记录
DealingsRecord dealingsRecord = new DealingsRecord();
dealingsRecord.setDealingsWay(DealingsRecordConstant.TYPE_REMARK[6]);
dealingsRecord.setAmount(record.getSettlementAmount());
dealingsRecord.setDealingsTime(new Date());
dealingsRecord.setLinkId(record.getId());
dealingsRecord.setLinkUserId(record.getShopId());
dealingsRecord.setLinkType(DealingsRecordConstant.TYPE[2]);
dealingsRecord.setDealingsType(DealingsRecordConstant.DEALINGS_TYPE[0]);
dealingsRecord.setCreateBy(record.getShopId());
dealingsRecordService.save(dealingsRecord);
}
}
}

26
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/PurchaseServiceImpl.java

@ -1,6 +1,5 @@
package cc.hiver.mall.serviceimpl.mybatis;
import cc.hiver.core.common.constant.DealingsRecordConstant;
import cc.hiver.core.common.utils.SecurityUtil;
import cc.hiver.core.common.utils.StringUtils;
import cc.hiver.core.entity.User;
@ -107,18 +106,6 @@ public class PurchaseServiceImpl extends ServiceImpl<PurchaseMapper, Purchase> i
dealingsRecord.setCreateBy(user.getId());
dealingsRecord.setCreateByName(user.getNickname());
dealingsRecord.setCreateTime(new Date());
dealingsRecord.setSaleId(id);
// 交易对象id;上游供应商id/下游客户id
dealingsRecord.setDealingsUserId(oldPurchase.getSupplierId());
// 交易对象名称
dealingsRecord.setDealingsUserName(oldPurchase.getSupplierName());
// 类型( 0-上游供货商;1-下游客户)
dealingsRecord.setUserType(DealingsRecordConstant.TYPE[0]);
// 剩余欠款
dealingsRecord.setBalanceDue(newNoPay);
// 交易方式/附言
dealingsRecord.setDealingsWay(dealingsWay);
dealingsRecord.setShopId(oldPurchase.getShopId());
dealingsRecordService.save(dealingsRecord);
}
@ -735,19 +722,6 @@ public class PurchaseServiceImpl extends ServiceImpl<PurchaseMapper, Purchase> i
dealingsRecord.setCreateBy(user.getId());
dealingsRecord.setCreateByName(user.getNickname());
dealingsRecord.setCreateTime(new Date());
dealingsRecord.setDealingsUserId(purchase.getSupplierId());
dealingsRecord.setDealingsUserName(purchase.getSupplierName());
dealingsRecord.setDealingsWay("订单撤销");
dealingsRecord.setShopId(purchase.getShopId());
// 上次欠款
dealingsRecord.setLastDebtAmount(lastDebtAmount);
// 最新欠款
dealingsRecord.setBalanceDue(newDebtAmount);
// 金额
dealingsRecord.setAmount(noPay);
dealingsRecord.setDealingsType(DealingsRecordConstant.DEALINGS_TYPE[6]);
dealingsRecord.setUserType(DealingsRecordConstant.TYPE[0]);
dealingsRecord.setSaleId(id);
dealingsRecordService.save(dealingsRecord);
}
// 作废当前订单的欠款记录

29
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/SaleServiceImpl.java

@ -1,7 +1,6 @@
package cc.hiver.mall.serviceimpl.mybatis;
import cc.hiver.core.common.constant.CommonConstant;
import cc.hiver.core.common.constant.DealingsRecordConstant;
import cc.hiver.core.common.constant.SaleConstant;
import cc.hiver.core.common.utils.CommonUtil;
import cc.hiver.core.common.utils.SecurityUtil;
@ -151,18 +150,6 @@ public class SaleServiceImpl extends ServiceImpl<SaleMapper, Sale> implements Sa
dealingsRecord.setCreateBy(user.getId());
dealingsRecord.setCreateByName(user.getNickname());
dealingsRecord.setCreateTime(new Date());
dealingsRecord.setSaleId(id);
// 交易对象id;上游供应商id/下游客户id
dealingsRecord.setDealingsUserId(oldSale.getUserId());
// 交易对象名称
dealingsRecord.setDealingsUserName(oldSale.getUserName());
// 类型( 0-上游供货商;1-下游客户)
dealingsRecord.setUserType(DealingsRecordConstant.TYPE[1]);
// 剩余欠款
dealingsRecord.setBalanceDue(newNoPay);
// 交易方式/附言
dealingsRecord.setDealingsWay(dealingsWay);
dealingsRecord.setShopId(oldSale.getShopId());
dealingsRecordService.save(dealingsRecord);
}
@ -1086,22 +1073,6 @@ public class SaleServiceImpl extends ServiceImpl<SaleMapper, Sale> implements Sa
// 创建人
final User user = securityUtil.getCurrUser();
final DealingsRecord dealingsRecord = new DealingsRecord();
dealingsRecord.setSaleId(id);
dealingsRecord.setCreateBy(user.getId());
dealingsRecord.setCreateByName(user.getNickname());
dealingsRecord.setCreateTime(new Date());
dealingsRecord.setDealingsUserId(sale.getUserId());
dealingsRecord.setDealingsUserName(sale.getUserName());
dealingsRecord.setDealingsWay("订单撤销");
dealingsRecord.setShopId(sale.getShopId());
// 上次欠款
dealingsRecord.setLastDebtAmount(lastDebtAmount);
// 最新欠款
dealingsRecord.setBalanceDue(newDebtAmount);
// 金额
dealingsRecord.setAmount(amount);
dealingsRecord.setDealingsType(DealingsRecordConstant.DEALINGS_TYPE[6]);
dealingsRecord.setUserType(DealingsRecordConstant.TYPE[1]);
dealingsRecordService.save(dealingsRecord);
}
// 作废当前订单的欠款记录

90
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/FreeOrderCacheUtil.java

@ -0,0 +1,90 @@
package cc.hiver.mall.utils;
import cc.hiver.core.common.redis.RedisTemplateHelper;
import cc.hiver.mall.pojo.vo.MallOrderFreeVO;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
*/
@Slf4j
@Component
public class FreeOrderCacheUtil {
/** Redis Key 前缀 */
private static final String KEY_PREFIX = "FREE_ORDERS:";
@Autowired
private RedisTemplateHelper redisTemplateHelper;
// ================================================================
// Key 构建
// ================================================================
private String buildKey(String regionId) {
return KEY_PREFIX + regionId;
}
// ================================================================
// 存放(put)
public void put(String regionId, MallOrderFreeVO orderVO) {
if (StringUtils.isBlank(regionId) || orderVO == null || StringUtils.isBlank(orderVO.getRegionId())) {
log.info("FreeOrderCacheUtil.put 参数无效, regionId={}, orderVO={}", regionId, orderVO);
return;
}
try {
String key = buildKey(regionId);
String json = JSONUtil.toJsonStr(orderVO);
redisTemplateHelper.hPut(key, orderVO.getRegionId(), json);
} catch (Exception e) {
log.info("缓存订单免单策略失败: regionId={}, regionId={}", regionId, orderVO.getRegionId(), e);
}
}
/**
*/
public void removeAll(String regionId) {
if (StringUtils.isBlank(regionId)) {
return;
}
try {
redisTemplateHelper.delete(buildKey(regionId));
log.info("清除订单免单缓存: regionId={}", regionId);
} catch (Exception e) {
log.info("清除订单免单缓存失败: regionId={}", regionId, e);
}
}
/**
*/
public MallOrderFreeVO get(String regionId) {
if (StringUtils.isBlank(regionId) || StringUtils.isBlank(regionId)) {
return null;
}
try {
String key = buildKey(regionId);
Object value = redisTemplateHelper.hGet(key, regionId);
if (value == null) {
return null;
}
return JSONUtil.toBean(value.toString(), MallOrderFreeVO.class);
} catch (Exception e) {
log.info("获取订单免单缓存失败: regionId={}, regionId={}", regionId, regionId, e);
return null;
}
}
/**
* 判断该缓存是否已存在
*/
public boolean exists(String regionId) {
if (StringUtils.isBlank(regionId)) {
return false;
}
Boolean hasKey = redisTemplateHelper.hasKey(buildKey(regionId));
return hasKey != null && hasKey;
}
}

38
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/MallOrderFreeUtil.java

@ -0,0 +1,38 @@
package cc.hiver.mall.utils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
@Service
public class MallOrderFreeUtil {
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Autowired
private RedisLuaScripts redisLuaScripts;
@Autowired
private FreeOrderCacheUtil freeOrderCacheUtil;
// Redis Key 的前缀
private static final String FREE_ORDER_QUEUE = "free_order_queue:";
/*public Boolean handleOrderCompleted(String orderId,String regionId) {
// 执行脚本,传入队列键名、当前用户ID、以及 N 值
String freeOrderOrderId = stringRedisTemplate.execute(
redisLuaScripts.getFreeOrderScript(),
Collections.singletonList(FREE_ORDER_QUEUE),
orderId,
String.valueOf(freeOrderCacheUtil.get(regionId).getOrderNumber())
);
// 如果脚本返回了用户ID,说明该用户触发了免单
if (freeOrderOrderId != null) {
return true;
}
return false;
}*/
}

54
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/RedisLuaScripts.java

@ -6,7 +6,49 @@ import org.springframework.stereotype.Component;
@Component
public class RedisLuaScripts {
// 封装拒单次数限制的 Lua 脚本
// 脚本1:订单支付完成时调用 - 负责精准计数
// 逻辑:计数器 +1。如果刚好达到 N(比如100),说明这一轮攒满了,将免单标记设为 1,并重置计数器为 0。
private static final String INCREMENT_AND_CHECK_SCRIPT =
"local countKey = KEYS[1] " + // 计数器 key
"local flagKey = KEYS[2] " + // 免单标记 key
"local N = tonumber(ARGV[1]) " + // 目标订单数(如 100)
"local currentCount = tonumber(redis.call('GET', countKey) or '0') " +
"currentCount = currentCount + 1 " + // 计数器加 1
"if currentCount >= N then " +
" redis.call('SET', flagKey, '1') " + // 攒满 N 单,开启免单通道
" redis.call('SET', countKey, '0') " + // 计数器归零,准备下一轮
"else " +
" redis.call('SET', countKey, currentCount) " + // 没攒满,更新计数器
"end " +
"return currentCount"; // 返回当前计数(可选,用于日志)
// 脚本2:创建订单时调用 - 负责判断是否免单
// 逻辑:检查免单标记。如果是 1,说明前面刚好攒满了 N 单,当前用户免单,并将标记重置为 0;否则正常支付。
private static final String CHECK_AND_CONSUME_SCRIPT =
"local flagKey = KEYS[1] " + // 免单标记 key
"local freeFlag = redis.call('GET', flagKey) " +
"if freeFlag == '1' then " +
" redis.call('SET', flagKey, '0') " + // 消耗掉这个免单名额,关闭通道
" return 'true' " + // 告诉业务层:这单免了!
"else " +
" return 'false' " + // 告诉业务层:这单正常付钱
"end";
private final DefaultRedisScript<Long> incrementScript;
private final DefaultRedisScript<String> checkScript;
public DefaultRedisScript<Long> getIncrementScript() {
return incrementScript;
}
public DefaultRedisScript<String> getCheckScript() {
return checkScript;
}
// ================= 脚本 2:拒单次数限制 =================
// 逻辑:获取当前值 -> 判断是否超限 -> 未超限则自增并设置过期时间 -> 返回当前次数或错误码
private static final String REJECT_LIMIT_SCRIPT =
"local key = KEYS[1] " +
@ -23,9 +65,19 @@ public class RedisLuaScripts {
" return newCount " + // 返回当前的拒单次数
"end";
// 封装成 Spring 的 DefaultRedisScript Bean
private final DefaultRedisScript<Long> rejectLimitScript;
public RedisLuaScripts() {
this.incrementScript = new DefaultRedisScript<>();
this.incrementScript.setScriptText(INCREMENT_AND_CHECK_SCRIPT);
this.incrementScript.setResultType(Long.class);
this.checkScript = new DefaultRedisScript<>();
this.checkScript.setScriptText(CHECK_AND_CONSUME_SCRIPT);
this.checkScript.setResultType(String.class);
// 初始化拒单限制脚本
this.rejectLimitScript = new DefaultRedisScript<>();
this.rejectLimitScript.setScriptText(REJECT_LIMIT_SCRIPT);
this.rejectLimitScript.setResultType(Long.class);

90
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/WorkerRewardCacheUtil.java

@ -0,0 +1,90 @@
package cc.hiver.mall.utils;
import cc.hiver.core.common.redis.RedisTemplateHelper;
import cc.hiver.mall.pojo.vo.WorkerRewardVO;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
*/
@Slf4j
@Component
public class WorkerRewardCacheUtil {
/** Redis Key 前缀 */
private static final String KEY_PREFIX = "WORKER_REWARD:";
@Autowired
private RedisTemplateHelper redisTemplateHelper;
// ================================================================
// Key 构建
// ================================================================
private String buildKey(String regionId) {
return KEY_PREFIX + regionId;
}
// ================================================================
// 存放(put)
public void put(String regionId, WorkerRewardVO orderVO) {
if (StringUtils.isBlank(regionId) || orderVO == null || StringUtils.isBlank(orderVO.getRegionId())) {
log.info("FreeOrderCacheUtil.put 参数无效, regionId={}, orderVO={}", regionId, orderVO);
return;
}
try {
String key = buildKey(regionId);
String json = JSONUtil.toJsonStr(orderVO);
redisTemplateHelper.hPut(key, orderVO.getRegionId(), json);
} catch (Exception e) {
log.info("缓存订单免单策略失败: regionId={}, regionId={}", regionId, orderVO.getRegionId(), e);
}
}
/**
*/
public void removeAll(String regionId) {
if (StringUtils.isBlank(regionId)) {
return;
}
try {
redisTemplateHelper.delete(buildKey(regionId));
log.info("清除订单免单缓存: regionId={}", regionId);
} catch (Exception e) {
log.info("清除订单免单缓存失败: regionId={}", regionId, e);
}
}
/**
*/
public WorkerRewardVO get(String regionId) {
if (StringUtils.isBlank(regionId) || StringUtils.isBlank(regionId)) {
return null;
}
try {
String key = buildKey(regionId);
Object value = redisTemplateHelper.hGet(key, regionId);
if (value == null) {
return null;
}
return JSONUtil.toBean(value.toString(), WorkerRewardVO.class);
} catch (Exception e) {
log.info("获取订单免单缓存失败: regionId={}, regionId={}", regionId, regionId, e);
return null;
}
}
/**
* 判断该缓存是否已存在
*/
public boolean exists(String regionId) {
if (StringUtils.isBlank(regionId)) {
return false;
}
Boolean hasKey = redisTemplateHelper.hasKey(buildKey(regionId));
return hasKey != null && hasKey;
}
}

54
hiver-modules/hiver-mall/src/main/resources/mapper/DealingsRecordMapper.xml

@ -6,23 +6,17 @@
<result column="create_by" jdbcType="VARCHAR" property="createBy"/>
<result column="create_by_name" jdbcType="VARCHAR" property="createByName"/>
<result column="create_time" jdbcType="TIMESTAMP" property="createTime"/>
<result column="del_flag" jdbcType="INTEGER" property="delFlag"/>
<result column="update_by" jdbcType="VARCHAR" property="updateBy"/>
<result column="update_time" jdbcType="TIMESTAMP" property="updateTime"/>
<result column="sale_id" jdbcType="VARCHAR" property="saleId"/>
<result column="dealings_user_id" jdbcType="VARCHAR" property="dealingsUserId"/>
<result column="dealings_user_name" jdbcType="VARCHAR" property="dealingsUserName"/>
<result column="user_type" jdbcType="INTEGER" property="userType"/>
<result column="link_id" jdbcType="VARCHAR" property="linkId"/>
<result column="link_type" jdbcType="INTEGER" property="linkType"/>
<result column="amount" jdbcType="DECIMAL" property="amount"/>
<result column="dealings_way" jdbcType="VARCHAR" property="dealingsWay"/>
<result column="balance_due" jdbcType="DECIMAL" property="balanceDue"/>
<result column="shop_id" jdbcType="VARCHAR" property="shopId"/>
<result column="sale_amount" jdbcType="DECIMAL" property="saleAmount"/>
<result column="return_amount" jdbcType="DECIMAL" property="returnAmount"/>
<result column="last_debt_amount" jdbcType="DECIMAL" property="lastDebtAmount"/>
<result column="dealings_type" jdbcType="VARCHAR" property="dealingsType"/>
<result column="dealings_time" jdbcType="TIMESTAMP" property="dealingsTime"/>
<result column="remark" jdbcType="VARCHAR" property="remark"/>
<result column="region_id" jdbcType="VARCHAR" property="regionId"/>
<result column="link_user_id" jdbcType="VARCHAR" property="linkUserId"/>
</resultMap>
<sql id="Example_Where_Clause">
<where>
@ -86,8 +80,7 @@
</sql>
<sql id="Base_Column_List">
id, create_by, create_by_name, create_time, update_time, update_by,
del_flag, sale_id, dealings_user_id, dealings_user_name, user_type, amount,dealings_way,balance_due,shop_id,
sale_amount,return_amount,last_debt_amount,dealings_type,dealings_time,remark
link_id, link_type, amount,dealings_way,dealings_type,dealings_time,remark,region_id,link_user_id
</sql>
<!--getDealingsRecordList-->
@ -96,7 +89,7 @@
<include refid="Base_Column_List"/>
from t_dealings_record
<where>
and sale_id = #{orderId,jdbcType=VARCHAR}
and link_id = #{orderId,jdbcType=VARCHAR}
</where>
ORDER BY
create_time desc
@ -109,8 +102,8 @@
where
<!--20240802 排除掉删除的交易记录-->
del_flag != 2
and user_type ='1'
and shop_id = #{shopId}
and link_type ='1'
and link_id = #{shopId}
and create_time BETWEEN #{startTime} AND #{endTime}
</select>
@ -121,8 +114,8 @@
where
<!--20240802 排除掉删除的交易记录-->
del_flag != 2
and shop_id = #{shopId}
and dealings_user_id = #{userId}
and link_id = #{shopId}
and create_by = #{userId}
order by create_time desc
</select>
@ -131,10 +124,8 @@
<include refid="Base_Column_List"/>
from t_dealings_record
where
<!--20240802 排除掉删除的交易记录-->
del_flag != 2
and user_type ='1'
and shop_id = #{shopId}
link_type ='1'
and link_id = #{shopId}
and create_time BETWEEN #{startTime} AND #{endTime}
order by create_time desc
</select>
@ -142,8 +133,8 @@
<!-- cancelRecord-->
<update id="cancelRecord">
update t_dealings_record
set del_flag = 1
where sale_id = #{saleId}
set update_time = 1
where link_id = #{saleId}
</update>
<select id="getDealingsRecordPageByUserId" resultType="cc.hiver.mall.bill.vo.CustomerBillSaleVo">
@ -192,6 +183,23 @@
order by tdr.create_time desc
</select>
<select id="getDealingsRecordPageByRegionId" resultMap="BaseResultMap">
select *
from
t_dealings_record
where 1=1
<if test='customerBillQueryVo.regionId !=null'>
and region_id = #{customerBillQueryVo.regionId}
</if>
<if test='customerBillQueryVo.linkUserId !=null'>
and link_user_id = #{customerBillQueryVo.linkUserId}
</if>
<if test='customerBillQueryVo.dealingsWay !=null'>
and dealings_way = #{customerBillQueryVo.dealingsWay}
</if>
order by create_time desc
</select>
<select id="getDealingsRecordPageBySupplierId" resultType="cc.hiver.mall.bill.vo.SupplierBillPurchaseVo">
select
tdr.id,

30
hiver-modules/hiver-mall/src/main/resources/mapper/MallDeliveryOrderMapper.xml

@ -201,6 +201,36 @@
WHERE region_id = #{regionId} and worker_id is null and status = 0 group by delivery_type
</select>
<select id="countOrdersLimit" resultType="cc.hiver.core.entity.Worker">
SELECT
COUNT(id) AS orderCount,
MAX(worker_name) AS workerName,
MAX(worker_id) AS workerId-- 使用 MAX 或 MIN 包裹非分组字段
FROM mall_delivery_order
WHERE `status` = 3 and region_id = #{regionId}
AND finish_time >= CURDATE()
GROUP BY worker_id ORDER BY orderCount DESC limit 20;
</select>
<select id="countOrdersWorkerIndex" resultType="java.util.Map">
SELECT
COUNT(id) AS orderCount,
SUM(delivery_fee) as amount
FROM mall_delivery_order
WHERE `status` = 3 and worker_id = #{workerId}
AND finish_time >= CURDATE()
</select>
<select id="countOrdersWorkerIndex" resultType="cc.hiver.core.entity.Worker">
SELECT
COUNT(id) AS orderCount,
MAX(worker_name) AS workerName,
MAX(worker_id) AS workerId-- 使用 MAX 或 MIN 包裹非分组字段
FROM mall_delivery_order
WHERE `status` = 3 and region_id = #{regionId}
AND finish_time >= CURDATE()
GROUP BY worker_id ORDER BY orderCount DESC limit 20;
</select>
<select id="selectByOrderIds" resultMap="deliveryMap">
-- 第一部分:直接查 order_id

9
hiver-modules/hiver-mall/src/main/resources/mapper/MallOrderGoodsMapper.xml

@ -32,6 +32,15 @@
</foreach>
</select>
<select id="selectPagesByOrderIds" resultMap="goodsMap">
SELECT gg.id, gg.order_id, gg.product_id, gg.product_name, gg.product_picture, gg.specs, gg.price, gg.quantity,gg.package_fee
FROM mall_order_goods gg join mall_order o on gg.order_id = o.id
WHERE gg.order_id IN
<foreach collection="orderIds" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</select>
<!-- 按多个订单ID批量查询 -->
<select id="selectByOrderIdsWait" resultMap="goodsMap">
SELECT gg.id, gg.order_id, gg.product_id, gg.product_name, gg.product_picture, gg.specs, gg.price, gg.quantity,gg.package_fee

7
hiver-modules/hiver-mall/src/main/resources/mapper/MallOrderMapper.xml

@ -31,6 +31,8 @@
<result column="shop_make_time" property="shopMakeTime"/>
<result column="other_order" property="otherOrder"/>
<result column="user_require_make" property="userRequireMake"/>
<result column="is_free_order" property="isFreeOrder"/>
<result column="free_amount" property="freeAmount"/>
</resultMap>
<!-- 公共查询条件:店铺ID -->
@ -104,7 +106,7 @@
o.package_fee, o.address_id, o.remark, o.create_time, o.pay_time,
o.receiver_name, o.receiver_phone, o.receiver_address,
o.shop_name, o.shop_phone, o.shop_address,o.number_code,o.region_id,
o.settlement_status,o.shop_make_time,o.other_order,o.user_require_make
o.settlement_status,o.shop_make_time,o.other_order,o.user_require_make,o.is_free_order,o.free_amount
FROM mall_order o
<where>
<if test="q.userId != null and q.userId != ''">
@ -203,7 +205,8 @@
o.status, o.total_amount, o.goods_amount, o.delivery_fee,
o.package_fee, o.address_id, o.remark, o.create_time, o.pay_time,
o.receiver_name, o.receiver_phone, o.receiver_address,
o.shop_name, o.shop_phone, o.shop_address,o.number_code,o.region_id,o.settlement_status,o.shop_make_time,o.other_order,o.user_require_make
o.shop_name, o.shop_phone, o.shop_address,o.number_code,o.region_id,
o.settlement_status,o.shop_make_time,o.other_order,o.user_require_make,o.is_free_order,o.free_amount
FROM mall_order o LEFT JOIN mall_order_group og ON o.id = og.head_order_id
<where>
<if test="groupId != null and groupId != ''">

41
hiver-modules/hiver-mall/src/main/resources/mapper/ReturnCommissionMapper.xml

@ -17,6 +17,8 @@
<result column="shop_after_rebate_amount" jdbcType="DECIMAL" property="shopAfterRebateAmount" />
<result column="ali_name" jdbcType="VARCHAR" property="aliName" />
<result column="ali_account" jdbcType="VARCHAR" property="aliAccount" />
<result column="worker_id" jdbcType="VARCHAR" property="workerId" />
<result column="user_id" jdbcType="VARCHAR" property="userId" />
</resultMap>
<sql id="Example_Where_Clause">
@ -79,7 +81,7 @@
</sql>
<sql id="Base_Column_List">
id, create_by, create_time, del_flag, update_by, update_time, shop_id, commission,
status, fail_message, remark, shop_bef_rebate_amount, shop_after_rebate_amount, ali_account, ali_name
status, fail_message, remark, shop_bef_rebate_amount, shop_after_rebate_amount, ali_account, ali_name,worker_id, user_id
</sql>
<select id="selectByExample" parameterType="cc.hiver.mall.entity.ReturnCommissionExample" resultMap="BaseResultMap">
@ -116,12 +118,13 @@
insert into t_return_commission (id, create_by, create_time,
del_flag, update_by, update_time,
shop_id, commission, status,
fail_message, remark, shop_bef_rebate_amount, shop_after_rebate_amount, ali_account, ali_name)
fail_message, remark, shop_bef_rebate_amount, shop_after_rebate_amount, ali_account, ali_name,worker_id,user_id)
values (#{id,jdbcType=VARCHAR}, #{createBy,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP},
#{delFlag,jdbcType=INTEGER}, #{updateBy,jdbcType=VARCHAR}, #{updateTime,jdbcType=TIMESTAMP},
#{shopId,jdbcType=VARCHAR}, #{commission,jdbcType=DECIMAL}, #{status,jdbcType=VARCHAR},
#{failMessage,jdbcType=VARCHAR}, #{remark,jdbcType=VARCHAR},
#{shopBefRebateAmount,jdbcType=DECIMAL}, #{shopAfterRebateAmount,jdbcType=DECIMAL}, #{aliAccount,jdbcType=VARCHAR}, #{aliName,jdbcType=VARCHAR})
#{shopBefRebateAmount,jdbcType=DECIMAL}, #{shopAfterRebateAmount,jdbcType=DECIMAL},
#{aliAccount,jdbcType=VARCHAR}, #{aliName,jdbcType=VARCHAR}, #{workerId,jdbcType=VARCHAR}, #{userId,jdbcType=VARCHAR})
</insert>
<insert id="insertSelective" parameterType="cc.hiver.mall.entity.ReturnCommission">
insert into t_return_commission
@ -171,6 +174,12 @@
<if test="aliName != null">
ali_name,
</if>
<if test="workerId != null">
worker_id,
</if>
<if test="userId != null">
user_id,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="id != null">
@ -218,6 +227,12 @@
<if test="aliName != null">
#{aliName,jdbcType=VARCHAR},
</if>
<if test="workerId != null">
#{workerId,jdbcType=VARCHAR},
</if>
<if test="userId != null">
#{userId,jdbcType=VARCHAR},
</if>
</trim>
</insert>
<select id="countByExample" parameterType="cc.hiver.mall.entity.ReturnCommissionExample" resultType="java.lang.Long">
@ -274,6 +289,12 @@
<if test="record.aliAccount != null">
ali_account = #{record.aliAccount,jdbcType=VARCHAR},
</if>
<if test="record.workerId != null">
worker_id = #{record.workerId,jdbcType=VARCHAR},
</if>
<if test="record.userId != null">
user_id = #{record.userId,jdbcType=VARCHAR},
</if>
</set>
<if test="_parameter != null">
<include refid="Update_By_Example_Where_Clause" />
@ -295,7 +316,9 @@
shop_bef_rebate_amount = #{record.shopBefRebateAmount,jdbcType=DECIMAL},
shop_after_rebate_amount = #{record.shopAfterRebateAmount,jdbcType=DECIMAL},
ali_name = #{record.aliName,jdbcType=VARCHAR},
ali_account = #{record.aliAccount,jdbcType=VARCHAR}
ali_account = #{record.aliAccount,jdbcType=VARCHAR},
worker_id = #{record.workerId,jdbcType=VARCHAR},
user_id = #{record.userId,jdbcType=VARCHAR}
<if test="_parameter != null">
<include refid="Update_By_Example_Where_Clause" />
</if>
@ -345,6 +368,12 @@
<if test="aliAccount != null">
ali_account = #{record.aliAccount,jdbcType=VARCHAR},
</if>
<if test="workerId != null">
worker_id = #{record.workerId,jdbcType=VARCHAR},
</if>
<if test="userId != null">
user_id = #{record.userId,jdbcType=VARCHAR},
</if>
</set>
where id = #{id,jdbcType=VARCHAR}
</update>
@ -363,7 +392,9 @@
shop_bef_rebate_amount = #{shopBefRebateAmount,jdbcType=DECIMAL},
shop_after_rebate_amount = #{shopAfterRebateAmount,jdbcType=DECIMAL},
ali_name = #{aliName,jdbcType=VARCHAR},
ali_account = #{aliAccount,jdbcType=VARCHAR}
ali_account = #{aliAccount,jdbcType=VARCHAR},
worker_id = #{workerId,jdbcType=VARCHAR},
user_id = #{userId,jdbcType=VARCHAR}
where id = #{id,jdbcType=VARCHAR}
</update>
</mapper>

5
pom.xml

@ -379,11 +379,6 @@
<version>3.8.1</version>
<configuration>
<source>${maven.compiler.source}</source>
<compilerArgs>
<!-- 强制忽略 sun.* 内部类的符号文件检查 -->
<arg>-XDignore.symbol.file</arg>
</compilerArgs>
<fork>true</fork> <!-- 注意:这个参数必须加上,否则不生效 -->
<target>${maven.compiler.target}</target>
<annotationProcessorPaths>
<path>

Loading…
Cancel
Save