一、项目结构
二、常用类
1、上传封装类(不用request,封装成一个对象)
上传类中的身份证正反面等信息做成list附件
@Data
public class FarmCreditAddDto {
/**
* 授信类型
*/
@TableField(value = "credit_apply_type")
@ApiModelProperty(value = "授信类型")
private String creditApplyType;
/**
* 牧场企业编号
*/
@TableField(value = "company_code")
@ApiModelProperty(value = "牧场企业编号")
private String companyCode;
/**
* 牧场企业名
*/
@TableField(value = "company_name")
@ApiModelProperty(value = "牧场企业名")
private String companyName;
/**
* 资金方编号
*/
@TableField(value = "funder_code")
@ApiModelProperty(value = "资金方编号")
private String funderCode;
/**
* 资金方名(开户银行)
*/
@TableField(value = "funder_name")
@ApiModelProperty(value = "资金方名")
private String funderName;
/**
* 申请说明
*/
@TableField(value = "remark")
@ApiModelProperty(value = "申请说明")
private String remark;
/**
* 申请额度
*/
@TableField(value = "apply_amount")
@ApiModelProperty(value = "申请额度")
private BigDecimal applyAmount;
/**
* 授信申请日期
*/
@TableField(value = "apply_date")
@ApiModelProperty(value = "授信申请日期")
private String applyDate;
/**
* 附件信息
*/
private List<Attachment> attachments;
}
2、查询封装类
@Data
public class FarmCreditQueryDto {
/**
* 牧企名
*/
String companyName;
/**
* 资金方名
*/
String funderName;
/**
* 授信状态:00-拒绝,01-已授信,02-授信中,03-已过期
*/
String creditStatus;
private Integer pageNo;
private Integer pageSize;
}
3、审核封装类
@Data
public class FarmCreditAuditDto {
/**
* 审批角色:01-系统运营,02-牧企,03-资金方
*/
private String role;
/**
* 业务编号
*/
@NotBlank(message = "业务编号不能为空!")
private String bizNo;
/**
* 授信金额
*/
private BigDecimal creditAmount;
/**
* 授信开始日期
*/
private String beginDate;
/**
* 授信结束日期
*/
private String endDate;
/**
* 审批结果:1-通过,0-拒绝
*/
private String approveResult;
}
4、返回响应封装类
@EqualsAndHashCode(callSuper = true)
@Data
@ApiModel(value = "授信申请信息返回")
//继承企业信息类
public class FarmCreditVO extends CompanyInfo {
/**
* 此处省略,和FarmCredit类一致字段
*/
/**
* 附件信息
*/
private List<Attachment> attachments;
}
5、常用字段
@Data
@Accessors(chain = true)
@EqualsAndHashCode(callSuper=false)
@TableName("farm_credit_apply")
@ApiModel(value = "farm_credit_apply对象", description = "farm_credit_apply")
public class FarmCredit implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@TableId(value = "id", type= IdType.AUTO)
@ApiModelProperty(value = "")
private Long id;
……
private String businessRemark;
@TableField(value = "create_user_id")
@ApiModelProperty(value = "创建人账号")
private String createUserId;
@TableField(value = "create_user")
@ApiModelProperty(value = "创建人名称")
private String createUser;
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
@DateTimeFormat(pattern = "yyyy-MM-dd")
@ApiModelProperty(value = "创建时间")
private Date createTime;
@TableField(value = "update_user_id")
@ApiModelProperty(value = "更新人账号")
private String updateUserId;
@TableField(value = "update_user")
@ApiModelProperty(value = "更新人名称")
private String updateUser;
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
@DateTimeFormat(pattern = "yyyy-MM-dd")
@ApiModelProperty(value = "更新时间")
private Date updateTime;
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
@DateTimeFormat(pattern = "yyyy-MM-dd")
@ApiModelProperty(value = "最后一次更新时间")
private Date lastUpdateTime;
}
三、具体实现
1、列表查询
controller:
@Api(tags = "牧场企业授信")
@RestController
@RequestMapping("/system/company/credit")
@Slf4j
public class FarmCreditController {
@Autowired
private IFarmCreditService farmCreditService;
@ApiOperation(value = "牧场企业授信分页列表查询")
@GetMapping("/list")
public ResponseVo<IPage<FarmCreditVO>> pageList(FarmCreditQueryDto queryDto) {
IPage<FarmCreditVO> pageList = farmCreditService.queryPageList(queryDto);
return ResponseVo.ok(pageList);
}
}
serviceImpl:
@Service
public class FarmCreditServiceImpl extends ServiceImpl<FarmCreditMapper, FarmCredit> implements IFarmCreditService {
@Autowired
private FarmCreditMapper farmCreditMapper;
@Autowired
private AttachmentMapper attachmentMapper;
@Autowired
private CompanyInfoMapper companyInfoMapper;
/**
* 牧场授信列表
* @param queryDto
* @return
*/
@Override
public IPage<FarmCreditVO> queryPageList(FarmCreditQueryDto queryDto) {
Page<FarmCreditVO> page = new Page(queryDto.getPageNo(), queryDto.getPageSize());
return farmCreditMapper.queryPageList(page,queryDto);
}
}
mapper:
@Mapper
public interface FarmCreditMapper extends BaseMapper<FarmCredit> {
IPage<FarmCreditVO> queryPageList(@Param("param") Page<FarmCreditVO> page, @Param("dto") FarmCreditQueryDto queryDto);
}
xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.cib.fintech.cibiot.livestock.finance.modules.farmcredit.dao.mapper.FarmCreditMapper">
<!--牧场授信列表-->
<select id="queryPageList" resultType="com.cib.fintech.cibiot.livestock.finance.modules.farmcredit.vo.FarmCreditVO">
select * from farm_credit_apply
<where>
<if test="dto.companyName !=null and dto.companyName !=''">
and company_name like concat('%',#{dto.companyName},'%')
</if>
<if test="dto.funderName !=null and dto.funderName !=''">
and funder_name like concat('%',#{dto.funderName},'%')
</if>
<if test="dto.creditStatus !=null and dto.creditStatus !=''">
and credit_status =#{dto.creditStatus}
</if>
</where>
order by create_time desc
</select>
</mapper>
2、查看详细
contoller:
@ApiOperation(value = "查看详细授信信息")
@GetMapping("/detail")
public ResponseVo<FarmCreditVO> detail(@RequestParam(name = "creditApplyNo", required = true) String creditApplyNo,
@RequestParam(name = "companyName", required = true) String companyName) {
FarmCreditVO detailVo = farmCreditService.taskDetail(creditApplyNo,companyName);
return ResponseVo.ok(detailVo);
}
serviceImpl:
/**
* 牧场授信详情
* @param creditNo,companyCode
* @return
*/
@Override
public FarmCreditVO taskDetail(String creditNo,String companyName) {
FarmCredit farmCredit = farmCreditMapper.selectOne(Wrappers.<FarmCredit>lambdaQuery()
.eq(FarmCredit::getCreditApplyNo, creditNo));
FarmCreditVO farmCreditVO = BeanUtil.copyProperties(farmCredit, FarmCreditVO.class);
//获取审批状态
farmCreditVO.setFarmAuditStatus(farmCredit.getAuditStatus());
// 附件
List<Attachment> attachments = attachmentMapper.selectList(Wrappers.<Attachment>lambdaQuery().eq(Attachment::getBizNo, farmCredit.getCreditApplyNo()));
farmCreditVO.setAttachments(attachments);
attachmentShow(attachments);
//通过companyCode查询企业详细信息
CompanyInfoEntity companyInfo = companyInfoEntityMapper.selectOne(Wrappers.<CompanyInfoEntity>lambdaQuery()
.eq(CompanyInfoEntity::getCompanyName,companyName));
//信息保存到farmCreditVO中
farmCreditVO.setCompanyName(companyInfo.getCompanyName());
farmCreditVO.setUnifiedSocialCreditCode(companyInfo.getUnifiedSocialCreditCode());
farmCreditVO.setRegisterCapital(companyInfo.getRegisterCapital());
farmCreditVO.setCompanyAddress(companyInfo.getCompanyAddress());
farmCreditVO.setRegisterTime(companyInfo.getRegisterTime());
farmCreditVO.setBusinessTerm(companyInfo.getBusinessTerm());
farmCreditVO.setLegalPerson(companyInfo.getLegalPerson());
farmCreditVO.setLegalIdCard(companyInfo.getLegalIdCard());
farmCreditVO.setBusinessScope(companyInfo.getBusinessScope());
return farmCreditVO;
}
//返回附件列表
private List<Attachment> attachmentShow(List<Attachment> attachments) {
return attachments;
}
3、增加申请
contoller:
@ApiOperation(value = "新增授信申请")
@PostMapping("/add")
public ResponseVo<String> apply(@RequestBody @Valid FarmCreditAddDto addDto) {
return farmCreditService.apply(addDto);
}
serviceImpl:
/**
* 牧场授信申请
* @param addDto
* @return
*/
@Override
public ResponseVo<String> apply(FarmCreditAddDto addDto) {
FarmCredit farmCredit = BeanUtil.copyProperties(addDto, FarmCredit.class);
// 授信申请编号
Integer maxId = farmCreditMapper.selectMaxId();
farmCredit.setCreditApplyNo("mqsx" + Calendar.getInstance().get(Calendar.YEAR) + (maxId == null ? "000001" : String.format("%06d", maxId + 1)));
// 授信状态:2授信中
farmCredit.setCreditStatus("2");
// 审批状态:0待审批
farmCredit.setAuditStatus("0");
farmCredit.setApplyDate(DateUtil.format(new Date(), "yyyy-MM-dd"));
// 创建人、创建日期
farmCredit.setCreateUserId(JwtUtil.getUserId());
farmCredit.setCreateUser(JwtUtil.getUsername());
farmCredit.setCreateTime(new Date());
this.save(farmCredit);
// 保存附件
List<Attachment> attachments = addDto.getAttachments();
for (Attachment attachment : attachments) {
attachment.setBizNo(farmCredit.getCreditApplyNo());
attachment.setCreateTime(new Date());
attachmentMapper.insert(attachment);
}
//新增授信待办记录
BusinessHandleEntity applyHandle=new BusinessHandleEntity();
applyHandle.setBusinessNo(farmCredit.getCreditApplyNo());
applyHandle.setBusinessType("3");//业务类型 1-牧企认证,2-农户认证,3-牧场授信,4-农户授信,5-领养申请
applyHandle.setAuditStatus("0"); // 授信状态:待审批
applyHandle.setHandleUsageType("1"); // 系统运营
applyHandle.setApplicantId(JwtUtil.getUserId());
applyHandle.setApplicant(JwtUtil.getUsername());
applyHandle.setCreateById(JwtUtil.getUserId());
applyHandle.setCreateBy(JwtUtil.getUsername());
applyHandle.setCreateTime(new Date());
businessHandleMapper.insert(applyHandle);
return ResponseVo.ok("提交成功!");
}
mapper:
Integer selectMaxId();
xml:
<!--获取授信id-->
<select id="selectMaxId" resultType="java.lang.Integer">
select max(id) from farm_credit_apply
</select>
4、申请审批
contoller:
@ApiOperation(value = "授信审核拒绝/通过")
@PostMapping("/audit")
public ResponseVo<String> audit(@Valid @RequestBody FarmCreditAuditDto auditDto){
return farmCreditService.audit(auditDto);
}
serviceImpl:
/**
* 牧场授信审核(通过/拒绝)
* @param auditDto
* @return
*/
@Override
public ResponseVo<String> audit(FarmCreditAuditDto auditDto) {
FarmCredit farmCredit = farmCreditMapper.selectOne(Wrappers.<FarmCredit>lambdaQuery()
.eq(FarmCredit::getCreditApplyNo, auditDto.getBizNo()));
//准备记录到任务表中
BusinessHandleRecordEntity auditHandle=new BusinessHandleRecordEntity();
auditHandle.setBusinessNo(farmCredit.getCreditApplyNo());
auditHandle.setBusinessType("3");//业务类型 1-牧企认证,2-农户认证,3-牧场授信,4-农户授信,5-领养申请
auditHandle.setApplicantId(JwtUtil.getUserId());
auditHandle.setApplicant(JwtUtil.getUsername());
auditHandle.setCreateById(JwtUtil.getUserId());
auditHandle.setCreate_by(JwtUtil.getUsername());
auditHandle.setCreateTime(new Date());
BeanUtils.copyProperties(farmCredit,auditHandle);
//审批通过
if (Objects.equals(auditDto.getApproveResult(), "1")) {
BeanUtil.copyProperties(auditDto, farmCredit);
farmCredit.setUsedAmount(BigDecimal.ZERO);
farmCredit.setUsableAmount(auditDto.getCreditAmount());
farmCredit.setCreditStatus("1"); // 授信状态:1已授信
farmCredit.setAuditStatus("3"); // 审批状态:3资金方通过
//更新任务状态
auditHandle.setAuditStatus("2");//审核状态: 0:待审批 2:审批通过 1:审批未通过 99:未提交
} else {
// 审批拒绝
farmCredit.setCreditStatus("0"); // 授信状态:0拒绝
farmCredit.setAuditStatus("0"); // 审批状态:0待审批
//更新任务状态
auditHandle.setAuditStatus("1");//审核状态: 0:待审批 2:审批通过 1:审批未通过 99:未提交
}
// 更新授信信息
farmCreditMapper.updateById(farmCredit);
//更新任务状态
businessHandleRecordMapper.insert(auditHandle);
return ResponseVo.ok("审批完成!");
}
5、查找相关联的资金方
contoller:
@ApiOperation(value = "授信审核-授信申请-获得资金方")
@GetMapping("/selectFunder")
public ResponseVo<List<String>> selectFunder(@RequestParam(name="orgId")Long OrgId){
return ResponseVo.ok(farmCreditService.getFunderByOrgId(OrgId));
}
serviceImpl:
/**
* 获得相关资金方
* @param orgId
* @return
*/
@Override
public List<String> getFunderByOrgId(Long orgId) {
List<String>bankNamelist=new ArrayList<String>();
//通过org_id得到company_id
Long companyId=findByOrgMapper.findCompanyIdByOrgId(orgId);
//通过company_id得到相关的bank_id
List<Long> bankIdList=findByOrgMapper.findBankIdByOrgId(companyId);
//通过相关资金方id获得资金方名
for (Long bankId : bankIdList) {
String name=findByOrgMapper.findBankName(bankId);
bankNamelist.add(name);
}
//返回资金方名
return bankNamelist;
}
mapper:(新建,因为外联数据库表,使用DS)
/**
* 外接,获取和牧场相关联的资金方(银行)的编号和名称
*/
@Mapper
@DS(value = "systemManagement")
public interface FindByOrgMapper extends BaseMapper<FarmCredit> {
List<Long> findBankIdByOrgId(Long companyId);
String findBankName(Long bankId);
Long findCompanyIdByOrgId(Long companyId);
}
xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.cib.fintech.cibiot.livestock.finance.modules.farmcredit.dao.mapper.FindByOrgMapper">
<!--获取和牧场相关联的资金方(银行)的名称-->
<!--获得银行id-->
<select id="findCompanyIdByOrgId" resultType="java.lang.Long" parameterType="java.lang.Long">
select detail_id from organization_tree
<where>
<if test="orgId != null and orgId !=''">
id=#{orgId}
</if>
</where>
</select>
<!--获得相关资金方id-->
<select id="findBankIdByOrgId" resultType="java.lang.Long" parameterType="java.lang.String">
select bank_id from bank_company_cooperation
<where>
<if test="companyId != null and companyId !=''">
company_id=#{companyId}
</if>
</where>
</select>
<!--获得资金方名-->
<select id="findBankName" resultType="java.lang.String" parameterType="java.lang.Long">
select bank_name from bank_info
<where>
<if test="bankId != null and bankId !=''">
id=#{bankId}
</if>
</where>
</select>
</mapper>
6、通过代办记录id查询相关信息
controller:
@ApiOperation(value = "审核时查看详细授信信息")
@GetMapping("/auditDetail")
public ResponseVo<FarmCreditVO> auditDetail(@RequestParam(name = "id", required = true)Long id) {
FarmCreditVO detailVo = farmCreditService.auditDetail(id);
return ResponseVo.ok(detailVo);
}
serviceimpl:
/**
* 牧场授信详情
* @param id
* @return
*/
@Override
public FarmCreditVO auditDetail(Long id) {
String creditApplyNo=farmCreditMapper.selectCreditApplyNo(id);
FarmCredit farmCredit = farmCreditMapper.selectOne(Wrappers.<FarmCredit>lambdaQuery()
.eq(FarmCredit::getCreditApplyNo,creditApplyNo));
FarmCreditVO farmCreditVO = BeanUtil.copyProperties(farmCredit, FarmCreditVO.class);
//获取审批状态
farmCreditVO.setFarmAuditStatus(farmCredit.getAuditStatus());
// 附件
List<Attachment> attachments = attachmentMapper.selectList(Wrappers.<Attachment>lambdaQuery().eq(Attachment::getBizNo, farmCredit.getCreditApplyNo()));
farmCreditVO.setAttachments(attachments);
attachmentShow(attachments);
//通过companyName查询企业详细信息
CompanyInfoEntity companyInfo = companyInfoEntityMapper.selectOne(Wrappers.<CompanyInfoEntity>lambdaQuery()
.eq(CompanyInfoEntity::getCompanyName,farmCredit.getCompanyName()));
//获得资金方id
String funderCode=getFunderCode(farmCreditVO.getFunderName());
farmCreditVO.setFunderCode(funderCode);
//信息保存到farmCreditVO中
BeanUtils.copyProperties(companyInfo,farmCreditVO);
return farmCreditVO;
}
mapper:
@Mapper
public interface FarmCreditMapper extends BaseMapper<FarmCredit> {
IPage<FarmCreditVO> queryPageList(@Param("param") Page<FarmCreditVO> page, @Param("dto") FarmCreditQueryDto queryDto);
Integer selectMaxId();
String selectCreditApplyNo(Long id);
}
xml:
<select id="selectCreditApplyNo" resultType="java.lang.String" parameterType="java.lang.Long">
select business_no from business_handle where id=#{id}
</select>
四、远程:
1、每个bootstrap.yml里的discrovey添加group方便nacos查询
例如:
nacos查询网址:nacos的ip:port/nacos
2、frps:.ini文件中本地port改成gateway的port。cmd启动。