Эх сурвалжийг харах

修改商户相关接口的bug

jinshihui 1 долоо хоног өмнө
parent
commit
49f127371e
17 өөрчлөгдсөн 355 нэмэгдсэн , 92 устгасан
  1. 1 0
      nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/MaTechnicianController.java
  2. 18 0
      nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/TechnicianMomentController.java
  3. 20 0
      nightFragrance-massage/src/main/java/com/ylx/massage/domain/TechnicianMoment.java
  4. 23 0
      nightFragrance-massage/src/main/java/com/ylx/massage/domain/dto/MaTechnicianAuditSubmitDTO.java
  5. 14 0
      nightFragrance-massage/src/main/java/com/ylx/massage/domain/vo/MaTechnicianAuditListVO.java
  6. 35 35
      nightFragrance-massage/src/main/java/com/ylx/massage/domain/vo/MaTechnicianCertificateVO.java
  7. 31 0
      nightFragrance-massage/src/main/java/com/ylx/massage/domain/vo/MomentAuditStatusCountVO.java
  8. 22 0
      nightFragrance-massage/src/main/java/com/ylx/massage/domain/vo/MomentManageVO.java
  9. 6 0
      nightFragrance-massage/src/main/java/com/ylx/massage/mapper/TechnicianMomentMapper.java
  10. 8 0
      nightFragrance-massage/src/main/java/com/ylx/massage/service/ITechnicianMomentService.java
  11. 34 50
      nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/MaTechnicianServiceImpl.java
  12. 24 1
      nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/TechnicianMomentServiceImpl.java
  13. 5 1
      nightFragrance-massage/src/main/resources/mapper/massage/MaTechnicianMapper.xml
  14. 15 5
      nightFragrance-massage/src/main/resources/mapper/massage/TechnicianMomentMapper.xml
  15. 12 0
      nightFragrance-massage/src/test/java/com/ylx/massage/mapper/TechnicianMomentMapperXmlTest.java
  16. 53 0
      nightFragrance-massage/src/test/java/com/ylx/massage/service/impl/MaTechnicianServiceImplTest.java
  17. 34 0
      nightFragrance-massage/src/test/java/com/ylx/massage/service/impl/TechnicianMomentServiceImplTest.java

+ 1 - 0
nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/MaTechnicianController.java

@@ -582,6 +582,7 @@ public class MaTechnicianController extends BaseController {
     @PutMapping("/merchant/audit/{id}/applySubmit")
     public R<Void> applyMerchantAudit(@PathVariable("id") Integer id, @RequestBody MaTechnicianAuditSubmitDTO dto) {
         try {
+            log.info("商户申请入驻申请请求参数:{}", JSON.toJSONString(dto));
             LoginUser loginUser = getLoginUser();
             return toR(maTechnicianService.applyMerchantAudit(id, dto, loginUser));
         } catch (Exception e) {

+ 18 - 0
nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/TechnicianMomentController.java

@@ -12,6 +12,7 @@ import com.ylx.massage.domain.dto.MomentRecommendDTO;
 import com.ylx.massage.domain.dto.PublishMomentDTO;
 import com.ylx.massage.domain.dto.EditMomentDTO;
 import com.ylx.massage.domain.dto.MomentListStatusDTO;
+import com.ylx.massage.domain.vo.MomentAuditStatusCountVO;
 import com.ylx.massage.domain.vo.MomentDetailVO;
 import com.ylx.massage.domain.vo.MomentListVO;
 import com.ylx.massage.domain.vo.MomentManageVO;
@@ -335,6 +336,23 @@ public class TechnicianMomentController extends BaseController {
         }
     }
 
+    /**
+     * 查询动态管理审核状态统计(PC管理后台)
+     *
+     * @return R<MomentAuditStatusCountVO> 审核状态统计
+     */
+    @GetMapping("/manage/audit-status/count")
+    @ApiOperation("查询动态管理审核状态统计")
+    public R<MomentAuditStatusCountVO> getManageAuditStatusCount() {
+        try {
+            MomentAuditStatusCountVO count = momentService.getManageAuditStatusCount();
+            return R.ok(count);
+        } catch (Exception e) {
+            log.error("查询动态管理审核状态统计失败", e);
+            return R.fail("查询动态管理审核状态统计失败:" + e.getMessage());
+        }
+    }
+
     /**
      * 审核动态(通过/拒绝)
      *

+ 20 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/domain/TechnicianMoment.java

@@ -54,6 +54,11 @@ public class TechnicianMoment implements Serializable {
      */
     private Integer viewCount;
 
+    /**
+     * 收藏量
+     */
+    private Integer saveCount;
+
     /**
      * 发布时间
      */
@@ -99,16 +104,31 @@ public class TechnicianMoment implements Serializable {
      */
     private Integer auditStatus;
 
+    /**
+     * 审核时间
+     */
+    private LocalDateTime auditTime;
+
     /**
      * 拒绝原因
      */
     private String rejectReason;
 
+    /**
+     * 创建人
+     */
+    private String createBy;
+
     /**
      * 创建时间
      */
     private LocalDateTime createTime;
 
+    /**
+     * 更新人
+     */
+    private String updateBy;
+
     /**
      * 更新时间
      */

+ 23 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/domain/dto/MaTechnicianAuditSubmitDTO.java

@@ -1,9 +1,14 @@
 package com.ylx.massage.domain.dto;
 
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.ylx.common.annotation.Excel;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
 /**
  * 后台商户入驻审核提交参数。
  */
@@ -22,4 +27,22 @@ public class MaTechnicianAuditSubmitDTO {
      */
     @ApiModelProperty("审核备注")
     private String auditRemark;
+
+    /**
+     * 身份证到期日期
+     */
+    @ApiModelProperty("身份证到期日期")
+    private LocalDate idCardExpirationDate;
+
+    /**
+     * 健康证到期日期
+     */
+    @ApiModelProperty("健康证到期日期")
+    private LocalDate healthCertificateExpirationDate;
+
+    /**
+     * 从业资格证到期日期
+     */
+    @ApiModelProperty("从业资格证到期日期")
+    private LocalDate qualificationCertificateExpirationDate;
 }

+ 14 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/domain/vo/MaTechnicianAuditListVO.java

@@ -5,6 +5,7 @@ import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.time.LocalDateTime;
 import java.util.Date;
 
 /**
@@ -93,6 +94,19 @@ public class MaTechnicianAuditListVO {
     @ApiModelProperty("审核状态名称")
     private String auditStatusName;
 
+    /**
+     * 备注
+     */
+    @ApiModelProperty("备注")
+    private String auditRemark;
+
+    /**
+     * 审核时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty("审核时间")
+    private LocalDateTime approveTime;
+
     /**
      * 用户类型:0-正式用户,1-虚拟用户。
      */

+ 35 - 35
nightFragrance-massage/src/main/java/com/ylx/massage/domain/vo/MaTechnicianCertificateVO.java

@@ -20,74 +20,74 @@ public class MaTechnicianCertificateVO {
     private Integer merchantId;
 
     /**
-     * 形象照
+     * 形象照列表
      */
-    @ApiModelProperty("形象照")
-    private String avatar;
+    @ApiModelProperty("形象照列表")
+    private List<String> avatar;
 
     /**
-     * 生活照
+     * 生活照列表
      */
-    @ApiModelProperty("生活照")
+    @ApiModelProperty("生活照列表")
     private List<String> lifePhotos;
 
     /**
-     * 宣传视频
+     * 宣传视频列表
      */
-    @ApiModelProperty("宣传视频")
-    private String promotionVideo;
+    @ApiModelProperty("宣传视频列表")
+    private List<String> promotionVideo;
 
     /**
-     * 身份证人像面
+     * 身份证人像面列表
      */
-    @ApiModelProperty("身份证人像面")
-    private String idCardFrout;
+    @ApiModelProperty("身份证人像面列表")
+    private List<String> idCardFrout;
 
     /**
-     * 身份证国徽面
+     * 身份证国徽面列表
      */
-    @ApiModelProperty("身份证国徽面")
-    private String idCardBack;
+    @ApiModelProperty("身份证国徽面列表")
+    private List<String> idCardBack;
 
     /**
-     * 手持身份证照片
+     * 手持身份证照片列表
      */
-    @ApiModelProperty("手持身份证照片")
-    private String idCardHandheld;
+    @ApiModelProperty("手持身份证照片列表")
+    private List<String> idCardHandheld;
 
     /**
-     * 健康证
+     * 健康证列表
      */
-    @ApiModelProperty("健康证")
-    private String healthCertificate;
+    @ApiModelProperty("健康证列表")
+    private List<String> healthCertificate;
 
     /**
-     * 从业资格证
+     * 从业资格证列表
      */
-    @ApiModelProperty("从业资格证")
-    private String qualificationCertificate;
+    @ApiModelProperty("从业资格证列表")
+    private List<String> qualificationCertificate;
 
     /**
-     * 无犯罪证明
+     * 无犯罪证明列表
      */
-    @ApiModelProperty("无犯罪证明")
-    private String noCrimeRecord;
+    @ApiModelProperty("无犯罪证明列表")
+    private List<String> noCrimeRecord;
 
     /**
-     * 承诺书
+     * 承诺书列表
      */
-    @ApiModelProperty("承诺书")
-    private String commitmentPdf;
+    @ApiModelProperty("承诺书列表")
+    private List<String> commitmentPdf;
 
     /**
-     * 承诺录音
+     * 承诺录音列表
      */
-    @ApiModelProperty("承诺录音")
-    private String commitmentAudio;
+    @ApiModelProperty("承诺录音列表")
+    private List<String> commitmentAudio;
 
     /**
-     * 承诺视频
+     * 承诺视频列表
      */
-    @ApiModelProperty("承诺视频")
-    private String commitmentVideo;
+    @ApiModelProperty("承诺视频列表")
+    private List<String> commitmentVideo;
 }

+ 31 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/domain/vo/MomentAuditStatusCountVO.java

@@ -0,0 +1,31 @@
+package com.ylx.massage.domain.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 动态审核状态统计VO。
+ */
+@Data
+@ApiModel("动态审核状态统计")
+public class MomentAuditStatusCountVO {
+
+    /**
+     * 待审核总数。
+     */
+    @ApiModelProperty("待审核总数")
+    private Long pendingCount;
+
+    /**
+     * 审核通过总数。
+     */
+    @ApiModelProperty("审核通过总数")
+    private Long approvedCount;
+
+    /**
+     * 审核驳回总数。
+     */
+    @ApiModelProperty("审核驳回总数")
+    private Long rejectedCount;
+}

+ 22 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/domain/vo/MomentManageVO.java

@@ -61,12 +61,34 @@ public class MomentManageVO {
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime publishTime;
 
+    /**
+     * 浏览量
+     */
+    private Integer viewCount;
+
+    /**
+     * 收藏量
+     */
+    private Integer saveCount;
+
     /**
      * 审核状态:0-草稿,1-待审核,2-审核通过,3-审核拒绝
      */
     @ApiModelProperty("审核状态:0-草稿,1-待审核,2-审核通过,3-审核拒绝")
     private Integer auditStatus;
 
+    /**
+     * 操作人
+     */
+    @ApiModelProperty("操作人")
+    private String updateBy;
+
+    /**
+     * 审核时间
+     */
+    @ApiModelProperty("审核时间")
+    private LocalDateTime auditTime;
+
     /**
      * 是否推荐:0-否,1-是
      */

+ 6 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/mapper/TechnicianMomentMapper.java

@@ -2,6 +2,7 @@ package com.ylx.massage.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ylx.massage.domain.TechnicianMoment;
+import com.ylx.massage.domain.vo.MomentAuditStatusCountVO;
 import com.ylx.merchant.domain.dto.MerchantMomentDTO;
 import com.ylx.merchant.domain.vo.MomentVO;
 import org.apache.ibatis.annotations.Mapper;
@@ -47,6 +48,11 @@ public interface TechnicianMomentMapper extends BaseMapper<TechnicianMoment> {
      */
     int updateListStatus(@Param("momentId") Long momentId, @Param("isList") Integer isList);
 
+    /**
+     * 查询后台动态管理审核状态统计。
+     */
+    MomentAuditStatusCountVO selectManageAuditStatusCount();
+
     /**
      * 根据动态ID查询动态简要详情(包含媒体URL列表)
      *

+ 8 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/service/ITechnicianMomentService.java

@@ -6,6 +6,7 @@ import com.ylx.massage.domain.dto.EditMomentDTO;
 import com.ylx.massage.domain.dto.MomentAuditDTO;
 import com.ylx.massage.domain.dto.MomentManageQueryDTO;
 import com.ylx.massage.domain.dto.PublishMomentDTO;
+import com.ylx.massage.domain.vo.MomentAuditStatusCountVO;
 import com.ylx.massage.domain.vo.MomentDetailVO;
 import com.ylx.massage.domain.vo.MomentListVO;
 import com.ylx.massage.domain.vo.MomentManageVO;
@@ -112,6 +113,13 @@ public interface ITechnicianMomentService extends IService<TechnicianMoment> {
      */
     Page<MomentManageVO> getMomentManageList(MomentManageQueryDTO queryDTO);
 
+    /**
+     * 查询后台动态管理审核状态统计。
+     *
+     * @return MomentAuditStatusCountVO 审核状态统计
+     */
+    MomentAuditStatusCountVO getManageAuditStatusCount();
+
     /**
      * 审核动态(通过/拒绝)
      *

+ 34 - 50
nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/MaTechnicianServiceImpl.java

@@ -679,6 +679,10 @@ public class MaTechnicianServiceImpl extends ServiceImpl<MaTechnicianMapper, MaT
         if (dto.getAuditStatus() == AUDIT_REJECTED && StringUtils.isBlank(auditRemark)) {
             throw new ServiceException("审核驳回时审核备注不能为空");
         }
+        // 审核通过时,身份证到期日期、健康证到期日期、资格证到期日期不能为空
+        if (dto.getAuditStatus() == AUDIT_APPROVED && (dto.getIdCardExpirationDate() == null || dto.getHealthCertificateExpirationDate() == null || dto.getQualificationCertificateExpirationDate() == null)) {
+            throw new ServiceException("审核通过时,身份证到期日期、健康证到期日期、资格证到期日期不能为空");
+        }
         if (auditRemark.length() > AUDIT_REMARK_MAX_LENGTH) {
             throw new ServiceException("审核备注长度不能超过" + AUDIT_REMARK_MAX_LENGTH + "个字符");
         }
@@ -696,6 +700,9 @@ public class MaTechnicianServiceImpl extends ServiceImpl<MaTechnicianMapper, MaT
         maTechnician.setId(id);
         //设置审核状态
         maTechnician.setAuditStatus(dto.getAuditStatus());
+        maTechnician.setIdCardExpirationDate(dto.getIdCardExpirationDate());
+        maTechnician.setHealthCertificateExpirationDate(dto.getHealthCertificateExpirationDate());
+        maTechnician.setQualificationCertificateExpirationDate(dto.getQualificationCertificateExpirationDate());
         maTechnician.setAuditRemark(auditRemark);
         maTechnician.setApproveTime(DateUtils.getNowDate());
         if (loginUser != null && loginUser.getUser() != null) {
@@ -724,64 +731,41 @@ public class MaTechnicianServiceImpl extends ServiceImpl<MaTechnicianMapper, MaT
         LambdaQueryWrapper<MerchantApplyFile> queryWrapper = Wrappers.lambdaQuery();
         queryWrapper.eq(MerchantApplyFile::getMerchantId, id);
         List<MerchantApplyFile> merchantApplyFiles = merchantApplyFileMapper.selectList(queryWrapper);
-        if (merchantApplyFiles == null) {
-            throw new ServiceException("商户不存在或已删除");
-        }
         MaTechnicianCertificateVO certificate = new MaTechnicianCertificateVO();
-        certificate.setMerchantId(merchantApplyFiles.get(0).getMerchantId());
-        merchantApplyFiles.forEach(merchant -> {
-            certificate.setAvatar(typeFIleUrl(merchant, PORTRAIT.getCode()));
-            // 生活照(可能有多张)
-            certificate.setLifePhotos(typeFIleUrl1(merchant, LIFE_PHOTO.getCode()));
-            certificate.setPromotionVideo(typeFIleUrl(merchant, PROMOTION_VIDEO.getCode()));
-            certificate.setIdCardFrout(typeFIleUrl(merchant, ID_CARD_FRONT.getCode()));
-            certificate.setIdCardBack(typeFIleUrl(merchant, ID_CARD_BACK.getCode()));
-            certificate.setIdCardHandheld(typeFIleUrl(merchant, ID_CARD_HANDHELD.getCode()));
-            certificate.setHealthCertificate(typeFIleUrl(merchant, HEALTH_CERT.getCode()));
-            certificate.setQualificationCertificate(typeFIleUrl(merchant, QUALIFICATION_CERT.getCode()));
-            certificate.setNoCrimeRecord(typeFIleUrl(merchant, NO_CRIME_RECORD.getCode()));
-            certificate.setCommitmentPdf(typeFIleUrl(merchant, COMMITMENT_LETTER.getCode()));
-            certificate.setCommitmentAudio(typeFIleUrl(merchant, COMMITMENT_AUDIO.getCode()));
-            certificate.setCommitmentVideo(typeFIleUrl(merchant, COMMITMENT_VIDEO.getCode()));
-        });
+        certificate.setMerchantId(id);
+
+        Map<String, List<String>> fileUrlsByType = CollectionUtils.isEmpty(merchantApplyFiles)
+                ? Collections.emptyMap()
+                : merchantApplyFiles.stream()
+                .filter(Objects::nonNull)
+                .filter(file -> StringUtils.isNotBlank(file.getFileType()) && StringUtils.isNotBlank(file.getFileUrl()))
+                .collect(Collectors.groupingBy(MerchantApplyFile::getFileType,
+                        Collectors.mapping(MerchantApplyFile::getFileUrl, Collectors.toList())));
+
+        certificate.setAvatar(getCertificateFileUrls(fileUrlsByType, PORTRAIT.getCode()));
+        certificate.setLifePhotos(getCertificateFileUrls(fileUrlsByType, LIFE_PHOTO.getCode()));
+        certificate.setPromotionVideo(getCertificateFileUrls(fileUrlsByType, PROMOTION_VIDEO.getCode()));
+        certificate.setIdCardFrout(getCertificateFileUrls(fileUrlsByType, ID_CARD_FRONT.getCode()));
+        certificate.setIdCardBack(getCertificateFileUrls(fileUrlsByType, ID_CARD_BACK.getCode()));
+        certificate.setIdCardHandheld(getCertificateFileUrls(fileUrlsByType, ID_CARD_HANDHELD.getCode()));
+        certificate.setHealthCertificate(getCertificateFileUrls(fileUrlsByType, HEALTH_CERT.getCode()));
+        certificate.setQualificationCertificate(getCertificateFileUrls(fileUrlsByType, QUALIFICATION_CERT.getCode()));
+        certificate.setNoCrimeRecord(getCertificateFileUrls(fileUrlsByType, NO_CRIME_RECORD.getCode()));
+        certificate.setCommitmentPdf(getCertificateFileUrls(fileUrlsByType, COMMITMENT_LETTER.getCode()));
+        certificate.setCommitmentAudio(getCertificateFileUrls(fileUrlsByType, COMMITMENT_AUDIO.getCode()));
+        certificate.setCommitmentVideo(getCertificateFileUrls(fileUrlsByType, COMMITMENT_VIDEO.getCode()));
         return certificate;
     }
 
     /**
-     * 获取商户证照文件URL
-     *
-     * @param merchant 商户证照
-     * @param type   文件类型
-     * @return 文件URL列表
-     */
-    private String typeFIleUrl(MerchantApplyFile merchantApplyFile, String type) {
-        LambdaQueryWrapper<MerchantApplyFile> queryWrapper1 = Wrappers.lambdaQuery();
-        queryWrapper1.eq(MerchantApplyFile::getMerchantId, merchantApplyFile.getMerchantId());
-        queryWrapper1.eq(MerchantApplyFile::getFileType, type);
-        List<MerchantApplyFile> merchantApplyFiles = merchantApplyFileMapper.selectList(queryWrapper1);
-        if (merchantApplyFiles == null || merchantApplyFiles.isEmpty()) {
-            return null;
-        }
-        return merchantApplyFiles.get(0).getFileUrl();
-    }
-
-
-    /**
-     * 获取商户证照文件URL
+     * 获取指定证照类型的全部文件URL
      *
-     * @param merchant 商户证照
-     * @param type   文件类型
+     * @param fileUrlsByType 文件类型与URL列表映射
+     * @param type           文件类型
      * @return List<String> 文件URL列表
      */
-    private List<String> typeFIleUrl1(MerchantApplyFile merchantApplyFile, String type) {
-        LambdaQueryWrapper<MerchantApplyFile> queryWrapper1 = Wrappers.lambdaQuery();
-        queryWrapper1.eq(MerchantApplyFile::getMerchantId, merchantApplyFile.getMerchantId());
-        queryWrapper1.eq(MerchantApplyFile::getFileType, type);
-        List<MerchantApplyFile> merchantApplyFiles = merchantApplyFileMapper.selectList(queryWrapper1);
-        if (merchantApplyFiles == null || merchantApplyFiles.isEmpty()) {
-            return null;
-        }
-        return merchantApplyFiles.stream().map(MerchantApplyFile::getFileUrl).collect(Collectors.toList());
+    private List<String> getCertificateFileUrls(Map<String, List<String>> fileUrlsByType, String type) {
+        return fileUrlsByType.getOrDefault(type, Collections.emptyList());
     }
 
     /**

+ 24 - 1
nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/TechnicianMomentServiceImpl.java

@@ -814,6 +814,29 @@ public class TechnicianMomentServiceImpl extends ServiceImpl<TechnicianMomentMap
         return voPage;
     }
 
+    /**
+     * 查询后台动态管理审核状态统计。
+     *
+     * @return MomentAuditStatusCountVO 审核状态统计
+     */
+    @Override
+    public MomentAuditStatusCountVO getManageAuditStatusCount() {
+        MomentAuditStatusCountVO count = momentMapper.selectManageAuditStatusCount();
+        if (count == null) {
+            count = new MomentAuditStatusCountVO();
+        }
+        if (count.getPendingCount() == null) {
+            count.setPendingCount(0L);
+        }
+        if (count.getApprovedCount() == null) {
+            count.setApprovedCount(0L);
+        }
+        if (count.getRejectedCount() == null) {
+            count.setRejectedCount(0L);
+        }
+        return count;
+    }
+
     /**
      * 审核动态(通过/拒绝)
      *
@@ -894,7 +917,7 @@ public class TechnicianMomentServiceImpl extends ServiceImpl<TechnicianMomentMap
      *
      * @param momentId 动态ID
      * @param isList   是否上架:0-否,1-是
-     * @return 是否成功
+     * @return Boolean 是否成功
      */
     @Override
     @Transactional(rollbackFor = Exception.class)

+ 5 - 1
nightFragrance-massage/src/main/resources/mapper/massage/MaTechnicianMapper.xml

@@ -247,6 +247,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="auditStatus" column="audit_status"/>
         <result property="auditStatusName" column="audit_status_name"/>
         <result property="techType" column="tech_type"/>
+        <result property="auditRemark" column="audit_remark"/>
+        <result property="approveTime" column="approve_time"/>
     </resultMap>
 
     <select id="selectMerchantAuditList" resultMap="MaTechnicianAuditListResult">
@@ -279,7 +281,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                 WHEN 3 THEN '审核驳回'
                 ELSE ''
             END AS audit_status_name,
-            t.tech_type
+            t.tech_type,
+            t.audit_remark,
+            t.approve_time
         FROM ma_technician t
         <where>
             t.is_delete = 0

+ 15 - 5
nightFragrance-massage/src/main/resources/mapper/massage/TechnicianMomentMapper.xml

@@ -12,7 +12,6 @@
         <result column="cover_url" property="coverUrl"/>
         <result column="view_count" property="viewCount"/>
         <result column="publish_time" property="publishTime"/>
-        <result column="status" property="status"/>
         <result column="city_code" property="cityCode"/>
         <result column="latitude" property="latitude"/>
         <result column="longitude" property="longitude"/>
@@ -20,11 +19,9 @@
         <result column="update_time" property="updateTime"/>
         <result column="audit_status" property="auditStatus"/>
         <result column="reject_reason" property="rejectReason"/>
-        <result column="visible_range" property="visibleRange"/>
         <result column="is_recommend" property="isRecommend"/>
         <result column="is_list" property="isList"/>
         <result column="address" property="address"/>
-        <result column="poi_name" property="poiName"/>
     </resultMap>
 
     <!-- 查询推荐动态:只展示后台标记推荐的公开审核通过动态 -->
@@ -105,7 +102,7 @@
             update_time = NOW()
         WHERE
             id = #{momentId}
-            AND status = 1
+            AND is_delete = 0
     </update>
 
     <!-- 更新动态上架状态 -->
@@ -117,9 +114,22 @@
             update_time = NOW()
         WHERE
             id = #{momentId}
-            AND status = 1
+            AND is_delete = 0
     </update>
 
+    <!-- 查询后台动态管理审核状态统计 -->
+    <select id="selectManageAuditStatusCount" resultType="com.ylx.massage.domain.vo.MomentAuditStatusCountVO">
+        SELECT
+            COALESCE(SUM(CASE WHEN audit_status = 1 THEN 1 ELSE 0 END), 0) AS pendingCount,
+            COALESCE(SUM(CASE WHEN audit_status = 2 THEN 1 ELSE 0 END), 0) AS approvedCount,
+            COALESCE(SUM(CASE WHEN audit_status = 3 THEN 1 ELSE 0 END), 0) AS rejectedCount
+        FROM
+            t_technician_moment
+        WHERE
+            is_delete = 0
+            AND audit_status IN (1, 2, 3)
+    </select>
+
     <!-- 根据动态ID查询动态简要详情(包含媒体URL列表) -->
     <select id="selectMomentSimpleDetail" resultType="java.util.HashMap">
         SELECT

+ 12 - 0
nightFragrance-massage/src/test/java/com/ylx/massage/mapper/TechnicianMomentMapperXmlTest.java

@@ -70,6 +70,18 @@ public class TechnicianMomentMapperXmlTest {
         assertTrue(xml.contains("AND is_list = 1"));
     }
 
+    @Test
+    public void manageAuditStatusCountCountsOnlyManageStatuses() throws Exception {
+        String xml = readMapperXml();
+
+        assertTrue(xml.contains("selectManageAuditStatusCount"));
+        assertTrue(xml.contains("audit_status = 1"));
+        assertTrue(xml.contains("audit_status = 2"));
+        assertTrue(xml.contains("audit_status = 3"));
+        assertTrue(xml.contains("audit_status IN (1, 2, 3)"));
+        assertTrue(xml.contains("is_delete = 0"));
+    }
+
     private String readMapperXml() throws Exception {
         InputStream inputStream = getClass().getClassLoader()
                 .getResourceAsStream("mapper/massage/TechnicianMomentMapper.xml");

+ 53 - 0
nightFragrance-massage/src/test/java/com/ylx/massage/service/impl/MaTechnicianServiceImplTest.java

@@ -6,6 +6,7 @@ import com.ylx.massage.domain.MaTechnician;
 import com.ylx.massage.domain.MerchantApplyFile;
 import com.ylx.massage.domain.dto.MerchantApplyFileDto;
 import com.ylx.massage.domain.dto.MerchantApplyFileRequestDto;
+import com.ylx.massage.domain.vo.MaTechnicianCertificateVO;
 import com.ylx.massage.mapper.MaTechnicianMapper;
 import com.ylx.massage.mapper.MerchantApplyFileMapper;
 import org.apache.ibatis.builder.MapperBuilderAssistant;
@@ -20,6 +21,7 @@ import java.util.Collections;
 import java.util.List;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertIterableEquals;
 import static org.junit.jupiter.api.Assertions.assertNull;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.mockito.ArgumentMatchers.any;
@@ -163,6 +165,49 @@ public class MaTechnicianServiceImplTest {
         assertEquals("文件列表不能为空", exception.getMessage());
     }
 
+    @Test
+    public void selectMerchantCertificateReturnsEveryFileFieldAsList() {
+        initTableInfo(MerchantApplyFile.class);
+
+        MerchantApplyFileMapper applyFileMapper = mock(MerchantApplyFileMapper.class);
+        when(applyFileMapper.selectList(any(Wrapper.class))).thenReturn(Arrays.asList(
+                buildMerchantApplyFile("1", "avatar-1"),
+                buildMerchantApplyFile("1", "avatar-2"),
+                buildMerchantApplyFile("2", "life-1"),
+                buildMerchantApplyFile("2", "life-2"),
+                buildMerchantApplyFile("3", "promotion-1"),
+                buildMerchantApplyFile("4", "front-1"),
+                buildMerchantApplyFile("5", "back-1"),
+                buildMerchantApplyFile("6", "handheld-1"),
+                buildMerchantApplyFile("7", "health-1"),
+                buildMerchantApplyFile("8", "qualification-1"),
+                buildMerchantApplyFile("9", "crime-1"),
+                buildMerchantApplyFile("10", "commitment-pdf-1"),
+                buildMerchantApplyFile("11", "commitment-audio-1"),
+                buildMerchantApplyFile("12", "commitment-video-1"),
+                buildMerchantApplyFile("12", "commitment-video-2")
+        ));
+        MaTechnicianServiceImpl service = new MaTechnicianServiceImpl();
+        ReflectionTestUtils.setField(service, "merchantApplyFileMapper", applyFileMapper);
+
+        MaTechnicianCertificateVO certificate = service.selectMerchantCertificate(11);
+
+        assertEquals(11, certificate.getMerchantId());
+        assertIterableEquals(Arrays.asList("avatar-1", "avatar-2"), certificate.getAvatar());
+        assertIterableEquals(Arrays.asList("life-1", "life-2"), certificate.getLifePhotos());
+        assertIterableEquals(Collections.singletonList("promotion-1"), certificate.getPromotionVideo());
+        assertIterableEquals(Collections.singletonList("front-1"), certificate.getIdCardFrout());
+        assertIterableEquals(Collections.singletonList("back-1"), certificate.getIdCardBack());
+        assertIterableEquals(Collections.singletonList("handheld-1"), certificate.getIdCardHandheld());
+        assertIterableEquals(Collections.singletonList("health-1"), certificate.getHealthCertificate());
+        assertIterableEquals(Collections.singletonList("qualification-1"), certificate.getQualificationCertificate());
+        assertIterableEquals(Collections.singletonList("crime-1"), certificate.getNoCrimeRecord());
+        assertIterableEquals(Collections.singletonList("commitment-pdf-1"), certificate.getCommitmentPdf());
+        assertIterableEquals(Collections.singletonList("commitment-audio-1"), certificate.getCommitmentAudio());
+        assertIterableEquals(Arrays.asList("commitment-video-1", "commitment-video-2"), certificate.getCommitmentVideo());
+        verify(applyFileMapper, times(1)).selectList(any(Wrapper.class));
+    }
+
     private MerchantApplyFileRequestDto buildBaseRequest() {
         MerchantApplyFileRequestDto request = new MerchantApplyFileRequestDto();
         MaTechnician technician = new MaTechnician();
@@ -182,6 +227,14 @@ public class MaTechnicianServiceImplTest {
         return file;
     }
 
+    private MerchantApplyFile buildMerchantApplyFile(String fileType, String fileUrl) {
+        MerchantApplyFile file = new MerchantApplyFile();
+        file.setMerchantId(11);
+        file.setFileType(fileType);
+        file.setFileUrl(fileUrl);
+        return file;
+    }
+
     private void initTableInfo(Class<?> entityClass) {
         if (TableInfoHelper.getTableInfo(entityClass) == null) {
             MapperBuilderAssistant assistant = new MapperBuilderAssistant(new Configuration(), "");

+ 34 - 0
nightFragrance-massage/src/test/java/com/ylx/massage/service/impl/TechnicianMomentServiceImplTest.java

@@ -1,6 +1,7 @@
 package com.ylx.massage.service.impl;
 
 import com.ylx.common.exception.ServiceException;
+import com.ylx.massage.domain.vo.MomentAuditStatusCountVO;
 import com.ylx.massage.mapper.TechnicianMomentMapper;
 import org.junit.jupiter.api.Test;
 import org.springframework.test.util.ReflectionTestUtils;
@@ -105,4 +106,37 @@ public class TechnicianMomentServiceImplTest {
 
         assertEquals("动态不存在或已删除", exception.getMessage());
     }
+
+    @Test
+    public void getManageAuditStatusCountDelegatesToMapper() {
+        TechnicianMomentMapper mapper = mock(TechnicianMomentMapper.class);
+        MomentAuditStatusCountVO count = new MomentAuditStatusCountVO();
+        count.setPendingCount(1L);
+        count.setApprovedCount(2L);
+        count.setRejectedCount(3L);
+        when(mapper.selectManageAuditStatusCount()).thenReturn(count);
+        TechnicianMomentServiceImpl service = new TechnicianMomentServiceImpl();
+        ReflectionTestUtils.setField(service, "momentMapper", mapper);
+
+        MomentAuditStatusCountVO result = service.getManageAuditStatusCount();
+
+        assertEquals(1L, result.getPendingCount());
+        assertEquals(2L, result.getApprovedCount());
+        assertEquals(3L, result.getRejectedCount());
+        verify(mapper).selectManageAuditStatusCount();
+    }
+
+    @Test
+    public void getManageAuditStatusCountReturnsZeroWhenMapperReturnsNull() {
+        TechnicianMomentMapper mapper = mock(TechnicianMomentMapper.class);
+        when(mapper.selectManageAuditStatusCount()).thenReturn(null);
+        TechnicianMomentServiceImpl service = new TechnicianMomentServiceImpl();
+        ReflectionTestUtils.setField(service, "momentMapper", mapper);
+
+        MomentAuditStatusCountVO result = service.getManageAuditStatusCount();
+
+        assertEquals(0L, result.getPendingCount());
+        assertEquals(0L, result.getApprovedCount());
+        assertEquals(0L, result.getRejectedCount());
+    }
 }