From d448834784e996a3c35c90097c4e7b110899bed2 Mon Sep 17 00:00:00 2001 From: Administrator <15274802129@163.com> Date: Fri, 04 Jul 2025 14:02:02 +0800 Subject: [PATCH] feat(clothes): 添加订单管理功能 --- src/main/java/cc/mrbird/febs/mall/mapper/ClothesOrderMapper.java | 4 src/main/resources/templates/febs/views/modules/clothesType/deliverGoods.html | 117 +++++ src/main/java/cc/mrbird/febs/mall/service/impl/ClothesTypeServiceImpl.java | 319 ++++++++++++++ src/main/java/cc/mrbird/febs/mall/controller/clothes/AdminClothesTypeController.java | 200 ++++++++ src/main/resources/mapper/modules/ClothesOrderMapper.xml | 58 ++ src/main/java/cc/mrbird/febs/mall/controller/clothes/ApiClothesOrderController.java | 1 src/main/java/cc/mrbird/febs/mall/controller/clothes/ViewClothesTypeController.java | 43 + src/main/java/cc/mrbird/febs/mall/dto/clothes/AdminClothesDeliverGoodsDto.java | 20 src/main/java/cc/mrbird/febs/mall/dto/clothes/AdminClothesRefundOrderDto.java | 9 src/main/java/cc/mrbird/febs/mall/dto/clothes/AdminClothesOrderListDto.java | 23 + src/main/java/cc/mrbird/febs/mall/vo/clothes/AdminClothesDeliverGoodsVo.java | 19 src/main/resources/templates/febs/views/modules/clothesType/orderList.html | 397 ++++++++++++++++++ src/main/java/cc/mrbird/febs/mall/service/impl/ApiClothesOrderServiceImpl.java | 9 src/main/java/cc/mrbird/febs/mall/service/ClothesTypeService.java | 23 + src/main/java/cc/mrbird/febs/mall/vo/clothes/AdminClothesOrderListVo.java | 38 + 15 files changed, 1,266 insertions(+), 14 deletions(-) diff --git a/src/main/java/cc/mrbird/febs/mall/controller/clothes/AdminClothesTypeController.java b/src/main/java/cc/mrbird/febs/mall/controller/clothes/AdminClothesTypeController.java index ba746f5..7d18b56 100644 --- a/src/main/java/cc/mrbird/febs/mall/controller/clothes/AdminClothesTypeController.java +++ b/src/main/java/cc/mrbird/febs/mall/controller/clothes/AdminClothesTypeController.java @@ -4,21 +4,41 @@ import cc.mrbird.febs.common.controller.BaseController; import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.common.entity.QueryRequest; +import cc.mrbird.febs.common.enumerates.OrderDeliveryStateEnum; +import cc.mrbird.febs.common.enumerates.OrderStatusEnum; +import cc.mrbird.febs.common.utils.excl.ExcelSheetPO; +import cc.mrbird.febs.common.utils.excl.ExcelUtil; +import cc.mrbird.febs.common.utils.excl.ExcelVersion; +import cc.mrbird.febs.common.utils.excl.ResponseHeadUtil; +import cc.mrbird.febs.mall.dto.DeliverGoodsDto; +import cc.mrbird.febs.mall.dto.clothes.AdminClothesDeliverGoodsDto; +import cc.mrbird.febs.mall.dto.clothes.AdminClothesOrderListDto; +import cc.mrbird.febs.mall.dto.clothes.AdminClothesRefundOrderDto; import cc.mrbird.febs.mall.dto.clothes.AdminClothesTypeInfoDto; -import cc.mrbird.febs.mall.dto.memberLevel.AdminMemberLabelAddDto; -import cc.mrbird.febs.mall.dto.memberLevel.AdminMemberLabelDto; -import cc.mrbird.febs.mall.dto.memberLevel.AdminMemberLabelUpdateDto; import cc.mrbird.febs.mall.entity.*; import cc.mrbird.febs.mall.service.ClothesTypeService; -import cc.mrbird.febs.mall.vo.clothes.AdminClothesTypeInfoVo; -import cc.mrbird.febs.mall.vo.memberLevel.AdminMemberLabelSetDto; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; +import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; +import java.io.File; +import java.io.IOException; +import java.io.OutputStream; +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; import java.util.Map; @Slf4j @@ -29,6 +49,176 @@ public class AdminClothesTypeController extends BaseController { private final ClothesTypeService clothesTypeService; + + /** + * 订单列表 + * + * @param dto + * @param request + * @return + */ + @GetMapping("orderList") + public FebsResponse getOrderList(AdminClothesOrderListDto dto, QueryRequest request) { + String startTime = dto.getStartTime(); + String endTime = dto.getEndTime(); + if(StrUtil.isNotBlank(startTime) && StrUtil.isNotBlank(endTime)){ + DateTime dateStartTime= DateUtil.parseDate(startTime); + DateTime dateEndTime = DateUtil.parseDate(endTime); + int compare = DateUtil.compare(dateStartTime, dateEndTime); + if(compare >= 0){ + return new FebsResponse().fail().message("请输入正确的开始时间和结束时间"); + } + } + Map<String, Object> data = getDataTable(clothesTypeService.getOrderListInPage(dto, request)); + return new FebsResponse().success().data(data); + } + + /** + * 订单列表-发货 + */ + @PostMapping("deliverGoods") + @ControllerEndpoint(operation = "订单列表-发货", exceptionMessage = "操作失败") + public FebsResponse deliverGoods(AdminClothesDeliverGoodsDto dto) { + + return clothesTypeService.deliverGoods(dto); + } + + /** + * 订单列表-修改物流编号 + */ + @PostMapping("deliverGoodsUpdate") + @ControllerEndpoint(operation = "订单列表-修改物流编号", exceptionMessage = "操作失败") + public FebsResponse deliverGoodsUpdate(@Valid AdminClothesDeliverGoodsDto dto) { + + return clothesTypeService.deliverGoodsUpdate(dto); + } + + /** + * 订单列表-仅退款 + */ + + @GetMapping("refundOrder/{id}") + @ControllerEndpoint(operation = "订单列表-仅退款", exceptionMessage = "仅退款") + public FebsResponse refundOrder(@NotNull(message = "{required}") @PathVariable Long id) { + AdminClothesRefundOrderDto dto = new AdminClothesRefundOrderDto(); + dto.setId(id); + return clothesTypeService.refundOrder(dto); + } + + @GetMapping("confirmOrder/{ids}") + @ControllerEndpoint(operation = "订单列表-确认收货", exceptionMessage = "操作失败") + public FebsResponse confirmOrder(@NotBlank(message = "{required}") @PathVariable String ids){ + List<String> List = StrUtil.splitTrim(ids, ","); + for(String id : List){ + long orderId = Long.parseLong(id); + clothesTypeService.confirmOrder(orderId); + } + return new FebsResponse().success(); + } + + @GetMapping("exportOrderList/{ids}") + @ControllerEndpoint(operation = "订单列表", exceptionMessage = "导出失败") + public FebsResponse exportOrderList(@NotBlank(message = "{required}") @PathVariable String ids, HttpServletResponse response) throws IOException { + List<String> List = StrUtil.splitTrim(ids, ","); + if(CollUtil.isNotEmpty( List)){ + ArrayList<Long> orderIds = new ArrayList<>(); + for (String id : List){ + long orderId = Long.parseLong(id); + orderIds.add(orderId); + } + if(CollUtil.isNotEmpty(orderIds)){ + + clothesTypeService.exportOrderList(orderIds,response); + } + } + return null; + } + + @PostMapping(value = "/importDeliver") + @ControllerEndpoint(operation = "导入发货", exceptionMessage = "导入失败") + public FebsResponse importDeliver(@RequestBody MultipartFile file) throws IOException { + if (file.isEmpty()) { + return new FebsResponse().fail(); + } + + String fileName = file.getOriginalFilename(); + String dirPath = "/home/javaweb/webresource/clothes/"; + + File saveFile = new File(new File(dirPath).getAbsolutePath() + File.separator + fileName); + if (!saveFile.exists()) { + if (!saveFile.getParentFile().exists()) { + saveFile.getParentFile().mkdirs(); + } + } + + file.transferTo(saveFile); + + List<ExcelSheetPO> data = ExcelUtil.readExcel(saveFile, null, null); + if (CollUtil.isEmpty(data)) { + return new FebsResponse().fail(); + } + + List<List<Object>> dataList = data.get(0).getDataList(); + + int orderIdNoIndex = -1; + int expressNoIndex = -1; + int expressComIndex = -1; + int expressCodeIndex = -1; + for (int i = 1; i < dataList.size(); i++) { + List<Object> objects = dataList.get(i); + + String orderId = ""; + String expressNo = ""; + String expressCode = ""; + String expressCom = ""; + for (int j = 0; j < objects.size(); j++) { + Object obj = objects.get(j); + if ("订单ID".equals(obj)) { + orderIdNoIndex = j; + } + if ("物流单号".equals(obj)) { + expressNoIndex = j; + } + + if ("物流公司".equals(obj)) { + expressComIndex = j; + } + + if ("物流公司码".equals(obj)) { + expressCodeIndex = j; + } + + if (j == orderIdNoIndex) { + orderId = (String) objects.get(j); + } + + + if (j == expressNoIndex) { + expressNo = (String) objects.get(j); + } + + if (j == expressComIndex) { + expressCom = (String) objects.get(j); + } + + if (j == expressCodeIndex) { + expressCode = (String) objects.get(j);; + } + + } + + if (StrUtil.isNotBlank(expressNo) && StrUtil.isNotBlank(expressCode) && StrUtil.isNotBlank(expressCom)) { + AdminClothesDeliverGoodsDto dto = new AdminClothesDeliverGoodsDto(); + dto.setId(Long.parseLong(orderId)); + dto.setExpressCom(expressCom); + dto.setExpressCode(expressCode); + dto.setExpressNo(expressNo); + clothesTypeService.deliverGoodsImport(dto); + } + } + return new FebsResponse().success(); + } + /** * 分类列表 * @return diff --git a/src/main/java/cc/mrbird/febs/mall/controller/clothes/ApiClothesOrderController.java b/src/main/java/cc/mrbird/febs/mall/controller/clothes/ApiClothesOrderController.java index 0ff92f2..b078725 100644 --- a/src/main/java/cc/mrbird/febs/mall/controller/clothes/ApiClothesOrderController.java +++ b/src/main/java/cc/mrbird/febs/mall/controller/clothes/ApiClothesOrderController.java @@ -115,6 +115,7 @@ @ApiOperation(value = "确认收货", notes = "确认收货") @PostMapping(value = "/confirm/{id}") public FebsResponse confirm(@PathVariable("id") Long id) { + return apiClothesOrderService.confirmOrder(id); } diff --git a/src/main/java/cc/mrbird/febs/mall/controller/clothes/ViewClothesTypeController.java b/src/main/java/cc/mrbird/febs/mall/controller/clothes/ViewClothesTypeController.java index 43b1ddb..e5ca549 100644 --- a/src/main/java/cc/mrbird/febs/mall/controller/clothes/ViewClothesTypeController.java +++ b/src/main/java/cc/mrbird/febs/mall/controller/clothes/ViewClothesTypeController.java @@ -8,6 +8,8 @@ import cc.mrbird.febs.mall.service.ClothesTypeService; import cc.mrbird.febs.mall.service.IAdminBannerService; import cc.mrbird.febs.mall.vo.AdminLabelSetVo; +import cc.mrbird.febs.mall.vo.AdminMallOrderVo; +import cc.mrbird.febs.mall.vo.clothes.AdminClothesDeliverGoodsVo; import cc.mrbird.febs.mall.vo.clothes.AdminClothesTypeInfoVo; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; @@ -43,6 +45,47 @@ private final ClothesTypeClothMapper clothesTypeClothMapper; private final ClothesTypePatternMapper clothesTypePatternMapper; private final ClothesTypeLocationMapper clothesTypeLocationMapper; + private final ClothesOrderMapper clothesOrderMapper; + private final MallExpressInfoMapper mallExpressInfoMapper; + + /** + * 订单列表 + */ + @GetMapping("orderList") + @RequiresPermissions("orderList:view") + public String orderList() { + + return FebsUtil.view("modules/clothesType/orderList"); + } + + /** + * 订单-发货 + * @param id + * @param model + * @return + */ + @GetMapping("deliverGoods/{id}") + @RequiresPermissions("deliverGoods:update") + public String deliverGoods(@PathVariable long id, Model model) { + AdminClothesDeliverGoodsVo data = new AdminClothesDeliverGoodsVo(); + ClothesOrder clothesOrder = clothesOrderMapper.selectById(id); + data.setExpressCom("极兔快递"); + MallExpressInfo mallExpressInfo = mallExpressInfoMapper.selectOne( + Wrappers.lambdaQuery(MallExpressInfo.class) + .eq(MallExpressInfo::getOrderId, id) + .eq(MallExpressInfo::getOrderNo, clothesOrder.getOrderNo()) + .last("limit 1") + ); + if(ObjectUtil.isNotNull(mallExpressInfo)){ + data.setExpressNo(mallExpressInfo.getExpressNo()); + data.setExpressCom(mallExpressInfo.getExpressCom()); + }else{ + data.setExpressCom("极兔快递"); + data.setExpressNo("JT"); + } + model.addAttribute("deliverInfo", data); + return FebsUtil.view("modules/clothesType/deliverGoods"); + } /** * 种类列表 diff --git a/src/main/java/cc/mrbird/febs/mall/dto/clothes/AdminClothesDeliverGoodsDto.java b/src/main/java/cc/mrbird/febs/mall/dto/clothes/AdminClothesDeliverGoodsDto.java new file mode 100644 index 0000000..331c59f --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/dto/clothes/AdminClothesDeliverGoodsDto.java @@ -0,0 +1,20 @@ +package cc.mrbird.febs.mall.dto.clothes; + +import io.swagger.annotations.ApiModel; +import lombok.Data; + +@Data +@ApiModel(value = "AdminClothesDeliverGoodsDto", description = "运费模板更新参数类") +public class AdminClothesDeliverGoodsDto { + + + private Long id; + + private String expressNo; + + private String expressCom; + + private String expressCode; + + private String orderNo; +} diff --git a/src/main/java/cc/mrbird/febs/mall/dto/clothes/AdminClothesOrderListDto.java b/src/main/java/cc/mrbird/febs/mall/dto/clothes/AdminClothesOrderListDto.java new file mode 100644 index 0000000..290b419 --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/dto/clothes/AdminClothesOrderListDto.java @@ -0,0 +1,23 @@ +package cc.mrbird.febs.mall.dto.clothes; + +import io.swagger.annotations.ApiModel; +import lombok.Data; + +@Data +@ApiModel(value = "AdminClothesOrderListDto", description = "运费模板更新参数类") +public class AdminClothesOrderListDto { + + private String name; + + private String orderNo; + /** + * 状态 1-待支付 2-待发货 3-待收货 4-已完成 5-已取消 + */ + private Integer status; + + private String payResult; + + private String startTime; + + private String endTime; +} diff --git a/src/main/java/cc/mrbird/febs/mall/dto/clothes/AdminClothesRefundOrderDto.java b/src/main/java/cc/mrbird/febs/mall/dto/clothes/AdminClothesRefundOrderDto.java new file mode 100644 index 0000000..5720eb2 --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/dto/clothes/AdminClothesRefundOrderDto.java @@ -0,0 +1,9 @@ +package cc.mrbird.febs.mall.dto.clothes; + +import lombok.Data; + +@Data +public class AdminClothesRefundOrderDto { + + private Long id; +} diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/ClothesOrderMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/ClothesOrderMapper.java index 5a4d2bd..cd46ad7 100644 --- a/src/main/java/cc/mrbird/febs/mall/mapper/ClothesOrderMapper.java +++ b/src/main/java/cc/mrbird/febs/mall/mapper/ClothesOrderMapper.java @@ -1,9 +1,12 @@ package cc.mrbird.febs.mall.mapper; +import cc.mrbird.febs.mall.dto.clothes.AdminClothesOrderListDto; import cc.mrbird.febs.mall.dto.clothes.ApiClothesOrderListVoDto; import cc.mrbird.febs.mall.entity.ClothesOrder; +import cc.mrbird.febs.mall.vo.clothes.AdminClothesOrderListVo; import cc.mrbird.febs.mall.vo.clothes.ApiClothesOrderListVo; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.apache.ibatis.annotations.Param; @@ -11,4 +14,5 @@ Page<ApiClothesOrderListVo> selectPageInOrder(Page<ApiClothesOrderListVo> page, @Param("record")ApiClothesOrderListVoDto dto); + IPage<AdminClothesOrderListVo> selectOrderListInPage(Page<AdminClothesOrderListVo> page, @Param("record")AdminClothesOrderListDto dto); } diff --git a/src/main/java/cc/mrbird/febs/mall/service/ClothesTypeService.java b/src/main/java/cc/mrbird/febs/mall/service/ClothesTypeService.java index 869ada2..1986c27 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/ClothesTypeService.java +++ b/src/main/java/cc/mrbird/febs/mall/service/ClothesTypeService.java @@ -2,10 +2,19 @@ import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.common.entity.QueryRequest; +import cc.mrbird.febs.mall.dto.clothes.AdminClothesDeliverGoodsDto; +import cc.mrbird.febs.mall.dto.clothes.AdminClothesOrderListDto; +import cc.mrbird.febs.mall.dto.clothes.AdminClothesRefundOrderDto; import cc.mrbird.febs.mall.dto.clothes.AdminClothesTypeInfoDto; import cc.mrbird.febs.mall.entity.*; +import cc.mrbird.febs.mall.vo.clothes.AdminClothesOrderListVo; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; + +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.util.List; public interface ClothesTypeService extends IService<ClothesType> { @@ -56,4 +65,18 @@ FebsResponse patternSet(AdminClothesTypeInfoDto dto); FebsResponse locationSet(AdminClothesTypeInfoDto dto); + + IPage<AdminClothesOrderListVo> getOrderListInPage(AdminClothesOrderListDto dto, QueryRequest request); + + FebsResponse deliverGoods(AdminClothesDeliverGoodsDto dto); + + FebsResponse deliverGoodsUpdate(AdminClothesDeliverGoodsDto dto); + + FebsResponse refundOrder(AdminClothesRefundOrderDto dto); + + void confirmOrder(long orderId); + + void exportOrderList(List<Long> list, HttpServletResponse response) throws IOException; + + void deliverGoodsImport(AdminClothesDeliverGoodsDto dto); } diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiClothesOrderServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiClothesOrderServiceImpl.java index e0a46d9..3ddad7e 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiClothesOrderServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiClothesOrderServiceImpl.java @@ -802,10 +802,11 @@ clothesOrderMapper.update(null, Wrappers.lambdaUpdate(ClothesOrder.class) - .set(ClothesOrder::getStatus, OrderStatusEnum.FINISH.getValue()) - .set(ClothesOrder::getUpdatedTime, new Date()) - .eq(ClothesOrder::getId, id) - .eq(ClothesOrder::getMemberId, member.getId()) + .set(ClothesOrder::getStatus, OrderStatusEnum.FINISH.getValue()) + .set(ClothesOrder::getDeliveryState, OrderDeliveryStateEnum.DELIVERY_FINISH.getValue()) + .set(ClothesOrder::getUpdatedTime, new Date()) + .eq(ClothesOrder::getId, id) + .eq(ClothesOrder::getMemberId, member.getId()) ); return new FebsResponse().success().message("操作成功"); } diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/ClothesTypeServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/ClothesTypeServiceImpl.java index 90a02a0..c8015bf 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/impl/ClothesTypeServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/mall/service/impl/ClothesTypeServiceImpl.java @@ -2,12 +2,27 @@ import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.common.entity.QueryRequest; -import cc.mrbird.febs.common.enumerates.StateUpDownEnum; +import cc.mrbird.febs.common.enumerates.*; +import cc.mrbird.febs.common.properties.XcxProperties; +import cc.mrbird.febs.common.utils.SpringContextHolder; +import cc.mrbird.febs.common.utils.excl.ExcelSheetPO; +import cc.mrbird.febs.common.utils.excl.ExcelUtil; +import cc.mrbird.febs.common.utils.excl.ExcelVersion; +import cc.mrbird.febs.common.utils.excl.ResponseHeadUtil; +import cc.mrbird.febs.mall.dto.clothes.AdminClothesDeliverGoodsDto; +import cc.mrbird.febs.mall.dto.clothes.AdminClothesOrderListDto; +import cc.mrbird.febs.mall.dto.clothes.AdminClothesRefundOrderDto; import cc.mrbird.febs.mall.dto.clothes.AdminClothesTypeInfoDto; import cc.mrbird.febs.mall.entity.*; import cc.mrbird.febs.mall.mapper.*; import cc.mrbird.febs.mall.service.ClothesTypeService; +import cc.mrbird.febs.mall.service.IApiMallMemberWalletService; +import cc.mrbird.febs.mall.service.IMallMoneyFlowService; +import cc.mrbird.febs.mall.vo.AdminMallOrderInfoVo; +import cc.mrbird.febs.mall.vo.clothes.AdminClothesOrderListVo; +import cc.mrbird.febs.pay.util.WeixinServiceUtil; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -17,12 +32,17 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.List; -import java.util.Map; -import java.util.Set; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.OutputStream; +import java.io.UnsupportedEncodingException; +import java.math.BigDecimal; +import java.net.URLEncoder; +import java.util.*; import java.util.stream.Collectors; @Slf4j @@ -42,6 +62,13 @@ private final ClothesTypeClothMapper clothesTypeClothMapper; private final ClothesTypePatternMapper clothesTypePatternMapper; private final ClothesTypeLocationMapper clothesTypeLocationMapper; + private final ClothesOrderMapper clothesOrderMapper; + private final MallExpressInfoMapper mallExpressInfoMapper; + private final IApiMallMemberWalletService memberWalletService; + private final IMallMoneyFlowService mallMoneyFlowService; + private final XcxProperties xcxProperties = SpringContextHolder.getBean(XcxProperties.class); + @Autowired + private WeixinServiceUtil weixinServiceUtil; @Override public IPage<ClothesType> adminTypeList(ClothesType dto, QueryRequest request) { @@ -421,4 +448,288 @@ } return new FebsResponse().success().message("操作成功"); } + + @Override + public IPage<AdminClothesOrderListVo> getOrderListInPage(AdminClothesOrderListDto dto, QueryRequest request) { + Page<AdminClothesOrderListVo> page = new Page<>(request.getPageNum(), request.getPageSize()); + IPage<AdminClothesOrderListVo> vos = clothesOrderMapper.selectOrderListInPage(page, dto); + return vos; + } + + @Override + public FebsResponse deliverGoods(AdminClothesDeliverGoodsDto dto) { + ClothesOrder clothesOrder = clothesOrderMapper.selectById(dto.getId()); + + if(ObjectUtil.isNull(clothesOrder)){ + return new FebsResponse().fail().message("订单不存在,刷新后重试"); + } + Integer status = clothesOrder.getStatus(); + if(ClothesOrderStatusEnum.WAIT_SHIPPING.getValue() != status){ + return new FebsResponse().fail().message("订单不是待发货状态"); + } + String expressNo = dto.getExpressNo(); + if(StrUtil.isEmpty(expressNo)){ + return new FebsResponse().fail().message("请输入物流单号"); + } + String expressCom = dto.getExpressCom(); + if(StrUtil.isEmpty(expressCom)){ + return new FebsResponse().fail().message("请输入物流公司"); + } + MallExpressInfo mallExpressInfo = new MallExpressInfo(); + mallExpressInfo.setMemberId(clothesOrder.getMemberId()); + mallExpressInfo.setOrderId(clothesOrder.getId()); + mallExpressInfo.setOrderNo(clothesOrder.getOrderNo()); + mallExpressInfo.setExpressNo(expressNo); + mallExpressInfo.setExpressCom(expressCom); + mallExpressInfoMapper.insert(mallExpressInfo); + + clothesOrderMapper.update( + null, + Wrappers.lambdaUpdate(ClothesOrder.class) + .set(ClothesOrder::getStatus, ClothesOrderStatusEnum.WAIT_FINISH.getValue()) + .set(ClothesOrder::getUpdatedTime, new Date()) + .set(ClothesOrder::getDeliveryState, OrderDeliveryStateEnum.DELIVERY_FINISH.getValue()) + .eq(ClothesOrder::getId, clothesOrder.getId()) + ); + return new FebsResponse().success().message("操作成功"); + } + + @Override + public FebsResponse deliverGoodsUpdate(AdminClothesDeliverGoodsDto dto) { + ClothesOrder clothesOrder = clothesOrderMapper.selectById(dto.getId()); + + if(ObjectUtil.isNull(clothesOrder)){ + return new FebsResponse().fail().message("订单不存在,刷新后重试"); + } + Integer status = clothesOrder.getStatus(); + if(ClothesOrderStatusEnum.WAIT_FINISH.getValue() != status){ + return new FebsResponse().fail().message("订单不是待发货状态"); + } + String expressNo = dto.getExpressNo(); + if(StrUtil.isEmpty(expressNo)){ + return new FebsResponse().fail().message("请输入物流单号"); + } + String expressCom = dto.getExpressCom(); + if(StrUtil.isEmpty(expressCom)){ + return new FebsResponse().fail().message("请输入物流公司"); + } + MallExpressInfo mallExpressInfo = mallExpressInfoMapper.selectOne( + Wrappers.lambdaQuery(MallExpressInfo.class) + .eq(MallExpressInfo::getOrderId, clothesOrder.getId()) + .eq(MallExpressInfo::getOrderNo, clothesOrder.getOrderNo()) + .last("limit 1") + ); + if(ObjectUtil.isNull(mallExpressInfo)){ + return new FebsResponse().fail().message("请先发货"); + } + mallExpressInfoMapper.update( + null, + Wrappers.lambdaUpdate(MallExpressInfo.class) + .set(MallExpressInfo::getExpressNo, expressNo) + .set(MallExpressInfo::getExpressCom, expressCom) + .set(MallExpressInfo::getUpdatedTime, new Date()) + .eq(MallExpressInfo::getId, mallExpressInfo.getId()) + ); + return new FebsResponse().success().message("操作成功"); + } + + + private void clothesUpdateStatusAndUpdateTimeById(Long id, Date date, int value) { + clothesOrderMapper.update( + null, + Wrappers.lambdaUpdate(ClothesOrder.class) + .set(ClothesOrder::getStatus, ClothesOrderStatusEnum.CANCEL.getValue()) + .set(ClothesOrder::getUpdatedTime, new Date()) + .eq(ClothesOrder::getId, id) + ); + } + + private Boolean weChatRefundOrderEvent(int refundMoney, BigDecimal orderAmount, String orderNo, String refundNo) { + Boolean flag; + Boolean debug = xcxProperties.getDebug(); + if (debug) { + if(orderAmount.compareTo(BigDecimal.ZERO) > 0){ + boolean b = weixinServiceUtil.comRefund(orderNo, refundNo, 1, 1, null); + flag = b; + }else{ + flag = true; + } + } else { + if(orderAmount.compareTo(BigDecimal.ZERO) > 0){ + log.info("开始调用退款接口。。。退款编号为{}", refundNo); + boolean b = weixinServiceUtil.comRefund(orderNo, refundNo, refundMoney, refundMoney, null); + flag = b; + }else{ + flag = true; + } + } + return flag; + } + @Override + public FebsResponse refundOrder(AdminClothesRefundOrderDto dto) { + ClothesOrder clothesOrder = clothesOrderMapper.selectById(dto.getId()); + if(ObjectUtil.isNull(clothesOrder)){ + return new FebsResponse().fail().message("订单不存在,刷新后重试"); + } + Integer status = clothesOrder.getStatus(); + if(ClothesOrderStatusEnum.WAIT_SHIPPING.getValue() != status){ + return new FebsResponse().fail().message("订单不是待发货状态"); + } + + //退款订单编号 + String orderNo = clothesOrder.getOrderNo(); + //退款退款编号 + String refundNo = clothesOrder.getOrderNo()+"_REFUND_"+clothesOrder.getId(); + //退款订单金额 + BigDecimal orderAmount = clothesOrder.getRealAmount(); + + //余额支付退款 + if(ClothesOrderPayTypeEnum.BALANCE.getName().equals(clothesOrder.getPayMethod())){ + log.info("余额支付退款"); + if(orderAmount.compareTo(BigDecimal.ZERO) > 0){ + //更新订单详情 + clothesUpdateStatusAndUpdateTimeById(clothesOrder.getId(),new Date(),ClothesOrderStatusEnum.CANCEL.getValue()); + + memberWalletService.add(orderAmount, clothesOrder.getMemberId(), "balance"); + mallMoneyFlowService.addMoneyFlow( + clothesOrder.getMemberId(), + orderAmount, + ScoreFlowTypeEnum.REFUND.getValue(), + clothesOrder.getOrderNo(), + FlowTypeEnum.BALANCE.getValue(), + StrUtil.format(ScoreFlowTypeEnum.REFUND.getDesc(),orderAmount), + 2 + ); + } + return new FebsResponse().success().message("退款成功"); + }else if(ClothesOrderPayTypeEnum.WECHAT.getName().equals(clothesOrder.getPayMethod())){ + + int refundMoney = orderAmount.multiply(new BigDecimal(100)).intValue(); + Boolean flag = weChatRefundOrderEvent(refundMoney, orderAmount, orderNo, refundNo); + if(flag){ + if(orderAmount.compareTo(BigDecimal.ZERO) > 0){ + //更新订单详情 + clothesUpdateStatusAndUpdateTimeById(clothesOrder.getId(),new Date(),ClothesOrderStatusEnum.CANCEL.getValue()); + + mallMoneyFlowService.addMoneyFlow( + clothesOrder.getMemberId(), + orderAmount, + ScoreFlowTypeEnum.WECHAT_REFUND.getValue(), + clothesOrder.getOrderNo(), + FlowTypeEnum.BALANCE.getValue(), + StrUtil.format(ScoreFlowTypeEnum.WECHAT_REFUND.getDesc(),orderAmount), + 2 + ); + } + }else{ + return new FebsResponse().fail().message("退款失败,请联系客服人员"); + } + }else{ + return new FebsResponse().fail().message("退款失败,请联系客服人员"); + } + + return new FebsResponse().success().message("退款成功"); + } + + @Override + public void confirmOrder(long orderId) { + ClothesOrder clothesOrder = clothesOrderMapper.selectById(orderId); + if(ObjectUtil.isNotNull(clothesOrder) && ClothesOrderStatusEnum.WAIT_FINISH.getValue() == clothesOrder.getStatus()){ + clothesUpdateStatusAndUpdateTimeById(clothesOrder.getId(),new Date(),ClothesOrderStatusEnum.FINISH.getValue()); + } + } + + @Override + public void exportOrderList(List<Long> orderIds, HttpServletResponse response) throws IOException { + List<ExcelSheetPO> res = new ArrayList<>(); + + ExcelSheetPO orderSheet = new ExcelSheetPO(); + String title = "订单列表"; + orderSheet.setSheetName(title); + orderSheet.setTitle(title); + String[] header = {"订单ID", "订单编号", "收货姓名", "收货电话", "收货地址", "商品详情", "备注", "物流单号", "物流公司", "物流公司码"}; + orderSheet.setHeaders(header); + + QueryRequest request = new QueryRequest(); + request.setPageNum(1); + request.setPageSize(9999); + List<ClothesOrder> dataList = clothesOrderMapper.selectList( + Wrappers.lambdaQuery(ClothesOrder.class) + .in(ClothesOrder::getId, orderIds) + .eq(ClothesOrder::getDelFlag, 0) + .eq(ClothesOrder::getStatus, ClothesOrderStatusEnum.WAIT_SHIPPING.getValue())); + Map<Long, ClothesType> longClothesTypeHashMap = new HashMap<>(); + if(CollUtil.isNotEmpty(dataList)){ + Set<Long> typeIds = dataList.stream().map(ClothesOrder::getTypeId).collect(Collectors.toSet()); + List<ClothesType> clothesTypes = clothesTypeMapper.selectList( + Wrappers.lambdaQuery(ClothesType.class) + .in(ClothesType::getId, typeIds) + ); + if(CollUtil.isNotEmpty(clothesTypes)){ + //stream操作clothesTypes,返回一个HashMap<Long, ClothesType>, key为clothesType.id, value为clothesType + longClothesTypeHashMap = clothesTypes.stream().collect(Collectors.toMap(ClothesType::getId, clothesType -> clothesType)); + } + } + + List<List<Object>> list = new ArrayList<>(); + + if (dataList.size() > 0) { + for (ClothesOrder item : dataList) { + List<Object> temp = new ArrayList<>(); + temp.add(item.getId()); + temp.add(item.getOrderNo()); + temp.add(item.getName()); + temp.add(item.getPhone()); + temp.add(item.getAddress()); + temp.add(longClothesTypeHashMap.get(item.getTypeId()).getName()); + temp.add(item.getRemark()); + list.add(temp); + } + } + orderSheet.setDataList(list); + res.add(orderSheet); + response = ResponseHeadUtil.setExcelHead(response); + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(title + DateUtil.format(new Date(), "yyyyMMDDHHmmss") + ".xlsx".trim(), "UTF-8")); + OutputStream os = response.getOutputStream(); + ExcelUtil.createWorkbookAtOutStream(ExcelVersion.V2007, res, os, true); + } + + @Override + public void deliverGoodsImport(AdminClothesDeliverGoodsDto dto) { + ClothesOrder clothesOrder = clothesOrderMapper.selectById(dto.getId()); + + if(ObjectUtil.isNull(clothesOrder)){ + return; + } + Integer status = clothesOrder.getStatus(); + if(ClothesOrderStatusEnum.WAIT_SHIPPING.getValue() != status){ + return; + } + String expressNo = dto.getExpressNo(); + if(StrUtil.isEmpty(expressNo)){ + return; + } + String expressCom = dto.getExpressCom(); + if(StrUtil.isEmpty(expressCom)){ + return; + } + mallExpressInfoMapper.update( + null, + Wrappers.lambdaUpdate(MallExpressInfo.class) + .set(MallExpressInfo::getExpressNo, expressNo) + .set(MallExpressInfo::getExpressCom, expressCom) + .eq(MallExpressInfo::getOrderId, clothesOrder.getId()) + .eq(MallExpressInfo::getOrderNo, clothesOrder.getOrderNo()) + ); + + clothesOrderMapper.update( + null, + Wrappers.lambdaUpdate(ClothesOrder.class) + .set(ClothesOrder::getStatus, ClothesOrderStatusEnum.WAIT_FINISH.getValue()) + .set(ClothesOrder::getUpdatedTime, new Date()) + .set(ClothesOrder::getDeliveryState, OrderDeliveryStateEnum.DELIVERY_ING.getValue()) + .eq(ClothesOrder::getId, clothesOrder.getId()) + ); + } } diff --git a/src/main/java/cc/mrbird/febs/mall/vo/clothes/AdminClothesDeliverGoodsVo.java b/src/main/java/cc/mrbird/febs/mall/vo/clothes/AdminClothesDeliverGoodsVo.java new file mode 100644 index 0000000..0953b3b --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/vo/clothes/AdminClothesDeliverGoodsVo.java @@ -0,0 +1,19 @@ +package cc.mrbird.febs.mall.vo.clothes; + +import lombok.Data; + +@Data +public class AdminClothesDeliverGoodsVo { + + private Long id; + + private String name; + + private String phone; + + private String address; + + private String expressCom; + + private String expressNo; +} diff --git a/src/main/java/cc/mrbird/febs/mall/vo/clothes/AdminClothesOrderListVo.java b/src/main/java/cc/mrbird/febs/mall/vo/clothes/AdminClothesOrderListVo.java new file mode 100644 index 0000000..b40582e --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/vo/clothes/AdminClothesOrderListVo.java @@ -0,0 +1,38 @@ +package cc.mrbird.febs.mall.vo.clothes; + +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +@Data +public class AdminClothesOrderListVo { + + private Long id; + private Long typeId; + + private String memberName; + private String typeName; + private String typeImage; + + private String orderNo; + private Date orderTime; + private Integer goodsCnt; + private Integer status; + private String remark; + + + private Date payTime; + private String payMethod; + private String payOrderNo; + private Integer payResult; + + private Integer deliveryState; + + private BigDecimal amount; + private BigDecimal discountAmount; + private BigDecimal carriage; + private BigDecimal realAmount; + + private Integer commentState; +} diff --git a/src/main/resources/mapper/modules/ClothesOrderMapper.xml b/src/main/resources/mapper/modules/ClothesOrderMapper.xml index 7e48374..37a7688 100644 --- a/src/main/resources/mapper/modules/ClothesOrderMapper.xml +++ b/src/main/resources/mapper/modules/ClothesOrderMapper.xml @@ -11,7 +11,7 @@ b.name as typeName, b.image as typeImage, a.goods_cnt as goodsCnt - from clothes_order_graft a + from clothes_order a left join clothes_type b on a.type_id = b.id <where> and a.member_id = #{record.memberId} @@ -31,4 +31,60 @@ order by a.CREATED_TIME desc </select> + <select id="selectOrderListInPage" resultType="cc.mrbird.febs.mall.vo.clothes.AdminClothesOrderListVo"> + select + a.id as id, + a.type_id as typeId, + + c.name as memberName, + b.name as typeName, + b.image as typeImage, + + a.order_no as orderNo, + a.order_time as orderTime, + a.goods_cnt as goodsCnt, + a.status as status, + a.remark as remark, + + a.pay_time as payTime, + a.pay_method as payMethod, + a.pay_order_no as payOrderNo, + a.pay_result as payResult, + + a.delivery_state as deliveryState, + + a.amount as amount, + a.discount_amount as discountAmount, + a.carriage as carriage, + a.real_amount as realAmount, + a.comment_state as commentState + from clothes_order a + left join clothes_type b on a.type_id = b.id + left join mall_member c on a.member_id = c.id + + <where> + <if test="record != null"> + <if test="record.payResult != null"> + and a.pay_result = #{record.payResult} + </if> + <if test="record.status != null"> + and a.status = #{record.status} + </if> + <if test="record.orderNo != null and record.orderNo != ''"> + and a.order_no like CONCAT('%', CONCAT(#{record.orderNo}, '%')) + </if> + <if test="record.name != null and record.name != ''"> + and c.name like CONCAT('%', CONCAT(#{record.name}, '%')) + </if> + <if test="record.startTime != null and record.startTime != ''"> + and a.order_time >= #{record.startTime} + </if> + <if test="record.endTime != null and record.endTime != ''"> + and a.order_time <= #{record.endTime} + </if> + </if> + </where> + order by a.created_time desc + </select> + </mapper> \ No newline at end of file diff --git a/src/main/resources/templates/febs/views/modules/clothesType/deliverGoods.html b/src/main/resources/templates/febs/views/modules/clothesType/deliverGoods.html new file mode 100644 index 0000000..46eeda4 --- /dev/null +++ b/src/main/resources/templates/febs/views/modules/clothesType/deliverGoods.html @@ -0,0 +1,117 @@ +<style> + #deliver-update-clothes { + padding: 20px 25px 25px 0; + } + + #deliver-update-clothes .layui-treeSelect .ztree li a, .ztree li span { + margin: 0 0 2px 3px !important; + } + #deliver-update-clothes #data-permission-tree-block { + border: 1px solid #eee; + border-radius: 2px; + padding: 3px 0; + } + #deliver-update-clothes .layui-treeSelect .ztree li span.button.switch { + top: 1px; + left: 3px; + } + +</style> +<div class="layui-fluid" id="deliver-update-clothes"> + <form class="layui-form" action="" lay-filter="deliver-update-clothes-form"> + <div class="layui-form-item febs-hide"> + <label class="layui-form-label febs-form-item-require">id:</label> + <div class="layui-input-block"> + <input type="text" name="id"> + </div> + </div> + <div class="layui-form-item"> + <label class="layui-form-label febs-form-item-require">收货人:</label> + <div class="layui-input-block"> + <input type="text" name="name" + autocomplete="off" class="layui-input" readonly> + </div> + </div> + <div class="layui-form-item"> + <label class="layui-form-label febs-form-item-require">联系方式:</label> + <div class="layui-input-block"> + <input type="text" name="phone" + autocomplete="off" class="layui-input" readonly> + </div> + </div> + <div class="layui-form-item"> + <label class="layui-form-label febs-form-item-require">地址:</label> + <div class="layui-input-block"> + <input type="text" name="address" + autocomplete="off" class="layui-input" readonly> + </div> + </div> + <div class="layui-form-item"> + <label class="layui-form-label febs-form-item-require">物流单号:</label> + <div class="layui-input-block"> + <input type="text" name="expressNo" lay-verify="required" + autocomplete="off" class="layui-input" > + </div> + </div> + <div class="layui-form-item"> + <label class="layui-form-label febs-form-item-require">物流公司:</label> + <div class="layui-input-block"> + <input type="text" name="expressCom" lay-verify="required" + autocomplete="off" class="layui-input" > + </div> + </div> + <div class="layui-form-item febs-hide"> + <button class="layui-btn" lay-submit="" lay-filter="deliver-update-clothes-form-submit" id="submit"></button> + <button class="layui-btn" lay-submit="" lay-filter="deliverInfo-update-clothes-form-submit" id="deliverInfoSubmit"></button> + </div> + </form> +</div> + +<script data-th-inline="javascript"> + layui.use(['febs', 'form', 'formSelects', 'validate', 'treeSelect', 'eleTree'], function () { + var $ = layui.$, + febs = layui.febs, + layer = layui.layer, + formSelects = layui.formSelects, + treeSelect = layui.treeSelect, + form = layui.form, + eleTree = layui.eleTree, + deliverInfo = [[${deliverInfo}]], + $view = $('#deliver-update-clothes'), + validate = layui.validate, + _deptTree; + + form.render(); + + initUserValue(); + + function initUserValue() { + form.val("deliver-update-clothes-form", { + "id": deliverInfo.id, + "name": deliverInfo.name, + "phone": deliverInfo.phone, + "expressCom": deliverInfo.expressCom, + "expressNo": deliverInfo.expressNo, + "address": deliverInfo.address + }); + } + + form.on('submit(deliver-update-clothes-form-submit)', function (data) { + febs.post(ctx + 'admin/clothesType/deliverGoods', data.field, function () { + layer.closeAll(); + febs.alert.success('操作成功'); + $('#febs-clothes-order').find('#query').click(); + }); + return false; + }); + + form.on('submit(deliverInfo-update-clothes-form-submit)', function (data) { + febs.post(ctx + 'admin/clothesType/deliverGoodsUpdate', data.field, function () { + layer.closeAll(); + febs.alert.success('操作成功'); + $('#febs-clothes-order').find('#query').click(); + }); + return false; + }); + }); +</script> \ No newline at end of file diff --git a/src/main/resources/templates/febs/views/modules/clothesType/orderList.html b/src/main/resources/templates/febs/views/modules/clothesType/orderList.html new file mode 100644 index 0000000..486eb98 --- /dev/null +++ b/src/main/resources/templates/febs/views/modules/clothesType/orderList.html @@ -0,0 +1,397 @@ +<div class="layui-fluid layui-anim febs-anim" id="febs-clothes-order" lay-title="订单列表"> + <div class="layui-row febs-container"> + <div class="layui-col-md12"> + <div class="layui-card"> + <div class="layui-card-body febs-table-full"> + <form class="layui-form layui-table-form" lay-filter="clothes-order-table-form"> + <div class="layui-form-item"> + <div class="layui-col-md10"> + <div class="layui-inline"> + <label class="layui-form-label">购买人:</label> + <div class="layui-input-inline"> + <input type="text" placeholder="购买人" name="name" autocomplete="off" class="layui-input"> + </div> + </div> + <div class="layui-inline"> + <label class="layui-form-label">订单编号:</label> + <div class="layui-input-inline"> + <input type="text" placeholder="订单编号" name="orderNo" autocomplete="off" class="layui-input"> + </div> + </div> + <div class="layui-inline"> + <label class="layui-form-label">订单状态:</label> + <div class="layui-input-inline"> + <select name="status"> + <option value="">请选择</option> + <option value="1">待支付</option> + <option value="2">待发货</option> + <option value="3">待收货</option> + <option value="4">已完成</option> + <option value="5">已取消</option> + </select> + </div> + </div> + <div class="layui-inline"> + <label class="layui-form-label">支付状态:</label> + <div class="layui-input-inline"> + <select name="payResult"> + <option value="">请选择</option> + <option value="1">成功</option> + <option value="2">未成功</option> + </select> + </div> + </div> + <div class="layui-inline"> + <label class="layui-form-label">开始时间:</label> + <div class="layui-input-inline"> + <input type="text" name="startTime" id="febs-clothes-order-date-start" lay-verify="date" + placeholder="yyyy-MM-dd HH:mm:ss" autocomplete="off" class="layui-input"> + </div> + </div> + <div class="layui-inline"> + <label class="layui-form-label">结束时间:</label> + <div class="layui-input-inline"> + <input type="text" name="endTime" id="febs-clothes-order-date-end" lay-verify="date" + placeholder="yyyy-MM-dd HH:mm:ss" autocomplete="off" class="layui-input"> + </div> + </div> + </div> + + <div class="layui-col-md2 layui-col-sm12 layui-col-xs12 table-action-area"> + <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-blue-plain table-action" id="query"> + <i class="layui-icon"></i> + </div> + <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain table-action" id="reset"> + <i class="layui-icon"></i> + </div> + </div> + </div> + </form> + <table lay-filter="orderClothesTable" lay-data="{id: 'orderClothesTable'}"></table> + <style type="text/css"> + .layui-table cell{ + text-align:center; + height: auto; + white-space: nowrap; /*文本不会换行,在同一行显示*/ + overflow: hidden; /*超出隐藏*/ + text-overflow: ellipsis; /*省略号显示*/ + } + .layui-table img{ + max-width:100px + } + + ::-webkit-scrollbar { + height: 20px !important; + background-color: #f4f4f4; + } + </style> + </div> + </div> + </div> + </div> +</div> +<!-- 表格操作栏 start --> +<script type="text/html" id="user-option"> + <span shiro:lacksPermission="user:view,user:update,user:delete"> + <span class="layui-badge-dot febs-bg-orange"></span> 无权限 + </span> + <a lay-event="edit" shiro:hasPermission="user:update"><i + class="layui-icon febs-edit-area febs-blue"></i></a> +</script> +<script type="text/html" id="tableToolBarClothesOrder"> + <div class="layui-btn-container"> + <button class="layui-btn layui-btn-sm layui-btn-primary febs-button-blue-plain" lay-event="deliverGoods">发货</button> + <button class="layui-btn layui-btn-sm layui-btn-primary febs-button-blue-plain" lay-event="updateDeliver">修改物流信息</button> + <button class="layui-btn layui-btn-sm layui-btn-primary febs-button-blue-plain" lay-event="refundOrder">仅退款</button> + <button class="layui-btn layui-btn-sm layui-btn-primary febs-button-blue-plain" lay-event="confirmOrder">确认收货</button> + <button class="layui-btn layui-btn-sm layui-btn-primary febs-button-blue-plain" lay-event="exportDeliverTwo">导出待发货订单</button> + <button class="layui-btn layui-btn-sm layui-btn-primary febs-button-blue-plain" id="importDeliver" lay-event="importDeliver">导入发货</button> + </div> +</script> +<!-- 表格操作栏 end --> +<script data-th-inline="none" type="text/javascript"> + // 引入组件并初始化 + layui.use([ 'jquery', 'form', 'table', 'febs', 'formSelects', 'upload','laydate'], function () { + var $ = layui.jquery, + febs = layui.febs, + form = layui.form, + table = layui.table, + upload = layui.upload, + $view = $('#febs-clothes-order'), + $query = $view.find('#query'), + $reset = $view.find('#reset'), + $searchForm = $view.find('form'), + sortObject = {field: 'orderTime', type: 'desc'}, + formSelects = layui.formSelects, + laydate = layui.laydate, + tableIns; + + let currPageOrder = 1;//首先默认值为1,防止出错 + //获取当前页 + currPageOrder = $view.find(".layui-laypage-em").next().html(); + //日期范围 + laydate.render({ + elem: '#febs-clothes-order-date-start',type: 'datetime' + }); + + laydate.render({ + elem: '#febs-clothes-order-date-end',type: 'datetime' + }); + + + form.render(); + + formSelects.render(); + + // 表格初始化 + initClothesOrderTable(); + + table.on('toolbar(orderClothesTable)', function(obj){ + var layEvent = obj.event; + var id = obj.config.id; + var checkStatus = table.checkStatus(id); + + if (layEvent === 'deliverGoods') { + let data = checkStatus.data; + if (data.length > 1) { + febs.alert.warn('每次只能操作一个订单'); + return; + } + let ids = ""; + for(let i = 0;i < data.length;i++){ + if(data[i].status != 1){ + febs.alert.warn('请选择待发货的订单'); + return; + } + } + if(ids == null || ids == ""){ + febs.alert.warn('请选择订单'); + return; + } + febs.modal.open('发货', 'modules/clothesType/deliverGoods/' + data.id, { + btn: ['确认','取消'], + yes: function (index, layero) { + $('#deliver-update-clothes').find('#submit').trigger('click'); + }, + btn2: function () { + layer.closeAll(); + } + }); + } + + if (layEvent === 'updateDeliver') { + let data = checkStatus.data; + if (data.length > 1) { + febs.alert.warn('每次只能操作一个订单'); + return; + } + let ids = ""; + for(let i = 0;i < data.length;i++){ + if(data[i].status != 2){ + febs.alert.warn('请选择待收货的订单'); + return; + } + } + if(ids == null || ids == ""){ + febs.alert.warn('请选择订单'); + return; + } + febs.modal.open('修改物流信息', 'modules/clothesType/deliverGoods/' + data.id, { + btn: ['确认','取消'], + yes: function (index, layero) { + $('#deliver-update-clothes').find('#deliverInfoSubmit').trigger('click'); + }, + btn2: function () { + layer.closeAll(); + } + }); + } + + if(layEvent === 'refundOrder'){ + let data = checkStatus.data; + if (data.length > 1) { + febs.alert.warn('每次只能操作一个订单'); + return; + } + let ids = ""; + for(let i = 0;i < data.length;i++){ + if(data[i].status == 2 ){ + febs.alert.warn('请选择待发货的订单'); + return; + }else{ + ids = data[i].id; + } + } + if(ids == null || ids == ""){ + febs.alert.warn('请选择订单'); + return; + } + febs.modal.confirm('仅退款', '确认退款订单?', function () { + refundOrder(ids); + }); + } + + if(layEvent === 'confirmOrder'){ + let data = checkStatus.data; + let ids = ""; + for(let i = 0;i < data.length;i++){ + if(data[i].status != 3){ + febs.alert.warn('请选择待收货的订单'); + return; + }else{ + ids = ids + data[i].id+","; + } + } + console.log(ids); + if(ids == null || ids == ""){ + febs.alert.warn('请选择订单'); + return; + } + febs.get(ctx + 'admin/clothesType/confirmOrder?ids='+ids, null, function () { + febs.alert.success('操作成功'); + $query.click(); + }); + } + + if (layEvent == 'exportDeliverTwo') { + let data = checkStatus.data; + let ids = ""; + for(let i = 0;i < data.length;i++){ + if(data[i].status != 2){ + febs.alert.warn('请选择待发货的订单'); + return; + }else if(data[i].deliveryState != 1){ + febs.alert.warn('请选择待配送的订单'); + return; + }else{ + ids = ids + data[i].id+","; + } + } + console.log(ids); + if(ids == null || ids == ""){ + febs.alert.warn('请选择待发货的订单'); + return; + } + window.location.href = ctx + "admin/order/exportOrderList?ids="+ids; + } + + }); + + function refundOrder(id) { + febs.get(ctx + 'admin/clothesType/refundOrder' + id, null, function () { + febs.alert.success('操作成功'); + $query.click(); + }); + } + + upload.render({ + elem: '#importDeliver' + ,url: 'admin/clothesType/importDeliver' //此处配置你自己的上传接口即可 + ,accept: 'file' //普通文件 + ,done: function(res){ + console.log("123"); + febs.alert.success('操作成功'); + $query.click(); + } + }); + + + // 初始化表格操作栏各个按钮功能 + table.on('tool(orderClothesTable)', function (obj) { + var data = obj.data, + layEvent = obj.event; + if (layEvent === 'seeOrder') { + febs.modal.open( '订单详情', 'modules/order/orderDetail/' + data.id, { + maxmin: true, + }); + } + }); + + + + // 查询按钮 + $query.on('click', function () { + var params = $.extend(getQueryParams(), {field: sortObject.field, order: sortObject.type}); + tableIns.reload({where: params, page: {curr: currPageOrder}}); + }); + + // 刷新按钮 + $reset.on('click', function () { + $searchForm[0].reset(); + sortObject.type = 'null'; + tableIns.reload({where: getQueryParams(), page: {curr: currPageOrder}, initSort: sortObject}); + }); + + function initClothesOrderTable() { + tableIns = febs.table.init({ + elem: $view.find('table'), + id: 'orderClothesTable', + url: ctx + 'admin/clothesType/orderList', + // defaultToolbar: [], + //系统自带打印导出 + totalRow : true, + toolbar: '#tableToolBarClothesOrder', + cols: [[ + {type: 'checkbox', fixed: 'left'}, + {type: 'numbers', title: '', width: 80}, + {title: '操作', + templet: function (d) { + return '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="seeOrder">详情</button>' + },minWidth: 200,align:'center'}, + {field: 'orderNo', title: '订单编号', minWidth: 200,align:'left' ,totalRowText:"合计"}, + {field: 'memberName', title: '购买人', minWidth: 100,align:'left'}, + {field: 'typeName', title: '类型', minWidth: 100,align:'left'}, + {field: 'typeImage', title: '图片', minWidth: 100,align:'left'}, + {field: 'goodsCnt', title: '数量', minWidth: 120,align:'left'}, + {field: 'status', title: '状态', + templet: function (d) { + if (d.status === 1) { + return '<span style="color:red;">待支付</span>' + } else if (d.status === 2) { + return '<span style="color:green;">待发货</span>' + }else if (d.status === 3) { + return '<span style="color:green;">待收货</span>' + }else if (d.status === 4) { + return '<span style="color:green;">已完成</span>' + }else if (d.status === 5) { + return '<span style="color:green;">已取消</span>' + }else{ + return '' + } + }, minWidth: 80,align:'center'}, + {field: 'goodsName', title: '商品', minWidth: 160,align:'left'}, + {field: 'amount', title: '总价', minWidth: 80,align:'left', totalRow:true}, + {field: 'discountAmount', title: '优惠', minWidth: 80,align:'left', totalRow:true}, + {field: 'carriage', title: '邮费', minWidth: 80,align:'left', totalRow:true}, + {field: 'realAmount', title: '总金额', minWidth: 100,align:'left', totalRow:true}, + {field: 'orderTime', title: '下单时间', minWidth: 200,align:'left'}, + + {field: 'payMethod', title: '支付方式', minWidth: 100,align:'left'}, + {field: 'payTime', title: '支付时间', minWidth: 120,align:'left'}, + {field: 'remark', title: '备注', minWidth: 160,align:'left'}, + ]] + }); + } + + // 获取查询参数 + function getQueryParams() { + let startTimestr = $searchForm.find('input[name="startTime"]').val().trim(); + let endTimeStr = $searchForm.find('input[name="endTime"]').val().trim(); + if(startTimestr != '' && endTimeStr != '' && startTimestr >= endTimeStr){ + febs.alert.warn('开始时间需要小于结束时间'); + return{}; + } + return { + startTime: $searchForm.find('input[name="startTime"]').val().trim(), + endTime: $searchForm.find('input[name="endTime"]').val().trim(), + name: $searchForm.find('input[name="name"]').val().trim(), + orderNo: $searchForm.find('input[name="orderNo"]').val().trim(), + payResult: $searchForm.find("select[name='payResult']").val(), + status: $searchForm.find("select[name='status']").val(), + isHome: $searchForm.find("select[name='isHome']").val(), + uniqueCode: $searchForm.find("select[name='uniqueCode']").val(), + }; + } + + }) +</script> \ No newline at end of file -- Gitblit v1.9.1