Commit fc48ab492872a2e0ebb03d3664625e28dc950403
1 parent
fc49f000
trade:前端订单管理,联调接口
Showing
12 changed files
with
183 additions
and
75 deletions
yudao-framework/yudao-spring-boot-starter-biz-ip/src/test/java/cn/iocoder/yudao/framework/ip/core/utils/AreaUtilsTest.java
| @@ -28,9 +28,9 @@ public class AreaUtilsTest { | @@ -28,9 +28,9 @@ public class AreaUtilsTest { | ||
| 28 | 28 | ||
| 29 | @Test | 29 | @Test |
| 30 | public void testFormat() { | 30 | public void testFormat() { |
| 31 | - assertEquals(AreaUtils.format(110105L), "北京 北京市 朝阳区"); | ||
| 32 | - assertEquals(AreaUtils.format(1L), "中国"); | ||
| 33 | - assertEquals(AreaUtils.format(2L), "蒙古"); | 31 | + assertEquals(AreaUtils.format(110105), "北京 北京市 朝阳区"); |
| 32 | + assertEquals(AreaUtils.format(1), "中国"); | ||
| 33 | + assertEquals(AreaUtils.format(2), "蒙古"); | ||
| 34 | } | 34 | } |
| 35 | 35 | ||
| 36 | } | 36 | } |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/vo/TradeOrderPageReqVO.java
| @@ -2,17 +2,53 @@ package cn.iocoder.yudao.module.trade.controller.admin.order.vo; | @@ -2,17 +2,53 @@ package cn.iocoder.yudao.module.trade.controller.admin.order.vo; | ||
| 2 | 2 | ||
| 3 | import cn.iocoder.yudao.framework.common.pojo.PageParam; | 3 | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| 4 | import cn.iocoder.yudao.framework.common.validation.InEnum; | 4 | import cn.iocoder.yudao.framework.common.validation.InEnum; |
| 5 | +import cn.iocoder.yudao.framework.common.validation.Mobile; | ||
| 5 | import cn.iocoder.yudao.module.trade.enums.order.TradeOrderStatusEnum; | 6 | import cn.iocoder.yudao.module.trade.enums.order.TradeOrderStatusEnum; |
| 6 | import io.swagger.annotations.ApiModel; | 7 | import io.swagger.annotations.ApiModel; |
| 7 | import io.swagger.annotations.ApiModelProperty; | 8 | import io.swagger.annotations.ApiModelProperty; |
| 8 | import lombok.Data; | 9 | import lombok.Data; |
| 10 | +import org.springframework.format.annotation.DateTimeFormat; | ||
| 11 | + | ||
| 12 | +import java.time.LocalDateTime; | ||
| 13 | + | ||
| 14 | +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; | ||
| 9 | 15 | ||
| 10 | @ApiModel("管理后台 - 交易订单的分页 Request VO") | 16 | @ApiModel("管理后台 - 交易订单的分页 Request VO") |
| 11 | @Data | 17 | @Data |
| 12 | public class TradeOrderPageReqVO extends PageParam { | 18 | public class TradeOrderPageReqVO extends PageParam { |
| 13 | 19 | ||
| 20 | + @ApiModelProperty(value = "订单号", example = "88888888", notes = "模糊匹配") | ||
| 21 | + private String no; | ||
| 22 | + | ||
| 23 | + @ApiModelProperty(value = "用户编号", example = "1024") | ||
| 24 | + private Long userId; | ||
| 25 | + | ||
| 26 | + @ApiModelProperty(value = "用户昵称", example = "小王", notes = "模糊匹配") | ||
| 27 | + private String userNickname; | ||
| 28 | + | ||
| 29 | + @ApiModelProperty(value = "用户手机号", example = "小王", notes = "精准匹配") | ||
| 30 | + @Mobile | ||
| 31 | + private String userMobile; | ||
| 32 | + | ||
| 33 | + @ApiModelProperty(value = "收件人名称", example = "小红", notes = "模糊匹配") | ||
| 34 | + private String receiverName; | ||
| 35 | + | ||
| 36 | + @ApiModelProperty(value = "收件人手机", example = "1560", notes = "模糊匹配") | ||
| 37 | + @Mobile | ||
| 38 | + private String receiverMobile; | ||
| 39 | + | ||
| 40 | + @ApiModelProperty(value = "订单类型", example = "1", notes = "参见 TradeOrderTypeEnum 枚举") | ||
| 41 | + private Integer type; | ||
| 42 | + | ||
| 14 | @ApiModelProperty(value = "订单状态", example = "1", notes = "参见 TradeOrderStatusEnum 枚举") | 43 | @ApiModelProperty(value = "订单状态", example = "1", notes = "参见 TradeOrderStatusEnum 枚举") |
| 15 | @InEnum(value = TradeOrderStatusEnum.class, message = "订单状态必须是 {value}") | 44 | @InEnum(value = TradeOrderStatusEnum.class, message = "订单状态必须是 {value}") |
| 16 | private Integer status; | 45 | private Integer status; |
| 17 | 46 | ||
| 47 | + @ApiModelProperty(value = "支付渠道", example = "wx_lite") | ||
| 48 | + private String payChannelCode; | ||
| 49 | + | ||
| 50 | + @ApiModelProperty(value = "创建时间") | ||
| 51 | + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) | ||
| 52 | + private LocalDateTime[] createTime; | ||
| 53 | + | ||
| 18 | } | 54 | } |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/order/TradeOrderMapper.java
| @@ -8,6 +8,8 @@ import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO; | @@ -8,6 +8,8 @@ import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO; | ||
| 8 | import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; | 8 | import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; |
| 9 | import org.apache.ibatis.annotations.Mapper; | 9 | import org.apache.ibatis.annotations.Mapper; |
| 10 | 10 | ||
| 11 | +import java.util.Set; | ||
| 12 | + | ||
| 11 | @Mapper | 13 | @Mapper |
| 12 | public interface TradeOrderMapper extends BaseMapperX<TradeOrderDO> { | 14 | public interface TradeOrderMapper extends BaseMapperX<TradeOrderDO> { |
| 13 | 15 | ||
| @@ -20,9 +22,17 @@ public interface TradeOrderMapper extends BaseMapperX<TradeOrderDO> { | @@ -20,9 +22,17 @@ public interface TradeOrderMapper extends BaseMapperX<TradeOrderDO> { | ||
| 20 | return selectOne(TradeOrderDO::getId, id, TradeOrderDO::getUserId, userId); | 22 | return selectOne(TradeOrderDO::getId, id, TradeOrderDO::getUserId, userId); |
| 21 | } | 23 | } |
| 22 | 24 | ||
| 23 | - default PageResult<TradeOrderDO> selectPage(TradeOrderPageReqVO reqVO) { | 25 | + default PageResult<TradeOrderDO> selectPage(TradeOrderPageReqVO reqVO, Set<Long> userIds) { |
| 24 | return selectPage(reqVO, new LambdaQueryWrapperX<TradeOrderDO>() | 26 | return selectPage(reqVO, new LambdaQueryWrapperX<TradeOrderDO>() |
| 25 | - .eqIfPresent(TradeOrderDO::getStatus, reqVO.getStatus())); | 27 | + .likeIfPresent(TradeOrderDO::getNo, reqVO.getNo()) |
| 28 | + .eqIfPresent(TradeOrderDO::getUserId, reqVO.getUserId()) | ||
| 29 | + .inIfPresent(TradeOrderDO::getUserId, userIds) | ||
| 30 | + .likeIfPresent(TradeOrderDO::getReceiverName, reqVO.getReceiverName()) | ||
| 31 | + .likeIfPresent(TradeOrderDO::getReceiverMobile, reqVO.getReceiverMobile()) | ||
| 32 | + .eqIfPresent(TradeOrderDO::getType, reqVO.getType()) | ||
| 33 | + .eqIfPresent(TradeOrderDO::getStatus, reqVO.getStatus()) | ||
| 34 | + .eqIfPresent(TradeOrderDO::getPayChannelCode, reqVO.getPayChannelCode()) | ||
| 35 | + .betweenIfPresent(TradeOrderDO::getCreateTime, reqVO.getCreateTime())); | ||
| 26 | } | 36 | } |
| 27 | 37 | ||
| 28 | } | 38 | } |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderServiceImpl.java
| 1 | package cn.iocoder.yudao.module.trade.service.order; | 1 | package cn.iocoder.yudao.module.trade.service.order; |
| 2 | 2 | ||
| 3 | +import cn.hutool.core.collection.CollUtil; | ||
| 3 | import cn.hutool.core.util.IdUtil; | 4 | import cn.hutool.core.util.IdUtil; |
| 4 | import cn.hutool.core.util.ObjectUtil; | 5 | import cn.hutool.core.util.ObjectUtil; |
| 5 | import cn.hutool.core.util.StrUtil; | 6 | import cn.hutool.core.util.StrUtil; |
| @@ -11,6 +12,8 @@ import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; | @@ -11,6 +12,8 @@ import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; | ||
| 11 | import cn.iocoder.yudao.framework.common.util.json.JsonUtils; | 12 | import cn.iocoder.yudao.framework.common.util.json.JsonUtils; |
| 12 | import cn.iocoder.yudao.module.member.api.address.AddressApi; | 13 | import cn.iocoder.yudao.module.member.api.address.AddressApi; |
| 13 | import cn.iocoder.yudao.module.member.api.address.dto.AddressRespDTO; | 14 | import cn.iocoder.yudao.module.member.api.address.dto.AddressRespDTO; |
| 15 | +import cn.iocoder.yudao.module.member.api.user.MemberUserApi; | ||
| 16 | +import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; | ||
| 14 | import cn.iocoder.yudao.module.pay.api.order.PayOrderApi; | 17 | import cn.iocoder.yudao.module.pay.api.order.PayOrderApi; |
| 15 | import cn.iocoder.yudao.module.pay.api.order.dto.PayOrderCreateReqDTO; | 18 | import cn.iocoder.yudao.module.pay.api.order.dto.PayOrderCreateReqDTO; |
| 16 | import cn.iocoder.yudao.module.pay.api.order.dto.PayOrderRespDTO; | 19 | import cn.iocoder.yudao.module.pay.api.order.dto.PayOrderRespDTO; |
| @@ -77,6 +80,8 @@ public class TradeOrderServiceImpl implements TradeOrderService { | @@ -77,6 +80,8 @@ public class TradeOrderServiceImpl implements TradeOrderService { | ||
| 77 | private AddressApi addressApi; | 80 | private AddressApi addressApi; |
| 78 | @Resource | 81 | @Resource |
| 79 | private CouponApi couponApi; | 82 | private CouponApi couponApi; |
| 83 | + @Resource | ||
| 84 | + private MemberUserApi memberUserApi; | ||
| 80 | 85 | ||
| 81 | @Resource | 86 | @Resource |
| 82 | private TradeOrderProperties tradeOrderProperties; | 87 | private TradeOrderProperties tradeOrderProperties; |
| @@ -420,7 +425,24 @@ public class TradeOrderServiceImpl implements TradeOrderService { | @@ -420,7 +425,24 @@ public class TradeOrderServiceImpl implements TradeOrderService { | ||
| 420 | 425 | ||
| 421 | @Override | 426 | @Override |
| 422 | public PageResult<TradeOrderDO> getOrderPage(TradeOrderPageReqVO reqVO) { | 427 | public PageResult<TradeOrderDO> getOrderPage(TradeOrderPageReqVO reqVO) { |
| 423 | - return tradeOrderMapper.selectPage(reqVO); | 428 | + // 获得 userId 相关的查询 |
| 429 | + Set<Long> userIds = new HashSet<>(); | ||
| 430 | + if (StrUtil.isNotEmpty(reqVO.getUserMobile())) { | ||
| 431 | + MemberUserRespDTO user = memberUserApi.getUserByMobile(reqVO.getUserMobile()); | ||
| 432 | + if (user == null) { // 没查询到用户,说明肯定也没他的订单 | ||
| 433 | + return new PageResult<>(); | ||
| 434 | + } | ||
| 435 | + userIds.add(user.getId()); | ||
| 436 | + } | ||
| 437 | + if (StrUtil.isNotEmpty(reqVO.getUserNickname())) { | ||
| 438 | + List<MemberUserRespDTO> users = memberUserApi.getUserListByNickname(reqVO.getUserNickname()); | ||
| 439 | + if (CollUtil.isEmpty(users)) { // 没查询到用户,说明肯定也没他的订单 | ||
| 440 | + return new PageResult<>(); | ||
| 441 | + } | ||
| 442 | + userIds.addAll(convertSet(users, MemberUserRespDTO::getId)); | ||
| 443 | + } | ||
| 444 | + // 分页查询 | ||
| 445 | + return tradeOrderMapper.selectPage(reqVO, userIds); | ||
| 424 | } | 446 | } |
| 425 | 447 | ||
| 426 | // =================== Order Item =================== | 448 | // =================== Order Item =================== |
yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/MemberUserApi.java
| @@ -49,4 +49,12 @@ public interface MemberUserApi { | @@ -49,4 +49,12 @@ public interface MemberUserApi { | ||
| 49 | */ | 49 | */ |
| 50 | List<MemberUserRespDTO> getUserListByNickname(String nickname); | 50 | List<MemberUserRespDTO> getUserListByNickname(String nickname); |
| 51 | 51 | ||
| 52 | + /** | ||
| 53 | + * 基于手机号,精准匹配用户 | ||
| 54 | + * | ||
| 55 | + * @param mobile 手机号 | ||
| 56 | + * @return 用户信息 | ||
| 57 | + */ | ||
| 58 | + MemberUserRespDTO getUserByMobile(String mobile); | ||
| 59 | + | ||
| 52 | } | 60 | } |
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/api/user/MemberUserApiImpl.java
| @@ -39,4 +39,9 @@ public class MemberUserApiImpl implements MemberUserApi { | @@ -39,4 +39,9 @@ public class MemberUserApiImpl implements MemberUserApi { | ||
| 39 | return UserConvert.INSTANCE.convertList2(userService.getUserListByNickname(nickname)); | 39 | return UserConvert.INSTANCE.convertList2(userService.getUserListByNickname(nickname)); |
| 40 | } | 40 | } |
| 41 | 41 | ||
| 42 | + @Override | ||
| 43 | + public MemberUserRespDTO getUserByMobile(String mobile) { | ||
| 44 | + return UserConvert.INSTANCE.convert2(userService.getUserByMobile(mobile)); | ||
| 45 | + } | ||
| 46 | + | ||
| 42 | } | 47 | } |
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserService.java
| @@ -31,7 +31,6 @@ public interface MemberUserService { | @@ -31,7 +31,6 @@ public interface MemberUserService { | ||
| 31 | */ | 31 | */ |
| 32 | List<MemberUserDO> getUserListByNickname(String nickname); | 32 | List<MemberUserDO> getUserListByNickname(String nickname); |
| 33 | 33 | ||
| 34 | - | ||
| 35 | /** | 34 | /** |
| 36 | * 基于手机号创建用户。 | 35 | * 基于手机号创建用户。 |
| 37 | * 如果用户已经存在,则直接进行返回 | 36 | * 如果用户已经存在,则直接进行返回 |
yudao-module-pay/yudao-module-pay-biz/src/test/java/cn/iocoder/yudao/module/pay/service/order/PayOrderServiceTest.java
| @@ -76,7 +76,7 @@ public class PayOrderServiceTest extends BaseDbUnitTest { | @@ -76,7 +76,7 @@ public class PayOrderServiceTest extends BaseDbUnitTest { | ||
| 76 | o.setBody("斌斌子送给灿灿子的炸弹猫"); | 76 | o.setBody("斌斌子送给灿灿子的炸弹猫"); |
| 77 | o.setNotifyUrl("https://hc.com/lbh"); | 77 | o.setNotifyUrl("https://hc.com/lbh"); |
| 78 | o.setNotifyStatus(PayOrderNotifyStatusEnum.SUCCESS.getStatus()); | 78 | o.setNotifyStatus(PayOrderNotifyStatusEnum.SUCCESS.getStatus()); |
| 79 | - o.setAmount(10000L); | 79 | + o.setAmount(10000); |
| 80 | o.setChannelFeeRate(0.01); | 80 | o.setChannelFeeRate(0.01); |
| 81 | o.setChannelFeeAmount(1L); | 81 | o.setChannelFeeAmount(1L); |
| 82 | o.setStatus(PayOrderStatusEnum.SUCCESS.getStatus()); | 82 | o.setStatus(PayOrderStatusEnum.SUCCESS.getStatus()); |
| @@ -148,7 +148,7 @@ public class PayOrderServiceTest extends BaseDbUnitTest { | @@ -148,7 +148,7 @@ public class PayOrderServiceTest extends BaseDbUnitTest { | ||
| 148 | o.setBody("斌斌子送给灿灿子的炸弹猫"); | 148 | o.setBody("斌斌子送给灿灿子的炸弹猫"); |
| 149 | o.setNotifyUrl("https://hc.com/lbh"); | 149 | o.setNotifyUrl("https://hc.com/lbh"); |
| 150 | o.setNotifyStatus(PayOrderNotifyStatusEnum.SUCCESS.getStatus()); | 150 | o.setNotifyStatus(PayOrderNotifyStatusEnum.SUCCESS.getStatus()); |
| 151 | - o.setAmount(10000L); | 151 | + o.setAmount(10000); |
| 152 | o.setChannelFeeRate(0.01); | 152 | o.setChannelFeeRate(0.01); |
| 153 | o.setChannelFeeAmount(1L); | 153 | o.setChannelFeeAmount(1L); |
| 154 | o.setStatus(PayOrderStatusEnum.SUCCESS.getStatus()); | 154 | o.setStatus(PayOrderStatusEnum.SUCCESS.getStatus()); |
yudao-module-pay/yudao-module-pay-biz/src/test/java/cn/iocoder/yudao/module/pay/service/refund/PayRefundServiceTest.java
| @@ -67,8 +67,8 @@ public class PayRefundServiceTest extends BaseDbUnitTest { | @@ -67,8 +67,8 @@ public class PayRefundServiceTest extends BaseDbUnitTest { | ||
| 67 | o.setNotifyStatus(PayOrderNotifyStatusEnum.SUCCESS.getStatus()); | 67 | o.setNotifyStatus(PayOrderNotifyStatusEnum.SUCCESS.getStatus()); |
| 68 | o.setStatus(PayRefundStatusEnum.SUCCESS.getStatus()); | 68 | o.setStatus(PayRefundStatusEnum.SUCCESS.getStatus()); |
| 69 | o.setType(PayRefundTypeEnum.SOME.getStatus()); | 69 | o.setType(PayRefundTypeEnum.SOME.getStatus()); |
| 70 | - o.setPayAmount(100L); | ||
| 71 | - o.setRefundAmount(500L); | 70 | + o.setPayAmount(100); |
| 71 | + o.setRefundAmount(500); | ||
| 72 | o.setReason("就是想退款了,你有意见吗"); | 72 | o.setReason("就是想退款了,你有意见吗"); |
| 73 | o.setUserIp("127.0.0.1"); | 73 | o.setUserIp("127.0.0.1"); |
| 74 | o.setChannelOrderNo("CH0000001"); | 74 | o.setChannelOrderNo("CH0000001"); |
| @@ -136,8 +136,8 @@ public class PayRefundServiceTest extends BaseDbUnitTest { | @@ -136,8 +136,8 @@ public class PayRefundServiceTest extends BaseDbUnitTest { | ||
| 136 | o.setNotifyStatus(PayOrderNotifyStatusEnum.SUCCESS.getStatus()); | 136 | o.setNotifyStatus(PayOrderNotifyStatusEnum.SUCCESS.getStatus()); |
| 137 | o.setStatus(PayRefundStatusEnum.SUCCESS.getStatus()); | 137 | o.setStatus(PayRefundStatusEnum.SUCCESS.getStatus()); |
| 138 | o.setType(PayRefundTypeEnum.SOME.getStatus()); | 138 | o.setType(PayRefundTypeEnum.SOME.getStatus()); |
| 139 | - o.setPayAmount(100L); | ||
| 140 | - o.setRefundAmount(500L); | 139 | + o.setPayAmount(100); |
| 140 | + o.setRefundAmount(500); | ||
| 141 | o.setReason("就是想退款了,你有意见吗"); | 141 | o.setReason("就是想退款了,你有意见吗"); |
| 142 | o.setUserIp("127.0.0.1"); | 142 | o.setUserIp("127.0.0.1"); |
| 143 | o.setChannelOrderNo("CH0000001"); | 143 | o.setChannelOrderNo("CH0000001"); |
yudao-ui-admin/src/utils/dict.js
| @@ -65,6 +65,8 @@ export const DICT_TYPE = { | @@ -65,6 +65,8 @@ export const DICT_TYPE = { | ||
| 65 | TRADE_AFTER_SALE_STATUS: 'trade_after_sale_status', // 售后 - 状态 | 65 | TRADE_AFTER_SALE_STATUS: 'trade_after_sale_status', // 售后 - 状态 |
| 66 | TRADE_AFTER_SALE_WAY: 'trade_after_sale_way', // 售后 - 方式 | 66 | TRADE_AFTER_SALE_WAY: 'trade_after_sale_way', // 售后 - 方式 |
| 67 | TRADE_AFTER_SALE_TYPE: 'trade_after_sale_type', // 售后 - 类型 | 67 | TRADE_AFTER_SALE_TYPE: 'trade_after_sale_type', // 售后 - 类型 |
| 68 | + TRADE_ORDER_TYPE: 'trade_order_type', // 订单 - 类型 | ||
| 69 | + TRADE_ORDER_STATUS: 'trade_order_status', // 订单 - 状态 | ||
| 68 | 70 | ||
| 69 | // ========== MALL - PROMOTION 模块 ========== | 71 | // ========== MALL - PROMOTION 模块 ========== |
| 70 | PROMOTION_DISCOUNT_TYPE: 'promotion_discount_type', // 优惠类型 | 72 | PROMOTION_DISCOUNT_TYPE: 'promotion_discount_type', // 优惠类型 |
yudao-ui-admin/src/views/mall/trade/afterSale/index.vue
| @@ -46,7 +46,7 @@ | @@ -46,7 +46,7 @@ | ||
| 46 | <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar> | 46 | <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar> |
| 47 | </el-row> | 47 | </el-row> |
| 48 | 48 | ||
| 49 | - <!-- Tab 选项:真正的内容在 Lab --> | 49 | + <!-- Tab 选项:真正的内容在 Table --> |
| 50 | <el-tabs v-model="activeTab" type="card" @tab-click="tabClick" style="margin-top: -40px;"> | 50 | <el-tabs v-model="activeTab" type="card" @tab-click="tabClick" style="margin-top: -40px;"> |
| 51 | <el-tab-pane v-for="tab in statusTabs" :key="tab.value" :label="tab.label" :name="tab.value" /> | 51 | <el-tab-pane v-for="tab in statusTabs" :key="tab.value" :label="tab.label" :name="tab.value" /> |
| 52 | </el-tabs> | 52 | </el-tabs> |
| @@ -100,7 +100,7 @@ | @@ -100,7 +100,7 @@ | ||
| 100 | <script> | 100 | <script> |
| 101 | import { getAfterSalePage } from "@/api/mall/trade/afterSale"; | 101 | import { getAfterSalePage } from "@/api/mall/trade/afterSale"; |
| 102 | import { datePickerOptions } from "@/utils/constants"; | 102 | import { datePickerOptions } from "@/utils/constants"; |
| 103 | -import {DICT_TYPE, getDictDatas} from "@/utils/dict"; | 103 | +import { DICT_TYPE, getDictDatas } from "@/utils/dict"; |
| 104 | 104 | ||
| 105 | export default { | 105 | export default { |
| 106 | name: "AfterSale", | 106 | name: "AfterSale", |
yudao-ui-admin/src/views/mall/trade/order/index.vue
| @@ -3,32 +3,34 @@ | @@ -3,32 +3,34 @@ | ||
| 3 | <!-- 搜索工作栏 --> | 3 | <!-- 搜索工作栏 --> |
| 4 | <!-- TODO: inline 看看是不是需要; v-show= 那块逻辑还是要的 --> | 4 | <!-- TODO: inline 看看是不是需要; v-show= 那块逻辑还是要的 --> |
| 5 | <el-row :gutter="20"> | 5 | <el-row :gutter="20"> |
| 6 | - <el-form :model="queryParams" label-width="68px" size="small"> | 6 | + <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px"> |
| 7 | <el-col :span="6" :xs="24"> | 7 | <el-col :span="6" :xs="24"> |
| 8 | - <el-form-item label="搜索方式"> | ||
| 9 | - <el-input style="width: 240px"> | ||
| 10 | - <el-select v-model="queryParams.searchType" slot="prepend" clearable style="width: 100px"> | 8 | + <el-form-item label="搜索方式" prop="searchValue"> |
| 9 | + <el-input v-model="queryParams.searchValue" style="width: 240px"> | ||
| 10 | + <el-select v-model="queryParams.searchType" slot="prepend" style="width: 100px"> | ||
| 11 | <el-option v-for="dict in dicData.searchType" v-bind="dict" :key="dict.value"/> | 11 | <el-option v-for="dict in dicData.searchType" v-bind="dict" :key="dict.value"/> |
| 12 | </el-select> | 12 | </el-select> |
| 13 | </el-input> | 13 | </el-input> |
| 14 | </el-form-item> | 14 | </el-form-item> |
| 15 | </el-col> | 15 | </el-col> |
| 16 | <el-col :span="6" :xs="24"> | 16 | <el-col :span="6" :xs="24"> |
| 17 | - <el-form-item label="订单类型"> | ||
| 18 | - <el-select v-model="queryParams.orderType" clearable style="width: 240px"> | ||
| 19 | - <el-option v-for="dict in dicData.orderType" v-bind="dict" :key="dict.value"/> | 17 | + <el-form-item label="订单类型" prop="type"> |
| 18 | + <el-select v-model="queryParams.type" clearable style="width: 240px"> | ||
| 19 | + <el-option v-for="dict in this.getDictDatas(DICT_TYPE.TRADE_ORDER_TYPE)" | ||
| 20 | + :key="dict.value" :label="dict.label" :value="dict.value"/> | ||
| 20 | </el-select> | 21 | </el-select> |
| 21 | </el-form-item> | 22 | </el-form-item> |
| 22 | </el-col> | 23 | </el-col> |
| 23 | <el-col :span="6" :xs="24"> | 24 | <el-col :span="6" :xs="24"> |
| 24 | - <el-form-item label="订单状态"> | ||
| 25 | - <el-select v-model="queryParams.orderStatus" clearable style="width: 240px"> | ||
| 26 | - <el-option v-for="dict in dicData.orderStatus" v-bind="dict" :key="dict.value"/> | 25 | + <el-form-item label="订单状态" prop="status"> |
| 26 | + <el-select v-model="queryParams.status" clearable style="width: 240px"> | ||
| 27 | + <el-option v-for="dict in this.getDictDatas(DICT_TYPE.TRADE_ORDER_STATUS)" | ||
| 28 | + :key="dict.value" :label="dict.label" :value="dict.value"/> | ||
| 27 | </el-select> | 29 | </el-select> |
| 28 | </el-form-item> | 30 | </el-form-item> |
| 29 | </el-col> | 31 | </el-col> |
| 30 | <el-col :span="6" :xs="24"> | 32 | <el-col :span="6" :xs="24"> |
| 31 | - <el-form-item label="订单来源"> | 33 | + <el-form-item label="订单来源" prop="terminal"> |
| 32 | <el-select v-model="queryParams.terminal" clearable style="width: 240px"> | 34 | <el-select v-model="queryParams.terminal" clearable style="width: 240px"> |
| 33 | <el-option v-for="dict in this.getDictDatas(DICT_TYPE.TERMINAL)" | 35 | <el-option v-for="dict in this.getDictDatas(DICT_TYPE.TERMINAL)" |
| 34 | :key="dict.value" :label="dict.label" :value="dict.value"/> | 36 | :key="dict.value" :label="dict.label" :value="dict.value"/> |
| @@ -36,7 +38,7 @@ | @@ -36,7 +38,7 @@ | ||
| 36 | </el-form-item> | 38 | </el-form-item> |
| 37 | </el-col> | 39 | </el-col> |
| 38 | <el-col :span="6" :xs="24"> | 40 | <el-col :span="6" :xs="24"> |
| 39 | - <el-form-item label="支付方式"> | 41 | + <el-form-item label="支付方式" prop="payChannelCode"> |
| 40 | <el-select v-model="queryParams.payChannelCode" clearable style="width: 240px"> | 42 | <el-select v-model="queryParams.payChannelCode" clearable style="width: 240px"> |
| 41 | <el-option v-for="dict in this.getDictDatas(DICT_TYPE.PAY_CHANNEL_CODE_TYPE)" | 43 | <el-option v-for="dict in this.getDictDatas(DICT_TYPE.PAY_CHANNEL_CODE_TYPE)" |
| 42 | :key="dict.value" :label="dict.label" :value="dict.value"/> | 44 | :key="dict.value" :label="dict.label" :value="dict.value"/> |
| @@ -44,23 +46,30 @@ | @@ -44,23 +46,30 @@ | ||
| 44 | </el-form-item> | 46 | </el-form-item> |
| 45 | </el-col> | 47 | </el-col> |
| 46 | <el-col :span="6" :xs="24"> | 48 | <el-col :span="6" :xs="24"> |
| 47 | - <el-form-item label="下单时间"> | ||
| 48 | - <el-date-picker v-model="queryParams.date" type="daterange" range-separator="至" | ||
| 49 | - start-placeholder="开始日期" end-placeholder="结束日期" :picker-options="datePickerOptions" style="width: 240px"/> | 49 | + <el-form-item label="下单时间" prop="createTime"> |
| 50 | + <el-date-picker v-model="queryParams.createTime" style="width: 240px" value-format="yyyy-MM-dd HH:mm:ss" type="daterange" | ||
| 51 | + range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期" | ||
| 52 | + :picker-options="datePickerOptions" :default-time="['00:00:00', '23:59:59']" /> | ||
| 50 | </el-form-item> | 53 | </el-form-item> |
| 51 | </el-col> | 54 | </el-col> |
| 52 | <el-col :span="6" :xs="24" style="line-height: 32px"> | 55 | <el-col :span="6" :xs="24" style="line-height: 32px"> |
| 53 | - <el-button type="primary" icon="el-icon-search" size="mini">搜索</el-button> | ||
| 54 | - <el-button icon="el-icon-refresh" size="mini">重置</el-button> | 56 | + <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button> |
| 57 | + <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button> | ||
| 55 | </el-col> | 58 | </el-col> |
| 56 | </el-form> | 59 | </el-form> |
| 57 | </el-row> | 60 | </el-row> |
| 58 | 61 | ||
| 59 | - <!-- tab切换--> | ||
| 60 | - <el-tabs v-model="activeTabName" type="card"> | ||
| 61 | - <el-tab-pane v-for="tabPane in tabPanes" :label="tabPane.text" :name="tabPane.name"> | ||
| 62 | - <!-- table --> | ||
| 63 | - <el-table :data="list" :show-header="false" class="order-table"> | 62 | + <!-- 操作工具栏 --> |
| 63 | + <el-row :gutter="10" class="mb8"> | ||
| 64 | + <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar> | ||
| 65 | + </el-row> | ||
| 66 | + | ||
| 67 | + <!-- tab切换 --> | ||
| 68 | + <!-- TODO @小程:看看能不能往上挪 -40px,和【隐藏搜索】【刷新】对齐 --> | ||
| 69 | + <el-tabs v-model="activeTab" type="card" @tab-click="tabClick"> | ||
| 70 | + <el-tab-pane v-for="tab in statusTabs" :key="tab.value" :label="tab.label" :name="tab.value"> | ||
| 71 | + <!-- 列表 --> | ||
| 72 | + <el-table v-loading="loading" :data="list" :show-header="false" class="order-table"> | ||
| 64 | <el-table-column> | 73 | <el-table-column> |
| 65 | <template slot-scope="{ row }"> | 74 | <template slot-scope="{ row }"> |
| 66 | <el-row type="flex" align="middle"> | 75 | <el-row type="flex" align="middle"> |
| @@ -136,33 +145,25 @@ | @@ -136,33 +145,25 @@ | ||
| 136 | </el-table> | 145 | </el-table> |
| 137 | </el-tab-pane> | 146 | </el-tab-pane> |
| 138 | </el-tabs> | 147 | </el-tabs> |
| 148 | + <!-- 分页组件 --> | ||
| 149 | + <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize" | ||
| 150 | + @pagination="getList"/> | ||
| 139 | </div> | 151 | </div> |
| 140 | </template> | 152 | </template> |
| 141 | 153 | ||
| 142 | <script> | 154 | <script> |
| 143 | import { getOrderPage } from "@/api/mall/trade/order"; | 155 | import { getOrderPage } from "@/api/mall/trade/order"; |
| 144 | import { datePickerOptions } from "@/utils/constants"; | 156 | import { datePickerOptions } from "@/utils/constants"; |
| 157 | +import { DICT_TYPE, getDictDatas } from "@/utils/dict"; | ||
| 145 | 158 | ||
| 146 | const dicData = { | 159 | const dicData = { |
| 147 | searchType: [ | 160 | searchType: [ |
| 148 | - { label: '订单号', value: 'ddh' }, | ||
| 149 | - { label: '交易流水号', value: 'jylsh' }, | ||
| 150 | - { label: '订单备注', value: 'ddbz' }, | ||
| 151 | - { label: '收货人姓名', value: 'shrxm' }, | ||
| 152 | - { label: '商品名称', value: 'spmc' }, | ||
| 153 | - { label: '收货人电话', value: 'shrdh' }, | ||
| 154 | - { label: '会员昵称', value: 'hync' }, | ||
| 155 | - { label: '商品编号', value: 'spbh' } | ||
| 156 | - ], | ||
| 157 | - orderStatus: [ | ||
| 158 | - { label: '全部', value: 'qb' }, | ||
| 159 | - { label: '待支付', value: 'dzf' }, | ||
| 160 | - { label: '待发货', value: 'dfh' }, | ||
| 161 | - { label: '已发货', value: 'yfh' }, | ||
| 162 | - { label: '已收货', value: 'ysh' }, | ||
| 163 | - { label: '已完成', value: 'ywc' }, | ||
| 164 | - { label: '已关闭', value: 'ygb' }, | ||
| 165 | - { label: '退款中', value: 'tkz' } | 161 | + { label: '订单号', value: 'no' }, |
| 162 | + { label: '会员编号', value: 'userId' }, | ||
| 163 | + { label: '会员昵称', value: 'userNickname' }, | ||
| 164 | + { label: '会员手机号', value: 'userMobile' }, | ||
| 165 | + { label: '收货人姓名', value: 'receiverName' }, | ||
| 166 | + { label: '收货人手机号码', value: 'receiverMobile' }, | ||
| 166 | ], | 167 | ], |
| 167 | } | 168 | } |
| 168 | export default { | 169 | export default { |
| @@ -183,20 +184,19 @@ const dicData = { | @@ -183,20 +184,19 @@ const dicData = { | ||
| 183 | queryParams: { | 184 | queryParams: { |
| 184 | pageNo: 1, | 185 | pageNo: 1, |
| 185 | pageSize: 10, | 186 | pageSize: 10, |
| 186 | - searchType: 'ddh', | ||
| 187 | - orderType: '' | 187 | + searchType: 'no', |
| 188 | + searchValue: '', | ||
| 189 | + type: null, | ||
| 190 | + status: null, | ||
| 191 | + payChannelCode: null, | ||
| 192 | + createTime: [], | ||
| 188 | }, | 193 | }, |
| 189 | - activeTabName: 'all', | ||
| 190 | - tabPanes: [ | ||
| 191 | - { text: '全部', name: 'all' }, | ||
| 192 | - { text: '待支付', name: 'toBePay' }, | ||
| 193 | - { text: '待发货', name: 'toBeSend' }, | ||
| 194 | - { text: '已发货', name: 'send' }, | ||
| 195 | - { text: '已收货', name: 'received' }, | ||
| 196 | - { text: '已完成', name: 'finished' }, | ||
| 197 | - { text: '已关闭', name: 'closed' }, | ||
| 198 | - { text: '退款中', name: 'refund' } | ||
| 199 | - ], | 194 | + // Tab 筛选 |
| 195 | + activeTab: 'all', | ||
| 196 | + statusTabs: [{ | ||
| 197 | + label: '全部', | ||
| 198 | + value: 'all' | ||
| 199 | + }], | ||
| 200 | // 静态变量 | 200 | // 静态变量 |
| 201 | datePickerOptions: datePickerOptions | 201 | datePickerOptions: datePickerOptions |
| 202 | } | 202 | } |
| @@ -204,24 +204,50 @@ const dicData = { | @@ -204,24 +204,50 @@ const dicData = { | ||
| 204 | created() { | 204 | created() { |
| 205 | this.getList(); | 205 | this.getList(); |
| 206 | // 设置 statuses 过滤 | 206 | // 设置 statuses 过滤 |
| 207 | - // for (const dict of getDictDatas(DICT_TYPE.TRADE_AFTER_SALE_STATUS)) { | ||
| 208 | - // this.statusTabs.push({ | ||
| 209 | - // label: dict.label, | ||
| 210 | - // value: dict.value | ||
| 211 | - // }) | ||
| 212 | - // } | 207 | + for (const dict of getDictDatas(DICT_TYPE.TRADE_ORDER_STATUS)) { |
| 208 | + this.statusTabs.push({ | ||
| 209 | + label: dict.label, | ||
| 210 | + value: dict.value | ||
| 211 | + }) | ||
| 212 | + } | ||
| 213 | }, | 213 | }, |
| 214 | methods: { | 214 | methods: { |
| 215 | /** 查询列表 */ | 215 | /** 查询列表 */ |
| 216 | getList() { | 216 | getList() { |
| 217 | this.loading = true; | 217 | this.loading = true; |
| 218 | // 执行查询 | 218 | // 执行查询 |
| 219 | - getOrderPage(this.queryParams).then(response => { | 219 | + getOrderPage({ |
| 220 | + ...this.queryParams, | ||
| 221 | + searchType: undefined, | ||
| 222 | + searchValue: undefined, | ||
| 223 | + no: this.queryParams.searchType === 'no' ? this.queryParams.searchValue : undefined, | ||
| 224 | + userId: this.queryParams.searchType === 'userId' ? this.queryParams.searchValue : undefined, | ||
| 225 | + userNickname: this.queryParams.searchType === 'userNickname' ? this.queryParams.searchValue : undefined, | ||
| 226 | + userMobile: this.queryParams.searchType === 'userMobile' ? this.queryParams.searchValue : undefined, | ||
| 227 | + receiverName: this.queryParams.searchType === 'receiverName' ? this.queryParams.searchValue : undefined, | ||
| 228 | + receiverMobile: this.queryParams.searchType === 'receiverMobile' ? this.queryParams.searchValue : undefined, | ||
| 229 | + }).then(response => { | ||
| 220 | this.list = response.data.list; | 230 | this.list = response.data.list; |
| 221 | this.total = response.data.total; | 231 | this.total = response.data.total; |
| 222 | this.loading = false; | 232 | this.loading = false; |
| 223 | }); | 233 | }); |
| 224 | }, | 234 | }, |
| 235 | + /** 搜索按钮操作 */ | ||
| 236 | + handleQuery() { | ||
| 237 | + this.queryParams.pageNo = 1; | ||
| 238 | + this.activeTab = this.queryParams.status ? this.queryParams.status : 'all'; // 处理 tab | ||
| 239 | + this.getList(); | ||
| 240 | + }, | ||
| 241 | + /** 重置按钮操作 */ | ||
| 242 | + resetQuery() { | ||
| 243 | + this.resetForm("queryForm"); | ||
| 244 | + this.handleQuery(); | ||
| 245 | + }, | ||
| 246 | + /** tab 切换 */ | ||
| 247 | + tabClick(tab) { | ||
| 248 | + this.queryParams.status = tab.name === 'all' ? undefined : tab.name; | ||
| 249 | + this.getList(); | ||
| 250 | + }, | ||
| 225 | goToDetail (row) { | 251 | goToDetail (row) { |
| 226 | this.$router.push({ path: '/mall/trade/order/detail', query: { orderNo: row.orderNo }}) | 252 | this.$router.push({ path: '/mall/trade/order/detail', query: { orderNo: row.orderNo }}) |
| 227 | } | 253 | } |