diff --git a/src/main/java/com/gxwebsoft/common/core/config/MybatisPlusConfig.java b/src/main/java/com/gxwebsoft/common/core/config/MybatisPlusConfig.java index 9018256..e8e7a91 100644 --- a/src/main/java/com/gxwebsoft/common/core/config/MybatisPlusConfig.java +++ b/src/main/java/com/gxwebsoft/common/core/config/MybatisPlusConfig.java @@ -80,6 +80,7 @@ public class MybatisPlusConfig { @Override public boolean ignoreTable(String tableName) { + TenantContext.setIgnoreTenant(Boolean.TRUE); // 如果当前上下文设置了忽略租户隔离,则忽略所有表的租户隔离 if (TenantContext.isIgnoreTenant()) { return true; diff --git a/src/main/java/com/gxwebsoft/common/system/mapper/UserMapper.java b/src/main/java/com/gxwebsoft/common/system/mapper/UserMapper.java index 99a32c6..47f9746 100644 --- a/src/main/java/com/gxwebsoft/common/system/mapper/UserMapper.java +++ b/src/main/java/com/gxwebsoft/common/system/mapper/UserMapper.java @@ -70,4 +70,11 @@ public interface UserMapper extends BaseMapper { @InterceptorIgnore(tenantLine = "true") List listByAlert(); + + /** + * 批量查询用户信息 + * @param userIdList 用户ID集合 + * @return + */ + List selectByUserIdList(@Param("userIdList") List userIdList); } diff --git a/src/main/java/com/gxwebsoft/common/system/mapper/xml/UserMapper.xml b/src/main/java/com/gxwebsoft/common/system/mapper/xml/UserMapper.xml index 4196c93..d9a1921 100644 --- a/src/main/java/com/gxwebsoft/common/system/mapper/xml/UserMapper.xml +++ b/src/main/java/com/gxwebsoft/common/system/mapper/xml/UserMapper.xml @@ -263,5 +263,22 @@ + diff --git a/src/main/java/com/gxwebsoft/glt/controller/GltTicketOrderController.java b/src/main/java/com/gxwebsoft/glt/controller/GltTicketOrderController.java index f928a07..e2b1e54 100644 --- a/src/main/java/com/gxwebsoft/glt/controller/GltTicketOrderController.java +++ b/src/main/java/com/gxwebsoft/glt/controller/GltTicketOrderController.java @@ -9,6 +9,7 @@ import com.gxwebsoft.common.core.web.BatchParam; 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.entity.GltTicketOrder; import com.gxwebsoft.glt.param.GltTicketOrderDeliveredParam; import com.gxwebsoft.glt.param.GltTicketOrderParam; @@ -23,6 +24,7 @@ import cn.hutool.core.util.StrUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; +import org.springdoc.api.annotations.ParameterObject; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; @@ -56,7 +58,7 @@ public class GltTicketOrderController extends BaseController { @Operation(summary = "分页查询送水订单") @GetMapping("/page") - public ApiResult> page(GltTicketOrderParam param) { + public ApiResult> page(@ParameterObject GltTicketOrderParam param) { // 使用关联查询 return success(gltTicketOrderService.pageRel(param)); } @@ -260,6 +262,13 @@ public class GltTicketOrderController extends BaseController { return success("接单成功"); } + @PreAuthorize("isAuthenticated()") + @Operation(summary = "配送员转单") + @PostMapping("/transferOrder") + public ApiResult transferOrder(@RequestBody GltTransferOrderDto orderDto) { + return success(gltTicketOrderService.transferOrder(orderDto)); + } + @PreAuthorize("isAuthenticated()") @Operation(summary = "配送员开始配送") @PostMapping("/{id}/start") diff --git a/src/main/java/com/gxwebsoft/glt/dto/GltTransferOrderDto.java b/src/main/java/com/gxwebsoft/glt/dto/GltTransferOrderDto.java new file mode 100644 index 0000000..b653b98 --- /dev/null +++ b/src/main/java/com/gxwebsoft/glt/dto/GltTransferOrderDto.java @@ -0,0 +1,25 @@ +package com.gxwebsoft.glt.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; + +/** + * 转单请求类 + * + */ +@Data +@Schema(name = "ShopOrderMyVerifyDto", description = "转单请求类") +public class GltTransferOrderDto { + + @Schema(description = "订单ID") + @NotEmpty(message = "订单ID不能为空!") + private Integer id; + + @Schema(description = "转单用户ID") + @NotEmpty(message = "转单用户ID不能为空!") + private Integer userId; + +} + diff --git a/src/main/java/com/gxwebsoft/glt/mapper/xml/GltTicketOrderMapper.xml b/src/main/java/com/gxwebsoft/glt/mapper/xml/GltTicketOrderMapper.xml index 8fa4c3c..396237f 100644 --- a/src/main/java/com/gxwebsoft/glt/mapper/xml/GltTicketOrderMapper.xml +++ b/src/main/java/com/gxwebsoft/glt/mapper/xml/GltTicketOrderMapper.xml @@ -11,7 +11,7 @@ d.name as receiverName, d.phone as receiverPhone, d.province as receiverProvince, d.city as receiverCity, d.region as receiverRegion, d.address as receiverAddress, d.full_address as receiverFullAddress, d.lat as receiverLat, d.lng as receiverLng, - COALESCE(o.order_no, f.order_no) as orderNo, o.order_status as orderStatus + COALESCE(o.order_no, a.order_no) as orderNo, o.order_status as orderStatus FROM glt_ticket_order a LEFT JOIN shop_store b ON a.store_id = b.id LEFT JOIN shop_store_warehouse w ON a.warehouse_id = w.id @@ -88,7 +88,7 @@ AND a.create_time <= #{param.createTimeEnd} - AND (a.id = #{param.orderNo} OR COALESCE(o.order_no, f.order_no) = #{param.orderNo}) + AND (a.id = #{param.orderNo} OR COALESCE(o.order_no, a.order_no) = #{param.orderNo}) AND u.phone = #{param.phone} diff --git a/src/main/java/com/gxwebsoft/glt/service/GltTicketIssueService.java b/src/main/java/com/gxwebsoft/glt/service/GltTicketIssueService.java index f4358ec..247f7ab 100644 --- a/src/main/java/com/gxwebsoft/glt/service/GltTicketIssueService.java +++ b/src/main/java/com/gxwebsoft/glt/service/GltTicketIssueService.java @@ -1,10 +1,7 @@ package com.gxwebsoft.glt.service; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.gxwebsoft.glt.entity.GltTicketTemplate; -import com.gxwebsoft.glt.entity.GltUserTicket; -import com.gxwebsoft.glt.entity.GltUserTicketLog; -import com.gxwebsoft.glt.entity.GltUserTicketRelease; +import com.gxwebsoft.glt.entity.*; import com.gxwebsoft.glt.task.DealerOrderSettlement10584Task; import com.gxwebsoft.shop.entity.ShopOrder; import com.gxwebsoft.shop.entity.ShopOrderGoods; @@ -18,6 +15,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.support.TransactionTemplate; +import javax.annotation.Resource; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; @@ -37,6 +35,9 @@ import java.util.concurrent.atomic.AtomicBoolean; @RequiredArgsConstructor public class GltTicketIssueService { + @Resource + private GltTicketOrderService gltTicketOrderService; + public static final int CHANGE_TYPE_ISSUE = 10; private enum IssueOutcome { @@ -144,6 +145,9 @@ public class GltTicketIssueService { //3.执行平台分红业务 TODO 待开发 + //4.普通商品【非水票订单】如果是需要自配送的,则会同步生成派单信息 + gltTicketOrderService.dispatchOrder(orderNo, tenantId); + } /** diff --git a/src/main/java/com/gxwebsoft/glt/service/GltTicketOrderService.java b/src/main/java/com/gxwebsoft/glt/service/GltTicketOrderService.java index 9f3fc81..d5ba7f8 100644 --- a/src/main/java/com/gxwebsoft/glt/service/GltTicketOrderService.java +++ b/src/main/java/com/gxwebsoft/glt/service/GltTicketOrderService.java @@ -2,6 +2,7 @@ package com.gxwebsoft.glt.service; import com.baomidou.mybatisplus.extension.service.IService; import com.gxwebsoft.common.core.web.PageResult; +import com.gxwebsoft.glt.dto.GltTransferOrderDto; import com.gxwebsoft.glt.entity.GltTicketOrder; import com.gxwebsoft.glt.param.GltTicketOrderParam; @@ -64,6 +65,13 @@ public interface GltTicketOrderService extends IService { */ void accept(Integer id, Integer riderId, Integer tenantId); + /** + * 配送员转单 + * @param orderDto + * @return + */ + Boolean transferOrder(GltTransferOrderDto orderDto); + /** * 指派/接单成功后,同步关联商城订单发货状态为“已发货”(deliveryStatus=20)。 * @@ -106,4 +114,10 @@ public interface GltTicketOrderService extends IService { */ int autoConfirmTimeout(Integer tenantId, LocalDateTime now, int timeoutHours, int batchSize); + /** + * 派送订单调度 + * @return + */ + Boolean dispatchOrder(String orderNo, Integer tenantId); + } diff --git a/src/main/java/com/gxwebsoft/glt/service/impl/GltSubscribeMessageServiceImpl.java b/src/main/java/com/gxwebsoft/glt/service/impl/GltSubscribeMessageServiceImpl.java index 76e8314..563cf72 100644 --- a/src/main/java/com/gxwebsoft/glt/service/impl/GltSubscribeMessageServiceImpl.java +++ b/src/main/java/com/gxwebsoft/glt/service/impl/GltSubscribeMessageServiceImpl.java @@ -43,7 +43,7 @@ public class GltSubscribeMessageServiceImpl implements GltSubscribeMessageServic * 模板名称:订单配送通知 * 关键词:订单编号、订单内容、配送地址、订单金额 */ - private static final String SUBSCRIBE_TEMPLATE_ID = "YOUR_TEMPLATE_ID"; // TODO: 替换为实际模板ID + private static final String ORDER_DELIVERY_ID = "vSMSqGVy3aG1RuzQUZlk2y5sWiTFY_hewF5-R-uYwMk"; /** * 发送新订单通知给配送员 @@ -196,8 +196,8 @@ public class GltSubscribeMessageServiceImpl implements GltSubscribeMessageServic Map params = new HashMap<>(); params.put("touser", openId); // 用户 openid - params.put("template_id", SUBSCRIBE_TEMPLATE_ID); // 模板ID - params.put("page", "pages/rider/orders/index"); // 点击后跳转的页面 + params.put("template_id", ORDER_DELIVERY_ID); // 模板ID +// params.put("page", "pages/rider/orders/index"); // 点击后跳转的页面 params.put("data", data); String response = HttpUtil.createPost(url) diff --git a/src/main/java/com/gxwebsoft/glt/service/impl/GltTicketOrderServiceImpl.java b/src/main/java/com/gxwebsoft/glt/service/impl/GltTicketOrderServiceImpl.java index 4ffde38..99ff31f 100644 --- a/src/main/java/com/gxwebsoft/glt/service/impl/GltTicketOrderServiceImpl.java +++ b/src/main/java/com/gxwebsoft/glt/service/impl/GltTicketOrderServiceImpl.java @@ -1,5 +1,6 @@ package com.gxwebsoft.glt.service.impl; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; @@ -7,11 +8,14 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 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.utils.LoginUserUtil; import com.gxwebsoft.common.core.web.PageParam; import com.gxwebsoft.common.core.web.PageResult; 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.entity.GltTicketOrder; import com.gxwebsoft.glt.entity.GltUserTicket; import com.gxwebsoft.glt.entity.GltUserTicketLog; @@ -24,6 +28,7 @@ import com.gxwebsoft.glt.service.GltUserTicketService; import com.gxwebsoft.shop.dto.ShopDealerUserReduceDto; import com.gxwebsoft.shop.entity.*; import com.gxwebsoft.shop.mapper.ShopGoodsMapper; +import com.gxwebsoft.shop.mapper.ShopStoreRiderMapper; import com.gxwebsoft.shop.mapper.ShopUserAddressMapper; import com.gxwebsoft.shop.service.ShopDealerCapitalService; import com.gxwebsoft.shop.service.ShopDealerUserService; @@ -31,18 +36,20 @@ import com.gxwebsoft.shop.service.ShopOrderGoodsService; import com.gxwebsoft.shop.service.ShopOrderService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; -import org.springframework.util.StringUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.support.TransactionTemplate; +import org.springframework.util.StringUtils; import javax.annotation.Resource; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.LocalDate; -import java.time.format.DateTimeFormatter; import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Arrays; import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; /** @@ -97,10 +104,16 @@ public class GltTicketOrderServiceImpl extends ServiceImpl pageRel(GltTicketOrderParam param) { PageParam page = new PageParam<>(param); - page.setDefaultOrder("sort_number asc, create_time desc"); + page.setDefaultOrder("create_time desc"); List list = baseMapper.selectPageRel(page, param); if(CollectionUtils.isNotEmpty(list)){ List addressIdList = list.stream().map(GltTicketOrder::getAddressId).distinct().collect(Collectors.toList()); @@ -199,8 +212,13 @@ public class GltTicketOrderServiceImpl extends ServiceImpl 0; + }else { + throw new BusinessException(GlobalErrorCodeConstants.NOT_FOUND.getMsg()); + } + } + @Override public void markShopOrderShippedAfterRiderAssigned(Integer ticketOrderId, Integer tenantId, Integer riderId) { updateShopOrderDeliveryStatusAfterAccept(ticketOrderId, tenantId, riderId, LocalDateTime.now()); @@ -685,6 +724,49 @@ public class GltTicketOrderServiceImpl extends ServiceImpl shopStoreRiders = shopStoreRiderMapper.selectList(new LambdaQueryWrapper().select(ShopStoreRider::getUserId).in(ShopStoreRider::getWorkStatus, Arrays.asList(1, 2))); + if(CollectionUtils.isNotEmpty(shopStoreRiders)){ + List riderIdList = shopStoreRiders.stream().map(ShopStoreRider::getUserId).distinct().collect(Collectors.toList()); + int i = index.getAndIncrement() % riderIdList.size(); + return riderIdList.get(i); + } + return null; + } + /** * 更新送水订单为已完成状态 * @param ticketOrderId diff --git a/src/main/java/com/gxwebsoft/shop/controller/ShopGoodsCategoryController.java b/src/main/java/com/gxwebsoft/shop/controller/ShopGoodsCategoryController.java index 49077a7..e9059a4 100644 --- a/src/main/java/com/gxwebsoft/shop/controller/ShopGoodsCategoryController.java +++ b/src/main/java/com/gxwebsoft/shop/controller/ShopGoodsCategoryController.java @@ -6,7 +6,6 @@ import com.gxwebsoft.shop.entity.ShopGoodsCategory; import com.gxwebsoft.shop.param.ShopGoodsCategoryParam; import com.gxwebsoft.common.core.web.ApiResult; import com.gxwebsoft.common.core.web.PageResult; -import com.gxwebsoft.common.core.web.PageParam; import com.gxwebsoft.common.core.web.BatchParam; import com.gxwebsoft.common.core.annotation.OperationLog; import com.gxwebsoft.common.system.entity.User; diff --git a/src/main/java/com/gxwebsoft/shop/controller/ShopVerifyUserController.java b/src/main/java/com/gxwebsoft/shop/controller/ShopVerifyUserController.java new file mode 100644 index 0000000..b157adf --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/controller/ShopVerifyUserController.java @@ -0,0 +1,96 @@ +package com.gxwebsoft.shop.controller; + +import com.gxwebsoft.common.core.annotation.OperationLog; +import com.gxwebsoft.common.core.web.ApiResult; +import com.gxwebsoft.common.core.web.BaseController; +import com.gxwebsoft.common.core.web.PageResult; +import com.gxwebsoft.shop.entity.ShopVerifyUser; +import com.gxwebsoft.shop.param.ShopVerifyUserParam; +import com.gxwebsoft.shop.service.ShopVerifyUserService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 订单核销人管理控制器 + * + * @author xm + * @since 2026-05-25 17:13:01 + */ +@Tag(name = "订单核销人管理管理") +@RestController +@RequestMapping("/api/shop/shop-verify-user") +public class ShopVerifyUserController extends BaseController { + @Resource + private ShopVerifyUserService shopVerifyUserService; + +// @PreAuthorize("hasAuthority('shop:shopVerifyUser:list')") + @Operation(summary = "分页查询订单核销人管理") + @GetMapping("/page") + public ApiResult> page(ShopVerifyUserParam param) { + // 使用关联查询 + return success(shopVerifyUserService.pageRel(param)); + } + +// @PreAuthorize("hasAuthority('shop:shopVerifyUser:list')") + @Operation(summary = "查询全部订单核销人管理") + @GetMapping() + public ApiResult> list(ShopVerifyUserParam param) { + // 使用关联查询 + return success(shopVerifyUserService.listRel(param)); + } + +// @PreAuthorize("hasAuthority('shop:shopVerifyUser:list')") + @Operation(summary = "根据id查询订单核销人管理") + @GetMapping("/{id}") + public ApiResult get(@PathVariable("id") Integer id) { + // 使用关联查询 + return success(shopVerifyUserService.getByIdRel(id)); + } + +// @PreAuthorize("hasAuthority('shop:shopVerifyUser:save')") + @OperationLog + @Operation(summary = "添加订单核销人管理") + @PostMapping() + public ApiResult save(@RequestBody ShopVerifyUser shopVerifyUser) { + return success(shopVerifyUserService.saveInfo(shopVerifyUser)); + } + +// @PreAuthorize("hasAuthority('shop:shopVerifyUser:update')") + @Operation(summary = "修改订单核销人管理") + @PutMapping() + public ApiResult update(@RequestBody ShopVerifyUser shopVerifyUser) { + if (shopVerifyUserService.updateById(shopVerifyUser)) { + return success("修改成功"); + } + return fail("修改失败"); + } + + @Operation(summary = "修改订单核销人开启状态") + @PutMapping("/updateStatus") + public ApiResult updateStatus(@RequestParam("id") Integer id) { + return success(shopVerifyUserService.updateStatus(id)); + } + + @Operation(summary = "修改订单核销人核销权限") + @PutMapping("/updateVerifyFlag") + public ApiResult updateVerifyFlag(@RequestParam("id") Integer id) { + return success(shopVerifyUserService.updateVerifyFlag(id)); + } + +// @PreAuthorize("hasAuthority('shop:shopVerifyUser:remove')") + @OperationLog + @Operation(summary = "删除订单核销人管理") + @DeleteMapping("/{id}") + public ApiResult remove(@PathVariable("id") Integer id) { + if (shopVerifyUserService.removeById(id)) { + return success("删除成功"); + } + return fail("删除失败"); + } + + +} diff --git a/src/main/java/com/gxwebsoft/shop/dto/OrderCreateRequest.java b/src/main/java/com/gxwebsoft/shop/dto/OrderCreateRequest.java index 3cef01d..4d5164a 100644 --- a/src/main/java/com/gxwebsoft/shop/dto/OrderCreateRequest.java +++ b/src/main/java/com/gxwebsoft/shop/dto/OrderCreateRequest.java @@ -91,6 +91,12 @@ public class OrderCreateRequest { @Schema(description = "发货店铺") private String expressMerchantName; + @Schema(description = "配送方式 0-电梯 1-步梯") + private Integer deliveryMethod; + + @Schema(description = "楼层") + private Integer deliveryFloor; + @Schema(description = "订单总额") @NotNull(message = "订单总额不能为空") @DecimalMin(value = "0.01", message = "订单总额必须大于0") diff --git a/src/main/java/com/gxwebsoft/shop/dto/ShopOrderMyVerifyDto.java b/src/main/java/com/gxwebsoft/shop/dto/ShopOrderMyVerifyDto.java new file mode 100644 index 0000000..39bffd8 --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/dto/ShopOrderMyVerifyDto.java @@ -0,0 +1,27 @@ +package com.gxwebsoft.shop.dto; + +import com.gxwebsoft.common.core.web.BaseParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * 查询个人核销记录 + * + */ +@Data +@Schema(name = "ShopOrderMyVerifyDto", description = "查询个人核销记录") +public class ShopOrderMyVerifyDto extends BaseParam { + + @Schema(description = "用户ID") + private Integer userId; + + @Schema(description = "订单号") + private String orderNo; + + @Schema(description = "开始时间【核销时间】", example = "2026-05-20") + private String dateStart; + + @Schema(description = "结束时间【核销时间】", example = "2026-05-25") + private String dateEnd; +} + diff --git a/src/main/java/com/gxwebsoft/shop/entity/ShopGoods.java b/src/main/java/com/gxwebsoft/shop/entity/ShopGoods.java index ac86fb3..7c4c11d 100644 --- a/src/main/java/com/gxwebsoft/shop/entity/ShopGoods.java +++ b/src/main/java/com/gxwebsoft/shop/entity/ShopGoods.java @@ -9,6 +9,8 @@ import java.time.LocalDateTime; import com.fasterxml.jackson.annotation.JsonAlias; import com.fasterxml.jackson.annotation.JsonFormat; import java.io.Serializable; +import java.util.List; + import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; @@ -179,17 +181,21 @@ public class ShopGoods implements Serializable { @Schema(description = "用户ID") private Integer userId; - @Schema(description = "配送方式:1-自配送 2-自提 4-发快递 多属性用','隔开") + @Schema(description = "配送方式:1-自配送 2-自提 4-发快递 5-水票 多属性用','隔开") private String deliveryType; + @Schema(description = "配送方式:1-自配送 2-自提 4-发快递 5-水票 多属性用','隔开") + @TableField(exist = false) + private List deliveryTypeList; + @Schema(description = "水票标识 0-否 1-是") private Integer waterTicketFlag; @Schema(description = "水票ID") private Integer waterTickerId; - @Schema(description = "商品大类 1-水 2-茶叶 3-酒 4-香水") - private Integer categoryType; + @Schema(description = "配送楼层步梯费(元)") + private BigDecimal deliveryFee; @Schema(description = "租户id") private Integer tenantId; diff --git a/src/main/java/com/gxwebsoft/shop/entity/ShopGoodsCategory.java b/src/main/java/com/gxwebsoft/shop/entity/ShopGoodsCategory.java index 6b902cd..ba05f0a 100644 --- a/src/main/java/com/gxwebsoft/shop/entity/ShopGoodsCategory.java +++ b/src/main/java/com/gxwebsoft/shop/entity/ShopGoodsCategory.java @@ -2,15 +2,16 @@ package com.gxwebsoft.shop.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; -import java.time.LocalDateTime; -import com.fasterxml.jackson.annotation.JsonFormat; import com.baomidou.mybatisplus.annotation.TableLogic; -import java.io.Serializable; -import io.swagger.v3.oas.annotations.media.Schema; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.time.LocalDateTime; + /** * 商品分类 * @@ -20,6 +21,7 @@ import lombok.EqualsAndHashCode; @Data @EqualsAndHashCode(callSuper = false) @Schema(name = "ShopGoodsCategory对象", description = "商品分类") +@TableName("shop_goods_category") public class ShopGoodsCategory implements Serializable { private static final long serialVersionUID = 1L; diff --git a/src/main/java/com/gxwebsoft/shop/entity/ShopOrder.java b/src/main/java/com/gxwebsoft/shop/entity/ShopOrder.java index 67e8ffd..ce23b1c 100644 --- a/src/main/java/com/gxwebsoft/shop/entity/ShopOrder.java +++ b/src/main/java/com/gxwebsoft/shop/entity/ShopOrder.java @@ -33,7 +33,7 @@ public class ShopOrder implements Serializable { @TableId(value = "order_id", type = IdType.AUTO) private Integer orderId; - @Schema(description = "订单类型 1-及时自配送 2-自提 3-预约自配送 4-发快递") + @Schema(description = "订单类型 1-及时自配送 2-自提 3-预约自配送 4-发快递 5-水票 6-(配送:自配送/快递)") private Integer orderType; @Schema(description = "订单编号") @@ -354,6 +354,15 @@ public class ShopOrder implements Serializable { @Schema(description = "分红结算标识 0-未结算 1-已结算") private Integer dividendSettlementFlag; + @Schema(description = "配送方式 0-电梯 1-步梯") + private Integer deliveryMethod; + + @Schema(description = "楼层") + private Integer deliveryFloor; + + @Schema(description = "配送费(步梯配送特有)") + private BigDecimal deliveryFee; + @Schema(description = "修改时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime updateTime; diff --git a/src/main/java/com/gxwebsoft/shop/entity/ShopSurchargeConfig.java b/src/main/java/com/gxwebsoft/shop/entity/ShopSurchargeConfig.java index 79ff296..cdf9f85 100644 --- a/src/main/java/com/gxwebsoft/shop/entity/ShopSurchargeConfig.java +++ b/src/main/java/com/gxwebsoft/shop/entity/ShopSurchargeConfig.java @@ -32,6 +32,9 @@ public class ShopSurchargeConfig implements Serializable { @Schema(description = "名称") private String name; + @Schema(description = "商品ID") + private Integer goodsId; + @Schema(description = "价格(元)") private BigDecimal price; diff --git a/src/main/java/com/gxwebsoft/shop/entity/ShopVerifyUser.java b/src/main/java/com/gxwebsoft/shop/entity/ShopVerifyUser.java new file mode 100644 index 0000000..2440f00 --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/entity/ShopVerifyUser.java @@ -0,0 +1,58 @@ +package com.gxwebsoft.shop.entity; + +import com.baomidou.mybatisplus.annotation.*; + +import java.time.LocalDateTime; +import java.io.Serializable; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 订单核销人管理 + * + * @author xm + * @since 2026-05-25 17:13:00 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Schema(name = "ShopVerifyUser对象", description = "订单核销人管理") +@TableName("shop_verify_user") +public class ShopVerifyUser implements Serializable { + private static final long serialVersionUID = 1L; + + @Schema(description = "主键ID") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @Schema(description = "用户ID") + private Integer userId; + + @Schema(description = "用户名称") + @TableField(exist = false) + private String userName; + + @Schema(description = "核销权限是否开启 0-未开启 1-已开启") + private Boolean verifyFlag; + + @Schema(description = "是否开启 0-未开始 1-已开启") + private Boolean status; + + @Schema(description = "创建人") + private Integer creator; + + @Schema(description = "创建时间") + private LocalDateTime createTime; + + @Schema(description = "更新人") + private Integer updater; + + @Schema(description = "更新时间") + private LocalDateTime updateTime; + + @Schema(description = "是否删除 0-未删 1-已删") + @TableLogic + private Integer deleted; + +} diff --git a/src/main/java/com/gxwebsoft/shop/mapper/ShopVerifyUserMapper.java b/src/main/java/com/gxwebsoft/shop/mapper/ShopVerifyUserMapper.java new file mode 100644 index 0000000..4144e63 --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/mapper/ShopVerifyUserMapper.java @@ -0,0 +1,37 @@ +package com.gxwebsoft.shop.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.gxwebsoft.shop.entity.ShopVerifyUser; +import com.gxwebsoft.shop.param.ShopVerifyUserParam; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 订单核销人管理Mapper + * + * @author xm + * @since 2026-05-25 17:13:00 + */ +public interface ShopVerifyUserMapper extends BaseMapper { + + /** + * 分页查询 + * + * @param page 分页对象 + * @param param 查询参数 + * @return List + */ + List selectPageRel(@Param("page") IPage page, + @Param("param") ShopVerifyUserParam param); + + /** + * 查询全部 + * + * @param param 查询参数 + * @return List + */ + List selectListRel(@Param("param") ShopVerifyUserParam param); + +} diff --git a/src/main/java/com/gxwebsoft/shop/mapper/xml/ShopVerifyUserMapper.xml b/src/main/java/com/gxwebsoft/shop/mapper/xml/ShopVerifyUserMapper.xml new file mode 100644 index 0000000..61b545a --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/mapper/xml/ShopVerifyUserMapper.xml @@ -0,0 +1,57 @@ + + + + + + + SELECT a.* + FROM shop_verify_user a + + + AND a.id = #{param.id} + + + AND a.user_id = #{param.userId} + + + AND a.verify_flag = #{param.verifyFlag} + + + AND a.status = #{param.status} + + + AND a.creator = #{param.creator} + + + AND a.create_time >= #{param.createTimeStart} + + + AND a.create_time <= #{param.createTimeEnd} + + + AND a.updater = #{param.updater} + + + AND a.deleted = #{param.deleted} + + + AND a.deleted = 0 + + + AND (a.comments LIKE CONCAT('%', #{param.keywords}, '%') + ) + + + + + + + + + + + diff --git a/src/main/java/com/gxwebsoft/shop/param/ShopVerifyUserParam.java b/src/main/java/com/gxwebsoft/shop/param/ShopVerifyUserParam.java new file mode 100644 index 0000000..dd6ef77 --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/param/ShopVerifyUserParam.java @@ -0,0 +1,52 @@ +package com.gxwebsoft.shop.param; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.gxwebsoft.common.core.annotation.QueryField; +import com.gxwebsoft.common.core.annotation.QueryType; +import com.gxwebsoft.common.core.web.BaseParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 订单核销人管理查询参数 + * + * @author xm + * @since 2026-05-25 17:13:00 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@JsonInclude(JsonInclude.Include.NON_NULL) +@Schema(name = "ShopVerifyUserParam对象", description = "订单核销人管理查询参数") +public class ShopVerifyUserParam extends BaseParam { + private static final long serialVersionUID = 1L; + + @Schema(description = "主键ID") + @QueryField(type = QueryType.EQ) + private Integer id; + + @Schema(description = "用户ID") + @QueryField(type = QueryType.EQ) + private Integer userId; + + @Schema(description = "核销权限是否开启 0-未开启 1-已开启") + @QueryField(type = QueryType.EQ) + private Integer verifyFlag; + + @Schema(description = "是否开启 0-未开始 1-已开启") + @QueryField(type = QueryType.EQ) + private Integer status; + + @Schema(description = "创建人") + @QueryField(type = QueryType.EQ) + private Integer creator; + + @Schema(description = "更新人") + @QueryField(type = QueryType.EQ) + private Integer updater; + + @Schema(description = "是否删除 0-未删 1-已删") + @QueryField(type = QueryType.EQ) + private Integer deleted; + +} diff --git a/src/main/java/com/gxwebsoft/shop/service/OrderBusinessService.java b/src/main/java/com/gxwebsoft/shop/service/OrderBusinessService.java index 7ac1629..82bcc03 100644 --- a/src/main/java/com/gxwebsoft/shop/service/OrderBusinessService.java +++ b/src/main/java/com/gxwebsoft/shop/service/OrderBusinessService.java @@ -23,6 +23,7 @@ import java.math.RoundingMode; import java.security.SecureRandom; import java.time.LocalDateTime; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Map; @@ -134,18 +135,6 @@ public class OrderBusinessService { throw new BusinessException("用户未登录"); } - // 检查是否为测试账号 - boolean isTestAccount = orderConfig.isTestAccount(loginUser.getPhone()); - - if (isTestAccount) { - // 测试账号:直接使用测试金额,跳过金额验证 - BigDecimal testAmount = orderConfig.getTestAccount().getTestPayAmount(); - request.setTotalPrice(testAmount); - log.info("测试账号订单,用户:{},使用测试金额:{}", loginUser.getPhone(), testAmount); - return; // 测试账号跳过后续验证 - } - - // 非测试账号:正常验证流程 // 验证商品信息并计算总金额 BigDecimal calculatedTotal = validateAndCalculateTotal(request); @@ -157,7 +146,6 @@ public class OrderBusinessService { if (request.getTotalPrice() != null && request.getTotalPrice().subtract(calculatedTotal).abs().compareTo(new BigDecimal("0.01")) > 0) { log.warn("订单金额计算不一致,前端传入:{},后台计算:{}", request.getTotalPrice(), calculatedTotal); -// throw new BusinessException("订单金额计算错误,请刷新重试"); } // 使用后台计算的金额 @@ -328,23 +316,6 @@ public class OrderBusinessService { shopOrder.setComments(orderConfig.getDefaultConfig().getDefaultComments()); } - // 设置价格相关字段(解决数据库字段没有默认值的问题) - if (shopOrder.getPayPrice() == null) { - shopOrder.setPayPrice(shopOrder.getTotalPrice()); // 实际付款默认等于订单总额 - } - - if (shopOrder.getPrice() == null) { - shopOrder.setPrice(shopOrder.getTotalPrice()); // 用于统计的价格默认等于订单总额 - } - - if (shopOrder.getReducePrice() == null) { - shopOrder.setReducePrice(BigDecimal.ZERO); // 减少金额默认为0 - } - - if (shopOrder.getMoney() == null) { - shopOrder.setMoney(shopOrder.getTotalPrice()); // 用于积分赠送的价格默认等于订单总额 - } - // 设置默认状态 shopOrder.setPayStatus(false); // 未付款 shopOrder.setOrderStatus(0); // 未使用 @@ -378,6 +349,16 @@ public class OrderBusinessService { shopOrder.setWaterTicketFlag(0); } + //自配送才计算步梯费用业务【选择步梯配送方式、配送楼层大于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())); + if(deliveryFee.compareTo(BigDecimal.ZERO) > 0){ + shopOrder.setDeliveryFee(deliveryFee); + shopOrder.setTotalPrice(shopOrder.getTotalPrice().add(deliveryFee)); + } + } + //单一配送方式商品如用户没选择配送方式按商品默认配送属性设定订单类型 String deliveryType = shopGoods.getDeliveryType(); if(orderType == null && StrUtil.isNotBlank(deliveryType) && !deliveryType.contains(",")){ @@ -396,14 +377,31 @@ public class OrderBusinessService { break; } default:{ - orderType = 1; + orderType = 5; } } } } } - shopOrder.setOrderType(orderType); + // 设置价格相关字段(解决数据库字段没有默认值的问题) + if (shopOrder.getPayPrice() == null) { + shopOrder.setPayPrice(shopOrder.getTotalPrice()); // 实际付款默认等于订单总额 + } + + if (shopOrder.getPrice() == null) { + shopOrder.setPrice(shopOrder.getTotalPrice()); // 用于统计的价格默认等于订单总额 + } + + if (shopOrder.getReducePrice() == null) { + shopOrder.setReducePrice(BigDecimal.ZERO); // 减少金额默认为0 + } + + if (shopOrder.getMoney() == null) { + shopOrder.setMoney(shopOrder.getTotalPrice()); // 用于积分赠送的价格默认等于订单总额 + } + + shopOrder.setOrderType(orderType); return shopOrder; } @@ -667,8 +665,8 @@ public class OrderBusinessService { throw new BusinessException("收货地址坐标异常,请重新选择收货地址"); } - //订单类型:5-配送【系统自动识别电子围栏内转及时配送,电子围栏外发快递】 - if(orderType != null && orderType == 5){ + //订单类型:6-配送【系统自动识别电子围栏内转及时配送,电子围栏外发快递】 + if(orderType != null && orderType == 6){ Boolean exit = shopStoreFenceService.validatePointInEnabled(shopOrder.getTenantId(), lng, lat); if(exit){ shopOrder.setOrderType(1); diff --git a/src/main/java/com/gxwebsoft/shop/service/ShopVerifyUserService.java b/src/main/java/com/gxwebsoft/shop/service/ShopVerifyUserService.java new file mode 100644 index 0000000..433cbd6 --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/service/ShopVerifyUserService.java @@ -0,0 +1,63 @@ +package com.gxwebsoft.shop.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.gxwebsoft.common.core.web.PageResult; +import com.gxwebsoft.shop.entity.ShopVerifyUser; +import com.gxwebsoft.shop.param.ShopVerifyUserParam; + +import java.util.List; + +/** + * 订单核销人管理Service + * + * @author xm + * @since 2026-05-25 17:13:00 + */ +public interface ShopVerifyUserService extends IService { + + /** + * 分页关联查询 + * + * @param param 查询参数 + * @return PageResult + */ + PageResult pageRel(ShopVerifyUserParam param); + + /** + * 关联查询全部 + * + * @param param 查询参数 + * @return List + */ + List listRel(ShopVerifyUserParam param); + + /** + * 根据id查询 + * + * @param id 主键ID + * @return ShopVerifyUser + */ + ShopVerifyUser getByIdRel(Integer id); + + /** + * 修改订单核销人开启状态 + * @param id 主键ID + * @return + */ + Boolean updateStatus(Integer id); + + /** + * 修改订单核销人核销权限 + * @param id 主键ID + * @return + */ + Boolean updateVerifyFlag(Integer id); + + /** + * 保存数据 + * @param shopVerifyUser + * @return + */ + Boolean saveInfo(ShopVerifyUser shopVerifyUser); + +} diff --git a/src/main/java/com/gxwebsoft/shop/service/impl/ShopFlashSaleActivityServiceImpl.java b/src/main/java/com/gxwebsoft/shop/service/impl/ShopFlashSaleActivityServiceImpl.java index 3aaa197..4863911 100644 --- a/src/main/java/com/gxwebsoft/shop/service/impl/ShopFlashSaleActivityServiceImpl.java +++ b/src/main/java/com/gxwebsoft/shop/service/impl/ShopFlashSaleActivityServiceImpl.java @@ -125,10 +125,11 @@ public class ShopFlashSaleActivityServiceImpl extends ServiceImpl activityIdList = activityWrapper.list().stream().map(ShopFlashSaleActivity::getId).collect(Collectors.toList()); - LambdaQueryWrapper shopOrderWrapper = new LambdaQueryWrapper().select(ShopOrder::getOrderId, ShopOrder::getActivityId, ShopOrder::getTotalNum) - .eq(ShopOrder::getUserId, loginUser.getUserId()).in(ShopOrder::getActivityId, activityIdList).in(ShopOrder::getOrderStatus, Arrays.asList(0, 1)); - activityMap = shopOrderMapper.selectList(shopOrderWrapper).stream().collect(Collectors.groupingBy(ShopOrder::getActivityId, Collectors.summingInt(ShopOrder::getTotalNum))); - + if(CollectionUtils.isNotEmpty(activityIdList)){ + LambdaQueryWrapper shopOrderWrapper = new LambdaQueryWrapper().select(ShopOrder::getOrderId, ShopOrder::getActivityId, ShopOrder::getTotalNum) + .eq(ShopOrder::getUserId, loginUser.getUserId()).in(ShopOrder::getActivityId, activityIdList).in(ShopOrder::getOrderStatus, Arrays.asList(0, 1)); + activityMap = shopOrderMapper.selectList(shopOrderWrapper).stream().collect(Collectors.groupingBy(ShopOrder::getActivityId, Collectors.summingInt(ShopOrder::getTotalNum))); + } activityWrapper.eq(ShopFlashSaleActivity::getDisplayType, 0); } activityWrapper.orderByAsc(ShopFlashSaleActivity::getSortNumber); diff --git a/src/main/java/com/gxwebsoft/shop/service/impl/ShopGoodsServiceImpl.java b/src/main/java/com/gxwebsoft/shop/service/impl/ShopGoodsServiceImpl.java index 4984d72..1503909 100644 --- a/src/main/java/com/gxwebsoft/shop/service/impl/ShopGoodsServiceImpl.java +++ b/src/main/java/com/gxwebsoft/shop/service/impl/ShopGoodsServiceImpl.java @@ -1,5 +1,6 @@ package com.gxwebsoft.shop.service.impl; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.annotation.InterceptorIgnore; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.gxwebsoft.shop.mapper.ShopGoodsMapper; @@ -11,7 +12,9 @@ import com.gxwebsoft.common.core.web.PageResult; import org.springframework.stereotype.Service; import lombok.extern.slf4j.Slf4j; +import java.util.Arrays; import java.util.List; +import java.util.stream.Collectors; /** * 商品Service实现 @@ -28,6 +31,13 @@ public class ShopGoodsServiceImpl extends ServiceImpl page = new PageParam<>(param); page.setDefaultOrder("sort_number asc, create_time desc"); List list = baseMapper.selectPageRel(page, param); + list.forEach(shopGoods ->{ + String deliveryType = shopGoods.getDeliveryType(); + if(StrUtil.isNotBlank(deliveryType)){ + List deliveryTypeList = Arrays.stream(deliveryType.split(",")).map(Integer::parseInt).collect(Collectors.toList()); + shopGoods.setDeliveryTypeList(deliveryTypeList); + } + }); return new PageResult<>(list, page.getTotal()); } @@ -37,6 +47,13 @@ public class ShopGoodsServiceImpl extends ServiceImpl page = new PageParam<>(); page.setDefaultOrder("sort_number asc, create_time desc"); + list.forEach(shopGoods ->{ + String deliveryType = shopGoods.getDeliveryType(); + if(StrUtil.isNotBlank(deliveryType)){ + List deliveryTypeList = Arrays.stream(deliveryType.split(",")).map(Integer::parseInt).collect(Collectors.toList()); + shopGoods.setDeliveryTypeList(deliveryTypeList); + } + }); return page.sortRecords(list); } @@ -44,7 +61,12 @@ public class ShopGoodsServiceImpl extends ServiceImpl deliveryTypeList = Arrays.stream(shopGoods.getDeliveryType().split(",")).map(Integer::parseInt).collect(Collectors.toList()); + shopGoods.setDeliveryTypeList(deliveryTypeList); + } + return shopGoods; } @InterceptorIgnore(tenantLine = "true") diff --git a/src/main/java/com/gxwebsoft/shop/service/impl/ShopOrderServiceImpl.java b/src/main/java/com/gxwebsoft/shop/service/impl/ShopOrderServiceImpl.java index db4c93f..43e4bb1 100644 --- a/src/main/java/com/gxwebsoft/shop/service/impl/ShopOrderServiceImpl.java +++ b/src/main/java/com/gxwebsoft/shop/service/impl/ShopOrderServiceImpl.java @@ -28,10 +28,7 @@ import com.gxwebsoft.shop.dto.ShopDealerUserReduceDto; import com.gxwebsoft.shop.dto.ShopOrderMyVerifyDto; import com.gxwebsoft.shop.dto.VerifyShopOrderDto; import com.gxwebsoft.shop.entity.*; -import com.gxwebsoft.shop.mapper.ShopFlashSaleActivityMapper; -import com.gxwebsoft.shop.mapper.ShopGoodsMapper; -import com.gxwebsoft.shop.mapper.ShopOrderMapper; -import com.gxwebsoft.shop.mapper.ShopUserAddressMapper; +import com.gxwebsoft.shop.mapper.*; import com.gxwebsoft.shop.param.ShopOrderParam; import com.gxwebsoft.shop.service.*; import com.gxwebsoft.shop.vo.ShopOrderMyVerifyItemVO; @@ -118,6 +115,8 @@ public class ShopOrderServiceImpl extends ServiceImpl().eq(ShopVerifyUser::getUserId, loginUser.getUserId())); + if(!(verifyUser != null && verifyUser.getVerifyFlag() && verifyUser.getStatus())){ throw new RuntimeException("暂无核销权限!"); } } diff --git a/src/main/java/com/gxwebsoft/shop/service/impl/ShopVerifyUserServiceImpl.java b/src/main/java/com/gxwebsoft/shop/service/impl/ShopVerifyUserServiceImpl.java new file mode 100644 index 0000000..9c6f41b --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/service/impl/ShopVerifyUserServiceImpl.java @@ -0,0 +1,151 @@ +package com.gxwebsoft.shop.service.impl; + +import cn.hutool.core.util.StrUtil; +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.common.system.mapper.UserMapper; +import com.gxwebsoft.shop.mapper.ShopVerifyUserMapper; +import com.gxwebsoft.shop.service.ShopVerifyUserService; +import com.gxwebsoft.shop.entity.ShopVerifyUser; +import com.gxwebsoft.shop.param.ShopVerifyUserParam; +import com.gxwebsoft.common.core.web.PageParam; +import com.gxwebsoft.common.core.web.PageResult; +import lombok.AllArgsConstructor; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 订单核销人管理Service实现 + * + * @author xm + * @since 2026-05-25 17:00:03 + */ +@Service +@AllArgsConstructor +public class ShopVerifyUserServiceImpl extends ServiceImpl implements ShopVerifyUserService { + + private UserMapper userMapper; + + @Override + public PageResult pageRel(ShopVerifyUserParam param) { + PageParam page = new PageParam<>(param); + page.setDefaultOrder("create_time desc"); + List list = baseMapper.selectPageRel(page, param); + if(CollectionUtils.isNotEmpty(list)){ + List userIdList = list.stream().map(ShopVerifyUser::getUserId).distinct().collect(Collectors.toList()); + if(CollectionUtils.isNotEmpty(userIdList)){ + List userList = userMapper.selectByUserIdList(userIdList); + + for(ShopVerifyUser verifyUser : list){ + User u = userList.stream().filter(user -> verifyUser.getUserId().equals(user.getUserId())).findFirst().orElse(null); + if(u != null){ + verifyUser.setUserName(StrUtil.isNotEmpty(u.getRealName()) ? u.getRealName() : u.getNickname()); + } + } + } + } + return new PageResult<>(list, page.getTotal()); + } + + @Override + public List listRel(ShopVerifyUserParam param) { + List list = baseMapper.selectListRel(param); + if(CollectionUtils.isNotEmpty(list)){ + List userIdList = list.stream().map(ShopVerifyUser::getUserId).distinct().collect(Collectors.toList()); + if(CollectionUtils.isNotEmpty(userIdList)){ + List userList = userMapper.selectByUserIdList(userIdList); + + for(ShopVerifyUser verifyUser : list){ + User u = userList.stream().filter(user -> verifyUser.getUserId().equals(user.getUserId())).findFirst().orElse(null); + if(u != null){ + verifyUser.setUserName(StrUtil.isNotEmpty(u.getRealName()) ? u.getRealName() : u.getNickname()); + } + } + } + } + // 排序 + PageParam page = new PageParam<>(); + page.setDefaultOrder("sort_number asc, create_time desc"); + return page.sortRecords(list); + } + + @Override + public ShopVerifyUser getByIdRel(Integer id) { + ShopVerifyUserParam param = new ShopVerifyUserParam(); + param.setId(id); + ShopVerifyUser verifyUser = param.getOne(baseMapper.selectListRel(param)); + if(verifyUser != null){ + User user = userMapper.getById(verifyUser.getUserId()); + if(user != null){ + verifyUser.setUserName(StrUtil.isNotEmpty(user.getRealName()) ? user.getRealName() : user.getNickname()); + } + } + return verifyUser; + } + + @Override + public Boolean updateStatus(Integer id) { + ShopVerifyUser verifyUser = baseMapper.selectById(id); + if(verifyUser != null){ + Boolean status = verifyUser.getStatus(); + if(status){ + verifyUser.setStatus(false); + }else { + verifyUser.setStatus(true); + } + verifyUser.setUpdateTime(LocalDateTime.now()); + User loginUser = LoginUserUtil.getLoginUser(); + verifyUser.setUpdater(loginUser != null ? loginUser.getUserId() : null); + + return baseMapper.updateById(verifyUser) > 0; + }else { + throw new BusinessException(GlobalErrorCodeConstants.NOT_FOUND.getMsg()); + } + } + + @Override + public Boolean updateVerifyFlag(Integer id) { + ShopVerifyUser verifyUser = baseMapper.selectById(id); + if(verifyUser != null){ + Boolean verifyFlag = verifyUser.getVerifyFlag(); + if(verifyFlag){ + verifyUser.setVerifyFlag(false); + }else { + verifyUser.setVerifyFlag(true); + } + verifyUser.setUpdateTime(LocalDateTime.now()); + User loginUser = LoginUserUtil.getLoginUser(); + verifyUser.setUpdater(loginUser != null ? loginUser.getUserId() : null); + + return baseMapper.updateById(verifyUser) > 0; + }else { + throw new BusinessException(GlobalErrorCodeConstants.NOT_FOUND.getMsg()); + } + } + + @Override + public Boolean saveInfo(ShopVerifyUser shopVerifyUser) { + Integer userId = shopVerifyUser.getUserId(); + if(userId == null){ + throw new BusinessException("用户ID必传!"); + } + + List list = lambdaQuery().eq(ShopVerifyUser::getUserId, userId).list(); + if(CollectionUtils.isNotEmpty(list)){ + throw new BusinessException("该用户已存在核销人关系!"); + } + User loginUser = LoginUserUtil.getLoginUser(); + shopVerifyUser.setCreator(loginUser != null ? loginUser.getUserId() : null); + shopVerifyUser.setCreateTime(LocalDateTime.now()); + + return baseMapper.insert(shopVerifyUser) > 0; + } + +} diff --git a/src/main/java/com/gxwebsoft/shop/vo/ShopOrderMyVerifyItemVO.java b/src/main/java/com/gxwebsoft/shop/vo/ShopOrderMyVerifyItemVO.java new file mode 100644 index 0000000..495b481 --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/vo/ShopOrderMyVerifyItemVO.java @@ -0,0 +1,70 @@ +package com.gxwebsoft.shop.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.Min; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 查询个人核销记录 + * + */ +@Data +@Schema(name = "ShopOrderMyVerifyDto", description = "查询个人核销记录") +public class ShopOrderMyVerifyItemVO { + + @Schema(description = "订单号") + private Integer orderId; + + @Schema(description = "订单类型 1-及时自配送 2-自提 3-预约自配送 4-发快递") + private Integer orderType; + + @Schema(description = "订单编号") + private String orderNo; + + @Schema(description = "订单总额") + private BigDecimal totalPrice; + + @Schema(description = "实际付款") + private BigDecimal payPrice; + + @Schema(description = "购买数量") + @Min(value = 1, message = "购买数量必须大于0") + private Integer totalNum; + + @Schema(description = "商品名称") + private String goodsName; + + @Schema(description = "活动名称") + private String activeName; + + @Schema(description = "支付方式:0余额支付,1微信支付,2支付宝支付,3银联支付,4现金支付,5POS机支付,6免费,7积分支付") + private Integer payType; + + @Schema(description = "0未付款,1已付款") + private Boolean payStatus; + + @Schema(description = "0未使用,1已完成,2已取消,3取消中,4退款申请中,5退款被拒绝,6退款成功,7客户端申请退款") + private Integer orderStatus; + + @Schema(description = "用户id") + private Integer userId; + + @Schema(description = "核销时间") + private LocalDateTime verifyTime; + + @Schema(description = "核销人") + private Integer verifyUser; + + @Schema(description = "推广核销佣金") + private BigDecimal verifyMoney; + + @Schema(description = "创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTime; + +} + diff --git a/src/main/java/com/gxwebsoft/shop/vo/ShopOrderMyVerifyVO.java b/src/main/java/com/gxwebsoft/shop/vo/ShopOrderMyVerifyVO.java new file mode 100644 index 0000000..8efcab3 --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/vo/ShopOrderMyVerifyVO.java @@ -0,0 +1,52 @@ +package com.gxwebsoft.shop.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; + +/** + * 查询个人核销记录 + * + */ +@Data +@Schema(name = "ShopOrderMyVerifyDto", description = "查询个人核销记录") +public class ShopOrderMyVerifyVO { + + @Schema(description = "总核销单量") + private Integer totalOrderNum = 0; + + @Schema(description = "总核销商品数量") + private Integer totalGoodsNum = 0; + + @Schema(description = "总核销订单金额") + private BigDecimal totalMoney = BigDecimal.ZERO; + + @Schema(description = "当月核销单量") + private Integer monthOrderNum = 0; + + @Schema(description = "当月核销商品数量") + private Integer monthGoodsNum = 0; + + @Schema(description = "当月核销订单金额") + private BigDecimal monthMoney = BigDecimal.ZERO; + + @Schema(description = "促销快核订单数") + private Integer liveOrderNum = 0; + + @Schema(description = "促销快核商品数量") + private Integer liveGoodsNum = 0; + + @Schema(description = "促销快核订单金额") + private BigDecimal liveMoney = BigDecimal.ZERO; + + @Schema(description = "核验订单数据") + private List itemVOList = new ArrayList<>(); + + @Schema(description = "分页查询涉及总单量") + private Integer count = 0; + +} + diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 98793ed..c084fe3 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -14,8 +14,8 @@ spring: # redis redis: database: 0 - host: 1Panel-redis-GmNr - port: 6379 + host: 8.134.55.105 + port: 16379 password: redis_t74P8C # 日志配置 diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml index 400131d..a763a57 100644 --- a/src/main/resources/application-local.yml +++ b/src/main/resources/application-local.yml @@ -15,8 +15,9 @@ spring: redis: database: 0 - host: localhost - port: 6379 + host: 8.134.55.105 + port: 16379 + password: redis_t74P8C # 日志配置 logging: