jinshihui 2 dagar sedan
förälder
incheckning
500dea2647

+ 9 - 4
nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/AlarmController.java

@@ -55,14 +55,19 @@ public class AlarmController {
     }
 
     /**
-     * 通过主键查询单条数据
+     * 通过主键ID查询详情
      *
      * @param id 主键
-     * @return 单条数据
+     * @return R<Alarm>
      */
     @GetMapping("{id}")
-    public ResponseEntity<Alarm> queryById(@PathVariable("id") String id) {
-        return ResponseEntity.ok(this.alarmService.queryById(id));
+    public R<AlarmListVO> queryById(@PathVariable("id") String id) {
+        try {
+            return R.ok(alarmService.queryById(id));
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException(e);
+        }
     }
 
 

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

@@ -8,6 +8,7 @@ import com.ylx.common.core.domain.model.LoginUser;
 import com.ylx.massage.domain.MaProject;
 import com.ylx.massage.domain.dto.MaProjectAuditQueryDTO;
 import com.ylx.massage.domain.dto.MaProjectAuditSubmitDTO;
+import com.ylx.massage.domain.dto.MaProjectUpdateEnableDTO;
 import com.ylx.massage.domain.vo.MaProjectAuditListVO;
 import com.ylx.massage.domain.vo.MaProjectListVo;
 import com.ylx.massage.domain.vo.MaProjectOpenServiceVO;
@@ -114,6 +115,24 @@ public class MaProjectController extends BaseController {
         }
     }
 
+    /**
+     * 是否上下架商户申请开通的项目
+     *
+     * @param dto 上下架参数
+     * @return AjaxResult 上下架结果
+     */
+    @ApiOperation("是否上下架商户申请开通的项目")
+    @PutMapping("/audit/project/enable")
+    public R updateProjectEnable(@RequestBody MaProjectUpdateEnableDTO dto) {
+        try {
+            LoginUser loginUser = getLoginUser();
+            return R.ok(maProjectService.updateProjectEnable(dto));
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException(e);
+        }
+    }
+
 
     /**
      * 获取服务项目详细信息
@@ -122,7 +141,12 @@ public class MaProjectController extends BaseController {
     @PreAuthorize("@ss.hasPermi('massage:project:query')")
     @GetMapping(value = "/{id}")
     public AjaxResult getInfo(@PathVariable("id") Long id) {
-        return success(maProjectService.selectMaProjectById(id));
+        try {
+            return success(maProjectService.selectMaProjectById(id));
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException(e);
+        }
     }
 
     /**
@@ -134,7 +158,6 @@ public class MaProjectController extends BaseController {
     @PostMapping("save")
     public AjaxResult add(@RequestBody MaProjectSaveVo maProject) {
         LoginUser loginUser = getLoginUser();
-
         return toAjax(maProjectService.insertMaProject(maProject, loginUser));
     }
 

+ 3 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/domain/Alarm.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -79,6 +80,7 @@ public class Alarm implements Serializable {
      * 系统创建时间。
      */
     @ApiModelProperty("系统创建时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date createTime;
 
     /**
@@ -91,6 +93,7 @@ public class Alarm implements Serializable {
      * 系统修改时间。
      */
     @ApiModelProperty("系统修改时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date updateTime;
 
     /**

+ 13 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/domain/MaProject.java

@@ -203,4 +203,17 @@ public class MaProject implements Serializable {
      */
     @TableField(exist = false)
     private Integer unitType;
+
+    /**
+     * 项目亮点
+     */
+    @TableField(exist = false)
+    private String highlight;
+
+    /**
+     * 适用人群
+     */
+    @TableField(exist = false)
+    @ApiModelProperty("适用人群")
+    private String targetAudience;
 }

+ 30 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/domain/dto/MaProjectUpdateEnableDTO.java

@@ -0,0 +1,30 @@
+package com.ylx.massage.domain.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 是否上下架商户申请开通的项目
+ */
+@Data
+@ApiModel(value = "MaProjectUpdateEnableDTO", description = "是否上下架商户申请开通的项目")
+public class MaProjectUpdateEnableDTO {
+
+    /**
+     * 商户ID
+     */
+    private Integer merchantId;
+
+    /**
+     * 项目ID
+     */
+    @ApiModelProperty(value = "项目ID", required = true)
+    private Integer projectId;
+
+    /**
+     * 是否申请上下架(0:否1:是)
+     */
+    @ApiModelProperty(value = "是否申请上下架(0:否1:是)", required = true)
+    private Integer projectIsEnable;
+}

+ 5 - 2
nightFragrance-massage/src/main/java/com/ylx/massage/domain/vo/AlarmListVO.java

@@ -1,10 +1,11 @@
 package com.ylx.massage.domain.vo;
-
 import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
-
 import java.util.Date;
 
+/**
+ * 报警列表VO
+ */
 @Data
 public class AlarmListVO {
 
@@ -24,6 +25,8 @@ public class AlarmListVO {
 
     private String address;
 
+    private String note;
+
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date createTime;
 }

+ 1 - 1
nightFragrance-massage/src/main/java/com/ylx/massage/mapper/AlarmMapper.java

@@ -25,7 +25,7 @@ public interface AlarmMapper extends BaseMapper<Alarm> {
      * @param id 主键
      * @return 实例对象
      */
-    Alarm queryById(String id);
+    AlarmListVO queryById(String id);
 
     /**
      * 查询指定行数据

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

@@ -1,4 +1,5 @@
 package com.ylx.massage.service;
+
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ylx.massage.domain.Alarm;
@@ -21,7 +22,7 @@ public interface AlarmService extends IService<Alarm> {
      * @param id 主键
      * @return 实例对象
      */
-    Alarm queryById(String id);
+    AlarmListVO queryById(String id);
 
 
     /**

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

@@ -8,6 +8,7 @@ import com.ylx.common.core.domain.model.LoginUser;
 import com.ylx.massage.domain.MaProject;
 import com.ylx.massage.domain.dto.MaProjectAuditQueryDTO;
 import com.ylx.massage.domain.dto.MaProjectAuditSubmitDTO;
+import com.ylx.massage.domain.dto.MaProjectUpdateEnableDTO;
 import com.ylx.massage.domain.dto.MassageAllMerchantsDto;
 import com.ylx.massage.domain.vo.MaProjectAuditListVO;
 import com.ylx.massage.domain.vo.MaProjectListVo;
@@ -69,6 +70,13 @@ public interface IMaProjectService extends IService<MaProject> {
      */
     int submitProjectAudit(Long projectAuditId, MaProjectAuditSubmitDTO dto, LoginUser loginUser);
 
+    /**
+     * 是否上下架商户申请开通的项目
+     * @param dto
+     * @return int 影响行数
+     */
+    int updateProjectEnable(MaProjectUpdateEnableDTO dto);
+
     /**
      * 新增服务项目
      *

+ 5 - 2
nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/AlarmServiceImpl.java

@@ -36,6 +36,9 @@ public class AlarmServiceImpl extends BaseServiceImpl<AlarmMapper, Alarm> implem
     @Resource
     private TOrderService orderService;
 
+    @Resource
+    private AlarmMapper alarmMapper;
+
     @Override
     public Page<AlarmListVO> selectAlarmPage(Page<AlarmListVO> page, Alarm alarm) {
         Alarm query = buildAlarmPageQuery(alarm);
@@ -43,8 +46,8 @@ public class AlarmServiceImpl extends BaseServiceImpl<AlarmMapper, Alarm> implem
     }
 
     @Override
-    public Alarm queryById(String id) {
-        return null;
+    public AlarmListVO queryById(String id) {
+        return alarmMapper.queryById(id);
     }
 
 

+ 42 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/MaProjectServiceImpl.java

@@ -3,6 +3,7 @@ package com.ylx.massage.service.impl;
 import java.util.ArrayList;
 import java.util.List;
 
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ylx.common.core.domain.model.LoginUser;
@@ -12,6 +13,7 @@ import com.ylx.common.utils.StringUtils;
 import com.ylx.common.utils.bean.BeanUtils;
 import com.ylx.massage.domain.dto.MaProjectAuditQueryDTO;
 import com.ylx.massage.domain.dto.MaProjectAuditSubmitDTO;
+import com.ylx.massage.domain.dto.MaProjectUpdateEnableDTO;
 import com.ylx.massage.domain.dto.MassageAllMerchantsDto;
 import com.ylx.massage.domain.vo.MaProjectAuditListVO;
 import com.ylx.massage.domain.vo.MaProjectListVo;
@@ -160,6 +162,34 @@ public class MaProjectServiceImpl extends ServiceImpl<MaProjectMapper, MaProject
         return rows;
     }
 
+
+    @Override
+    public int updateProjectEnable(MaProjectUpdateEnableDTO dto) {
+        if (dto == null) {
+            throw new ServiceException("上下架参数不能为空");
+        }
+        checkRequiredPositive(dto.getMerchantId(), "商户ID");
+        checkRequiredPositive(dto.getProjectId(), "项目ID");
+        if (dto.getProjectIsEnable() == null) {
+            throw new ServiceException("上下架状态不能为空");
+        }
+        checkEnumValue(dto.getProjectIsEnable(), "上下架状态", 0, 1);
+
+        LambdaUpdateWrapper<MaProject> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.eq(MaProject::getMerchantId, dto.getMerchantId())
+                .eq(MaProject::getProjectId, dto.getProjectId())
+                .eq(MaProject::getIsDelete, 0)
+                .eq(MaProject::getAuditStatus, 1)
+                .set(MaProject::getProjectIsEnable, dto.getProjectIsEnable())
+                .set(MaProject::getUpdateTime, DateUtils.getNowDate());
+
+        int rows = maProjectMapper.update(null, updateWrapper);
+        if (rows <= 0) {
+            throw new ServiceException("商户项目不存在或未审核通过");
+        }
+        return rows;
+    }
+
     /**
      * 新增服务项目
      *
@@ -254,4 +284,16 @@ public class MaProjectServiceImpl extends ServiceImpl<MaProjectMapper, MaProject
         throw new ServiceException(fieldName + "参数不正确");
     }
 
+    /**
+     * 校验整数是否为正数
+     *
+     * @param value
+     * @param fieldName
+     */
+    private void checkRequiredPositive(Integer value, String fieldName) {
+        if (value == null || value <= 0) {
+            throw new ServiceException(fieldName + "不能为空");
+        }
+    }
+
 }

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

@@ -1049,6 +1049,8 @@ public class MaTechnicianServiceImpl extends ServiceImpl<MaTechnicianMapper, MaT
             Project project = projectMapper.selectById(projectId);
             maProject.setCover(project.getCover());
             maProject.setUnitType(project.getUnitType());
+            maProject.setHighlight(project.getHighlight());
+            maProject.setTargetAudience(project.getTargetAudience());
         });
         return maProjects;
     }

+ 21 - 6
nightFragrance-massage/src/main/resources/mapper/massage/AlarmMapper.xml

@@ -14,7 +14,6 @@
         <result property="merchantName" column="merchant_name" jdbcType="VARCHAR"/>
         <result property="merchantNickName" column="merchant_nick_name" jdbcType="VARCHAR"/>
         <result property="merchantSex" column="merchant_sex" jdbcType="INTEGER"/>
-        <result property="merchantAvatar" column="merchant_avatar" jdbcType="VARCHAR"/>
         <result property="merchantPhone" column="merchant_phone" jdbcType="VARCHAR"/>
         <result property="address" column="address" jdbcType="VARCHAR"/>
         <result property="alarmStatus" column="alarm_status" jdbcType="INTEGER"/>
@@ -74,11 +73,27 @@
         ORDER BY a.create_time DESC
     </select>
 
-    <!--查询单个-->
-    <select id="queryById" resultMap="YlxAlarmMap">
-        select <include refid="AlarmColumns"/>
-        from t_alarm
-        where id = #{id}
+    <!--通过主键ID查询详情-->
+    <select id="queryById" resultType="com.ylx.massage.domain.vo.AlarmListVO">
+        SELECT
+        a.id AS id,
+        a.order_no AS orderNo,
+        b.te_name AS teName,
+        b.te_nick_name AS teNickName,
+        b.te_sex AS teSex,
+        b.avatar AS avatar,
+        b.te_phone AS tePhone,
+        a.address AS address,
+        a.note AS note,
+        a.create_time AS createTime
+        FROM t_alarm a
+        JOIN ma_technician b ON a.merchant_id = b.id
+        <where>
+            a.is_delete = 0
+            AND b.is_delete = 0
+            and a.id = #{id}
+        </where>
+        ORDER BY a.create_time DESC
     </select>
 
     <!--查询指定行数据-->

+ 115 - 0
nightFragrance-massage/src/test/java/com/ylx/massage/service/impl/MaProjectServiceImplTest.java

@@ -0,0 +1,115 @@
+package com.ylx.massage.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
+import com.ylx.common.exception.ServiceException;
+import com.ylx.massage.domain.MaProject;
+import com.ylx.massage.domain.dto.MaProjectUpdateEnableDTO;
+import com.ylx.massage.mapper.MaProjectMapper;
+import org.apache.ibatis.builder.MapperBuilderAssistant;
+import org.apache.ibatis.session.Configuration;
+import org.junit.jupiter.api.Test;
+import org.mockito.ArgumentCaptor;
+import org.springframework.test.util.ReflectionTestUtils;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.isNull;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+public class MaProjectServiceImplTest {
+
+    @Test
+    public void updateProjectEnableUpdatesEnabledStatusByMerchantAndProject() {
+        initTableInfo();
+        MaProjectMapper mapper = mock(MaProjectMapper.class);
+        when(mapper.update(isNull(), any(Wrapper.class))).thenReturn(1);
+        MaProjectServiceImpl service = new MaProjectServiceImpl();
+        ReflectionTestUtils.setField(service, "maProjectMapper", mapper);
+        MaProjectUpdateEnableDTO dto = buildDto(7, 20, 0);
+
+        int rows = service.updateProjectEnable(dto);
+
+        assertEquals(1, rows);
+        ArgumentCaptor<Wrapper<MaProject>> wrapperCaptor = ArgumentCaptor.forClass(Wrapper.class);
+        verify(mapper).update(isNull(), wrapperCaptor.capture());
+        LambdaUpdateWrapper<MaProject> wrapper = (LambdaUpdateWrapper<MaProject>) wrapperCaptor.getValue();
+        String sqlSegment = wrapper.getSqlSegment().toLowerCase();
+        String sqlSet = wrapper.getSqlSet().toLowerCase();
+        assertTrue(sqlSegment.contains("merchant"));
+        assertTrue(sqlSegment.contains("project"));
+        assertTrue(sqlSegment.contains("delete"));
+        assertTrue(sqlSegment.contains("audit"));
+        assertTrue(sqlSet.contains("project"));
+        assertTrue(sqlSet.contains("enable"));
+        assertTrue(sqlSet.contains("update"));
+        assertTrue(wrapper.getParamNameValuePairs().containsValue(7));
+        assertTrue(wrapper.getParamNameValuePairs().containsValue(20));
+        assertTrue(wrapper.getParamNameValuePairs().containsValue(0));
+        assertTrue(wrapper.getParamNameValuePairs().containsValue(1));
+    }
+
+    @Test
+    public void updateProjectEnableRejectsInvalidEnableStatus() {
+        MaProjectMapper mapper = mock(MaProjectMapper.class);
+        MaProjectServiceImpl service = new MaProjectServiceImpl();
+        ReflectionTestUtils.setField(service, "maProjectMapper", mapper);
+        MaProjectUpdateEnableDTO dto = buildDto(7, 20, 2);
+
+        ServiceException exception = assertThrows(ServiceException.class,
+                () -> service.updateProjectEnable(dto));
+
+        assertEquals("上下架状态参数不正确", exception.getMessage());
+        verify(mapper, never()).update(any(MaProject.class), any(Wrapper.class));
+    }
+
+    @Test
+    public void updateProjectEnableRejectsEmptyEnableStatus() {
+        MaProjectMapper mapper = mock(MaProjectMapper.class);
+        MaProjectServiceImpl service = new MaProjectServiceImpl();
+        ReflectionTestUtils.setField(service, "maProjectMapper", mapper);
+        MaProjectUpdateEnableDTO dto = buildDto(7, 20, null);
+
+        ServiceException exception = assertThrows(ServiceException.class,
+                () -> service.updateProjectEnable(dto));
+
+        assertEquals("上下架状态不能为空", exception.getMessage());
+        verify(mapper, never()).update(any(MaProject.class), any(Wrapper.class));
+    }
+
+    @Test
+    public void updateProjectEnableRejectsMissingMerchantProject() {
+        initTableInfo();
+        MaProjectMapper mapper = mock(MaProjectMapper.class);
+        when(mapper.update(isNull(), any(Wrapper.class))).thenReturn(0);
+        MaProjectServiceImpl service = new MaProjectServiceImpl();
+        ReflectionTestUtils.setField(service, "maProjectMapper", mapper);
+        MaProjectUpdateEnableDTO dto = buildDto(7, 20, 1);
+
+        ServiceException exception = assertThrows(ServiceException.class,
+                () -> service.updateProjectEnable(dto));
+
+        assertEquals("商户项目不存在或未审核通过", exception.getMessage());
+    }
+
+    private MaProjectUpdateEnableDTO buildDto(Integer merchantId, Integer projectId, Integer projectIsEnable) {
+        MaProjectUpdateEnableDTO dto = new MaProjectUpdateEnableDTO();
+        dto.setMerchantId(merchantId);
+        dto.setProjectId(projectId);
+        dto.setProjectIsEnable(projectIsEnable);
+        return dto;
+    }
+
+    private void initTableInfo() {
+        if (TableInfoHelper.getTableInfo(MaProject.class) == null) {
+            MapperBuilderAssistant assistant = new MapperBuilderAssistant(new Configuration(), "");
+            TableInfoHelper.initTableInfo(assistant, MaProject.class);
+        }
+    }
+}