diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/controller/DiyCityController.java b/ruoyi-system/src/main/java/com/ruoyi/system/controller/DiyCityController.java index 732e8c7..67337fa 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/controller/DiyCityController.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/controller/DiyCityController.java @@ -26,6 +26,8 @@ import com.ruoyi.system.service.IDiyCityService; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.common.core.page.TableDataInfo; import java.util.Objects; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * 自定义地区Controller @@ -37,6 +39,8 @@ import java.util.Objects; @RequestMapping("/system/DiyCity") public class DiyCityController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(DiyCityController.class); + @Autowired private IDiyCityService diyCityService; @@ -70,36 +74,61 @@ public class DiyCityController extends BaseController @PreAuthorize("@ss.hasPermi('system:DiyCity:query')") @GetMapping("/getTreeData") public AjaxResult getTreeData() { - List list = diyCityService.selectDiyCityList(new DiyCity()); + try { + List list = diyCityService.selectDiyCityList(new DiyCity()); + + if (list == null || list.isEmpty()) { + return success(new ArrayList<>()); + } - List> rootList = new ArrayList<>(); - for (DiyCity city : list) { - Long parentId = city.getParentId(); - Long id = Long.valueOf(city.getId()); - // 一级节点 - if (parentId == null || parentId == 0L) { + // 使用Map优化查找性能 + Map> nodeMap = new HashMap<>(); + List> rootList = new ArrayList<>(); + + // 第一步:创建所有节点 + for (DiyCity city : list) { Map node = toMap(city); - // 组装children - List> children = new ArrayList<>(); - for (DiyCity child : list) { - Long childParentId = child.getParentId(); - if (id != null && Objects.equals(id, childParentId)) { - children.add(toMap(child)); + node.put("children", new ArrayList<>()); + nodeMap.put(city.getId().longValue(), node); + } + + // 第二步:构建树形结构 + for (DiyCity city : list) { + Long parentId = city.getParentId(); + Long id = city.getId().longValue(); + + if (parentId == null || parentId == 0L) { + // 根节点 + rootList.add(nodeMap.get(id)); + } else { + // 子节点,添加到父节点的children中 + Map parentNode = nodeMap.get(parentId); + if (parentNode != null) { + @SuppressWarnings("unchecked") + List> children = (List>) parentNode.get("children"); + children.add(nodeMap.get(id)); } } - node.put("children", children); - rootList.add(node); } + + return success(rootList); + } catch (Exception e) { + logger.error("获取树形数据失败", e); + return error("获取树形数据失败: " + e.getMessage()); } - return success(rootList); } private Map toMap(DiyCity city) { Map map = new HashMap<>(); map.put("id", city.getId()); map.put("label", city.getTitle()); + map.put("title", city.getTitle()); // 兼容前端 map.put("parentId", city.getParentId()); - // 其他字段按需添加 + map.put("order", city.getOrder()); + map.put("lat", city.getLat()); + map.put("lng", city.getLng()); + map.put("createdAt", city.getCreatedAt()); + map.put("updatedAt", city.getUpdatedAt()); return map; } /** @@ -122,7 +151,34 @@ public class DiyCityController extends BaseController @GetMapping(value = "/{id}") public AjaxResult getInfo(@PathVariable("id") Integer id) { - return success(diyCityService.selectDiyCityById(id)); + try { + DiyCity diyCity = diyCityService.selectDiyCityById(id); + if (diyCity == null) { + return error("地区不存在"); + } + return success(diyCity); + } catch (Exception e) { + logger.error("获取地区详情失败", e); + return error("获取地区详情失败: " + e.getMessage()); + } + } + + /** + * 获取指定地区的子地区列表 + */ + @PreAuthorize("@ss.hasPermi('system:DiyCity:query')") + @GetMapping("/children/{parentId}") + public AjaxResult getChildren(@PathVariable("parentId") Long parentId) + { + try { + DiyCity query = new DiyCity(); + query.setParentId(parentId); + List children = diyCityService.selectDiyCityList(query); + return success(children); + } catch (Exception e) { + logger.error("获取子地区列表失败", e); + return error("获取子地区列表失败: " + e.getMessage()); + } } /** @@ -133,7 +189,26 @@ public class DiyCityController extends BaseController @PostMapping public AjaxResult add(@RequestBody DiyCity diyCity) { - return toAjax(diyCityService.insertDiyCity(diyCity)); + try { + // 验证必填字段 + if (diyCity.getTitle() == null || diyCity.getTitle().trim().isEmpty()) { + return error("地区名称不能为空"); + } + + // 检查同级下是否有重名 + DiyCity query = new DiyCity(); + query.setParentId(diyCity.getParentId()); + query.setTitle(diyCity.getTitle()); + List existing = diyCityService.selectDiyCityList(query); + if (existing != null && !existing.isEmpty()) { + return error("同级下已存在相同名称的地区"); + } + + return toAjax(diyCityService.insertDiyCity(diyCity)); + } catch (Exception e) { + logger.error("新增自定义地区失败", e); + return error("新增失败: " + e.getMessage()); + } } /** @@ -144,7 +219,38 @@ public class DiyCityController extends BaseController @PutMapping public AjaxResult edit(@RequestBody DiyCity diyCity) { - return toAjax(diyCityService.updateDiyCity(diyCity)); + try { + // 验证必填字段 + if (diyCity.getId() == null) { + return error("地区ID不能为空"); + } + if (diyCity.getTitle() == null || diyCity.getTitle().trim().isEmpty()) { + return error("地区名称不能为空"); + } + + // 检查是否将父级设置为自己或自己的子级(防止循环引用) + if (diyCity.getParentId() != null && diyCity.getParentId().equals(diyCity.getId().longValue())) { + return error("不能将父级设置为自己"); + } + + // 检查同级下是否有重名(排除自己) + DiyCity query = new DiyCity(); + query.setParentId(diyCity.getParentId()); + query.setTitle(diyCity.getTitle()); + List existing = diyCityService.selectDiyCityList(query); + if (existing != null && !existing.isEmpty()) { + for (DiyCity item : existing) { + if (!item.getId().equals(diyCity.getId())) { + return error("同级下已存在相同名称的地区"); + } + } + } + + return toAjax(diyCityService.updateDiyCity(diyCity)); + } catch (Exception e) { + logger.error("修改自定义地区失败", e); + return error("修改失败: " + e.getMessage()); + } } /** @@ -155,7 +261,20 @@ public class DiyCityController extends BaseController @DeleteMapping("/{ids}") public AjaxResult remove(@PathVariable Integer[] ids) { - return toAjax(diyCityService.deleteDiyCityByIds(ids)); + try { + // 检查是否有子节点 + for (Integer id : ids) { + List children = diyCityService.selectDiyCityList(new DiyCity() {{ setParentId(id.longValue()); }}); + if (children != null && !children.isEmpty()) { + return error("无法删除地区ID " + id + ",该地区下还有子地区,请先删除子地区"); + } + } + + return toAjax(diyCityService.deleteDiyCityByIds(ids)); + } catch (Exception e) { + logger.error("删除自定义地区失败", e); + return error("删除失败: " + e.getMessage()); + } } /** diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/controller/GoodsOrderController.java b/ruoyi-system/src/main/java/com/ruoyi/system/controller/GoodsOrderController.java index 6947f70..98b1008 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/controller/GoodsOrderController.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/controller/GoodsOrderController.java @@ -113,6 +113,15 @@ public class GoodsOrderController extends BaseController { for (GoodsOrder order : orders) { if (order.getProductId() != null) { try { + UsersPayBefor usersPayBefor = usersPayBeforService.selectUsersPayBeforByOrderId(order.getMainOrderId()); + if (usersPayBefor != null) { + order.setWxmoney(usersPayBefor.getWxmoney()); + order.setYemoney(usersPayBefor.getYemoney()); + order.setMembermoney(usersPayBefor.getMembermoney()); + order.setCouponmoney(usersPayBefor.getCouponmoney()); + order.setReturnmoney(usersPayBefor.getReturnmoney()); + } + ServiceGoods serviceGoods = serviceGoodsService.selectServiceGoodsById(order.getProductId()); if (serviceGoods != null) { // 补充商品详细信息 @@ -227,7 +236,14 @@ public class GoodsOrderController extends BaseController { goodsOrderdata.setDeliveryName(siteDelivery.getTitle()); } } - + UsersPayBefor usersPayBefor = usersPayBeforService.selectUsersPayBeforByOrderId(goodsOrderdata.getMainOrderId()); + if (usersPayBefor != null) { + goodsOrderdata.setWxmoney(usersPayBefor.getWxmoney()); + goodsOrderdata.setYemoney(usersPayBefor.getYemoney()); + goodsOrderdata.setMembermoney(usersPayBefor.getMembermoney()); + goodsOrderdata.setCouponmoney(usersPayBefor.getCouponmoney()); + goodsOrderdata.setReturnmoney(usersPayBefor.getReturnmoney()); + } Users users = usersService.selectUsersById(goodsOrderdata.getUid()); if (users != null) { goodsOrderdata.setUname(users.getName()); diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/controller/OrderController.java b/ruoyi-system/src/main/java/com/ruoyi/system/controller/OrderController.java index f358d3d..1feedf1 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/controller/OrderController.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/controller/OrderController.java @@ -409,7 +409,10 @@ public class OrderController extends BaseController { logJson.put("type",9); orderdata.setLogJson(logJson.toJSONString()); orderdata.setJsonStatus(0); - orderdata.setFileData(order.getFileData()); + if(StringUtils.isNotBlank(order.getFileData())){ + orderdata.setFileData(AppletControllerUtil.convertToJSONArray(order.getFileData()).toJSONString()); + } + //orderdata.setFileData(order.getFileData()); orderdata.setOdertype(0); orderdata.setReamk(order.getReamk()); orderdata.setBigtype(1); diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/controllerUtil/ScheduledTaskUtil.java b/ruoyi-system/src/main/java/com/ruoyi/system/controllerUtil/ScheduledTaskUtil.java index 6a04d27..3adec90 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/controllerUtil/ScheduledTaskUtil.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/controllerUtil/ScheduledTaskUtil.java @@ -126,6 +126,7 @@ public class ScheduledTaskUtil implements CommandLineRunner { cleanupSystemData(); healthCheck(); updateWorkerMoneyLook(); + DispatchWorkerForOrder(); autoResumeWorkerOrderStatus(); // 添加师傅暂停状态自动恢复任务 log.info("定时任务自动执行完成"); } @@ -139,7 +140,7 @@ public class ScheduledTaskUtil implements CommandLineRunner { * 师傅收益7天定时冻结的解冻 * 每10分钟执行一次 */ - @Scheduled(fixedRate = 10 * 60 * 1000) // 每10分钟执行一次 + @Scheduled(fixedRate = 20 * 60 * 1000) // 每10分钟执行一次 public void updateWorkerMoneyLook() { String taskName = "订单状态超时检查"; long startTime = System.currentTimeMillis(); @@ -156,6 +157,32 @@ public class ScheduledTaskUtil implements CommandLineRunner { + /** + * 派单10分钟一次对没有派单的进行派单 + * 每10分钟执行一次 + */ + @Scheduled(fixedRate = 10 * 60 * 1000) // 每10分钟执行一次 + public void DispatchWorkerForOrder() { + String taskName = "订单派单检查并重新派单"; + long startTime = System.currentTimeMillis(); + try { + Order order = new Order(); + order.setStatus(1L); + order.setIsAccept(0); + order.setQiangdan("1"); + List orders = orderService.selectOrderList(order); + for (Order orderdata : orders) { + DispatchUtil.dispatchOrder(orderdata.getId()); + } + + } catch (Exception e) { + log.error("{}任务执行失败", taskName, e); + updateTaskStatistics(taskName, false, System.currentTimeMillis() - startTime); + } + } + + + /** * 订单派单超时处理任务 * 每5分钟执行一次,检查派单超过20分钟的订单 diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/controllerUtil/WorkerCommissionUtil.java b/ruoyi-system/src/main/java/com/ruoyi/system/controllerUtil/WorkerCommissionUtil.java index 0cceb1f..dada01a 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/controllerUtil/WorkerCommissionUtil.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/controllerUtil/WorkerCommissionUtil.java @@ -834,7 +834,7 @@ public class WorkerCommissionUtil { BigDecimal newCommission = currentCommission.add(finalCommissionWithDoorFee); worker.setCommission(newCommission); //累计分佣 - worker.setTotalComm(worker.getTotalComm().add(newCommission)); + worker.setTotalComm(worker.getTotalComm().add(finalCommissionWithDoorFee)); // 5. 更新师傅信息 int updateResult = usersService.updateUsers(worker); diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/GoodsOrder.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/GoodsOrder.java index d672e0b..6591647 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/GoodsOrder.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/GoodsOrder.java @@ -117,6 +117,10 @@ public class GoodsOrder extends BaseEntity /** 排序 */ private Integer forserviceid; + private BigDecimal wxmoney; + private BigDecimal yemoney; + private BigDecimal membermoney; + private BigDecimal couponmoney; /** 支付时间 */ @JsonFormat(pattern = "yyyy-MM-dd") @@ -753,6 +757,38 @@ public class GoodsOrder extends BaseEntity this.deliveryName = deliveryName; } + public BigDecimal getCouponmoney() { + return couponmoney; + } + + public void setCouponmoney(BigDecimal couponmoney) { + this.couponmoney = couponmoney; + } + + public BigDecimal getMembermoney() { + return membermoney; + } + + public void setMembermoney(BigDecimal membermoney) { + this.membermoney = membermoney; + } + + public BigDecimal getYemoney() { + return yemoney; + } + + public void setYemoney(BigDecimal yemoney) { + this.yemoney = yemoney; + } + + public BigDecimal getWxmoney() { + return wxmoney; + } + + public void setWxmoney(BigDecimal wxmoney) { + this.wxmoney = wxmoney; + } + @Override public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) diff --git a/ruoyi-system/src/main/resources/mapper/system/ServiceCateMapper.xml b/ruoyi-system/src/main/resources/mapper/system/ServiceCateMapper.xml index 00da2df..55055ea 100644 --- a/ruoyi-system/src/main/resources/mapper/system/ServiceCateMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/system/ServiceCateMapper.xml @@ -32,13 +32,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and parent_id=#{parentId} and JSON_CONTAINS(city, #{city}) - order by parent_id ASC, sort ASC + order by sort ASC @@ -46,21 +46,21 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" diff --git a/ruoyi-system/src/main/resources/mapper/system/ServiceGoodsMapper.xml b/ruoyi-system/src/main/resources/mapper/system/ServiceGoodsMapper.xml index 5d9ee78..5d2d446 100644 --- a/ruoyi-system/src/main/resources/mapper/system/ServiceGoodsMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/system/ServiceGoodsMapper.xml @@ -86,7 +86,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and isgroup = #{isgroup} - order by id desc + order by sort ASC @@ -97,7 +97,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{id} - order by created_at desc + order by sort ASC diff --git a/ruoyi-ui/src/api/system/DiyCity.js b/ruoyi-ui/src/api/system/DiyCity.js index f28c178..7fcab78 100644 --- a/ruoyi-ui/src/api/system/DiyCity.js +++ b/ruoyi-ui/src/api/system/DiyCity.js @@ -55,7 +55,7 @@ export function delDiyCity(id) { // 查询城市树结构 export function getDiyCityTree() { return request({ - url: '/system/DiyCity/tree', + url: '/system/DiyCity/getTreeData', method: 'get' }) } diff --git a/ruoyi-ui/src/views/system/AdvImg/index.vue b/ruoyi-ui/src/views/system/AdvImg/index.vue index 9bdb8b9..7d6309c 100644 --- a/ruoyi-ui/src/views/system/AdvImg/index.vue +++ b/ruoyi-ui/src/views/system/AdvImg/index.vue @@ -290,7 +290,7 @@ export default { }, handlefenleiStatusChange(row) { let text = row.status === "0" ? "启用" : "停用" - this.$modal.confirm('确认要"' + text + '""' + row.title + '"状态吗?').then(function() { + this.$modal.confirm('确认要操作' + row.title + '状态吗?').then(function() { return changefenleiStatus(row.id, row.status) }).then(() => { this.$modal.msgSuccess(text + "成功") diff --git a/ruoyi-ui/src/views/system/DiyCity/index.vue b/ruoyi-ui/src/views/system/DiyCity/index.vue index 8c1fbc4..0d26e27 100644 --- a/ruoyi-ui/src/views/system/DiyCity/index.vue +++ b/ruoyi-ui/src/views/system/DiyCity/index.vue @@ -87,7 +87,7 @@