新增快照功能 优化商品查询逻辑 快递对接完成 延时售后问题修复
This commit is contained in:
@ -0,0 +1,58 @@
|
||||
package co.yixiang.yshop.module.system.controller.admin.backuprecord;
|
||||
|
||||
import co.yixiang.yshop.framework.common.pojo.CommonResult;
|
||||
import co.yixiang.yshop.framework.common.pojo.PageResult;
|
||||
import co.yixiang.yshop.module.system.controller.admin.backuprecord.vo.BackupPageReqVO;
|
||||
import co.yixiang.yshop.module.system.controller.admin.backuprecord.vo.BackupRecordRespVO;
|
||||
import co.yixiang.yshop.module.system.convert.backuprecord.BackupRecordConvert;
|
||||
import co.yixiang.yshop.module.system.dal.dataobject.backup.BackupRecordDO;
|
||||
import co.yixiang.yshop.module.system.service.backuprecord.BackupRecordService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.validation.Valid;
|
||||
|
||||
import static co.yixiang.yshop.framework.common.pojo.CommonResult.success;
|
||||
|
||||
@Tag(name = "管理后台 - 备份")
|
||||
@RestController
|
||||
@RequestMapping("/system/backup")
|
||||
@Validated
|
||||
public class BackupRecordController {
|
||||
|
||||
@Resource
|
||||
private BackupRecordService backupRecordService;
|
||||
|
||||
|
||||
@GetMapping("/page")
|
||||
@Operation(summary = "获得备份记录分页")
|
||||
@PreAuthorize("@ss.hasPermission('system:store-backup-record:query')")
|
||||
public CommonResult<PageResult<BackupRecordRespVO>> backupPageList(@Valid BackupPageReqVO pageVO) {
|
||||
|
||||
return success(backupRecordService.backupPageList(pageVO));
|
||||
}
|
||||
|
||||
@Operation(summary = "备份信息")
|
||||
@PreAuthorize("@ss.hasPermission('system:store-backup-record:backup')")
|
||||
@PostMapping(value = "/backup")
|
||||
public CommonResult<Boolean> backup(){
|
||||
backupRecordService.backup();
|
||||
return success(true);
|
||||
}
|
||||
|
||||
@Operation(summary = "还原备份")
|
||||
@PreAuthorize("@ss.hasPermission('system:store-backup-record:revert')")
|
||||
@PostMapping(value = "/revertBackup")
|
||||
public CommonResult<Boolean> backupRecord(){
|
||||
backupRecordService.revertBackup();
|
||||
return success(true);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,20 @@
|
||||
package co.yixiang.yshop.module.system.controller.admin.backuprecord.vo;
|
||||
|
||||
import co.yixiang.yshop.framework.common.pojo.PageParam;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.ToString;
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
|
||||
|
||||
@Schema(description = "管理后台 - 备份记录 Request VO")
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@ToString(callSuper = true)
|
||||
public class BackupPageReqVO extends PageParam {
|
||||
|
||||
}
|
@ -0,0 +1,35 @@
|
||||
package co.yixiang.yshop.module.system.controller.admin.backuprecord.vo;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
import lombok.ToString;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Schema(description = "管理后台 - 备份记录 Response VO")
|
||||
@Data
|
||||
@ToString(callSuper = true)
|
||||
public class BackupRecordRespVO {
|
||||
|
||||
@Schema(description = "记录编号", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
private Long id;
|
||||
|
||||
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
private LocalDateTime createTime;
|
||||
|
||||
@Schema(description = "创建人", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
private String creator;
|
||||
|
||||
@Schema(description = "创建人名称", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
private String creatorName;
|
||||
|
||||
@Schema(description = "修改人", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
private String updater;
|
||||
|
||||
@Schema(description = "修改人名称", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
private String updaterName;
|
||||
|
||||
@Schema(description = "修改时间", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
private LocalDateTime updateTime;
|
||||
|
||||
}
|
@ -0,0 +1,21 @@
|
||||
package co.yixiang.yshop.module.system.convert.backuprecord;
|
||||
|
||||
import co.yixiang.yshop.framework.common.pojo.PageResult;
|
||||
import co.yixiang.yshop.module.system.controller.admin.backuprecord.vo.BackupRecordRespVO;
|
||||
import co.yixiang.yshop.module.system.dal.dataobject.backup.BackupRecordDO;
|
||||
import org.mapstruct.Mapper;
|
||||
import org.mapstruct.factory.Mappers;
|
||||
|
||||
/**
|
||||
* 品牌 Convert
|
||||
*
|
||||
* @author yshop
|
||||
*/
|
||||
@Mapper
|
||||
public interface BackupRecordConvert {
|
||||
|
||||
BackupRecordConvert INSTANCE = Mappers.getMapper(BackupRecordConvert.class);
|
||||
|
||||
PageResult<BackupRecordRespVO> convertPage(PageResult<BackupRecordDO> page);
|
||||
|
||||
}
|
@ -0,0 +1,27 @@
|
||||
package co.yixiang.yshop.module.system.dal.dataobject.backup;
|
||||
|
||||
import co.yixiang.yshop.framework.mybatis.core.dataobject.BaseDO;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import lombok.*;
|
||||
|
||||
/**
|
||||
* 商品品牌 DO
|
||||
*
|
||||
* @author yshop
|
||||
*/
|
||||
@TableName("yshop_store_backup_record")
|
||||
@Data
|
||||
@ToString(callSuper = true)
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class BackupRecordDO extends BaseDO {
|
||||
|
||||
/**
|
||||
* 记录id
|
||||
*/
|
||||
@TableId
|
||||
private Long id;
|
||||
|
||||
}
|
@ -0,0 +1,22 @@
|
||||
package co.yixiang.yshop.module.system.dal.mysql.backuprecord;
|
||||
|
||||
import co.yixiang.yshop.framework.common.pojo.PageResult;
|
||||
import co.yixiang.yshop.framework.mybatis.core.mapper.BaseMapperX;
|
||||
import co.yixiang.yshop.framework.mybatis.core.query.LambdaQueryWrapperX;
|
||||
import co.yixiang.yshop.module.system.controller.admin.backuprecord.vo.BackupPageReqVO;
|
||||
import co.yixiang.yshop.module.system.dal.dataobject.backup.BackupRecordDO;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
|
||||
@Mapper
|
||||
public interface BackupRecordMapper extends BaseMapperX<BackupRecordDO> {
|
||||
|
||||
default PageResult<BackupRecordDO> selectPage(BackupPageReqVO pageVO) {
|
||||
return selectPage(pageVO, new LambdaQueryWrapperX<BackupRecordDO>()
|
||||
.orderByDesc(BackupRecordDO::getCreateTime));
|
||||
}
|
||||
|
||||
void backup();
|
||||
|
||||
void revertBackup();
|
||||
|
||||
}
|
@ -0,0 +1,20 @@
|
||||
package co.yixiang.yshop.module.system.service.backuprecord;
|
||||
|
||||
import co.yixiang.yshop.framework.common.pojo.PageResult;
|
||||
import co.yixiang.yshop.module.system.controller.admin.backuprecord.vo.BackupPageReqVO;
|
||||
import co.yixiang.yshop.module.system.controller.admin.backuprecord.vo.BackupRecordRespVO;
|
||||
import co.yixiang.yshop.module.system.dal.dataobject.backup.BackupRecordDO;
|
||||
|
||||
/**
|
||||
* 商品品牌 Service 接口
|
||||
*
|
||||
* @author yshop
|
||||
*/
|
||||
public interface BackupRecordService {
|
||||
|
||||
PageResult<BackupRecordRespVO> backupPageList(BackupPageReqVO pageVO);
|
||||
void backup();
|
||||
|
||||
void revertBackup();
|
||||
|
||||
}
|
@ -0,0 +1,120 @@
|
||||
package co.yixiang.yshop.module.system.service.backuprecord;
|
||||
|
||||
import co.yixiang.yshop.framework.common.pojo.PageResult;
|
||||
import co.yixiang.yshop.module.system.controller.admin.backuprecord.vo.BackupPageReqVO;
|
||||
import co.yixiang.yshop.module.system.controller.admin.backuprecord.vo.BackupRecordRespVO;
|
||||
import co.yixiang.yshop.module.system.convert.backuprecord.BackupRecordConvert;
|
||||
import co.yixiang.yshop.module.system.dal.dataobject.backup.BackupRecordDO;
|
||||
import co.yixiang.yshop.module.system.dal.dataobject.user.AdminUserDO;
|
||||
import co.yixiang.yshop.module.system.dal.mysql.backuprecord.BackupRecordMapper;
|
||||
import co.yixiang.yshop.module.system.service.user.AdminUserService;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.data.redis.core.StringRedisTemplate;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||
import static co.yixiang.yshop.module.system.enums.ErrorCodeConstants.BACKUP_MANY;
|
||||
|
||||
/**
|
||||
* 品牌 Service 实现类
|
||||
*
|
||||
* @author yshop
|
||||
*/
|
||||
@Service
|
||||
@Validated
|
||||
public class BackupRecordServiceImpl extends ServiceImpl<BackupRecordMapper, BackupRecordDO> implements BackupRecordService {
|
||||
|
||||
@Resource
|
||||
private BackupRecordMapper backupRecordMapper;
|
||||
|
||||
@Resource
|
||||
private StringRedisTemplate stringRedisTemplate;
|
||||
|
||||
@Resource
|
||||
private AdminUserService adminUserService;
|
||||
|
||||
|
||||
|
||||
private static final String orderCountKey = "yshop_order_count_cache:*";
|
||||
|
||||
private static final String orderAdminCountKey = "yshop_admin_order_count_cache:*";
|
||||
@Override
|
||||
public PageResult<BackupRecordRespVO> backupPageList(BackupPageReqVO pageVO){
|
||||
PageResult<BackupRecordDO> pageResult = this.baseMapper.selectPage(pageVO);
|
||||
if(pageResult.getTotal()>0){
|
||||
List<Long> ids = new ArrayList<>();
|
||||
pageResult.getList().forEach( record -> {
|
||||
ids.add(Long.parseLong(record.getCreator()));
|
||||
if(!StringUtils.isEmpty(record.getUpdater())){
|
||||
ids.add(Long.parseLong(record.getUpdater()));
|
||||
}
|
||||
}
|
||||
);
|
||||
Map<Long,String> nameMap = adminUserService.getUserList(ids).stream()
|
||||
.collect(Collectors.toMap(AdminUserDO::getId,AdminUserDO::getUsername));
|
||||
PageResult<BackupRecordRespVO> page= BackupRecordConvert.INSTANCE.convertPage(pageResult);
|
||||
page.getList().forEach(resp->{
|
||||
resp.setCreatorName(nameMap.get(Long.parseLong(resp.getCreator())));
|
||||
if(!StringUtils.isEmpty(resp.getUpdater())){
|
||||
resp.setUpdaterName(nameMap.get(Long.parseLong(resp.getUpdater())));
|
||||
}
|
||||
});
|
||||
return page;
|
||||
}else{
|
||||
return PageResult.empty();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Transactional
|
||||
@Override
|
||||
public void backup(){
|
||||
BackupRecordDO last = backupRecordMapper.selectOne(new LambdaQueryWrapper<BackupRecordDO>().orderByDesc(
|
||||
BackupRecordDO::getId
|
||||
).last("limit 1"));
|
||||
if(last!= null) {
|
||||
if (last.getCreateTime().plusMinutes(5).isAfter(LocalDateTime.now())) {
|
||||
throw exception(BACKUP_MANY);
|
||||
}
|
||||
}
|
||||
this.baseMapper.backup();
|
||||
BackupRecordDO backupRecordDO = new BackupRecordDO();
|
||||
backupRecordDO.setCreateTime(LocalDateTime.now());
|
||||
this.baseMapper.insert(backupRecordDO);
|
||||
}
|
||||
|
||||
@Transactional
|
||||
@Override
|
||||
public void revertBackup(){
|
||||
BackupRecordDO backupRecordDO = backupRecordMapper.selectOne(new LambdaQueryWrapper<BackupRecordDO>().orderByDesc(
|
||||
BackupRecordDO::getId
|
||||
).last("limit 1"));
|
||||
if(backupRecordDO!=null) {
|
||||
if (backupRecordDO.getUpdateTime().plusMinutes(5).isAfter(LocalDateTime.now()) &&
|
||||
!backupRecordDO.getCreateTime().isEqual(backupRecordDO.getUpdateTime())) {
|
||||
throw exception(BACKUP_MANY);
|
||||
}
|
||||
}
|
||||
this.baseMapper.revertBackup();
|
||||
this.baseMapper.updateById(backupRecordDO);
|
||||
//清除redis信息
|
||||
Set<String> orderCountKeys = stringRedisTemplate.keys(orderCountKey);
|
||||
Set<String> orderAdminCountKeys = stringRedisTemplate.keys(orderAdminCountKey);
|
||||
assert orderCountKeys != null;
|
||||
stringRedisTemplate.delete(orderCountKeys);
|
||||
assert orderAdminCountKeys != null;
|
||||
stringRedisTemplate.delete(orderAdminCountKeys);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user