feat: 订单
parent
8b743d9dd7
commit
856e4056c2
|
|
@ -1,9 +1,11 @@
|
||||||
package com.ruoyi.web.controller.xkt;
|
package com.ruoyi.web.controller.xkt;
|
||||||
|
|
||||||
import cn.hutool.core.bean.BeanUtil;
|
import cn.hutool.core.bean.BeanUtil;
|
||||||
|
import com.github.pagehelper.Page;
|
||||||
import com.ruoyi.common.annotation.Log;
|
import com.ruoyi.common.annotation.Log;
|
||||||
import com.ruoyi.common.core.controller.XktBaseController;
|
import com.ruoyi.common.core.controller.XktBaseController;
|
||||||
import com.ruoyi.common.core.domain.R;
|
import com.ruoyi.common.core.domain.R;
|
||||||
|
import com.ruoyi.common.core.page.PageVO;
|
||||||
import com.ruoyi.common.enums.BusinessType;
|
import com.ruoyi.common.enums.BusinessType;
|
||||||
import com.ruoyi.common.exception.ServiceException;
|
import com.ruoyi.common.exception.ServiceException;
|
||||||
import com.ruoyi.common.utils.SecurityUtils;
|
import com.ruoyi.common.utils.SecurityUtils;
|
||||||
|
|
@ -18,6 +20,7 @@ import io.swagger.annotations.Api;
|
||||||
import io.swagger.annotations.ApiOperation;
|
import io.swagger.annotations.ApiOperation;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.security.access.prepost.PreAuthorize;
|
import org.springframework.security.access.prepost.PreAuthorize;
|
||||||
|
import org.springframework.validation.annotation.Validated;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
import javax.validation.Valid;
|
import javax.validation.Valid;
|
||||||
|
|
@ -53,7 +56,7 @@ public class StoreOrderController extends XktBaseController {
|
||||||
return success(respVO);
|
return success(respVO);
|
||||||
}
|
}
|
||||||
|
|
||||||
@PreAuthorize("@ss.hasPermi('system:order:add')")
|
@PreAuthorize("@ss.hasPermi('system:order:edit')")
|
||||||
@Log(title = "订单", businessType = BusinessType.UPDATE)
|
@Log(title = "订单", businessType = BusinessType.UPDATE)
|
||||||
@ApiOperation("修改订单")
|
@ApiOperation("修改订单")
|
||||||
@PutMapping("edit")
|
@PutMapping("edit")
|
||||||
|
|
@ -61,6 +64,7 @@ public class StoreOrderController extends XktBaseController {
|
||||||
StoreOrderUpdateDTO dto = BeanUtil.toBean(vo, StoreOrderUpdateDTO.class);
|
StoreOrderUpdateDTO dto = BeanUtil.toBean(vo, StoreOrderUpdateDTO.class);
|
||||||
dto.setOrderUserId(SecurityUtils.getUserId());
|
dto.setOrderUserId(SecurityUtils.getUserId());
|
||||||
StoreOrderExt result = storeOrderService.modifyOrder(dto);
|
StoreOrderExt result = storeOrderService.modifyOrder(dto);
|
||||||
|
//TODO 非下单人,不允许修改
|
||||||
return success(result.getOrder().getId());
|
return success(result.getOrder().getId());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -78,6 +82,19 @@ public class StoreOrderController extends XktBaseController {
|
||||||
return success(respVO);
|
return success(respVO);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@PreAuthorize("@ss.hasPermi('system:order:edit')")
|
||||||
|
@Log(title = "订单", businessType = BusinessType.UPDATE)
|
||||||
|
@PutMapping("cancel")
|
||||||
|
public R cancel(@Valid @RequestBody StoreOrderCancelReqVO vo) {
|
||||||
|
OrderOptDTO dto = OrderOptDTO.builder()
|
||||||
|
.storeOrderId(vo.getStoreOrderId())
|
||||||
|
.operatorId(SecurityUtils.getUserId())
|
||||||
|
.build();
|
||||||
|
storeOrderService.cancelOrder(dto);
|
||||||
|
//TODO 非下单人,不允许取消
|
||||||
|
return success();
|
||||||
|
}
|
||||||
|
|
||||||
@PreAuthorize("@ss.hasPermi('system:order:query')")
|
@PreAuthorize("@ss.hasPermi('system:order:query')")
|
||||||
@ApiOperation(value = "订单详情")
|
@ApiOperation(value = "订单详情")
|
||||||
@GetMapping(value = "/{id}")
|
@GetMapping(value = "/{id}")
|
||||||
|
|
@ -87,6 +104,21 @@ public class StoreOrderController extends XktBaseController {
|
||||||
return success(BeanUtil.toBean(infoDTO, StoreOrderInfoVO.class));
|
return success(BeanUtil.toBean(infoDTO, StoreOrderInfoVO.class));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@PreAuthorize("@ss.hasPermi('system:order:list')")
|
||||||
|
@ApiOperation(value = "订单分页查询")
|
||||||
|
@PostMapping("/page")
|
||||||
|
public R<PageVO<StoreOrderPageItemVO>> page(@Validated @RequestBody StoreOrderQueryVO vo) {
|
||||||
|
StoreOrderQueryDTO queryDTO = BeanUtil.toBean(vo, StoreOrderQueryDTO.class);
|
||||||
|
if (1 == vo.getSrcPage()) {
|
||||||
|
queryDTO.setOrderUserId(SecurityUtils.getUserId());
|
||||||
|
} else {
|
||||||
|
//TODO 当前档口
|
||||||
|
}
|
||||||
|
Page<StoreOrderPageItemDTO> pageDTO = storeOrderService.page(queryDTO);
|
||||||
|
return success(PageVO.of(pageDTO, StoreOrderPageItemVO.class));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 根据支付渠道匹配支付类
|
* 根据支付渠道匹配支付类
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,20 @@
|
||||||
|
package com.ruoyi.web.controller.xkt.vo.order;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import javax.validation.constraints.NotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author liangyq
|
||||||
|
* @date 2025-04-07 18:16
|
||||||
|
*/
|
||||||
|
@ApiModel
|
||||||
|
@Data
|
||||||
|
public class StoreOrderCancelReqVO {
|
||||||
|
|
||||||
|
@NotNull(message = "订单ID不能为空")
|
||||||
|
@ApiModelProperty(value = "订单ID")
|
||||||
|
private Long storeOrderId;
|
||||||
|
}
|
||||||
|
|
@ -25,6 +25,16 @@ public class StoreOrderInfoVO {
|
||||||
*/
|
*/
|
||||||
@ApiModelProperty(value = "档口ID")
|
@ApiModelProperty(value = "档口ID")
|
||||||
private Long storeId;
|
private Long storeId;
|
||||||
|
/**
|
||||||
|
* 档口名称
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "档口名称")
|
||||||
|
private String storeName;
|
||||||
|
/**
|
||||||
|
* 品牌名称
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "品牌名称")
|
||||||
|
private String brandName;
|
||||||
/**
|
/**
|
||||||
* 下单用户ID
|
* 下单用户ID
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,399 @@
|
||||||
|
package com.ruoyi.web.controller.xkt.vo.order;
|
||||||
|
|
||||||
|
import com.ruoyi.xkt.dto.order.StoreOrderDTO;
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.ToString;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author liangyq
|
||||||
|
* @date 2025-04-14 11:18
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@ToString(callSuper = true)
|
||||||
|
public class StoreOrderPageItemVO extends StoreOrderDTO {
|
||||||
|
/**
|
||||||
|
* 订单ID
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "订单ID")
|
||||||
|
private Long id;
|
||||||
|
/**
|
||||||
|
* 档口ID
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "档口ID")
|
||||||
|
private Long storeId;
|
||||||
|
/**
|
||||||
|
* 档口名称
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "档口名称")
|
||||||
|
private String storeName;
|
||||||
|
/**
|
||||||
|
* 品牌名称
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "品牌名称")
|
||||||
|
private String brandName;
|
||||||
|
/**
|
||||||
|
* 下单用户ID
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "下单用户ID")
|
||||||
|
private Long orderUserId;
|
||||||
|
/**
|
||||||
|
* 订单号
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "订单号")
|
||||||
|
private String orderNo;
|
||||||
|
/**
|
||||||
|
* 订单类型[1:销售订单 2:退货订单]
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "订单类型[1:销售订单 2:退货订单]")
|
||||||
|
private Integer orderType;
|
||||||
|
/**
|
||||||
|
* 订单状态(1开头为销售订单状态,2开头为退货订单状态)[10:已取消 11:待付款 12:待发货 13:已发货 14:已完成 21:售后中 22:售后拒绝 23:平台介入 24:售后完成]
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "订单状态(1开头为销售订单状态,2开头为退货订单状态)[10:已取消 11:待付款 12:待发货 13:已发货 14:已完成 21:售后中 22:售后拒绝 23:平台介入 24:售后完成]")
|
||||||
|
private Integer orderStatus;
|
||||||
|
/**
|
||||||
|
* 支付状态[1:初始 2:支付中 3:已支付]
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "支付状态[1:初始 2:支付中 3:已支付]")
|
||||||
|
private Integer payStatus;
|
||||||
|
/**
|
||||||
|
* 订单备注
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "订单备注")
|
||||||
|
private String orderRemark;
|
||||||
|
/**
|
||||||
|
* 商品数量
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "商品数量")
|
||||||
|
private Integer goodsQuantity;
|
||||||
|
/**
|
||||||
|
* 商品金额
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "商品金额")
|
||||||
|
private BigDecimal goodsAmount;
|
||||||
|
/**
|
||||||
|
* 快递费
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "快递费")
|
||||||
|
private BigDecimal expressFee;
|
||||||
|
/**
|
||||||
|
* 总金额(商品金额+快递费)
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "总金额")
|
||||||
|
private BigDecimal totalAmount;
|
||||||
|
/**
|
||||||
|
* 实际总金额(总金额-支付渠道服务费)
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "实际总金额")
|
||||||
|
private BigDecimal realTotalAmount;
|
||||||
|
/**
|
||||||
|
* 退货原订单ID
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "退货原订单ID")
|
||||||
|
private Long refundOrderId;
|
||||||
|
/**
|
||||||
|
* 退货原因
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "退货原因")
|
||||||
|
private Integer refundReasonCode;
|
||||||
|
/**
|
||||||
|
* 退货拒绝原因
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "退货拒绝原因")
|
||||||
|
private String refundRejectReason;
|
||||||
|
/**
|
||||||
|
* 物流ID
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "物流ID")
|
||||||
|
private Long expressId;
|
||||||
|
/**
|
||||||
|
* 发货人-名称
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "发货人-名称")
|
||||||
|
private String originContactName;
|
||||||
|
/**
|
||||||
|
* 发货人-电话
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "发货人-电话")
|
||||||
|
private String originContactPhoneNumber;
|
||||||
|
/**
|
||||||
|
* 发货人-省编码
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "发货人-省编码")
|
||||||
|
private String originProvinceCode;
|
||||||
|
/**
|
||||||
|
* 发货人-市编码
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "发货人-市编码")
|
||||||
|
private String originCityCode;
|
||||||
|
/**
|
||||||
|
* 发货人-区县编码
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "发货人-区县编码")
|
||||||
|
private String originCountyCode;
|
||||||
|
/**
|
||||||
|
* 发货人-详细地址
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "发货人-详细地址")
|
||||||
|
private String originDetailAddress;
|
||||||
|
/**
|
||||||
|
* 收货人-名称
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "收货人-名称")
|
||||||
|
private String destinationContactName;
|
||||||
|
/**
|
||||||
|
* 收货人-电话
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "收货人-电话")
|
||||||
|
private String destinationContactPhoneNumber;
|
||||||
|
/**
|
||||||
|
* 收货人-省编码
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "收货人-省编码")
|
||||||
|
private String destinationProvinceCode;
|
||||||
|
/**
|
||||||
|
* 收货人-市编码
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "收货人-市编码")
|
||||||
|
private String destinationCityCode;
|
||||||
|
/**
|
||||||
|
* 收货人-区县编码
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "收货人-区县编码")
|
||||||
|
private String destinationCountyCode;
|
||||||
|
/**
|
||||||
|
* 收货人-详细地址
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "收货人-详细地址")
|
||||||
|
private String destinationDetailAddress;
|
||||||
|
/**
|
||||||
|
* 发货方式[1:货其再发 2:有货先发]
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "发货方式[1:货其再发 2:有货先发]")
|
||||||
|
private Integer deliveryType;
|
||||||
|
/**
|
||||||
|
* 最晚发货时间
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "最晚发货时间")
|
||||||
|
private Date deliveryEndTime;
|
||||||
|
/**
|
||||||
|
* 自动完成时间
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "自动完成时间")
|
||||||
|
private Date autoEndTime;
|
||||||
|
/**
|
||||||
|
* 凭证日期
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "凭证日期")
|
||||||
|
private Date voucherDate;
|
||||||
|
/**
|
||||||
|
* 删除标志(0代表存在 2代表删除)
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "删除标志(0代表存在 2代表删除)")
|
||||||
|
private String delFlag;
|
||||||
|
/**
|
||||||
|
* 创建者
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "创建者")
|
||||||
|
private String createBy;
|
||||||
|
/**
|
||||||
|
* 创建时间
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "创建时间")
|
||||||
|
private Date createTime;
|
||||||
|
/**
|
||||||
|
* 更新者
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "更新者")
|
||||||
|
private String updateBy;
|
||||||
|
/**
|
||||||
|
* 更新时间
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "更新时间")
|
||||||
|
private Date updateTime;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "快递名")
|
||||||
|
private String expressName;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "发货人-省名称")
|
||||||
|
private String originProvinceName;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "发货人-市名称")
|
||||||
|
private String originCityName;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "发货人-区县名称")
|
||||||
|
private String originCountyName;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "收货人-省名称")
|
||||||
|
private String destinationProvinceName;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "收货人-市名称")
|
||||||
|
private String destinationCityName;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "收货人-区县名称")
|
||||||
|
private String destinationCountyName;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "订单明细")
|
||||||
|
private List<Detail> orderDetails;
|
||||||
|
|
||||||
|
@ApiModel
|
||||||
|
@Data
|
||||||
|
public static class Detail {
|
||||||
|
/**
|
||||||
|
* 预览图url
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "预览图url")
|
||||||
|
private String firstMainPicUrl;
|
||||||
|
/**
|
||||||
|
* 订单明细ID
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "订单明细ID")
|
||||||
|
private Long id;
|
||||||
|
/**
|
||||||
|
* 订单ID
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "订单ID")
|
||||||
|
private Long storeOrderId;
|
||||||
|
/**
|
||||||
|
* 商品颜色尺码ID
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "商品颜色尺码ID")
|
||||||
|
private Long storeProdColorSizeId;
|
||||||
|
/**
|
||||||
|
* 商品ID
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "商品ID")
|
||||||
|
private Long storeProdId;
|
||||||
|
/**
|
||||||
|
* 订单明细状态(同订单状态)[10:已取消 11:待付款 12:待发货 13:已发货 14:已完成 21:售后中 22:售后拒绝 23:平台介入 24:售后完成]
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "订单明细状态(同订单状态)[10:已取消 11:待付款 12:待发货 13:已发货 14:已完成 21:售后中 22:售后拒绝 23:平台介入 24:售后完成]")
|
||||||
|
private Integer detailStatus;
|
||||||
|
/**
|
||||||
|
* 支付状态[1:初始 2:支付中 3:已支付]
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "支付状态[1:初始 2:支付中 3:已支付]")
|
||||||
|
private Integer payStatus;
|
||||||
|
/**
|
||||||
|
* 物流ID
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "物流ID")
|
||||||
|
private Long expressId;
|
||||||
|
/**
|
||||||
|
* 物流类型[1:平台物流 2:档口物流]
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "物流类型[1:平台物流 2:档口物流]")
|
||||||
|
private Integer expressType;
|
||||||
|
/**
|
||||||
|
* 物流状态[1:初始 2:下单中 3:已下单 4:取消中 5:已揽件 6:拦截中 99:已结束]
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "物流状态[1:初始 2:下单中 3:已下单 4:取消中 5:已揽件 6:拦截中 99:已结束]")
|
||||||
|
private Integer expressStatus;
|
||||||
|
/**
|
||||||
|
* 物流请求单号
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "物流请求单号")
|
||||||
|
private String expressReqNo;
|
||||||
|
/**
|
||||||
|
* 物流运单号(快递单号),档口/用户自己填写时可能存在多个,使用“,”分割
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "物流运单号(快递单号),档口/用户自己填写时可能存在多个,使用“,”分割")
|
||||||
|
private String expressWaybillNo;
|
||||||
|
/**
|
||||||
|
* 商品单价
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "商品单价")
|
||||||
|
private BigDecimal goodsPrice;
|
||||||
|
/**
|
||||||
|
* 商品数量
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "商品数量")
|
||||||
|
private Integer goodsQuantity;
|
||||||
|
/**
|
||||||
|
* 商品金额(商品单价*商品数量)
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "商品金额")
|
||||||
|
private BigDecimal goodsAmount;
|
||||||
|
/**
|
||||||
|
* 快递费
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "快递费")
|
||||||
|
private BigDecimal expressFee;
|
||||||
|
/**
|
||||||
|
* 总金额(商品金额+快递费)
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "总金额")
|
||||||
|
private BigDecimal totalAmount;
|
||||||
|
/**
|
||||||
|
* 实际总金额(总金额-支付渠道服务费)
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "实际总金额")
|
||||||
|
private BigDecimal realTotalAmount;
|
||||||
|
/**
|
||||||
|
* 退货原订单明细ID
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "退货原订单明细ID")
|
||||||
|
private Long refundOrderDetailId;
|
||||||
|
/**
|
||||||
|
* 退货原因
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "退货原因")
|
||||||
|
private Integer refundReasonCode;
|
||||||
|
/**
|
||||||
|
* 退货拒绝原因
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "退货拒绝原因")
|
||||||
|
private String refundRejectReason;
|
||||||
|
/**
|
||||||
|
* 删除标志(0代表存在 2代表删除)
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "删除标志(0代表存在 2代表删除)")
|
||||||
|
private String delFlag;
|
||||||
|
/**
|
||||||
|
* 创建者
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "创建者")
|
||||||
|
private String createBy;
|
||||||
|
/**
|
||||||
|
* 创建时间
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "创建时间")
|
||||||
|
private Date createTime;
|
||||||
|
/**
|
||||||
|
* 更新者
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "更新者")
|
||||||
|
private String updateBy;
|
||||||
|
/**
|
||||||
|
* 更新时间
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "更新时间")
|
||||||
|
private Date updateTime;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "档口商品名称")
|
||||||
|
private String prodName;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "商品货号")
|
||||||
|
private String prodArtNum;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "商品标题")
|
||||||
|
private String prodTitle;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "档口颜色ID")
|
||||||
|
private Long storeColorId;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "颜色名称")
|
||||||
|
private String colorName;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "商品尺码")
|
||||||
|
private Integer size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,93 @@
|
||||||
|
package com.ruoyi.web.controller.xkt.vo.order;
|
||||||
|
|
||||||
|
import com.ruoyi.web.controller.xkt.vo.BasePageVO;
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.ToString;
|
||||||
|
|
||||||
|
import javax.validation.constraints.NotNull;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author liangyq
|
||||||
|
* @date 2025-04-14 12:54
|
||||||
|
*/
|
||||||
|
@ApiModel
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@ToString(callSuper = true)
|
||||||
|
public class StoreOrderQueryVO extends BasePageVO {
|
||||||
|
/**
|
||||||
|
* 档口ID
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "档口ID")
|
||||||
|
private Long storeId;
|
||||||
|
// /**
|
||||||
|
// * 下单用户ID
|
||||||
|
// */
|
||||||
|
// @ApiModelProperty(value = "下单用户ID")
|
||||||
|
// private Long orderUserId;
|
||||||
|
/**
|
||||||
|
* 订单号(模糊)
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "订单号(模糊)")
|
||||||
|
private String orderNo;
|
||||||
|
/**
|
||||||
|
* 订单状态(1开头为销售订单状态,2开头为退货订单状态)[10:已取消 11:待付款 12:待发货 13:已发货 14:已完成 21:售后中 22:售后拒绝 23:平台介入 24:售后完成]
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "订单状态(1开头为销售订单状态,2开头为退货订单状态)[10:已取消 11:待付款 12:待发货 13:已发货 14:已完成 21:售后中 22:售后拒绝 23:平台介入 24:售后完成]")
|
||||||
|
private Integer orderStatus;
|
||||||
|
/**
|
||||||
|
* 收货人-名称(模糊)
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "收货人-名称(模糊)")
|
||||||
|
private String destinationContactName;
|
||||||
|
/**
|
||||||
|
* 收货人-电话(模糊)
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "收货人-电话(模糊)")
|
||||||
|
private String destinationContactPhoneNumber;
|
||||||
|
/**
|
||||||
|
* 发货方式[1:货其再发 2:有货先发]
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "发货方式[1:货其再发 2:有货先发]")
|
||||||
|
private Integer deliveryType;
|
||||||
|
/**
|
||||||
|
* 下单开始时间
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "下单开始时间")
|
||||||
|
private Date orderTimeBegin;
|
||||||
|
/**
|
||||||
|
* 下单结束时间
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "下单结束时间")
|
||||||
|
private Date orderTimeEnd;
|
||||||
|
/**
|
||||||
|
* 支付开始时间
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "支付开始时间")
|
||||||
|
private Date payTimeBegin;
|
||||||
|
/**
|
||||||
|
* 支付结束时间
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "支付结束时间")
|
||||||
|
private Date payTimeEnd;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 物流运单号(模糊)
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "物流运单号(模糊)")
|
||||||
|
private String expressWaybillNo;
|
||||||
|
/**
|
||||||
|
* 商品货号(模糊)
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "商品货号(模糊)")
|
||||||
|
private String prodArtNum;
|
||||||
|
|
||||||
|
@NotNull(message = "来源页面不能为空")
|
||||||
|
@ApiModelProperty(value = "来源页面[1:卖家订单列表 2:档口订单列表]")
|
||||||
|
private Integer srcPage;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -204,6 +204,8 @@ public class Constants
|
||||||
|
|
||||||
public static final String VERSION_LOCK_ERROR_COMMON_MSG = "系统繁忙,请稍后再试";
|
public static final String VERSION_LOCK_ERROR_COMMON_MSG = "系统繁忙,请稍后再试";
|
||||||
|
|
||||||
|
public static final String REGION_MAP_CACHE_KEY = "REGION_MAP";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,6 @@ package com.ruoyi.common.core.page;
|
||||||
|
|
||||||
import cn.hutool.core.bean.BeanUtil;
|
import cn.hutool.core.bean.BeanUtil;
|
||||||
import com.github.pagehelper.PageInfo;
|
import com.github.pagehelper.PageInfo;
|
||||||
import com.ruoyi.common.constant.HttpStatus;
|
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
|
|
@ -58,6 +57,15 @@ public class Page<T> implements Serializable {
|
||||||
return page;
|
return page;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static <T> Page<T> convert(com.github.pagehelper.Page<T> srcPage) {
|
||||||
|
Page<T> page = new Page<>();
|
||||||
|
page.setTotal(srcPage.getTotal());
|
||||||
|
page.setPageNum(srcPage.getPageNum());
|
||||||
|
page.setPageSize(srcPage.getPageSize());
|
||||||
|
page.setList(srcPage.getResult());
|
||||||
|
return page;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public static <T> Page<T> empty(int pageSize, int pageNum) {
|
public static <T> Page<T> empty(int pageSize, int pageNum) {
|
||||||
Page<T> page = new Page<>();
|
Page<T> page = new Page<>();
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,48 @@
|
||||||
|
package com.ruoyi.common.core.page;
|
||||||
|
|
||||||
|
import cn.hutool.core.bean.BeanUtil;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 鞋库通Page分页对象
|
||||||
|
*
|
||||||
|
* @author ruoyi
|
||||||
|
*/
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
@Data
|
||||||
|
@Accessors(chain = true)
|
||||||
|
public class PageVO<T> implements Serializable {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
@ApiModelProperty("当前页")
|
||||||
|
private Long pageNum;
|
||||||
|
|
||||||
|
@ApiModelProperty("每页记录数")
|
||||||
|
private Long pageSize;
|
||||||
|
|
||||||
|
@ApiModelProperty("总记录数")
|
||||||
|
private Long total;
|
||||||
|
|
||||||
|
@ApiModelProperty("结果集")
|
||||||
|
private List<T> list;
|
||||||
|
|
||||||
|
public static <T> PageVO<T> of(Page page, Class<T> clazz) {
|
||||||
|
return new PageVO<>(page.getPageNum(), page.getPageSize(), page.getTotal(),
|
||||||
|
BeanUtil.copyToList(page.getList(), clazz));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> PageVO<T> of(com.github.pagehelper.Page page, Class<T> clazz) {
|
||||||
|
return new PageVO<>((long) page.getPageNum(), (long) page.getPageSize(), page.getTotal(),
|
||||||
|
BeanUtil.copyToList(page.getResult(), clazz));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -6,6 +6,8 @@ import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
import lombok.ToString;
|
import lombok.ToString;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 物流行政区划
|
* 物流行政区划
|
||||||
*
|
*
|
||||||
|
|
@ -15,7 +17,7 @@ import lombok.ToString;
|
||||||
@Data
|
@Data
|
||||||
@EqualsAndHashCode(callSuper = true)
|
@EqualsAndHashCode(callSuper = true)
|
||||||
@ToString(callSuper = true)
|
@ToString(callSuper = true)
|
||||||
public class ExpressRegion extends SimpleEntity {
|
public class ExpressRegion extends SimpleEntity implements Serializable {
|
||||||
/**
|
/**
|
||||||
* 地区编码,基于行政区划代码做扩展,唯一约束
|
* 地区编码,基于行政区划代码做扩展,唯一约束
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,7 @@ public class StoreOrderOperationRecord extends SimpleEntity {
|
||||||
*/
|
*/
|
||||||
private Integer targetType;
|
private Integer targetType;
|
||||||
/**
|
/**
|
||||||
* 节点事件[1:下单 2:支付 3:取消 4:发货 5:完成 6:申请售后 7:寄回 8:售后拒绝 9:平台介入 10:售后完成]
|
* 节点事件
|
||||||
*/
|
*/
|
||||||
private Integer action;
|
private Integer action;
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,23 @@
|
||||||
|
package com.ruoyi.xkt.dto.order;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author liangyq
|
||||||
|
* @date 2025-04-14 18:52
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Builder
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
public class OrderOptDTO {
|
||||||
|
|
||||||
|
private Long storeOrderId;
|
||||||
|
|
||||||
|
private Long operatorId;
|
||||||
|
|
||||||
|
private String remark;
|
||||||
|
}
|
||||||
|
|
@ -15,6 +15,10 @@ import java.util.List;
|
||||||
@ToString(callSuper = true)
|
@ToString(callSuper = true)
|
||||||
public class StoreOrderInfoDTO extends StoreOrderDTO {
|
public class StoreOrderInfoDTO extends StoreOrderDTO {
|
||||||
|
|
||||||
|
private String storeName;
|
||||||
|
|
||||||
|
private String brandName;
|
||||||
|
|
||||||
private String expressName;
|
private String expressName;
|
||||||
|
|
||||||
private String originProvinceName;
|
private String originProvinceName;
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,7 @@ public class StoreOrderOperationRecordAddDTO {
|
||||||
*/
|
*/
|
||||||
private Integer targetType;
|
private Integer targetType;
|
||||||
/**
|
/**
|
||||||
* 节点事件[1:下单 2:支付 3:取消 4:发货 5:完成 6:申请售后 7:寄回 8:售后拒绝 9:平台介入 10:售后完成]
|
* 节点事件
|
||||||
*/
|
*/
|
||||||
private Integer action;
|
private Integer action;
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,7 @@ public class StoreOrderOperationRecordDTO {
|
||||||
*/
|
*/
|
||||||
private Integer targetType;
|
private Integer targetType;
|
||||||
/**
|
/**
|
||||||
* 节点事件[1:下单 2:支付 3:取消 4:发货 5:完成 6:申请售后 7:寄回 8:售后拒绝 9:平台介入 10:售后完成]
|
* 节点事件
|
||||||
*/
|
*/
|
||||||
private Integer action;
|
private Integer action;
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,46 @@
|
||||||
|
package com.ruoyi.xkt.dto.order;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.ToString;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author liangyq
|
||||||
|
* @date 2025-04-14 11:18
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@ToString(callSuper = true)
|
||||||
|
public class StoreOrderPageItemDTO extends StoreOrderDTO {
|
||||||
|
|
||||||
|
private String storeName;
|
||||||
|
|
||||||
|
private String brandName;
|
||||||
|
|
||||||
|
private String expressName;
|
||||||
|
|
||||||
|
private String originProvinceName;
|
||||||
|
|
||||||
|
private String originCityName;
|
||||||
|
|
||||||
|
private String originCountyName;
|
||||||
|
|
||||||
|
private String destinationProvinceName;
|
||||||
|
|
||||||
|
private String destinationCityName;
|
||||||
|
|
||||||
|
private String destinationCountyName;
|
||||||
|
|
||||||
|
private List<Detail> orderDetails;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@ToString(callSuper = true)
|
||||||
|
public static class Detail extends StoreOrderDetailDTO {
|
||||||
|
|
||||||
|
private String firstMainPicUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,73 @@
|
||||||
|
package com.ruoyi.xkt.dto.order;
|
||||||
|
|
||||||
|
import com.ruoyi.xkt.dto.BasePageDTO;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.ToString;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author liangyq
|
||||||
|
* @date 2025-04-14 12:54
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@ToString(callSuper = true)
|
||||||
|
public class StoreOrderQueryDTO extends BasePageDTO {
|
||||||
|
/**
|
||||||
|
* 档口ID
|
||||||
|
*/
|
||||||
|
private Long storeId;
|
||||||
|
/**
|
||||||
|
* 下单用户ID
|
||||||
|
*/
|
||||||
|
private Long orderUserId;
|
||||||
|
/**
|
||||||
|
* 订单号(模糊)
|
||||||
|
*/
|
||||||
|
private String orderNo;
|
||||||
|
/**
|
||||||
|
* 订单状态(1开头为销售订单状态,2开头为退货订单状态)[10:已取消 11:待付款 12:待发货 13:已发货 14:已完成 21:售后中 22:售后拒绝 23:平台介入 24:售后完成]
|
||||||
|
*/
|
||||||
|
private Integer orderStatus;
|
||||||
|
/**
|
||||||
|
* 收货人-名称(模糊)
|
||||||
|
*/
|
||||||
|
private String destinationContactName;
|
||||||
|
/**
|
||||||
|
* 收货人-电话(模糊)
|
||||||
|
*/
|
||||||
|
private String destinationContactPhoneNumber;
|
||||||
|
/**
|
||||||
|
* 发货方式[1:货其再发 2:有货先发]
|
||||||
|
*/
|
||||||
|
private Integer deliveryType;
|
||||||
|
/**
|
||||||
|
* 下单开始时间
|
||||||
|
*/
|
||||||
|
private Date orderTimeBegin;
|
||||||
|
/**
|
||||||
|
* 下单结束时间
|
||||||
|
*/
|
||||||
|
private Date orderTimeEnd;
|
||||||
|
/**
|
||||||
|
* 支付开始时间
|
||||||
|
*/
|
||||||
|
private Date payTimeBegin;
|
||||||
|
/**
|
||||||
|
* 支付结束时间
|
||||||
|
*/
|
||||||
|
private Date payTimeEnd;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 物流运单号(模糊)
|
||||||
|
*/
|
||||||
|
private String expressWaybillNo;
|
||||||
|
/**
|
||||||
|
* 商品货号(模糊)
|
||||||
|
*/
|
||||||
|
private String prodArtNum;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -15,6 +15,7 @@ public enum EOrderAction {
|
||||||
UPDATE(2, "修改"),
|
UPDATE(2, "修改"),
|
||||||
DELETE(3, "删除"),
|
DELETE(3, "删除"),
|
||||||
PAY(4, "支付"),
|
PAY(4, "支付"),
|
||||||
|
CANCEL(5, "取消"),
|
||||||
;
|
;
|
||||||
|
|
||||||
private final Integer value;
|
private final Integer value;
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
package com.ruoyi.xkt.enums;
|
package com.ruoyi.xkt.enums;
|
||||||
|
|
||||||
|
import com.ruoyi.common.exception.ServiceException;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -25,4 +25,13 @@ public interface PaymentManager {
|
||||||
*/
|
*/
|
||||||
String payOrder(StoreOrderExt order, EPayPage payFrom);
|
String payOrder(StoreOrderExt order, EPayPage payFrom);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否已支付
|
||||||
|
* 此方法通常用来判否,如果返回true还需要核对支付金额等相关信息才可确定是否完成支付!!
|
||||||
|
*
|
||||||
|
* @param orderNo 订单号
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
boolean isOrderPaid(String orderNo);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,16 @@
|
||||||
package com.ruoyi.xkt.manager.impl;
|
package com.ruoyi.xkt.manager.impl;
|
||||||
|
|
||||||
|
import cn.hutool.core.lang.Assert;
|
||||||
import com.alibaba.fastjson2.JSON;
|
import com.alibaba.fastjson2.JSON;
|
||||||
import com.alipay.api.AlipayApiException;
|
import com.alipay.api.AlipayApiException;
|
||||||
import com.alipay.api.AlipayClient;
|
import com.alipay.api.AlipayClient;
|
||||||
import com.alipay.api.DefaultAlipayClient;
|
import com.alipay.api.DefaultAlipayClient;
|
||||||
|
import com.alipay.api.diagnosis.DiagnosisUtils;
|
||||||
|
import com.alipay.api.domain.AlipayTradeQueryModel;
|
||||||
import com.alipay.api.request.AlipayTradePagePayRequest;
|
import com.alipay.api.request.AlipayTradePagePayRequest;
|
||||||
|
import com.alipay.api.request.AlipayTradeQueryRequest;
|
||||||
import com.alipay.api.request.AlipayTradeWapPayRequest;
|
import com.alipay.api.request.AlipayTradeWapPayRequest;
|
||||||
|
import com.alipay.api.response.AlipayTradeQueryResponse;
|
||||||
import com.ruoyi.common.exception.ServiceException;
|
import com.ruoyi.common.exception.ServiceException;
|
||||||
import com.ruoyi.xkt.dto.finance.AlipayReqDTO;
|
import com.ruoyi.xkt.dto.finance.AlipayReqDTO;
|
||||||
import com.ruoyi.xkt.dto.order.StoreOrderExt;
|
import com.ruoyi.xkt.dto.order.StoreOrderExt;
|
||||||
|
|
@ -13,7 +18,6 @@ import com.ruoyi.xkt.enums.EPayChannel;
|
||||||
import com.ruoyi.xkt.enums.EPayPage;
|
import com.ruoyi.xkt.enums.EPayPage;
|
||||||
import com.ruoyi.xkt.enums.EPayStatus;
|
import com.ruoyi.xkt.enums.EPayStatus;
|
||||||
import com.ruoyi.xkt.manager.PaymentManager;
|
import com.ruoyi.xkt.manager.PaymentManager;
|
||||||
import io.jsonwebtoken.lang.Assert;
|
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
|
|
@ -119,4 +123,47 @@ public class AliPaymentMangerImpl implements PaymentManager {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isOrderPaid(String orderNo) {
|
||||||
|
Assert.notEmpty(orderNo);
|
||||||
|
AlipayClient alipayClient = new DefaultAlipayClient(gatewayUrl, appId, privateKey, DEFAULT_FORMAT, charset,
|
||||||
|
alipayPublicKey, signType);
|
||||||
|
// 构造请求参数以调用接口
|
||||||
|
AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
|
||||||
|
AlipayTradeQueryModel model = new AlipayTradeQueryModel();
|
||||||
|
model.setOutTradeNo(orderNo);
|
||||||
|
request.setBizModel(model);
|
||||||
|
AlipayTradeQueryResponse response = null;
|
||||||
|
try {
|
||||||
|
response = alipayClient.execute(request);
|
||||||
|
if (response.isSuccess()) {
|
||||||
|
String tradeStatus = JSON.parseObject(response.getBody())
|
||||||
|
.getJSONObject("alipay_trade_query_response")
|
||||||
|
.getString("trade_status");
|
||||||
|
//交易支付成功
|
||||||
|
if ("TRADE_SUCCESS".equals(tradeStatus)
|
||||||
|
//交易结束,不可退款
|
||||||
|
|| "TRADE_FINISHED".equals(tradeStatus)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
//获取诊断链接
|
||||||
|
String diagnosisUrl = DiagnosisUtils.getDiagnosisUrl(response);
|
||||||
|
log.warn("查询订单支付结果异常: {}", diagnosisUrl);
|
||||||
|
//获取错误码
|
||||||
|
String subCode = JSON.parseObject(response.getBody())
|
||||||
|
.getJSONObject("alipay_trade_query_response")
|
||||||
|
.getString("sub_code");
|
||||||
|
if ("ACQ.TRADE_NOT_EXIST".equals(subCode)) {
|
||||||
|
//交易不存在
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("查询订单支付结果异常", e);
|
||||||
|
}
|
||||||
|
throw new ServiceException("查询订单支付结果失败");
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,12 +2,18 @@ package com.ruoyi.xkt.mapper;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
import com.ruoyi.xkt.domain.StoreOrder;
|
import com.ruoyi.xkt.domain.StoreOrder;
|
||||||
|
import com.ruoyi.xkt.dto.order.StoreOrderPageItemDTO;
|
||||||
|
import com.ruoyi.xkt.dto.order.StoreOrderQueryDTO;
|
||||||
import org.springframework.stereotype.Repository;
|
import org.springframework.stereotype.Repository;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author liangyq
|
* @author liangyq
|
||||||
* @date 2025-04-02 12:48
|
* @date 2025-04-02 12:48
|
||||||
*/
|
*/
|
||||||
@Repository
|
@Repository
|
||||||
public interface StoreOrderMapper extends BaseMapper<StoreOrder> {
|
public interface StoreOrderMapper extends BaseMapper<StoreOrder> {
|
||||||
|
|
||||||
|
List<StoreOrderPageItemDTO> listStoreOrderPageItem(StoreOrderQueryDTO queryDTO);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@ import com.ruoyi.xkt.dto.express.ExpressContactDTO;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author liangyq
|
* @author liangyq
|
||||||
|
|
@ -55,4 +56,11 @@ public interface IExpressService {
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
List<ExpressRegion> listRegionByCode(Collection<String> regionCodes);
|
List<ExpressRegion> listRegionByCode(Collection<String> regionCodes);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取缓存的行政编码
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
Map<String, ExpressRegion> getRegionMapCache();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
package com.ruoyi.xkt.service;
|
package com.ruoyi.xkt.service;
|
||||||
|
|
||||||
|
import com.github.pagehelper.Page;
|
||||||
import com.ruoyi.xkt.domain.StoreOrder;
|
import com.ruoyi.xkt.domain.StoreOrder;
|
||||||
import com.ruoyi.xkt.dto.order.*;
|
import com.ruoyi.xkt.dto.order.*;
|
||||||
import com.ruoyi.xkt.enums.EPayChannel;
|
import com.ruoyi.xkt.enums.EPayChannel;
|
||||||
|
|
@ -48,6 +49,14 @@ public interface IStoreOrderService {
|
||||||
*/
|
*/
|
||||||
StoreOrderInfoDTO getInfo(Long storeOrderId);
|
StoreOrderInfoDTO getInfo(Long storeOrderId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 分页查询订单
|
||||||
|
*
|
||||||
|
* @param queryDTO
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
Page<StoreOrderPageItemDTO> page(StoreOrderQueryDTO queryDTO);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 准备支付订单
|
* 准备支付订单
|
||||||
*
|
*
|
||||||
|
|
@ -65,4 +74,11 @@ public interface IStoreOrderService {
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
StoreOrderExt paySuccess(Long storeOrderId, BigDecimal totalAmount, BigDecimal realTotalAmount);
|
StoreOrderExt paySuccess(Long storeOrderId, BigDecimal totalAmount, BigDecimal realTotalAmount);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 取消订单
|
||||||
|
*
|
||||||
|
* @param opt
|
||||||
|
*/
|
||||||
|
void cancelOrder(OrderOptDTO opt);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,8 @@ import cn.hutool.core.collection.CollUtil;
|
||||||
import cn.hutool.core.collection.ListUtil;
|
import cn.hutool.core.collection.ListUtil;
|
||||||
import cn.hutool.core.lang.Assert;
|
import cn.hutool.core.lang.Assert;
|
||||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||||
|
import com.ruoyi.common.constant.Constants;
|
||||||
|
import com.ruoyi.common.core.redis.RedisCache;
|
||||||
import com.ruoyi.common.utils.bean.BeanValidators;
|
import com.ruoyi.common.utils.bean.BeanValidators;
|
||||||
import com.ruoyi.xkt.domain.Express;
|
import com.ruoyi.xkt.domain.Express;
|
||||||
import com.ruoyi.xkt.domain.ExpressFeeConfig;
|
import com.ruoyi.xkt.domain.ExpressFeeConfig;
|
||||||
|
|
@ -20,6 +22,7 @@ import java.util.Arrays;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.function.Function;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -46,6 +49,8 @@ public class ExpressServiceImpl implements IExpressService {
|
||||||
private ExpressRegionMapper expressRegionMapper;
|
private ExpressRegionMapper expressRegionMapper;
|
||||||
@Autowired
|
@Autowired
|
||||||
private StoreMapper storeMapper;
|
private StoreMapper storeMapper;
|
||||||
|
@Autowired
|
||||||
|
private RedisCache redisCache;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void checkExpress(Long expressId) {
|
public void checkExpress(Long expressId) {
|
||||||
|
|
@ -115,4 +120,15 @@ public class ExpressServiceImpl implements IExpressService {
|
||||||
return expressRegionMapper.selectList(Wrappers.lambdaQuery(ExpressRegion.class)
|
return expressRegionMapper.selectList(Wrappers.lambdaQuery(ExpressRegion.class)
|
||||||
.in(ExpressRegion::getRegionCode, regionCodes));
|
.in(ExpressRegion::getRegionCode, regionCodes));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Map<String, ExpressRegion> getRegionMapCache() {
|
||||||
|
Map<String, ExpressRegion> regionMap = redisCache.getCacheMap(Constants.REGION_MAP_CACHE_KEY);
|
||||||
|
if (regionMap == null || regionMap.isEmpty()) {
|
||||||
|
regionMap = expressRegionMapper.selectList(Wrappers.emptyWrapper()).stream()
|
||||||
|
.collect(Collectors.toMap(ExpressRegion::getRegionCode, Function.identity()));
|
||||||
|
redisCache.setCacheMap(Constants.REGION_MAP_CACHE_KEY, regionMap);
|
||||||
|
}
|
||||||
|
return regionMap;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,8 @@ import cn.hutool.core.date.DateUtil;
|
||||||
import cn.hutool.core.lang.Assert;
|
import cn.hutool.core.lang.Assert;
|
||||||
import cn.hutool.core.util.NumberUtil;
|
import cn.hutool.core.util.NumberUtil;
|
||||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||||
|
import com.github.pagehelper.Page;
|
||||||
|
import com.github.pagehelper.PageHelper;
|
||||||
import com.ruoyi.common.constant.Constants;
|
import com.ruoyi.common.constant.Constants;
|
||||||
import com.ruoyi.common.core.domain.SimpleEntity;
|
import com.ruoyi.common.core.domain.SimpleEntity;
|
||||||
import com.ruoyi.common.core.domain.XktBaseEntity;
|
import com.ruoyi.common.core.domain.XktBaseEntity;
|
||||||
|
|
@ -14,6 +16,7 @@ import com.ruoyi.common.utils.bean.BeanValidators;
|
||||||
import com.ruoyi.xkt.domain.*;
|
import com.ruoyi.xkt.domain.*;
|
||||||
import com.ruoyi.xkt.dto.express.ExpressContactDTO;
|
import com.ruoyi.xkt.dto.express.ExpressContactDTO;
|
||||||
import com.ruoyi.xkt.dto.order.*;
|
import com.ruoyi.xkt.dto.order.*;
|
||||||
|
import com.ruoyi.xkt.dto.storeProductFile.StoreProdMainPicDTO;
|
||||||
import com.ruoyi.xkt.enums.*;
|
import com.ruoyi.xkt.enums.*;
|
||||||
import com.ruoyi.xkt.manager.PaymentManager;
|
import com.ruoyi.xkt.manager.PaymentManager;
|
||||||
import com.ruoyi.xkt.mapper.*;
|
import com.ruoyi.xkt.mapper.*;
|
||||||
|
|
@ -34,6 +37,8 @@ import java.util.*;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import static com.ruoyi.common.constant.Constants.ORDER_NUM_1;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author liangyq
|
* @author liangyq
|
||||||
* @date 2025-04-02 13:19
|
* @date 2025-04-02 13:19
|
||||||
|
|
@ -46,6 +51,8 @@ public class StoreOrderServiceImpl implements IStoreOrderService {
|
||||||
@Autowired
|
@Autowired
|
||||||
private StoreOrderDetailMapper storeOrderDetailMapper;
|
private StoreOrderDetailMapper storeOrderDetailMapper;
|
||||||
@Autowired
|
@Autowired
|
||||||
|
private StoreMapper storeMapper;
|
||||||
|
@Autowired
|
||||||
private StoreProductMapper storeProductMapper;
|
private StoreProductMapper storeProductMapper;
|
||||||
@Autowired
|
@Autowired
|
||||||
private StoreProductColorSizeMapper storeProductColorSizeMapper;
|
private StoreProductColorSizeMapper storeProductColorSizeMapper;
|
||||||
|
|
@ -64,7 +71,7 @@ public class StoreOrderServiceImpl implements IStoreOrderService {
|
||||||
@Autowired
|
@Autowired
|
||||||
private List<PaymentManager> paymentManagers;
|
private List<PaymentManager> paymentManagers;
|
||||||
|
|
||||||
@Transactional
|
@Transactional(rollbackFor = Exception.class)
|
||||||
@Override
|
@Override
|
||||||
public StoreOrderAddResult createOrder(StoreOrderAddDTO storeOrderAddDTO, boolean beginPay, EPayChannel payChannel,
|
public StoreOrderAddResult createOrder(StoreOrderAddDTO storeOrderAddDTO, boolean beginPay, EPayChannel payChannel,
|
||||||
EPayPage payPage) {
|
EPayPage payPage) {
|
||||||
|
|
@ -196,7 +203,7 @@ public class StoreOrderServiceImpl implements IStoreOrderService {
|
||||||
return new StoreOrderAddResult(orderExt, rtnStr);
|
return new StoreOrderAddResult(orderExt, rtnStr);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Transactional
|
@Transactional(rollbackFor = Exception.class)
|
||||||
@Override
|
@Override
|
||||||
public StoreOrderExt modifyOrder(StoreOrderUpdateDTO storeOrderUpdateDTO) {
|
public StoreOrderExt modifyOrder(StoreOrderUpdateDTO storeOrderUpdateDTO) {
|
||||||
//原订单
|
//原订单
|
||||||
|
|
@ -348,21 +355,28 @@ public class StoreOrderServiceImpl implements IStoreOrderService {
|
||||||
List<StoreOrderDetailInfoDTO> detailInfos = BeanUtil.copyToList(details,
|
List<StoreOrderDetailInfoDTO> detailInfos = BeanUtil.copyToList(details,
|
||||||
StoreOrderDetailInfoDTO.class);
|
StoreOrderDetailInfoDTO.class);
|
||||||
orderInfo.setOrderDetails(detailInfos);
|
orderInfo.setOrderDetails(detailInfos);
|
||||||
|
//档口信息
|
||||||
|
Store store = storeMapper.selectById(order.getStoreId());
|
||||||
|
if (store != null) {
|
||||||
|
orderInfo.setStoreName(store.getStoreName());
|
||||||
|
orderInfo.setBrandName(store.getBrandName());
|
||||||
|
}
|
||||||
//物流信息
|
//物流信息
|
||||||
Express express = expressService.getById(order.getExpressId());
|
Express express = expressService.getById(order.getExpressId());
|
||||||
orderInfo.setExpressName(Optional.ofNullable(express).map(Express::getExpressName).orElse(null));
|
orderInfo.setExpressName(Optional.ofNullable(express).map(Express::getExpressName).orElse(null));
|
||||||
Map<String, String> regionNameMap = expressService.listRegionByCode(Arrays
|
Map<String, ExpressRegion> regionMap = expressService.getRegionMapCache();
|
||||||
.asList(order.getDestinationProvinceCode(), order.getDestinationCityCode(),
|
orderInfo.setDestinationProvinceName(Optional.ofNullable(regionMap.get(orderInfo.getDestinationProvinceCode()))
|
||||||
order.getDestinationCountyCode(), order.getOriginProvinceCode(),
|
.map(ExpressRegion::getParentRegionName).orElse(null));
|
||||||
order.getOriginCityCode(), order.getOriginCountyCode()))
|
orderInfo.setDestinationCityName(Optional.ofNullable(regionMap.get(orderInfo.getDestinationCityCode()))
|
||||||
.stream()
|
.map(ExpressRegion::getParentRegionName).orElse(null));
|
||||||
.collect(Collectors.toMap(ExpressRegion::getRegionCode, ExpressRegion::getRegionName));
|
orderInfo.setDestinationCountyName(Optional.ofNullable(regionMap.get(orderInfo.getDestinationCountyCode()))
|
||||||
orderInfo.setDestinationProvinceName(regionNameMap.get(orderInfo.getDestinationProvinceCode()));
|
.map(ExpressRegion::getParentRegionName).orElse(null));
|
||||||
orderInfo.setDestinationCityName(regionNameMap.get(orderInfo.getDestinationCityCode()));
|
orderInfo.setOriginProvinceName(Optional.ofNullable(regionMap.get(orderInfo.getOriginProvinceCode()))
|
||||||
orderInfo.setDestinationCountyName(regionNameMap.get(orderInfo.getDestinationCountyCode()));
|
.map(ExpressRegion::getParentRegionName).orElse(null));
|
||||||
orderInfo.setOriginProvinceName(regionNameMap.get(orderInfo.getOriginProvinceCode()));
|
orderInfo.setOriginCityName(Optional.ofNullable(regionMap.get(orderInfo.getOriginCityCode()))
|
||||||
orderInfo.setOriginCityName(regionNameMap.get(orderInfo.getOriginCityCode()));
|
.map(ExpressRegion::getParentRegionName).orElse(null));
|
||||||
orderInfo.setOriginCountyName(regionNameMap.get(orderInfo.getOriginCountyCode()));
|
orderInfo.setOriginCountyName(Optional.ofNullable(regionMap.get(orderInfo.getOriginCountyCode()))
|
||||||
|
.map(ExpressRegion::getParentRegionName).orElse(null));
|
||||||
//商品信息
|
//商品信息
|
||||||
for (StoreOrderDetailInfoDTO detailInfo : detailInfos) {
|
for (StoreOrderDetailInfoDTO detailInfo : detailInfos) {
|
||||||
detailInfo.setFileList(storeProductFileMapper.selectListByStoreProdId(detailInfo.getStoreProdId()));
|
detailInfo.setFileList(storeProductFileMapper.selectListByStoreProdId(detailInfo.getStoreProdId()));
|
||||||
|
|
@ -370,7 +384,52 @@ public class StoreOrderServiceImpl implements IStoreOrderService {
|
||||||
return orderInfo;
|
return orderInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Transactional
|
@Override
|
||||||
|
public Page<StoreOrderPageItemDTO> page(StoreOrderQueryDTO queryDTO) {
|
||||||
|
Page<StoreOrderPageItemDTO> page = PageHelper.startPage(queryDTO.getPageNum(), queryDTO.getPageSize());
|
||||||
|
storeOrderMapper.listStoreOrderPageItem(queryDTO);
|
||||||
|
if (CollUtil.isNotEmpty(page.getResult())) {
|
||||||
|
List<StoreOrderPageItemDTO> list = page.getResult();
|
||||||
|
Set<Long> soIds = list.stream().map(StoreOrderPageItemDTO::getId).collect(Collectors.toSet());
|
||||||
|
List<StoreOrderDetail> orderDetailList = storeOrderDetailMapper.selectList(Wrappers
|
||||||
|
.lambdaQuery(StoreOrderDetail.class).eq(SimpleEntity::getDelFlag, Constants.UNDELETED)
|
||||||
|
.in(StoreOrderDetail::getStoreOrderId, soIds));
|
||||||
|
List<Long> spIds = orderDetailList.stream().map(StoreOrderDetail::getStoreProdId).distinct()
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
Map<Long, String> mainPicMap = storeProductFileMapper.selectMainPicByStoreProdIdList(spIds,
|
||||||
|
FileType.MAIN_PIC.getValue(), ORDER_NUM_1).stream()
|
||||||
|
.collect(Collectors.toMap(StoreProdMainPicDTO::getStoreProdId, StoreProdMainPicDTO::getFileUrl,
|
||||||
|
(o, n) -> n));
|
||||||
|
Map<Long, List<StoreOrderPageItemDTO.Detail>> orderDetailGroup = BeanUtil.copyToList(orderDetailList,
|
||||||
|
StoreOrderPageItemDTO.Detail.class)
|
||||||
|
.stream()
|
||||||
|
.collect(Collectors.groupingBy(StoreOrderDetailDTO::getStoreOrderId));
|
||||||
|
Map<String, ExpressRegion> regionMap = expressService.getRegionMapCache();
|
||||||
|
for (StoreOrderPageItemDTO order : list) {
|
||||||
|
//物流信息
|
||||||
|
order.setDestinationProvinceName(Optional.ofNullable(regionMap.get(order.getDestinationProvinceCode()))
|
||||||
|
.map(ExpressRegion::getParentRegionName).orElse(null));
|
||||||
|
order.setDestinationCityName(Optional.ofNullable(regionMap.get(order.getDestinationCityCode()))
|
||||||
|
.map(ExpressRegion::getParentRegionName).orElse(null));
|
||||||
|
order.setDestinationCountyName(Optional.ofNullable(regionMap.get(order.getDestinationCountyCode()))
|
||||||
|
.map(ExpressRegion::getParentRegionName).orElse(null));
|
||||||
|
order.setOriginProvinceName(Optional.ofNullable(regionMap.get(order.getOriginProvinceCode()))
|
||||||
|
.map(ExpressRegion::getParentRegionName).orElse(null));
|
||||||
|
order.setOriginCityName(Optional.ofNullable(regionMap.get(order.getOriginCityCode()))
|
||||||
|
.map(ExpressRegion::getParentRegionName).orElse(null));
|
||||||
|
order.setOriginCountyName(Optional.ofNullable(regionMap.get(order.getOriginCountyCode()))
|
||||||
|
.map(ExpressRegion::getParentRegionName).orElse(null));
|
||||||
|
order.setOrderDetails(orderDetailGroup.get(order.getId()));
|
||||||
|
for (StoreOrderPageItemDTO.Detail detail : order.getOrderDetails()) {
|
||||||
|
//首图
|
||||||
|
detail.setFirstMainPicUrl(mainPicMap.get(detail.getStoreProdId()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return page;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
@Override
|
@Override
|
||||||
public StoreOrderExt preparePayOrder(Long storeOrderId) {
|
public StoreOrderExt preparePayOrder(Long storeOrderId) {
|
||||||
Assert.notNull(storeOrderId);
|
Assert.notNull(storeOrderId);
|
||||||
|
|
@ -399,7 +458,7 @@ public class StoreOrderServiceImpl implements IStoreOrderService {
|
||||||
return new StoreOrderExt(order, orderDetails);
|
return new StoreOrderExt(order, orderDetails);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Transactional
|
@Transactional(rollbackFor = Exception.class)
|
||||||
@Override
|
@Override
|
||||||
public StoreOrderExt paySuccess(Long storeOrderId, BigDecimal totalAmount, BigDecimal realTotalAmount) {
|
public StoreOrderExt paySuccess(Long storeOrderId, BigDecimal totalAmount, BigDecimal realTotalAmount) {
|
||||||
Assert.notNull(storeOrderId);
|
Assert.notNull(storeOrderId);
|
||||||
|
|
@ -451,6 +510,51 @@ public class StoreOrderServiceImpl implements IStoreOrderService {
|
||||||
return new StoreOrderExt(order, orderDetails);
|
return new StoreOrderExt(order, orderDetails);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
@Override
|
||||||
|
public void cancelOrder(OrderOptDTO opt) {
|
||||||
|
Assert.notNull(opt.getStoreOrderId());
|
||||||
|
StoreOrder order = storeOrderMapper.selectById(opt.getStoreOrderId());
|
||||||
|
Assert.isTrue(BeanValidators.exists(order), "订单不存在");
|
||||||
|
EOrderStatus oStatus = EOrderStatus.of(order.getOrderStatus());
|
||||||
|
EPayStatus pStatus = EPayStatus.of(order.getPayStatus());
|
||||||
|
if (EOrderStatus.PENDING_PAYMENT != oStatus) {
|
||||||
|
throw new ServiceException("订单[" + order.getOrderNo() + "]状态为[" + oStatus.getLabel() + "],无法取消");
|
||||||
|
}
|
||||||
|
if (EPayStatus.PAID == pStatus) {
|
||||||
|
throw new ServiceException("订单[" + order.getOrderNo() + "]已支付完成,无法取消");
|
||||||
|
}
|
||||||
|
//目前只有支付宝
|
||||||
|
PaymentManager paymentManager = getPaymentManager(EPayChannel.ALI_PAY);
|
||||||
|
boolean isPaid = paymentManager.isOrderPaid(order.getOrderNo());
|
||||||
|
if (isPaid) {
|
||||||
|
throw new ServiceException("订单[" + order.getOrderNo() + "]已支付,无法取消");
|
||||||
|
}
|
||||||
|
//订单已取消
|
||||||
|
order.setOrderStatus(EOrderStatus.CANCELLED.getValue());
|
||||||
|
int orderSuccess = storeOrderMapper.updateById(order);
|
||||||
|
if (orderSuccess == 0) {
|
||||||
|
throw new ServiceException(Constants.VERSION_LOCK_ERROR_COMMON_MSG);
|
||||||
|
}
|
||||||
|
List<StoreOrderDetail> orderDetails = storeOrderDetailMapper.selectList(
|
||||||
|
Wrappers.lambdaQuery(StoreOrderDetail.class)
|
||||||
|
.eq(StoreOrderDetail::getStoreOrderId, order.getId())
|
||||||
|
.eq(SimpleEntity::getDelFlag, Constants.UNDELETED));
|
||||||
|
List<Long> orderDetailIdList = new ArrayList<>(orderDetails.size());
|
||||||
|
for (StoreOrderDetail orderDetail : orderDetails) {
|
||||||
|
//明细已取消
|
||||||
|
orderDetail.setDetailStatus(EOrderStatus.CANCELLED.getValue());
|
||||||
|
int orderDetailSuccess = storeOrderDetailMapper.updateById(orderDetail);
|
||||||
|
if (orderDetailSuccess == 0) {
|
||||||
|
throw new ServiceException(Constants.VERSION_LOCK_ERROR_COMMON_MSG);
|
||||||
|
}
|
||||||
|
orderDetailIdList.add(orderDetail.getId());
|
||||||
|
}
|
||||||
|
//操作记录
|
||||||
|
addOperationRecords(order.getId(), EOrderAction.CANCEL, orderDetailIdList, EOrderAction.CANCEL,
|
||||||
|
opt.getOperatorId(), new Date());
|
||||||
|
}
|
||||||
|
|
||||||
private void checkPreparePayStatus(Integer payStatus) {
|
private void checkPreparePayStatus(Integer payStatus) {
|
||||||
if (!EPayStatus.INIT.getValue().equals(payStatus) && !EPayStatus.PAYING.getValue().equals(payStatus)) {
|
if (!EPayStatus.INIT.getValue().equals(payStatus) && !EPayStatus.PAYING.getValue().equals(payStatus)) {
|
||||||
throw new ServiceException("订单状态异常无法发起支付");
|
throw new ServiceException("订单状态异常无法发起支付");
|
||||||
|
|
|
||||||
|
|
@ -2,4 +2,52 @@
|
||||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||||
<mapper namespace="com.ruoyi.xkt.mapper.StoreOrderMapper">
|
<mapper namespace="com.ruoyi.xkt.mapper.StoreOrderMapper">
|
||||||
|
|
||||||
|
<select id="listStoreOrderPageItem" parameterType="com.ruoyi.xkt.dto.order.StoreOrderQueryDTO"
|
||||||
|
resultType="com.ruoyi.xkt.dto.order.StoreOrderPageItemDTO">
|
||||||
|
SELECT
|
||||||
|
so.*,
|
||||||
|
s.store_name,
|
||||||
|
s.brand_name,
|
||||||
|
e.express_name
|
||||||
|
FROM
|
||||||
|
store_order so
|
||||||
|
LEFT JOIN store s ON so.store_id = s.id
|
||||||
|
LEFT JOIN express e ON so.express_id = e.id
|
||||||
|
<where>
|
||||||
|
so.del_flag = '0'
|
||||||
|
<if test="storeId != null">
|
||||||
|
AND so.store_id = #{storeId}
|
||||||
|
</if>
|
||||||
|
<if test="orderUserId != null">
|
||||||
|
AND so.order_user_id = #{orderUserId}
|
||||||
|
</if>
|
||||||
|
<if test="orderNo != null and orderNo !=''">
|
||||||
|
AND so.order_no LIKE CONCAT('%', #{orderNo}, '%')
|
||||||
|
</if>
|
||||||
|
<if test="orderStatus != null">
|
||||||
|
AND so.order_status = #{orderStatus}
|
||||||
|
</if>
|
||||||
|
<if test="destinationContactName != null and destinationContactName !=''">
|
||||||
|
AND so.destination_contact_name LIKE CONCAT('%', #{destinationContactName}, '%')
|
||||||
|
</if>
|
||||||
|
<if test="destinationContactPhoneNumber != null and destinationContactPhoneNumber !=''">
|
||||||
|
AND so.destination_contact_phone_number LIKE CONCAT('%', #{destinationContactPhoneNumber}, '%')
|
||||||
|
</if>
|
||||||
|
<if test="deliveryType != null">
|
||||||
|
AND so.delivery_type = #{deliveryType}
|
||||||
|
</if>
|
||||||
|
<if test="orderTimeBegin != null and orderTimeEnd != null">
|
||||||
|
AND EXISTS (SELECT 1 FROM store_order_operation_record r WHERE r.target_type = 1 AND r.target_id = so.id AND r.action = 1 AND r.operation_time BETWEEN #{orderTimeBegin} AND #{orderTimeEnd})
|
||||||
|
</if>
|
||||||
|
<if test="payTimeBegin != null and payTimeEnd != null">
|
||||||
|
AND EXISTS (SELECT 1 FROM store_order_operation_record r WHERE r.target_type = 1 AND r.target_id = so.id AND r.action = 4 AND r.operation_time BETWEEN #{payTimeBegin} AND #{payTimeEnd})
|
||||||
|
</if>
|
||||||
|
<if test="expressWaybillNo != null and expressWaybillNo !=''">
|
||||||
|
AND EXISTS (SELECT 1 FROM store_order_detail sod WHERE sod.store_order_id = so.id AND sod.del_flag = '0' AND sod.express_waybill_no LIKE CONCAT('%', #{expressWaybillNo}, '%'))
|
||||||
|
</if>
|
||||||
|
<if test="prodArtNum != null and prodArtNum !=''">
|
||||||
|
AND EXISTS (SELECT 1 FROM store_order_detail sod WHERE sod.store_order_id = so.id AND sod.del_flag = '0' AND sod.prod_art_num LIKE CONCAT('%', #{prodArtNum}, '%'))
|
||||||
|
</if>
|
||||||
|
</where>
|
||||||
|
</select>
|
||||||
</mapper>
|
</mapper>
|
||||||
Loading…
Reference in New Issue