From 9c2503feebbbf3d7d6383289af66416bf14b8507 Mon Sep 17 00:00:00 2001 From: wangfukang <15630117759@163.com> Date: Wed, 25 Mar 2026 18:10:29 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=B9=E6=8E=A5=E6=8B=BC=E5=9B=A2=E6=95=B0?= =?UTF-8?q?=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hiver-admin/test-output/test-report.html | 14 +- .../main/java/cc/hiver/core/entity/User.java | 4 + .../controller/manage/AuthController.java | 52 +- .../controller/manage/UserController.java | 62 +- .../java/cc/hiver/base/vo/RegisterShopVo.java | 4 + .../MallDeliveryOrderController.java | 111 +++ .../mall/controller/MallOrderController.java | 189 +++++ .../mall/controller/WorkerController.java | 3 + .../controller/WorkerRelaPriceController.java | 18 +- .../main/java/cc/hiver/mall/dao/ShopDao.java | 12 +- .../dao/mapper/MallDeliveryOrderMapper.java | 27 + .../mall/dao/mapper/MallOrderGoodsMapper.java | 25 + .../mall/dao/mapper/MallOrderGroupMapper.java | 12 + .../mall/dao/mapper/MallOrderMapper.java | 23 + .../dao/mapper/MallRefundRecordMapper.java | 12 + .../dao/mapper/WorkerRelaPriceMapper.java | 1 + .../hiver/mall/entity/MallDeliveryOrder.java | 35 +- .../java/cc/hiver/mall/entity/MallOrder.java | 35 +- .../cc/hiver/mall/entity/MallOrderGoods.java | 11 +- .../cc/hiver/mall/entity/MallOrderGroup.java | 19 +- .../hiver/mall/entity/MallRefundRecord.java | 11 +- .../mall/entity/MallReturnOrderGoods.java | 39 + .../java/cc/hiver/mall/entity/Product.java | 2 +- .../main/java/cc/hiver/mall/entity/Shop.java | 3 + .../cc/hiver/mall/pojo/dto/AreaRuleDTO.java | 19 + .../hiver/mall/pojo/dto/CreateOrderDTO.java | 91 +++ .../query/MallDeliveryOrderPageQuery.java | 50 ++ .../mall/pojo/query/MallOrderPageQuery.java | 38 + .../cc/hiver/mall/pojo/vo/MallOrderVO.java | 33 + .../hiver/mall/pojo/vo/WorkerRealPriceVo.java | 3 + .../hiver/mall/quartz/GroupBuyExpireTask.java | 57 ++ .../cc/hiver/mall/service/ShopService.java | 2 + .../mybatis/MallDeliveryOrderService.java | 43 + .../mybatis/MallOrderGroupService.java | 20 + .../service/mybatis/MallOrderService.java | 72 ++ .../mybatis/MallRefundRecordService.java | 10 + .../mall/serviceimpl/ShopServiceImpl.java | 5 + .../mybatis/MallDeliveryOrderServiceImpl.java | 193 +++++ .../mybatis/MallOrderGroupServiceImpl.java | 204 +++++ .../mybatis/MallOrderServiceImpl.java | 769 ++++++++++++++++++ .../mybatis/MallRefundRecordServiceImpl.java | 15 + .../mapper/MallDeliveryOrderMapper.xml | 105 +++ .../resources/mapper/MallOrderGoodsMapper.xml | 34 + .../resources/mapper/MallOrderGroupMapper.xml | 23 + .../main/resources/mapper/MallOrderMapper.xml | 80 ++ .../mapper/MallRefundRecordMapper.xml | 17 + .../src/main/resources/mapper/ShopMapper.xml | 22 +- .../mapper/WorkerRelaPriceMapper.xml | 1 + .../social/controller/WechatController.java | 1 + .../controller/WechatPayController.java | 12 +- 50 files changed, 2567 insertions(+), 76 deletions(-) create mode 100644 hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/MallDeliveryOrderController.java create mode 100644 hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/MallOrderController.java create mode 100644 hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/MallDeliveryOrderMapper.java create mode 100644 hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/MallOrderGoodsMapper.java create mode 100644 hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/MallOrderGroupMapper.java create mode 100644 hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/MallOrderMapper.java create mode 100644 hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/MallRefundRecordMapper.java create mode 100644 hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallReturnOrderGoods.java create mode 100644 hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/dto/AreaRuleDTO.java create mode 100644 hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/dto/CreateOrderDTO.java create mode 100644 hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/query/MallDeliveryOrderPageQuery.java create mode 100644 hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/query/MallOrderPageQuery.java create mode 100644 hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/MallOrderVO.java create mode 100644 hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/quartz/GroupBuyExpireTask.java create mode 100644 hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/MallDeliveryOrderService.java create mode 100644 hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/MallOrderGroupService.java create mode 100644 hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/MallOrderService.java create mode 100644 hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/MallRefundRecordService.java create mode 100644 hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallDeliveryOrderServiceImpl.java create mode 100644 hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderGroupServiceImpl.java create mode 100644 hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderServiceImpl.java create mode 100644 hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallRefundRecordServiceImpl.java create mode 100644 hiver-modules/hiver-mall/src/main/resources/mapper/MallDeliveryOrderMapper.xml create mode 100644 hiver-modules/hiver-mall/src/main/resources/mapper/MallOrderGoodsMapper.xml create mode 100644 hiver-modules/hiver-mall/src/main/resources/mapper/MallOrderGroupMapper.xml create mode 100644 hiver-modules/hiver-mall/src/main/resources/mapper/MallOrderMapper.xml create mode 100644 hiver-modules/hiver-mall/src/main/resources/mapper/MallRefundRecordMapper.xml diff --git a/hiver-admin/test-output/test-report.html b/hiver-admin/test-output/test-report.html index d0c330b7..329887da 100644 --- a/hiver-admin/test-output/test-report.html +++ b/hiver-admin/test-output/test-report.html @@ -35,7 +35,7 @@ Hiver
  • -三月 06, 2026 18:12:41 +三月 22, 2026 16:23:04
  • @@ -84,7 +84,7 @@

    passTest

    -

    18:12:41 下午 / 0.019 secs

    +

    16:23:04 下午 / 0.019 secs

    @@ -92,8 +92,8 @@
    #test-id=1
    passTest
    -03.06.2026 18:12:41 -03.06.2026 18:12:41 +03.22.2026 16:23:04 +03.22.2026 16:23:04 0.019 secs
    @@ -104,7 +104,7 @@ Pass - 18:12:41 + 16:23:04 Test passed @@ -128,13 +128,13 @@

    Started

    -

    三月 06, 2026 18:12:41

    +

    三月 22, 2026 16:23:04

    Ended

    -

    三月 06, 2026 18:12:41

    +

    三月 22, 2026 16:23:04

    diff --git a/hiver-core/src/main/java/cc/hiver/core/entity/User.java b/hiver-core/src/main/java/cc/hiver/core/entity/User.java index 930716b6..94356244 100644 --- a/hiver-core/src/main/java/cc/hiver/core/entity/User.java +++ b/hiver-core/src/main/java/cc/hiver/core/entity/User.java @@ -126,6 +126,10 @@ public class User extends HiverBaseEntity { @ApiModelProperty(value = "鍏ュ簱鍛樻爣璇嗭細0锛氫笉鏄紙鏁版嵁搴撻粯璁わ級锛1锛氭槸锛") private String warehouseKeeperFlag; + @Transient + @ApiModelProperty(value = "搴楅摵id") + private String shopId; + @ApiModelProperty(value = "灏忕▼搴廼d") private String miniProgramOpenid; diff --git a/hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/manage/AuthController.java b/hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/manage/AuthController.java index 0fe45fb8..b06a6cb5 100644 --- a/hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/manage/AuthController.java +++ b/hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/manage/AuthController.java @@ -5,7 +5,10 @@ import cc.hiver.base.vo.QRStatusVo; import cc.hiver.base.vo.RegisterShopVo; import cc.hiver.core.common.annotation.RateLimiter; import cc.hiver.core.common.annotation.SystemLog; -import cc.hiver.core.common.constant.*; +import cc.hiver.core.common.constant.AppToBConstant; +import cc.hiver.core.common.constant.SecurityConstant; +import cc.hiver.core.common.constant.ShopConstant; +import cc.hiver.core.common.constant.UserConstant; import cc.hiver.core.common.enums.LogType; import cc.hiver.core.common.exception.HiverException; import cc.hiver.core.common.redis.RedisTemplateHelper; @@ -19,10 +22,8 @@ import cc.hiver.core.service.RoleService; import cc.hiver.core.service.UserRoleService; import cc.hiver.core.service.UserService; import cc.hiver.mall.debt.service.DebtService; -import cc.hiver.mall.entity.Customer; import cc.hiver.mall.entity.Shop; import cc.hiver.mall.entity.ShopUser; -import cc.hiver.mall.entity.Supplier; import cc.hiver.mall.invitelog.constant.InviteLogConstant; import cc.hiver.mall.invitelog.entity.InviteLog; import cc.hiver.mall.invitelog.service.InviteLogService; @@ -360,17 +361,16 @@ public class AuthController { @ApiOperation("娉ㄥ唽搴楅摵") public Result register(@Valid RegisterShopVo registerShopVo) { // 鏂板鐢ㄦ埛琛ㄤ俊鎭 - User user = new User(); + /*User user = new User(); if (StringUtils.isEmpty(registerShopVo.getMobile())) { return ResultUtil.error("鎵嬫満鍙蜂笉鑳戒负绌猴紒"); } if (StringUtils.isEmpty(registerShopVo.getPassword())) { return ResultUtil.error("瀵嗙爜涓嶈兘涓虹┖锛"); - } + }*/ // 涓涓敤鎴峰彲瀛樺湪澶氫釜搴楅摵 - // 鏍规嵁鎵嬫満鍙峰強鐢ㄦ埛绫诲瀷鏌ヨ鏄惁瀛樺湪锛屽鏋滃瓨鍦紝涓嶆柊澧烇紝鍚﹀垯锛屾柊澧炵敤鎴 - final User byMobileAndType = userService.findByMobile(registerShopVo.getMobile()); - if (byMobileAndType != null) { + // 鏍规嵁unionid鍙婄敤鎴风被鍨嬫煡璇㈡槸鍚﹀瓨鍦紝濡傛灉瀛樺湪锛屼笉鏂板锛屽惁鍒欙紝鏂板鐢ㄦ埛 + /*if (byMobileAndType != null) { user = byMobileAndType; if (!byMobileAndType.getType().contains(UserConstant.USER_TYPE_NORMAL)) { // 濡傛灉涓嶅寘鍚紝璧嬩簣搴楅摵瑙掕壊 @@ -401,9 +401,9 @@ public class AuthController { user.setNickname(registerShopVo.getNickname()); } user = userService.save(user); - } + }*/ // 榛樿瑙掕壊 - final List roleList = roleService.findByDefaultRole(true); + /* final List roleList = roleService.findByDefaultRole(true); if (roleList != null && !roleList.isEmpty()) { for (Role role : roleList) { final UserRole ur = new UserRole().setUserId(user.getId()).setRoleId(role.getId()); @@ -411,7 +411,11 @@ public class AuthController { } } // 寮傛鍙戦佸垱寤鸿处鍙锋秷鎭 - addMessage.addSendMessage(user.getId()); + addMessage.addSendMessage(user.getId());*/ + + final User byMobileAndType = userService.findByUnionid(registerShopVo.getUnionid()); + byMobileAndType.setNickname(registerShopVo.getNickname()); + userService.update(byMobileAndType); // 鏂板搴楅摵淇℃伅 final Shop shop = new Shop(); shop.setShopName(registerShopVo.getShopName()); @@ -424,7 +428,7 @@ public class AuthController { shop.setAliName(registerShopVo.getAliName()); shop.setRegion(registerShopVo.getRegion()); shop.setRegionId(registerShopVo.getRegionId()); - + shop.setIsStudent(registerShopVo.getIsStudent()); // 1. 鑾峰彇褰撳墠鏃ユ湡 (LocalDate 鍙寘鍚勾鏈堟棩锛屼笉鍖呭惈鏃跺垎绉) final LocalDate today = LocalDate.now(); @@ -442,8 +446,8 @@ public class AuthController { shop.setEndTime(formattedFutureDate); // 搴楅摵搴楅摵鍚嶇О锛屽簵閾哄湴鍧锛屼笌鐢ㄦ埛锛堥粯璁ゅ簵涓伙級鐨勫叧鑱 // 璁剧疆娉ㄥ唽鐢ㄦ埛涓哄簵涓 - shop.setShopOwnerId(user.getId()); - + shop.setShopOwnerId(byMobileAndType.getId()); + shop.setShopMangerId(byMobileAndType.getId()); // 鍒ゆ柇鏄惁浼犻掍簡閭璇蜂汉鍙婇個璇峰簵閾猴紝璁剧疆浜嗙殑璇濓紝鏂板閭璇疯繑浣d俊鎭 if (StringUtils.isNotEmpty(registerShopVo.getInviteUserId()) && StringUtils.isNotEmpty(registerShopVo.getInviteShopId())) { final InviteLog inviteLog = new InviteLog(); @@ -462,21 +466,22 @@ public class AuthController { shop.setAttrId(categoryId); // 20241010 鎵撳嵃鏂瑰紡 瀛楁榛樿缁 0 shop.setPrintingMethod(ShopConstant.PRINTING_METHOD[0]); + shop.setContactPhone(registerShopVo.getMobile()); shopService.save(shop); - + shopService.refreshShopCache(shop.getId(), shop.getRegionId()); // 澧炲姞搴楅摵鍜屽憳宸ュ叧鑱旇〃淇℃伅 final ShopUser shopUser = new ShopUser(); - shopUser.setUser(user); - shopUser.setUserName(user.getUsername()); + shopUser.setUser(byMobileAndType); + shopUser.setUserName(byMobileAndType.getUsername()); shopUser.setShop(shop); shopUser.setShopName(shop.getShopName()); shopUser.setType(UserConstant.SHOP_USER_ADMIN); shopUserService.save(shopUser); // 20240625鏂板榛樿渚涘簲鍟 - final Supplier supplier = new Supplier(); + /*final Supplier supplier = new Supplier(); supplier.setShopId(shop.getId()); supplier.setConsigneeName("榛樿渚涘簲鍟"); - supplier.setCreateBy(user.getId()); + supplier.setCreateBy(byMobileAndType.getId()); supplier.setCreateTime(new Date()); supplier.setConsigneeMobile("13222222222"); supplier.setProvince("鏆傛棤"); @@ -487,8 +492,8 @@ public class AuthController { supplierService.addSupplier(supplier); // 鍚敤搴楅摵鐨勬椂鍊欓渶瑕佺粰璇ュ簵閾烘柊澧炰竴涓暎瀹㈢殑瀹㈡埛锛 final Customer customer = new Customer(); - customer.setCreateBy(user.getId()); - customer.setCreateByName(user.getNickname()); + customer.setCreateBy(byMobileAndType.getId()); + customer.setCreateByName(byMobileAndType.getNickname()); customer.setName("鏁e"); customer.setPhone("13111111111"); customer.setProvince("鏆傛棤"); @@ -496,8 +501,9 @@ public class AuthController { customer.setArea("鏆傛棤"); customer.setUserName("sanke"); customer.setShopId(shop.getId()); - customerService.addCustomer(customer); - return ResultUtil.data(user); + customerService.addCustomer(customer);*/ + byMobileAndType.setShopId(shop.getId()); + return ResultUtil.data(byMobileAndType); } @RequestMapping(value = "/chooseShop", method = RequestMethod.POST) diff --git a/hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/manage/UserController.java b/hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/manage/UserController.java index 32ffb65a..da9d1305 100644 --- a/hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/manage/UserController.java +++ b/hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/manage/UserController.java @@ -18,11 +18,14 @@ import cc.hiver.core.service.*; import cc.hiver.core.service.mybatis.IUserRoleService; import cc.hiver.core.vo.RoleDTO; import cc.hiver.core.vo.WechatVo; +import cc.hiver.mall.entity.Shop; import cc.hiver.mall.entity.ShopArea; +import cc.hiver.mall.entity.WorkerRelaPrice; import cc.hiver.mall.service.ShopAreaService; import cc.hiver.mall.service.ShopService; import cc.hiver.mall.service.ShopUserService; import cc.hiver.mall.service.mybatis.CustomerService; +import cc.hiver.mall.service.mybatis.WorkerRelaPriceService; import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.http.HttpUtil; import com.google.gson.JsonObject; @@ -77,6 +80,9 @@ public class UserController { @Autowired private ShopAreaService shopAreaService; + @Autowired + private WorkerRelaPriceService workerRelaPriceService; + @Autowired private DepartmentHeaderService departmentHeaderService; @@ -628,20 +634,17 @@ public class UserController { wechatUser.setUsername(username); final String encryptPass = new BCryptPasswordEncoder().encode("123456"); wechatUser.setPassword(encryptPass); - wechatUser.setType(UserConstant.USER_TYPE_CUSTOM); + wechatUser.setType(UserConstant.USER_TYPE_NORMAL); wechatUser = userService.save(wechatUser); // 璁剧疆鐢ㄦ埛瑙掕壊 - final UserRole userRole = new UserRole(); - final PageVo pageVo = new PageVo(); - pageVo.setPageNumber(1); - pageVo.setPageSize(1); - final Page roleCustomer = roleService.findByCondition("ROLE_CUSTOMER", PageUtil.initPage(pageVo)); - final Role role = roleCustomer.getContent().get(0); - //瀹㈡埛瑙掕壊 - userRole.setRoleId(role.getId()); - userRole.setRoleName("瀹㈡埛"); - userRole.setUserId(wechatUser.getId()); - userRoleService.save(userRole); + // 榛樿瑙掕壊 + final List roleList = roleService.findByDefaultRole(true); + if (roleList != null && !roleList.isEmpty()) { + for (Role role : roleList) { + final UserRole ur = new UserRole().setUserId(wechatUser.getId()).setRoleId(role.getId()); + userRoleService.save(ur); + } + } // 鏇存柊瀹㈡埛淇℃伅锛岀粦瀹氱櫥褰曠敤鎴 customerService.updateUserId(wechatVo.getCustomId(), wechatUser.getId()); // 杩斿洖褰撳墠鐧诲綍浜虹殑淇℃伅 @@ -650,15 +653,6 @@ public class UserController { } catch (Exception e) { return ResultUtil.error(e.getMessage()); } - } else { - // 鏇存柊瀹㈡埛淇℃伅锛岀粦瀹氱櫥褰曠敤鎴 - customerService.updateUserId(wechatVo.getCustomId(), wechatUser.getId()); - final String type = wechatUser.getType(); - if (!type.contains(UserConstant.USER_TYPE_CUSTOM)) { - // 涓嶅寘鍚紝璧嬩簣涓嬫父瀹㈡埛韬唤 - final String newUserType = StringUtils.isEmpty(type) ? UserConstant.USER_TYPE_CUSTOM : type + ',' + UserConstant.USER_TYPE_CUSTOM; - wechatUser.setType(newUserType); - } } wechatUser.setUnionid(unionid); wechatUser.setWechatName(wechatVo.getWechatName()); @@ -666,13 +660,37 @@ public class UserController { // 缁熶竴鏇存柊灏忕▼搴忕殑涓浜涗俊鎭 userService.save(wechatUser); // 閿佸畾褰撳墠鐧诲綍鐢ㄦ埛鐨勭被鍨 - wechatUser.setType(wechatVo.getUserType()); + //wechatUser.setType(wechatVo.getUserType()); final String accessToken = securityUtil.getToken(userService.userToDTO(wechatUser), true); resultMap.put("accessToken", accessToken); // 杩斿洖褰撳墠鐧诲綍浜虹殑淇℃伅 resultMap.put("user", wechatUser); + Shop shop = shopService.getShopByUserid(wechatUser.getId()); + if(shop != null){ + resultMap.put("shop", shop); + } Worker worker = workerService.findByUserId(wechatUser.getId()); + if(worker.getGetPushOrder() == 1){ + final List workerRelaPriceList = workerRelaPriceService.selectByWorkerId(worker.getWorkerId()); + List workerRelaPriceListWaimai = new ArrayList<>(); + List workerRelaPriceListKuaidi = new ArrayList<>(); + workerRelaPriceList.forEach(workerRelaPrice -> { + if(workerRelaPrice.getGetPushOrder() == 1){ + if(workerRelaPrice.getOrderType() == 0 ){ + workerRelaPriceListWaimai.add(workerRelaPrice); + }else{ + workerRelaPriceListKuaidi.add(workerRelaPrice); + } + } + }); + if(workerRelaPriceListWaimai.size() > 0){ + resultMap.put("waimaiData", workerRelaPriceListWaimai); + } + if(workerRelaPriceListKuaidi.size() > 0){ + resultMap.put("kuaidiData", workerRelaPriceListKuaidi); + } + } resultMap.put("worker", worker); return ResultUtil.data(resultMap); } diff --git a/hiver-modules/hiver-base/src/main/java/cc/hiver/base/vo/RegisterShopVo.java b/hiver-modules/hiver-base/src/main/java/cc/hiver/base/vo/RegisterShopVo.java index e1439185..02919aad 100644 --- a/hiver-modules/hiver-base/src/main/java/cc/hiver/base/vo/RegisterShopVo.java +++ b/hiver-modules/hiver-base/src/main/java/cc/hiver/base/vo/RegisterShopVo.java @@ -15,6 +15,10 @@ public class RegisterShopVo { private String nickname; + private Integer isStudent; + + private String unionid; + private String password; private String inviteUserId; diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/MallDeliveryOrderController.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/MallDeliveryOrderController.java new file mode 100644 index 00000000..071a6bfa --- /dev/null +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/MallDeliveryOrderController.java @@ -0,0 +1,111 @@ +package cc.hiver.mall.controller; + +import cc.hiver.core.common.utils.ResultUtil; +import cc.hiver.core.common.vo.Result; +import cc.hiver.mall.entity.MallDeliveryOrder; +import cc.hiver.mall.pojo.query.MallDeliveryOrderPageQuery; +import cc.hiver.mall.service.mybatis.MallDeliveryOrderService; +import com.baomidou.mybatisplus.core.metadata.IPage; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * 閰嶉佽鍗曟帴鍙 + */ +@Slf4j +@RestController +@Api(tags = "閰嶉佽鍗曟帴鍙") +@RequestMapping("/hiver/mall/delivery") +public class MallDeliveryOrderController { + + @Autowired + private MallDeliveryOrderService mallDeliveryOrderService; + + /** + * 鍒嗛〉鏌ヨ閰嶉佸崟 + * hallOnly=true 鏃舵煡璇㈡姠鍗曞ぇ鍘咃紙鏈鎺ュ崟鐨勫崟锛 + */ + @PostMapping("/page") + @ApiOperation(value = "鍒嗛〉鏌ヨ閰嶉佸崟", notes = "hallOnly=true 鏌ヨ鎶㈠崟澶у巺") + public Result page(@RequestBody MallDeliveryOrderPageQuery q) { + if (Boolean.TRUE.equals(q.getHallOnly())) { + IPage page = mallDeliveryOrderService.pageDelivery(q); + java.util.Map result = new java.util.HashMap<>(); + result.put("records", page.getRecords()); + result.put("total", page.getTotal()); + result.put("size", page.getSize()); + result.put("current", page.getCurrent()); + result.put("pages", page.getPages()); + result.put("waimaiCount", mallDeliveryOrderService.countWaitGrabOrders(1)); + result.put("kuaidiCount", mallDeliveryOrderService.countWaitGrabOrders(2)); + return new ResultUtil().setData(result); + } + return new ResultUtil().setData(mallDeliveryOrderService.pageDelivery(q)); + } + + /** + * 閰嶉佸憳鎺ュ崟 + */ + @PostMapping("/accept") + @ApiOperation(value = "閰嶉佸憳鎺ュ崟", notes = "鎶㈠崟澶у巺鍗曟垨鎸囨淳鍗曞潎閫氳繃姝ゆ帴鍙f帴鍗") + public Result accept(@RequestParam String deliveryId, + @RequestParam String workerId) { + try { + mallDeliveryOrderService.workerAccept(deliveryId, workerId); + return ResultUtil.success("鎺ュ崟鎴愬姛"); + } catch (Exception e) { + log.error("閰嶉佸憳鎺ュ崟澶辫触: {}", e.getMessage(), e); + return ResultUtil.error(e.getMessage()); + } + } + + /** + * 閰嶉佸憳鍙栬揣 + */ + @PostMapping("/pickup") + @ApiOperation("閰嶉佸憳鍙栬揣锛堝緟鍙栬揣 -> 閰嶉佷腑锛") + public Result pickup(@RequestParam String deliveryId, + @RequestParam String workerId) { + try { + mallDeliveryOrderService.workerPickup(deliveryId, workerId); + return ResultUtil.success("宸插彇璐э紝閰嶉佷腑"); + } catch (Exception e) { + log.error("鍙栬揣澶辫触: {}", e.getMessage(), e); + return ResultUtil.error(e.getMessage()); + } + } + + /** + * 閰嶉佸憳閫佽揪 + */ + @PostMapping("/complete") + @ApiOperation("閰嶉佸憳纭閫佽揪锛堥厤閫佷腑 -> 宸查佽揪锛") + public Result complete(@RequestParam String deliveryId, + @RequestParam String workerId) { + try { + mallDeliveryOrderService.workerComplete(deliveryId, workerId); + return ResultUtil.success("宸查佽揪"); + } catch (Exception e) { + log.error("閫佽揪鎿嶄綔澶辫触: {}", e.getMessage(), e); + return ResultUtil.error(e.getMessage()); + } + } + + /** + * 鍙栨秷閰嶉佸崟 + */ + @PostMapping("/cancel") + @ApiOperation("鍙栨秷閰嶉佸崟") + public Result cancel(@RequestParam String deliveryId) { + try { + mallDeliveryOrderService.cancelDelivery(deliveryId); + return ResultUtil.success("宸插彇娑"); + } catch (Exception e) { + log.error("鍙栨秷閰嶉佸け璐: {}", e.getMessage(), e); + return ResultUtil.error(e.getMessage()); + } + } +} diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/MallOrderController.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/MallOrderController.java new file mode 100644 index 00000000..c43e9285 --- /dev/null +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/MallOrderController.java @@ -0,0 +1,189 @@ +package cc.hiver.mall.controller; + +import cc.hiver.core.common.utils.ResultUtil; +import cc.hiver.core.common.vo.Result; +import cc.hiver.mall.entity.MallOrder; +import cc.hiver.mall.pojo.dto.CreateOrderDTO; +import cc.hiver.mall.pojo.query.MallOrderPageQuery; +import cc.hiver.mall.pojo.vo.MallOrderVO; +import cc.hiver.mall.service.mybatis.MallOrderService; +import com.baomidou.mybatisplus.core.metadata.IPage; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.math.BigDecimal; + +/** + * 璁㈠崟鎺ュ彛 + */ +@Slf4j +@RestController +@Api(tags = "璁㈠崟鎺ュ彛") +@RequestMapping("/hiver/mall/order") +public class MallOrderController { + + @Autowired + private MallOrderService mallOrderService; + + /** + * 涓嬪崟锛堟櫘閫氳喘涔 / 鍙戣捣鎷煎洟 / 鍙傚洟锛 + */ + @PostMapping("/create") + @ApiOperation(value = "涓嬪崟鎺ュ彛", notes = "鏀寔鏅氳喘涔般佸彂璧锋嫾鍥€佸弬鍔犳嫾鍥笁绉嶆ā寮") + public Result createOrder(@RequestBody CreateOrderDTO dto) { + try { + MallOrderVO vo = mallOrderService.createOrder(dto); + return new ResultUtil().setData(vo); + } catch (Exception e) { + log.error("涓嬪崟澶辫触: {}", e.getMessage(), e); + return ResultUtil.error(e.getMessage()); + } + } + + /** + * 鍒嗛〉鏌ヨ璁㈠崟鍒楄〃 + */ + @PostMapping("/page") + @ApiOperation(value = "鍒嗛〉鏌ヨ璁㈠崟鍒楄〃", notes = "鐢ㄦ埛绔紶userId锛屽晢瀹剁浼爏hopId") + public Result> page(@RequestBody MallOrderPageQuery q) { + return new ResultUtil>().setData(mallOrderService.pageOrder(q)); + } + + + /** + * 鏍规嵁鎷煎洟id鏌ヨ鍥㈤暱璁㈠崟閰嶉佽垂淇℃伅 + */ + @GetMapping("/selectMallOrderByGroupId/{groupId}") + @ApiOperation("鏍规嵁鎷煎洟id鏌ヨ鍥㈤暱璁㈠崟閰嶉佽垂淇℃伅") + public Result selectMallOrderByGroupId(@ApiParam("璁㈠崟ID") @PathVariable String groupId) { + MallOrder vo = mallOrderService.selectMallOrderByGroupId(groupId); + if (vo == null) return ResultUtil.error("璁㈠崟涓嶅瓨鍦"); + return new ResultUtil().setData(vo); + } + + /** + * 璁㈠崟璇︽儏 + */ + @GetMapping("/detail/{id}") + @ApiOperation("鑾峰彇璁㈠崟璇︽儏") + public Result detail(@ApiParam("璁㈠崟ID") @PathVariable String id) { + MallOrderVO vo = mallOrderService.getOrderDetail(id); + if (vo == null) return ResultUtil.error("璁㈠崟涓嶅瓨鍦"); + return new ResultUtil().setData(vo); + } + + /** + * 鍟嗗鎺ュ崟 + */ + @PostMapping("/shopAccept") + @ApiOperation(value = "鏀粯鎴愬姛鍟嗗鑷姩鎺ュ崟", notes = "灏嗚鍗曚粠銆屽緟鍟嗗鎺ュ崟銆嶆帹杩涘埌涓嬩竴鐘舵") + public Result shopAccept(@ApiParam("璁㈠崟ID") @RequestParam String orderId) { + try { + mallOrderService.shopAccept(orderId); + return ResultUtil.success("鎺ュ崟鎴愬姛"); + } catch (Exception e) { + log.error("鎺ュ崟澶辫触: {}", e.getMessage(), e); + return ResultUtil.error(e.getMessage()); + } + } + + /** + * 鍟嗗鎷掑崟 + */ + @PostMapping("/shopReject") + @ApiOperation("鍟嗗鎷掑崟锛堣嚜鍔ㄨЕ鍙戦娆撅級") + public Result shopReject(@RequestParam String orderId, + @RequestParam(required = false) String reason) { + try { + mallOrderService.shopReject(orderId, reason); + return ResultUtil.success("鎿嶄綔鎴愬姛"); + } catch (Exception e) { + log.error("鎷掑崟澶辫触: {}", e.getMessage(), e); + return ResultUtil.error(e.getMessage()); + } + } + + /** + * 鐢ㄦ埛鍙栨秷璁㈠崟 + */ + @PostMapping("/cancel") + @ApiOperation(value = "鐢ㄦ埛鍙栨秷璁㈠崟", notes = "浠呭緟鏀粯/寰呮垚鍥㈢姸鎬佸彲鍙栨秷") + public Result cancelOrder(@RequestParam String orderId, + @RequestParam String userId) { + try { + mallOrderService.cancelOrder(orderId, userId); + return ResultUtil.success("宸插彇娑"); + } catch (Exception e) { + log.error("鍙栨秷澶辫触: {}", e.getMessage(), e); + return ResultUtil.error(e.getMessage()); + } + } + + /** + * 鐢宠閫娆 + */ + @PostMapping("/applyRefund") + @ApiOperation("鐢ㄦ埛鐢宠閫娆") + public Result applyRefund(@RequestParam String orderId, + @RequestParam String userId, + @RequestParam(required = false) String reason, + @RequestParam BigDecimal amount) { + try { + mallOrderService.applyRefund(orderId, userId, reason, amount); + return ResultUtil.success("閫娆剧敵璇峰凡鎻愪氦"); + } catch (Exception e) { + log.error("鐢宠閫娆惧け璐: {}", e.getMessage(), e); + return ResultUtil.error(e.getMessage()); + } + } + + /** + * 鍟嗗鍚屾剰閫娆 + */ + @PostMapping("/agreeRefund") + @ApiOperation("鍟嗗鍚屾剰閫娆") + public Result agreeRefund(@RequestParam String orderId) { + try { + mallOrderService.agreeRefund(orderId); + return ResultUtil.success("閫娆炬垚鍔"); + } catch (Exception e) { + log.error("鍚屾剰閫娆惧け璐: {}", e.getMessage(), e); + return ResultUtil.error(e.getMessage()); + } + } + + /** + * 鍟嗗鎷掔粷閫娆 + */ + @PostMapping("/rejectRefund") + @ApiOperation("鍟嗗鎷掔粷閫娆") + public Result rejectRefund(@RequestParam String orderId, + @RequestParam(required = false) String reason) { + try { + mallOrderService.rejectRefund(orderId, reason); + return ResultUtil.success("鎿嶄綔鎴愬姛"); + } catch (Exception e) { + log.error("鎷掔粷閫娆惧け璐: {}", e.getMessage(), e); + return ResultUtil.error(e.getMessage()); + } + } + + /** + * 鐢ㄦ埛纭瀹屾垚 + */ + @PostMapping("/complete") + @ApiOperation(value = "鐢ㄦ埛纭瀹屾垚", notes = "澶栧崠閫佽揪鎴栬嚜鍙栧悗锛岀敤鎴锋墜鍔ㄧ偣鍑荤‘璁ゅ畬鎴") + public Result completeOrder(@RequestParam String orderId) { + try { + mallOrderService.completeOrder(orderId); + return ResultUtil.success("宸插畬鎴"); + } catch (Exception e) { + log.error("瀹屾垚璁㈠崟澶辫触: {}", e.getMessage(), e); + return ResultUtil.error(e.getMessage()); + } + } +} diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/WorkerController.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/WorkerController.java index 1132851d..e550af94 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/WorkerController.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/WorkerController.java @@ -239,6 +239,8 @@ public class WorkerController { public static class WorkerMatchDTO { /** 鍙栬揣鍖哄煙id锛堝晢瀹舵墍鍦ㄥ尯鍩燂級 */ private String shopAreaId; + /** 鎺ュ崟绫诲瀷 0澶栧崠 1蹇 */ + private Integer orderType; /** 閫佽揣鍖哄煙id锛堢敤鎴锋敹璐у尯鍩燂級 */ private String putAreaId; /** 浜ゆ槗淇濋殰锛歵rue 鍙煡 rebate_amount > 0 鐨勯厤閫佸憳 */ @@ -266,6 +268,7 @@ public class WorkerController { } List list = workerRelaPriceMapper.getMatchingWorkerList( dto.getShopAreaId(), + dto.getOrderType(), dto.getPutAreaId(), StrUtil.isBlank(dto.getKeyword()) ? null : dto.getKeyword().trim(), dto.getBaozhang(), diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/WorkerRelaPriceController.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/WorkerRelaPriceController.java index 8e006546..10693249 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/WorkerRelaPriceController.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/WorkerRelaPriceController.java @@ -84,6 +84,7 @@ public class WorkerRelaPriceController { if(workerRealPriceVo.getWorkerRelaPriceList() != null){ workerRealPriceVo.getWorkerRelaPriceList().forEach(workerRelaPrice -> { workerRelaPrice.setWorkerId(worker.getWorkerId()); + workerRelaPrice.setGetPushOrder(0); }); } final boolean b = workerRelaPriceService.saveBatch(workerRealPriceVo.getWorkerRelaPriceList()); @@ -99,14 +100,17 @@ public class WorkerRelaPriceController { public Result batchUpdate(@RequestBody WorkerRealPriceVo workerRealPriceVo) { Worker worker = workerService.findByUserId(workerRealPriceVo.getUserId()); //鏇存柊閰嶉佸憳淇℃伅 鎺ュ彈鎸囨淳鍗 - worker.setGetPushOrder(1); + worker.setGetPushOrder(workerRealPriceVo.getGetPushOrder()); workerService.update(worker); - // 鎵归噺鏇存柊閰嶉佽鍒 - final boolean b = workerRelaPriceService.saveOrUpdateBatch(workerRealPriceVo.getWorkerRelaPriceList()); - if (b) { - return ResultUtil.success("鏇存柊鎴愬姛锛"); - } else { - return ResultUtil.error("淇濆瓨澶辫触锛"); + if(workerRealPriceVo.getGetPushOrder() != null && workerRealPriceVo.getGetPushOrder() == 1){ + // 鎵归噺鏇存柊閰嶉佽鍒 + final boolean b = workerRelaPriceService.saveOrUpdateBatch(workerRealPriceVo.getWorkerRelaPriceList()); + if (b) { + return ResultUtil.success("鏇存柊鎴愬姛锛"); + } else { + return ResultUtil.error("淇濆瓨澶辫触锛"); + } } + return ResultUtil.success("鏇存柊鎴愬姛锛"); } } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/ShopDao.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/ShopDao.java index b2499981..0d29789d 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/ShopDao.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/ShopDao.java @@ -15,10 +15,8 @@ limitations under the License. */ package cc.hiver.mall.dao; -import cc.hiver.mall.entity.Shop; import cc.hiver.core.base.HiverBaseDao; -import cc.hiver.mall.pojo.dto.ShopRevenue; -import cc.hiver.mall.pojo.vo.QueryShopRevenueVO; +import cc.hiver.mall.entity.Shop; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; @@ -54,6 +52,14 @@ public interface ShopDao extends HiverBaseDao { @Query(value = "select * from t_shop where id in (select shop_id from t_shop_user where user_id = ?)",nativeQuery = true) List getShopInfoByUserid(String userId); + /** + * 鏍规嵁鐢ㄦ埛id鑾峰彇搴楅摵淇℃伅 + * + * @param userId + */ + @Query(value = "select * from t_shop where shop_owner_id = ?",nativeQuery = true) + Shop getShopByUserid(String userId); + @Query(value = "select * from t_shop where id in (select shop_id from t_customer where user_id = ?)",nativeQuery = true) List getAllShopByCustomer(String userId); } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/MallDeliveryOrderMapper.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/MallDeliveryOrderMapper.java new file mode 100644 index 00000000..e156510e --- /dev/null +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/MallDeliveryOrderMapper.java @@ -0,0 +1,27 @@ +package cc.hiver.mall.dao.mapper; + +import cc.hiver.mall.entity.MallDeliveryOrder; +import cc.hiver.mall.pojo.query.MallDeliveryOrderPageQuery; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +import java.util.Map; + +/** + * 閰嶉佽鍗 Mapper 鎺ュ彛 + */ +@Repository +public interface MallDeliveryOrderMapper extends BaseMapper { + + /** + * 鍒嗛〉鏌ヨ閰嶉佸崟 + */ + IPage selectPageVO(IPage page, @Param("q") MallDeliveryOrderPageQuery q); + + /** + * 缁熻閰嶉佸憳褰撳墠娲昏穬鍗曢噺锛堝緟鍙栬揣+閰嶉佷腑锛 + */ + Map countActiveOrdersByWorker(@Param("workerId") String workerId); +} diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/MallOrderGoodsMapper.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/MallOrderGoodsMapper.java new file mode 100644 index 00000000..9e1f381d --- /dev/null +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/MallOrderGoodsMapper.java @@ -0,0 +1,25 @@ +package cc.hiver.mall.dao.mapper; + +import cc.hiver.mall.entity.MallOrderGoods; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * 璁㈠崟鍟嗗搧璇︽儏 Mapper 鎺ュ彛 + */ +@Repository +public interface MallOrderGoodsMapper extends BaseMapper { + + /** + * 鎸夎鍗旾D鏌ヨ鍟嗗搧鏄庣粏 + */ + List selectByOrderId(@Param("orderId") String orderId); + + /** + * 鎸夎鍗旾D闆嗗悎鎵归噺鏌ヨ + */ + List selectByOrderIds(@Param("orderIds") List orderIds); +} diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/MallOrderGroupMapper.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/MallOrderGroupMapper.java new file mode 100644 index 00000000..3f489a5f --- /dev/null +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/MallOrderGroupMapper.java @@ -0,0 +1,12 @@ +package cc.hiver.mall.dao.mapper; + +import cc.hiver.mall.entity.MallOrderGroup; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.springframework.stereotype.Repository; + +/** + * 鎷煎洟涓昏〃 Mapper 鎺ュ彛 + */ +@Repository +public interface MallOrderGroupMapper extends BaseMapper { +} diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/MallOrderMapper.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/MallOrderMapper.java new file mode 100644 index 00000000..32a773da --- /dev/null +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/MallOrderMapper.java @@ -0,0 +1,23 @@ +package cc.hiver.mall.dao.mapper; + +import cc.hiver.mall.entity.MallOrder; +import cc.hiver.mall.pojo.query.MallOrderPageQuery; +import cc.hiver.mall.pojo.vo.MallOrderVO; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +/** + * 鏍稿績璁㈠崟 Mapper 鎺ュ彛 + */ +@Repository +public interface MallOrderMapper extends BaseMapper { + + /** + * 鍒嗛〉鏌ヨ璁㈠崟锛堝惈鍟嗗搧銆佹嫾鍥€侀厤閫佷俊鎭級 + */ + IPage selectPageVO(IPage page, @Param("q") MallOrderPageQuery q); + + MallOrder selectMallOrderByGroupId(@Param("groupId") String groupId); +} diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/MallRefundRecordMapper.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/MallRefundRecordMapper.java new file mode 100644 index 00000000..45f8c715 --- /dev/null +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/MallRefundRecordMapper.java @@ -0,0 +1,12 @@ +package cc.hiver.mall.dao.mapper; + +import cc.hiver.mall.entity.MallRefundRecord; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.springframework.stereotype.Repository; + +/** + * 閫娆捐褰 Mapper 鎺ュ彛 + */ +@Repository +public interface MallRefundRecordMapper extends BaseMapper { +} diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/WorkerRelaPriceMapper.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/WorkerRelaPriceMapper.java index ffb4f9ae..e6f37b1a 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/WorkerRelaPriceMapper.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/WorkerRelaPriceMapper.java @@ -32,6 +32,7 @@ public interface WorkerRelaPriceMapper extends BaseMapper { */ List getMatchingWorkerList( @Param("shopAreaId") String shopAreaId, + @Param("orderType") Integer orderType, @Param("putAreaId") String putAreaId, @Param("keyword") String keyword, @Param("baozhang") Boolean baozhang, diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallDeliveryOrder.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallDeliveryOrder.java index bef6205e..76793492 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallDeliveryOrder.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallDeliveryOrder.java @@ -1,8 +1,10 @@ package cc.hiver.mall.entity; +import cc.hiver.core.common.utils.SnowFlakeUtil; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.persistence.Entity; @@ -18,19 +20,50 @@ import java.util.Date; @TableName("mall_delivery_order") @ApiModel(value = "閰嶉佽鍗曡〃") public class MallDeliveryOrder implements Serializable { + @Id @TableId - private String id; + private String id = SnowFlakeUtil.nextId().toString(); + @ApiModelProperty(value = "鍏宠仈鏍稿績璁㈠崟ID") private String orderId; + @ApiModelProperty(value = "鍏宠仈鎷煎洟ID(濡備负鎷煎洟閰嶉,瀵瑰簲澶氫釜瀛愯鍗曪紝濡傛灉鏄嫾鍥 闈㈠闈㈠洟锛屼唬琛ㄦ墍鏈変汉鍜屽洟闀垮叡鐢ㄤ竴涓湴鍧锛屽悎骞舵垚涓涓厤閫佽鍗曢厤閫)") private String groupId; + @ApiModelProperty(value = "閰嶉佸憳ID") private String workerId; + @ApiModelProperty(value = "搴楅摵ID") private String shopId; + @ApiModelProperty(value = "鍙栬揣鍖哄煙ID锛堣鍗曞晢瀹剁殑鎵鍦ㄥ尯鍩焛d锛") private String getAreaId; + @ApiModelProperty(value = "閫佽揣鍖哄煙ID(鐢ㄦ埛鏀惰揣鍦板潃鍖哄煙id)") private String putAreaId; + @ApiModelProperty(value = "閰嶉佽垂") private BigDecimal deliveryFee; + @ApiModelProperty(value = "骞冲彴棰濆浣i噾锛堟帴鏀剁殑鎸囨淳鍗曟墠鏈夛級") + private BigDecimal deliveryFeeMarketplace; + @ApiModelProperty(value = "閰嶉佺姸鎬 0:寰呮帴鍗 1:寰呭彇璐 2:閰嶉佷腑 3:宸查佽揪 4:宸插彇娑") private Integer status; + @ApiModelProperty(value = "鏀惰揣浜哄鍚嶏紙蹇収锛") + private String receiverName; + @ApiModelProperty(value = "鏀惰揣浜虹數璇濓紙蹇収锛") + private String receiverPhone; + @ApiModelProperty(value = "鏀惰揣鍦板潃锛堝揩鐓э紝areaName+floor+roomNum鍚堟垚锛") + private String receiverAddress; + @ApiModelProperty(value = "鍟嗗鍚嶇О锛堝揩鐓э級") + private String shopName; + @ApiModelProperty(value = "鍟嗗鑱旂郴鐢佃瘽锛堝揩鐓э級") + private String shopPhone; + @ApiModelProperty(value = "鍟嗗鍦板潃锛堝揩鐓э級") + private String shopAddress; + @ApiModelProperty(value = "鍔犲叆澶у巺鎴栨寚娲炬椂闂") private Date createTime; + @ApiModelProperty(value = "鎺ュ崟鏃堕棿") private Date acceptTime; + @ApiModelProperty(value = "鍙栬揣鏃堕棿") private Date getTime; + @ApiModelProperty(value = "瀹㈡埛瑕佹眰閫佽揪鏃堕棿") + private Date mustFinishTime; + @ApiModelProperty(value = "閫佽揪鏃堕棿") private Date finishTime; + @ApiModelProperty(value = "璁㈠崟绫诲瀷 1:澶栧崠 2:蹇 3 璺戣吙") + private Integer deliveryType; } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallOrder.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallOrder.java index aeeace8a..9429f963 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallOrder.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallOrder.java @@ -1,8 +1,10 @@ package cc.hiver.mall.entity; +import cc.hiver.core.common.utils.SnowFlakeUtil; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.persistence.Entity; @@ -18,20 +20,51 @@ import java.util.Date; @TableName("mall_order") @ApiModel(value = "鏍稿績璁㈠崟琛") public class MallOrder implements Serializable { + private static final long serialVersionUID = 1L; + @Id @TableId - private String id; + private String id = SnowFlakeUtil.nextId().toString(); + @ApiModelProperty(value = "鐢ㄦ埛ID") private String userId; + @ApiModelProperty(value = "搴楅摵ID") private String shopId; + @ApiModelProperty(value = "璁㈠崟绫诲瀷 1:鐩存帴璐拱 2:鎷煎洟璐拱 3:闈㈠闈㈠洟") private Integer orderType; + @ApiModelProperty(value = "閰嶉佹柟寮 1:澶栧崠閰嶉 2:鍒板簵鑷彇") private Integer deliveryType; + @ApiModelProperty(value = "璁㈠崟鐘舵 0:寰呮敮浠 1:寰呭晢瀹舵帴鍗 01:寰呮垚鍥 2寰呴厤閫佸憳鎺ュ崟 3:寰呭彇璐(閰嶉)/寰呮秷璐(鑷彇) 4:閰嶉佷腑 5:宸插畬鎴 6:宸插彇娑 7:寰呭晢瀹跺悓鎰忛娆 8锛氬凡閫娆") private Integer status; + @ApiModelProperty(value = "璁㈠崟鎬婚噾棰(鍖呭惈杩愯垂鎵撳寘璐圭瓑)") private BigDecimal totalAmount; + @ApiModelProperty(value = "鍟嗗搧鎬婚噾棰") private BigDecimal goodsAmount; + @ApiModelProperty(value = "涓汉瀹炰粯閰嶉佽垂") private BigDecimal deliveryFee; + @ApiModelProperty(value = "鎵撳寘璐") private BigDecimal packageFee; + @ApiModelProperty(value = "鏀惰揣鍦板潃ID") private String addressId; + @ApiModelProperty(value = "鍙栬揣鍖哄煙ID锛堝晢鎴锋墍鍦ㄥ尯鍩燂級") + private String getAreaId; + @ApiModelProperty(value = "閫佽揣鍖哄煙ID锛堢敤鎴锋敹璐у湴鍧鍏宠仈鍖哄煙锛") + private String putAreaId; + @ApiModelProperty(value = "澶囨敞") private String remark; + @ApiModelProperty(value = "鏀惰揣浜哄鍚嶏紙蹇収锛") + private String receiverName; + @ApiModelProperty(value = "鏀惰揣浜虹數璇濓紙蹇収锛") + private String receiverPhone; + @ApiModelProperty(value = "鏀惰揣鍦板潃锛堝揩鐓э紝areaName+floor+roomNum鍚堟垚锛") + private String receiverAddress; + @ApiModelProperty(value = "鍟嗗鍚嶇О锛堝揩鐓э級") + private String shopName; + @ApiModelProperty(value = "鍟嗗鑱旂郴鐢佃瘽锛堝揩鐓э級") + private String shopPhone; + @ApiModelProperty(value = "鍟嗗鍦板潃锛堝揩鐓э級") + private String shopAddress; + @ApiModelProperty(value = "鍒涘缓鏃堕棿") private Date createTime; + @ApiModelProperty(value = "鏀粯鏃堕棿") private Date payTime; } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallOrderGoods.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallOrderGoods.java index 1ae073ca..3bf8b183 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallOrderGoods.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallOrderGoods.java @@ -1,8 +1,10 @@ package cc.hiver.mall.entity; +import cc.hiver.core.common.utils.SnowFlakeUtil; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.persistence.Entity; @@ -19,12 +21,19 @@ import java.math.BigDecimal; public class MallOrderGoods implements Serializable { @Id @TableId - private String id; + private String id = SnowFlakeUtil.nextId().toString(); + @ApiModelProperty(value = "鍏宠仈鏍稿績璁㈠崟ID") private String orderId; + @ApiModelProperty(value = "鍏宠仈鍟嗗搧ID") private String productId; + @ApiModelProperty(value = "鍟嗗搧鍚嶇О") private String productName; + @ApiModelProperty(value = "鍟嗗搧鍥剧墖") private String productPicture; + @ApiModelProperty(value = "鍟嗗搧瑙勬牸json") private String specs; + @ApiModelProperty(value = "鍟嗗搧鍗曚环") private BigDecimal price; + @ApiModelProperty(value = "鍟嗗搧鏁伴噺") private Integer quantity; } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallOrderGroup.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallOrderGroup.java index 30bd443d..5621e394 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallOrderGroup.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallOrderGroup.java @@ -1,8 +1,10 @@ package cc.hiver.mall.entity; +import cc.hiver.core.common.utils.SnowFlakeUtil; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.persistence.Entity; @@ -20,18 +22,31 @@ import java.util.Date; public class MallOrderGroup implements Serializable { @Id @TableId - private String id; + private String id = SnowFlakeUtil.nextId().toString(); + @ApiModelProperty(value = "搴楅摵ID") private String shopId; + @ApiModelProperty(value = "鍥㈤暱鐢ㄦ埛ID") private String headUserId; + @ApiModelProperty(value = "鍥㈤暱璁㈠崟ID") private String headOrderId; - private String groupUserIds; + @ApiModelProperty(value = "鍙傚洟鐢ㄦ埛璁㈠崟id闆嗗悎") + private String groupOrderIds; + @ApiModelProperty(value = "鎷煎洟浜烘暟") private Integer targetMembers; + @ApiModelProperty(value = "褰撳墠鍙傚洟浜烘暟") private Integer currentMembers; + @ApiModelProperty(value = "鎷煎洟鐘舵 0:鎷煎洟涓 1:鎷煎洟鎴愬姛 2:鎷煎洟澶辫触 3:闈㈠闈㈠洟(涓嶅叕寮)") private Integer status; + @ApiModelProperty(value = "鎷煎洟浠锋牸") private BigDecimal groupPrice; + @ApiModelProperty(value = "鎸囧畾閰嶉佸憳ID(涓虹┖鍒欒繘鍏ユ姠鍗曞ぇ鍘)") private String workerId; + @ApiModelProperty(value = "閰嶉佸憳浣i噾鍩烘暟(涓嶆寚瀹氭椂涓哄洟闀胯缃噾棰,鎸囧畾鏃朵负閰嶉佸憳瑙勫垯orderBkge)") private BigDecimal workerCommission; + @ApiModelProperty(value = "鎬婚厤閫佽垂") private BigDecimal totalDeliveryFee; + @ApiModelProperty(value = "鍒涘缓鏃堕棿") private Date createTime; + @ApiModelProperty(value = "杩囨湡鏃堕棿") private Date expireTime; } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallRefundRecord.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallRefundRecord.java index 15a9b783..5dd4dc0b 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallRefundRecord.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallRefundRecord.java @@ -1,8 +1,10 @@ package cc.hiver.mall.entity; +import cc.hiver.core.common.utils.SnowFlakeUtil; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.persistence.Entity; @@ -20,12 +22,19 @@ import java.util.Date; public class MallRefundRecord implements Serializable { @Id @TableId - private String id; + private String id = SnowFlakeUtil.nextId().toString(); + @ApiModelProperty(value = "鍏宠仈鏍稿績璁㈠崟ID") private String orderId; + @ApiModelProperty(value = "鐢ㄦ埛ID") private String userId; + @ApiModelProperty(value = "閫娆鹃噾棰") private BigDecimal refundAmount; + @ApiModelProperty(value = "閫娆惧師鍥") private String reason; + @ApiModelProperty(value = "閫娆剧姸鎬 0:寰呭晢瀹跺悓鎰 1:閫娆炬垚鍔 2:鍟嗗鎷掔粷閫娆") private Integer status; + @ApiModelProperty(value = "鍒涘缓鏃堕棿") private Date createTime; + @ApiModelProperty(value = "閫娆炬垚鍔熸椂闂") private Date successTime; } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallReturnOrderGoods.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallReturnOrderGoods.java new file mode 100644 index 00000000..b8e28748 --- /dev/null +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallReturnOrderGoods.java @@ -0,0 +1,39 @@ +package cc.hiver.mall.entity; + +import cc.hiver.core.common.utils.SnowFlakeUtil; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +@Entity +@Table(name = "mall_return_order_goods") +@TableName("mall_return_order_goods") +@ApiModel(value = "閫璐ц鍗曞晢鍝佽鎯呰〃") +public class MallReturnOrderGoods implements Serializable { + @Id + @TableId + private String id = SnowFlakeUtil.nextId().toString(); + @ApiModelProperty(value = "鍏宠仈閫璐ц鍗旾D") + private String orderId; + @ApiModelProperty(value = "鍏宠仈鍟嗗搧ID") + private String productId; + @ApiModelProperty(value = "鍟嗗搧鍚嶇О") + private String productName; + @ApiModelProperty(value = "鍟嗗搧鍥剧墖") + private String productPicture; + @ApiModelProperty(value = "鍟嗗搧瑙勬牸json") + private String specs; + @ApiModelProperty(value = "鍟嗗搧鍗曚环") + private BigDecimal price; + @ApiModelProperty(value = "鍟嗗搧鏁伴噺") + private Integer quantity; +} diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/Product.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/Product.java index a74bddbc..250a4250 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/Product.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/Product.java @@ -77,7 +77,7 @@ public class Product implements Serializable { @ApiModelProperty(value = "鍟嗗搧灞炴у垪琛") private String attributeList; - @ApiModelProperty(value = "鍟嗗搧瑙勬牸鍒楄〃") + @ApiModelProperty(value = "鍟嗗搧瑙勬牸鍒楄〃 [{\"specPrice\":\"11\",\"specNum\":9999}]") private String attributeListPrice; @ApiModelProperty(value = "鏄惁涓烘帹鑽 0涓嶆槸 1鏄") diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/Shop.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/Shop.java index ccdd1ee7..485c9767 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/Shop.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/Shop.java @@ -169,6 +169,9 @@ public class Shop extends HiverBaseEntity { @ApiModelProperty(value = "鍓爣棰") private String subtitle; + @ApiModelProperty(value = "鏄惁涓哄鐢熷晢瀹 0 涓嶆槸 1鏄") + private Integer isStudent; + @Transient @TableField(exist = false) @ApiModelProperty(value = "搴楅摵鎶戒剑绛夎缃") diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/dto/AreaRuleDTO.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/dto/AreaRuleDTO.java new file mode 100644 index 00000000..70f7e697 --- /dev/null +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/dto/AreaRuleDTO.java @@ -0,0 +1,19 @@ +package cc.hiver.mall.pojo.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 鍖哄煙鍖归厤瑙勫垯DTO + */ +@Data +@ApiModel("鍖哄煙鍖归厤瑙勫垯DTO") +public class AreaRuleDTO { + + @ApiModelProperty("鍙栬揣鍖哄煙ID") + private String getAreaId; + + @ApiModelProperty("閫佽揣鍖哄煙ID") + private String putAreaId; +} diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/dto/CreateOrderDTO.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/dto/CreateOrderDTO.java new file mode 100644 index 00000000..e7e5b37a --- /dev/null +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/dto/CreateOrderDTO.java @@ -0,0 +1,91 @@ +package cc.hiver.mall.pojo.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 涓嬪崟璇锋眰 DTO + */ +@ApiModel("涓嬪崟璇锋眰DTO") +@Data +public class CreateOrderDTO { + + @ApiModelProperty(value = "鐢ㄦ埛ID", required = true) + private String userId; + + @ApiModelProperty(value = "搴楅摵ID", required = true) + private String shopId; + + @ApiModelProperty(value = "鍟嗗搧鍒楄〃", required = true) + private List items; + + @ApiModelProperty(value = "閰嶉佹柟寮 1:澶栧崠閰嶉 2:鍒板簵鑷彇", required = true) + private Integer deliveryType; + + @ApiModelProperty(value = "鏀惰揣鍦板潃ID锛堝鍗栭厤閫佹椂蹇呭~锛") + private String addressId; + + @ApiModelProperty(value = "鍙栬揣鍖哄煙ID(鍟嗘埛)") + private String getAreaId; + + @ApiModelProperty(value = "閫佽揣鍖哄煙ID(鐢ㄦ埛鏀惰揣鍦板潃鍏宠仈鍖哄煙id)") + private String putAreaId; + + @ApiModelProperty(value = "鎵撳寘璐癸紙榛樿0锛") + private BigDecimal packageFee; + + @ApiModelProperty(value = "澶囨敞") + private String remark; + + @ApiModelProperty(value = "瑕佹眰閫佽揪鏃堕棿锛堥绾﹂厤閫佹椂濉啓锛") + private Date mustFinishTime; + + @ApiModelProperty(value = "鍔犲叆宸叉湁鎷煎洟鏃朵紶鍏roupId") + private String groupId; + + @ApiModelProperty(value = "鍙戣捣鎷煎洟鏃朵紶鍏ワ紙orderType=2涓攇roupId涓虹┖鏃跺繀濉級") + private GroupParam groupParam; + + @ApiModelProperty(value = "鎸囧畾閰嶉佸憳鍙傛暟锛堜笉鎸囧畾鍒欒繘鍏ユ姠鍗曞ぇ鍘咃級") + private WorkerParam workerParam; + + // ===================== 鍐呭祵绫 ===================== + + @Data + @ApiModel("璁㈠崟鍟嗗搧鏉$洰") + public static class OrderItemDTO { + @ApiModelProperty(value = "鍟嗗搧ID", required = true) + private String productId; + @ApiModelProperty(value = "鍟嗗搧瑙勬牸JSON锛屾牸寮忥細{\"specPrice\":\"11\",\"specNum\":9999}", required = true) + private String specs; + @ApiModelProperty(value = "涓嬪崟浠锋牸锛堜互姝や负鍑嗭紝鐢卞墠绔紶鍏ヨ鏍煎搴斾环鏍硷級", required = true) + private BigDecimal price; + @ApiModelProperty(value = "璐拱鏁伴噺", required = true) + private Integer quantity; + } + + @Data + @ApiModel("鍙戣捣鎷煎洟鍙傛暟") + public static class GroupParam { + @ApiModelProperty(value = "鐩爣鎷煎洟浜烘暟", required = true) + private Integer targetMembers; + @ApiModelProperty(value = "鏄惁闈㈠闈㈠洟锛堜笉鍏紑锛 0鍚 1鏄", required = true) + private Integer isFaceToFace; + @ApiModelProperty(value = "鍥㈤暱鑷畾涔夐厤閫佷剑閲戯紙涓嶆寚瀹氶厤閫佸憳銆侀潰瀵归潰鍥㈡椂濉啓锛") + private BigDecimal selfCommission; + } + + @Data + @ApiModel("鎸囧畾閰嶉佸憳鍙傛暟") + public static class WorkerParam { + @ApiModelProperty(value = "閰嶉佸憳ID", required = true) + private String workerId; + @ApiModelProperty(value = "閰嶉佸憳瑙勫垯浣i噾 orderBkge", required = true) + private BigDecimal orderBkge; + } +} diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/query/MallDeliveryOrderPageQuery.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/query/MallDeliveryOrderPageQuery.java new file mode 100644 index 00000000..eed325d8 --- /dev/null +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/query/MallDeliveryOrderPageQuery.java @@ -0,0 +1,50 @@ +package cc.hiver.mall.pojo.query; + +import cc.hiver.core.base.HiverBasePageQuery; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 閰嶉佸崟鍒嗛〉鏌ヨ瀵硅薄 + */ +@ApiModel("閰嶉佸崟鍒嗛〉鏌ヨ瀵硅薄") +@Data +public class MallDeliveryOrderPageQuery extends HiverBasePageQuery { + + @ApiModelProperty("閰嶉佸憳ID") + private String workerId; + + @ApiModelProperty("搴楅摵ID") + private String shopId; + + @ApiModelProperty("閰嶉佺姸鎬 0:寰呮帴鍗 1:寰呭彇璐 2:閰嶉佷腑 3:宸查佽揪 4:宸插彇娑") + private Integer status; + + @ApiModelProperty("鍙栬揣鍖哄煙ID") + private String getAreaId; + + @ApiModelProperty("閫佽揣鍖哄煙ID") + private String putAreaId; + + @ApiModelProperty("寮濮嬫椂闂") + private String startDate; + + @ApiModelProperty("缁撴潫鏃堕棿") + private String endDate; + + @ApiModelProperty("鏄惁鍙煡璇㈡姠鍗曞ぇ鍘咃紙workerId涓虹┖鐨勶級") + private Boolean hallOnly; + + @ApiModelProperty("璁㈠崟绫诲瀷 1:澶栧崠 2:蹇") + private Integer deliveryType; + + @ApiModelProperty("鎺掑簭瑙勫垯锛堝鏋滄湁鍊间笖涓篸eliveryFee锛屽垯鎸変剑閲戦檷搴忥級") + private String order; + + @ApiModelProperty("澶栧崠鎶㈠崟鍖归厤瑙勫垯鏁扮粍") + private java.util.List waimaiData; + + @ApiModelProperty("蹇掓姠鍗曞尮閰嶈鍒欐暟缁") + private java.util.List kuaidiData; +} diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/query/MallOrderPageQuery.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/query/MallOrderPageQuery.java new file mode 100644 index 00000000..24cd87f7 --- /dev/null +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/query/MallOrderPageQuery.java @@ -0,0 +1,38 @@ +package cc.hiver.mall.pojo.query; + +import cc.hiver.core.base.HiverBasePageQuery; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 璁㈠崟鍒嗛〉鏌ヨ瀵硅薄 + */ +@ApiModel("璁㈠崟鍒嗛〉鏌ヨ瀵硅薄") +@Data +public class MallOrderPageQuery extends HiverBasePageQuery { + + @ApiModelProperty("鐢ㄦ埛ID") + private String userId; + + @ApiModelProperty("搴楅摵ID") + private String shopId; + + @ApiModelProperty("璁㈠崟鐘舵 0:寰呮敮浠 1:寰呭晢瀹舵帴鍗 2:寰呴厤閫佸憳鎺ュ崟 3:寰呭彇璐/寰呮秷璐 4:閰嶉佷腑 5:宸插畬鎴 6:宸插彇娑 7:寰呴娆 8:宸查娆") + private Integer status; + + @ApiModelProperty("璁㈠崟绫诲瀷 1:鐩存帴璐拱 2:鎷煎洟璐拱") + private Integer orderType; + + @ApiModelProperty("閰嶉佹柟寮 1:澶栧崠閰嶉 2:鍒板簵鑷彇") + private Integer deliveryType; + + @ApiModelProperty("鎷煎洟ID") + private String groupId; + + @ApiModelProperty("寮濮嬫椂闂达紙鍒涘缓鏃堕棿璧凤級") + private String startDate; + + @ApiModelProperty("缁撴潫鏃堕棿锛堝垱寤烘椂闂存锛") + private String endDate; +} diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/MallOrderVO.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/MallOrderVO.java new file mode 100644 index 00000000..68303cdc --- /dev/null +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/MallOrderVO.java @@ -0,0 +1,33 @@ +package cc.hiver.mall.pojo.vo; + +import cc.hiver.mall.entity.MallDeliveryOrder; +import cc.hiver.mall.entity.MallOrder; +import cc.hiver.mall.entity.MallOrderGoods; +import cc.hiver.mall.entity.MallOrderGroup; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.List; + +/** + * 璁㈠崟璇︽儏/鍒楄〃 鍝嶅簲 VO + */ +@ApiModel("璁㈠崟鍝嶅簲VO") +@Data +@EqualsAndHashCode(callSuper = false) +public class MallOrderVO extends MallOrder { + + @ApiModelProperty("璁㈠崟鍟嗗搧鍒楄〃") + private List goodsList; + + @ApiModelProperty("鎷煎洟淇℃伅锛堟嫾鍥㈣鍗曟椂杩斿洖锛") + private MallOrderGroup groupInfo; + + @ApiModelProperty("閰嶉佷俊鎭紙澶栧崠璁㈠崟鏃惰繑鍥烇級") + private MallDeliveryOrder deliveryInfo; + + @ApiModelProperty("鏀惰揣鍦板潃璇︽儏锛堝啑浣欏睍绀虹敤锛") + private String addressDetail; +} diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/WorkerRealPriceVo.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/WorkerRealPriceVo.java index eebce7da..6b3d3658 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/WorkerRealPriceVo.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/WorkerRealPriceVo.java @@ -28,6 +28,9 @@ public class WorkerRealPriceVo implements Serializable { @ApiModelProperty(value = " 閰嶉佽鍒") private String cardPicture; + @ApiModelProperty(value = " 閰嶉佽鍒") + private Integer getPushOrder; + @ApiModelProperty(value = " 閰嶉佽鍒") private BigDecimal highFloorFee; diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/quartz/GroupBuyExpireTask.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/quartz/GroupBuyExpireTask.java new file mode 100644 index 00000000..9bd28190 --- /dev/null +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/quartz/GroupBuyExpireTask.java @@ -0,0 +1,57 @@ +package cc.hiver.mall.quartz; + +import cc.hiver.mall.entity.MallOrderGroup; +import cc.hiver.mall.service.mybatis.MallOrderGroupService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.util.Date; +import java.util.List; + +/** + * 鎷煎洟瓒呮椂鑷姩澶辫触瀹氭椂浠诲姟 + * 姣30鍒嗛挓鎵弿涓娆℃嫾鍥腑锛坰tatus=0/3锛変笖宸茶秴杩 expireTime 鐨勬嫾鍥 + */ +@Slf4j +@Component +public class GroupBuyExpireTask { + + @Autowired + private MallOrderGroupService mallOrderGroupService; + + /** + * 姣5鍒嗛挓鎵ц涓娆 + */ + @Scheduled(cron = "0 0/30 * * * ?") + public void expireOverdueGroups() { + log.info("[鎷煎洟杩囨湡浠诲姟] 寮濮嬫壂鎻忚秴鏃舵嫾鍥..."); + try { + LambdaQueryWrapper qw = new LambdaQueryWrapper<>(); + // 鍙鐞嗐屾嫾鍥腑锛0锛夈嶅拰銆岄潰瀵归潰鍥紙3锛夈嶄笖宸茶秴鏃剁殑 + qw.in(MallOrderGroup::getStatus, 0, 3) + .lt(MallOrderGroup::getExpireTime, new Date()); + + List overdueGroups = mallOrderGroupService.list(qw); + + if (overdueGroups.isEmpty()) { + log.info("[鎷煎洟杩囨湡浠诲姟] 鏃犺秴鏃舵嫾鍥"); + return; + } + + log.info("[鎷煎洟杩囨湡浠诲姟] 鍙戠幇 {} 涓秴鏃舵嫾鍥紝寮濮嬪鐞...", overdueGroups.size()); + for (MallOrderGroup group : overdueGroups) { + try { + mallOrderGroupService.expireGroup(group.getId()); + log.info("[鎷煎洟杩囨湡浠诲姟] 鎷煎洟 {} 澶勭悊瀹屾垚", group.getId()); + } catch (Exception e) { + log.error("[鎷煎洟杩囨湡浠诲姟] 澶勭悊鎷煎洟 {} 澶辫触: {}", group.getId(), e.getMessage(), e); + } + } + } catch (Exception e) { + log.error("[鎷煎洟杩囨湡浠诲姟] 浠诲姟鎵ц寮傚父: {}", e.getMessage(), e); + } + } +} diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/ShopService.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/ShopService.java index 1f0f6ab1..9d86952e 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/ShopService.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/ShopService.java @@ -57,6 +57,8 @@ public interface ShopService extends HiverBaseService { */ void updateShopAreaTitle(String shopArea, String shopAreaTitle); + Shop getShopByUserid(String userId); + /** * 鏍规嵁鐢ㄦ埛id鑾峰彇搴楅摵淇℃伅 * diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/MallDeliveryOrderService.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/MallDeliveryOrderService.java new file mode 100644 index 00000000..249214cb --- /dev/null +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/MallDeliveryOrderService.java @@ -0,0 +1,43 @@ +package cc.hiver.mall.service.mybatis; + +import cc.hiver.mall.entity.MallDeliveryOrder; +import cc.hiver.mall.pojo.query.MallDeliveryOrderPageQuery; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * 閰嶉佽鍗 Service 鎺ュ彛 + */ +public interface MallDeliveryOrderService extends IService { + + /** + * 鍒嗛〉鏌ヨ閰嶉佸崟锛堝彲鏌ユ姠鍗曞ぇ鍘咃級 + */ + IPage pageDelivery(MallDeliveryOrderPageQuery q); + + /** + * 閰嶉佸憳鎺ュ崟锛堟姠鍗曞ぇ鍘呮垨鎸囨淳鍗曪級 + */ + void workerAccept(String deliveryId, String workerId); + + /** + * 閰嶉佸憳鍙栬揣 + */ + void workerPickup(String deliveryId, String workerId); + + /** + * 閰嶉佸憳閫佽揪瀹屾垚 + */ + void workerComplete(String deliveryId, String workerId); + + /** + * 鍙栨秷閰嶉佸崟 + */ + void cancelDelivery(String deliveryId); + + /** + * 缁熻鎶㈠崟澶у巺鏈鎺ュ崟鐨勬暟閲 + * @param deliveryType 1:澶栧崠 2:蹇 + */ + long countWaitGrabOrders(int deliveryType); +} diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/MallOrderGroupService.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/MallOrderGroupService.java new file mode 100644 index 00000000..7add5fa9 --- /dev/null +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/MallOrderGroupService.java @@ -0,0 +1,20 @@ +package cc.hiver.mall.service.mybatis; + +import cc.hiver.mall.entity.MallOrderGroup; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * 鎷煎洟涓昏〃 Service 鎺ュ彛 + */ +public interface MallOrderGroupService extends IService { + + /** + * 妫鏌ユ嫾鍥㈡槸鍚﹁揪鍒版垚鍥㈡潯浠讹紝婊¤冻鍒欒嚜鍔ㄦ縺娲 + */ + void checkAndActivateGroup(String groupId); + + /** + * 鎷煎洟杩囨湡澶勭悊锛堝彂璧烽娆撅紝鎵鏈夊瓙璁㈠崟璁句负宸插彇娑堬級 + */ + void expireGroup(String groupId); +} diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/MallOrderService.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/MallOrderService.java new file mode 100644 index 00000000..831fc19a --- /dev/null +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/MallOrderService.java @@ -0,0 +1,72 @@ +package cc.hiver.mall.service.mybatis; + +import cc.hiver.mall.entity.MallOrder; +import cc.hiver.mall.pojo.dto.CreateOrderDTO; +import cc.hiver.mall.pojo.query.MallOrderPageQuery; +import cc.hiver.mall.pojo.vo.MallOrderVO; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import org.apache.ibatis.annotations.Param; + +/** + * 鏍稿績璁㈠崟 Service 鎺ュ彛 + */ +public interface MallOrderService extends IService { + + /** + * 鍒涘缓璁㈠崟锛堟敮鎸佹櫘閫氳喘涔/鎷煎洟鍙戣捣/鎷煎洟鍙傚洟锛 + */ + MallOrderVO createOrder(CreateOrderDTO dto); + + /** + * 鍒嗛〉鏌ヨ璁㈠崟鍒楄〃 + */ + IPage pageOrder(MallOrderPageQuery q); + + /** + * 鏌ヨ璁㈠崟璇︽儏 + */ + MallOrderVO getOrderDetail(String orderId); + + /** + * 鍟嗗鎺ュ崟锛堝緟鍟嗗鎺ュ崟 -> 寰呴厤閫佸憳鎺ュ崟/寰呭彇璐/寰呮秷璐癸級 + */ + void shopAccept(String orderId); + + /** + * 鏀粯鎴愬姛澶勭悊閫昏緫 + */ + void paySuccess(String orderId); + + /** + * 鍟嗗鎷掑崟锛堣Е鍙戣嚜鍔ㄩ娆撅級 + */ + void shopReject(String orderId, String reason); + + /** + * 鐢ㄦ埛鍙栨秷璁㈠崟锛堜粎寰呮敮浠/寰呮垚鍥㈢姸鎬佸彲鍙栨秷锛 + */ + void cancelOrder(String orderId, String userId); + + /** + * 鐢宠閫娆 + */ + void applyRefund(String orderId, String userId, String reason, java.math.BigDecimal amount); + + /** + * 鍟嗗鍚屾剰閫娆 + */ + void agreeRefund(String orderId); + + /** + * 鍟嗗鎷掔粷閫娆 + */ + void rejectRefund(String orderId, String reason); + + /** + * 鐢ㄦ埛纭瀹屾垚锛堝鍗栭佽揪/鑷彇娑堣垂鍚庣‘璁わ級 + */ + void completeOrder(String orderId); + + MallOrder selectMallOrderByGroupId(@Param("groupId") String groupId); +} diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/MallRefundRecordService.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/MallRefundRecordService.java new file mode 100644 index 00000000..fe0ca477 --- /dev/null +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/MallRefundRecordService.java @@ -0,0 +1,10 @@ +package cc.hiver.mall.service.mybatis; + +import cc.hiver.mall.entity.MallRefundRecord; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * 閫娆捐褰 Service 鎺ュ彛 + */ +public interface MallRefundRecordService extends IService { +} diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/ShopServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/ShopServiceImpl.java index 96b4ede6..8a969923 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/ShopServiceImpl.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/ShopServiceImpl.java @@ -167,6 +167,11 @@ public class ShopServiceImpl implements ShopService { shopDao.updateShopAreaTitle(shopArea, shopAreaTitle); } + @Override + public Shop getShopByUserid(String userId) { + return shopDao.getShopByUserid(userId); + } + @Override public List getShopInfoByUserid(String userId) { return shopDao.getShopInfoByUserid(userId); diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallDeliveryOrderServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallDeliveryOrderServiceImpl.java new file mode 100644 index 00000000..0c2dd1bb --- /dev/null +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallDeliveryOrderServiceImpl.java @@ -0,0 +1,193 @@ +package cc.hiver.mall.serviceimpl.mybatis; + +import cc.hiver.mall.dao.mapper.MallDeliveryOrderMapper; +import cc.hiver.mall.entity.MallDeliveryOrder; +import cc.hiver.mall.entity.MallOrder; +import cc.hiver.mall.pojo.query.MallDeliveryOrderPageQuery; +import cc.hiver.mall.service.mybatis.MallDeliveryOrderService; +import cc.hiver.mall.service.mybatis.MallOrderService; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.Date; + +/** + * 閰嶉佽鍗 Service 瀹炵幇 + */ +@Slf4j +@Service +public class MallDeliveryOrderServiceImpl extends ServiceImpl + implements MallDeliveryOrderService { + + // 閰嶉佺姸鎬佸父閲 + private static final int STATUS_WAIT_ACCEPT = 0; // 寰呮帴鍗 + private static final int STATUS_WAIT_PICKUP = 1; // 寰呭彇璐 + private static final int STATUS_DELIVERING = 2; // 閰嶉佷腑 + private static final int STATUS_DONE = 3; // 宸查佽揪 + private static final int STATUS_CANCELLED = 4; // 宸插彇娑 + + // 璁㈠崟鐘舵 + private static final int ORDER_STATUS_WAIT_DELIVERY = 2; // 寰呴厤閫佸憳鎺ュ崟 + private static final int ORDER_STATUS_DELIVERING = 4; // 閰嶉佷腑 + private static final int ORDER_STATUS_DONE = 5; // 宸插畬鎴 + + @Autowired + @Lazy + private MallOrderService mallOrderService; + + @Override + public IPage pageDelivery(MallDeliveryOrderPageQuery q) { + if (Boolean.TRUE.equals(q.getHallOnly())) { + q.setPageSize(20); + } + IPage page = new Page<>(q.getPageNum(), q.getPageSize()); + return this.baseMapper.selectPageVO(page, q); + } + + /** + * 閰嶉佸憳鎺ュ崟 + * - 鎶㈠崟澶у巺锛歸orkerId 涓虹┖鐨勫崟锛屼换浣曢厤閫佸憳鍧囧彲鎺 + * - 鎸囨淳鍗曪細workerId 涓庡綋鍓嶉厤閫佸憳鐩稿悓鎵嶅彲鎺 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void workerAccept(String deliveryId, String workerId) { + MallDeliveryOrder delivery = this.getById(deliveryId); + if (delivery == null) throw new RuntimeException("閰嶉佸崟涓嶅瓨鍦"); + if (delivery.getStatus() != STATUS_WAIT_ACCEPT) throw new RuntimeException("閰嶉佸崟宸茶鎺ュ彇鎴栧凡鍙栨秷"); + + // 鎸囨淳鍗曟牎楠 + if (StringUtils.isNotBlank(delivery.getWorkerId()) && !delivery.getWorkerId().equals(workerId)) { + throw new RuntimeException("璇ュ崟宸叉寚瀹氬叾浠栭厤閫佸憳锛屾棤娉曟姠鍗"); + } + + // 鏇存柊閰嶉佸崟 + LambdaUpdateWrapper uw = new LambdaUpdateWrapper<>(); + uw.eq(MallDeliveryOrder::getId, deliveryId) + .set(MallDeliveryOrder::getStatus, STATUS_WAIT_PICKUP) + .set(MallDeliveryOrder::getWorkerId, workerId) + .set(MallDeliveryOrder::getAcceptTime, new Date()); + + // 鑻ヤ负鎸囨淳鍗曪紙鐩存帴璐拱锛夛紝璁$畻骞冲彴棰濆浣i噾 = 鍟嗗搧鎬讳环 * 2% + if (StringUtils.isNotBlank(delivery.getOrderId())) { + MallOrder order = mallOrderService.getById(delivery.getOrderId()); + if (order != null && order.getOrderType() == 1) { + BigDecimal bonus = order.getGoodsAmount() + .multiply(new BigDecimal("0.02")) + .setScale(2, RoundingMode.HALF_UP); + uw.set(MallDeliveryOrder::getDeliveryFeeMarketplace, bonus); + } + } + + this.update(uw); + + // 鍚屾鏇存柊鍏宠仈璁㈠崟鐘舵侊細寰呴厤閫佸憳鎺ュ崟 -> 閰嶉佷腑锛堟垨寰呭彇璐э級 + if (StringUtils.isNotBlank(delivery.getOrderId())) { + MallOrder order = mallOrderService.getById(delivery.getOrderId()); + if (order != null && order.getStatus() == ORDER_STATUS_WAIT_DELIVERY) { + LambdaUpdateWrapper oUw = new LambdaUpdateWrapper<>(); + oUw.eq(MallOrder::getId, delivery.getOrderId()) + .set(MallOrder::getStatus, 3); // 寰呭彇璐 + mallOrderService.update(oUw); + } + } + + log.info("閰嶉佸憳 {} 鎺ュ崟鎴愬姛锛宒eliveryId={}", workerId, deliveryId); + } + + /** + * 閰嶉佸憳鍙栬揣锛堢姸鎬侊細寰呭彇璐 -> 閰嶉佷腑锛 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void workerPickup(String deliveryId, String workerId) { + MallDeliveryOrder delivery = checkWorkerAndStatus(deliveryId, workerId, STATUS_WAIT_PICKUP); + + LambdaUpdateWrapper uw = new LambdaUpdateWrapper<>(); + uw.eq(MallDeliveryOrder::getId, deliveryId) + .set(MallDeliveryOrder::getStatus, STATUS_DELIVERING) + .set(MallDeliveryOrder::getGetTime, new Date()); + this.update(uw); + + // 鍚屾璁㈠崟鐘舵 -> 閰嶉佷腑 + if (StringUtils.isNotBlank(delivery.getOrderId())) { + LambdaUpdateWrapper oUw = new LambdaUpdateWrapper<>(); + oUw.eq(MallOrder::getId, delivery.getOrderId()) + .set(MallOrder::getStatus, ORDER_STATUS_DELIVERING); + mallOrderService.update(oUw); + } + } + + /** + * 閰嶉佸憳閫佽揪锛堢姸鎬侊細閰嶉佷腑 -> 宸查佽揪锛 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void workerComplete(String deliveryId, String workerId) { + MallDeliveryOrder delivery = checkWorkerAndStatus(deliveryId, workerId, STATUS_DELIVERING); + + LambdaUpdateWrapper uw = new LambdaUpdateWrapper<>(); + uw.eq(MallDeliveryOrder::getId, deliveryId) + .set(MallDeliveryOrder::getStatus, STATUS_DONE) + .set(MallDeliveryOrder::getFinishTime, new Date()); + this.update(uw); + + // 鍚屾璁㈠崟鐘舵 -> 宸插畬鎴 + if (StringUtils.isNotBlank(delivery.getOrderId())) { + LambdaUpdateWrapper oUw = new LambdaUpdateWrapper<>(); + oUw.eq(MallOrder::getId, delivery.getOrderId()) + .set(MallOrder::getStatus, ORDER_STATUS_DONE); + mallOrderService.update(oUw); + } + } + + /** + * 鍙栨秷閰嶉佸崟 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void cancelDelivery(String deliveryId) { + MallDeliveryOrder delivery = this.getById(deliveryId); + if (delivery == null) throw new RuntimeException("閰嶉佸崟涓嶅瓨鍦"); + + LambdaUpdateWrapper uw = new LambdaUpdateWrapper<>(); + uw.eq(MallDeliveryOrder::getId, deliveryId) + .set(MallDeliveryOrder::getStatus, STATUS_CANCELLED); + this.update(uw); + } + + // ================================================================ + // 绉佹湁宸ュ叿 + // ================================================================ + + private MallDeliveryOrder checkWorkerAndStatus(String deliveryId, String workerId, int expectedStatus) { + MallDeliveryOrder delivery = this.getById(deliveryId); + if (delivery == null) throw new RuntimeException("閰嶉佸崟涓嶅瓨鍦"); + if (delivery.getStatus() != expectedStatus) { + throw new RuntimeException("閰嶉佸崟鐘舵佷笉姝g‘锛屽綋鍓嶇姸鎬: " + delivery.getStatus()); + } + if (!workerId.equals(delivery.getWorkerId())) { + throw new RuntimeException("闈炴湰鍗曢厤閫佸憳锛屾棤鏉冩搷浣"); + } + return delivery; + } + + @Override + public long countWaitGrabOrders(int deliveryType) { + com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper query = new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<>(); + query.isNull(MallDeliveryOrder::getWorkerId) + .eq(MallDeliveryOrder::getStatus, 0) + .eq(MallDeliveryOrder::getDeliveryType, deliveryType); + return this.count(query); + } +} diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderGroupServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderGroupServiceImpl.java new file mode 100644 index 00000000..840dccd4 --- /dev/null +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderGroupServiceImpl.java @@ -0,0 +1,204 @@ +package cc.hiver.mall.serviceimpl.mybatis; + +import cc.hiver.core.entity.Worker; +import cc.hiver.core.service.WorkerService; +import cc.hiver.mall.dao.mapper.MallDeliveryOrderMapper; +import cc.hiver.mall.dao.mapper.MallOrderGroupMapper; +import cc.hiver.mall.dao.mapper.MallRefundRecordMapper; +import cc.hiver.mall.dao.mapper.WorkerRelaPriceMapper; +import cc.hiver.mall.entity.*; +import cc.hiver.mall.service.mybatis.MallOrderGroupService; +import cc.hiver.mall.service.mybatis.MallOrderService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Arrays; +import java.util.Date; +import java.util.List; + +/** + * 鎷煎洟涓昏〃 Service 瀹炵幇 + */ +@Slf4j +@Service +public class MallOrderGroupServiceImpl extends ServiceImpl + implements MallOrderGroupService { + + // 鎷煎洟鐘舵 + private static final int GROUP_STATUS_FORMING = 0; + private static final int GROUP_STATUS_SUCCESS = 1; + private static final int GROUP_STATUS_FAIL = 2; + private static final int GROUP_STATUS_FACE2FACE = 3; + + // 璁㈠崟鐘舵 + private static final int ORDER_STATUS_WAIT_GROUP = 10; // 寰呮垚鍥(01) + private static final int ORDER_STATUS_WAIT_SHOP = 1; + private static final int ORDER_STATUS_CANCELLED = 6; + + @Autowired + @Lazy + private MallOrderService mallOrderService; + + @Autowired + private MallRefundRecordMapper mallRefundRecordMapper; + + @Autowired + private MallDeliveryOrderMapper mallDeliveryOrderMapper; + + @Autowired + private WorkerService workerService; + + @Autowired + private WorkerRelaPriceMapper workerRelaPriceMapper; + + /** + * 妫鏌ユ槸鍚︽垚鍥紝婊¤冻鍒欒嚜鍔ㄦ縺娲绘墍鏈夊瓙璁㈠崟 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void checkAndActivateGroup(String groupId) { + MallOrderGroup group = this.getById(groupId); + if (group == null) return; + + // 宸叉垚鍥㈡垨宸插け璐ヤ笉閲嶅澶勭悊 + if (group.getStatus() == GROUP_STATUS_SUCCESS) return; + + if (group.getCurrentMembers() < group.getTargetMembers()) return; + + // 杈惧埌鎴愬洟浜烘暟 -> 婵娲 + LambdaUpdateWrapper guw = new LambdaUpdateWrapper<>(); + guw.eq(MallOrderGroup::getId, groupId) + .set(MallOrderGroup::getStatus, GROUP_STATUS_SUCCESS); + this.update(guw); + + // 灏嗘墍鏈夊叧鑱斿瓙璁㈠崟浠"寰呮垚鍥"鏀逛负"寰呭晢瀹舵帴鍗" + // 閫氳繃 head_order_id 鎵惧埌鍥㈤暱璁㈠崟锛屽啀閫氳繃 groupUserIds 鍏宠仈 + // 绛栫暐锛氭煡鎵鏈 orderId 鍦 groupOrderIds 涓乻hopId 鐩稿悓銆乻tatus=寰呮垚鍥㈢殑璁㈠崟 + // 鏇寸畝娲侊細鐩存帴鏌 mall_order 涓 id in (groupOrderIds split) AND shop_id = ? AND status = 10 + List orderIdList = Arrays.asList(group.getGroupOrderIds().split(",")); + + LambdaQueryWrapper oqw = new LambdaQueryWrapper<>(); + oqw.eq(MallOrder::getShopId, group.getShopId()) + .eq(MallOrder::getStatus, ORDER_STATUS_WAIT_GROUP) + .in(MallOrder::getId, orderIdList); + List waitingOrders = mallOrderService.list(oqw); + + boolean isFace2Face = (group.getStatus() == GROUP_STATUS_FACE2FACE + || (group.getStatus() == GROUP_STATUS_SUCCESS + && this.getById(groupId).getStatus() == GROUP_STATUS_FACE2FACE)); + + for (MallOrder order : waitingOrders) { + int targetStatus = (order.getDeliveryType() != null && order.getDeliveryType() == 1) ? 2 : 3; + LambdaUpdateWrapper ouw = new LambdaUpdateWrapper<>(); + ouw.eq(MallOrder::getId, order.getId()) + .set(MallOrder::getStatus, targetStatus); + mallOrderService.update(ouw); + + if (order.getDeliveryType() != null && order.getDeliveryType() == 1) { + if (isFace2Face && !order.getId().equals(group.getHeadOrderId())) { + // 闈㈠闈㈠洟鍙傚洟浜哄叡浜洟闀块厤閫佸崟锛屽洜姝ゅ弬鍥汉鏈韩娌℃湁閰嶉佸崟锛岀洿鎺ヨ烦杩 + continue; + } + + // 鍙栧嚭棰勫垱寤虹殑杩愬崟杩涜鏍¢獙 + LambdaQueryWrapper dqw = new LambdaQueryWrapper<>(); + dqw.eq(MallDeliveryOrder::getOrderId, order.getId()).last("LIMIT 1"); + MallDeliveryOrder delivery = mallDeliveryOrderMapper.selectOne(dqw); + + if (delivery != null) { + if (StringUtils.isNotBlank(delivery.getWorkerId())) { + boolean isValid = false; + Worker worker = workerService.findById(delivery.getWorkerId()); + if (worker != null && worker.getIsOnLine() != null && worker.getIsOnLine() == 1 + && worker.getGetPushOrder() != null && worker.getGetPushOrder() == 1) { + + LambdaQueryWrapper ruleQuery = new LambdaQueryWrapper<>(); + ruleQuery.eq(WorkerRelaPrice::getWorkerId, delivery.getWorkerId()) + .eq(WorkerRelaPrice::getOrderType, 0) + .eq(WorkerRelaPrice::getGetPushOrder, 1) + .eq(WorkerRelaPrice::getGetAreaId, delivery.getGetAreaId()) + .eq(WorkerRelaPrice::getPutAreaId, delivery.getPutAreaId()) + .last("LIMIT 1"); + WorkerRelaPrice rule = workerRelaPriceMapper.selectOne(ruleQuery); + if (rule != null) { + isValid = true; + } + } + + if (!isValid) { + // 閰嶉佸憳涓嬬嚎鎴栬鍒欏叧闂 -> 鍘绘帀 workerId 杩涘叆鎶㈠崟澶у巺锛屼繚鐣欏師鏈夎ˉ璐撮噾 + delivery.setWorkerId(""); + } + } + + // 缁熶竴淇敼杩愬崟鐘舵佷负0浣垮叾鐢熸晥 + delivery.setStatus(0); + mallDeliveryOrderMapper.updateById(delivery); + } + } + } + + log.info("鎷煎洟 {} 鎴愬洟鎴愬姛锛屾縺娲 {} 鏉″瓙璁㈠崟", groupId, waitingOrders.size()); + } + + /** + * 鎷煎洟杩囨湡锛氭墍鏈夊瓙璁㈠崟鍙栨秷骞剁敓鎴愰娆捐褰 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void expireGroup(String groupId) { + MallOrderGroup group = this.getById(groupId); + if (group == null) return; + if (group.getStatus() != GROUP_STATUS_FORMING && group.getStatus() != GROUP_STATUS_FACE2FACE) return; + + // 鏍囪鎷煎洟澶辫触 + LambdaUpdateWrapper guw = new LambdaUpdateWrapper<>(); + guw.eq(MallOrderGroup::getId, groupId) + .set(MallOrderGroup::getStatus, GROUP_STATUS_FAIL); + this.update(guw); + + // 鎵惧嚭鎵鏈夊緟鎴愬洟瀛愯鍗 + List orderIdList = Arrays.asList(group.getGroupOrderIds().split(",")); + LambdaQueryWrapper oqw = new LambdaQueryWrapper<>(); + oqw.eq(MallOrder::getShopId, group.getShopId()) + .eq(MallOrder::getStatus, ORDER_STATUS_WAIT_GROUP) + .in(MallOrder::getId, orderIdList); + List waitingOrders = mallOrderService.list(oqw); + + for (MallOrder order : waitingOrders) { + // 鍙栨秷瀛愯鍗 + LambdaUpdateWrapper ouw = new LambdaUpdateWrapper<>(); + ouw.eq(MallOrder::getId, order.getId()) + .set(MallOrder::getStatus, ORDER_STATUS_CANCELLED); + mallOrderService.update(ouw); + + // 鍙栨秷鏈敓鏁堢殑閰嶉佸崟 + if (order.getDeliveryType() != null && order.getDeliveryType() == 1) { + LambdaUpdateWrapper duw = new LambdaUpdateWrapper<>(); + duw.eq(MallDeliveryOrder::getOrderId, order.getId()) + .in(MallDeliveryOrder::getStatus, java.util.Arrays.asList(-1, 0)) + .set(MallDeliveryOrder::getStatus, 4); + mallDeliveryOrderMapper.update(null, duw); + } + + // 鐢熸垚閫娆捐褰 + MallRefundRecord refund = new MallRefundRecord(); + refund.setOrderId(order.getId()); + refund.setUserId(order.getUserId()); + refund.setRefundAmount(order.getTotalAmount()); + refund.setReason("鎷煎洟瓒呮椂鏈垚鍥紝绯荤粺鑷姩閫娆"); + refund.setStatus(0); + refund.setCreateTime(new Date()); + mallRefundRecordMapper.insert(refund); + } + + log.info("鎷煎洟 {} 宸茶繃鏈燂紝鍙栨秷 {} 鏉″瓙璁㈠崟骞剁敓鎴愰娆捐褰", groupId, waitingOrders.size()); + } +} diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderServiceImpl.java new file mode 100644 index 00000000..4f6034f0 --- /dev/null +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderServiceImpl.java @@ -0,0 +1,769 @@ +package cc.hiver.mall.serviceimpl.mybatis; + +import cc.hiver.mall.dao.mapper.*; +import cc.hiver.mall.entity.*; +import cc.hiver.mall.pojo.dto.CreateOrderDTO; +import cc.hiver.mall.pojo.query.MallOrderPageQuery; +import cc.hiver.mall.pojo.vo.MallOrderVO; +import cc.hiver.mall.service.mybatis.MallDeliveryOrderService; +import cc.hiver.mall.service.mybatis.MallOrderGroupService; +import cc.hiver.mall.service.mybatis.MallOrderService; +import cc.hiver.mall.service.mybatis.MallRefundRecordService; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; + +/** + * 鏍稿績璁㈠崟 Service 瀹炵幇 + */ +@Slf4j +@Service +public class MallOrderServiceImpl extends ServiceImpl implements MallOrderService { + + // 璁㈠崟鐘舵佸父閲 + private static final int STATUS_WAIT_PAY = 0; + private static final int STATUS_WAIT_GROUP = 10; // 鏁版嵁搴撳瓨鍌ㄤ负 "01"锛岀敤鏁板瓧10浠f浛 + private static final int STATUS_WAIT_SHOP = 1; + private static final int STATUS_WAIT_DELIVERY = 2; + private static final int STATUS_WAIT_PICKUP = 3; + private static final int STATUS_DELIVERING = 4; + private static final int STATUS_DONE = 5; + private static final int STATUS_CANCELLED = 6; + private static final int STATUS_WAIT_REFUND = 7; + private static final int STATUS_REFUNDED = 8; + + // 閰嶉佹柟寮忓父閲 + private static final int DELIVERY_TYPE_EXPRESS = 1; // 澶栧崠 + private static final int DELIVERY_TYPE_SELF = 2; // 鑷彇 + + // 璁㈠崟绫诲瀷甯搁噺 + private static final int ORDER_TYPE_NORMAL = 1; // 鐩存帴璐拱 + private static final int ORDER_TYPE_GROUP = 2; // 鎷煎洟璐拱 + + // 鎷煎洟鐘舵佸父閲 + private static final int GROUP_STATUS_FORMING = 0; // 鎷煎洟涓 + private static final int GROUP_STATUS_SUCCESS = 1; // 鎷煎洟鎴愬姛 + private static final int GROUP_STATUS_FAIL = 2; // 鎷煎洟澶辫触 + private static final int GROUP_STATUS_FACE2FACE = 3; // 闈㈠闈㈠洟 + + @Autowired + private MallOrderGoodsMapper mallOrderGoodsMapper; + + @Autowired + private MallOrderGroupMapper mallOrderGroupMapper; + + @Autowired + private MallDeliveryOrderMapper mallDeliveryOrderMapper; + + @Autowired + private MallRefundRecordMapper mallRefundRecordMapper; + + @Autowired + private MallOrderGroupService mallOrderGroupService; + + @Autowired + private MallDeliveryOrderService mallDeliveryOrderService; + + @Autowired + private MallRefundRecordService mallRefundRecordService; + + @Autowired + private ProductMapper productMapper; + + @Autowired + private UserAddressMapper userAddressMapper; + + @Autowired + private cc.hiver.mall.dao.mapper.ShopMapper shopMapper; + + // ================================================================ + // 鏍稿績涓嬪崟閫昏緫 + // ================================================================ + + @Override + @Transactional(rollbackFor = Exception.class) + public MallOrderVO createOrder(CreateOrderDTO dto) { + + // 1. 鍩虹鏍¢獙 + if (dto.getItems() == null || dto.getItems().isEmpty()) { + throw new RuntimeException("璁㈠崟鍟嗗搧涓嶈兘涓虹┖"); + } + if(StringUtils.isBlank(dto.getGroupId())){ + if (DELIVERY_TYPE_EXPRESS == dto.getDeliveryType() && StringUtils.isBlank(dto.getAddressId())) { + throw new RuntimeException("澶栧崠閰嶉佹椂鏀惰揣鍦板潃涓嶈兘涓虹┖"); + } + } + // 2. 鎵e簱瀛 & 璁$畻鍟嗗搧鎬婚噾棰 + BigDecimal goodsAmount = BigDecimal.ZERO; + List goodsSnapshots = new ArrayList<>(); + + for (CreateOrderDTO.OrderItemDTO item : dto.getItems()) { + Product product = productMapper.selectById(item.getProductId()); + if (product == null) { + throw new RuntimeException("鍟嗗搧涓嶅瓨鍦: " + item.getProductId()); + } + // 鎵e噺搴撳瓨锛堟洿鏂 attributeListPrice 涓殑 specNum锛 + deductStock(product, item.getQuantity()); + + // 绱鍟嗗搧閲戦 + goodsAmount = goodsAmount.add(item.getPrice().multiply(new BigDecimal(item.getQuantity()))); + + // 鏋勫缓鍟嗗搧蹇収锛坥rderId 鍚庣画濉厖锛 + MallOrderGoods snapshot = new MallOrderGoods(); + snapshot.setProductId(item.getProductId()); + snapshot.setProductName(product.getProductName()); + snapshot.setProductPicture(product.getProductPicture()); + snapshot.setSpecs(item.getSpecs()); + snapshot.setPrice(item.getPrice()); + snapshot.setQuantity(item.getQuantity()); + goodsSnapshots.add(snapshot); + } + + BigDecimal packageFee = dto.getPackageFee() != null ? dto.getPackageFee() : BigDecimal.ZERO; + + // 3. 鍒ゆ柇璁㈠崟绫诲瀷 + boolean isGroupOrder = dto.getGroupParam() != null || StringUtils.isNotBlank(dto.getGroupId()); + + if (!isGroupOrder) { + // ---- 鏅氳鍗 ---- + return createNormalOrder(dto, goodsAmount, packageFee, goodsSnapshots); + } else if (StringUtils.isNotBlank(dto.getGroupId())) { + // ---- 鍙傚洟 ---- + return joinGroup(dto, goodsAmount, packageFee, goodsSnapshots); + } else { + // ---- 鍙戣捣鎷煎洟 ---- + return startGroup(dto, goodsAmount, packageFee, goodsSnapshots); + } + } + + /** + * 鍒涘缓鏅氳鍗 + */ + private MallOrderVO createNormalOrder(CreateOrderDTO dto, BigDecimal goodsAmount, + BigDecimal packageFee, List goodsSnapshots) { + BigDecimal deliveryFee = BigDecimal.ZERO; + if (DELIVERY_TYPE_EXPRESS == dto.getDeliveryType()) { + if (dto.getWorkerParam() != null && StringUtils.isNotBlank(dto.getWorkerParam().getWorkerId())) { + // 鏈夋寚瀹氶厤閫佸憳 + deliveryFee = dto.getWorkerParam().getOrderBkge() != null ? dto.getWorkerParam().getOrderBkge() : BigDecimal.ZERO; + } else { + // 娌℃湁鎸囧畾閰嶉佸憳锛岀敤鎴疯嚜璁句剑閲 + if (dto.getWorkerParam() != null && dto.getWorkerParam().getOrderBkge() != null) { + deliveryFee = dto.getWorkerParam().getOrderBkge(); + } else if (dto.getGroupParam() != null && dto.getGroupParam().getSelfCommission() != null) { + deliveryFee = dto.getGroupParam().getSelfCommission(); + } + } + } + + MallOrder order = buildBaseOrder(dto, ORDER_TYPE_NORMAL, goodsAmount, deliveryFee, packageFee); + // 寰呮敮浠 + order.setStatus(STATUS_WAIT_PAY); + this.save(order); + + // 淇濆瓨鍟嗗搧蹇収 + saveGoodsSnapshots(goodsSnapshots, order.getId()); + + // 鑻ュ鍗栵紝鍒涘缓閰嶉佸崟锛堝垵濮嬬姸鎬 -1锛氬緟鏀粯/寰呮垚鍥級 + if (DELIVERY_TYPE_EXPRESS == dto.getDeliveryType()) { + createDeliveryOrder(order, dto, null, -1, null); + } + + return buildVO(order, goodsSnapshots, null, null); + } + + /** + * 鍙戣捣鎷煎洟 + */ + private MallOrderVO startGroup(CreateOrderDTO dto, BigDecimal goodsAmount, + BigDecimal packageFee, List goodsSnapshots) { + CreateOrderDTO.GroupParam gp = dto.getGroupParam(); + if (gp == null || gp.getTargetMembers() == null || gp.getTargetMembers() < 2) { + throw new RuntimeException("鎷煎洟浜烘暟涓嶈兘灏戜簬2浜"); + } + + boolean isFace2Face = gp.getIsFaceToFace() != null && gp.getIsFaceToFace() == 1; + + // 璁$畻闈㈠闈㈠洟鍥㈤暱涓汉閰嶉佽垂锛堝綋鍓1浜猴級 + BigDecimal deliveryFee = BigDecimal.ZERO; + if (isFace2Face && DELIVERY_TYPE_EXPRESS == dto.getDeliveryType()) { + BigDecimal selfComm = null; + if (dto.getWorkerParam() != null && StringUtils.isBlank(dto.getWorkerParam().getWorkerId()) && dto.getWorkerParam().getOrderBkge() != null) { + selfComm = dto.getWorkerParam().getOrderBkge(); + } else if (gp.getSelfCommission() != null) { + selfComm = gp.getSelfCommission(); + } + CreateOrderDTO.WorkerParam validWorker = (dto.getWorkerParam() != null && StringUtils.isNotBlank(dto.getWorkerParam().getWorkerId())) ? dto.getWorkerParam() : null; + Integer targetMembers = gp.getTargetMembers() != null ? gp.getTargetMembers() : 2; + deliveryFee = calcPersonalFee( + calcTotalDeliveryFee(selfComm, validWorker, targetMembers), + targetMembers + ); + } else if (!isFace2Face && DELIVERY_TYPE_EXPRESS == dto.getDeliveryType()) { + // 鏅氭嫾鍥紝鍥㈤暱鏈夌嫭绔嬮厤閫佽垂璁$畻 + if (dto.getWorkerParam() != null && StringUtils.isNotBlank(dto.getWorkerParam().getWorkerId())) { + deliveryFee = dto.getWorkerParam().getOrderBkge() != null ? dto.getWorkerParam().getOrderBkge() : BigDecimal.ZERO; + } else { + if (dto.getWorkerParam() != null && dto.getWorkerParam().getOrderBkge() != null) { + deliveryFee = dto.getWorkerParam().getOrderBkge(); + } else if (gp != null && gp.getSelfCommission() != null) { + deliveryFee = gp.getSelfCommission(); + } + } + } + // 鍒涘缓鍥㈤暱璁㈠崟锛堝垵濮嬬姸鎬侊細寰呮敮浠橈級 + MallOrder order = buildBaseOrder(dto, ORDER_TYPE_GROUP, goodsAmount, deliveryFee, packageFee); + order.setStatus(STATUS_WAIT_PAY); + this.save(order); + // 鍒涘缓鎷煎洟涓昏褰 + MallOrderGroup group = new MallOrderGroup(); + group.setShopId(dto.getShopId()); + group.setHeadUserId(dto.getUserId()); + group.setTargetMembers(gp.getTargetMembers()); + group.setCurrentMembers(1); + if(goodsSnapshots != null && !goodsSnapshots.isEmpty()){ + group.setGroupPrice(goodsSnapshots.get(0).getPrice()); + } + group.setHeadOrderId(order.getId()); + group.setStatus(isFace2Face ? GROUP_STATUS_FACE2FACE : GROUP_STATUS_FORMING); + group.setGroupOrderIds(order.getId()); + group.setCreateTime(new Date()); + + // 鎷煎洟杩囨湡鏃堕棿锛24灏忔椂鍚 + Calendar cal = Calendar.getInstance(); + cal.add(Calendar.HOUR_OF_DAY, 24); + group.setExpireTime(cal.getTime()); + + // 璁剧疆閰嶉佸憳鍜屼剑閲戜俊鎭 + if (dto.getWorkerParam() != null && StringUtils.isNotBlank(dto.getWorkerParam().getWorkerId())) { + group.setWorkerId(dto.getWorkerParam().getWorkerId()); + group.setWorkerCommission(dto.getWorkerParam().getOrderBkge()); + } else { + if (dto.getWorkerParam() != null && dto.getWorkerParam().getOrderBkge() != null) { + group.setWorkerCommission(dto.getWorkerParam().getOrderBkge()); + } else if (gp.getSelfCommission() != null) { + group.setWorkerCommission(gp.getSelfCommission()); + } + } + + // 闈㈠闈㈠洟鎵嶆湁鎬婚厤閫佽垂姒傚康锛堥潪闈㈠闈㈠洟鍚勮嚜缁撶畻锛 + if (isFace2Face) { + CreateOrderDTO.WorkerParam validWorker = (dto.getWorkerParam() != null && StringUtils.isNotBlank(dto.getWorkerParam().getWorkerId())) ? dto.getWorkerParam() : null; + group.setTotalDeliveryFee(calcTotalDeliveryFee(group.getWorkerCommission(), validWorker, gp.getTargetMembers())); + } + + mallOrderGroupMapper.insert(group); + // 淇濆瓨鍟嗗搧蹇収 + saveGoodsSnapshots(goodsSnapshots, order.getId()); + + // 鑻ュ鍗栵紝鍒涘缓鐙珛鎴栧叡鐢ㄩ厤閫佸崟锛堝垵濮嬬姸鎬 -1锛氬緟鏀粯/寰呮垚鍥級 + if (DELIVERY_TYPE_EXPRESS == dto.getDeliveryType()) { + createDeliveryOrder(order, dto, group.getId(), -1, isFace2Face ? group.getTotalDeliveryFee() : null); + } + + // 灏 groupId 鍏宠仈鍒拌鍗 (MallOrder 娌℃湁 groupId 瀛楁锛岄氳繃 MallOrderGroup 鍏宠仈宸茶冻澶) + + return buildVO(order, goodsSnapshots, group, null); + } + + /** + * 鍙傚洟 + */ + @Transactional(rollbackFor = Exception.class) + public MallOrderVO joinGroup(CreateOrderDTO dto, BigDecimal goodsAmount, + BigDecimal packageFee, List goodsSnapshots) { + MallOrderGroup group = mallOrderGroupMapper.selectById(dto.getGroupId()); + if (group == null) { + throw new RuntimeException("鎷煎洟涓嶅瓨鍦"); + } + if (group.getStatus() != GROUP_STATUS_FORMING && group.getStatus() != GROUP_STATUS_FACE2FACE) { + throw new RuntimeException("褰撳墠鎷煎洟鐘舵佷笉鍙弬鍥"); + } + if (group.getCurrentMembers() >= group.getTargetMembers()) { + throw new RuntimeException("鎷煎洟宸叉弧鍛"); + } + + boolean isFace2Face = (group.getStatus() == GROUP_STATUS_FACE2FACE); + + // 闈㈠闈㈠洟锛氫笉鍐嶉噸鏂拌绠楋紝鐩存帴浣跨敤鏍规嵁 targetMembers 鍧囨憡鐨勯噾棰 + BigDecimal deliveryFee = BigDecimal.ZERO; + if (isFace2Face && DELIVERY_TYPE_EXPRESS == dto.getDeliveryType()) { + deliveryFee = calcPersonalFee(group.getTotalDeliveryFee(), group.getTargetMembers()); + } else if (!isFace2Face && DELIVERY_TYPE_EXPRESS == dto.getDeliveryType()) { + // 鏅氭嫾鍥㈠弬鍥㈡椂鐙珛璁$畻涓汉閰嶉佽垂 + if (dto.getWorkerParam() != null && StringUtils.isNotBlank(dto.getWorkerParam().getWorkerId())) { + deliveryFee = dto.getWorkerParam().getOrderBkge() != null ? dto.getWorkerParam().getOrderBkge() : BigDecimal.ZERO; + } else { + if (dto.getWorkerParam() != null && dto.getWorkerParam().getOrderBkge() != null) { + deliveryFee = dto.getWorkerParam().getOrderBkge(); + } else if (dto.getGroupParam() != null && dto.getGroupParam().getSelfCommission() != null) { + deliveryFee = dto.getGroupParam().getSelfCommission(); + } + } + } + // 鍒涘缓鍙傚洟浜鸿鍗曪紙鍒濆鐘舵侊細寰呮敮浠橈級 + MallOrder order = buildBaseOrder(dto, ORDER_TYPE_GROUP, goodsAmount, deliveryFee, packageFee); + order.setStatus(STATUS_WAIT_PAY); + this.save(order); + + saveGoodsSnapshots(goodsSnapshots, order.getId()); + // 鏇存柊鎷煎洟浜烘暟鍜屾垚鍛樺垪琛 + int newMembers = group.getCurrentMembers() + 1; + String newOrderIds = group.getGroupOrderIds() + "," + order.getId(); + group.setCurrentMembers(newMembers); + group.setGroupOrderIds(newOrderIds); + + mallOrderGroupMapper.updateById(group); + + // 鏅氭嫾鍥㈠弬鍥紙闈為潰瀵归潰锛夛紝鑻ュ鍗栵紝涓哄弬鍥汉鍒涘缓鐙珛閰嶉佸崟锛堝垵濮嬬姸鎬 -1锛氬緟鏀粯/寰呮垚鍥級 + if (!isFace2Face && DELIVERY_TYPE_EXPRESS == dto.getDeliveryType()) { + createDeliveryOrder(order, dto, group.getId(), -1, null); + } + + return buildVO(order, goodsSnapshots, group, null); + } + + // ================================================================ + // 璁㈠崟鐢熷懡鍛ㄦ湡 + // ================================================================ + + @Override + @Transactional(rollbackFor = Exception.class) + public void shopAccept(String orderId) { + MallOrder order = getAndCheckOrder(orderId, STATUS_WAIT_PAY); + + if (DELIVERY_TYPE_EXPRESS == order.getDeliveryType()) { + // 澶栧崠锛氳繘鍏ュ緟閰嶉佸憳鎺ュ崟 + updateOrderStatus(orderId, STATUS_WAIT_DELIVERY); + } else { + // 鑷彇锛氳繘鍏ュ緟娑堣垂 + updateOrderStatus(orderId, STATUS_WAIT_PICKUP); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void paySuccess(String orderId) { + MallOrder order = this.getById(orderId); + if (order == null) throw new RuntimeException("璁㈠崟涓嶅瓨鍦"); + if (order.getStatus() != STATUS_WAIT_PAY) { + return; // 宸茬粡澶勭悊杩囨垨鐘舵佷笉瀵 + } + + if (order.getOrderType() == ORDER_TYPE_NORMAL) { + // 鐩磋喘鏀粯鎴愬姛 -> 璺宠繃寰呭晢瀹舵帴鍗曪紝鐩存帴杩涘叆寰呴厤閫佹垨寰呮秷璐 + if (DELIVERY_TYPE_EXPRESS == order.getDeliveryType()) { + updateOrderStatus(orderId, STATUS_WAIT_DELIVERY); + // 婵娲婚厤閫佸崟锛岀姸鎬佹敼涓哄緟鎺ュ崟(0) + LambdaUpdateWrapper duw = new LambdaUpdateWrapper<>(); + duw.eq(MallDeliveryOrder::getOrderId, orderId) + .set(MallDeliveryOrder::getStatus, 0); + mallDeliveryOrderMapper.update(null, duw); + } else { + updateOrderStatus(orderId, STATUS_WAIT_PICKUP); + } + } else if (order.getOrderType() == ORDER_TYPE_GROUP) { + // 鎷煎洟璁㈠崟鏀粯鎴愬姛 -> 鏀逛负寰呮垚鍥 + updateOrderStatus(orderId, STATUS_WAIT_GROUP); + + // 鏌ユ壘灞炰簬璇ヨ鍗曠殑鎷煎洟骞舵鏌ユ垚鍥㈡潯浠 + LambdaQueryWrapper gq = new LambdaQueryWrapper<>(); + gq.eq(MallOrderGroup::getHeadOrderId, orderId); + MallOrderGroup group = mallOrderGroupMapper.selectOne(gq); + if (group == null) { + // 濡傛灉涓嶆槸鍥㈤暱锛屾寜鍙傚洟浜烘煡鎵 + LambdaQueryWrapper gq2 = new LambdaQueryWrapper<>(); + gq2.eq(MallOrderGroup::getShopId, order.getShopId()) + .like(MallOrderGroup::getGroupOrderIds, order.getId()) + .last("LIMIT 1"); + group = mallOrderGroupMapper.selectOne(gq2); + } + if (group != null) { + mallOrderGroupService.checkAndActivateGroup(group.getId()); + } + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void shopReject(String orderId, String reason) { + MallOrder order = getById(orderId); + if (order == null) throw new RuntimeException("璁㈠崟涓嶅瓨鍦"); + updateOrderStatus(orderId, STATUS_CANCELLED); + // 鍏堝彇娑堢浉鍏崇殑閰嶉佸崟 + LambdaUpdateWrapper duw = new LambdaUpdateWrapper<>(); + duw.eq(MallDeliveryOrder::getOrderId, orderId) + .in(MallDeliveryOrder::getStatus, java.util.Arrays.asList(-1, 0)) + .set(MallDeliveryOrder::getStatus, 4); + mallDeliveryOrderMapper.update(null, duw); + // 鑷姩鐢熸垚閫娆捐褰 + createRefundRecord(order, order.getTotalAmount(), "鍟嗗鎷掑崟: " + reason); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void cancelOrder(String orderId, String userId) { + MallOrder order = getById(orderId); + if (order == null) throw new RuntimeException("璁㈠崟涓嶅瓨鍦"); + if (!userId.equals(order.getUserId())) throw new RuntimeException("鏃犳潈鎿嶄綔璇ヨ鍗"); + if (order.getStatus() != STATUS_WAIT_PAY && order.getStatus() != STATUS_WAIT_GROUP) { + throw new RuntimeException("褰撳墠璁㈠崟鐘舵佷笉鍏佽鍙栨秷"); + } + updateOrderStatus(orderId, STATUS_CANCELLED); + // 鍏堝彇娑堢浉鍏崇殑閰嶉佸崟 + LambdaUpdateWrapper duw = new LambdaUpdateWrapper<>(); + duw.eq(MallDeliveryOrder::getOrderId, orderId) + .in(MallDeliveryOrder::getStatus, java.util.Arrays.asList(-1, 0)) + .set(MallDeliveryOrder::getStatus, 4); + mallDeliveryOrderMapper.update(null, duw); + // 鑻ュ凡鏀粯锛堝緟鎴愬洟鐘舵侊級锛岀敓鎴愰娆捐褰 + if (order.getStatus() == STATUS_WAIT_GROUP) { + createRefundRecord(order, order.getTotalAmount(), "鐢ㄦ埛鍙栨秷鎷煎洟"); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void applyRefund(String orderId, String userId, String reason, BigDecimal amount) { + MallOrder order = getById(orderId); + if (order == null) throw new RuntimeException("璁㈠崟涓嶅瓨鍦"); + if (!userId.equals(order.getUserId())) throw new RuntimeException("鏃犳潈鎿嶄綔璇ヨ鍗"); + updateOrderStatus(orderId, STATUS_WAIT_REFUND); + createRefundRecord(order, amount, reason); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void agreeRefund(String orderId) { + MallOrder order = getAndCheckOrder(orderId, STATUS_WAIT_REFUND); + updateOrderStatus(orderId, STATUS_REFUNDED); + // 鏇存柊閫娆捐褰曚负鎴愬姛 + LambdaUpdateWrapper uw = new LambdaUpdateWrapper<>(); + uw.eq(MallRefundRecord::getOrderId, orderId) + .set(MallRefundRecord::getStatus, 1) + .set(MallRefundRecord::getSuccessTime, new Date()); + mallRefundRecordMapper.update(null, uw); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void rejectRefund(String orderId, String reason) { + getAndCheckOrder(orderId, STATUS_WAIT_REFUND); + // 閫娆炬嫆缁濓紝鎭㈠鍒板凡瀹屾垚锛堟垨寰呭晢瀹跺鐞嗙姸鎬侊級 + updateOrderStatus(orderId, STATUS_DONE); + // 鏇存柊閫娆捐褰曚负鎷掔粷 + LambdaUpdateWrapper uw = new LambdaUpdateWrapper<>(); + uw.eq(MallRefundRecord::getOrderId, orderId) + .set(MallRefundRecord::getStatus, 2); + mallRefundRecordMapper.update(null, uw); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void completeOrder(String orderId) { + MallOrder order = getById(orderId); + if (order == null) throw new RuntimeException("璁㈠崟涓嶅瓨鍦"); + if (order.getStatus() != STATUS_WAIT_PICKUP && order.getStatus() != STATUS_DELIVERING) { + throw new RuntimeException("褰撳墠鐘舵佷笉鍙畬鎴"); + } + updateOrderStatus(orderId, STATUS_DONE); + } + + @Override + public MallOrder selectMallOrderByGroupId(String groupId) { + return this.baseMapper.selectMallOrderByGroupId(groupId); + } + + // ================================================================ + // 鏌ヨ + // ================================================================ + + @Override + public IPage pageOrder(MallOrderPageQuery q) { + IPage page = new Page<>(q.getPageNum(), q.getPageSize()); + return this.baseMapper.selectPageVO(page, q); + } + + @Override + public MallOrderVO getOrderDetail(String orderId) { + MallOrder order = this.getById(orderId); + if (order == null) return null; + + MallOrderVO vo = new MallOrderVO(); + org.springframework.beans.BeanUtils.copyProperties(order, vo); + + // 鍟嗗搧鍒楄〃 + vo.setGoodsList(mallOrderGoodsMapper.selectByOrderId(orderId)); + + // 閰嶉佷俊鎭 + LambdaQueryWrapper dq = new LambdaQueryWrapper<>(); + dq.eq(MallDeliveryOrder::getOrderId, orderId).last("LIMIT 1"); + vo.setDeliveryInfo(mallDeliveryOrderMapper.selectOne(dq)); + + // 鎷煎洟淇℃伅锛堟嫾鍥㈣鍗曟墠鏌ワ級 + if (ORDER_TYPE_GROUP == order.getOrderType()) { + // 閫氳繃 headOrderId 鎴 groupUserIds 涓寘鍚 userId 鏌ユ壘鎷煎洟 + LambdaQueryWrapper gq = new LambdaQueryWrapper<>(); + // 鍥㈤暱璁㈠崟鍖归厤 headOrderId + gq.eq(MallOrderGroup::getHeadOrderId, orderId); + MallOrderGroup group = mallOrderGroupMapper.selectOne(gq); + if (group == null) { + // 鍙傚洟浜猴細閫氳繃 userId + shopId 鍖归厤 + LambdaQueryWrapper gq2 = new LambdaQueryWrapper<>(); + gq2.eq(MallOrderGroup::getShopId, order.getShopId()) + .like(MallOrderGroup::getGroupOrderIds, order.getId()) + .last("LIMIT 1"); + group = mallOrderGroupMapper.selectOne(gq2); + } + vo.setGroupInfo(group); + } + + return vo; + } + + // ================================================================ + // 绉佹湁宸ュ叿鏂规硶 + // ================================================================ + + /** + * 鎵e噺鍟嗗搧搴撳瓨锛堟洿鏂 attributeListPrice 涓殑 specNum锛 + */ + private void deductStock(Product product, int quantity) { + String attrJson = product.getAttributeListPrice(); + if (StringUtils.isBlank(attrJson)) throw new RuntimeException("鍟嗗搧瑙勬牸淇℃伅寮傚父"); + + try { + JSONArray arr = JSONUtil.parseArray(attrJson); + if (arr.isEmpty()) throw new RuntimeException("鍟嗗搧瑙勬牸淇℃伅寮傚父"); + JSONObject spec = arr.getJSONObject(0); + int current = spec.getInt("specNum"); + if (current < quantity) throw new RuntimeException("鍟嗗搧搴撳瓨涓嶈冻: " + product.getProductName()); + spec.set("specNum", current - quantity); + + LambdaUpdateWrapper uw = new LambdaUpdateWrapper<>(); + uw.eq(Product::getId, product.getId()) + .set(Product::getAttributeListPrice, arr.toString()); + productMapper.update(null, uw); + } catch (RuntimeException e) { + throw e; + } catch (Exception e) { + throw new RuntimeException("搴撳瓨鎵e噺澶辫触: " + e.getMessage()); + } + } + + /** + * 鏋勫缓鍩虹璁㈠崟瀵硅薄 + */ + private MallOrder buildBaseOrder(CreateOrderDTO dto, int orderType, BigDecimal goodsAmount, + BigDecimal deliveryFee, BigDecimal packageFee) { + MallOrder order = new MallOrder(); + order.setUserId(dto.getUserId()); + order.setShopId(dto.getShopId()); + order.setOrderType(orderType); + order.setDeliveryType(dto.getDeliveryType()); + order.setAddressId(dto.getAddressId()); + order.setGetAreaId(dto.getGetAreaId()); + order.setPutAreaId(dto.getPutAreaId()); + order.setGoodsAmount(goodsAmount); + order.setDeliveryFee(deliveryFee); + order.setPackageFee(packageFee); + order.setTotalAmount(goodsAmount.add(deliveryFee).add(packageFee)); + order.setRemark(dto.getRemark()); + order.setCreateTime(new Date()); + + // ---- 蹇収鏀惰揣浜轰俊鎭 ---- + if (StringUtils.isNotBlank(dto.getAddressId())) { + UserAddress addr = userAddressMapper.selectById(dto.getAddressId()); + if (addr != null) { + order.setReceiverName(addr.getReceiverName()); + order.setReceiverPhone(addr.getReceiverPhone()); + // 鍦板潃鍚堟垚锛氭ゼ搴+妤煎眰+闂ㄧ墝 + String addrStr = (addr.getAreaName() != null ? addr.getAreaName() : "") + + (addr.getFloor() != null ? " " + addr.getFloor() + "灞" : "") + + (addr.getRoomNum() != null ? " " + addr.getRoomNum() : ""); + order.setReceiverAddress(addrStr.trim()); + } + } + + // ---- 蹇収鍟嗗淇℃伅 ---- + if (StringUtils.isNotBlank(dto.getShopId())) { + Shop shop = shopMapper.selectById(dto.getShopId()); + if (shop != null) { + order.setShopName(shop.getShopName()); + order.setShopPhone(shop.getContactPhone()); + order.setShopAddress(shop.getShopAddress()); + } + } + + return order; + } + + /** + * 鎵归噺淇濆瓨鍟嗗搧蹇収 + */ + private void saveGoodsSnapshots(List snapshots, String orderId) { + for (MallOrderGoods snap : snapshots) { + snap.setOrderId(orderId); + mallOrderGoodsMapper.insert(snap); + } + } + + /** + * 鍒涘缓閰嶉佸崟 + * + * @param initialStatus 鍒濆鍖栫姸鎬侊紙-1: 寰呮敮浠樺緟鎴愬洟, 0: 寰呮帴鍗曪級 + */ + private void createDeliveryOrder(MallOrder order, CreateOrderDTO dto, String groupId, int initialStatus, BigDecimal overrideDeliveryFee) { + MallDeliveryOrder delivery = new MallDeliveryOrder(); + delivery.setOrderId(order.getId()); + delivery.setGroupId(groupId); + delivery.setShopId(dto.getShopId()); + delivery.setStatus(initialStatus); + delivery.setDeliveryType(1); // 澶栧崠鍗 + + // 鎬婚厤閫佽垂鏀惧叆 delivery + delivery.setDeliveryFee(overrideDeliveryFee != null ? overrideDeliveryFee : order.getDeliveryFee()); + delivery.setCreateTime(new Date()); + + if (dto.getMustFinishTime() != null) { + delivery.setMustFinishTime(dto.getMustFinishTime()); + } + + // 鎸囧畾閰嶉佸憳 + if (dto.getWorkerParam() != null && StringUtils.isNotBlank(dto.getWorkerParam().getWorkerId())) { + delivery.setWorkerId(dto.getWorkerParam().getWorkerId()); + if (order.getOrderType() == ORDER_TYPE_NORMAL) { + BigDecimal bonus = order.getGoodsAmount() + .multiply(new BigDecimal("0.02")) + .setScale(2, RoundingMode.DOWN); + delivery.setDeliveryFeeMarketplace(bonus); + } + } + + // 鍙栬揣鍖哄煙ID锛堝晢鎴锋墍鍦ㄥ尯鍩燂紝鍓嶇蹇呬紶锛 + delivery.setGetAreaId(dto.getGetAreaId()); + + // 閫佽揣鍖哄煙ID锛氫紭鍏堜娇鐢ㄥ墠绔紶鍏ュ硷紝鍏滃簳浠庡湴鍧琛ㄦ煡璇 + if (StringUtils.isNotBlank(dto.getPutAreaId())) { + delivery.setPutAreaId(dto.getPutAreaId()); + } else if (StringUtils.isNotBlank(dto.getAddressId())) { + UserAddress addr = userAddressMapper.selectById(dto.getAddressId()); + if (addr != null) { + delivery.setPutAreaId(addr.getAreaId()); + } + } + + // ---- 蹇収瀛楁锛氫粠璁㈠崟澶嶅埗鏀惰揣浜哄強鍟嗗淇℃伅 ---- + delivery.setReceiverName(order.getReceiverName()); + delivery.setReceiverPhone(order.getReceiverPhone()); + delivery.setReceiverAddress(order.getReceiverAddress()); + delivery.setShopName(order.getShopName()); + delivery.setShopPhone(order.getShopPhone()); + delivery.setShopAddress(order.getShopAddress()); + + mallDeliveryOrderMapper.insert(delivery); + } + + /** + * 璁$畻鎬婚厤閫佽垂锛堥潰瀵归潰鍥笓鐢級 + */ + private BigDecimal calcTotalDeliveryFee(BigDecimal selfCommission, + CreateOrderDTO.WorkerParam workerParam, int members) { + if (workerParam != null && workerParam.getOrderBkge() != null) { + // 鎸囧畾閰嶉佸憳锛氬熀纭 + 棰濆锛堜汉鏁>2鏃舵瘡澶氫竴浜+0.5锛夋槸鐢ㄦ埛鎵挎媴鐨勬婚厤閫佽垂 + BigDecimal extra = members > 2 + ? new BigDecimal(members - 2).multiply(new BigDecimal("0.5")) + : BigDecimal.ZERO; + return workerParam.getOrderBkge().add(extra); + } else if (selfCommission != null) { + // 涓嶆寚瀹氶厤閫佸憳锛氬洟闀胯瀹氫剑閲 + return selfCommission; + } + return BigDecimal.ZERO; + } + + /** + * 浠 group 鏋勫缓 WorkerParam锛堝凡瀛樺洟鐢級 + */ + private CreateOrderDTO.WorkerParam buildWorkerParam(MallOrderGroup group) { + CreateOrderDTO.WorkerParam wp = new CreateOrderDTO.WorkerParam(); + wp.setWorkerId(group.getWorkerId()); + wp.setOrderBkge(group.getWorkerCommission()); + return wp; + } + + /** + * 閰嶉佽垂鍒嗘憡锛氬悜涓婂彇鏁翠繚鐣2浣嶅皬鏁 + */ + private BigDecimal calcPersonalFee(BigDecimal totalFee, int members) { + if (members <= 0) return totalFee; + BigDecimal result = totalFee + .divide(new BigDecimal(members), 2, RoundingMode.CEILING); + return result; + } + + /** + * 鏇存柊璁㈠崟鐘舵 + */ + private void updateOrderStatus(String orderId, int status) { + LambdaUpdateWrapper uw = new LambdaUpdateWrapper<>(); + uw.eq(MallOrder::getId, orderId).set(MallOrder::getStatus, status); + this.update(uw); + } + + /** + * 鑾峰彇璁㈠崟骞舵牎楠岀姸鎬 + */ + private MallOrder getAndCheckOrder(String orderId, int expectedStatus) { + MallOrder order = this.getById(orderId); + if (order == null) throw new RuntimeException("璁㈠崟涓嶅瓨鍦"); + if (order.getStatus() != expectedStatus) { + throw new RuntimeException("璁㈠崟鐘舵佷笉姝g‘锛屽綋鍓嶇姸鎬: " + order.getStatus()); + } + return order; + } + + /** + * 鍒涘缓閫娆捐褰 + */ + private void createRefundRecord(MallOrder order, BigDecimal amount, String reason) { + MallRefundRecord record = new MallRefundRecord(); + record.setOrderId(order.getId()); + record.setUserId(order.getUserId()); + record.setRefundAmount(amount); + record.setReason(reason); + record.setStatus(0); // 寰呭晢瀹跺悓鎰 + record.setCreateTime(new Date()); + mallRefundRecordMapper.insert(record); + } + + /** + * 鏋勫缓杩斿洖 VO + */ + private MallOrderVO buildVO(MallOrder order, List goods, + MallOrderGroup group, MallDeliveryOrder delivery) { + MallOrderVO vo = new MallOrderVO(); + org.springframework.beans.BeanUtils.copyProperties(order, vo); + vo.setGoodsList(goods); + vo.setGroupInfo(group); + vo.setDeliveryInfo(delivery); + return vo; + } +} diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallRefundRecordServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallRefundRecordServiceImpl.java new file mode 100644 index 00000000..79aec7bc --- /dev/null +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallRefundRecordServiceImpl.java @@ -0,0 +1,15 @@ +package cc.hiver.mall.serviceimpl.mybatis; + +import cc.hiver.mall.dao.mapper.MallRefundRecordMapper; +import cc.hiver.mall.entity.MallRefundRecord; +import cc.hiver.mall.service.mybatis.MallRefundRecordService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + * 閫娆捐褰 Service 瀹炵幇 + */ +@Service +public class MallRefundRecordServiceImpl extends ServiceImpl + implements MallRefundRecordService { +} diff --git a/hiver-modules/hiver-mall/src/main/resources/mapper/MallDeliveryOrderMapper.xml b/hiver-modules/hiver-mall/src/main/resources/mapper/MallDeliveryOrderMapper.xml new file mode 100644 index 00000000..d38580b6 --- /dev/null +++ b/hiver-modules/hiver-mall/src/main/resources/mapper/MallDeliveryOrderMapper.xml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/hiver-modules/hiver-mall/src/main/resources/mapper/MallOrderGoodsMapper.xml b/hiver-modules/hiver-mall/src/main/resources/mapper/MallOrderGoodsMapper.xml new file mode 100644 index 00000000..84dbbb6b --- /dev/null +++ b/hiver-modules/hiver-mall/src/main/resources/mapper/MallOrderGoodsMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/hiver-modules/hiver-mall/src/main/resources/mapper/MallOrderGroupMapper.xml b/hiver-modules/hiver-mall/src/main/resources/mapper/MallOrderGroupMapper.xml new file mode 100644 index 00000000..7de0045e --- /dev/null +++ b/hiver-modules/hiver-mall/src/main/resources/mapper/MallOrderGroupMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/hiver-modules/hiver-mall/src/main/resources/mapper/MallOrderMapper.xml b/hiver-modules/hiver-mall/src/main/resources/mapper/MallOrderMapper.xml new file mode 100644 index 00000000..f72ee9ff --- /dev/null +++ b/hiver-modules/hiver-mall/src/main/resources/mapper/MallOrderMapper.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/hiver-modules/hiver-mall/src/main/resources/mapper/MallRefundRecordMapper.xml b/hiver-modules/hiver-mall/src/main/resources/mapper/MallRefundRecordMapper.xml new file mode 100644 index 00000000..1a53108a --- /dev/null +++ b/hiver-modules/hiver-mall/src/main/resources/mapper/MallRefundRecordMapper.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + diff --git a/hiver-modules/hiver-mall/src/main/resources/mapper/ShopMapper.xml b/hiver-modules/hiver-mall/src/main/resources/mapper/ShopMapper.xml index 06e85e49..8c181539 100644 --- a/hiver-modules/hiver-mall/src/main/resources/mapper/ShopMapper.xml +++ b/hiver-modules/hiver-mall/src/main/resources/mapper/ShopMapper.xml @@ -41,6 +41,7 @@ + @@ -49,7 +50,7 @@ id, create_by, create_time, del_flag, update_by, update_time, shop_name, shop_owner_id, shop_manger_id, region, region_id, shop_area, shop_area_title, shop_type, shop_type_title, shop_address, year_fee, charge_time, start_time, end_time, status, remark, business_district_level, contact_phone, shop_icon, defaulted, ali_account, ali_name, -rebate_amount, attr_id, printing_method,shop_images,shop_lename,shop_lecard,shop_score,isbrandflag,subtitle,shoprank,sale_count +rebate_amount, attr_id, printing_method,shop_images,shop_lename,shop_lecard,shop_score,isbrandflag,subtitle,shoprank,sale_count,is_student remark @@ -70,11 +71,11 @@ rebate_amount, attr_id, printing_method,shop_images,shop_lename,shop_lecard,shop insert into t_shop (id, create_by, create_time, del_flag, update_by, update_time, shop_name, shop_owner_id, shop_manger_id, region, region_id, shop_area, shop_area_title, shop_type, shop_type_title, shop_address, year_fee, charge_time, start_time, end_time, status, remark, business_district_level, contact_phone, shop_icon, defaulted, ali_account, ali_name, - rebate_amount, attr_id, printing_method, shop_images, shop_lename, shop_lecard, shop_score, isbrandflag, subtitle,shoprank, sale_count) + rebate_amount, attr_id, printing_method, shop_images, shop_lename, shop_lecard, shop_score, isbrandflag, subtitle,shoprank, sale_count,is_student) values (#{id,jdbcType=VARCHAR}, #{createBy,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP}, #{delFlag,jdbcType=INTEGER}, #{updateBy,jdbcType=VARCHAR}, #{updateTime,jdbcType=TIMESTAMP}, #{shopName,jdbcType=VARCHAR}, #{shopOwnerId,jdbcType=VARCHAR}, #{shopMangerId,jdbcType=VARCHAR}, #{region,jdbcType=VARCHAR}, #{regionId,jdbcType=VARCHAR}, #{shopArea,jdbcType=VARCHAR}, #{shopAreaTitle,jdbcType=VARCHAR}, #{shopType,jdbcType=VARCHAR}, #{shopTypeTitle,jdbcType=VARCHAR}, #{shopAddress,jdbcType=VARCHAR}, #{yearFee,jdbcType=VARCHAR}, #{chargeTime,jdbcType=VARCHAR}, #{startTime,jdbcType=VARCHAR}, #{endTime,jdbcType=VARCHAR}, #{status,jdbcType=INTEGER}, #{remark,jdbcType=LONGVARCHAR}, #{businessDistrictLevel,jdbcType=VARCHAR}, #{contactPhone,jdbcType=VARCHAR}, #{shopIcon,jdbcType=VARCHAR}, #{defaulted,jdbcType=INTEGER}, #{aliAccount,jdbcType=VARCHAR}, #{aliName,jdbcType=VARCHAR}, - #{rebateAmount,jdbcType=VARCHAR}, #{attrId,jdbcType=VARCHAR}, #{printingMethod,jdbcType=VARCHAR}, #{shopImages,jdbcType=VARCHAR}, #{shopLename,jdbcType=VARCHAR}, #{shopLecard,jdbcType=VARCHAR}, #{shopScore,jdbcType=DECIMAL}, #{isbrandflag,jdbcType=INTEGER}, #{subtitle,jdbcType=VARCHAR}, #{shoprank,jdbcType=INTEGER}, #{saleCount,jdbcType=INTEGER}) + #{rebateAmount,jdbcType=VARCHAR}, #{attrId,jdbcType=VARCHAR}, #{printingMethod,jdbcType=VARCHAR}, #{shopImages,jdbcType=VARCHAR}, #{shopLename,jdbcType=VARCHAR}, #{shopLecard,jdbcType=VARCHAR}, #{shopScore,jdbcType=DECIMAL}, #{isbrandflag,jdbcType=INTEGER}, #{subtitle,jdbcType=VARCHAR}, #{shoprank,jdbcType=INTEGER}, #{saleCount,jdbcType=INTEGER}, #{isStudent,jdbcType=INTEGER}) insert into t_shop @@ -172,6 +173,9 @@ rebate_amount, attr_id, printing_method,shop_images,shop_lename,shop_lecard,shop sale_count, + + is_student + @@ -267,6 +271,9 @@ rebate_amount, attr_id, printing_method,shop_images,shop_lename,shop_lecard,shop #{saleCount,jdbcType=INTEGER}, + + #{isStudent,jdbcType=INTEGER}, + @@ -362,6 +369,9 @@ rebate_amount, attr_id, printing_method,shop_images,shop_lename,shop_lecard,shop sale_count = #{saleCount,jdbcType=INTEGER}, + + is_student = #{isStudent,jdbcType=INTEGER}, + where id = #{id,jdbcType=VARCHAR} @@ -396,7 +406,8 @@ rebate_amount, attr_id, printing_method,shop_images,shop_lename,shop_lecard,shop isbrandflag = #{isbrandflag,jdbcType=INTEGER}, subtitle = #{subtitle,jdbcType=VARCHAR}, shoprank = #{shoprank,jdbcType=INTEGER}, - sale_count = #{saleCount,jdbcType=INTEGER} + sale_count = #{saleCount,jdbcType=INTEGER}, + is_student = #{isStudent,jdbcType=INTEGER} where id = #{id,jdbcType=VARCHAR} @@ -438,7 +449,8 @@ rebate_amount, attr_id, printing_method,shop_images,shop_lename,shop_lecard,shop isbrandflag = #{isbrandflag,jdbcType=INTEGER}, subtitle = #{subtitle,jdbcType=VARCHAR}, shoprank = #{shoprank,jdbcType=INTEGER}, - sale_count = #{saleCount,jdbcType=INTEGER} + sale_count = #{saleCount,jdbcType=INTEGER}, + is_student = #{isStudent,jdbcType=INTEGER} where id = #{id,jdbcType=VARCHAR}