feat: collaboration and statistics

This commit is contained in:
gin
2026-05-15 09:19:09 +08:00
parent cdee21ee8e
commit 2757a4fb49
91 changed files with 4504 additions and 1301 deletions
@@ -0,0 +1,402 @@
package com.agileboot.domain.collaboration.record;
import com.agileboot.common.core.page.PageDTO;
import com.agileboot.domain.collaboration.record.command.AddCollaborationRecordCommand;
import com.agileboot.domain.collaboration.record.command.CollaborationExpenditureCommand;
import com.agileboot.domain.collaboration.record.command.CollaborationFileCommand;
import com.agileboot.domain.collaboration.record.command.CollaborationSettlementCommand;
import com.agileboot.domain.collaboration.record.command.CollaborationTaskCommand;
import com.agileboot.domain.collaboration.record.command.UpdateCollaborationRecordCommand;
import com.agileboot.domain.collaboration.record.db.CollaborationExpenditureEntity;
import com.agileboot.domain.collaboration.record.db.CollaborationExpenditureService;
import com.agileboot.domain.collaboration.record.db.CollaborationFileEntity;
import com.agileboot.domain.collaboration.record.db.CollaborationFileService;
import com.agileboot.domain.collaboration.record.db.CollaborationRecordEntity;
import com.agileboot.domain.collaboration.record.db.CollaborationRecordService;
import com.agileboot.domain.collaboration.record.db.CollaborationSettlementEntity;
import com.agileboot.domain.collaboration.record.db.CollaborationSettlementService;
import com.agileboot.domain.collaboration.record.db.CollaborationTaskEntity;
import com.agileboot.domain.collaboration.record.db.CollaborationTaskService;
import com.agileboot.domain.collaboration.record.dto.CollaborationExpenditureDTO;
import com.agileboot.domain.collaboration.record.dto.CollaborationFileDTO;
import com.agileboot.domain.collaboration.record.dto.CollaborationMonthlyStatisticsDTO;
import com.agileboot.domain.collaboration.record.dto.CollaborationOptionDTO;
import com.agileboot.domain.collaboration.record.dto.CollaborationRecordDTO;
import com.agileboot.domain.collaboration.record.dto.CollaborationRecordDetailDTO;
import com.agileboot.domain.collaboration.record.dto.CollaborationSettlementDTO;
import com.agileboot.domain.collaboration.record.dto.CollaborationTaskDTO;
import com.agileboot.domain.collaboration.record.dto.SettlementStatusDTO;
import com.agileboot.domain.collaboration.record.enumtype.CollaborationOptionEnum;
import com.agileboot.domain.collaboration.record.enumtype.SettlementStatusEnum;
import com.agileboot.domain.collaboration.record.model.CollaborationRecordModel;
import com.agileboot.domain.collaboration.record.model.CollaborationRecordModelFactory;
import com.agileboot.domain.collaboration.record.query.CollaborationRecordQuery;
import com.agileboot.domain.common.command.BulkOperationCommand;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
* @author codex
*/
@Service
@RequiredArgsConstructor
public class CollaborationRecordApplicationService {
private static final String PURCHASE_FEE = "拍单费用";
private static final String DELIVERY_FEE = "快递费用";
private static final String REMUNERATION_FEE = "稿费";
private final CollaborationRecordModelFactory recordModelFactory;
private final CollaborationRecordService recordService;
private final CollaborationTaskService taskService;
private final CollaborationExpenditureService expenditureService;
private final CollaborationSettlementService settlementService;
private final CollaborationFileService fileService;
public PageDTO<CollaborationRecordDTO> getRecordList(CollaborationRecordQuery query) {
Page<CollaborationRecordEntity> page = recordService.page(query.toPage(), query.toQueryWrapper());
List<CollaborationRecordDTO> records = page.getRecords().stream()
.map(this::buildRecordDTO)
.collect(Collectors.toList());
return new PageDTO<>(records, page.getTotal());
}
public CollaborationRecordDetailDTO getRecordInfo(Long recordId) {
CollaborationRecordModel model = recordModelFactory.loadById(recordId);
CollaborationRecordDetailDTO dto = new CollaborationRecordDetailDTO(model);
fillDetailChildren(dto, recordId);
fillRecordStats(dto, recordId);
return dto;
}
@Transactional(rollbackFor = Exception.class)
public void addRecord(AddCollaborationRecordCommand command) {
CollaborationRecordModel model = recordModelFactory.create();
model.loadFromAddCommand(command);
model.saveRecord();
saveChildren(model.getRecordId(), command);
}
@Transactional(rollbackFor = Exception.class)
public void updateRecord(UpdateCollaborationRecordCommand command) {
CollaborationRecordModel model = recordModelFactory.loadById(command.getRecordId());
model.loadFromUpdateCommand(command);
model.updateRecord();
replaceChildren(command.getRecordId(), command);
}
@Transactional(rollbackFor = Exception.class)
public void deleteRecord(BulkOperationCommand<Long> command) {
Set<Long> ids = command.getIds();
if (ids == null || ids.isEmpty()) {
return;
}
taskService.removeByRecordIds(ids);
expenditureService.removeByRecordIds(ids);
settlementService.removeByRecordIds(ids);
fileService.removeByRecordIds(ids);
recordService.removeBatchByIds(ids);
}
public List<CollaborationOptionDTO> getOptions() {
return Arrays.stream(CollaborationOptionEnum.values())
.map(item -> new CollaborationOptionDTO(item.getType(), item.getLabel(), Arrays.asList(item.getValues())))
.collect(Collectors.toList());
}
public List<CollaborationMonthlyStatisticsDTO> getMonthlyStatistics(Integer year) {
List<CollaborationMonthlyStatisticsDTO> statistics = new ArrayList<>();
for (int month = 1; month <= 12; month++) {
statistics.add(buildMonthlyStatistics(year, month));
}
return statistics;
}
private CollaborationRecordDTO buildRecordDTO(CollaborationRecordEntity entity) {
CollaborationRecordDTO dto = new CollaborationRecordDTO(entity);
fillRecordStats(dto, entity.getRecordId());
return dto;
}
private void fillDetailChildren(CollaborationRecordDetailDTO dto, Long recordId) {
dto.setTasks(taskService.listByRecordId(recordId).stream()
.map(CollaborationTaskDTO::new)
.collect(Collectors.toList()));
dto.setExpenditures(expenditureService.listByRecordId(recordId).stream()
.map(CollaborationExpenditureDTO::new)
.collect(Collectors.toList()));
dto.setSettlements(settlementService.listByRecordId(recordId).stream()
.map(CollaborationSettlementDTO::new)
.collect(Collectors.toList()));
dto.setFiles(fileService.listByRecordId(recordId).stream()
.map(CollaborationFileDTO::new)
.collect(Collectors.toList()));
}
private void fillRecordStats(CollaborationRecordDTO dto, Long recordId) {
List<CollaborationTaskEntity> tasks = taskService.listByRecordId(recordId);
List<CollaborationExpenditureEntity> expenditures = expenditureService.listByRecordId(recordId);
List<CollaborationSettlementEntity> settlements = settlementService.listByRecordId(recordId);
dto.setTasksNum(tasks.size());
dto.setCompletedTasksNum((int) tasks.stream().filter(item -> item.getReleaseDate() != null).count());
dto.setPurchaseSettlementStatus(getStatus(dto.getPurchasePrice(), settlements, PURCHASE_FEE));
dto.setDeliverySettlementStatus(getStatus(sumExpenditure(expenditures, DELIVERY_FEE), settlements, DELIVERY_FEE));
dto.setRemunerationSettlementStatus(getStatus(dto.getRemuneration(), settlements, REMUNERATION_FEE));
}
private SettlementStatusDTO getStatus(
BigDecimal expectedAmount, List<CollaborationSettlementEntity> settlements, String purpose) {
List<CollaborationSettlementEntity> matched = filterSettlements(settlements, purpose);
if (matched.isEmpty()) {
return toStatusDTO(SettlementStatusEnum.NONE);
}
BigDecimal settledAmount = sumSettlement(matched);
BigDecimal expected = defaultAmount(expectedAmount);
if (isAllSettlementPending(matched)) {
return toStatusDTO(SettlementStatusEnum.UNSETTLED);
}
if (isAllSettlementDue(matched) && settledAmount.compareTo(expected) >= 0) {
return toStatusDTO(SettlementStatusEnum.SETTLED);
}
return toStatusDTO(SettlementStatusEnum.PARTIAL);
}
private List<CollaborationSettlementEntity> filterSettlements(
List<CollaborationSettlementEntity> settlements, String purpose) {
if (settlements == null) {
return Collections.emptyList();
}
return settlements.stream()
.filter(item -> purpose.equals(item.getPurpose()))
.collect(Collectors.toList());
}
private SettlementStatusDTO toStatusDTO(SettlementStatusEnum status) {
return new SettlementStatusDTO(status.getValue(), status.getLabel());
}
private boolean isAllSettlementDue(List<CollaborationSettlementEntity> settlements) {
Date today = getTodayStart();
return settlements.stream()
.allMatch(item -> item.getSettleDate() != null && !item.getSettleDate().after(today));
}
private boolean isAllSettlementPending(List<CollaborationSettlementEntity> settlements) {
Date today = getTodayStart();
return settlements.stream()
.allMatch(item -> item.getSettleDate() == null || item.getSettleDate().after(today));
}
private void replaceChildren(Long recordId, AddCollaborationRecordCommand command) {
List<Long> ids = Collections.singletonList(recordId);
taskService.removeByRecordIds(ids);
expenditureService.removeByRecordIds(ids);
settlementService.removeByRecordIds(ids);
fileService.removeByRecordIds(ids);
saveChildren(recordId, command);
}
private void saveChildren(Long recordId, AddCollaborationRecordCommand command) {
saveTasks(recordId, command.getTasks());
saveExpenditures(recordId, command.getExpenditures());
saveSettlements(recordId, command.getSettlements());
saveFiles(recordId, command.getFiles());
}
private void saveTasks(Long recordId, List<CollaborationTaskCommand> tasks) {
List<CollaborationTaskEntity> entities = toTaskEntities(recordId, tasks);
if (!entities.isEmpty()) {
taskService.saveBatch(entities);
}
}
private void saveExpenditures(Long recordId, List<CollaborationExpenditureCommand> expenditures) {
List<CollaborationExpenditureEntity> entities = toExpenditureEntities(recordId, expenditures);
if (!entities.isEmpty()) {
expenditureService.saveBatch(entities);
}
}
private void saveSettlements(Long recordId, List<CollaborationSettlementCommand> settlements) {
List<CollaborationSettlementEntity> entities = toSettlementEntities(recordId, settlements);
if (!entities.isEmpty()) {
settlementService.saveBatch(entities);
}
}
private void saveFiles(Long recordId, List<CollaborationFileCommand> files) {
List<CollaborationFileEntity> entities = toFileEntities(recordId, files);
if (!entities.isEmpty()) {
fileService.saveBatch(entities);
}
}
private List<CollaborationTaskEntity> toTaskEntities(Long recordId, List<CollaborationTaskCommand> tasks) {
List<CollaborationTaskEntity> entities = new ArrayList<>();
if (tasks == null) {
return entities;
}
for (int i = 0; i < tasks.size(); i++) {
entities.add(toTaskEntity(recordId, tasks.get(i), i));
}
return entities;
}
private CollaborationTaskEntity toTaskEntity(Long recordId, CollaborationTaskCommand command, int index) {
CollaborationTaskEntity entity = new CollaborationTaskEntity();
entity.setRecordId(recordId);
entity.setReleaseDate(command.getReleaseDate());
entity.setSortOrder(index);
return entity;
}
private List<CollaborationExpenditureEntity> toExpenditureEntities(
Long recordId, List<CollaborationExpenditureCommand> expenditures) {
if (expenditures == null) {
return Collections.emptyList();
}
return expenditures.stream()
.map(item -> toExpenditureEntity(recordId, item))
.collect(Collectors.toList());
}
private CollaborationExpenditureEntity toExpenditureEntity(Long recordId, CollaborationExpenditureCommand command) {
CollaborationExpenditureEntity entity = new CollaborationExpenditureEntity();
entity.setRecordId(recordId);
entity.setSpendDate(command.getSpendDate());
entity.setAmount(command.getAmount());
entity.setPurpose(command.getPurpose());
return entity;
}
private List<CollaborationSettlementEntity> toSettlementEntities(
Long recordId, List<CollaborationSettlementCommand> settlements) {
if (settlements == null) {
return Collections.emptyList();
}
return settlements.stream()
.map(item -> toSettlementEntity(recordId, item))
.collect(Collectors.toList());
}
private CollaborationSettlementEntity toSettlementEntity(Long recordId, CollaborationSettlementCommand command) {
CollaborationSettlementEntity entity = new CollaborationSettlementEntity();
entity.setRecordId(recordId);
entity.setSettleDate(command.getSettleDate());
entity.setMethod(command.getMethod());
entity.setIncome(command.getIncome());
entity.setPurpose(command.getPurpose());
return entity;
}
private List<CollaborationFileEntity> toFileEntities(Long recordId, List<CollaborationFileCommand> files) {
List<CollaborationFileEntity> entities = new ArrayList<>();
if (files == null) {
return entities;
}
for (int i = 0; i < files.size(); i++) {
entities.add(toFileEntity(recordId, files.get(i), i));
}
return entities;
}
private CollaborationFileEntity toFileEntity(Long recordId, CollaborationFileCommand command, int index) {
CollaborationFileEntity entity = new CollaborationFileEntity();
entity.setRecordId(recordId);
entity.setFileType(command.getFileType());
entity.setUrl(command.getUrl());
entity.setFileName(command.getFileName());
entity.setNewFileName(command.getNewFileName());
entity.setOriginalFilename(command.getOriginalFilename());
entity.setSortOrder(index);
return entity;
}
private CollaborationMonthlyStatisticsDTO buildMonthlyStatistics(Integer year, Integer month) {
Date[] range = getMonthRange(year, month);
BigDecimal purchasePrice = sumPurchasePrice(range);
BigDecimal expenditureAmount = sumExpenditure(range);
BigDecimal settledRemuneration = sumSettlement(range, REMUNERATION_FEE);
BigDecimal settledTotal = sumSettlement(range, null);
return new CollaborationMonthlyStatisticsDTO(month, purchasePrice, expenditureAmount,
settledRemuneration, settledTotal);
}
private BigDecimal sumPurchasePrice(Date[] range) {
List<CollaborationRecordEntity> records = recordService.list(new QueryWrapper<CollaborationRecordEntity>()
.ge("purchase_date", range[0])
.le("purchase_date", range[1]));
return records.stream()
.map(CollaborationRecordEntity::getPurchasePrice)
.map(this::defaultAmount)
.reduce(BigDecimal.ZERO, BigDecimal::add);
}
private BigDecimal sumExpenditure(Date[] range) {
List<CollaborationExpenditureEntity> expenditures = expenditureService.list(
new QueryWrapper<CollaborationExpenditureEntity>().ge("spend_date", range[0]).le("spend_date", range[1]));
return expenditures.stream()
.map(CollaborationExpenditureEntity::getAmount)
.map(this::defaultAmount)
.reduce(BigDecimal.ZERO, BigDecimal::add);
}
private BigDecimal sumSettlement(Date[] range, String purpose) {
QueryWrapper<CollaborationSettlementEntity> wrapper = new QueryWrapper<CollaborationSettlementEntity>()
.ge("settle_date", range[0])
.le("settle_date", range[1])
.eq(purpose != null, "purpose", purpose);
return sumSettlement(settlementService.list(wrapper));
}
private BigDecimal sumExpenditure(List<CollaborationExpenditureEntity> expenditures, String purpose) {
return expenditures.stream()
.filter(item -> purpose.equals(item.getPurpose()))
.map(CollaborationExpenditureEntity::getAmount)
.map(this::defaultAmount)
.reduce(BigDecimal.ZERO, BigDecimal::add);
}
private BigDecimal sumSettlement(List<CollaborationSettlementEntity> settlements) {
return settlements.stream()
.map(CollaborationSettlementEntity::getIncome)
.map(this::defaultAmount)
.reduce(BigDecimal.ZERO, BigDecimal::add);
}
private BigDecimal defaultAmount(BigDecimal amount) {
return amount == null ? BigDecimal.ZERO : amount;
}
private Date[] getMonthRange(Integer year, Integer month) {
Calendar start = Calendar.getInstance();
start.set(year, month - 1, 1, 0, 0, 0);
start.set(Calendar.MILLISECOND, 0);
Calendar end = (Calendar) start.clone();
end.add(Calendar.MONTH, 1);
end.add(Calendar.MILLISECOND, -1);
return new Date[]{start.getTime(), end.getTime()};
}
private Date getTodayStart() {
Calendar today = Calendar.getInstance();
today.set(Calendar.HOUR_OF_DAY, 0);
today.set(Calendar.MINUTE, 0);
today.set(Calendar.SECOND, 0);
today.set(Calendar.MILLISECOND, 0);
return today.getTime();
}
}
@@ -0,0 +1,83 @@
package com.agileboot.domain.collaboration.record.command;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.validation.Valid;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.PositiveOrZero;
import javax.validation.constraints.Size;
import lombok.Data;
/**
* @author codex
*/
@Data
public class AddCollaborationRecordCommand {
@NotBlank(message = "品牌不能为空")
@Size(max = 100, message = "品牌长度不能超过100个字符")
protected String brand;
@NotBlank(message = "物品不能为空")
@Size(max = 100, message = "物品长度不能超过100个字符")
protected String goods;
@Size(max = 50, message = "合作平台长度不能超过50个字符")
protected String cooperationPlatform;
@NotNull(message = "返图数量不能为空")
@Min(value = 1, message = "返图数量至少为1")
protected Integer imageReturnNum;
@Size(max = 30, message = "留存方式长度不能超过30个字符")
protected String retainedMethod;
@Size(max = 30, message = "合作方式长度不能超过30个字符")
protected String cooperatedMethod;
@Size(max = 30, message = "购入方式长度不能超过30个字符")
protected String purchaseMethod;
@PositiveOrZero(message = "购入金额不能小于0")
protected BigDecimal purchasePrice;
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
protected Date purchaseDate;
@Size(max = 30, message = "购入平台长度不能超过30个字符")
protected String purchasePlatform;
@NotNull(message = "预完成日期不能为空")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
protected Date deadline;
@PositiveOrZero(message = "稿费不能小于0")
protected BigDecimal remuneration;
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
protected Date completeDate;
@Size(max = 1000, message = "拍摄要求长度不能超过1000个字符")
protected String requirements;
@Size(max = 1000, message = "备注长度不能超过1000个字符")
protected String remark;
@Valid
protected List<CollaborationTaskCommand> tasks = new ArrayList<>();
@Valid
protected List<CollaborationExpenditureCommand> expenditures = new ArrayList<>();
@Valid
protected List<CollaborationSettlementCommand> settlements = new ArrayList<>();
@Valid
protected List<CollaborationFileCommand> files = new ArrayList<>();
}
@@ -0,0 +1,25 @@
package com.agileboot.domain.collaboration.record.command;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.math.BigDecimal;
import java.util.Date;
import javax.validation.constraints.PositiveOrZero;
import javax.validation.constraints.Size;
import lombok.Data;
/**
* @author codex
*/
@Data
public class CollaborationExpenditureCommand {
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date spendDate;
@PositiveOrZero(message = "支出金额不能小于0")
private BigDecimal amount;
@Size(max = 30, message = "支出用途长度不能超过30个字符")
private String purpose;
}
@@ -0,0 +1,30 @@
package com.agileboot.domain.collaboration.record.command;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import lombok.Data;
/**
* @author codex
*/
@Data
public class CollaborationFileCommand {
@NotBlank(message = "文件类型不能为空")
@Size(max = 30, message = "文件类型长度不能超过30个字符")
private String fileType;
@NotBlank(message = "文件地址不能为空")
@Size(max = 500, message = "文件地址长度不能超过500个字符")
private String url;
@Size(max = 300, message = "文件路径长度不能超过300个字符")
private String fileName;
@Size(max = 200, message = "服务端文件名长度不能超过200个字符")
private String newFileName;
@Size(max = 300, message = "原始文件名长度不能超过300个字符")
private String originalFilename;
}
@@ -0,0 +1,28 @@
package com.agileboot.domain.collaboration.record.command;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.math.BigDecimal;
import java.util.Date;
import javax.validation.constraints.PositiveOrZero;
import javax.validation.constraints.Size;
import lombok.Data;
/**
* @author codex
*/
@Data
public class CollaborationSettlementCommand {
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date settleDate;
@Size(max = 30, message = "结款方式长度不能超过30个字符")
private String method;
@PositiveOrZero(message = "结款金额不能小于0")
private BigDecimal income;
@Size(max = 30, message = "结款用途长度不能超过30个字符")
private String purpose;
}
@@ -0,0 +1,16 @@
package com.agileboot.domain.collaboration.record.command;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.util.Date;
import lombok.Data;
/**
* @author codex
*/
@Data
public class CollaborationTaskCommand {
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date releaseDate;
}
@@ -0,0 +1,19 @@
package com.agileboot.domain.collaboration.record.command;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Positive;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* @author codex
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class UpdateCollaborationRecordCommand extends AddCollaborationRecordCommand {
@NotNull(message = "合作记录ID不能为空")
@Positive
private Long recordId;
}
@@ -0,0 +1,46 @@
package com.agileboot.domain.collaboration.record.db;
import com.agileboot.common.core.base.BaseEntity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import lombok.Getter;
import lombok.Setter;
/**
* @author codex
*/
@Getter
@Setter
@TableName("collaboration_expenditure")
@ApiModel(value = "CollaborationExpenditureEntity对象", description = "合作支出表")
public class CollaborationExpenditureEntity extends BaseEntity<CollaborationExpenditureEntity> {
@TableId(value = "expenditure_id", type = IdType.AUTO)
private Long expenditureId;
@TableField("record_id")
private Long recordId;
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
@TableField("spend_date")
private Date spendDate;
@TableField("amount")
private BigDecimal amount;
@TableField("purpose")
private String purpose;
@Override
public Serializable pkVal() {
return this.expenditureId;
}
}
@@ -0,0 +1,10 @@
package com.agileboot.domain.collaboration.record.db;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author codex
*/
public interface CollaborationExpenditureMapper extends BaseMapper<CollaborationExpenditureEntity> {
}
@@ -0,0 +1,16 @@
package com.agileboot.domain.collaboration.record.db;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.Collection;
import java.util.List;
/**
* @author codex
*/
public interface CollaborationExpenditureService extends IService<CollaborationExpenditureEntity> {
List<CollaborationExpenditureEntity> listByRecordId(Long recordId);
void removeByRecordIds(Collection<Long> recordIds);
}
@@ -0,0 +1,36 @@
package com.agileboot.domain.collaboration.record.db;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import org.springframework.stereotype.Service;
/**
* @author codex
*/
@Service
public class CollaborationExpenditureServiceImpl
extends ServiceImpl<CollaborationExpenditureMapper, CollaborationExpenditureEntity>
implements CollaborationExpenditureService {
@Override
public List<CollaborationExpenditureEntity> listByRecordId(Long recordId) {
if (recordId == null) {
return Collections.emptyList();
}
return list(new QueryWrapper<CollaborationExpenditureEntity>()
.eq("record_id", recordId)
.orderByAsc("spend_date"));
}
@Override
public void removeByRecordIds(Collection<Long> recordIds) {
if (recordIds == null || recordIds.isEmpty()) {
return;
}
remove(new QueryWrapper<CollaborationExpenditureEntity>().in("record_id", recordIds));
}
}
@@ -0,0 +1,51 @@
package com.agileboot.domain.collaboration.record.db;
import com.agileboot.common.core.base.BaseEntity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import java.io.Serializable;
import lombok.Getter;
import lombok.Setter;
/**
* @author codex
*/
@Getter
@Setter
@TableName("collaboration_file")
@ApiModel(value = "CollaborationFileEntity对象", description = "合作文件表")
public class CollaborationFileEntity extends BaseEntity<CollaborationFileEntity> {
@TableId(value = "file_id", type = IdType.AUTO)
private Long fileId;
@TableField("record_id")
private Long recordId;
@TableField("file_type")
private String fileType;
@TableField("url")
private String url;
@TableField("file_name")
private String fileName;
@TableField("new_file_name")
private String newFileName;
@TableField("original_filename")
private String originalFilename;
@TableField("sort_order")
private Integer sortOrder;
@Override
public Serializable pkVal() {
return this.fileId;
}
}
@@ -0,0 +1,10 @@
package com.agileboot.domain.collaboration.record.db;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author codex
*/
public interface CollaborationFileMapper extends BaseMapper<CollaborationFileEntity> {
}
@@ -0,0 +1,16 @@
package com.agileboot.domain.collaboration.record.db;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.Collection;
import java.util.List;
/**
* @author codex
*/
public interface CollaborationFileService extends IService<CollaborationFileEntity> {
List<CollaborationFileEntity> listByRecordId(Long recordId);
void removeByRecordIds(Collection<Long> recordIds);
}
@@ -0,0 +1,36 @@
package com.agileboot.domain.collaboration.record.db;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import org.springframework.stereotype.Service;
/**
* @author codex
*/
@Service
public class CollaborationFileServiceImpl
extends ServiceImpl<CollaborationFileMapper, CollaborationFileEntity>
implements CollaborationFileService {
@Override
public List<CollaborationFileEntity> listByRecordId(Long recordId) {
if (recordId == null) {
return Collections.emptyList();
}
return list(new QueryWrapper<CollaborationFileEntity>()
.eq("record_id", recordId)
.orderByAsc("file_type", "sort_order"));
}
@Override
public void removeByRecordIds(Collection<Long> recordIds) {
if (recordIds == null || recordIds.isEmpty()) {
return;
}
remove(new QueryWrapper<CollaborationFileEntity>().in("record_id", recordIds));
}
}
@@ -0,0 +1,100 @@
package com.agileboot.domain.collaboration.record.db;
import com.agileboot.common.core.base.BaseEntity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import lombok.Getter;
import lombok.Setter;
/**
* @author codex
*/
@Getter
@Setter
@TableName("collaboration_record")
@ApiModel(value = "CollaborationRecordEntity对象", description = "合作记录表")
public class CollaborationRecordEntity extends BaseEntity<CollaborationRecordEntity> {
private static final long serialVersionUID = 1L;
@ApiModelProperty("合作记录ID")
@TableId(value = "record_id", type = IdType.AUTO)
private Long recordId;
@ApiModelProperty("品牌")
@TableField("brand")
private String brand;
@ApiModelProperty("物品")
@TableField("goods")
private String goods;
@ApiModelProperty("合作平台")
@TableField("cooperation_platform")
private String cooperationPlatform;
@ApiModelProperty("返图数量")
@TableField("image_return_num")
private Integer imageReturnNum;
@ApiModelProperty("留存方式")
@TableField("retained_method")
private String retainedMethod;
@ApiModelProperty("合作方式")
@TableField("cooperated_method")
private String cooperatedMethod;
@ApiModelProperty("购入方式")
@TableField("purchase_method")
private String purchaseMethod;
@ApiModelProperty("购入金额")
@TableField("purchase_price")
private BigDecimal purchasePrice;
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
@ApiModelProperty("购入日期")
@TableField("purchase_date")
private Date purchaseDate;
@ApiModelProperty("购入平台")
@TableField("purchase_platform")
private String purchasePlatform;
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
@ApiModelProperty("预完成日期")
@TableField("deadline")
private Date deadline;
@ApiModelProperty("稿费")
@TableField("remuneration")
private BigDecimal remuneration;
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
@ApiModelProperty("完成日期")
@TableField("complete_date")
private Date completeDate;
@ApiModelProperty("拍摄要求")
@TableField("requirements")
private String requirements;
@ApiModelProperty("备注")
@TableField("remark")
private String remark;
@Override
public Serializable pkVal() {
return this.recordId;
}
}
@@ -0,0 +1,10 @@
package com.agileboot.domain.collaboration.record.db;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author codex
*/
public interface CollaborationRecordMapper extends BaseMapper<CollaborationRecordEntity> {
}
@@ -0,0 +1,10 @@
package com.agileboot.domain.collaboration.record.db;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* @author codex
*/
public interface CollaborationRecordService extends IService<CollaborationRecordEntity> {
}
@@ -0,0 +1,14 @@
package com.agileboot.domain.collaboration.record.db;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* @author codex
*/
@Service
public class CollaborationRecordServiceImpl
extends ServiceImpl<CollaborationRecordMapper, CollaborationRecordEntity>
implements CollaborationRecordService {
}
@@ -0,0 +1,49 @@
package com.agileboot.domain.collaboration.record.db;
import com.agileboot.common.core.base.BaseEntity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import lombok.Getter;
import lombok.Setter;
/**
* @author codex
*/
@Getter
@Setter
@TableName("collaboration_settlement")
@ApiModel(value = "CollaborationSettlementEntity对象", description = "合作结款表")
public class CollaborationSettlementEntity extends BaseEntity<CollaborationSettlementEntity> {
@TableId(value = "settlement_id", type = IdType.AUTO)
private Long settlementId;
@TableField("record_id")
private Long recordId;
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
@TableField("settle_date")
private Date settleDate;
@TableField("method")
private String method;
@TableField("income")
private BigDecimal income;
@TableField("purpose")
private String purpose;
@Override
public Serializable pkVal() {
return this.settlementId;
}
}
@@ -0,0 +1,10 @@
package com.agileboot.domain.collaboration.record.db;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author codex
*/
public interface CollaborationSettlementMapper extends BaseMapper<CollaborationSettlementEntity> {
}
@@ -0,0 +1,16 @@
package com.agileboot.domain.collaboration.record.db;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.Collection;
import java.util.List;
/**
* @author codex
*/
public interface CollaborationSettlementService extends IService<CollaborationSettlementEntity> {
List<CollaborationSettlementEntity> listByRecordId(Long recordId);
void removeByRecordIds(Collection<Long> recordIds);
}
@@ -0,0 +1,36 @@
package com.agileboot.domain.collaboration.record.db;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import org.springframework.stereotype.Service;
/**
* @author codex
*/
@Service
public class CollaborationSettlementServiceImpl
extends ServiceImpl<CollaborationSettlementMapper, CollaborationSettlementEntity>
implements CollaborationSettlementService {
@Override
public List<CollaborationSettlementEntity> listByRecordId(Long recordId) {
if (recordId == null) {
return Collections.emptyList();
}
return list(new QueryWrapper<CollaborationSettlementEntity>()
.eq("record_id", recordId)
.orderByAsc("settle_date"));
}
@Override
public void removeByRecordIds(Collection<Long> recordIds) {
if (recordIds == null || recordIds.isEmpty()) {
return;
}
remove(new QueryWrapper<CollaborationSettlementEntity>().in("record_id", recordIds));
}
}
@@ -0,0 +1,42 @@
package com.agileboot.domain.collaboration.record.db;
import com.agileboot.common.core.base.BaseEntity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import java.io.Serializable;
import java.util.Date;
import lombok.Getter;
import lombok.Setter;
/**
* @author codex
*/
@Getter
@Setter
@TableName("collaboration_task")
@ApiModel(value = "CollaborationTaskEntity对象", description = "合作笔记任务表")
public class CollaborationTaskEntity extends BaseEntity<CollaborationTaskEntity> {
@TableId(value = "task_id", type = IdType.AUTO)
private Long taskId;
@TableField("record_id")
private Long recordId;
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
@TableField("release_date")
private Date releaseDate;
@TableField("sort_order")
private Integer sortOrder;
@Override
public Serializable pkVal() {
return this.taskId;
}
}
@@ -0,0 +1,10 @@
package com.agileboot.domain.collaboration.record.db;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author codex
*/
public interface CollaborationTaskMapper extends BaseMapper<CollaborationTaskEntity> {
}
@@ -0,0 +1,16 @@
package com.agileboot.domain.collaboration.record.db;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.Collection;
import java.util.List;
/**
* @author codex
*/
public interface CollaborationTaskService extends IService<CollaborationTaskEntity> {
List<CollaborationTaskEntity> listByRecordId(Long recordId);
void removeByRecordIds(Collection<Long> recordIds);
}
@@ -0,0 +1,36 @@
package com.agileboot.domain.collaboration.record.db;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import org.springframework.stereotype.Service;
/**
* @author codex
*/
@Service
public class CollaborationTaskServiceImpl
extends ServiceImpl<CollaborationTaskMapper, CollaborationTaskEntity>
implements CollaborationTaskService {
@Override
public List<CollaborationTaskEntity> listByRecordId(Long recordId) {
if (recordId == null) {
return Collections.emptyList();
}
return list(new QueryWrapper<CollaborationTaskEntity>()
.eq("record_id", recordId)
.orderByAsc("sort_order"));
}
@Override
public void removeByRecordIds(Collection<Long> recordIds) {
if (recordIds == null || recordIds.isEmpty()) {
return;
}
remove(new QueryWrapper<CollaborationTaskEntity>().in("record_id", recordIds));
}
}
@@ -0,0 +1,33 @@
package com.agileboot.domain.collaboration.record.dto;
import cn.hutool.core.bean.BeanUtil;
import com.agileboot.domain.collaboration.record.db.CollaborationExpenditureEntity;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.math.BigDecimal;
import java.util.Date;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author codex
*/
@NoArgsConstructor
@Data
public class CollaborationExpenditureDTO {
public CollaborationExpenditureDTO(CollaborationExpenditureEntity entity) {
if (entity != null) {
BeanUtil.copyProperties(entity, this);
}
}
private Long expenditureId;
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date spendDate;
private BigDecimal amount;
private String purpose;
}
@@ -0,0 +1,35 @@
package com.agileboot.domain.collaboration.record.dto;
import cn.hutool.core.bean.BeanUtil;
import com.agileboot.domain.collaboration.record.db.CollaborationFileEntity;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author codex
*/
@NoArgsConstructor
@Data
public class CollaborationFileDTO {
public CollaborationFileDTO(CollaborationFileEntity entity) {
if (entity != null) {
BeanUtil.copyProperties(entity, this);
}
}
private Long fileId;
private String fileType;
private String url;
private String fileName;
private String newFileName;
private String originalFilename;
private Integer sortOrder;
}
@@ -0,0 +1,26 @@
package com.agileboot.domain.collaboration.record.dto;
import java.math.BigDecimal;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author codex
*/
@AllArgsConstructor
@NoArgsConstructor
@Data
public class CollaborationMonthlyStatisticsDTO {
private Integer month;
private BigDecimal purchasePrice;
private BigDecimal expenditureAmount;
private BigDecimal settledRemuneration;
private BigDecimal settledTotal;
}
@@ -0,0 +1,22 @@
package com.agileboot.domain.collaboration.record.dto;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author codex
*/
@AllArgsConstructor
@NoArgsConstructor
@Data
public class CollaborationOptionDTO {
private String type;
private String label;
private List<String> values;
}
@@ -0,0 +1,71 @@
package com.agileboot.domain.collaboration.record.dto;
import cn.hutool.core.bean.BeanUtil;
import com.agileboot.domain.collaboration.record.db.CollaborationRecordEntity;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.math.BigDecimal;
import java.util.Date;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author codex
*/
@NoArgsConstructor
@Data
public class CollaborationRecordDTO {
public CollaborationRecordDTO(CollaborationRecordEntity entity) {
if (entity != null) {
BeanUtil.copyProperties(entity, this);
}
}
private Long recordId;
private String brand;
private String goods;
private String cooperationPlatform;
private Integer imageReturnNum;
private String retainedMethod;
private String cooperatedMethod;
private String purchaseMethod;
private BigDecimal purchasePrice;
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date purchaseDate;
private String purchasePlatform;
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date deadline;
private BigDecimal remuneration;
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date completeDate;
private String requirements;
private String remark;
private Integer tasksNum;
private Integer completedTasksNum;
private SettlementStatusDTO purchaseSettlementStatus;
private SettlementStatusDTO deliverySettlementStatus;
private SettlementStatusDTO remunerationSettlementStatus;
private Date createTime;
}
@@ -0,0 +1,30 @@
package com.agileboot.domain.collaboration.record.dto;
import com.agileboot.domain.collaboration.record.db.CollaborationRecordEntity;
import java.util.ArrayList;
import java.util.List;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
/**
* @author codex
*/
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor
@Data
public class CollaborationRecordDetailDTO extends CollaborationRecordDTO {
public CollaborationRecordDetailDTO(CollaborationRecordEntity entity) {
super(entity);
}
private List<CollaborationTaskDTO> tasks = new ArrayList<>();
private List<CollaborationExpenditureDTO> expenditures = new ArrayList<>();
private List<CollaborationSettlementDTO> settlements = new ArrayList<>();
private List<CollaborationFileDTO> files = new ArrayList<>();
}
@@ -0,0 +1,35 @@
package com.agileboot.domain.collaboration.record.dto;
import cn.hutool.core.bean.BeanUtil;
import com.agileboot.domain.collaboration.record.db.CollaborationSettlementEntity;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.math.BigDecimal;
import java.util.Date;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author codex
*/
@NoArgsConstructor
@Data
public class CollaborationSettlementDTO {
public CollaborationSettlementDTO(CollaborationSettlementEntity entity) {
if (entity != null) {
BeanUtil.copyProperties(entity, this);
}
}
private Long settlementId;
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date settleDate;
private String method;
private BigDecimal income;
private String purpose;
}
@@ -0,0 +1,30 @@
package com.agileboot.domain.collaboration.record.dto;
import cn.hutool.core.bean.BeanUtil;
import com.agileboot.domain.collaboration.record.db.CollaborationTaskEntity;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.util.Date;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author codex
*/
@NoArgsConstructor
@Data
public class CollaborationTaskDTO {
public CollaborationTaskDTO(CollaborationTaskEntity entity) {
if (entity != null) {
BeanUtil.copyProperties(entity, this);
}
}
private Long taskId;
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date releaseDate;
private Integer sortOrder;
}
@@ -0,0 +1,19 @@
package com.agileboot.domain.collaboration.record.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author codex
*/
@AllArgsConstructor
@NoArgsConstructor
@Data
public class SettlementStatusDTO {
private String status;
private String label;
}
@@ -0,0 +1,12 @@
package com.agileboot.domain.collaboration.record.enumtype;
/**
* @author codex
*/
public enum CollaborationFileTypeEnum {
GOODS_IMAGE,
ATTACHMENT
}
@@ -0,0 +1,45 @@
package com.agileboot.domain.collaboration.record.enumtype;
import lombok.Getter;
/**
* @author codex
*/
@Getter
public enum CollaborationOptionEnum {
COOPERATION_PLATFORM("cooperationPlatform", "合作平台",
new String[]{"小红书", "得物", "抖音", "淘宝", "京东", "微博", "B站", "其他"}),
RETAINED_METHOD("retainedMethod", "留存方式",
new String[]{"寄拍", "送拍", "置换", "无需寄样"}),
COOPERATED_METHOD("cooperatedMethod", "合作方式",
new String[]{"水下", "蒲公英"}),
PURCHASE_METHOD("purchaseMethod", "购入方式",
new String[]{"拍单", "商家寄出"}),
PURCHASE_PLATFORM("purchasePlatform", "购入平台",
new String[]{"淘宝", "小红书", "京东", "抖音"}),
EXPENDITURE_PURPOSE("expenditurePurpose", "支出用途",
new String[]{"快递费用", "返点", "蒲公英扣税费用"}),
SETTLEMENT_METHOD("settlementMethod", "结款方式",
new String[]{"微信", "支付宝", "蒲公英", "京灵平台"}),
SETTLEMENT_PURPOSE("settlementPurpose", "结款用途",
new String[]{"稿费", "快递费用", "拍单费用", "蒲公英扣税费用"});
private final String type;
private final String label;
private final String[] values;
CollaborationOptionEnum(String type, String label, String[] values) {
this.type = type;
this.label = label;
this.values = values;
}
}
@@ -0,0 +1,27 @@
package com.agileboot.domain.collaboration.record.enumtype;
import lombok.Getter;
/**
* @author codex
*/
@Getter
public enum SettlementStatusEnum {
NONE("NONE", "无结款项"),
SETTLED("SETTLED", "已结"),
UNSETTLED("UNSETTLED", "未结"),
PARTIAL("PARTIAL", "未结清");
private final String value;
private final String label;
SettlementStatusEnum(String value, String label) {
this.value = value;
this.label = label;
}
}
@@ -0,0 +1,79 @@
package com.agileboot.domain.collaboration.record.model;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.StrUtil;
import com.agileboot.common.exception.ApiException;
import com.agileboot.common.exception.error.ErrorCode;
import com.agileboot.domain.collaboration.record.command.AddCollaborationRecordCommand;
import com.agileboot.domain.collaboration.record.command.UpdateCollaborationRecordCommand;
import com.agileboot.domain.collaboration.record.db.CollaborationRecordEntity;
import com.agileboot.domain.collaboration.record.db.CollaborationRecordService;
import lombok.NoArgsConstructor;
/**
* @author codex
*/
@NoArgsConstructor
public class CollaborationRecordModel extends CollaborationRecordEntity {
private CollaborationRecordService recordService;
public CollaborationRecordModel(CollaborationRecordService recordService) {
this.recordService = recordService;
}
public CollaborationRecordModel(CollaborationRecordEntity entity, CollaborationRecordService recordService) {
if (entity != null) {
BeanUtil.copyProperties(entity, this);
}
this.recordService = recordService;
}
public void loadFromAddCommand(AddCollaborationRecordCommand command) {
if (command == null) {
return;
}
BeanUtil.copyProperties(command, this, "recordId");
loadDefaultValues();
}
public void loadFromUpdateCommand(UpdateCollaborationRecordCommand command) {
if (command == null) {
return;
}
loadFromAddCommand(command);
}
public void checkRequiredFields() {
if (StrUtil.isBlank(getBrand())) {
throw new ApiException(ErrorCode.FAILED);
}
if (StrUtil.isBlank(getGoods())) {
throw new ApiException(ErrorCode.FAILED);
}
}
public void saveRecord() {
recordService.save(this);
}
public void updateRecord() {
recordService.updateById(this);
}
private void loadDefaultValues() {
if (getImageReturnNum() == null) {
setImageReturnNum(1);
}
if (StrUtil.isBlank(getRetainedMethod())) {
setRetainedMethod("寄拍");
}
if (StrUtil.isBlank(getCooperatedMethod())) {
setCooperatedMethod("水下");
}
if (StrUtil.isBlank(getPurchaseMethod())) {
setPurchaseMethod("拍单");
}
}
}
@@ -0,0 +1,31 @@
package com.agileboot.domain.collaboration.record.model;
import com.agileboot.common.exception.ApiException;
import com.agileboot.common.exception.error.ErrorCode.Business;
import com.agileboot.domain.collaboration.record.db.CollaborationRecordEntity;
import com.agileboot.domain.collaboration.record.db.CollaborationRecordService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
/**
* @author codex
*/
@Component
@RequiredArgsConstructor
public class CollaborationRecordModelFactory {
private final CollaborationRecordService recordService;
public CollaborationRecordModel loadById(Long recordId) {
CollaborationRecordEntity entity = recordService.getById(recordId);
if (entity == null) {
throw new ApiException(Business.COMMON_OBJECT_NOT_FOUND, recordId, "合作记录");
}
return new CollaborationRecordModel(entity, recordService);
}
public CollaborationRecordModel create() {
return new CollaborationRecordModel(recordService);
}
}
@@ -0,0 +1,49 @@
package com.agileboot.domain.collaboration.record.query;
import cn.hutool.core.util.StrUtil;
import com.agileboot.common.core.page.AbstractPageQuery;
import com.agileboot.common.utils.time.DatePickUtil;
import com.agileboot.domain.collaboration.record.db.CollaborationRecordEntity;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.util.Date;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* @author codex
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class CollaborationRecordQuery extends AbstractPageQuery<CollaborationRecordEntity> {
private String brand;
private String goods;
private String cooperationPlatform;
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date purchaseBeginTime;
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date purchaseEndTime;
@Override
public QueryWrapper<CollaborationRecordEntity> addQueryCondition() {
QueryWrapper<CollaborationRecordEntity> queryWrapper = new QueryWrapper<CollaborationRecordEntity>()
.like(StrUtil.isNotEmpty(brand), "brand", brand)
.like(StrUtil.isNotEmpty(goods), "goods", goods)
.eq(StrUtil.isNotEmpty(cooperationPlatform), "cooperation_platform", cooperationPlatform)
.ge(purchaseBeginTime != null, "purchase_date", DatePickUtil.getBeginOfTheDay(purchaseBeginTime))
.le(purchaseEndTime != null, "purchase_date", DatePickUtil.getEndOfTheDay(purchaseEndTime));
if (StrUtil.isEmpty(this.getOrderColumn())) {
this.setOrderColumn("deadline");
this.setOrderDirection("descending");
}
this.setTimeRangeColumn("deadline");
return queryWrapper;
}
}