diff --git a/hiver-admin/test-output/test-report.html b/hiver-admin/test-output/test-report.html index 5b9d2be8..95420d57 100644 --- a/hiver-admin/test-output/test-report.html +++ b/hiver-admin/test-output/test-report.html @@ -35,7 +35,7 @@ Hiver
  • -四月 18, 2026 14:58:33 +四月 19, 2026 15:11:39
  • @@ -84,7 +84,7 @@

    passTest

    -

    14:58:34 下午 / 0.017 secs

    +

    15:11:39 下午 / 0.015 secs

    @@ -92,9 +92,9 @@
    #test-id=1
    passTest
    -04.18.2026 14:58:34 -04.18.2026 14:58:34 -0.017 secs +04.19.2026 15:11:39 +04.19.2026 15:11:39 +0.015 secs
    @@ -104,7 +104,7 @@ Pass - 14:58:34 + 15:11:39 Test passed @@ -128,13 +128,13 @@

    Started

    -

    四月 18, 2026 14:58:33

    +

    四月 19, 2026 15:11:39

    Ended

    -

    四月 18, 2026 14:58:34

    +

    四月 19, 2026 15:11:39

    diff --git a/hiver-core/src/main/java/cc/hiver/core/common/constant/SettingConstant.java b/hiver-core/src/main/java/cc/hiver/core/common/constant/SettingConstant.java index c2a68111..c12fddb3 100644 --- a/hiver-core/src/main/java/cc/hiver/core/common/constant/SettingConstant.java +++ b/hiver-core/src/main/java/cc/hiver/core/common/constant/SettingConstant.java @@ -101,10 +101,14 @@ public interface SettingConstant { SMS_ACTIVITI, // 鏃犱汉鎺ュ崟鐢ㄦ埛閫氱煡 SMS_NO_ORDER, + //閰嶉佸憳涓嬬嚎 + SMS_WORKEROUT, // 鎷掔粷鎺ュ崟閫氱煡 SMS_REJECT_ORDER, // 琚寚瀹氭湭澶勭悊閫氱煡 - SMS_TIMEOUT + SMS_TIMEOUT, + //璁㈠崟閫娆 + SMS_ORDERRETURN } /** diff --git a/hiver-core/src/main/java/cc/hiver/core/entity/Worker.java b/hiver-core/src/main/java/cc/hiver/core/entity/Worker.java index 9b670646..f5593495 100644 --- a/hiver-core/src/main/java/cc/hiver/core/entity/Worker.java +++ b/hiver-core/src/main/java/cc/hiver/core/entity/Worker.java @@ -67,6 +67,13 @@ public class Worker implements Serializable { @ApiModelProperty("鎺ュ崟鐘舵 1-鍙姠鍗 2-涓嶅彲鎺ュ崟() 3-宸茬鐢(鎵嬪伐棰勭疆鐘舵)") private Integer workerStatus = 1; + /** + * 閰嶉佸崟閲 + */ + @Column(name = "order_count") + @ApiModelProperty("閰嶉佸崟閲") + private Integer orderCount = 1; + @ApiModelProperty("閰嶉佸憳鍒涘缓浜") @CreatedBy diff --git a/hiver-core/src/main/java/cc/hiver/core/serviceimpl/WorkerServiceImpl.java b/hiver-core/src/main/java/cc/hiver/core/serviceimpl/WorkerServiceImpl.java index 9520c456..8dd05eb5 100644 --- a/hiver-core/src/main/java/cc/hiver/core/serviceimpl/WorkerServiceImpl.java +++ b/hiver-core/src/main/java/cc/hiver/core/serviceimpl/WorkerServiceImpl.java @@ -63,6 +63,8 @@ public class WorkerServiceImpl implements WorkerService { final Path workerIdField = root.get("workerId"); final Path workerNameField = root.get("workerName"); final Path workerStatusField = root.get("workerStatus"); + final Path regionField = root.get("region"); + final Path getPushOrderField = root.get("getPushOrder"); final Path mobileField = root.get("mobile"); final Path createTimeField = root.get("createTime"); //final Path signPersonField = root.get("signPerson"); @@ -75,7 +77,9 @@ public class WorkerServiceImpl implements WorkerService { if (CharSequenceUtil.isNotBlank(worker.getWorkerId())) { list.add(cb.equal(workerIdField, worker.getWorkerId())); } - + if (CharSequenceUtil.isNotBlank(worker.getRegion())) { + list.add(cb.equal(regionField, worker.getRegion())); + } if (CharSequenceUtil.isNotBlank(worker.getUserId())) { list.add(cb.equal(userIdField, worker.getUserId())); } @@ -101,6 +105,11 @@ public class WorkerServiceImpl implements WorkerService { list.add(cb.equal(isOnLineField, worker.getIsOnLine())); } + // 鏄惁鎺ユ敹鎸囨淳鍗曠姸鎬 + if (worker.getGetPushOrder() != null) { + list.add(cb.equal(getPushOrderField, worker.getGetPushOrder())); + } + // 妯$硦鎼滅礌 // 鏍规嵁閰嶉佸憳濮撳悕鍙婄數璇濓紝妯$硦鍖归厤 if (CharSequenceUtil.isNotEmpty(worker.getSearchStr())) { diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/AdminMallOrderGroupController.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/AdminMallOrderGroupController.java new file mode 100644 index 00000000..b27b3ea4 --- /dev/null +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/AdminMallOrderGroupController.java @@ -0,0 +1,106 @@ +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.entity.MallOrderGroup; +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.extension.plugins.pagination.Page; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +@Slf4j +@RestController +@Api(tags = "鍚庡彴绠$悊绯荤粺鎷煎洟鏁版嵁鎺ュ彛") +@RequestMapping("/hiver/mall/admin/orderGroup") +public class AdminMallOrderGroupController { + + @Autowired + private MallOrderGroupService mallOrderGroupService; + + @Autowired + private MallOrderService mallOrderService; + + @Data + public static class OrderGroupQuery { + private String shopId; + private String headUserId; + private Integer status; + private String productName; + private Integer isFace; + private int pageNumber = 1; + private int pageSize = 10; + } + + @PostMapping("/page") + @ApiOperation(value = "鍒嗛〉鏌ヨ鎷煎洟鍒楄〃") + public Result> page(@RequestBody OrderGroupQuery query) { + LambdaQueryWrapper qw = new LambdaQueryWrapper<>(); + if (StringUtils.isNotBlank(query.getShopId())) { + qw.eq(MallOrderGroup::getShopId, query.getShopId()); + } + if (StringUtils.isNotBlank(query.getHeadUserId())) { + qw.eq(MallOrderGroup::getHeadUserId, query.getHeadUserId()); + } + if (query.getStatus() != null) { + qw.eq(MallOrderGroup::getStatus, query.getStatus()); + } + if (StringUtils.isNotBlank(query.getProductName())) { + qw.like(MallOrderGroup::getProductName, query.getProductName()); + } + if (query.getIsFace() != null) { + qw.eq(MallOrderGroup::getIsFace, query.getIsFace()); + } + qw.orderByDesc(MallOrderGroup::getCreateTime); + + Page page = new Page<>(query.getPageNumber(), query.getPageSize()); + Page result = mallOrderGroupService.page(page, qw); + return new ResultUtil>().setData(result); + } + + @Data + public static class OrderGroupDetailVo { + private MallOrderGroup group; + private List childOrders; + } + + @GetMapping("/detail/{id}") + @ApiOperation(value = "鑾峰彇鎷煎洟璇︽儏") + public Result detail(@PathVariable("id") String id) { + MallOrderGroup group = mallOrderGroupService.getById(id); + if (group == null) { + return ResultUtil.error("鎷煎洟涓嶅瓨鍦"); + } + + OrderGroupDetailVo vo = new OrderGroupDetailVo(); + vo.setGroup(group); + + // 鑾峰彇鎷煎洟鐨勫瓙璁㈠崟 + if (StringUtils.isNotBlank(group.getGroupOrderIds())) { + List orderIds = Arrays.asList(group.getGroupOrderIds().split(",")); + if (!orderIds.isEmpty()) { + LambdaQueryWrapper oqw = new LambdaQueryWrapper<>(); + oqw.in(MallOrder::getId, orderIds); + List childOrders = mallOrderService.list(oqw); + vo.setChildOrders(childOrders); + } else { + vo.setChildOrders(new ArrayList<>()); + } + } else { + vo.setChildOrders(new ArrayList<>()); + } + + return new ResultUtil().setData(vo); + } +} diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/CommentController.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/CommentController.java index 603b6805..8bfabcc5 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/CommentController.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/CommentController.java @@ -16,12 +16,19 @@ limitations under the License. package cc.hiver.mall.controller; import cc.hiver.core.common.constant.ShopConstant; +import cc.hiver.core.common.redis.RedisTemplateHelper; import cc.hiver.core.common.utils.ResultUtil; import cc.hiver.core.common.utils.StringUtils; import cc.hiver.core.common.vo.Result; +import cc.hiver.core.entity.Worker; +import cc.hiver.core.serviceimpl.WorkerServiceImpl; import cc.hiver.mall.entity.Comment; +import cc.hiver.mall.entity.Shop; +import cc.hiver.mall.pojo.dto.ShopCacheDTO; import cc.hiver.mall.pojo.query.CommentQuery; import cc.hiver.mall.service.CommentService; +import cc.hiver.mall.service.ShopService; +import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -29,6 +36,8 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -47,6 +56,15 @@ public class CommentController { @Autowired private CommentService commentService; + @Autowired + private ShopService shopService; + + @Autowired + private RedisTemplateHelper redisTemplateHelper; + + @Autowired + private WorkerServiceImpl workerServiceImpl; + @RequestMapping(value = "/save", method = RequestMethod.POST) @ApiOperation("淇濆瓨") public Result save( @RequestBody List comment) { @@ -57,6 +75,53 @@ public class CommentController { }else{ e.setLevel(ShopConstant.SHOP_STATUS_NORMAL); } + if(e.getShopId().toUpperCase().startsWith("W")){ + //鏇存柊閰嶉佸憳璇勫垎 + Worker worker = workerServiceImpl.findByWorkerId(e.getShopId()); + Integer oldCount = worker.getOrderCount(); + BigDecimal oldScore = worker.getScore(); + BigDecimal score = e.getScore(); + + // 1. 鏇存柊鍗曢噺 + int newCount = oldCount + 1; + + // 2. 璁$畻鏂拌瘎鍒嗭細(鏃ф诲垎 + 鏈璇勫垎) / 鏂板崟閲 + BigDecimal newScore = oldScore.multiply(new BigDecimal(oldCount)) + .add(score) + .divide(new BigDecimal(newCount), 2, RoundingMode.HALF_UP); // 淇濈暀2浣嶅皬鏁 + + worker.setScore(newScore); + + // 3. 淇濆瓨鏇存柊 + workerServiceImpl.update(worker); + + }else{ + //鏇存柊搴楅摵璇勫垎 + Shop shop = shopService.findById(e.getShopId()); + Integer oldSaleCount = shop.getSaleCount() + 1; + BigDecimal oldScore = shop.getShopScore(); + BigDecimal score = e.getScore(); + + int newCount = oldSaleCount + 1; + + // 2. 璁$畻鏂拌瘎鍒嗭細(鏃ф诲垎 + 鏈璇勫垎) / 鏂板崟閲 + BigDecimal newScore = oldScore.multiply(new BigDecimal(oldSaleCount)) + .add(score) + .divide(new BigDecimal(newCount), 2, RoundingMode.HALF_UP); // 淇濈暀2浣嶅皬鏁 + + shop.setShopScore(newScore); + shopService.update(shop); + + String shopCacheKey = "SHOP_CACHE:" + shop.getRegionId(); + String shopJson = (String) redisTemplateHelper.hGet(shopCacheKey, shop.getId()); + if (org.apache.commons.lang3.StringUtils.isNotBlank(shopJson)) { + ShopCacheDTO cacheDTO = JSONUtil.toBean(shopJson, ShopCacheDTO.class); + if (cacheDTO.getShop() != null) { + cacheDTO.getShop().setShopScore(newScore); + redisTemplateHelper.hPut(shopCacheKey, shop.getId(), JSONUtil.toJsonStr(cacheDTO)); + } + } + } }); if(comment != null && comment.get(0).getParentId()!=null){ Comment commentPar = commentService.getById(comment.get(0).getParentId()); diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/ShopController.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/ShopController.java index 66a66d23..cecf29c8 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/ShopController.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/ShopController.java @@ -251,7 +251,7 @@ public class ShopController { } } //宸茬鐢 - if(s.getStatus() < 1){ + if(s.getStatus() < 1 && CharSequenceUtil.isBlank(shop.getShopIcon())){ continue; } if (CharSequenceUtil.isNotBlank(shop.getShopType())) { 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 478d0f49..3ec41620 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 @@ -126,7 +126,7 @@ public class WorkerController { @RequestMapping(value = "/admin/edit", method = RequestMethod.POST) @ApiOperation(value = "淇敼閰嶉佸憳淇℃伅", notes = "闇瑕侀氳繃涓嬪崟缂栧彿鑾峰彇璁㈠崟淇℃伅") - public Result edit(Worker u) { + public Result edit(@RequestBody Worker u) { if (StrUtil.isNotBlank(u.getRegion())) { ShopArea d = shopAreaService.get(u.getRegion()); 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 index 4c138143..1bd5d691 100644 --- 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 @@ -21,6 +21,9 @@ public class MallDeliveryOrderPageQuery extends HiverBasePageQuery { @ApiModelProperty("搴楅摵ID") private String shopId; + @ApiModelProperty("搴楅摵name") + private String shopName; + @ApiModelProperty("閰嶉佺姸鎬 0:寰呮帴鍗 1:寰呭彇璐 2:閰嶉佷腑 3:宸查佽揪 4:宸插彇娑") private Integer status; 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 index b98004e2..972aa0f8 100644 --- 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 @@ -15,6 +15,9 @@ public class MallOrderPageQuery extends HiverBasePageQuery { @ApiModelProperty("鐢ㄦ埛ID") private String userId; + @ApiModelProperty("鐢ㄦ埛鐢佃瘽") + private String receiverPhone; + @ApiModelProperty("搴楅摵ID") private String shopId; 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 26f75774..5fe81ced 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 @@ -117,6 +117,7 @@ public class ShopServiceImpl implements ShopService { final Path regionField = root.get("regionId"); final Path shopAreaField = root.get("shopArea"); final Path isStudentField = root.get("isStudent"); + final Path statusField = root.get("status"); final List list = new ArrayList<>(); @@ -147,6 +148,9 @@ public class ShopServiceImpl implements ShopService { if (CharSequenceUtil.isNotBlank(shop.getShopName())) { list.add(cb.like(ShopNameField, '%' + shop.getShopName() + '%')); } + if (CharSequenceUtil.isBlank(shop.getShopIcon())) { + list.add(cb.notEqual(statusField, 0)); + } if (CharSequenceUtil.isNotBlank(shop.getRegionId())) { list.add(cb.equal(regionField, shop.getRegionId())); } 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 index 03f6fa55..b3ab1db8 100644 --- 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 @@ -31,6 +31,8 @@ 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.sql.Timestamp; import java.time.LocalDateTime; import java.time.ZoneId; @@ -325,7 +327,21 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl 鍘绘帀 workerId 杩涘叆鎶㈠崟澶у巺锛屼繚鐣欏師鏈夎ˉ璐撮噾 delivery.setWorkerId(""); + smsUtil.sendCode(delivery.getReceiverPhone(), null, SettingConstant.SMS_TYPE.SMS_WORKEROUT.name()); } } 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 index 7cf1c463..2db42df0 100644 --- 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 @@ -1,7 +1,11 @@ package cc.hiver.mall.serviceimpl.mybatis; +import cc.hiver.core.common.constant.SettingConstant; import cc.hiver.core.common.redis.RedisTemplateHelper; +import cc.hiver.core.common.sms.SmsUtil; +import cc.hiver.core.common.utils.SecurityUtil; import cc.hiver.core.common.utils.SnowFlakeUtil; +import cc.hiver.core.entity.User; import cc.hiver.core.serviceimpl.JPushServiceImpl; import cc.hiver.mall.dao.mapper.*; import cc.hiver.mall.entity.*; @@ -90,9 +94,15 @@ public class MallOrderServiceImpl extends ServiceImpl qw = new LambdaQueryWrapper<>(); + qw.eq(MallDeliveryOrder::getOrderId, orderId); + MallDeliveryOrder delivery = mallDeliveryOrderMapper.selectOne(qw); mallDeliveryOrderService.addDeliveryFee(order,delivery, totalFee,order.getDeliveryFee()); } } @@ -1229,9 +1241,11 @@ public class MallOrderServiceImpl extends ServiceImpl qw = new LambdaQueryWrapper<>(); + qw.eq(MallDeliveryOrder::getOrderId, order.getId()); + MallDeliveryOrder delivery = mallDeliveryOrderMapper.selectOne(qw); + smsUtil.sendCode(delivery.getWorkerPhone(), null, SettingConstant.SMS_TYPE.SMS_ORDERRETURN.name()); + } + } List goodsList = mallOrderGoodsMapper.selectByOrderId(order.getId()); if (goodsList == null || goodsList.isEmpty()) return; diff --git a/hiver-modules/hiver-mall/src/main/resources/mapper/MallDeliveryOrderMapper.xml b/hiver-modules/hiver-mall/src/main/resources/mapper/MallDeliveryOrderMapper.xml index ee05d285..1384b957 100644 --- a/hiver-modules/hiver-mall/src/main/resources/mapper/MallDeliveryOrderMapper.xml +++ b/hiver-modules/hiver-mall/src/main/resources/mapper/MallDeliveryOrderMapper.xml @@ -65,6 +65,11 @@ AND d.shop_id = #{q.shopId} + + and ( + d.shop_name like concat('%',#{q.shopName},'%') + ) + AND d.status = #{q.status} @@ -122,7 +127,7 @@ d.is_big,d.is_return,d.worker_name,d.arrive_time,d.new_worker FROM mall_delivery_order d - d.status not in (-1,4,0) + d.status not in (-1,4) AND d.region_id = #{q.regionId} diff --git a/hiver-modules/hiver-mall/src/main/resources/mapper/MallOrderMapper.xml b/hiver-modules/hiver-mall/src/main/resources/mapper/MallOrderMapper.xml index cb116a26..ef992c7d 100644 --- a/hiver-modules/hiver-mall/src/main/resources/mapper/MallOrderMapper.xml +++ b/hiver-modules/hiver-mall/src/main/resources/mapper/MallOrderMapper.xml @@ -98,6 +98,11 @@ AND o.user_id = #{q.userId} + + and ( + o.receiver_phone like concat('%',#{q.receiverPhone},'%') + ) + and ( o.shop_name like concat('%',#{q.shopName},'%')