1、增加配送师傅订单派送发送消息通知功能

2、增加普通商品配完成送结算步梯费用给到配送师傅业务功能
3、增加分销商查询个人资金流水功能
This commit is contained in:
2026-05-27 10:56:55 +08:00
parent ba3748d2f9
commit b9d0d6b036
30 changed files with 405 additions and 56 deletions

View File

@@ -22,6 +22,7 @@ public enum ShopDealerCapitalUpdateEnum {
FREEZE_MONEY_THAW(50, "佣金解冻", true),
DELIVERY_REWARD(60, "配送奖励", true),
DELIVERY_INCOME(61, "配送提成", true),
DELIVERY_FLOOR_FEE(62, "配送步梯费", true),
ORDER_REFUND(70, "佣金退回(退单)", false),
;

View File

@@ -10,6 +10,7 @@ import com.gxwebsoft.common.core.web.PageResult;
import com.gxwebsoft.common.system.entity.User;
import com.gxwebsoft.common.system.mapper.UserMapper;
import com.gxwebsoft.glt.dto.GltTransferOrderDto;
import com.gxwebsoft.glt.dto.NoticeRiderNewOrderDto;
import com.gxwebsoft.glt.entity.GltTicketOrder;
import com.gxwebsoft.glt.param.GltTicketOrderDeliveredParam;
import com.gxwebsoft.glt.param.GltTicketOrderParam;
@@ -178,14 +179,6 @@ public class GltTicketOrderController extends BaseController {
}
gltTicketOrderService.createWithWriteOff(gltTicketOrder, loginUser.getUserId(), loginUser.getTenantId());
// 订单创建成功后,异步通知所有在线配送员有新订单
try {
notifyRidersOfNewOrder(gltTicketOrder, loginUser.getTenantId());
} catch (Exception e) {
log.warn("通知配送员失败(不影响下单): {}", e.getMessage());
}
return success("下单成功");
}
@@ -244,8 +237,14 @@ public class GltTicketOrderController extends BaseController {
}
}
}
}
log.info("已向 {} 位配送员发送新订单通知", riders.size());
@PreAuthorize("isAuthenticated()")
@Operation(summary = "配送员调度单通知")
@PostMapping("/sendRiderNewOrderNotice")
public ApiResult<?> sendRiderNewOrderNotice(@RequestBody NoticeRiderNewOrderDto noticeRiderNewOrderDto) {
gltSubscribeMessageService.sendRiderNewOrderNotice(noticeRiderNewOrderDto);
return success("发送消息成功!");
}
@PreAuthorize("isAuthenticated()")

View File

@@ -0,0 +1,35 @@
package com.gxwebsoft.glt.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
/**
* 配送员新订单配送通知
*
*/
@Data
@Schema(name = "ShopOrderMyVerifyDto", description = "配送员新订单配送通知")
public class NoticeRiderNewOrderDto {
@Schema(description = "订单号")
private String orderNo;
@Schema(description = "商品名称")
private String goodsName;
@Schema(description = "配送数量")
private Integer productCount;
@Schema(description = "期望送达时间")
private LocalDateTime createTime;
@Schema(description = "租户ID")
private Integer tenantId;
@Schema(description = "openID")
private String openId;
}

View File

@@ -1,5 +1,6 @@
package com.gxwebsoft.glt.service;
import com.gxwebsoft.glt.dto.NoticeRiderNewOrderDto;
import com.gxwebsoft.glt.entity.GltTicketOrder;
/**
@@ -25,4 +26,10 @@ public interface GltSubscribeMessageService {
* @return 是否发送成功
*/
boolean sendOrderStatusNotice(GltTicketOrder order, String riderOpenId, String statusText, Integer tenantId);
/**
* 推送配送师傅接单提醒
* @param noticeRiderNewOrderDto
*/
void sendRiderNewOrderNotice(NoticeRiderNewOrderDto noticeRiderNewOrderDto);
}

View File

@@ -1,14 +1,11 @@
package com.gxwebsoft.glt.service.impl;
import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl;
import cn.binarywang.wx.miniapp.config.WxMaConfig;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.gxwebsoft.common.core.exception.BusinessException;
import com.gxwebsoft.common.core.utils.RedisUtil;
import com.gxwebsoft.glt.dto.NoticeRiderNewOrderDto;
import com.gxwebsoft.glt.entity.GltTicketOrder;
import com.gxwebsoft.glt.service.GltSubscribeMessageService;
import lombok.extern.slf4j.Slf4j;
@@ -19,7 +16,8 @@ import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
import static com.gxwebsoft.common.core.constants.RedisConstants.*;
import static com.gxwebsoft.common.core.constants.RedisConstants.ACCESS_TOKEN_KEY;
import static com.gxwebsoft.common.core.constants.RedisConstants.MP_WX_KEY;
/**
* 微信订阅消息服务实现
@@ -43,7 +41,34 @@ public class GltSubscribeMessageServiceImpl implements GltSubscribeMessageServic
* 模板名称:订单配送通知
* 关键词:订单编号、订单内容、配送地址、订单金额
*/
private static final String ORDER_DELIVERY_ID = "vSMSqGVy3aG1RuzQUZlk2y5sWiTFY_hewF5-R-uYwMk";
private static final String ORDER_DELIVERY_ID = "vSMSqGVy3aG1RuzQUZlk282p5hCvuMBcHvix1AFhN90";
public void sendRiderNewOrderNotice(NoticeRiderNewOrderDto entity){
//1.获取微信accessToken
String accessToken = getAccessToken(entity.getTenantId());
if(accessToken == null){
log.error("配送发单消息发生失败获取accessToken失败");
return;
}
//2.品名字段最大能发送20个长度字符大于15的长度需做处理
String goodsName = entity.getGoodsName();
int keepLength = 15;
if (goodsName.length() > keepLength) {
entity.setGoodsName(goodsName.substring(0, keepLength) + "...");
}
//3.组装入参
Map<String, Object> data = new HashMap<>();
data.put("character_string1", Map.of("value", String.valueOf(entity.getOrderNo())));
data.put("thing22", Map.of("value", String.valueOf(entity.getGoodsName())));
data.put("number20", Map.of("value", String.valueOf(entity.getProductCount())));
data.put("time24", Map.of("value", String.valueOf(entity.getCreateTime())));
//推送订阅消息
sendSubscribeMessage(accessToken, entity.getOpenId(), data);
}
/**
* 发送新订单通知给配送员
@@ -65,7 +90,7 @@ public class GltSubscribeMessageServiceImpl implements GltSubscribeMessageServic
// 构建消息内容
Map<String, Object> data = new HashMap<>();
data.put("phrase1", Map.of("value", "待配送")); // 订单状态
data.put("character_string2", Map.of("value", String.valueOf(order.getId()))); // 订单编号
data.put("character_string2", Map.of("value", String.valueOf(order.getOrderNo()))); // 订单编号
data.put("thing3", Map.of("value", truncateStr(order.getAddress(), 20))); // 配送地址
data.put("number4", Map.of("value", String.valueOf(order.getTotalNum()))); // 商品数量
data.put("time5", Map.of("value", formatTime(order.getSendTime()))); // 期望送达时间
@@ -208,14 +233,14 @@ public class GltSubscribeMessageServiceImpl implements GltSubscribeMessageServic
.body();
JSONObject result = JSON.parseObject(response);
int errcode = result.getIntValue("errcode");
int errCode = result.getIntValue("errcode");
if (errcode == 0) {
if (errCode == 0) {
log.info("订阅消息发送成功 - openId={}", openId);
return true;
} else {
log.warn("订阅消息发送失败 - openId={}, errcode={}, errmsg={}",
openId, errcode, result.getString("errmsg"));
openId, errCode, result.getString("errmsg"));
return false;
}
}

View File

@@ -16,12 +16,14 @@ import com.gxwebsoft.common.system.entity.User;
import com.gxwebsoft.common.system.mapper.UserMapper;
import com.gxwebsoft.common.system.redis.OrderNoUtils;
import com.gxwebsoft.glt.dto.GltTransferOrderDto;
import com.gxwebsoft.glt.dto.NoticeRiderNewOrderDto;
import com.gxwebsoft.glt.entity.GltTicketOrder;
import com.gxwebsoft.glt.entity.GltUserTicket;
import com.gxwebsoft.glt.entity.GltUserTicketLog;
import com.gxwebsoft.glt.mapper.GltTicketOrderMapper;
import com.gxwebsoft.glt.mapper.GltUserTicketMapper;
import com.gxwebsoft.glt.param.GltTicketOrderParam;
import com.gxwebsoft.glt.service.GltSubscribeMessageService;
import com.gxwebsoft.glt.service.GltTicketOrderService;
import com.gxwebsoft.glt.service.GltUserTicketLogService;
import com.gxwebsoft.glt.service.GltUserTicketService;
@@ -107,6 +109,9 @@ public class GltTicketOrderServiceImpl extends ServiceImpl<GltTicketOrderMapper,
@Resource
private ShopStoreRiderMapper shopStoreRiderMapper;
@Resource
private GltSubscribeMessageService gltSubscribeMessageService;
// 轮询指针(高并发安全)
private final AtomicInteger index = new AtomicInteger(0);
@@ -254,6 +259,29 @@ public class GltTicketOrderServiceImpl extends ServiceImpl<GltTicketOrderMapper,
throw new BusinessException("写入核销记录失败");
}
//发送配送师傅派单配送消息
if(gltTicketOrder.getRiderId() != null){
User user = userMapper.getById(gltTicketOrder.getRiderId());
if(user != null){
NoticeRiderNewOrderDto noticeDto = new NoticeRiderNewOrderDto();
noticeDto.setOrderNo(gltTicketOrder.getOrderNo());
noticeDto.setGoodsName("商品信息见订单详情");
noticeDto.setProductCount(gltTicketOrder.getTotalNum());
noticeDto.setCreateTime(gltTicketOrder.getCreateTime());
noticeDto.setTenantId(tenantId);
noticeDto.setOpenId(user.getOpenid());
ShopOrder shopOrder = shopOrderService.getByOrderNo(gltTicketOrder.getOrderNo(), tenantId);
if(shopOrder != null){
Integer formId = shopOrder.getFormId();
ShopGoods shopGoods = shopGoodsMapper.selectById(formId);
if(shopGoods != null){
noticeDto.setGoodsName(shopGoods.getName());
}
}
gltSubscribeMessageService.sendRiderNewOrderNotice(noticeDto);
}
}
return gltTicketOrder;
}
@@ -748,6 +776,29 @@ public class GltTicketOrderServiceImpl extends ServiceImpl<GltTicketOrderMapper,
dispatchOrder.setUpdateTime(now);
baseMapper.insert(dispatchOrder);
//推送配送师傅接单提醒
if(dispatchOrder.getRiderId() != null){
User user = userMapper.getById(dispatchOrder.getRiderId());
if(user != null){
NoticeRiderNewOrderDto noticeDto = new NoticeRiderNewOrderDto();
noticeDto.setOrderNo(dispatchOrder.getOrderNo());
noticeDto.setGoodsName("商品信息见订单详情");
noticeDto.setProductCount(dispatchOrder.getTotalNum());
noticeDto.setCreateTime(dispatchOrder.getCreateTime());
noticeDto.setTenantId(tenantId);
noticeDto.setOpenId(user.getOpenid());
if(shopOrder != null){
Integer formId = shopOrder.getFormId();
ShopGoods shopGoods = shopGoodsMapper.selectById(formId);
if(shopGoods != null){
noticeDto.setGoodsName(shopGoods.getName());
}
}
gltSubscribeMessageService.sendRiderNewOrderNotice(noticeDto);
}
}
}
}
return Boolean.TRUE;
@@ -861,6 +912,7 @@ public class GltTicketOrderServiceImpl extends ServiceImpl<GltTicketOrderMapper,
}
}
ShopOrder order = shopOrderService.getByOrderNo(userTicket.getOrderNo(), userTicket.getTenantId());
//生成配送师傅可提现账户分佣金额数据【配送奖励(按商品设置)、配送提成(每桶0.1)】
int qty = ticketOrder.getTotalNum() == null ? 0 : ticketOrder.getTotalNum();
if (qty > 0) { //配送提成(每桶0.1)
@@ -872,7 +924,11 @@ public class GltTicketOrderServiceImpl extends ServiceImpl<GltTicketOrderMapper,
reduceDto.setTypeEnum(ShopDealerTypeEnum.WITHDRAW_ACCOUNT);
reduceDto.setUserId(ticketOrder.getRiderId());
reduceDto.setOrderUserId(ticketOrder.getUserId());
reduceDto.setOrderNo(ticketOrder.getNo());
if(Arrays.asList(1, 3).contains(order.getOrderType())){
reduceDto.setOrderNo(order.getOrderNo());
}else {
reduceDto.setOrderNo(ticketOrder.getNo());
}
reduceDto.setPrice(money);
reduceDto.setUpdateEnum(ShopDealerCapitalUpdateEnum.DELIVERY_INCOME);
shopDealerUserService.reduceBalance(reduceDto);
@@ -882,7 +938,6 @@ public class GltTicketOrderServiceImpl extends ServiceImpl<GltTicketOrderMapper,
//配送奖励(按商品设置)
Integer goodsId = userTicket.getGoodsId();
ShopGoods shopGood = shopGoodsMapper.selectById(goodsId);
ShopOrder order = shopOrderService.getByOrderNo(userTicket.getOrderNo(), userTicket.getTenantId());
if(shopGood != null && order != null){
Integer commissionType = shopGood.getCommissionType();
BigDecimal money = BigDecimal.ZERO;
@@ -896,13 +951,29 @@ public class GltTicketOrderServiceImpl extends ServiceImpl<GltTicketOrderMapper,
reduceDto.setTypeEnum(ShopDealerTypeEnum.WITHDRAW_ACCOUNT);
reduceDto.setUserId(ticketOrder.getRiderId());
reduceDto.setOrderUserId(ticketOrder.getUserId());
reduceDto.setOrderNo(ticketOrder.getNo());
if(Arrays.asList(1, 3).contains(order.getOrderType())){
reduceDto.setOrderNo(order.getOrderNo());
}else {
reduceDto.setOrderNo(ticketOrder.getNo());
}
reduceDto.setPrice(money);
reduceDto.setUpdateEnum(ShopDealerCapitalUpdateEnum.DELIVERY_REWARD);
shopDealerUserService.reduceBalance(reduceDto);
}
}
//配送费结算
if(Arrays.asList(1, 3).contains(order.getOrderType()) && order.getDeliveryFee().compareTo(BigDecimal.ZERO) > 0){
ShopDealerUserReduceDto reduceDto = new ShopDealerUserReduceDto();
reduceDto.setTypeEnum(ShopDealerTypeEnum.WITHDRAW_ACCOUNT);
reduceDto.setUserId(ticketOrder.getRiderId());
reduceDto.setOrderUserId(ticketOrder.getUserId());
reduceDto.setOrderNo(order.getOrderNo());
reduceDto.setPrice(order.getDeliveryFee());
reduceDto.setUpdateEnum(ShopDealerCapitalUpdateEnum.DELIVERY_FLOOR_FEE);
shopDealerUserService.reduceBalance(reduceDto);
}
//查询未完成订单,完成资金解冻
if(order != null && order.getOrderStatus() == 0){
ShopDealerUserReduceDto reduceDto = new ShopDealerUserReduceDto();

View File

@@ -35,7 +35,7 @@ public class GltTicketOrderAutoDispatch10584Task {
@Value("${glt.ticket.dispatch10584.batchSize:50}")
private int batchSize;
@Scheduled(cron = "${glt.ticket.dispatch10584.cron:0/20 * * * * ?}")
// @Scheduled(cron = "${glt.ticket.dispatch10584.cron:0/20 * * * * ?}")
@IgnoreTenant("定时任务无登录态,需忽略租户隔离;内部使用 tenantId=10584 精确过滤")
public void run() {
if (!running.compareAndSet(false, true)) {

View File

@@ -6,9 +6,11 @@ import com.gxwebsoft.common.core.web.BaseController;
import com.gxwebsoft.common.core.web.BatchParam;
import com.gxwebsoft.common.core.web.PageResult;
import com.gxwebsoft.common.system.entity.User;
import com.gxwebsoft.shop.dto.ShopDealerCapitalWaterDto;
import com.gxwebsoft.shop.entity.ShopDealerCapital;
import com.gxwebsoft.shop.param.ShopDealerCapitalParam;
import com.gxwebsoft.shop.service.ShopDealerCapitalService;
import com.gxwebsoft.shop.vo.ShopDealerCapitalWaterVO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springdoc.api.annotations.ParameterObject;
@@ -39,6 +41,14 @@ public class ShopDealerCapitalController extends BaseController {
return success(shopDealerCapitalService.pageRel(param));
}
@PreAuthorize("hasAuthority('shop:shopDealerCapital:list')")
@Operation(summary = "分页查询分销商个人流水")
@GetMapping("/myCapitalWater")
public ApiResult<PageResult<ShopDealerCapitalWaterVO>> myCapitalWater(ShopDealerCapitalWaterDto waterDto) {
// 使用关联查询
return success(shopDealerCapitalService.myCapitalWater(waterDto));
}
@PreAuthorize("hasAuthority('shop:shopDealerCapital:list')")
@Operation(summary = "查询全部分销商资金明细表")
@GetMapping()

View File

@@ -51,6 +51,13 @@ public class ShopVerifyUserController extends BaseController {
return success(shopVerifyUserService.getByIdRel(id));
}
// @PreAuthorize("hasAuthority('shop:shopVerifyUser:list')")
@Operation(summary = "根据用户ID查询订单核销人管理")
@GetMapping("/getByUserId")
public ApiResult<ShopVerifyUser> getByUserId(@RequestParam("userId") Integer userId) {
return success(shopVerifyUserService.getInfo(userId));
}
// @PreAuthorize("hasAuthority('shop:shopVerifyUser:save')")
@OperationLog
@Operation(summary = "添加订单核销人管理")

View File

@@ -0,0 +1,28 @@
package com.gxwebsoft.shop.dto;
import com.gxwebsoft.common.core.web.BaseParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
/**
* 查询个人流水
*
*/
@Data
@Schema(name = "ShopDealerCapitalWaterDto", description = "查询个人流水")
public class ShopDealerCapitalWaterDto extends BaseParam {
@Schema(description = "用户ID")
@NotEmpty(message = "用户ID不能为空")
private Integer userId;
@Schema(description = "起始时间", example = "2026-05-01")
private String dateStart;
@Schema(description = "结束时间", example = "2026-05-31")
private String dateEnd;
}

View File

@@ -51,6 +51,13 @@ public class ShopActiveImage implements Serializable {
@Schema(description = "排序")
private Integer sortNumber;
@Schema(description = "跳转商品ID")
private Integer goodsId;
@Schema(description = "跳转商品名称")
@TableField(exist = false)
private String goodsName;
@Schema(description = "租户ID")
@NotNull(message = "租户ID不能为空")
private Integer tenantId;

View File

@@ -49,7 +49,7 @@ public class ShopDealerCapital implements Serializable {
@TableField(exist = false)
private Integer orderStatus;
@Schema(description = "资金流动类型 (10分销收入 11团队管理津贴收入 12分红收入 13现场推广收入 20提现支出 30转账支出 40转账收入 50佣金解冻 60配送奖励 70佣金退回【退单】)")
@Schema(description = "资金流动类型 (10分销收入 11团队管理津贴收入 12分红收入 13现场推广收入 14现场推广分佣 20提现支出 30转账支出 40转账收入 50佣金解冻 60配送奖励 61配送提成 62配送步梯费 70佣金退回【退单】)")
private Integer flowType;
@Schema(description = "变更金额")

View File

@@ -194,6 +194,9 @@ public class ShopGoods implements Serializable {
@Schema(description = "水票ID")
private Integer waterTickerId;
@Schema(description = "0-按每桶楼层计算 1-固定金额")
private Integer deliveryFeeType;
@Schema(description = "配送楼层步梯费(元)")
private BigDecimal deliveryFee;

View File

@@ -34,10 +34,13 @@ public class ShopVerifyUser implements Serializable {
private String userName;
@Schema(description = "核销权限是否开启 0-未开启 1-已开启")
private Boolean verifyFlag;
private Integer verifyFlag;
@Schema(description = "是否开启 0-未开始 1-已开启")
private Boolean status;
private Integer status;
@Schema(description = "排序号")
private Integer sortNumber;
@Schema(description = "创建人")
private Integer creator;

View File

@@ -2,8 +2,11 @@ package com.gxwebsoft.shop.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.gxwebsoft.shop.dto.ShopDealerCapitalWaterDto;
import com.gxwebsoft.shop.entity.ShopDealerCapital;
import com.gxwebsoft.shop.param.ShopDealerCapitalParam;
import com.gxwebsoft.shop.vo.ShopDealerCapitalWaterVO;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@@ -34,4 +37,12 @@ public interface ShopDealerCapitalMapper extends BaseMapper<ShopDealerCapital> {
*/
List<ShopDealerCapital> selectListRel(@Param("param") ShopDealerCapitalParam param);
/**
* 查询个人资金流水
* @param page
* @param entity
* @return
*/
IPage<ShopDealerCapitalWaterVO> getPageInfo(@Param("page") Page page, @Param("entity") ShopDealerCapitalWaterDto entity);
}

View File

@@ -55,5 +55,23 @@
<select id="selectListRel" resultType="com.gxwebsoft.shop.entity.ShopDealerCapital">
<include refid="selectSql"></include>
</select>
<select id="getPageInfo" resultType="com.gxwebsoft.shop.vo.ShopDealerCapitalWaterVO">
SELECT
no,
order_no,
flow_type,
money,
freeze_money,
comments,
create_time
FROM
shop_dealer_capital
WHERE
user_id = #{entity.userId}
<if test="entity.dateStart != null and entity.dateEnd != null">
AND DATE(create_time) BETWEEN #{entity.dateStart} AND #{entity.dateEnd}
</if>
ORDER BY create_time DESC
</select>
</mapper>

View File

@@ -169,8 +169,8 @@ public class ShopGoodsParam extends BaseParam {
@Schema(description = "水票ID")
private Integer waterTickerId;
@Schema(description = "商品大类 1-水 2-茶叶 3-酒 4-香水")
private Integer categoryType;
@Schema(description = "0-按每桶楼层计算 1-固定金额")
private Integer deliveryFeeType;
@Schema(description = "租户id")
private Integer tenantId;

View File

@@ -352,7 +352,12 @@ public class OrderBusinessService {
//自配送才计算步梯费用业务【选择步梯配送方式、配送楼层大于1楼、商品已设置配送费】
if(Arrays.asList(1, 3).contains(shopOrder.getOrderType()) && shopOrder.getDeliveryMethod() == 1 && shopOrder.getDeliveryFloor() > 1
&& shopGoods.getDeliveryFee().compareTo(BigDecimal.ZERO) > 0){
BigDecimal deliveryFee = BigDecimal.valueOf(shopOrder.getDeliveryFloor() - 1).multiply(shopGoods.getDeliveryFee()).multiply(BigDecimal.valueOf(goodsItem.getQuantity()));
BigDecimal deliveryFee = BigDecimal.ZERO;
if(shopGoods.getDeliveryFeeType() == 0 ){
deliveryFee = BigDecimal.valueOf(shopOrder.getDeliveryFloor() - 1).multiply(shopGoods.getDeliveryFee()).multiply(BigDecimal.valueOf(goodsItem.getQuantity()));
}else if(shopOrder.getDeliveryFloor() > 1){
deliveryFee = shopGoods.getDeliveryFee();
}
if(deliveryFee.compareTo(BigDecimal.ZERO) > 0){
shopOrder.setDeliveryFee(deliveryFee);
shopOrder.setTotalPrice(shopOrder.getTotalPrice().add(deliveryFee));

View File

@@ -2,8 +2,10 @@ package com.gxwebsoft.shop.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.gxwebsoft.common.core.web.PageResult;
import com.gxwebsoft.shop.dto.ShopDealerCapitalWaterDto;
import com.gxwebsoft.shop.entity.ShopDealerCapital;
import com.gxwebsoft.shop.param.ShopDealerCapitalParam;
import com.gxwebsoft.shop.vo.ShopDealerCapitalWaterVO;
import java.util.List;
@@ -23,6 +25,13 @@ public interface ShopDealerCapitalService extends IService<ShopDealerCapital> {
*/
PageResult<ShopDealerCapital> pageRel(ShopDealerCapitalParam param);
/**
* 分页查询分销商个人流水
* @param waterDto
* @return
*/
PageResult<ShopDealerCapitalWaterVO> myCapitalWater(ShopDealerCapitalWaterDto waterDto);
/**
* 关联查询全部
*

View File

@@ -39,6 +39,13 @@ public interface ShopVerifyUserService extends IService<ShopVerifyUser> {
*/
ShopVerifyUser getByIdRel(Integer id);
/**
* 通过用户ID查询
* @param userId
* @return
*/
ShopVerifyUser getInfo(Integer userId);
/**
* 修改订单核销人开启状态
* @param id 主键ID

View File

@@ -5,7 +5,9 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.gxwebsoft.common.core.web.PageParam;
import com.gxwebsoft.common.core.web.PageResult;
import com.gxwebsoft.shop.entity.ShopActiveImage;
import com.gxwebsoft.shop.entity.ShopGoods;
import com.gxwebsoft.shop.mapper.ShopActiveImageMapper;
import com.gxwebsoft.shop.mapper.ShopGoodsMapper;
import com.gxwebsoft.shop.param.ShopActiveImageParam;
import com.gxwebsoft.shop.service.ShopActiveImageService;
import lombok.AllArgsConstructor;
@@ -14,6 +16,7 @@ import org.springframework.stereotype.Service;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
* 推广码底图Service实现
@@ -25,16 +28,30 @@ import java.util.List;
@AllArgsConstructor
public class ShopActiveImageServiceImpl extends ServiceImpl<ShopActiveImageMapper, ShopActiveImage> implements ShopActiveImageService {
private ShopGoodsMapper shopGoodsMapper;
@Override
public PageResult<ShopActiveImage> pageRel(ShopActiveImageParam param) {
PageParam<ShopActiveImage, ShopActiveImageParam> page = new PageParam<>(param);
page.setDefaultOrder("sort_number asc, create_time desc");
List<ShopActiveImage> list = baseMapper.selectPageRel(page, param);
if(CollectionUtils.isNotEmpty(list)){
List<Integer> goodsIdList = list.stream().filter(shopActiveImage -> shopActiveImage.getGoodsId() != null).map(ShopActiveImage::getGoodsId)
.distinct().collect(Collectors.toList());
List<ShopGoods> shopGoodsList = shopGoodsMapper.selectBatchIds(goodsIdList);
list.forEach(shopActiveImage -> {
if(!StringUtils.isEmpty(shopActiveImage.getImgUrl())){
shopActiveImage.setImgUrlList(Arrays.asList(shopActiveImage.getImgUrl().split(",")));
}
//回显商品名称
if(shopActiveImage.getGoodsId() != null){
ShopGoods shopGoods = shopGoodsList.stream().filter(goods -> shopActiveImage.getGoodsId().equals(goods.getGoodsId())).findFirst().orElse(null);
if(shopGoods != null){
shopActiveImage.setGoodsName(shopGoods.getName());
}
}
});
}
return new PageResult<>(list, page.getTotal());

View File

@@ -1,14 +1,24 @@
package com.gxwebsoft.shop.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.gxwebsoft.common.core.exception.BusinessException;
import com.gxwebsoft.common.core.exception.enums.GlobalErrorCodeConstants;
import com.gxwebsoft.common.core.utils.LoginUserUtil;
import com.gxwebsoft.common.system.entity.User;
import com.gxwebsoft.shop.dto.ShopDealerCapitalWaterDto;
import com.gxwebsoft.shop.mapper.ShopDealerCapitalMapper;
import com.gxwebsoft.shop.service.ShopDealerCapitalService;
import com.gxwebsoft.shop.entity.ShopDealerCapital;
import com.gxwebsoft.shop.param.ShopDealerCapitalParam;
import com.gxwebsoft.common.core.web.PageParam;
import com.gxwebsoft.common.core.web.PageResult;
import com.gxwebsoft.shop.vo.ShopDealerCapitalWaterVO;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
/**
@@ -28,6 +38,27 @@ public class ShopDealerCapitalServiceImpl extends ServiceImpl<ShopDealerCapitalM
return new PageResult<>(list, page.getTotal());
}
@Override
public PageResult<ShopDealerCapitalWaterVO> myCapitalWater(ShopDealerCapitalWaterDto entity) {
PageResult<ShopDealerCapitalWaterVO> pageResult = new PageResult<>();
User loginUser = LoginUserUtil.getLoginUser();
if(loginUser == null){
throw new BusinessException(GlobalErrorCodeConstants.UNAUTHORIZED.getMsg());
}
entity.setUserId(loginUser.getUserId());
IPage<ShopDealerCapitalWaterVO> pageInfo = baseMapper.getPageInfo(new Page<>(entity.getPage(), entity.getLimit()), entity);
if(CollectionUtils.isNotEmpty(pageInfo.getRecords())){
List<ShopDealerCapitalWaterVO> records = pageInfo.getRecords();
pageResult.setList(records);
pageResult.setCount(pageInfo.getTotal());
}else {
pageResult.setCount(0l);
pageResult.setList(new ArrayList<>());
}
return pageResult;
}
@Override
public List<ShopDealerCapital> listRel(ShopDealerCapitalParam param) {
List<ShopDealerCapital> list = baseMapper.selectListRel(param);

View File

@@ -120,6 +120,7 @@ public class ShopDealerUserServiceImpl extends ServiceImpl<ShopDealerUserMapper,
case PROMOTION_PARENT_INCOME:
case TRANSFER_INCOME:
case DELIVERY_REWARD:
case DELIVERY_FLOOR_FEE:
case DELIVERY_INCOME:{
break;
}
@@ -281,8 +282,8 @@ public class ShopDealerUserServiceImpl extends ServiceImpl<ShopDealerUserMapper,
.in(ShopDealerCapital::getFlowType, Arrays.asList(ShopDealerCapitalUpdateEnum.DISTRIBUTION_INCOME.getType(),
ShopDealerCapitalUpdateEnum.MANAGEMENT_INCOME.getType(), ShopDealerCapitalUpdateEnum.DIVIDEND_INCOME.getType(),
ShopDealerCapitalUpdateEnum.PROMOTION_INCOME.getType(), ShopDealerCapitalUpdateEnum.PROMOTION_PARENT_INCOME.getType(),
ShopDealerCapitalUpdateEnum.FREEZE_MONEY_THAW.getType(),
ShopDealerCapitalUpdateEnum.DELIVERY_INCOME.getType(), ShopDealerCapitalUpdateEnum.DELIVERY_REWARD.getType()))
ShopDealerCapitalUpdateEnum.FREEZE_MONEY_THAW.getType(), ShopDealerCapitalUpdateEnum.DELIVERY_INCOME.getType(),
ShopDealerCapitalUpdateEnum.DELIVERY_REWARD.getType()), ShopDealerCapitalUpdateEnum.DELIVERY_FLOOR_FEE.getType())
.isNotNull(ShopDealerCapital::getUserId)
);

View File

@@ -44,7 +44,6 @@ public class ShopOrderGoodsServiceImpl extends ServiceImpl<ShopOrderGoodsMapper,
@Override
public List<ShopOrderGoods> listRel(ShopOrderGoodsParam param) {
List<ShopOrderGoods> list = baseMapper.selectListRel(param);
//根据订单ID查询活动并回显对应名称、订单核销码
Integer orderId = param.getOrderId();
if(orderId != null){
@@ -55,6 +54,7 @@ public class ShopOrderGoodsServiceImpl extends ServiceImpl<ShopOrderGoodsMapper,
saleActivity = shopFlashSaleActivityMapper.selectById(order.getActivityId());
}
for(ShopOrderGoods orderGoods : list){
orderGoods.setOrderStatus(order.getOrderStatus());
orderGoods.setVerifyCode(order.getVerifyCode());
if(saleActivity != null){
if(orderGoods.getGoodsId().equals(saleActivity.getGoodsId())){

View File

@@ -12,6 +12,7 @@ import com.gxwebsoft.common.core.config.SpringContextUtil;
import com.gxwebsoft.common.core.context.TenantContext;
import com.gxwebsoft.common.core.enums.ShopDealerCapitalUpdateEnum;
import com.gxwebsoft.common.core.enums.ShopDealerTypeEnum;
import com.gxwebsoft.common.core.exception.BusinessException;
import com.gxwebsoft.common.core.exception.enums.GlobalErrorCodeConstants;
import com.gxwebsoft.common.core.service.EnvironmentAwarePaymentService;
import com.gxwebsoft.common.core.service.PaymentCacheService;
@@ -488,37 +489,37 @@ public class ShopOrderServiceImpl extends ServiceImpl<ShopOrderMapper, ShopOrder
//1.判断用户是否登录
User loginUser = LoginUserUtil.getLoginUser();
if(loginUser == null){
throw new RuntimeException(GlobalErrorCodeConstants.UNAUTHORIZED.getMsg());
throw new BusinessException(GlobalErrorCodeConstants.UNAUTHORIZED.getMsg());
}
//2.判断是否有核销权限
Integer verifyType = verifyDto.getVerifyType();
if(verifyType == 2){
ShopVerifyUser verifyUser = shopVerifyUserMapper.selectOne(new LambdaQueryWrapper<ShopVerifyUser>().eq(ShopVerifyUser::getUserId, loginUser.getUserId()));
if(!(verifyUser != null && verifyUser.getVerifyFlag() && verifyUser.getStatus())){
throw new RuntimeException("暂无核销权限!");
if(!(verifyUser != null && verifyUser.getVerifyFlag() == 1 && verifyUser.getStatus() == 1)){
throw new BusinessException("暂无核销权限!");
}
}
//3.查询订单信息
ShopOrder shopOrder = baseMapper.selectOne(new LambdaQueryWrapper<ShopOrder>().eq(ShopOrder::getVerifyCode, verifyDto.getVerifyCode()));
if(shopOrder == null){
throw new RuntimeException(GlobalErrorCodeConstants.NOT_FOUND.getMsg());
throw new BusinessException(GlobalErrorCodeConstants.NOT_FOUND.getMsg());
}
//4.判断当前订单状态是否允许核销
if(Arrays.asList(2,3,4,6,7).contains(shopOrder.getOrderStatus())){
throw new RuntimeException("订单当前状态不可核销!");
throw new BusinessException("订单当前状态不可核销!");
}
//5.判断订单是否已支付
if(!shopOrder.getPayStatus()){
throw new RuntimeException("订单未支付,不可核销!");
throw new BusinessException("订单未支付,不可核销!");
}
//6.判断是否已核销
if(shopOrder.getVerifyStatus() != null && shopOrder.getVerifyStatus() == 1){
throw new RuntimeException("此订单已核销,无需重复核销!");
throw new BusinessException("此订单已核销,无需重复核销!");
}
shopOrder.setVerifyStatus(1);
@@ -624,7 +625,7 @@ public class ShopOrderServiceImpl extends ServiceImpl<ShopOrderMapper, ShopOrder
}
return baseMapper.updateById(shopOrder) > 0;
}catch (Exception e){
throw new RuntimeException("核销失败:" + e.getMessage());
throw new BusinessException("核销失败:" + e.getMessage());
}
}

View File

@@ -36,7 +36,7 @@ public class ShopVerifyUserServiceImpl extends ServiceImpl<ShopVerifyUserMapper,
@Override
public PageResult<ShopVerifyUser> pageRel(ShopVerifyUserParam param) {
PageParam<ShopVerifyUser, ShopVerifyUserParam> page = new PageParam<>(param);
page.setDefaultOrder("create_time desc");
page.setDefaultOrder("sort_number asc, create_time desc");
List<ShopVerifyUser> list = baseMapper.selectPageRel(page, param);
if(CollectionUtils.isNotEmpty(list)){
List<Integer> userIdList = list.stream().map(ShopVerifyUser::getUserId).distinct().collect(Collectors.toList());
@@ -90,15 +90,24 @@ public class ShopVerifyUserServiceImpl extends ServiceImpl<ShopVerifyUserMapper,
return verifyUser;
}
@Override
public ShopVerifyUser getInfo(Integer userId) {
List<ShopVerifyUser> list = lambdaQuery().eq(ShopVerifyUser::getUserId, userId).list();
if(CollectionUtils.isNotEmpty(list)){
return list.get(0);
}
return null;
}
@Override
public Boolean updateStatus(Integer id) {
ShopVerifyUser verifyUser = baseMapper.selectById(id);
if(verifyUser != null){
Boolean status = verifyUser.getStatus();
if(status){
verifyUser.setStatus(false);
Integer status = verifyUser.getStatus();
if(status == 0){
verifyUser.setStatus(1);
}else {
verifyUser.setStatus(true);
verifyUser.setStatus(0);
}
verifyUser.setUpdateTime(LocalDateTime.now());
User loginUser = LoginUserUtil.getLoginUser();
@@ -114,11 +123,11 @@ public class ShopVerifyUserServiceImpl extends ServiceImpl<ShopVerifyUserMapper,
public Boolean updateVerifyFlag(Integer id) {
ShopVerifyUser verifyUser = baseMapper.selectById(id);
if(verifyUser != null){
Boolean verifyFlag = verifyUser.getVerifyFlag();
if(verifyFlag){
verifyUser.setVerifyFlag(false);
Integer verifyFlag = verifyUser.getVerifyFlag();
if(verifyFlag == 0){
verifyUser.setVerifyFlag(1);
}else {
verifyUser.setVerifyFlag(true);
verifyUser.setVerifyFlag(0);
}
verifyUser.setUpdateTime(LocalDateTime.now());
User loginUser = LoginUserUtil.getLoginUser();

View File

@@ -28,7 +28,7 @@ public class CouponExpireTask {
* 生产环境每天凌晨2点执行
* 开发环境每10分钟执行一次用于测试
*/
@Scheduled(cron = "${coupon.expire.cron:0 0 2 * * ?}")
// @Scheduled(cron = "${coupon.expire.cron:0 0 2 * * ?}")
public void processExpiredCoupons() {
log.info("开始执行过期优惠券处理任务...");
@@ -57,7 +57,7 @@ public class CouponExpireTask {
* 每小时执行一次优惠券状态检查(可选)
* 用于及时发现和处理刚过期的优惠券
*/
@Scheduled(cron = "0 0 * * * ?")
// @Scheduled(cron = "0 0 * * * ?")
public void hourlyExpiredCouponsCheck() {
// 只在生产环境执行
if (!"prod".equals(activeProfile)) {

View File

@@ -0,0 +1,45 @@
package com.gxwebsoft.shop.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* 查询个人流水
*
*/
@Data
@Schema(name = "ShopDealerCapitalWaterVO", description = "查询个人流水")
public class ShopDealerCapitalWaterVO {
@Schema(description = "订单编号")
private String no;
@Schema(description = "关联订单编号")
private String orderNo;
@Schema(description = "资金流动类型 (10分销收入 11团队管理津贴收入 12分红收入 13现场推广收入 14现场推广分佣 20提现支出 30转账支出 40转账收入 50佣金解冻 60配送奖励 61配送提成 62配送步梯费 70佣金退回【退单】)")
private Integer flowType;
@Schema(description = "变更金额")
private BigDecimal money;
@Schema(description = "变更后金额")
private BigDecimal moneyAfter;
@Schema(description = "变更冻结金额")
private BigDecimal freezeMoney;
@Schema(description = "变更冻结后金额")
private BigDecimal freezeMoneyAfter;
@Schema(description = "描述")
private String comments;
@Schema(description = "创建时间")
private LocalDateTime createTime;
}

View File

@@ -14,8 +14,8 @@ spring:
# redis
redis:
database: 0
host: 8.134.55.105
port: 16379
host: 1Panel-redis-GmNr
port: 6379
password: redis_t74P8C
# 日志配置

View File

@@ -15,9 +15,8 @@ spring:
redis:
database: 0
host: 8.134.55.105
port: 16379
password: redis_t74P8C
host: localhost
port: 6379
# 日志配置
logging: