code review:CRM 回款计划的逻辑

This commit is contained in:
YunaiV 2023-10-21 21:55:21 +08:00
parent 56b59cf383
commit f942e2c7f2
11 changed files with 147 additions and 138 deletions

View File

@ -1,6 +1,7 @@
package cn.iocoder.yudao.module.crm.controller.admin.receivable;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
import cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.*;
@ -18,9 +19,8 @@ import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.IOException;
import java.util.Collection;
import java.util.List;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
@ -69,15 +69,6 @@ public class ReceivableController {
return success(ReceivableConvert.INSTANCE.convert(receivable));
}
@GetMapping("/list")
@Operation(summary = "获得回款管理列表")
@Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048")
@PreAuthorize("@ss.hasPermission('crm:receivable:query')")
public CommonResult<List<ReceivableRespVO>> getReceivableList(@RequestParam("ids") Collection<Long> ids) {
List<ReceivableDO> list = receivableService.getReceivableList(ids);
return success(ReceivableConvert.INSTANCE.convertList(list));
}
@GetMapping("/page")
@Operation(summary = "获得回款管理分页")
@PreAuthorize("@ss.hasPermission('crm:receivable:query')")

View File

@ -1,32 +1,28 @@
package cn.iocoder.yudao.module.crm.controller.admin.receivable;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import javax.validation.constraints.*;
import javax.validation.*;
import javax.servlet.http.*;
import java.util.*;
import java.io.IOException;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.*;
import cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.*;
import cn.iocoder.yudao.module.crm.dal.dataobject.receivable.ReceivablePlanDO;
import cn.iocoder.yudao.module.crm.convert.receivable.ReceivablePlanConvert;
import cn.iocoder.yudao.module.crm.dal.dataobject.receivable.ReceivablePlanDO;
import cn.iocoder.yudao.module.crm.service.receivable.ReceivablePlanService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
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.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.IOException;
import java.util.List;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
/**
* @author 赤焰
@ -73,15 +69,6 @@ public class ReceivablePlanController {
return success(ReceivablePlanConvert.INSTANCE.convert(receivablePlan));
}
@GetMapping("/list")
@Operation(summary = "获得回款计划列表")
@Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048")
@PreAuthorize("@ss.hasPermission('crm:receivable-plan:query')")
public CommonResult<List<ReceivablePlanRespVO>> getReceivablePlanList(@RequestParam("ids") Collection<Long> ids) {
List<ReceivablePlanDO> list = receivablePlanService.getReceivablePlanList(ids);
return success(ReceivablePlanConvert.INSTANCE.convertList(list));
}
@GetMapping("/page")
@Operation(summary = "获得回款计划分页")
@PreAuthorize("@ss.hasPermission('crm:receivable-plan:query')")

View File

@ -1,14 +1,12 @@
package cn.iocoder.yudao.module.crm.controller.admin.receivable.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import java.time.LocalDateTime;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import javax.validation.constraints.*;
import org.springframework.format.annotation.DateTimeFormat;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@ -19,9 +17,13 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_
@Data
public class ReceivableBaseVO {
// TODO @liuhongfeng部分缺少 example 的字段要补充下
// TODO @liuhongfeng部分字段需要必传要写 requiredMode = Schema.RequiredMode.REQUIRED以及对应的 validator 非空校验
@Schema(description = "回款编号")
private String no;
// TODO @liuhongfeng中英文之间有个空格这样更干净
@Schema(description = "回款计划ID", example = "31177")
private Long planId;
@ -31,9 +33,12 @@ public class ReceivableBaseVO {
@Schema(description = "合同ID", example = "30305")
private Long contractId;
// TODO @liuhongfeng这个字段可以写个枚举然后 InEnum 去校验下
// TODO @liuhongfeng这个字段应该不是前端传递的噢而是后端自己生成的
@Schema(description = "审批状态", example = "1")
private Integer checkStatus;
// TODO @liuhongfeng这个字段应该不是前端传递的噢而是后端自己生成的所以不适合放在 base 里面
@Schema(description = "工作流编号", example = "16568")
private Long processInstanceId;
@ -44,6 +49,7 @@ public class ReceivableBaseVO {
@Schema(description = "回款方式", example = "2")
private String returnType;
// TODO @liuhongfeng使用 Int
@Schema(description = "回款金额", example = "31859")
private BigDecimal price;
@ -56,12 +62,14 @@ public class ReceivableBaseVO {
@Schema(description = "显示顺序")
private Integer sort;
// TODO @芋艿这个字段在看看dataScopedataScopeDeptIds
@Schema(description = "数据范围1全部数据权限 2自定数据权限 3本部门数据权限 4本部门及以下数据权限")
private Integer dataScope;
@Schema(description = "数据范围(指定部门数组)")
private String dataScopeDeptIds;
// TODO @liuhongfeng这个字段这个字段应该不是前端传递的噢而是后端自己生成的所以不适合放在 base 里面
@Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@NotNull(message = "状态不能为空")
private Integer status;

View File

@ -1,12 +1,13 @@
package cn.iocoder.yudao.module.crm.controller.admin.receivable.vo;
import lombok.*;
import cn.iocoder.yudao.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.math.BigDecimal;
import java.util.*;
import io.swagger.v3.oas.annotations.media.Schema;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@ -17,6 +18,7 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_
@ToString(callSuper = true)
public class ReceivablePageReqVO extends PageParam {
// TODO @liuhongfeng目前就使用 no 检索即可
@Schema(description = "回款编号")
private String no;

View File

@ -1,15 +1,11 @@
package cn.iocoder.yudao.module.crm.controller.admin.receivable.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import javax.validation.constraints.*;
import org.springframework.format.annotation.DateTimeFormat;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@ -20,9 +16,11 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_
@Data
public class ReceivablePlanBaseVO {
// TODO 芋艿这个字段在想想命名
@Schema(description = "期数")
private Long indexNo;
// TODO @liuhongfeng中英文之间有个空格这样更干净
@Schema(description = "回款ID", example = "19852")
private Long receivableId;
@ -30,12 +28,16 @@ public class ReceivablePlanBaseVO {
//@NotNull(message = "完成状态不能为空")
private Integer status;
// TODO @liuhongfeng这个字段可以写个枚举然后 InEnum 去校验下
// TODO @liuhongfeng这个字段应该不是前端传递的噢而是后端自己生成的
@Schema(description = "审批状态", example = "1")
private String checkStatus;
// TODO @liuhongfeng这个字段应该不是前端传递的噢而是后端自己生成的所以不适合放在 base 里面
@Schema(description = "工作流编号", example = "8909")
private Long processInstanceId;
// TODO @liuhongfeng使用 Int
@Schema(description = "计划回款金额", example = "29675")
private BigDecimal price;
@ -43,6 +45,7 @@ public class ReceivablePlanBaseVO {
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime returnTime;
// TODO @liuhongfeng这个字段Integer
@Schema(description = "提前几天提醒")
private Long remindDays;
@ -56,6 +59,7 @@ public class ReceivablePlanBaseVO {
@Schema(description = "合同ID", example = "3473")
private Long contractId;
// TODO @liuhongfeng这个字段应该不是前端传递的噢而是后端自己生成的所以不适合放在 base 里面
@Schema(description = "负责人", example = "17828")
private Long ownerUserId;

View File

@ -1,10 +1,12 @@
package cn.iocoder.yudao.module.crm.controller.admin.receivable.vo;
import lombok.*;
import java.util.*;
import io.swagger.v3.oas.annotations.media.Schema;
import cn.iocoder.yudao.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 cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@ -15,6 +17,8 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_
@ToString(callSuper = true)
public class ReceivablePlanPageReqVO extends PageParam {
// TODO 芋艿筛选字段需要去掉几个在想想
@Schema(description = "期数")
private Long indexNo;

View File

@ -1,13 +1,13 @@
package cn.iocoder.yudao.module.crm.dal.dataobject.receivable;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
import java.util.*;
import java.time.LocalDateTime;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
/**
* 回款管理 DO
@ -35,14 +35,20 @@ public class ReceivableDO extends BaseDO {
private String no;
/**
* 回款计划ID
*
* TODO @liuhongfeng这个字段后续要写下关联的实体哈
*/
private Long planId;
/**
* 客户ID
*
* TODO @liuhongfeng这个字段后续要写下关联的实体哈
*/
private Long customerId;
/**
* 合同ID
*
* TODO @liuhongfeng这个字段后续要写下关联的实体哈
*/
private Long contractId;
/**
@ -53,6 +59,8 @@ public class ReceivableDO extends BaseDO {
private Integer checkStatus;
/**
* 工作流编号
*
* TODO @liuhongfeng这个字段后续要写下关联的实体哈
*/
private Long processInstanceId;
/**
@ -79,6 +87,7 @@ public class ReceivableDO extends BaseDO {
* 显示顺序
*/
private Integer sort;
// TODO 芋艿dataScopedataScopeDeptIds 在想下
/**
* 数据范围1全部数据权限 2自定数据权限 3本部门数据权限 4本部门及以下数据权限
*/

View File

@ -1,24 +1,26 @@
package cn.iocoder.yudao.module.crm.service.receivable;
import cn.hutool.core.util.ObjectUtil;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import java.util.*;
import cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.*;
import cn.iocoder.yudao.module.crm.dal.dataobject.receivable.ReceivablePlanDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.crm.convert.receivable.ReceivablePlanConvert;
import cn.iocoder.yudao.module.crm.dal.mysql.receivable.ReceivablePlanMapper;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.*;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.ReceivablePlanCreateReqVO;
import cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.ReceivablePlanExportReqVO;
import cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.ReceivablePlanPageReqVO;
import cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.ReceivablePlanUpdateReqVO;
import cn.iocoder.yudao.module.crm.convert.receivable.ReceivablePlanConvert;
import cn.iocoder.yudao.module.crm.dal.dataobject.receivable.ReceivablePlanDO;
import cn.iocoder.yudao.module.crm.dal.mysql.receivable.ReceivablePlanMapper;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.util.Collection;
import java.util.List;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.RECEIVABLE_PLAN_NOT_EXISTS;
/**
* 回款计划 Service 实现类
@ -36,6 +38,7 @@ public class ReceivablePlanServiceImpl implements ReceivablePlanService {
public Long createReceivablePlan(ReceivablePlanCreateReqVO createReqVO) {
// 插入
ReceivablePlanDO receivablePlan = ReceivablePlanConvert.INSTANCE.convert(createReqVO);
// TODO @liuhongfeng空格要注释if (ObjectUtil.isNull(receivablePlan.getStatus())) {
if(ObjectUtil.isNull(receivablePlan.getStatus())){
receivablePlan.setStatus(CommonStatusEnum.ENABLE.getStatus());
}
@ -48,6 +51,7 @@ public class ReceivablePlanServiceImpl implements ReceivablePlanService {
public void updateReceivablePlan(ReceivablePlanUpdateReqVO updateReqVO) {
// 校验存在
validateReceivablePlanExists(updateReqVO.getId());
// 更新
ReceivablePlanDO updateObj = ReceivablePlanConvert.INSTANCE.convert(updateReqVO);
receivablePlanMapper.updateById(updateObj);

View File

@ -1,21 +1,24 @@
package cn.iocoder.yudao.module.crm.service.receivable;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import java.util.*;
import cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.*;
import cn.iocoder.yudao.module.crm.dal.dataobject.receivable.ReceivableDO;
import cn.iocoder.yudao.module.crm.convert.receivable.ReceivableConvert;
import cn.iocoder.yudao.module.crm.dal.mysql.receivable.ReceivableMapper;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.*;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.ListUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.ReceivableCreateReqVO;
import cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.ReceivableExportReqVO;
import cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.ReceivablePageReqVO;
import cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.ReceivableUpdateReqVO;
import cn.iocoder.yudao.module.crm.convert.receivable.ReceivableConvert;
import cn.iocoder.yudao.module.crm.dal.dataobject.receivable.ReceivableDO;
import cn.iocoder.yudao.module.crm.dal.mysql.receivable.ReceivableMapper;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.util.Collection;
import java.util.List;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.RECEIVABLE_NOT_EXISTS;
/**
* 回款管理 Service 实现类
@ -31,6 +34,8 @@ public class ReceivableServiceImpl implements ReceivableService {
@Override
public Long createReceivable(ReceivableCreateReqVO createReqVO) {
// TODO @liuhongfengplanId 是否存在是否合法需要去校验
// TODO @liuhongfeng其它类似 customerIdcontractId 也需要去校验
// 插入
ReceivableDO receivable = ReceivableConvert.INSTANCE.convert(createReqVO);
receivableMapper.insert(receivable);
@ -42,6 +47,7 @@ public class ReceivableServiceImpl implements ReceivableService {
public void updateReceivable(ReceivableUpdateReqVO updateReqVO) {
// 校验存在
validateReceivableExists(updateReqVO.getId());
// 更新
ReceivableDO updateObj = ReceivableConvert.INSTANCE.convert(updateReqVO);
receivableMapper.updateById(updateObj);

View File

@ -1,33 +1,30 @@
package cn.iocoder.yudao.module.crm.service.receivable;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.mock.mockito.MockBean;
import javax.annotation.Resource;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
import cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.*;
import cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.ReceivablePlanCreateReqVO;
import cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.ReceivablePlanExportReqVO;
import cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.ReceivablePlanPageReqVO;
import cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.ReceivablePlanUpdateReqVO;
import cn.iocoder.yudao.module.crm.dal.dataobject.receivable.ReceivablePlanDO;
import cn.iocoder.yudao.module.crm.dal.mysql.receivable.ReceivablePlanMapper;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.springframework.context.annotation.Import;
import javax.annotation.Resource;
import org.springframework.context.annotation.Import;
import java.util.*;
import java.time.LocalDateTime;
import java.util.List;
import static cn.hutool.core.util.RandomUtil.*;
import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.*;
import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.*;
import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*;
import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.*;
import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.*;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.*;
import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildBetweenTime;
import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId;
import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException;
import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId;
import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.RECEIVABLE_PLAN_NOT_EXISTS;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.*;
// TODO 芋艿后续需要补充测试用例
/**
* {@link ReceivablePlanServiceImpl} 的单元测试类
*

View File

@ -1,33 +1,30 @@
package cn.iocoder.yudao.module.crm.service.receivable;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.mock.mockito.MockBean;
import javax.annotation.Resource;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
import cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.*;
import cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.ReceivableCreateReqVO;
import cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.ReceivableExportReqVO;
import cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.ReceivablePageReqVO;
import cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.ReceivableUpdateReqVO;
import cn.iocoder.yudao.module.crm.dal.dataobject.receivable.ReceivableDO;
import cn.iocoder.yudao.module.crm.dal.mysql.receivable.ReceivableMapper;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.springframework.context.annotation.Import;
import javax.annotation.Resource;
import org.springframework.context.annotation.Import;
import java.util.*;
import java.time.LocalDateTime;
import java.util.List;
import static cn.hutool.core.util.RandomUtil.*;
import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.*;
import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.*;
import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*;
import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.*;
import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.*;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.*;
import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildBetweenTime;
import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId;
import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException;
import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId;
import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.RECEIVABLE_NOT_EXISTS;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.*;
// TODO 芋艿等实现完在校验下
/**
* {@link ReceivableServiceImpl} 的单元测试类
*