Commit e02ac0fb by yuwei

项目初始化

parent a6ea491a
package cn.datax.service.data.standard.api.dto;
import cn.datax.common.validate.ValidationGroups;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;
/**
* <p>
* 字典对照信息表 实体DTO
* </p>
*
* @author yuwei
* @since 2020-09-27
*/
@ApiModel(value = "字典对照信息表Model")
@Data
public class ContrastDictDto implements Serializable {
private static final long serialVersionUID=1L;
@ApiModelProperty(value = "主键ID")
@NotBlank(message = "主键ID不能为空", groups = {ValidationGroups.Update.class})
private String id;
@ApiModelProperty(value = "字典对照主键")
private String contrastId;
@ApiModelProperty(value = "字典编码")
private String colCode;
@ApiModelProperty(value = "字典名称")
private String colName;
@ApiModelProperty(value = "标准编码")
private String gbCode;
@ApiModelProperty(value = "标准名称")
private String gbName;
}
package cn.datax.service.data.standard.api.dto;
import cn.datax.common.validate.ValidationGroups;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;
/**
* <p>
* 对照表信息表 实体DTO
* </p>
*
* @author yuwei
* @since 2020-09-27
*/
@ApiModel(value = "对照表信息表Model")
@Data
public class ContrastDto implements Serializable {
private static final long serialVersionUID=1L;
@ApiModelProperty(value = "主键ID")
@NotBlank(message = "主键ID不能为空", groups = {ValidationGroups.Update.class})
private String id;
@ApiModelProperty(value = "数据源主键")
private String sourceId;
@ApiModelProperty(value = "数据源")
private String sourceName;
@ApiModelProperty(value = "数据表主键")
private String tableId;
@ApiModelProperty(value = "数据表")
private String tableName;
@ApiModelProperty(value = "字段主键")
private String columnId;
@ApiModelProperty(value = "字段")
private String columnName;
@ApiModelProperty(value = "标准类别主键")
private String gbTypeId;
@ApiModelProperty(value = "标准类别编码")
private String gbTypeCode;
@ApiModelProperty(value = "标准类别名称")
private String gbTypeName;
}
package cn.datax.service.data.standard.api.entity;
import cn.datax.common.base.DataScopeBaseEntity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* <p>
* 字典对照信息表
* </p>
*
* @author yuwei
* @since 2020-09-27
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("standard_contrast_dict")
public class ContrastDictEntity extends DataScopeBaseEntity {
private static final long serialVersionUID=1L;
/**
* 字典对照主键
*/
private String contrastId;
/**
* 字典编码
*/
private String colCode;
/**
* 字典名称
*/
private String colName;
/**
* 标准编码
*/
private String gbCode;
/**
* 标准名称
*/
private String gbName;
}
package cn.datax.service.data.standard.api.entity;
import cn.datax.common.base.DataScopeBaseEntity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* <p>
* 对照表信息表
* </p>
*
* @author yuwei
* @since 2020-09-27
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("standard_contrast")
public class ContrastEntity extends DataScopeBaseEntity {
private static final long serialVersionUID=1L;
/**
* 数据源主键
*/
private String sourceId;
/**
* 数据源
*/
private String sourceName;
/**
* 数据表主键
*/
private String tableId;
/**
* 数据表
*/
private String tableName;
/**
* 字段主键
*/
private String columnId;
/**
* 字段
*/
private String columnName;
/**
* 标准类别主键
*/
private String gbTypeId;
/**
* 标准类别编码
*/
private String gbTypeCode;
/**
* 标准类别名称
*/
private String gbTypeName;
}
package cn.datax.service.data.standard.api.query;
import cn.datax.common.base.BaseQueryParams;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
* 字典对照信息表 查询实体
* </p>
*
* @author yuwei
* @since 2020-09-27
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class ContrastDictQuery extends BaseQueryParams {
private static final long serialVersionUID=1L;
}
package cn.datax.service.data.standard.api.query;
import cn.datax.common.base.BaseQueryParams;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
* 对照表信息表 查询实体
* </p>
*
* @author yuwei
* @since 2020-09-27
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class ContrastQuery extends BaseQueryParams {
private static final long serialVersionUID=1L;
}
package cn.datax.service.data.standard.api.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* <p>
* 字典对照信息表 实体VO
* </p>
*
* @author yuwei
* @since 2020-09-27
*/
@Data
public class ContrastDictVo implements Serializable {
private static final long serialVersionUID=1L;
private String id;
private String status;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime createTime;
private String contrastId;
private String colCode;
private String colName;
private String gbCode;
private String gbName;
}
package cn.datax.service.data.standard.api.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* <p>
* 对照表信息表 实体VO
* </p>
*
* @author yuwei
* @since 2020-09-27
*/
@Data
public class ContrastVo implements Serializable {
private static final long serialVersionUID=1L;
private String id;
private String status;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime createTime;
private String sourceId;
private String sourceName;
private String tableId;
private String tableName;
private String columnId;
private String columnName;
private String gbTypeId;
private String gbTypeCode;
private String gbTypeName;
}
package cn.datax.service.data.standard.controller;
import cn.datax.common.core.JsonPage;
import cn.datax.common.core.R;
import cn.datax.common.validate.ValidationGroups;
import cn.datax.service.data.standard.api.dto.ContrastDto;
import cn.datax.service.data.standard.api.entity.ContrastEntity;
import cn.datax.service.data.standard.api.vo.ContrastVo;
import cn.datax.service.data.standard.api.query.ContrastQuery;
import cn.datax.service.data.standard.mapstruct.ContrastMapper;
import cn.datax.service.data.standard.service.ContrastService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import cn.datax.common.base.BaseController;
import java.util.List;
import java.util.stream.Collectors;
/**
* <p>
* 对照表信息表 前端控制器
* </p>
*
* @author yuwei
* @since 2020-09-27
*/
@Api(tags = {"对照表信息表"})
@RestController
@RequestMapping("/contrasts")
public class ContrastController extends BaseController {
@Autowired
private ContrastService contrastService;
@Autowired
private ContrastMapper contrastMapper;
/**
* 通过ID查询信息
*
* @param id
* @return
*/
@ApiOperation(value = "获取详细信息", notes = "根据url的id来获取详细信息")
@ApiImplicitParam(name = "id", value = "ID", required = true, dataType = "String", paramType = "path")
@GetMapping("/{id}")
public R getContrastById(@PathVariable String id) {
ContrastEntity contrastEntity = contrastService.getContrastById(id);
return R.ok().setData(contrastMapper.toVO(contrastEntity));
}
/**
* 分页查询信息
*
* @param contrastQuery
* @return
*/
@ApiOperation(value = "分页查询", notes = "")
@ApiImplicitParams({
@ApiImplicitParam(name = "contrastQuery", value = "查询实体contrastQuery", required = true, dataTypeClass = ContrastQuery.class)
})
@GetMapping("/page")
public R getContrastPage(ContrastQuery contrastQuery) {
QueryWrapper<ContrastEntity> queryWrapper = new QueryWrapper<>();
IPage<ContrastEntity> page = contrastService.page(new Page<>(contrastQuery.getPageNum(), contrastQuery.getPageSize()), queryWrapper);
List<ContrastVo> collect = page.getRecords().stream().map(contrastMapper::toVO).collect(Collectors.toList());
JsonPage<ContrastVo> jsonPage = new JsonPage<>(page.getCurrent(), page.getSize(), page.getTotal(), collect);
return R.ok().setData(jsonPage);
}
/**
* 添加
* @param contrast
* @return
*/
@ApiOperation(value = "添加信息", notes = "根据contrast对象添加信息")
@ApiImplicitParam(name = "contrast", value = "详细实体contrast", required = true, dataType = "ContrastDto")
@PostMapping()
public R saveContrast(@RequestBody @Validated({ValidationGroups.Insert.class}) ContrastDto contrast) {
ContrastEntity contrastEntity = contrastService.saveContrast(contrast);
return R.ok().setData(contrastMapper.toVO(contrastEntity));
}
/**
* 修改
* @param contrast
* @return
*/
@ApiOperation(value = "修改信息", notes = "根据url的id来指定修改对象,并根据传过来的信息来修改详细信息")
@ApiImplicitParams({
@ApiImplicitParam(name = "id", value = "ID", required = true, dataType = "String", paramType = "path"),
@ApiImplicitParam(name = "contrast", value = "详细实体contrast", required = true, dataType = "ContrastDto")
})
@PutMapping("/{id}")
public R updateContrast(@PathVariable String id, @RequestBody @Validated({ValidationGroups.Update.class}) ContrastDto contrast) {
ContrastEntity contrastEntity = contrastService.updateContrast(contrast);
return R.ok().setData(contrastMapper.toVO(contrastEntity));
}
/**
* 删除
* @param id
* @return
*/
@ApiOperation(value = "删除", notes = "根据url的id来指定删除对象")
@ApiImplicitParam(name = "id", value = "ID", required = true, dataType = "String", paramType = "path")
@DeleteMapping("/{id}")
public R deleteContrastById(@PathVariable String id) {
contrastService.deleteContrastById(id);
return R.ok();
}
/**
* 批量删除
* @param ids
* @return
*/
@ApiOperation(value = "批量删除角色", notes = "根据url的ids来批量删除对象")
@ApiImplicitParam(name = "ids", value = "ID集合", required = true, dataType = "List", paramType = "path")
@DeleteMapping("/batch/{ids}")
public R deleteContrastBatch(@PathVariable List<String> ids) {
contrastService.deleteContrastBatch(ids);
return R.ok();
}
}
package cn.datax.service.data.standard.controller;
import cn.datax.common.core.JsonPage;
import cn.datax.common.core.R;
import cn.datax.common.validate.ValidationGroups;
import cn.datax.service.data.standard.api.dto.ContrastDictDto;
import cn.datax.service.data.standard.api.entity.ContrastDictEntity;
import cn.datax.service.data.standard.api.vo.ContrastDictVo;
import cn.datax.service.data.standard.api.query.ContrastDictQuery;
import cn.datax.service.data.standard.mapstruct.ContrastDictMapper;
import cn.datax.service.data.standard.service.ContrastDictService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import cn.datax.common.base.BaseController;
import java.util.List;
import java.util.stream.Collectors;
/**
* <p>
* 字典对照信息表 前端控制器
* </p>
*
* @author yuwei
* @since 2020-09-27
*/
@Api(tags = {"字典对照信息表"})
@RestController
@RequestMapping("/contrastDicts")
public class ContrastDictController extends BaseController {
@Autowired
private ContrastDictService contrastDictService;
@Autowired
private ContrastDictMapper contrastDictMapper;
/**
* 通过ID查询信息
*
* @param id
* @return
*/
@ApiOperation(value = "获取详细信息", notes = "根据url的id来获取详细信息")
@ApiImplicitParam(name = "id", value = "ID", required = true, dataType = "String", paramType = "path")
@GetMapping("/{id}")
public R getContrastDictById(@PathVariable String id) {
ContrastDictEntity contrastDictEntity = contrastDictService.getContrastDictById(id);
return R.ok().setData(contrastDictMapper.toVO(contrastDictEntity));
}
/**
* 分页查询信息
*
* @param contrastDictQuery
* @return
*/
@ApiOperation(value = "分页查询", notes = "")
@ApiImplicitParams({
@ApiImplicitParam(name = "contrastDictQuery", value = "查询实体contrastDictQuery", required = true, dataTypeClass = ContrastDictQuery.class)
})
@GetMapping("/page")
public R getContrastDictPage(ContrastDictQuery contrastDictQuery) {
QueryWrapper<ContrastDictEntity> queryWrapper = new QueryWrapper<>();
IPage<ContrastDictEntity> page = contrastDictService.page(new Page<>(contrastDictQuery.getPageNum(), contrastDictQuery.getPageSize()), queryWrapper);
List<ContrastDictVo> collect = page.getRecords().stream().map(contrastDictMapper::toVO).collect(Collectors.toList());
JsonPage<ContrastDictVo> jsonPage = new JsonPage<>(page.getCurrent(), page.getSize(), page.getTotal(), collect);
return R.ok().setData(jsonPage);
}
/**
* 添加
* @param contrastDict
* @return
*/
@ApiOperation(value = "添加信息", notes = "根据contrastDict对象添加信息")
@ApiImplicitParam(name = "contrastDict", value = "详细实体contrastDict", required = true, dataType = "ContrastDictDto")
@PostMapping()
public R saveContrastDict(@RequestBody @Validated({ValidationGroups.Insert.class}) ContrastDictDto contrastDict) {
ContrastDictEntity contrastDictEntity = contrastDictService.saveContrastDict(contrastDict);
return R.ok().setData(contrastDictMapper.toVO(contrastDictEntity));
}
/**
* 修改
* @param contrastDict
* @return
*/
@ApiOperation(value = "修改信息", notes = "根据url的id来指定修改对象,并根据传过来的信息来修改详细信息")
@ApiImplicitParams({
@ApiImplicitParam(name = "id", value = "ID", required = true, dataType = "String", paramType = "path"),
@ApiImplicitParam(name = "contrastDict", value = "详细实体contrastDict", required = true, dataType = "ContrastDictDto")
})
@PutMapping("/{id}")
public R updateContrastDict(@PathVariable String id, @RequestBody @Validated({ValidationGroups.Update.class}) ContrastDictDto contrastDict) {
ContrastDictEntity contrastDictEntity = contrastDictService.updateContrastDict(contrastDict);
return R.ok().setData(contrastDictMapper.toVO(contrastDictEntity));
}
/**
* 删除
* @param id
* @return
*/
@ApiOperation(value = "删除", notes = "根据url的id来指定删除对象")
@ApiImplicitParam(name = "id", value = "ID", required = true, dataType = "String", paramType = "path")
@DeleteMapping("/{id}")
public R deleteContrastDictById(@PathVariable String id) {
contrastDictService.deleteContrastDictById(id);
return R.ok();
}
/**
* 批量删除
* @param ids
* @return
*/
@ApiOperation(value = "批量删除角色", notes = "根据url的ids来批量删除对象")
@ApiImplicitParam(name = "ids", value = "ID集合", required = true, dataType = "List", paramType = "path")
@DeleteMapping("/batch/{ids}")
public R deleteContrastDictBatch(@PathVariable List<String> ids) {
contrastDictService.deleteContrastDictBatch(ids);
return R.ok();
}
}
package cn.datax.service.data.standard.dao;
import cn.datax.common.base.BaseDao;
import cn.datax.service.data.standard.api.entity.ContrastEntity;
import org.apache.ibatis.annotations.Mapper;
/**
* <p>
* 对照表信息表 Mapper 接口
* </p>
*
* @author yuwei
* @since 2020-09-27
*/
@Mapper
public interface ContrastDao extends BaseDao<ContrastEntity> {
}
package cn.datax.service.data.standard.dao;
import cn.datax.common.base.BaseDao;
import cn.datax.service.data.standard.api.entity.ContrastDictEntity;
import org.apache.ibatis.annotations.Mapper;
/**
* <p>
* 字典对照信息表 Mapper 接口
* </p>
*
* @author yuwei
* @since 2020-09-27
*/
@Mapper
public interface ContrastDictDao extends BaseDao<ContrastDictEntity> {
}
package cn.datax.service.data.standard.mapstruct;
import cn.datax.common.mapstruct.EntityMapper;
import cn.datax.service.data.standard.api.dto.ContrastDictDto;
import cn.datax.service.data.standard.api.entity.ContrastDictEntity;
import cn.datax.service.data.standard.api.vo.ContrastDictVo;
import org.mapstruct.Mapper;
/**
* <p>
* 字典对照信息表 Mapper 实体映射
* </p>
*
* @author yuwei
* @since 2020-09-27
*/
@Mapper(componentModel = "spring")
public interface ContrastDictMapper extends EntityMapper<ContrastDictDto, ContrastDictEntity, ContrastDictVo> {
}
package cn.datax.service.data.standard.mapstruct;
import cn.datax.common.mapstruct.EntityMapper;
import cn.datax.service.data.standard.api.dto.ContrastDto;
import cn.datax.service.data.standard.api.entity.ContrastEntity;
import cn.datax.service.data.standard.api.vo.ContrastVo;
import org.mapstruct.Mapper;
/**
* <p>
* 对照表信息表 Mapper 实体映射
* </p>
*
* @author yuwei
* @since 2020-09-27
*/
@Mapper(componentModel = "spring")
public interface ContrastMapper extends EntityMapper<ContrastDto, ContrastEntity, ContrastVo> {
}
package cn.datax.service.data.standard.service;
import cn.datax.service.data.standard.api.entity.ContrastDictEntity;
import cn.datax.service.data.standard.api.dto.ContrastDictDto;
import cn.datax.common.base.BaseService;
import java.util.List;
/**
* <p>
* 字典对照信息表 服务类
* </p>
*
* @author yuwei
* @since 2020-09-27
*/
public interface ContrastDictService extends BaseService<ContrastDictEntity> {
ContrastDictEntity saveContrastDict(ContrastDictDto contrastDict);
ContrastDictEntity updateContrastDict(ContrastDictDto contrastDict);
ContrastDictEntity getContrastDictById(String id);
void deleteContrastDictById(String id);
void deleteContrastDictBatch(List<String> ids);
}
package cn.datax.service.data.standard.service;
import cn.datax.service.data.standard.api.entity.ContrastEntity;
import cn.datax.service.data.standard.api.dto.ContrastDto;
import cn.datax.common.base.BaseService;
import java.util.List;
/**
* <p>
* 对照表信息表 服务类
* </p>
*
* @author yuwei
* @since 2020-09-27
*/
public interface ContrastService extends BaseService<ContrastEntity> {
ContrastEntity saveContrast(ContrastDto contrast);
ContrastEntity updateContrast(ContrastDto contrast);
ContrastEntity getContrastById(String id);
void deleteContrastById(String id);
void deleteContrastBatch(List<String> ids);
}
package cn.datax.service.data.standard.service.impl;
import cn.datax.service.data.standard.api.entity.ContrastDictEntity;
import cn.datax.service.data.standard.api.dto.ContrastDictDto;
import cn.datax.service.data.standard.service.ContrastDictService;
import cn.datax.service.data.standard.mapstruct.ContrastDictMapper;
import cn.datax.service.data.standard.dao.ContrastDictDao;
import cn.datax.common.base.BaseServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
* <p>
* 字典对照信息表 服务实现类
* </p>
*
* @author yuwei
* @since 2020-09-27
*/
@Service
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public class ContrastDictServiceImpl extends BaseServiceImpl<ContrastDictDao, ContrastDictEntity> implements ContrastDictService {
@Autowired
private ContrastDictDao contrastDictDao;
@Autowired
private ContrastDictMapper contrastDictMapper;
@Override
@Transactional(rollbackFor = Exception.class)
public ContrastDictEntity saveContrastDict(ContrastDictDto contrastDictDto) {
ContrastDictEntity contrastDict = contrastDictMapper.toEntity(contrastDictDto);
contrastDictDao.insert(contrastDict);
return contrastDict;
}
@Override
@Transactional(rollbackFor = Exception.class)
public ContrastDictEntity updateContrastDict(ContrastDictDto contrastDictDto) {
ContrastDictEntity contrastDict = contrastDictMapper.toEntity(contrastDictDto);
contrastDictDao.updateById(contrastDict);
return contrastDict;
}
@Override
public ContrastDictEntity getContrastDictById(String id) {
ContrastDictEntity contrastDictEntity = super.getById(id);
return contrastDictEntity;
}
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteContrastDictById(String id) {
contrastDictDao.deleteById(id);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteContrastDictBatch(List<String> ids) {
contrastDictDao.deleteBatchIds(ids);
}
}
package cn.datax.service.data.standard.service.impl;
import cn.datax.service.data.standard.api.entity.ContrastEntity;
import cn.datax.service.data.standard.api.dto.ContrastDto;
import cn.datax.service.data.standard.service.ContrastService;
import cn.datax.service.data.standard.mapstruct.ContrastMapper;
import cn.datax.service.data.standard.dao.ContrastDao;
import cn.datax.common.base.BaseServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
* <p>
* 对照表信息表 服务实现类
* </p>
*
* @author yuwei
* @since 2020-09-27
*/
@Service
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public class ContrastServiceImpl extends BaseServiceImpl<ContrastDao, ContrastEntity> implements ContrastService {
@Autowired
private ContrastDao contrastDao;
@Autowired
private ContrastMapper contrastMapper;
@Override
@Transactional(rollbackFor = Exception.class)
public ContrastEntity saveContrast(ContrastDto contrastDto) {
ContrastEntity contrast = contrastMapper.toEntity(contrastDto);
contrastDao.insert(contrast);
return contrast;
}
@Override
@Transactional(rollbackFor = Exception.class)
public ContrastEntity updateContrast(ContrastDto contrastDto) {
ContrastEntity contrast = contrastMapper.toEntity(contrastDto);
contrastDao.updateById(contrast);
return contrast;
}
@Override
public ContrastEntity getContrastById(String id) {
ContrastEntity contrastEntity = super.getById(id);
return contrastEntity;
}
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteContrastById(String id) {
contrastDao.deleteById(id);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteContrastBatch(List<String> ids) {
contrastDao.deleteBatchIds(ids);
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment