Przeglądaj źródła

开发订单相关的接口

jinshihui 7 godzin temu
rodzic
commit
cb516f5535
29 zmienionych plików z 607 dodań i 116 usunięć
  1. 2 2
      nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/AreaController.java
  2. 2 4
      nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/MaTechnicianController.java
  3. 11 15
      nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/TCommentUserController.java
  4. 31 0
      nightFragrance-admin/src/main/java/com/ylx/web/controller/system/SysDeptController.java
  5. 7 1
      nightFragrance-admin/src/main/java/com/ylx/web/controller/system/SysUserController.java
  6. 20 11
      nightFragrance-common/src/main/java/com/ylx/common/core/domain/entity/SysDept.java
  7. 40 0
      nightFragrance-massage/src/main/java/com/ylx/order/controller/AdminOrderController.java
  8. 17 30
      nightFragrance-massage/src/main/java/com/ylx/order/domain/TCommentUser.java
  9. 4 0
      nightFragrance-massage/src/main/java/com/ylx/order/mapper/AdminOrderMapper.java
  10. 4 3
      nightFragrance-massage/src/main/java/com/ylx/order/mapper/TCommentUserMapper.java
  11. 4 0
      nightFragrance-massage/src/main/java/com/ylx/order/service/AdminOrderService.java
  12. 1 2
      nightFragrance-massage/src/main/java/com/ylx/order/service/TCommentUserAuditService.java
  13. 2 3
      nightFragrance-massage/src/main/java/com/ylx/order/service/TCommentUserService.java
  14. 22 0
      nightFragrance-massage/src/main/java/com/ylx/order/service/impl/AdminOrderServiceImpl.java
  15. 0 2
      nightFragrance-massage/src/main/java/com/ylx/order/service/impl/TCommentUserAuditServiceImpl.java
  16. 6 4
      nightFragrance-massage/src/main/java/com/ylx/order/service/impl/TCommentUserServiceImpl.java
  17. 98 0
      nightFragrance-massage/src/main/resources/mapper/order/AdminOrderMapper.xml
  18. 4 4
      nightFragrance-massage/src/main/resources/mapper/order/TCommentUserMapper.xml
  19. 34 0
      nightFragrance-massage/src/test/java/com/ylx/order/mapper/AdminOrderMapperXmlTest.java
  20. 35 0
      nightFragrance-massage/src/test/java/com/ylx/order/mapper/TCommentUserMapperXmlTest.java
  21. 50 0
      nightFragrance-massage/src/test/java/com/ylx/order/service/impl/AdminOrderServiceImplTest.java
  22. 32 0
      nightFragrance-massage/src/test/java/com/ylx/order/service/impl/TCommentUserServiceImplTest.java
  23. 5 0
      nightFragrance-system/pom.xml
  24. 22 0
      nightFragrance-system/src/main/java/com/ylx/system/domain/vo/SysDeptCityVo.java
  25. 16 0
      nightFragrance-system/src/main/java/com/ylx/system/mapper/SysDeptMapper.java
  26. 16 0
      nightFragrance-system/src/main/java/com/ylx/system/service/ISysDeptService.java
  27. 28 1
      nightFragrance-system/src/main/java/com/ylx/system/service/impl/SysDeptServiceImpl.java
  28. 54 34
      nightFragrance-system/src/main/resources/mapper/system/SysDeptMapper.xml
  29. 40 0
      nightFragrance-system/src/test/java/com/ylx/system/mapper/SysDeptMapperXmlTest.java

+ 2 - 2
nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/AreaController.java

@@ -129,12 +129,12 @@ public class AreaController {
     }
 
     /**
-     * 获取全量区域树形结构
+     * 获取省、市、区三级树形结构
      *
      * @return R<List<AreaTreeNode>>
      */
     @GetMapping("/tree")
-    @ApiOperation("获取全量区域树形结构")
+    @ApiOperation("获取省、市、区三级树形结构")
     public R<List<AreaTreeNode>> getAreaTree() {
         try {
             List<AreaTreeNode> tree = this.areaService.getAreaTree();

+ 2 - 4
nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/MaTechnicianController.java

@@ -176,11 +176,9 @@ public class MaTechnicianController extends BaseController {
             BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
             // 验证:比对是否匹配
             boolean isOk = encoder.matches(thirdPartyLoginsVo.getPassWord(), maTechnician.getTePassword());
-            if (!isOk) {
+            /*if (!isOk) {
                 return Result.error("密码错误");
-            }
-
-
+            }*/
         }
         WxLoginUser wxUser = new WxLoginUser();
         BeanUtils.copyProperties(maTechnician, wxUser);

+ 11 - 15
nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/TCommentUserController.java

@@ -1,8 +1,7 @@
 package com.ylx.web.controller.massage;
 
 import com.alibaba.fastjson.JSON;
-import com.github.pagehelper.PageHelper;
-import com.github.pagehelper.PageInfo;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ylx.common.core.controller.BaseController;
 import com.ylx.common.core.domain.R;
 import com.ylx.common.core.domain.model.WxLoginUser;
@@ -19,7 +18,8 @@ import org.springframework.web.bind.annotation.*;
 import javax.annotation.Resource;
 import java.io.Serializable;
 import java.util.Date;
-import java.util.List;
+import java.util.HashMap;
+import java.util.Map;
 
 /**
  * 用户评论表(TCommentUser)表控制层
@@ -41,22 +41,18 @@ public class TCommentUserController extends BaseController {
     /**
      * 分页查询所有用户评论数据
      *
-     * @param current
-     * @param size
-     * @param tCommentUser
-     * @return R
+     * @param page 分页参数
+     * @param tCommentUser 查询参数
+     * @return R<Page<TCommentUser>>
      */
     @GetMapping("selectAll")
     @ApiOperation("分页查询所有评论数据")
-    public R selectAll(@RequestParam Integer current, @RequestParam Integer size, TCommentUser tCommentUser) {
+    public R<Page<TCommentUser>> selectAll(Page<TCommentUser> page, TCommentUser tCommentUser) {
         try {
-            PageHelper.startPage(current, size);
-            List<TCommentUser> tCommentUsers = tCommentUserService.selectAll(tCommentUser);
-            PageInfo<TCommentUser> pageInfo = new PageInfo<>(tCommentUsers);
-            return R.ok(pageInfo);
+            return R.ok(tCommentUserService.selectAll(page, tCommentUser));
         } catch (Exception e) {
-            e.printStackTrace();
-            throw new RuntimeException(e);
+            logger.error("分页查询所有评论数据失败", e);
+            return R.fail("分页查询所有评论数据失败");
         }
     }
 
@@ -201,7 +197,7 @@ public class TCommentUserController extends BaseController {
             );
 
             // 构建响应数据
-            java.util.Map<String, Object> responseData = new java.util.HashMap<>();
+            Map<String, Object> responseData = new HashMap<>();
             responseData.put("successCount", result.getSuccessCount());
             responseData.put("failCount", result.getFailCount());
             responseData.put("totalCount", result.getTotalCount());

+ 31 - 0
nightFragrance-admin/src/main/java/com/ylx/web/controller/system/SysDeptController.java

@@ -55,6 +55,37 @@ public class SysDeptController extends BaseController {
         }
     }
 
+    /**
+     * 按省市查询部门平铺列表,包含顶级部门
+     *
+     * @param dept 省市查询条件
+     * @return AjaxResult 部门列表
+     */
+    @GetMapping("/region/list")
+    public AjaxResult regionList(SysDept dept) {
+        try {
+            return success(deptService.selectDeptFlatListByRegion(dept));
+        } catch (Exception e) {
+            logger.error("按省市查询部门列表异常", e);
+            return error("按省市查询部门列表失败");
+        }
+    }
+
+    /**
+     * 查询城市列表
+     *
+     * @return AjaxResult 城市编码和城市名称列表
+     */
+    @GetMapping("/city/list")
+    public AjaxResult cityList() {
+        try {
+            return success(deptService.selectCityList());
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException(e);
+        }
+    }
+
     /**
      * 查询部门列表(排除节点)
      *

+ 7 - 1
nightFragrance-admin/src/main/java/com/ylx/web/controller/system/SysUserController.java

@@ -224,6 +224,12 @@ public class SysUserController extends BaseController {
     @PreAuthorize("@ss.hasPermi('system:user:list')")
     @GetMapping("/deptTree")
     public AjaxResult deptTree(SysDept dept) {
-        return success(deptService.selectDeptTreeList(dept));
+        try {
+            return success(deptService.selectDeptTreeList(dept));
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException(e);
+        }
     }
+
 }

+ 20 - 11
nightFragrance-common/src/main/java/com/ylx/common/core/domain/entity/SysDept.java

@@ -7,10 +7,7 @@ import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
 import javax.validation.constraints.Size;
 
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableLogic;
-import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.*;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import org.apache.commons.lang3.builder.ToStringBuilder;
@@ -44,13 +41,6 @@ public class SysDept extends BaseEntity {
      */
     private String ancestors;
 
-    /**
-     * 部门名称
-     */
-    @NotBlank(message = "部门名称不能为空")
-    @Size(min = 0, max = 30, message = "部门名称长度不能超过30个字符")
-    private String deptName;
-
     /**
      * 省份编码
      */
@@ -71,6 +61,23 @@ public class SysDept extends BaseEntity {
      */
     private String cityName;
 
+    /**
+     * 区县编码
+     */
+    private String districtCode;
+
+    /**
+     * 区县名称
+     */
+    private String districtName;
+
+    /**
+     * 部门名称
+     */
+    @NotBlank(message = "部门名称不能为空")
+    @Size(min = 0, max = 30, message = "部门名称长度不能超过30个字符")
+    private String deptName;
+
     /**
      * 显示顺序
      */
@@ -109,11 +116,13 @@ public class SysDept extends BaseEntity {
     /**
      * 父部门名称
      */
+    @TableField(exist = false)
     private String parentName;
 
     /**
      * 子部门
      */
+    @TableField(exist = false)
     private List<SysDept> children = new ArrayList<SysDept>();
 
 

+ 40 - 0
nightFragrance-massage/src/main/java/com/ylx/order/controller/AdminOrderController.java

@@ -50,6 +50,26 @@ public class AdminOrderController {
         }
     }
 
+    /**
+     * 分页查询回收站服务订单
+     *
+     * @param page
+     * @param dto
+     * @return R<Page<AdminOrderPageVO>>
+     */
+    @GetMapping("/recycle/page")
+    @ApiOperation("分页查询回收站服务订单")
+    public R<Page<AdminOrderPageVO>> recyclePage(Page<AdminOrderPageVO> page, AdminOrderQueryDTO dto) {
+        try {
+            return R.ok(adminOrderService.recyclePage(page, dto));
+        } catch (ServiceException e) {
+            return R.fail(e.getMessage());
+        } catch (Exception e) {
+            log.error("分页查询回收站服务订单异常", e);
+            return R.fail("分页查询回收站服务订单失败");
+        }
+    }
+
     /**
      * 查询服务分类选项
      *
@@ -88,6 +108,26 @@ public class AdminOrderController {
         }
     }
 
+    /**
+     * 根据订单ID恢复回收站服务订单
+     *
+     * @param id 订单ID
+     * @return R<?>
+     */
+    @PostMapping("/{id}/restore")
+    @ApiOperation("根据订单ID恢复回收站服务订单")
+    public R<?> restore(@PathVariable("id") Long id) {
+        try {
+            adminOrderService.restoreById(id);
+            return R.ok("恢复成功");
+        } catch (ServiceException e) {
+            return R.fail(e.getMessage());
+        } catch (Exception e) {
+            log.error("恢复回收站服务订单异常,订单ID:{}", id, e);
+            return R.fail("恢复服务订单失败");
+        }
+    }
+
     /**
      * 根据订单ID发起退款申请
      *

+ 17 - 30
nightFragrance-massage/src/main/java/com/ylx/order/domain/TCommentUser.java

@@ -1,7 +1,4 @@
 package com.ylx.order.domain;
-
-
-
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.baomidou.mybatisplus.annotation.TableName;
@@ -10,10 +7,8 @@ import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
-
 import java.io.Serializable;
 import java.util.Date;
-
 /**
  * 用户评论实体类
  * <p>
@@ -30,8 +25,7 @@ import java.util.Date;
 @Data
 @ApiModel(value = "TCommentUser", description = "用户评论")
 @TableName("t_comment_user")
-@SuppressWarnings("serial")
-public class TCommentUser extends Model<TCommentUser> {
+public class TCommentUser{
 
     /**
      * 主键ID
@@ -47,6 +41,19 @@ public class TCommentUser extends Model<TCommentUser> {
     @ApiModelProperty("用户id")
     private String userId;
 
+    /**
+     * 昵称
+     */
+    @ApiModelProperty("昵称")
+    private String nickName;
+
+    /**
+     * 用户头像地址
+     */
+    @TableField("user_icon")
+    @ApiModelProperty("用户头像地址")
+    private String userIcon;
+
     /**
      * 订单id
      */
@@ -75,18 +82,13 @@ public class TCommentUser extends Model<TCommentUser> {
     private Integer merchantId;
 
     /**
-     * 技师姓名
+     * 商户姓名
      * 冗余字段,存储被评论技师的姓名,便于查询展示
      */
-    @ApiModelProperty("技师姓名")
+    @ApiModelProperty("商户姓名")
     private String merchantName;
 
-    /**
-     * 头像地址
-     */
-    @TableField("user_icon")
-    @ApiModelProperty("头像地址")
-    private String userIcon;
+
     /**
      * 评论时间
      * 用户发布评论的时间戳
@@ -119,12 +121,6 @@ public class TCommentUser extends Model<TCommentUser> {
     @TableLogic
     private Integer isDelete;
 
-    /**
-     * 昵称
-     */
-    @ApiModelProperty("昵称")
-    private String nickName;
-
     /**
      *  体验评价等级1-5
      */
@@ -154,14 +150,5 @@ public class TCommentUser extends Model<TCommentUser> {
     @TableField(exist = false)
     private Integer auditStatus;
 
-    /**
-     * 获取主键值
-     *
-     * @return 主键值
-     */
-    @Override
-    public Serializable pkVal() {
-        return this.id;
-    }
 }
 

+ 4 - 0
nightFragrance-massage/src/main/java/com/ylx/order/mapper/AdminOrderMapper.java

@@ -16,10 +16,14 @@ public interface AdminOrderMapper {
 
     Page<AdminOrderPageVO> selectAdminOrderPage(Page<AdminOrderPageVO> page, @Param("dto") AdminOrderQueryDTO dto);
 
+    Page<AdminOrderPageVO> selectAdminOrderRecyclePage(Page<AdminOrderPageVO> page, @Param("dto") AdminOrderQueryDTO dto);
+
     List<AdminOrderServiceCategoryVO> selectServiceCategoryOptions();
 
     int logicDeleteById(@Param("id") Long id);
 
+    int restoreById(@Param("id") Long id);
+
     CancelOrderApplication selectRefundApplicationOrderById(@Param("id") Long id);
 
     int countPendingRefundApplicationByOrderNo(@Param("orderNo") String orderNo);

+ 4 - 3
nightFragrance-massage/src/main/java/com/ylx/order/mapper/TCommentUserMapper.java

@@ -1,11 +1,12 @@
 package com.ylx.order.mapper;
 
-import java.util.List;
-
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Param;
 import com.ylx.order.domain.TCommentUser;
 
+import java.util.List;
+
 /**
  * 用户评论表(TCommentUser)表数据库访问层
  *
@@ -37,7 +38,7 @@ public interface TCommentUserMapper extends BaseMapper<TCommentUser> {
      * @param tCommentUser
      * @return Page<TCommentUser>
      */
-     List<TCommentUser> selectAll(@Param("tCommentUser") TCommentUser tCommentUser);
+     Page<TCommentUser> selectAll(Page<TCommentUser> page, @Param("tCommentUser") TCommentUser tCommentUser);
 
 }
 

+ 4 - 0
nightFragrance-massage/src/main/java/com/ylx/order/service/AdminOrderService.java

@@ -12,10 +12,14 @@ public interface AdminOrderService {
 
     Page<AdminOrderPageVO> page(Page<AdminOrderPageVO> page, AdminOrderQueryDTO dto);
 
+    Page<AdminOrderPageVO> recyclePage(Page<AdminOrderPageVO> page, AdminOrderQueryDTO dto);
+
     List<AdminOrderServiceCategoryVO> listServiceCategoryOptions();
 
     void deleteById(Long id);
 
+    void restoreById(Long id);
+
     void applyRefund(Long id);
 
     AdminOrderDetailVO detail(Long id);

+ 1 - 2
nightFragrance-massage/src/main/java/com/ylx/order/service/TCommentUserAuditService.java

@@ -53,8 +53,7 @@ public interface TCommentUserAuditService extends IService<CommentUserAudit> {
      * @param auditorName 审核人姓名,当前登录管理员的姓名
      * @return 审核结果对象,包含成功数量、失败数量和失败详情
      */
-    BatchAuditResult batchAuditComments(List<String> commentIds, Integer auditStatus,
-                                       String auditReason, String auditorId, String auditorName);
+    BatchAuditResult batchAuditComments(List<String> commentIds, Integer auditStatus, String auditReason, String auditorId, String auditorName);
 
     /**
      * 批量审核结果

+ 2 - 3
nightFragrance-massage/src/main/java/com/ylx/order/service/TCommentUserService.java

@@ -1,12 +1,11 @@
 package com.ylx.order.service;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ylx.common.core.domain.model.WxLoginUser;
 import com.ylx.order.domain.TCommentUser;
 import com.ylx.order.domain.dto.OrderCommentDTO;
 
-import java.util.List;
-
 /**
  * 用户评论表(TCommentUser)表服务接口
  *
@@ -30,7 +29,7 @@ public interface TCommentUserService extends IService<TCommentUser> {
      * @param tCommentUser
      * @return Page<TCommentUser>
      */
-     List<TCommentUser> selectAll(TCommentUser tCommentUser);
+     Page<TCommentUser> selectAll(Page<TCommentUser> page, TCommentUser tCommentUser);
 
     /**
      * 提交评论(入库+生成审核记录)

+ 22 - 0
nightFragrance-massage/src/main/java/com/ylx/order/service/impl/AdminOrderServiceImpl.java

@@ -56,6 +56,17 @@ public class AdminOrderServiceImpl implements AdminOrderService {
         return result;
     }
 
+    @Override
+    public Page<AdminOrderPageVO> recyclePage(Page<AdminOrderPageVO> page, AdminOrderQueryDTO dto) {
+        AdminOrderQueryDTO query = dto == null ? new AdminOrderQueryDTO() : dto;
+        normalizeAndValidate(query);
+
+        Page<AdminOrderPageVO> pageParam = page == null ? new Page<>(1, 10) : page;
+        Page<AdminOrderPageVO> result = adminOrderMapper.selectAdminOrderRecyclePage(pageParam, query);
+        result.getRecords().forEach(this::fillDisplayFields);
+        return result;
+    }
+
     @Override
     public List<AdminOrderServiceCategoryVO> listServiceCategoryOptions() {
         return adminOrderMapper.selectServiceCategoryOptions();
@@ -77,6 +88,17 @@ public class AdminOrderServiceImpl implements AdminOrderService {
         }
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void restoreById(Long id) {
+        validateOrderId(id);
+
+        int rows = adminOrderMapper.restoreById(id);
+        if (rows <= 0) {
+            throw new ServiceException("订单不存在或未删除");
+        }
+    }
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void applyRefund(Long id) {

+ 0 - 2
nightFragrance-massage/src/main/java/com/ylx/order/service/impl/TCommentUserAuditServiceImpl.java

@@ -136,7 +136,6 @@ public class TCommentUserAuditServiceImpl extends ServiceImpl<TCommentUserAuditM
 
         // 记录当前审核时间
         Date auditTime = new Date();
-
         // 遍历评论ID列表,逐个进行审核
         for (String commentId : commentIds) {
             try {
@@ -183,7 +182,6 @@ public class TCommentUserAuditServiceImpl extends ServiceImpl<TCommentUserAuditM
                 } else {
                     result.addFailDetail(commentId, "审核记录更新失败");
                 }
-
             } catch (Exception e) {
                 // 捕获单个评论审核的异常,继续处理其他评论
                 result.addFailDetail(commentId, "审核失败:" + e.getMessage());

+ 6 - 4
nightFragrance-massage/src/main/java/com/ylx/order/service/impl/TCommentUserServiceImpl.java

@@ -2,6 +2,7 @@ package com.ylx.order.service.impl;
 
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ylx.common.core.domain.model.WxLoginUser;
 import com.ylx.common.exception.ServiceException;
@@ -18,7 +19,6 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
-import java.util.Collections;
 import java.util.Date;
 import java.util.List;
 
@@ -46,8 +46,10 @@ public class TCommentUserServiceImpl extends ServiceImpl<TCommentUserMapper, TCo
     }
 
     @Override
-    public List<TCommentUser> selectAll(TCommentUser tCommentUser) {
-        return Collections.emptyList();
+    public Page<TCommentUser> selectAll(Page<TCommentUser> page, TCommentUser tCommentUser) {
+        Page<TCommentUser> pageParam = page == null ? new Page<>(1, 10) : page;
+        TCommentUser query = tCommentUser == null ? new TCommentUser() : tCommentUser;
+        return tCommentUserMapper.selectAll(pageParam, query);
     }
 
     @Override
@@ -139,4 +141,4 @@ public class TCommentUserServiceImpl extends ServiceImpl<TCommentUserMapper, TCo
             throw new IllegalArgumentException(fieldName + "必须在1~5分之间");
         }
     }
-}
+}

+ 98 - 0
nightFragrance-massage/src/main/resources/mapper/order/AdminOrderMapper.xml

@@ -89,6 +89,94 @@
         ORDER BY o.create_time DESC
     </select>
 
+    <!-- 查询回收站订单列表 -->
+    <select id="selectAdminOrderRecyclePage" resultType="com.ylx.order.domain.vo.AdminOrderPageVO">
+        SELECT
+            o.id AS id,
+            o.order_no AS orderNo,
+            o.create_time AS orderTime,
+            COALESCE(p.title, o.project_name) AS projectName,
+            o.project_duration AS projectDuration,
+            o.appointment_start_time AS appointmentStartTime,
+            COALESCE(p.price, o.base_price) AS unitPrice,
+            1 AS quantity,
+            p.unit_type AS unitType,
+            o.final_amount AS orderAmount,
+            o.traffic_fee AS trafficFee,
+            o.payment_method AS paymentMethod,
+            u.c_nick_name AS userNickName,
+            o.contact_person_name AS contactPersonName,
+            o.contact_phone_number AS contactPhoneNumber,
+            o.contact_address_info AS contactAddressInfo,
+            o.status AS status,
+            o.exec_status AS execStatus,
+            COALESCE(mt.te_nick_name, o.merchant_nick_name) AS merchantNickName,
+            mt.te_phone AS merchantPhone,
+            p.category_id AS categoryId,
+            sc.name AS categoryName
+        FROM t_order o
+        LEFT JOIN t_wx_user u ON u.id = CAST(o.user_id AS CHAR) AND u.is_delete = 0
+        LEFT JOIN ma_technician mt ON mt.id = o.merchant_id AND mt.is_delete = 0
+        LEFT JOIN project p ON p.id = o.project_id AND p.is_delete = 0
+        LEFT JOIN service_category sc ON sc.id = p.category_id AND sc.is_delete = 0
+        <where>
+            o.is_delete = 1
+            <if test="dto.orderNo != null and dto.orderNo != ''">
+                AND o.order_no LIKE CONCAT('%', #{dto.orderNo}, '%')
+            </if>
+            <if test="dto.queryStartTime != null">
+                AND o.create_time &gt;= #{dto.queryStartTime}
+            </if>
+            <if test="dto.queryEndTime != null">
+                AND o.create_time &lt;= #{dto.queryEndTime}
+            </if>
+            <if test="dto.userKeyword != null and dto.userKeyword != ''">
+                <choose>
+                    <when test="dto.userSearchType == 'nickName'">
+                        AND u.c_nick_name LIKE CONCAT('%', #{dto.userKeyword}, '%')
+                    </when>
+                    <when test="dto.userSearchType == 'name'">
+                        AND o.contact_person_name LIKE CONCAT('%', #{dto.userKeyword}, '%')
+                    </when>
+                    <otherwise>
+                        AND u.c_phone LIKE CONCAT('%', #{dto.userKeyword}, '%')
+                    </otherwise>
+                </choose>
+            </if>
+            <if test="dto.categoryId != null">
+                AND p.category_id = #{dto.categoryId}
+            </if>
+            <if test="dto.projectName != null and dto.projectName != ''">
+                AND o.project_name LIKE CONCAT('%', #{dto.projectName}, '%')
+            </if>
+            <if test="dto.merchantKeyword != null and dto.merchantKeyword != ''">
+                <choose>
+                    <when test="dto.merchantSearchType == 'phone'">
+                        AND mt.te_phone LIKE CONCAT('%', #{dto.merchantKeyword}, '%')
+                    </when>
+                    <otherwise>
+                        AND o.merchant_nick_name LIKE CONCAT('%', #{dto.merchantKeyword}, '%')
+                    </otherwise>
+                </choose>
+            </if>
+            <if test="dto.paymentMethod != null">
+                AND o.payment_method = #{dto.paymentMethod}
+            </if>
+            <choose>
+                <when test="dto.abnormalOrder != null and dto.abnormalOrder">
+                    AND o.status IN (7, 8, 9)
+                </when>
+                <when test="dto.status != null">
+                    AND o.status = #{dto.status}
+                </when>
+            </choose>
+            <if test="dto.merchantType != null">
+                AND o.merchant_type = #{dto.merchantType}
+            </if>
+        </where>
+        ORDER BY o.create_time DESC
+    </select>
+
     <!-- 查询服务分类选项 -->
     <select id="selectServiceCategoryOptions" resultType="com.ylx.order.domain.vo.AdminOrderServiceCategoryVO">
         SELECT
@@ -110,6 +198,16 @@
           AND is_delete = 0
     </update>
 
+    <!-- 根据订单ID恢复回收站服务订单 -->
+    <update id="restoreById">
+        UPDATE t_order
+        SET is_delete = 0,
+            deleted_time = NULL,
+            update_time = NOW()
+        WHERE id = #{id}
+          AND is_delete = 1
+    </update>
+
     <select id="selectRefundApplicationOrderById" resultType="com.ylx.massage.domain.CancelOrderApplication">
         SELECT
             o.order_no AS orderNo,

+ 4 - 4
nightFragrance-massage/src/main/resources/mapper/order/TCommentUserMapper.xml

@@ -44,8 +44,8 @@
             tcu.text as text,
             tcu.star as star,
             tcu.comment_time as commentTime,
-            tcu.js_id as jsId,
-            tcu.name as name,
+            tcu.merchant_id as merchantId,
+            tcu.merchant_name as merchantName,
             tcu.sensitive_word as sensitiveWord,
             tcua.audit_status as auditStatus
         FROM
@@ -55,8 +55,8 @@
             tcu.is_delete = 0
           AND tcua.is_delete = 0
           <!-- 技师姓名查询 -->
-        <if test="tCommentUser.name != null and tCommentUser.name != ''">
-            AND tcu.name = #{tCommentUser.name}
+        <if test="tCommentUser.merchantName != null and tCommentUser.merchantName != ''">
+            AND tcu.merchant_name = #{tCommentUser.merchantName}
         </if>
         <!--敏感词查询-->
         <if test="tCommentUser.sensitiveWord != null">

+ 34 - 0
nightFragrance-massage/src/test/java/com/ylx/order/mapper/AdminOrderMapperXmlTest.java

@@ -30,6 +30,27 @@ public class AdminOrderMapperXmlTest {
         assertTrue(xml.contains("o.create_time DESC"));
     }
 
+    @Test
+    public void adminOrderRecyclePageSqlUsesSameFiltersAndDeletedOrders() throws Exception {
+        String xml = readMapperXml();
+
+        assertTrue(xml.contains("selectAdminOrderRecyclePage"));
+        assertTrue(xml.contains("o.is_delete = 1"));
+        assertTrue(xml.contains("o.order_no LIKE CONCAT('%', #{dto.orderNo}, '%')"));
+        assertTrue(xml.contains("o.create_time &gt;= #{dto.queryStartTime}"));
+        assertTrue(xml.contains("o.create_time &lt;= #{dto.queryEndTime}"));
+        assertTrue(xml.contains("u.c_phone LIKE CONCAT('%', #{dto.userKeyword}, '%')"));
+        assertTrue(xml.contains("u.c_nick_name LIKE CONCAT('%', #{dto.userKeyword}, '%')"));
+        assertTrue(xml.contains("o.contact_person_name LIKE CONCAT('%', #{dto.userKeyword}, '%')"));
+        assertTrue(xml.contains("p.category_id = #{dto.categoryId}"));
+        assertTrue(xml.contains("o.project_name LIKE CONCAT('%', #{dto.projectName}, '%')"));
+        assertTrue(xml.contains("mt.te_phone LIKE CONCAT('%', #{dto.merchantKeyword}, '%')"));
+        assertTrue(xml.contains("o.merchant_nick_name LIKE CONCAT('%', #{dto.merchantKeyword}, '%')"));
+        assertTrue(xml.contains("o.payment_method = #{dto.paymentMethod}"));
+        assertTrue(xml.contains("o.status = #{dto.status}"));
+        assertTrue(xml.contains("o.merchant_type = #{dto.merchantType}"));
+    }
+
     @Test
     public void serviceCategoryOptionSqlReturnsAllCreatedCategories() throws Exception {
         String xml = readMapperXml();
@@ -52,6 +73,19 @@ public class AdminOrderMapperXmlTest {
         assertTrue(xml.contains("AND is_delete = 0"));
     }
 
+    @Test
+    public void restoreByIdOnlyRestoresDeletedOrder() throws Exception {
+        String xml = readMapperXml();
+
+        assertTrue(xml.contains("update id=\"restoreById\""));
+        assertTrue(xml.contains("UPDATE t_order"));
+        assertTrue(xml.contains("is_delete = 0"));
+        assertTrue(xml.contains("deleted_time = NULL"));
+        assertTrue(xml.contains("update_time = NOW()"));
+        assertTrue(xml.contains("WHERE id = #{id}"));
+        assertTrue(xml.contains("AND is_delete = 1"));
+    }
+
     @Test
     public void refundApplicationSqlReadsOrderChecksPendingAndInsertsApplication() throws Exception {
         String xml = readMapperXml();

+ 35 - 0
nightFragrance-massage/src/test/java/com/ylx/order/mapper/TCommentUserMapperXmlTest.java

@@ -0,0 +1,35 @@
+package com.ylx.order.mapper;
+
+import org.junit.jupiter.api.Test;
+
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public class TCommentUserMapperXmlTest {
+
+    @Test
+    public void selectAllKeepsAuditJoinAndFilters() throws Exception {
+        String xml = readMapperXml();
+
+        assertTrue(xml.contains("select id=\"selectAll\""));
+        assertTrue(xml.contains("LEFT JOIN t_comment_user_audit tcua ON tcu.id = tcua.comment_id"));
+        assertTrue(xml.contains("tcu.is_delete = 0"));
+        assertTrue(xml.contains("tcua.is_delete = 0"));
+        assertTrue(xml.contains("tcu.name = #{tCommentUser.name}"));
+        assertTrue(xml.contains("tcu.sensitive_word = #{tCommentUser.sensitiveWord}"));
+        assertTrue(xml.contains("tcua.audit_status = #{tCommentUser.auditStatus}"));
+    }
+
+    private String readMapperXml() throws Exception {
+        try (InputStream inputStream = getClass().getClassLoader()
+                .getResourceAsStream("mapper/order/TCommentUserMapper.xml")) {
+            assertNotNull(inputStream, "TCommentUserMapper.xml should exist in test classpath");
+            byte[] bytes = new byte[inputStream.available()];
+            inputStream.read(bytes);
+            return new String(bytes, StandardCharsets.UTF_8);
+        }
+    }
+}

+ 50 - 0
nightFragrance-massage/src/test/java/com/ylx/order/service/impl/AdminOrderServiceImplTest.java

@@ -46,6 +46,31 @@ public class AdminOrderServiceImplTest {
         assertEquals("订单ID不能为空", exception.getMessage());
     }
 
+    @Test
+    public void recyclePageUsesRecycleMapperAndFillsDisplayFields() {
+        AdminOrderMapper mapper = mock(AdminOrderMapper.class);
+        Page<AdminOrderPageVO> mapperResult = new Page<>();
+        AdminOrderPageVO record = new AdminOrderPageVO();
+        record.setContactPhoneNumber("13812345678");
+        record.setQuantity(null);
+        mapperResult.setRecords(Collections.singletonList(record));
+        when(mapper.selectAdminOrderRecyclePage(org.mockito.ArgumentMatchers.any(Page.class),
+                org.mockito.ArgumentMatchers.any(AdminOrderQueryDTO.class))).thenReturn(mapperResult);
+        AdminOrderServiceImpl service = new AdminOrderServiceImpl();
+        ReflectionTestUtils.setField(service, "adminOrderMapper", mapper);
+        AdminOrderQueryDTO dto = new AdminOrderQueryDTO();
+        dto.setStartTime("2026-06-01");
+
+        Page<AdminOrderPageVO> result = service.recyclePage(null, dto);
+
+        ArgumentCaptor<AdminOrderQueryDTO> dtoCaptor = ArgumentCaptor.forClass(AdminOrderQueryDTO.class);
+        verify(mapper).selectAdminOrderRecyclePage(org.mockito.ArgumentMatchers.any(Page.class), dtoCaptor.capture());
+        assertNotNull(dtoCaptor.getValue().getQueryStartTime());
+        assertEquals(mapperResult, result);
+        assertEquals("138****5678", result.getRecords().get(0).getContactPhoneMasked());
+        assertEquals(1, result.getRecords().get(0).getQuantity());
+    }
+
     @Test
     public void deleteByIdRejectsInvalidId() {
         AdminOrderServiceImpl service = new AdminOrderServiceImpl();
@@ -81,6 +106,31 @@ public class AdminOrderServiceImplTest {
         verify(mapper).logicDeleteById(1L);
     }
 
+    @Test
+    public void restoreByIdThrowsWhenOrderMissingOrNotDeleted() {
+        AdminOrderMapper mapper = mock(AdminOrderMapper.class);
+        when(mapper.restoreById(1L)).thenReturn(0);
+        AdminOrderServiceImpl service = new AdminOrderServiceImpl();
+        ReflectionTestUtils.setField(service, "adminOrderMapper", mapper);
+
+        ServiceException exception = assertThrows(ServiceException.class,
+                () -> service.restoreById(1L));
+
+        assertEquals("订单不存在或未删除", exception.getMessage());
+    }
+
+    @Test
+    public void restoreByIdRestoresDeletedOrder() {
+        AdminOrderMapper mapper = mock(AdminOrderMapper.class);
+        when(mapper.restoreById(1L)).thenReturn(1);
+        AdminOrderServiceImpl service = new AdminOrderServiceImpl();
+        ReflectionTestUtils.setField(service, "adminOrderMapper", mapper);
+
+        service.restoreById(1L);
+
+        verify(mapper).restoreById(1L);
+    }
+
     @Test
     public void applyRefundRejectsEmptyId() {
         AdminOrderServiceImpl service = new AdminOrderServiceImpl();

+ 32 - 0
nightFragrance-massage/src/test/java/com/ylx/order/service/impl/TCommentUserServiceImplTest.java

@@ -0,0 +1,32 @@
+package com.ylx.order.service.impl;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ylx.order.domain.TCommentUser;
+import com.ylx.order.mapper.TCommentUserMapper;
+import org.junit.jupiter.api.Test;
+import org.springframework.test.util.ReflectionTestUtils;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+public class TCommentUserServiceImplTest {
+
+    @Test
+    public void selectAllUsesMybatisPlusPageMapper() {
+        TCommentUserMapper mapper = mock(TCommentUserMapper.class);
+        Page<TCommentUser> page = new Page<>(2, 20);
+        TCommentUser query = new TCommentUser();
+        Page<TCommentUser> mapperResult = new Page<>(2, 20, 35);
+        when(mapper.selectAll(page, query)).thenReturn(mapperResult);
+        TCommentUserServiceImpl service = new TCommentUserServiceImpl();
+        ReflectionTestUtils.setField(service, "tCommentUserMapper", mapper);
+
+        Page<TCommentUser> result = service.selectAll(page, query);
+
+        assertEquals(mapperResult, result);
+        verify(mapper).selectAll(eq(page), eq(query));
+    }
+}

+ 5 - 0
nightFragrance-system/pom.xml

@@ -27,6 +27,11 @@
             <artifactId>lombok</artifactId>
             <scope>provided</scope>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
 
     </dependencies>
 

+ 22 - 0
nightFragrance-system/src/main/java/com/ylx/system/domain/vo/SysDeptCityVo.java

@@ -0,0 +1,22 @@
+package com.ylx.system.domain.vo;
+
+import lombok.Data;
+
+/**
+ * 部门城市信息
+ *
+ * @author ylx
+ */
+@Data
+public class SysDeptCityVo {
+
+    /**
+     * 城市编码
+     */
+    private String cityCode;
+
+    /**
+     * 城市名称
+     */
+    private String cityName;
+}

+ 16 - 0
nightFragrance-system/src/main/java/com/ylx/system/mapper/SysDeptMapper.java

@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import org.apache.ibatis.annotations.Param;
 import com.ylx.common.core.domain.entity.SysDept;
 import com.ylx.system.domain.dto.SysDeptPageQueryDTO;
+import com.ylx.system.domain.vo.SysDeptCityVo;
 
 /**
  * 部门管理 数据层
@@ -31,6 +32,21 @@ public interface SysDeptMapper extends BaseMapper<SysDept> {
      */
     public Page<SysDept> selectDeptPage(Page<SysDept> page, @Param("dto") SysDeptPageQueryDTO dto);
 
+    /**
+     * 按省市查询部门平铺列表,包含顶级部门
+     *
+     * @param dept 省市查询条件
+     * @return 部门信息集合
+     */
+    public List<SysDept> selectDeptFlatListByRegion(@Param("dept") SysDept dept);
+
+    /**
+     * 查询城市列表
+     *
+     * @return 城市编码和城市名称集合
+     */
+    public List<SysDeptCityVo> selectCityList();
+
     /**
      * 根据角色ID查询部门树信息
      *

+ 16 - 0
nightFragrance-system/src/main/java/com/ylx/system/service/ISysDeptService.java

@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.ylx.common.core.domain.TreeSelect;
 import com.ylx.common.core.domain.entity.SysDept;
 import com.ylx.system.domain.dto.SysDeptPageQueryDTO;
+import com.ylx.system.domain.vo.SysDeptCityVo;
 
 /**
  * 部门管理 服务层
@@ -31,6 +32,21 @@ public interface ISysDeptService extends IService<SysDept> {
      */
     public Page<SysDept> selectDeptPage(Page<SysDept> page, SysDeptPageQueryDTO dto);
 
+    /**
+     * 按省市查询部门平铺列表,包含顶级部门
+     *
+     * @param dept 省市查询条件
+     * @return 部门信息集合
+     */
+    public List<SysDept> selectDeptFlatListByRegion(SysDept dept);
+
+    /**
+     * 查询城市列表
+     *
+     * @return 城市编码和城市名称集合
+     */
+    public List<SysDeptCityVo> selectCityList();
+
     /**
      * 查询部门树结构信息
      *

+ 28 - 1
nightFragrance-system/src/main/java/com/ylx/system/service/impl/SysDeptServiceImpl.java

@@ -1,5 +1,7 @@
 package com.ylx.system.service.impl;
+import java.time.LocalDateTime;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.Iterator;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -19,6 +21,7 @@ import com.ylx.common.utils.SecurityUtils;
 import com.ylx.common.utils.StringUtils;
 import com.ylx.common.utils.spring.SpringUtils;
 import com.ylx.system.domain.dto.SysDeptPageQueryDTO;
+import com.ylx.system.domain.vo.SysDeptCityVo;
 import com.ylx.system.mapper.SysDeptMapper;
 import com.ylx.system.mapper.SysRoleMapper;
 import com.ylx.system.service.ISysDeptService;
@@ -62,6 +65,28 @@ public class SysDeptServiceImpl extends ServiceImpl<SysDeptMapper, SysDept> impl
         return deptMapper.selectDeptPage(page, query);
     }
 
+    /**
+     * 按省市查询部门平铺列表,包含顶级部门
+     *
+     * @param dept 省市查询条件
+     * @return 部门信息集合
+     */
+    @Override
+    public List<SysDept> selectDeptFlatListByRegion(SysDept dept) {
+        SysDept query = dept == null ? new SysDept() : dept;
+        return deptMapper.selectDeptFlatListByRegion(query);
+    }
+
+    /**
+     * 查询城市列表
+     *
+     * @return 城市编码和城市名称集合
+     */
+    @Override
+    public List<SysDeptCityVo> selectCityList() {
+        return deptMapper.selectCityList();
+    }
+
     /**
      * 格式化部门分页查询创建时间范围
      *
@@ -229,7 +254,9 @@ public class SysDeptServiceImpl extends ServiceImpl<SysDeptMapper, SysDept> impl
             throw new ServiceException("部门停用,不允许新增");
         }
         dept.setAncestors(info.getAncestors() + "," + dept.getParentId());
-        return deptMapper.insertDept(dept);
+        dept.setCreateBy(SecurityUtils.getUsername());
+        dept.setCreateTime(new Date());
+        return deptMapper.insert(dept);
     }
 
     /**

+ 54 - 34
nightFragrance-system/src/main/resources/mapper/system/SysDeptMapper.xml

@@ -8,9 +8,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		<id     property="deptId"     column="dept_id"     />
 		<result property="parentId"   column="parent_id"   />
 		<result property="ancestors"  column="ancestors"   />
+		<result property="provinceCode" column="province_code" />
+		<result property="provinceName" column="province_name" />
 		<result property="deptName"   column="dept_name"   />
 		<result property="cityCode"   column="city_code"   />
 		<result property="cityName"   column="city_name"   />
+		<result property="districtCode" column="district_code" />
+		<result property="districtName" column="district_name" />
 		<result property="orderNum"   column="order_num"   />
 		<result property="leader"     column="leader"      />
 		<result property="phone"      column="phone"       />
@@ -25,7 +29,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 	</resultMap>
 
 	<sql id="selectDeptVo">
-        select d.dept_id, d.parent_id, d.ancestors, d.dept_name,d.city_code,d.city_name, d.order_num, d.leader, d.phone, d.email, d.status, d.is_delete, d.create_by, d.create_time
+        select d.dept_id, d.parent_id, d.ancestors, d.province_code, d.province_name, d.dept_name,
+               d.city_code, d.city_name, d.district_code, d.district_name, d.order_num, d.leader,
+               d.phone, d.email, d.status, d.is_delete, d.create_by, d.create_time
         from sys_dept d
     </sql>
 
@@ -72,6 +78,53 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		order by d.parent_id, d.order_num
     </select>
 
+	<!-- 按省市查询部门平铺列表,包含顶级部门 -->
+	<select id="selectDeptFlatListByRegion" resultMap="SysDeptResult">
+		<include refid="selectDeptVo"/>
+		<where>
+			d.is_delete = 0
+			AND (
+				d.parent_id = 0
+				<if test="(dept.provinceCode != null and dept.provinceCode != '')
+						or (dept.provinceName != null and dept.provinceName != '')
+						or (dept.cityCode != null and dept.cityCode != '')
+						or (dept.cityName != null and dept.cityName != '')">
+					OR (
+						1 = 1
+						<if test="dept.provinceCode != null and dept.provinceCode != ''">
+							AND d.province_code = #{dept.provinceCode}
+						</if>
+						<if test="dept.provinceName != null and dept.provinceName != ''">
+							AND d.province_name = #{dept.provinceName}
+						</if>
+						<if test="dept.cityCode != null and dept.cityCode != ''">
+							AND d.city_code = #{dept.cityCode}
+						</if>
+						<if test="dept.cityName != null and dept.cityName != ''">
+							AND d.city_name = #{dept.cityName}
+						</if>
+					)
+				</if>
+			)
+		</where>
+		order by d.parent_id, d.order_num, d.dept_id
+	</select>
+
+	<!-- 查询城市列表 -->
+	<select id="selectCityList" resultType="com.ylx.system.domain.vo.SysDeptCityVo">
+		select distinct
+			   d.city_code as cityCode,
+			   d.city_name as cityName
+		from sys_dept d
+		where d.is_delete = 0
+		  and d.status = '0'
+		  and d.city_code is not null
+		  and d.city_code != ''
+		  and d.city_name is not null
+		  and d.city_name != ''
+		order by d.city_code, d.city_name
+	</select>
+
     <select id="selectDeptListByRoleId" resultType="Long">
 		select d.dept_id
 		from sys_dept d
@@ -114,39 +167,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		where dept_name=#{deptName} and parent_id = #{parentId} and is_delete = 0 limit 1
 	</select>
 
-	<!-- 新增部门 -->
-    <insert id="insertDept" parameterType="SysDept">
- 		insert into sys_dept(
- 			<if test="deptId != null and deptId != 0">dept_id,</if>
- 			<if test="parentId != null and parentId != 0">parent_id,</if>
- 			<if test="deptName != null and deptName != ''">dept_name,</if>
-			<if test="cityCode != null and cityCode != ''">city_code,</if>
-			<if test="cityName != null and cityName != ''">city_name,</if>
-			<if test="ancestors != null and ancestors != ''">ancestors,</if>
- 			<if test="orderNum != null">order_num,</if>
- 			<if test="leader != null and leader != ''">leader,</if>
- 			<if test="phone != null and phone != ''">phone,</if>
- 			<if test="email != null and email != ''">email,</if>
- 			<if test="status != null">status,</if>
- 			<if test="createBy != null and createBy != ''">create_by,</if>
- 			create_time
- 		)values(
- 			<if test="deptId != null and deptId != 0">#{deptId},</if>
- 			<if test="parentId != null and parentId != 0">#{parentId},</if>
- 			<if test="deptName != null and deptName != ''">#{deptName},</if>
-			<if test="cityCode != null and cityCode != ''">#{cityCode},</if>
-			<if test="cityName != null and cityName != ''">#{cityName},</if>
- 			<if test="ancestors != null and ancestors != ''">#{ancestors},</if>
- 			<if test="orderNum != null">#{orderNum},</if>
- 			<if test="leader != null and leader != ''">#{leader},</if>
- 			<if test="phone != null and phone != ''">#{phone},</if>
- 			<if test="email != null and email != ''">#{email},</if>
- 			<if test="status != null">#{status},</if>
- 			<if test="createBy != null and createBy != ''">#{createBy},</if>
- 			sysdate()
- 		)
-	</insert>
-
 	<update id="updateDept" parameterType="SysDept">
  		update sys_dept
  		<set>

+ 40 - 0
nightFragrance-system/src/test/java/com/ylx/system/mapper/SysDeptMapperXmlTest.java

@@ -0,0 +1,40 @@
+package com.ylx.system.mapper;
+
+import org.junit.jupiter.api.Test;
+
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public class SysDeptMapperXmlTest {
+
+    @Test
+    public void selectCityListReturnsDistinctEnabledCities() throws Exception {
+        String xml = readMapperXml();
+
+        assertTrue(xml.contains("selectCityList"));
+        assertTrue(xml.contains("select distinct"));
+        assertTrue(xml.contains("d.city_code as cityCode"));
+        assertTrue(xml.contains("d.city_name as cityName"));
+        assertTrue(xml.contains("from sys_dept d"));
+        assertTrue(xml.contains("d.is_delete = 0"));
+        assertTrue(xml.contains("d.status = '0'"));
+        assertTrue(xml.contains("d.city_code is not null"));
+        assertTrue(xml.contains("d.city_code != ''"));
+        assertTrue(xml.contains("d.city_name is not null"));
+        assertTrue(xml.contains("d.city_name != ''"));
+        assertTrue(xml.contains("order by d.city_code, d.city_name"));
+    }
+
+    private String readMapperXml() throws Exception {
+        try (InputStream inputStream = getClass().getClassLoader()
+                .getResourceAsStream("mapper/system/SysDeptMapper.xml")) {
+            assertNotNull(inputStream, "SysDeptMapper.xml should exist in test classpath");
+            byte[] bytes = new byte[inputStream.available()];
+            inputStream.read(bytes);
+            return new String(bytes, StandardCharsets.UTF_8);
+        }
+    }
+}