From 66688106469fccf9997ebc80b3f825244875b4c1 Mon Sep 17 00:00:00 2001 From: wangfukang <15630117759@163.com> Date: Mon, 11 May 2026 18:12:46 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=B9=E6=8E=A5=E6=8B=BC=E5=9B=A2=E6=95=B0?= =?UTF-8?q?=E6=8D=AE1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hiver-admin/test-output/test-report.html | 14 +- .../constant/DealingsRecordConstant.java | 13 +- .../java/cc/hiver/core/dao/WorkerDao.java | 4 + .../main/java/cc/hiver/core/entity/User.java | 4 + .../java/cc/hiver/core/entity/Worker.java | 7 + .../cc/hiver/core/service/WorkerService.java | 2 + .../core/serviceimpl/WorkerServiceImpl.java | 5 + .../controller/manage/UserController.java | 2 +- .../bill/service/impl/BillServiceImpl.java | 4 +- .../mall/bill/vo/CustomerBillQueryVo.java | 13 +- .../mall/controller/MallCouponController.java | 73 ++++ .../MallDeliveryOrderController.java | 63 ++- .../ReturnCommissionController.java | 207 +++++++++- .../hiver/mall/controller/SaleController.java | 13 - .../mall/controller/SupplierControlller.java | 13 - .../mall/controller/WorkerController.java | 47 ++- .../mall/dao/mapper/DealingsRecordMapper.java | 2 + .../dao/mapper/MallDeliveryOrderMapper.java | 6 + .../mall/dao/mapper/MallOrderGoodsMapper.java | 2 + .../debt/service/impl/DebtServiceImpl.java | 77 ---- .../cc/hiver/mall/entity/DealingsRecord.java | 37 +- .../java/cc/hiver/mall/entity/MallOrder.java | 4 + .../hiver/mall/entity/ReturnCommission.java | 6 + .../cc/hiver/mall/pojo/vo/AdminUserVo.java | 26 ++ .../hiver/mall/pojo/vo/MallOrderFreeVO.java | 26 ++ .../cc/hiver/mall/pojo/vo/MallOrderVO.java | 7 + .../cc/hiver/mall/pojo/vo/WorkerRewardVO.java | 18 + .../mall/quartz/MerchantSettlementTask.java | 25 +- .../hiver/mall/quartz/WorkerRewardTask.java | 108 +++++ .../mybatis/DealingsRecordService.java | 2 + .../mybatis/MallDeliveryOrderService.java | 8 + .../SalesAndDetailsServiceImpl.java | 13 - .../mall/serviceimpl/SupplierServiceImpl.java | 13 - .../mybatis/CustomerServiceImpl.java | 13 - .../mybatis/DealingsRecordServiceImpl.java | 6 + .../mybatis/MallDeliveryOrderServiceImpl.java | 387 +++++++++++++----- .../mybatis/MallOrderGroupServiceImpl.java | 2 + .../mybatis/MallOrderServiceImpl.java | 104 ++++- .../mybatis/MallRefundRecordServiceImpl.java | 122 +++++- .../MallSettlementRecordServiceImpl.java | 17 + .../mybatis/PurchaseServiceImpl.java | 26 -- .../serviceimpl/mybatis/SaleServiceImpl.java | 29 -- .../hiver/mall/utils/FreeOrderCacheUtil.java | 90 ++++ .../hiver/mall/utils/MallOrderFreeUtil.java | 38 ++ .../cc/hiver/mall/utils/RedisLuaScripts.java | 54 ++- .../mall/utils/WorkerRewardCacheUtil.java | 90 ++++ .../resources/mapper/DealingsRecordMapper.xml | 54 +-- .../mapper/MallDeliveryOrderMapper.xml | 30 ++ .../resources/mapper/MallOrderGoodsMapper.xml | 9 + .../main/resources/mapper/MallOrderMapper.xml | 7 +- .../mapper/ReturnCommissionMapper.xml | 41 +- pom.xml | 5 - 52 files changed, 1578 insertions(+), 410 deletions(-) create mode 100644 hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/AdminUserVo.java create mode 100644 hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/MallOrderFreeVO.java create mode 100644 hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/WorkerRewardVO.java create mode 100644 hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/quartz/WorkerRewardTask.java create mode 100644 hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/FreeOrderCacheUtil.java create mode 100644 hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/MallOrderFreeUtil.java create mode 100644 hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/WorkerRewardCacheUtil.java diff --git a/hiver-admin/test-output/test-report.html b/hiver-admin/test-output/test-report.html index efceba0a..4d925ecb 100644 --- a/hiver-admin/test-output/test-report.html +++ b/hiver-admin/test-output/test-report.html @@ -35,7 +35,7 @@ Hiver
  • -ÎåÔÂ 06, 2026 18:07:29 +ÎåÔÂ 09, 2026 15:14:17
  • @@ -84,7 +84,7 @@

    passTest

    -

    18:07:30 ÏÂÎç / 0.016 secs

    +

    15:14:17 ÏÂÎç / 0.016 secs

    @@ -92,8 +92,8 @@
    #test-id=1
    passTest
    -05.06.2026 18:07:30 -05.06.2026 18:07:30 +05.09.2026 15:14:17 +05.09.2026 15:14:17 0.016 secs
    @@ -104,7 +104,7 @@ Pass - 18:07:30 + 15:14:17 Test passed @@ -128,13 +128,13 @@

    Started

    -

    ÎåÔÂ 06, 2026 18:07:29

    +

    ÎåÔÂ 09, 2026 15:14:17

    Ended

    -

    ÎåÔÂ 06, 2026 18:07:30

    +

    ÎåÔÂ 09, 2026 15:14:17

    diff --git a/hiver-core/src/main/java/cc/hiver/core/common/constant/DealingsRecordConstant.java b/hiver-core/src/main/java/cc/hiver/core/common/constant/DealingsRecordConstant.java index 3fa39e40..a38e443b 100644 --- a/hiver-core/src/main/java/cc/hiver/core/common/constant/DealingsRecordConstant.java +++ b/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}; } diff --git a/hiver-core/src/main/java/cc/hiver/core/dao/WorkerDao.java b/hiver-core/src/main/java/cc/hiver/core/dao/WorkerDao.java index cb630622..4264f859 100644 --- a/hiver-core/src/main/java/cc/hiver/core/dao/WorkerDao.java +++ b/hiver-core/src/main/java/cc/hiver/core/dao/WorkerDao.java @@ -15,6 +15,10 @@ public interface WorkerDao extends HiverBaseDao { 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); diff --git a/hiver-core/src/main/java/cc/hiver/core/entity/User.java b/hiver-core/src/main/java/cc/hiver/core/entity/User.java index 3dc6c4f1..24d921f1 100644 --- a/hiver-core/src/main/java/cc/hiver/core/entity/User.java +++ b/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); } diff --git a/hiver-core/src/main/java/cc/hiver/core/entity/Worker.java b/hiver-core/src/main/java/cc/hiver/core/entity/Worker.java index f5593495..fd978bdc 100644 --- a/hiver-core/src/main/java/cc/hiver/core/entity/Worker.java +++ b/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-å·²ç¦ç”¨(手工预置状æ€) */ diff --git a/hiver-core/src/main/java/cc/hiver/core/service/WorkerService.java b/hiver-core/src/main/java/cc/hiver/core/service/WorkerService.java index 65f5881f..497cbf92 100644 --- a/hiver-core/src/main/java/cc/hiver/core/service/WorkerService.java +++ b/hiver-core/src/main/java/cc/hiver/core/service/WorkerService.java @@ -32,6 +32,8 @@ public interface WorkerService extends HiverBaseService { Worker findByWorkerId(String workerId); + void changeLocation(String workerId, String geolocation); + List getWXByCondition(WorkerQueryVO worker); /** diff --git a/hiver-core/src/main/java/cc/hiver/core/serviceimpl/WorkerServiceImpl.java b/hiver-core/src/main/java/cc/hiver/core/serviceimpl/WorkerServiceImpl.java index 7d310f94..be65f64c 100644 --- a/hiver-core/src/main/java/cc/hiver/core/serviceimpl/WorkerServiceImpl.java +++ b/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 getWXByCondition(WorkerQueryVO worker) { final List workerList = workerDao.findAll(new Specification() { diff --git a/hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/manage/UserController.java b/hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/manage/UserController.java index 0839cf66..b3480f8b 100644 --- a/hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/manage/UserController.java +++ b/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 workerRelaPriceList = workerRelaPriceService.selectByWorkerId(worker.getWorkerId()); List workerRelaPriceListWaimai = new ArrayList<>(); List workerRelaPriceListKuaidi = new ArrayList<>(); diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/bill/service/impl/BillServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/bill/service/impl/BillServiceImpl.java index c6755601..00a07a7b 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/bill/service/impl/BillServiceImpl.java +++ b/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())); // èŽ·å–æœ¬æœŸå…¨éƒ¨æ¬ æ¬¾åŠæ‹¿è´§æ€»é‡‘é¢ diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/bill/vo/CustomerBillQueryVo.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/bill/vo/CustomerBillQueryVo.java index 0e189bef..ffccd6ed 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/bill/vo/CustomerBillQueryVo.java +++ b/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; } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/MallCouponController.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/MallCouponController.java index b83628f1..e8b5b107 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/MallCouponController.java +++ b/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> list(MallCouponQuery query) { return new ResultUtil>().setData(mallUserCouponService.selectPageVO(query)); } + @PostMapping("/addFreeOrder") + @ApiOperation(value = "å¼€å¯å…å•优惠") + public Result 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 selectFreeOrder(@RequestParam String regionId) { + return ResultUtil.data(freeOrderCacheUtil.get(regionId)); + } + + @PostMapping("/closeFreeOrder") + @ApiOperation(value = "关闭å…å•优惠") + public Result closeFreeOrder(@RequestBody MallOrderFreeVO freeOrder) { + if(freeOrderCacheUtil.exists(freeOrder.getRegionId())){ + freeOrderCacheUtil.removeAll(freeOrder.getRegionId()); + } + return ResultUtil.success("关闭å…å•优惠æˆåŠŸ"); + } + + @PostMapping("/addWorkerReward") + @ApiOperation(value = "å¼€å¯é…é€å‘˜å¥–励") + public Result 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 selectWorkerReward(@RequestParam String regionId) { + return ResultUtil.data(workerRewardCacheUtil.get(regionId)); + } + + @PostMapping("/closeWorkerReward") + @ApiOperation(value = "关闭é…é€å‘˜å¥–励") + public Result closeWorkerReward(@RequestBody WorkerRewardVO freeOrder) { + if(workerRewardCacheUtil.exists(freeOrder.getRegionId())){ + workerRewardCacheUtil.removeAll(freeOrder.getRegionId()); + } + return ResultUtil.success("关闭é…é€å‘˜å¥–励æˆåŠŸ"); + } + + @PostMapping("/selectRewardByRegionId") + @ApiOperation(value = "奖励记录") + public Result> selectRewardByRegionId(@RequestBody CustomerBillQueryVo customerBillQueryVo) { + final Page dealingRecordPage = dealingsRecordService.getDealingsRecordPageByRegionId(customerBillQueryVo); + return new ResultUtil>().setData(dealingRecordPage); + } } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/MallDeliveryOrderController.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/MallDeliveryOrderController.java index 35cd46b5..1d2514ca 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/MallDeliveryOrderController.java +++ b/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>>().setData(mallDeliveryOrderService.countOrdersByStatus(workerId, regionId)); } + @PostMapping("/countOrderByStatusIndex") + @ApiOperation(value = "查询当å‰é…é€å‘˜ä¸»é¡µæ•°é‡") + public Result>> countOrderByStatusIndex(@RequestParam(value = "workerId") String workerId, + @RequestParam(value = "regionId") String regionId) { + List> result = mallDeliveryOrderService.countOrdersByStatus1(workerId, regionId); + //查询é…é€å‘˜ä»Šæ—¥æ•°æ® + Map workerIndex = new HashMap<>(); + workerIndex.put("workerIndex", mallDeliveryOrderService.countOrdersWorkerIndex(workerId)); + workerIndex.put("status", 5); + result.add(workerIndex); + return new ResultUtil>>().setData(result); + } + @PostMapping("/pagebyworker") @ApiOperation(value = "分页查询é…é€å‘˜é…é€å•") public Result pageByWorker(@RequestBody MallDeliveryOrderPageQuery q) { @@ -171,17 +195,17 @@ public class MallDeliveryOrderController { */ @PostMapping("/accept") @ApiOperation(value = "é…é€å‘˜æŽ¥å•", notes = "抢å•å¤§åŽ…å•æˆ–指派å•å‡é€šè¿‡æ­¤æŽ¥å£æŽ¥å•") - public Result accept(@RequestParam String deliveryId,@RequestParam String geolocation, + public Result 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> countOrdersLimit(@RequestParam(value = "regionId")String regionId) { + Map result = new HashMap<>(); + WorkerRewardVO vo = workerRewardCacheUtil.get(regionId); + if(vo != null){ + String rules = vo.getRules(); + List rewardRules = JSON.parseArray(rules, WorkerRewardTask.RewardRule.class); + result.put("reward", rewardRules); + } + + result.put("data", mallDeliveryOrderService.countOrdersLimit(regionId)); + return new ResultUtil>().setData(result); + } } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/ReturnCommissionController.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/ReturnCommissionController.java index a0a84b25..1caa674c 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/ReturnCommissionController.java +++ b/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("支付å®è½¬è´¦å¤±è´¥"); diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/SaleController.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/SaleController.java index 2fbf3fa5..e1027972 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/SaleController.java +++ b/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); diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/SupplierControlller.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/SupplierControlller.java index aee470d3..fd4273e9 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/SupplierControlller.java +++ b/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); diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/WorkerController.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/WorkerController.java index 464e9536..8fb09ac5 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/WorkerController.java +++ b/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 list = workerRelaPriceMapper.getOnlineWorkerCountByCanteenArea(parentId); return new ResultUtil>().setData(list); } + + @RequestMapping(value = "/getByWorkerId", method = RequestMethod.GET) + @ApiOperation(value = "查询é…é€å‘˜ä¿¡æ¯") + public Result getByWorkerId(@RequestParam(value = "workerId")String workerId) { + return new ResultUtil().setData(workerService.findByWorkerId(workerId)); + } + + @RequestMapping(value = "/getAllDepo", method = RequestMethod.GET) + @ApiOperation(value = "查询个人信æ¯ä»¥åŠè´¦æˆ·ä½™é¢") + public Result getAllDepo(@RequestParam(value = "userId")String userId) { + User user = userService.findById(userId); + Worker worker = workerService.findByUserId(userId); + List shops = shopService.getShopByUserid(userId); + AdminUserVo vo = new AdminUserVo(); + vo.setWorker(worker); + vo.setShop(shops); + vo.setUser(user); + return new ResultUtil().setData(vo); + } } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/DealingsRecordMapper.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/DealingsRecordMapper.java index ddac8b5e..09bad721 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/DealingsRecordMapper.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/DealingsRecordMapper.java @@ -50,6 +50,8 @@ public interface DealingsRecordMapper extends BaseMapper { */ Page getDealingsRecordPageByUserId(Page page, @Param("customerBillQueryVo") CustomerBillQueryVo customerBillQueryVo); + Page getDealingsRecordPageByRegionId(Page page, @Param("customerBillQueryVo") CustomerBillQueryVo customerBillQueryVo); + /** * 分页获å–供应商交易记录 * diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/MallDeliveryOrderMapper.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/MallDeliveryOrderMapper.java index 4ff38334..6af26329 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/MallDeliveryOrderMapper.java +++ b/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 { List> countOrdersByType(@Param("regionId") String regionId); + List countOrdersLimit(@Param("regionId") String regionId); + List> countOrdersByStatus(@Param("workerId") String workerId); MallDeliveryOrder selectByGroupId(@Param("orderId") String orderId); List selectByOrderIds(@Param("ids") List ids); + HashMap countOrdersWorkerIndex(@Param("workerId") String workerId); + } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/MallOrderGoodsMapper.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/MallOrderGoodsMapper.java index eab33210..e9b80bff 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/MallOrderGoodsMapper.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/MallOrderGoodsMapper.java @@ -23,6 +23,8 @@ public interface MallOrderGoodsMapper extends BaseMapper { */ List selectByOrderIds(@Param("orderIds") List orderIds); + List selectPagesByOrderIds(@Param("orderIds") List orderIds); + /** * 按订å•IDé›†åˆæ‰¹é‡æŸ¥è¯¢ */ diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/debt/service/impl/DebtServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/debt/service/impl/DebtServiceImpl.java index aa4d0e03..47d46c71 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/debt/service/impl/DebtServiceImpl.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/debt/service/impl/DebtServiceImpl.java @@ -138,18 +138,10 @@ public class DebtServiceImpl extends ServiceImpl 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 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 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 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 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 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 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); diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/DealingsRecord.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/DealingsRecord.java index 9f260e29..32ce2930 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/DealingsRecord.java +++ b/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") diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallOrder.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallOrder.java index 70b32bbf..dbc49350 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallOrder.java +++ b/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 diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/ReturnCommission.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/ReturnCommission.java index cbffc95e..9110fcb5 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/ReturnCommission.java +++ b/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; diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/AdminUserVo.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/AdminUserVo.java new file mode 100644 index 00000000..eb7fcdcf --- /dev/null +++ b/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; +} diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/MallOrderFreeVO.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/MallOrderFreeVO.java new file mode 100644 index 00000000..37072dae --- /dev/null +++ b/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; +} diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/MallOrderVO.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/MallOrderVO.java index f948180c..2f050355 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/MallOrderVO.java +++ b/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; diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/WorkerRewardVO.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/WorkerRewardVO.java new file mode 100644 index 00000000..eb6fd999 --- /dev/null +++ b/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; +} diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/quartz/MerchantSettlementTask.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/quartz/MerchantSettlementTask.java index 23327e3e..aaa77af4 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/quartz/MerchantSettlementTask.java +++ b/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 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; } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/quartz/WorkerRewardTask.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/quartz/WorkerRewardTask.java new file mode 100644 index 00000000..c8ab3745 --- /dev/null +++ b/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 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 rewardRules = JSON.parseArray(rules, RewardRule.class); + + // 查询该区域é…é€å‘˜æŽ’å (å‡è®¾è¿”回的Listå·²ç»æ˜¯æŒ‰æŽ¥å•é‡é™åºæŽ’好åºçš„) + List 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; // å¥–åŠ±é‡‘é¢ + } +} diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/DealingsRecordService.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/DealingsRecordService.java index e66007d1..d8a39b2a 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/DealingsRecordService.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/DealingsRecordService.java @@ -45,6 +45,8 @@ public interface DealingsRecordService extends IService { */ Page getDealingsRecordPageByUserId(CustomerBillQueryVo customerBillQueryVo); + Page getDealingsRecordPageByRegionId(CustomerBillQueryVo customerBillQueryVo); + /** * 对账å•åˆ†é¡µèŽ·å– * diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/MallDeliveryOrderService.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/MallDeliveryOrderService.java index 4ee8f009..b549cc11 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/MallDeliveryOrderService.java +++ b/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 { */ long countWaitGrabOrders(int deliveryType); + List countOrdersLimit(String regionId); + List> countOrdersByType(String regionId); List> countOrdersByStatus(String workerId,String regionId); + List> countOrdersByStatus1(String workerId,String regionId); + /** * 用户增加é…é€è´¹ï¼ˆåœ¨çŽ°æœ‰ deliveryFee 基础上追加) * @param additionalFee 追加的é…é€è´¹é‡‘é¢ @@ -85,4 +91,6 @@ public interface MallDeliveryOrderService extends IService { MallOrder insertDeliveryOrder(MallDeliveryOrder deliveryOrder); List selectByOrderIds(List ids); + + HashMap countOrdersWorkerIndex(String workerId); } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/SalesAndDetailsServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/SalesAndDetailsServiceImpl.java index 4aaa2d38..1be8bdaa 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/SalesAndDetailsServiceImpl.java +++ b/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); diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/SupplierServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/SupplierServiceImpl.java index e6a9cdd3..0bd7d04c 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/SupplierServiceImpl.java +++ b/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); diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/CustomerServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/CustomerServiceImpl.java index cae4bab5..0ff0797b 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/CustomerServiceImpl.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/CustomerServiceImpl.java @@ -175,19 +175,6 @@ public class CustomerServiceImpl extends ServiceImpl 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); diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/DealingsRecordServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/DealingsRecordServiceImpl.java index 476f8b82..91e282c2 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/DealingsRecordServiceImpl.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/DealingsRecordServiceImpl.java @@ -67,6 +67,12 @@ public class DealingsRecordServiceImpl extends ServiceImpl getDealingsRecordPageByRegionId(CustomerBillQueryVo customerBillQueryVo) { + final Page page = new Page<>(customerBillQueryVo.getPageNum(), customerBillQueryVo.getPageSize()); + return dealingsRecordMapper.getDealingsRecordPageByRegionId(page, customerBillQueryVo); + } + @Override public Page getDealingsRecordPageBySupplierId(SupplierBillQueryVo supplierBillQueryVo) { final Page page = new Page<>(supplierBillQueryVo.getPageNum(), supplierBillQueryVo.getPageSize()); diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallDeliveryOrderServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallDeliveryOrderServiceImpl.java index 6c8f325b..3e24e6db 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallDeliveryOrderServiceImpl.java +++ b/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 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 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 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 pushOrderIds = new ArrayList<>(); + + if (delivery.getGroupId() != null) { + // ---- 有 groupId ---- LambdaQueryWrapper gq = new LambdaQueryWrapper<>(); gq.eq(MallOrderGroup::getId, delivery.getGroupId()); MallOrderGroup group = mallOrderGroupMapper.selectOne(gq); - if(group.getIsFace() == 1){ + + if (group.getIsFace() == 1) { + // ---- é¢å¯¹é¢æ‹¼å›¢ ---- List orderIds = Arrays.asList(group.getGroupOrderIds().split(",")); orderIdsSend = orderIds; - // 2. 一次 IN æŸ¥è¯¢æ‰€æœ‰å•†å“æ˜Žç»† + // ä¸€æ¬¡æ‰¹é‡æŸ¥è¯¢æ‰€æœ‰å•†å“明细 goodsList = mallOrderGoodsMapper.selectByOrderIds(orderIds); + // æ‰¹é‡æŸ¥è¯¢æ‰€æœ‰å­è®¢å•,é¿å…循环内 N+1 + List orderInnerList = mallOrderService.listByIds(orderIds); + Map orderInnerMap = new HashMap<>(orderInnerList.size()); + for (MallOrder o : orderInnerList) { + orderInnerMap.put(o.getId(), o); + } + + // æ”¶é›†éœ€è¦æ›´æ–°çš„è®¢å• idï¼Œæ‰¹é‡ UPDATE + List toUpdateOrderIds = new ArrayList<>(); + Map 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 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 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 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 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 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 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 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 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 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 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 countOrdersLimit(String regionId) { + return this.baseMapper.countOrdersLimit(regionId); + } + @Override public List> countOrdersByType(String regionId) { return this.baseMapper.countOrdersByType(regionId); @@ -720,6 +810,78 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl> countOrdersByStatus1(String workerId,String regionId) { + List> returnList = new ArrayList<>(); + // ---- 从订å•缓存获å–该é…é€å‘˜çš„待完æˆè®¢å•,统计å„çŠ¶æ€æ•°é‡ ---- + List 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 newRecord = new HashMap<>(); + newRecord.put("status", 0); // çŠ¶æ€ + newRecord.put("orderCount", orderWaitCount); + returnList.add(newRecord); + + Map newRecord1 = new HashMap<>(); + newRecord1.put("status", 1); // çŠ¶æ€ + newRecord1.put("orderCount", orderGetCount); + returnList.add(newRecord1); + + Map newRecord2 = new HashMap<>(); + newRecord2.put("status", 2); // çŠ¶æ€ + newRecord2.put("orderCount", orderPutCount); + returnList.add(newRecord2); + }else{ + returnList = this.baseMapper.countOrdersByStatus(workerId); + } + + Integer pendingBadReviewCount = 0; + List all = refundOrderCacheUtil.getAll(workerId); + if(all != null){ + pendingBadReviewCount = all.size(); + }else{ + //查待售åŽå¾…退款数 + MallRefundRecordPageQuery q = new MallRefundRecordPageQuery(); + q.setPageSize(PAGE_SIZE); + IPage page = new Page<>(q.getPageNum(), q.getPageSize()); + q.setLinkId(workerId); + List statusList = new ArrayList<>(); + statusList.add(STATUS_WAIT_ACCEPT); + statusList.add(STATUS_DONE); + q.setStatusList(statusList); + IPage result = mallRefundRecordService.selectPageVO(q); + if(result != null && !result.getRecords().isEmpty()){ + pendingBadReviewCount = result.getRecords().size(); + } + } + Map newRecord = new HashMap<>(); + newRecord.put("status", STATUS_DONE); // çŠ¶æ€ + newRecord.put("orderCount", pendingBadReviewCount); + returnList.add(newRecord); + + Integer pendingBadReviewCount1 = 0; + List all1 = commentCacheUtil.getAll(workerId); + if(all1 != null){ + pendingBadReviewCount1 += all1.size(); + }else{ + //查询待回å¤å·®è¯„ + pendingBadReviewCount1 += mallOrderMapper.selectPendingBadReviewCount(workerId); + } + Map 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 selectByOrderIds(List ids) { return this.baseMapper.selectByOrderIds(ids); } + + @Override + public HashMap countOrdersWorkerIndex(String workerId) { + return this.baseMapper.countOrdersWorkerIndex(workerId); + } } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderGroupServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderGroupServiceImpl.java index bdfef8bc..1ca1311d 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderGroupServiceImpl.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderGroupServiceImpl.java @@ -190,6 +190,8 @@ public class MallOrderGroupServiceImpl extends ServiceImpl 去掉 workerId 进入抢å•大厅,ä¿ç•™åŽŸæœ‰è¡¥è´´é‡‘ delivery.setWorkerId(""); + delivery.setWorkerPhone(""); + delivery.setWorkerName(""); smsUtil.sendCode(delivery.getReceiverPhone(), null, SettingConstant.SMS_TYPE.SMS_WORKEROUT.name()); } } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderServiceImpl.java index 56f89638..fc0d2841 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderServiceImpl.java +++ b/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 allGoods = mallOrderGoodsMapper.selectByOrderIds(orderIds); + List allGoods = mallOrderGoodsMapper.selectPagesByOrderIds(orderIds); // 3. 按 orderId 分组 java.util.Map> goodsMap = allGoods.stream() @@ -1225,6 +1326,7 @@ public class MallOrderServiceImpl extends ServiceImpl commentsPage = commentService.getCommentList(commentQuery); List parentIds = new ArrayList<>(); diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallRefundRecordServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallRefundRecordServiceImpl.java index 57bd41a0..4b962cc7 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallRefundRecordServiceImpl.java +++ b/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= 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= 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= 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= 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{ //订å•è¿˜æ˜¯å˜æˆå·²å®ŒæˆçŠ¶æ€ diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallSettlementRecordServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallSettlementRecordServiceImpl.java index 3b173c45..e1f892da 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallSettlementRecordServiceImpl.java +++ b/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 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 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); } // 作废当å‰è®¢å•的欠款记录 diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/SaleServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/SaleServiceImpl.java index 1f788395..4ea3a999 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/SaleServiceImpl.java +++ b/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 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 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); } // 作废当å‰è®¢å•的欠款记录 diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/FreeOrderCacheUtil.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/FreeOrderCacheUtil.java new file mode 100644 index 00000000..1b55cb27 --- /dev/null +++ b/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; + } +} diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/MallOrderFreeUtil.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/MallOrderFreeUtil.java new file mode 100644 index 00000000..dd74d08b --- /dev/null +++ b/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; + }*/ +} \ No newline at end of file diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/RedisLuaScripts.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/RedisLuaScripts.java index c264dc16..29ba42f1 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/RedisLuaScripts.java +++ b/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 incrementScript; + private final DefaultRedisScript checkScript; + + public DefaultRedisScript getIncrementScript() { + return incrementScript; + } + + public DefaultRedisScript 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 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); diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/WorkerRewardCacheUtil.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/WorkerRewardCacheUtil.java new file mode 100644 index 00000000..08eec877 --- /dev/null +++ b/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; + } +} diff --git a/hiver-modules/hiver-mall/src/main/resources/mapper/DealingsRecordMapper.xml b/hiver-modules/hiver-mall/src/main/resources/mapper/DealingsRecordMapper.xml index c0e7fd6a..839874ed 100644 --- a/hiver-modules/hiver-mall/src/main/resources/mapper/DealingsRecordMapper.xml +++ b/hiver-modules/hiver-mall/src/main/resources/mapper/DealingsRecordMapper.xml @@ -6,23 +6,17 @@ - - - - - + + - - - - - + + @@ -86,8 +80,7 @@ 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 @@ -96,7 +89,7 @@ from t_dealings_record - and sale_id = #{orderId,jdbcType=VARCHAR} + and link_id = #{orderId,jdbcType=VARCHAR} ORDER BY create_time desc @@ -109,8 +102,8 @@ where 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} @@ -121,8 +114,8 @@ where 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 @@ -131,10 +124,8 @@ from t_dealings_record where - - 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 @@ -142,8 +133,8 @@ update t_dealings_record - set del_flag = 1 - where sale_id = #{saleId} + set update_time = 1 + where link_id = #{saleId} + + + + + + + + + @@ -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 into t_return_commission @@ -171,6 +174,12 @@ ali_name, + + worker_id, + + + user_id, + @@ -218,6 +227,12 @@ #{aliName,jdbcType=VARCHAR}, + + #{workerId,jdbcType=VARCHAR}, + + + #{userId,jdbcType=VARCHAR}, +