新增快照功能 优化商品查询逻辑 快递对接完成 延时售后问题修复

This commit is contained in:
徐唯轩
2023-11-22 19:06:46 +08:00
parent 3495a23492
commit 690f9cfe4c
328 changed files with 17752 additions and 0 deletions

View File

@ -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);
}
}

View File

@ -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 {
}

View File

@ -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;
}

View File

@ -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);
}

View File

@ -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;
}

View File

@ -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();
}

View File

@ -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();
}

View File

@ -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);
}
}