122 changed files with 3138 additions and 4229 deletions
@ -0,0 +1,10 @@ |
|||
package irbs.cust.rating.enums; |
|||
|
|||
/** |
|||
* 业务流水号后缀 |
|||
*/ |
|||
public enum BusinessCodeSuffix { |
|||
YYYYMMDD, //年月日
|
|||
YYYYMM //年月
|
|||
; |
|||
} |
@ -0,0 +1,111 @@ |
|||
package irbs.cust.rating.jpa.entity; |
|||
|
|||
import io.sc.platform.orm.entity.BaseEntity; |
|||
import irbs.cust.rating.enums.BusinessCodeSuffix; |
|||
import irbs.cust.rating.jpa.vo.BusinessCodeVo; |
|||
import org.hibernate.annotations.GenericGenerator; |
|||
|
|||
import javax.persistence.*; |
|||
import javax.validation.constraints.Size; |
|||
|
|||
/** |
|||
* 最大业务流水号记录表 |
|||
* @author likunming |
|||
* |
|||
*/ |
|||
@Entity |
|||
@Table(name="T_BUSINESS_CODE") |
|||
public class BusinessCode extends BaseEntity<BusinessCodeVo> { |
|||
// 主键
|
|||
@Id |
|||
@GeneratedValue(generator = "system-uuid") |
|||
@GenericGenerator(name = "system-uuid", strategy = "uuid2") |
|||
@Column(name="ID_") |
|||
@Size(max=50) |
|||
protected String id; |
|||
|
|||
// 前缀(一般为字母,用来标识是什么业务)
|
|||
@Column(name="PREFIX_") |
|||
@Size(max=10) |
|||
protected String prefix; |
|||
|
|||
// 后缀(包括:YYYYMMDD,YYYYMM)
|
|||
@Column(name="SUFFIX_") |
|||
@Enumerated(EnumType.STRING) |
|||
protected BusinessCodeSuffix suffix; |
|||
|
|||
// 流水号长度(减掉前缀后缀后的长度,长度为4的示例:R202505280001)
|
|||
@Column(name="LENGTH_") |
|||
protected Integer length; |
|||
|
|||
// 最后获取流水号的时间(根据后缀存储)
|
|||
@Column(name="LAST_DATE_") |
|||
@Size(max=20) |
|||
protected String lastDate; |
|||
|
|||
// 当前最大序号(每获取一次+1)
|
|||
@Column(name="MAX_NUM_") |
|||
protected Integer maxNum; |
|||
|
|||
@Override |
|||
public BusinessCodeVo toVo() { |
|||
BusinessCodeVo vo = new BusinessCodeVo(); |
|||
super.toVo(vo); |
|||
|
|||
vo.setId(this.getId()); |
|||
vo.setPrefix(this.getPrefix()); |
|||
vo.setSuffix(this.getSuffix().name()); |
|||
vo.setLength(this.getLength()); |
|||
vo.setLastDate(this.getLastDate()); |
|||
vo.setMaxNum(this.getMaxNum()); |
|||
return vo; |
|||
} |
|||
|
|||
public String getId() { |
|||
return id; |
|||
} |
|||
|
|||
public void setId(String id) { |
|||
this.id = id; |
|||
} |
|||
|
|||
public String getPrefix() { |
|||
return prefix; |
|||
} |
|||
|
|||
public void setPrefix(String prefix) { |
|||
this.prefix = prefix; |
|||
} |
|||
|
|||
public BusinessCodeSuffix getSuffix() { |
|||
return suffix; |
|||
} |
|||
|
|||
public void setSuffix(BusinessCodeSuffix suffix) { |
|||
this.suffix = suffix; |
|||
} |
|||
|
|||
public Integer getLength() { |
|||
return length; |
|||
} |
|||
|
|||
public void setLength(Integer length) { |
|||
this.length = length; |
|||
} |
|||
|
|||
public String getLastDate() { |
|||
return lastDate; |
|||
} |
|||
|
|||
public void setLastDate(String lastDate) { |
|||
this.lastDate = lastDate; |
|||
} |
|||
|
|||
public Integer getMaxNum() { |
|||
return maxNum; |
|||
} |
|||
|
|||
public void setMaxNum(Integer maxNum) { |
|||
this.maxNum = maxNum; |
|||
} |
|||
} |
@ -0,0 +1,292 @@ |
|||
package irbs.cust.rating.jpa.entity; |
|||
|
|||
import io.sc.engine.rule.core.enums.QualitativeAdditionComponentType; |
|||
import io.sc.platform.orm.converter.NumericBooleanConverter; |
|||
import io.sc.platform.orm.entity.BaseEntity; |
|||
import irbs.cust.rating.jpa.vo.RatingQualIndexAddtionVo; |
|||
import org.hibernate.annotations.GenericGenerator; |
|||
|
|||
import javax.persistence.*; |
|||
import javax.validation.constraints.Size; |
|||
|
|||
/** |
|||
* 定性指标补录表 |
|||
* @author likunming |
|||
*/ |
|||
@Entity |
|||
@Table(name="NS_QUAL_INDEX_ADDTION") |
|||
public class RatingQualIndexAddtion extends BaseEntity<RatingQualIndexAddtionVo> { |
|||
|
|||
@Id |
|||
@GeneratedValue(generator = "system-uuid") |
|||
@GenericGenerator(name = "system-uuid", strategy = "uuid2") |
|||
@Column(name="ID") |
|||
@Size(max=50) |
|||
private String id; |
|||
|
|||
/** |
|||
* 问题定义ID |
|||
*/ |
|||
@Column(name= "DEF_ID_") |
|||
private String defId; |
|||
|
|||
/** |
|||
* 代码 |
|||
*/ |
|||
@Column(name= "CODE_") |
|||
private String code; |
|||
|
|||
/** |
|||
* 名称 |
|||
*/ |
|||
@Column(name= "NAME_") |
|||
private String name; |
|||
|
|||
/** |
|||
* 描述 |
|||
*/ |
|||
@Column(name= "DESCRIPTION_") |
|||
private String description; |
|||
|
|||
/** |
|||
* 组件类型 |
|||
*/ |
|||
@Column(name= "COMPONENT_TYPE_") |
|||
@Enumerated(EnumType.STRING) |
|||
private QualitativeAdditionComponentType componentType; |
|||
|
|||
/** |
|||
* 条件 |
|||
*/ |
|||
@Column(name= "CONDITION_") |
|||
private String condition; |
|||
|
|||
/** |
|||
* 是否可用 |
|||
*/ |
|||
@Column(name= "ENABLE_") |
|||
@Convert(converter= NumericBooleanConverter.class) |
|||
private Boolean enable; |
|||
|
|||
/** |
|||
* 排序 |
|||
*/ |
|||
@Column(name= "ORDER_") |
|||
private Integer order; |
|||
|
|||
/** |
|||
* 多行文本框行数 |
|||
*/ |
|||
@Column(name= "ROWS_") |
|||
private Integer rows; |
|||
|
|||
/** |
|||
* 提示词 |
|||
*/ |
|||
@Column(name= "PROMPT_") |
|||
private String prompt; |
|||
|
|||
/** |
|||
* 允许上传附件的文件扩展名 |
|||
*/ |
|||
@Column(name= "ATTACHMENT_EXT_NAMES_") |
|||
private String attachmentExtNames; |
|||
|
|||
/** |
|||
* 允许上传附件的最大个数 |
|||
*/ |
|||
@Column(name= "ATTACHMENT_MAX_COUNT_") |
|||
private Integer attachmentMaxCount; |
|||
|
|||
/** |
|||
* 整数值 |
|||
*/ |
|||
@Column(name= "INTEGER_VALUE_") |
|||
private Integer integerValue; |
|||
|
|||
/** |
|||
* 小数值 |
|||
*/ |
|||
@Column(name= "DECIMAL_VALUE_") |
|||
private Integer decimalValue; |
|||
|
|||
/** |
|||
* 文本值 |
|||
*/ |
|||
@Column(name= "TEXT_VALUE_") |
|||
private String textValue; |
|||
|
|||
/** |
|||
* 多行文本值 |
|||
*/ |
|||
@Column(name= "TEXTS_VALUE_") |
|||
private String textsValue; |
|||
|
|||
public RatingQualIndexAddtion() { |
|||
} |
|||
|
|||
public RatingQualIndexAddtion(String id) { |
|||
this.id = id; |
|||
} |
|||
|
|||
@Override |
|||
public RatingQualIndexAddtionVo toVo() { |
|||
RatingQualIndexAddtionVo vo = new RatingQualIndexAddtionVo(); |
|||
vo.setId(this.getId()); |
|||
vo.setDefId(this.getDefId()); |
|||
vo.setCode(this.getCode()); |
|||
vo.setName(this.getName()); |
|||
vo.setDescription(this.getDescription()); |
|||
if (this.getComponentType() != null) { |
|||
vo.setComponentType(this.getComponentType().name()); |
|||
} |
|||
vo.setEnable(this.getEnable()); |
|||
vo.setOrder(this.getOrder()); |
|||
vo.setRows(this.getRows()); |
|||
vo.setPrompt(this.getPrompt()); |
|||
vo.setAttachmentExtNames(this.getAttachmentExtNames()); |
|||
vo.setAttachmentMaxCount(this.getAttachmentMaxCount()); |
|||
vo.setIntegerValue(this.getIntegerValue()); |
|||
vo.setDecimalValue(this.getDecimalValue()); |
|||
vo.setTextValue(this.getTextValue()); |
|||
vo.setTextsValue(this.getTextsValue()); |
|||
return vo; |
|||
} |
|||
|
|||
public String getId() { |
|||
return id; |
|||
} |
|||
|
|||
public void setId(String id) { |
|||
this.id = id; |
|||
} |
|||
|
|||
public String getDefId() { |
|||
return defId; |
|||
} |
|||
|
|||
public void setDefId(String defId) { |
|||
this.defId = defId; |
|||
} |
|||
|
|||
public String getCode() { |
|||
return code; |
|||
} |
|||
|
|||
public void setCode(String code) { |
|||
this.code = code; |
|||
} |
|||
|
|||
public String getName() { |
|||
return name; |
|||
} |
|||
|
|||
public void setName(String name) { |
|||
this.name = name; |
|||
} |
|||
|
|||
public String getDescription() { |
|||
return description; |
|||
} |
|||
|
|||
public void setDescription(String description) { |
|||
this.description = description; |
|||
} |
|||
|
|||
public QualitativeAdditionComponentType getComponentType() { |
|||
return componentType; |
|||
} |
|||
|
|||
public void setComponentType(QualitativeAdditionComponentType componentType) { |
|||
this.componentType = componentType; |
|||
} |
|||
|
|||
public String getCondition() { |
|||
return condition; |
|||
} |
|||
|
|||
public void setCondition(String condition) { |
|||
this.condition = condition; |
|||
} |
|||
|
|||
public Boolean getEnable() { |
|||
return enable; |
|||
} |
|||
|
|||
public void setEnable(Boolean enable) { |
|||
this.enable = enable; |
|||
} |
|||
|
|||
public Integer getOrder() { |
|||
return order; |
|||
} |
|||
|
|||
public void setOrder(Integer order) { |
|||
this.order = order; |
|||
} |
|||
|
|||
public Integer getRows() { |
|||
return rows; |
|||
} |
|||
|
|||
public void setRows(Integer rows) { |
|||
this.rows = rows; |
|||
} |
|||
|
|||
public String getPrompt() { |
|||
return prompt; |
|||
} |
|||
|
|||
public void setPrompt(String prompt) { |
|||
this.prompt = prompt; |
|||
} |
|||
|
|||
public String getAttachmentExtNames() { |
|||
return attachmentExtNames; |
|||
} |
|||
|
|||
public void setAttachmentExtNames(String attachmentExtNames) { |
|||
this.attachmentExtNames = attachmentExtNames; |
|||
} |
|||
|
|||
public Integer getAttachmentMaxCount() { |
|||
return attachmentMaxCount; |
|||
} |
|||
|
|||
public void setAttachmentMaxCount(Integer attachmentMaxCount) { |
|||
this.attachmentMaxCount = attachmentMaxCount; |
|||
} |
|||
|
|||
public Integer getIntegerValue() { |
|||
return integerValue; |
|||
} |
|||
|
|||
public void setIntegerValue(Integer integerValue) { |
|||
this.integerValue = integerValue; |
|||
} |
|||
|
|||
public Integer getDecimalValue() { |
|||
return decimalValue; |
|||
} |
|||
|
|||
public void setDecimalValue(Integer decimalValue) { |
|||
this.decimalValue = decimalValue; |
|||
} |
|||
|
|||
public String getTextValue() { |
|||
return textValue; |
|||
} |
|||
|
|||
public void setTextValue(String textValue) { |
|||
this.textValue = textValue; |
|||
} |
|||
|
|||
public String getTextsValue() { |
|||
return textsValue; |
|||
} |
|||
|
|||
public void setTextsValue(String textsValue) { |
|||
this.textsValue = textsValue; |
|||
} |
|||
} |
|||
|
@ -0,0 +1,10 @@ |
|||
package irbs.cust.rating.jpa.repository; |
|||
|
|||
import io.sc.platform.orm.repository.DaoRepository; |
|||
import irbs.cust.rating.enums.BusinessCodeSuffix; |
|||
import irbs.cust.rating.jpa.entity.BusinessCode; |
|||
|
|||
public interface BusinessCodeRepository extends DaoRepository<BusinessCode, String> { |
|||
|
|||
BusinessCode findByPrefixAndSuffixAndLength(String prefix, BusinessCodeSuffix suffix, Integer length); |
|||
} |
@ -0,0 +1,11 @@ |
|||
package irbs.cust.rating.jpa.repository; |
|||
|
|||
import io.sc.platform.orm.repository.DaoRepository; |
|||
import irbs.cust.rating.jpa.entity.RatingQualIndexAddtion; |
|||
|
|||
import java.util.List; |
|||
|
|||
public interface RatingQualIndexAddtionRepository extends DaoRepository<RatingQualIndexAddtion, String> { |
|||
|
|||
List<RatingQualIndexAddtion> findByDefIdOrderByOrderAsc(String defId); |
|||
} |
@ -0,0 +1,72 @@ |
|||
package irbs.cust.rating.jpa.vo; |
|||
|
|||
import io.sc.platform.orm.api.vo.BaseVo; |
|||
|
|||
public class BusinessCodeVo extends BaseVo { |
|||
|
|||
// 主键
|
|||
private String id; |
|||
|
|||
// 前缀(一般为字母,用来标识是什么业务)
|
|||
private String prefix; |
|||
|
|||
// 后缀(包括:YYYYMMDD,YYYYMM)
|
|||
private String suffix; |
|||
|
|||
// 流水号长度(减掉前缀后缀后的长度,长度为4的示例:R202505280001)
|
|||
private Integer length; |
|||
|
|||
// 最后获取流水号的时间(根据后缀存储)
|
|||
private String lastDate; |
|||
|
|||
// 当前最大序号(每获取一次+1)
|
|||
private Integer maxNum; |
|||
|
|||
public String getId() { |
|||
return id; |
|||
} |
|||
|
|||
public void setId(String id) { |
|||
this.id = id; |
|||
} |
|||
|
|||
public String getPrefix() { |
|||
return prefix; |
|||
} |
|||
|
|||
public void setPrefix(String prefix) { |
|||
this.prefix = prefix; |
|||
} |
|||
|
|||
public String getSuffix() { |
|||
return suffix; |
|||
} |
|||
|
|||
public void setSuffix(String suffix) { |
|||
this.suffix = suffix; |
|||
} |
|||
|
|||
public Integer getLength() { |
|||
return length; |
|||
} |
|||
|
|||
public void setLength(Integer length) { |
|||
this.length = length; |
|||
} |
|||
|
|||
public String getLastDate() { |
|||
return lastDate; |
|||
} |
|||
|
|||
public void setLastDate(String lastDate) { |
|||
this.lastDate = lastDate; |
|||
} |
|||
|
|||
public Integer getMaxNum() { |
|||
return maxNum; |
|||
} |
|||
|
|||
public void setMaxNum(Integer maxNum) { |
|||
this.maxNum = maxNum; |
|||
} |
|||
} |
@ -0,0 +1,224 @@ |
|||
package irbs.cust.rating.jpa.vo; |
|||
|
|||
import io.sc.platform.orm.api.vo.BaseVo; |
|||
|
|||
public class RatingQualIndexAddtionVo extends BaseVo { |
|||
|
|||
private String id; |
|||
|
|||
/** |
|||
* 问题定义ID |
|||
*/ |
|||
private String defId; |
|||
|
|||
/** |
|||
* 代码 |
|||
*/ |
|||
private String code; |
|||
|
|||
/** |
|||
* 名称 |
|||
*/ |
|||
private String name; |
|||
|
|||
/** |
|||
* 描述 |
|||
*/ |
|||
private String description; |
|||
|
|||
/** |
|||
* 组件类型 |
|||
*/ |
|||
private String componentType; |
|||
|
|||
/** |
|||
* 条件 |
|||
*/ |
|||
private String condition; |
|||
|
|||
/** |
|||
* 是否可用 |
|||
*/ |
|||
private Boolean enable; |
|||
|
|||
/** |
|||
* 排序 |
|||
*/ |
|||
private Integer order; |
|||
|
|||
/** |
|||
* 多行文本框行数 |
|||
*/ |
|||
private Integer rows; |
|||
|
|||
/** |
|||
* 提示词 |
|||
*/ |
|||
private String prompt; |
|||
|
|||
/** |
|||
* 允许上传附件的文件扩展名 |
|||
*/ |
|||
private String attachmentExtNames; |
|||
|
|||
/** |
|||
* 允许上传附件的最大个数 |
|||
*/ |
|||
private Integer attachmentMaxCount; |
|||
|
|||
/** |
|||
* 整数值 |
|||
*/ |
|||
private Integer integerValue; |
|||
|
|||
/** |
|||
* 小数值 |
|||
*/ |
|||
private Integer decimalValue; |
|||
|
|||
/** |
|||
* 文本值 |
|||
*/ |
|||
private String textValue; |
|||
|
|||
/** |
|||
* 多行文本值 |
|||
*/ |
|||
private String textsValue; |
|||
|
|||
public String getId() { |
|||
return id; |
|||
} |
|||
|
|||
public void setId(String id) { |
|||
this.id = id; |
|||
} |
|||
|
|||
public String getDefId() { |
|||
return defId; |
|||
} |
|||
|
|||
public void setDefId(String defId) { |
|||
this.defId = defId; |
|||
} |
|||
|
|||
public String getCode() { |
|||
return code; |
|||
} |
|||
|
|||
public void setCode(String code) { |
|||
this.code = code; |
|||
} |
|||
|
|||
public String getName() { |
|||
return name; |
|||
} |
|||
|
|||
public void setName(String name) { |
|||
this.name = name; |
|||
} |
|||
|
|||
public String getDescription() { |
|||
return description; |
|||
} |
|||
|
|||
public void setDescription(String description) { |
|||
this.description = description; |
|||
} |
|||
|
|||
public String getComponentType() { |
|||
return componentType; |
|||
} |
|||
|
|||
public void setComponentType(String componentType) { |
|||
this.componentType = componentType; |
|||
} |
|||
|
|||
public String getCondition() { |
|||
return condition; |
|||
} |
|||
|
|||
public void setCondition(String condition) { |
|||
this.condition = condition; |
|||
} |
|||
|
|||
public Boolean getEnable() { |
|||
return enable; |
|||
} |
|||
|
|||
public void setEnable(Boolean enable) { |
|||
this.enable = enable; |
|||
} |
|||
|
|||
public Integer getOrder() { |
|||
return order; |
|||
} |
|||
|
|||
public void setOrder(Integer order) { |
|||
this.order = order; |
|||
} |
|||
|
|||
public Integer getRows() { |
|||
return rows; |
|||
} |
|||
|
|||
public void setRows(Integer rows) { |
|||
this.rows = rows; |
|||
} |
|||
|
|||
public String getPrompt() { |
|||
return prompt; |
|||
} |
|||
|
|||
public void setPrompt(String prompt) { |
|||
this.prompt = prompt; |
|||
} |
|||
|
|||
public String getAttachmentExtNames() { |
|||
return attachmentExtNames; |
|||
} |
|||
|
|||
public void setAttachmentExtNames(String attachmentExtNames) { |
|||
this.attachmentExtNames = attachmentExtNames; |
|||
} |
|||
|
|||
public Integer getAttachmentMaxCount() { |
|||
return attachmentMaxCount; |
|||
} |
|||
|
|||
public void setAttachmentMaxCount(Integer attachmentMaxCount) { |
|||
this.attachmentMaxCount = attachmentMaxCount; |
|||
} |
|||
|
|||
public Integer getIntegerValue() { |
|||
return integerValue; |
|||
} |
|||
|
|||
public void setIntegerValue(Integer integerValue) { |
|||
this.integerValue = integerValue; |
|||
} |
|||
|
|||
public Integer getDecimalValue() { |
|||
return decimalValue; |
|||
} |
|||
|
|||
public void setDecimalValue(Integer decimalValue) { |
|||
this.decimalValue = decimalValue; |
|||
} |
|||
|
|||
public String getTextValue() { |
|||
return textValue; |
|||
} |
|||
|
|||
public void setTextValue(String textValue) { |
|||
this.textValue = textValue; |
|||
} |
|||
|
|||
public String getTextsValue() { |
|||
return textsValue; |
|||
} |
|||
|
|||
public void setTextsValue(String textsValue) { |
|||
this.textsValue = textsValue; |
|||
} |
|||
} |
@ -0,0 +1,19 @@ |
|||
package irbs.cust.rating.service; |
|||
|
|||
import io.sc.platform.orm.service.DaoService; |
|||
import irbs.cust.rating.enums.BusinessCodeSuffix; |
|||
import irbs.cust.rating.jpa.entity.BusinessCode; |
|||
import irbs.cust.rating.jpa.repository.BusinessCodeRepository; |
|||
|
|||
public interface BusinessCodeService extends DaoService<BusinessCode, String, BusinessCodeRepository> { |
|||
|
|||
/** |
|||
* 获取业务流水号 |
|||
* @param prefix 前缀 |
|||
* @param suffix 后缀 |
|||
* @param length 流水号长度(减去前缀后缀后的长度) |
|||
* @return |
|||
* @throws Exception |
|||
*/ |
|||
String getBusinessCode(String prefix, BusinessCodeSuffix suffix, Integer length) throws Exception; |
|||
} |
@ -0,0 +1,9 @@ |
|||
package irbs.cust.rating.service; |
|||
|
|||
import io.sc.platform.orm.service.DaoService; |
|||
import irbs.cust.rating.jpa.entity.RatingQualIndexAddtion; |
|||
import irbs.cust.rating.jpa.repository.RatingQualIndexAddtionRepository; |
|||
|
|||
public interface RatingQualIndexAddtionService extends DaoService<RatingQualIndexAddtion, String, RatingQualIndexAddtionRepository> { |
|||
|
|||
} |
@ -0,0 +1,57 @@ |
|||
package irbs.cust.rating.service.impl; |
|||
|
|||
import io.sc.platform.orm.service.impl.DaoServiceImpl; |
|||
import irbs.cust.rating.enums.BusinessCodeSuffix; |
|||
import irbs.cust.rating.jpa.entity.BusinessCode; |
|||
import irbs.cust.rating.jpa.repository.BusinessCodeRepository; |
|||
import irbs.cust.rating.service.BusinessCodeService; |
|||
import org.springframework.stereotype.Service; |
|||
|
|||
import java.text.SimpleDateFormat; |
|||
import java.util.Date; |
|||
|
|||
@Service("businessCodeService") |
|||
public class BusinessCodeServiceImpl extends DaoServiceImpl<BusinessCode, String, BusinessCodeRepository> implements BusinessCodeService { |
|||
|
|||
@Override |
|||
public String getBusinessCode(String prefix, BusinessCodeSuffix suffix, Integer length) throws Exception { |
|||
BusinessCode businessCode = repository.findByPrefixAndSuffixAndLength(prefix, suffix, length); |
|||
String lastDate = getLastDate(suffix); |
|||
Integer currNum = 1; |
|||
if (null != businessCode) { |
|||
if (businessCode.getLastDate().equals(lastDate)) { |
|||
currNum = businessCode.getMaxNum() + 1; |
|||
} |
|||
} else { |
|||
businessCode = new BusinessCode(); |
|||
businessCode.setPrefix(prefix); |
|||
businessCode.setSuffix(suffix); |
|||
businessCode.setLength(length); |
|||
} |
|||
businessCode.setLastDate(lastDate); |
|||
businessCode.setMaxNum(currNum); |
|||
repository.save(businessCode); |
|||
return prefix + lastDate + formatNumber(currNum, length); |
|||
} |
|||
|
|||
private String getLastDate(BusinessCodeSuffix suffix) { |
|||
String lastDate = ""; |
|||
Date date = new Date(); |
|||
SimpleDateFormat sdf = null; |
|||
switch (suffix) { |
|||
case YYYYMM: |
|||
sdf = new SimpleDateFormat("yyyyMM"); |
|||
lastDate = sdf.format(date); |
|||
break; |
|||
case YYYYMMDD: |
|||
sdf = new SimpleDateFormat("yyyyMMdd"); |
|||
lastDate = sdf.format(date); |
|||
break; |
|||
} |
|||
return lastDate; |
|||
} |
|||
|
|||
public String formatNumber(int number, int length) { |
|||
return String.format("%0" + length + "d", number); |
|||
} |
|||
} |
@ -0,0 +1,12 @@ |
|||
package irbs.cust.rating.service.impl; |
|||
|
|||
import io.sc.platform.orm.service.impl.DaoServiceImpl; |
|||
import irbs.cust.rating.jpa.entity.RatingQualIndexAddtion; |
|||
import irbs.cust.rating.jpa.repository.RatingQualIndexAddtionRepository; |
|||
import irbs.cust.rating.service.RatingQualIndexAddtionService; |
|||
import org.springframework.stereotype.Service; |
|||
|
|||
@Service("ratingQualIndexAddtionService") |
|||
public class RatingQualIndexAddtionServiceImpl extends DaoServiceImpl<RatingQualIndexAddtion, String, RatingQualIndexAddtionRepository> implements RatingQualIndexAddtionService { |
|||
|
|||
} |
@ -0,0 +1,439 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<databaseChangeLog |
|||
xmlns="http://www.liquibase.org/xml/ns/dbchangelog" |
|||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
|||
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" |
|||
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.5.xsd |
|||
http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd"> |
|||
|
|||
<changeSet id="20250528_DG_KH_DDL" author="platform"> |
|||
<!-- 对公客户基本信息表 --> |
|||
<createTable tableName="IRS_DG_KH_BASE_INF" remarks="对公客户基本信息表"> |
|||
<column name="ID_" type="java.sql.Types.NVARCHAR(50)" remarks="ID主键"> |
|||
<constraints primaryKey="true"/> |
|||
</column> |
|||
<column name="CUST_NO" type="java.sql.Types.NVARCHAR(60)" remarks="客户编号"></column> |
|||
<column name="CUST_NAME" type="java.sql.Types.NVARCHAR(100)" remarks="客户名称"></column> |
|||
<column name="CUST_TYPE" type="java.sql.Types.NVARCHAR(10)" remarks="客户类别(1:一般公司客户;2:金融机构及发债企业客户)"></column> |
|||
|
|||
<column name="CUSTOMER_CHINESE_NAME" type="java.sql.Types.NVARCHAR(90)" remarks="客户中文名称"></column> |
|||
<column name="MANAGER_NAME" type="java.sql.Types.NVARCHAR(50)" remarks="客户经理名称"></column> |
|||
<column name="MANAGER_CODE" type="java.sql.Types.NVARCHAR(50)" remarks="客户经理编号"></column> |
|||
<column name="MANAGER_ORG_CODE" type="java.sql.Types.NVARCHAR(50)" remarks="客户经理所在机构编号"></column> |
|||
<column name="MANAGER_ORG_NAME" type="java.sql.Types.NVARCHAR(200)" remarks="客户经理所在机构名称"></column> |
|||
<column name="LAUNCH_USER" type="java.sql.Types.NVARCHAR(100)" remarks="发起人"></column> |
|||
<column name="QUAN_SCORE" type="java.sql.Types.NUMERIC(24, 8)" remarks="定量得分"></column> |
|||
<column name="QUAL_SCORE" type="java.sql.Types.NUMERIC(24, 8)" remarks="定性得分"></column> |
|||
<column name="MODEL_SCORE" type="java.sql.Types.NUMERIC(24, 8)" remarks="模型得分"></column> |
|||
<column name="INIT_LEVEL" type="java.sql.Types.NVARCHAR(10)" remarks="初始级别"></column> |
|||
<column name="ADJ_LEVEL" type="java.sql.Types.NVARCHAR(10)" remarks="调整项级别"></column> |
|||
<column name="SP_LEVEL" type="java.sql.Types.NVARCHAR(10)" remarks="评级推翻级别"></column> |
|||
<column name="FINAL_LEVEL" type="java.sql.Types.NVARCHAR(10)" remarks="最终认定级别"></column> |
|||
<column name="PD" type="java.sql.Types.NUMERIC(24, 8)" remarks="违约概率"></column> |
|||
<column name="PROCESS_INSTANCE_ID" type="java.sql.Types.NVARCHAR(50)" remarks="流程实例主键"></column> |
|||
<column name="PROCESS_STATUS" type="java.sql.Types.NVARCHAR(50)" remarks="流程状态"></column> |
|||
<column name="RATING_STATUS" type="java.sql.Types.NVARCHAR(50)" remarks="评级状态"></column> |
|||
<column name="TRIGGER_TYPE" type="java.sql.Types.NVARCHAR(50)" remarks="评级任务触发类型"></column> |
|||
<column name="TRIGGER_REA" type="java.sql.Types.NVARCHAR(500)" remarks="评级任务触发原因"></column> |
|||
<column name="RATE_TYPE" type="java.sql.Types.NVARCHAR(10)" remarks="评级类型"></column> |
|||
<column name="RATE_TYPE_DES" type="java.sql.Types.NVARCHAR(500)" remarks="评级类型描述"></column> |
|||
<column name="START_TIME" type="DATETIME" remarks="评级发起日期"></column> |
|||
<column name="EFFECTIVE_TIME" type="DATETIME" remarks="评级生效时间"></column> |
|||
<column name="MATURE_TIME" type="DATETIME" remarks="评级到期时间"></column> |
|||
<column name="MODEL_ID" type="java.sql.Types.NVARCHAR(50)" remarks="评级模型ID"></column> |
|||
<column name="MODEL_CODE" type="java.sql.Types.NVARCHAR(50)" remarks="评级模型编号"></column> |
|||
<column name="MODEL_NAME" type="java.sql.Types.NVARCHAR(100)" remarks="评级模型名称"></column> |
|||
<column name="RATING_CFG_ID" type="java.sql.Types.NVARCHAR(50)" remarks="评级配置ID"></column> |
|||
<column name="IS_ADMIT" type="java.sql.Types.SMALLINT" remarks="准入建议"></column> |
|||
<column name="IS_TRIAL" type="java.sql.Types.SMALLINT" remarks="是否试算"></column> |
|||
<column name="MODEL_LEVEL" type="java.sql.Types.NVARCHAR(50)" remarks="模型评级等级"></column> |
|||
<column name="CURRENT_STEP" type="java.sql.Types.NVARCHAR(50)" remarks="当前评级步骤(页面位置)"></column> |
|||
<column name="OVER_NUM" type="java.sql.Types.SMALLINT" remarks="意见位置"></column> |
|||
<column name="OUT_IMAGE_ID" type="java.sql.Types.NVARCHAR(50)" remarks="外部数据授权标志"></column> |
|||
<column name="ACCESS_LEVEL" type="java.sql.Types.NVARCHAR(10)" remarks="准入级别"></column> |
|||
<column name="DEFAULT_IND" type="java.sql.Types.NVARCHAR(10)" remarks="违约标识"></column> |
|||
<column name="QUAL_CALC_COUNT" type="java.sql.Types.SMALLINT" remarks="定性计算次数"></column> |
|||
<column name="PWH_COMMITTEE_NUM" type="java.sql.Types.SMALLINT" remarks="评级委员会人数"></column> |
|||
<column name="GX_END_TIME" type="DATETIME" remarks="评级更新任务到期时间"></column> |
|||
<column name="DATA_COME_FROM_" type="java.sql.Types.NVARCHAR(10)" remarks="数据来源(INPUT:手工录入,IMPORT:系统自动导入)" defaultValue="INPUT"></column> |
|||
<column name="CREATOR_" type="java.sql.Types.NVARCHAR(255)" remarks="创建人"></column> |
|||
<column name="CREATE_DATE_" type="DATETIME" remarks="创建日期"></column> |
|||
<column name="LAST_MODIFIER_" type="java.sql.Types.NVARCHAR(255)" remarks="最后修改人"></column> |
|||
<column name="LAST_MODIFYDATE_" type="DATETIME" remarks="最后修改日期"></column> |
|||
<column name="CORP_CODE_" type="java.sql.Types.NVARCHAR(255)" remarks="所属法人代码" defaultValue="_PRIMARY_"> |
|||
|
|||
</column> |
|||
<column name="MODEL_ID_G" type="java.sql.Types.NVARCHAR(50)" remarks="评级模型ID(灰度)"></column> |
|||
<column name="MODEL_CODE_G" type="java.sql.Types.NVARCHAR(50)" remarks="评级模型编号(灰度)"></column> |
|||
<column name="MODEL_NAME_G" type="java.sql.Types.NVARCHAR(100)" remarks="评级模型名称(灰度)"></column> |
|||
<column name="QUAN_SCORE_G" type="java.sql.Types.NUMERIC(24, 8)" remarks="定量得分(灰度)"></column> |
|||
<column name="QUAL_SCORE_G" type="java.sql.Types.NUMERIC(24, 8)" remarks="定性得分(灰度)"></column> |
|||
<column name="MODEL_SCORE_G" type="java.sql.Types.NUMERIC(24, 8)" remarks="模型得分(灰度)"></column> |
|||
<column name="MODEL_LEVEL_G" type="java.sql.Types.NVARCHAR(50)" remarks="模型评级等级(灰度)"></column> |
|||
<column name="ACCESS_LEVEL_G" type="java.sql.Types.NVARCHAR(10)" remarks="准入级别(灰度)"></column> |
|||
<column name="ADJ_LEVEL_G" type="java.sql.Types.NVARCHAR(10)" remarks="调整项级别(灰度)"></column> |
|||
</createTable> |
|||
|
|||
<!-- ESB客户基本信息表 --> |
|||
<createTable tableName="ESB_RATING_CUSTOMER" remarks="ESB客户基本信息表"> |
|||
<column name="ID_" type="java.sql.Types.NVARCHAR(50)" remarks="主键"> |
|||
<constraints primaryKey="true"/> |
|||
</column> |
|||
<column name="CUSTOMER_ID" type="java.sql.Types.NVARCHAR(12)" remarks="客户编号"/> |
|||
<column name="CUSTOMER_CHINESE_NAME" type="java.sql.Types.NVARCHAR(90)" remarks="客户中文名称"/> |
|||
<column name="CERTIFICATE_TYPE" type="java.sql.Types.NVARCHAR(5)" remarks="证件类型"/> |
|||
<column name="CERTIFICATE_NUM" type="java.sql.Types.NVARCHAR(100)" remarks="证件号码"/> |
|||
<column name="CUSTOMER_TYPE" type="java.sql.Types.NVARCHAR(1)" remarks="对公客户类型"/> |
|||
<column name="CUSTOMER_SIZE" type="java.sql.Types.NVARCHAR(2)" remarks="企业规模"/> |
|||
<column name="REGISTERED_TYPE" type="java.sql.Types.NVARCHAR(5)" remarks="企业类型"/> |
|||
<column name="GOVER_FINANCE_SIGN" type="java.sql.Types.NVARCHAR(1)" remarks="融资平台标志"/> |
|||
<column name="GOVER_FINANCE_TYPE" type="java.sql.Types.NVARCHAR(1)" remarks="政府融资平台类型"/> |
|||
<column name="REGISTRATION" type="java.sql.Types.NVARCHAR(2)" remarks="所在行政区域"/> |
|||
<column name="NATION" type="java.sql.Types.NVARCHAR(5)" remarks="所在国家地区"/> |
|||
<column name="MEMBER_TYPE" type="java.sql.Types.NVARCHAR(2)" remarks="成员类别"/> |
|||
<column name="GROUP_CUST_IND" type="java.sql.Types.NVARCHAR(1)" remarks="是否集团客户"/> |
|||
<column name="FLAG_FOR_QUOTED_COMPANY" type="java.sql.Types.NVARCHAR(1)" remarks="上市公司标识"/> |
|||
<column name="INDUSTRY_TYPE" type="java.sql.Types.NVARCHAR(6)" remarks="国标行业分类"/> |
|||
<column name="BUILD_DATE" type="java.sql.Types.NVARCHAR(24)" remarks="成立日期"/> |
|||
<column name="CUSTOMER_MANAGER_NO" type="java.sql.Types.NVARCHAR(100)" remarks="经办人编号"/> |
|||
<column name="CUSTOMER_MANAGER_NAME" type="java.sql.Types.NVARCHAR(100)" remarks="经办人名称"/> |
|||
<column name="CURRENT_PROCESSOR_CODE" type="java.sql.Types.NVARCHAR(36)" remarks="企业类型"/> |
|||
<column name="CURRENT_PROCESSOR_NAME" type="java.sql.Types.NVARCHAR(100)" remarks="所在行政区域"/> |
|||
<column name="HANDLE_ORG_ID" type="java.sql.Types.NVARCHAR(36)" remarks="经办机构"/> |
|||
<column name="HANDLE_TIME" type="DATETIME" remarks="经办时间"/> |
|||
<column name="MAIN_BUSI_UNDER_FORTY" type="java.sql.Types.NVARCHAR(1)" remarks="主营业务占比不超过40%"/> |
|||
<column name="REPORT_ID" type="java.sql.Types.NVARCHAR(50)" remarks="征信报告主键"/> |
|||
<column name="EXTERNAL_FILE_CODE" type="java.sql.Types.NVARCHAR(50)" remarks="外部数据文件传输码"/> |
|||
<column name="ACTU_CTRL_YEARS" type="java.sql.Types.SMALLINT" remarks="实际控制人从业年限"/> |
|||
<column name="CORPORATE_CUSTOMER_TYPE" type="java.sql.Types.NVARCHAR(3)" remarks="对公客户类型"/> |
|||
<column name="DATA_COME_FROM_" type="java.sql.Types.NVARCHAR(10)" remarks="数据来源(INPUT:手工录入,IMPORT:系统自动导入)" defaultValue="INPUT"></column> |
|||
<column name="CREATOR_" type="java.sql.Types.NVARCHAR(255)" remarks="创建人"></column> |
|||
<column name="CREATE_DATE_" type="DATETIME" remarks="创建日期"></column> |
|||
<column name="LAST_MODIFIER_" type="java.sql.Types.NVARCHAR(255)" remarks="最后修改人"></column> |
|||
<column name="LAST_MODIFYDATE_" type="DATETIME" remarks="最后修改日期"></column> |
|||
<column name="CORP_CODE_" type="java.sql.Types.NVARCHAR(255)" remarks="所属法人代码" defaultValue="_PRIMARY_"> |
|||
|
|||
</column> |
|||
</createTable> |
|||
|
|||
<!-- 对公客户基本信息 --> |
|||
<createTable tableName="IRBS_CUST_CP_INFO" remarks="对公客户基本信息"> |
|||
<column name="ID_" type="java.sql.Types.NVARCHAR(50)" remarks="主键"> |
|||
<constraints primaryKey="true"/> |
|||
</column> |
|||
<column name="DATA_DT" type="java.sql.Types.NVARCHAR(100)" remarks="数据日期"/> |
|||
<column name="CUSTOMER_ID" type="java.sql.Types.NVARCHAR(12)" remarks="客户编号"/> |
|||
<column name="CUSTOMER_CHINESE_NAME" type="java.sql.Types.NVARCHAR(90)" remarks="客户中文名称"/> |
|||
<column name="CUST_TYPE_CD" type="java.sql.Types.NVARCHAR(100)" remarks="客户类型"/> |
|||
<column name="ORGN_CD" type="java.sql.Types.NVARCHAR(100)" remarks="组织机构代码"/> |
|||
<column name="LEGA_BOOK_NO" type="java.sql.Types.NVARCHAR(100)" remarks="法人证书号"/> |
|||
<column name="ORG_CRDT_CD" type="java.sql.Types.NVARCHAR(100)" remarks="统一信用代码证号"/> |
|||
<column name="CUST_SORT_CD" type="java.sql.Types.NVARCHAR(100)" remarks="客户分类"/> |
|||
<column name="CORP_SIZE_CD" type="java.sql.Types.NVARCHAR(100)" remarks="企业规模"/> |
|||
<column name="INDU_SORT_CD" type="java.sql.Types.NVARCHAR(100)" remarks="国标行业分类"/> |
|||
<column name="CHASTEN_CUST_FLAG" type="java.sql.Types.NVARCHAR(100)" remarks="是否为联合惩戒名单客户"/> |
|||
<column name="FIRST_CRTD_CRDT_RELA_DT" type="java.sql.Types.NVARCHAR(100)" remarks="与我行建立信贷关系时间"/> |
|||
<column name="BUILD_DT" type="java.sql.Types.NVARCHAR(100)" remarks="成立日期"/> |
|||
<column name="UPDATE_DT" type="java.sql.Types.NVARCHAR(100)" remarks="更新日期"/> |
|||
<column name="LEGAL_REP" type="java.sql.Types.NVARCHAR(500)" remarks="法人代表"/> |
|||
<column name="RGST_GROUND" type="java.sql.Types.NVARCHAR(300)" remarks="注册地址"/> |
|||
<column name="MGER_NO" type="java.sql.Types.NVARCHAR(100)" remarks="管户人编号"/> |
|||
<column name="MGER_CNA" type="java.sql.Types.NVARCHAR(100)" remarks="管户人"/> |
|||
<column name="MGER_ORG_NM" type="java.sql.Types.NVARCHAR(100)" remarks="管户机构"/> |
|||
<column name="MGER_ORG_NO" type="java.sql.Types.NVARCHAR(100)" remarks="管户机构编号"/> |
|||
<column name="MGER_ORG_NO_UP" type="java.sql.Types.NVARCHAR(100)" remarks="管户机构上级"/> |
|||
<column name="CORP_SUBJ" type="java.sql.Types.NVARCHAR(100)" remarks="企业隶属"/> |
|||
<column name="NATION_CD" type="java.sql.Types.NVARCHAR(100)" remarks="所在国家地区"/> |
|||
<column name="RGST_GROUND_ADMIN_REGION_CD" type="java.sql.Types.NVARCHAR(100)" remarks="所在行政区域"/> |
|||
<column name="LT_TRD_YEAR_INCOME_FLAG" type="java.sql.Types.NVARCHAR(100)" remarks="近三年营业收入不大于三亿"/> |
|||
<column name="GOVER_FIN_FLT_FLAG" type="java.sql.Types.NVARCHAR(100)" remarks="是否政府融资平台"/> |
|||
<column name="PRI_RIGHT_LIST_FLAG" type="java.sql.Types.NVARCHAR(100)" remarks="是否主权名单"/> |
|||
<column name="YEARS3_OVDUE_30_DAY_FLAG" type="java.sql.Types.NVARCHAR(100)" remarks="3年内借据逾期超过30天标志"/> |
|||
<column name="YEARS3_EXPAND_2_CNT_FLAG" type="java.sql.Types.NVARCHAR(100)" remarks="3年内贷款展期次数2次及以上标志"/> |
|||
<column name="YEARS3_ADV_MONEY_30_DAY_FLAG" type="java.sql.Types.NVARCHAR(100)" remarks="3年内垫款超过30天标志"/> |
|||
<column name="YEARS3_BOR_REPAY_2_CNT_FLAG" type="java.sql.Types.NVARCHAR(100)" remarks="3年内借新还旧次数2次及以上标志"/> |
|||
<column name="YEARS3_MODE_MODIF_OVERDUE_2_CNT_FLAG" type="java.sql.Types.NVARCHAR(100)" remarks="3年内结息方式变更后是否出现逾期2次及以上标志"/> |
|||
<column name="YEARS3_PRIN_REPAY_PLAN_MODIF_2_CNT_FLAG" type="java.sql.Types.NVARCHAR(100)" remarks="3年内合同的本金还款计划是否变更2次及以上标志"/> |
|||
<column name="YEARS3_REGROUP_2_CNT_FLAG" type="java.sql.Types.CHAR" remarks="3年内重组2次及以上标志"/> |
|||
<column name="DATA_COME_FROM_" type="java.sql.Types.NVARCHAR(10)" remarks="数据来源(INPUT:手工录入,IMPORT:系统自动导入)" defaultValue="INPUT"></column> |
|||
<column name="CREATOR_" type="java.sql.Types.NVARCHAR(255)" remarks="创建人"></column> |
|||
<column name="CREATE_DATE_" type="DATETIME" remarks="创建日期"></column> |
|||
<column name="LAST_MODIFIER_" type="java.sql.Types.NVARCHAR(255)" remarks="最后修改人"></column> |
|||
<column name="LAST_MODIFYDATE_" type="DATETIME" remarks="最后修改日期"></column> |
|||
<column name="CORP_CODE_" type="java.sql.Types.NVARCHAR(255)" remarks="所属法人代码" defaultValue="_PRIMARY_"> |
|||
|
|||
</column> |
|||
</createTable> |
|||
|
|||
<!-- 评级步骤表 --> |
|||
<createTable tableName="NS_RATING_STEP" remarks="评级步骤表"> |
|||
<column name="ID_" type="java.sql.Types.NVARCHAR(36)" remarks="主键"> |
|||
<constraints primaryKey="true"/> |
|||
</column> |
|||
<column name="RATING_ID" type="java.sql.Types.NVARCHAR(36)" remarks="评级主键"/> |
|||
<column name="STEP_NAME" type="java.sql.Types.NVARCHAR(50)" remarks="步骤名称"/> |
|||
<column name="STEP_NO" type="java.sql.Types.NVARCHAR(5)" remarks="步骤编号"/> |
|||
<column name="STEP_TYPE" type="java.sql.Types.NVARCHAR(50)" remarks="步骤类型"/> |
|||
<column name="MODEL_ID" type="java.sql.Types.NVARCHAR(50)" remarks="模型主键"/> |
|||
<column name="DATA_COME_FROM_" type="java.sql.Types.NVARCHAR(10)" remarks="数据来源(INPUT:手工录入,IMPORT:系统自动导入)" defaultValue="INPUT"></column> |
|||
<column name="CREATOR_" type="java.sql.Types.NVARCHAR(255)" remarks="创建人"></column> |
|||
<column name="CREATE_DATE_" type="DATETIME" remarks="创建日期"></column> |
|||
<column name="LAST_MODIFIER_" type="java.sql.Types.NVARCHAR(255)" remarks="最后修改人"></column> |
|||
<column name="LAST_MODIFYDATE_" type="DATETIME" remarks="最后修改日期"></column> |
|||
<column name="CORP_CODE_" type="java.sql.Types.NVARCHAR(255)" remarks="所属法人代码" defaultValue="_PRIMARY_"> |
|||
|
|||
</column> |
|||
</createTable> |
|||
|
|||
<!-- 评级配置_评级步骤定义 --> |
|||
<createTable tableName="NS_R_CFG_STEPS" remarks="评级配置_评级步骤定义"> |
|||
<column name="ID_" type="java.sql.Types.NVARCHAR(36)" remarks="主键"> |
|||
<constraints primaryKey="true"/> |
|||
</column> |
|||
<column name="RATING_CFG_ID" type="java.sql.Types.NVARCHAR(36)" remarks="评级配置主表ID"/> |
|||
<column name="STEP_CODE" type="java.sql.Types.NVARCHAR(50)" remarks="步骤编号"/> |
|||
<column name="STEP_NAME" type="java.sql.Types.NVARCHAR(254)" remarks="步骤名称"/> |
|||
<column name="STEP_NUM" type="java.sql.Types.NUMERIC(2, 0)" remarks="步骤序号"/> |
|||
<column name="STEP_TYPE" type="java.sql.Types.NVARCHAR(20)" remarks="步骤类型(DL:定量,DX:定性,TZ:调整项,WB:外部支持,TF:评级推翻,OT:其他)"/> |
|||
<column name="STEP_SOURCE_PATH" type="java.sql.Types.NVARCHAR(1000)" remarks="步骤资源路径"/> |
|||
<column name="DATA_COME_FROM_" type="java.sql.Types.NVARCHAR(10)" remarks="数据来源(INPUT:手工录入,IMPORT:系统自动导入)" defaultValue="INPUT"></column> |
|||
<column name="CREATOR_" type="java.sql.Types.NVARCHAR(255)" remarks="创建人"></column> |
|||
<column name="CREATE_DATE_" type="DATETIME" remarks="创建日期"></column> |
|||
<column name="LAST_MODIFIER_" type="java.sql.Types.NVARCHAR(255)" remarks="最后修改人"></column> |
|||
<column name="LAST_MODIFYDATE_" type="DATETIME" remarks="最后修改日期"></column> |
|||
<column name="CORP_CODE_" type="java.sql.Types.NVARCHAR(255)" remarks="所属法人代码" defaultValue="_PRIMARY_"> |
|||
|
|||
</column> |
|||
</createTable> |
|||
|
|||
<!-- 客户评级指标 --> |
|||
<createTable tableName="NS_RATING_INDEXES" remarks="客户评级指标"> |
|||
<column name="ID_" type="java.sql.Types.NVARCHAR(36)" remarks="主键"> |
|||
<constraints primaryKey="true"/> |
|||
</column> |
|||
<column name="STEP_ID" type="java.sql.Types.NVARCHAR(36)" remarks="评级步骤ID"/> |
|||
<column name="INDEX_TYPE" type="java.sql.Types.NVARCHAR(20)" remarks="指标类型"/> |
|||
<column name="INDEX_CATEGORY" type="java.sql.Types.NVARCHAR(500)" remarks="指标分类"/> |
|||
<column name="INDEX_NAME" type="java.sql.Types.NVARCHAR(500)" remarks="指标名称"/> |
|||
<column name="CONFIG_ID" type="java.sql.Types.NVARCHAR(36)" remarks="配置ID"/> |
|||
<column name="INDEX_ID" type="java.sql.Types.NVARCHAR(36)" remarks="指标ID"/> |
|||
<column name="INDEX_CODE" type="java.sql.Types.NVARCHAR(50)" remarks="指标编号"/> |
|||
<column name="INDEX_VALUE" type="java.sql.Types.NVARCHAR(50)" remarks="指标值"/> |
|||
<column name="WEIGHT" type="java.sql.Types.NUMERIC(9, 6)" remarks="权重"/> |
|||
<column name="MODEL_LEVEL" type="java.sql.Types.NVARCHAR(10)" remarks="模型层级"/> |
|||
<column name="PARENT_ID" type="java.sql.Types.NVARCHAR(36)" remarks="父ID"/> |
|||
<column name="QUALITATIVE_CONTENT" type="java.sql.Types.NVARCHAR(2000)" remarks="定性内容"/> |
|||
<column name="QUALITATIVE_OPTIONS" type="java.sql.Types.NVARCHAR(2000)" remarks="定性选项"/> |
|||
<column name="INDEX_SCORE" type="java.sql.Types.NUMERIC(20, 4)" remarks="指标得分"/> |
|||
<column name="DATA_COME_FROM_" type="java.sql.Types.NVARCHAR(10)" remarks="数据来源(INPUT:手工录入,IMPORT:系统自动导入)" defaultValue="INPUT"></column> |
|||
<column name="CREATOR_" type="java.sql.Types.NVARCHAR(255)" remarks="创建人"></column> |
|||
<column name="CREATE_DATE_" type="DATETIME" remarks="创建日期"></column> |
|||
<column name="LAST_MODIFIER_" type="java.sql.Types.NVARCHAR(255)" remarks="最后修改人"></column> |
|||
<column name="LAST_MODIFYDATE_" type="DATETIME" remarks="最后修改日期"></column> |
|||
<column name="CORP_CODE_" type="java.sql.Types.NVARCHAR(255)" remarks="所属法人代码" defaultValue="_PRIMARY_"> |
|||
|
|||
</column> |
|||
<column name="INDEX_SCORE_G" type="java.sql.Types.NUMERIC(20, 4)" remarks="指标得分(灰度)"/> |
|||
</createTable> |
|||
|
|||
<!-- 评级配置_候选值定义 --> |
|||
<createTable tableName="NS_R_CFG_VALUES" remarks="评级配置_候选值定义"> |
|||
<column name="ID" type="java.sql.Types.NVARCHAR(36)" remarks="主键"> |
|||
<constraints primaryKey="true"/> |
|||
</column> |
|||
<column name="DEF_ID" type="java.sql.Types.NVARCHAR(36)" remarks="问题定义ID"/> |
|||
<column name="DEF_CODE" type="java.sql.Types.NVARCHAR(50)" remarks="问题定义编号"/> |
|||
<column name="DEF_NAME" type="java.sql.Types.NVARCHAR(2000)" remarks="问题名称"/> |
|||
<column name="ORDER_NUM" type="java.sql.Types.NUMERIC(4, 0)" remarks="选项序号"/> |
|||
<column name="TEXT" type="java.sql.Types.NVARCHAR(1000)" remarks="文本内容"/> |
|||
<column name="DIS_VAL" type="java.sql.Types.NVARCHAR(1000)" remarks="显示值"/> |
|||
<column name="VAL" type="java.sql.Types.NVARCHAR(50)" remarks="使用值"/> |
|||
<column name="WEIGHT" type="java.sql.Types.NVARCHAR(50)" remarks="权重"/> |
|||
</createTable> |
|||
|
|||
<!-- 定性指标补录表--> |
|||
<createTable tableName="NS_QUAL_INDEX_ADDTION" remarks="定性指标补录表"> |
|||
<column name="ID" type="java.sql.Types.NVARCHAR(36)" remarks="主键"> |
|||
<constraints primaryKey="true"/> |
|||
</column> |
|||
<column name="DEF_ID_" type="java.sql.Types.NVARCHAR(36)" remarks="问题定义ID"/> |
|||
<column name="CODE_" type="java.sql.Types.NVARCHAR(50)" remarks="代码"/> |
|||
<column name="NAME_" type="java.sql.Types.NVARCHAR(100)" remarks="名称"/> |
|||
<column name="DESCRIPTION_" type="java.sql.Types.NVARCHAR(500)" remarks="描述"/> |
|||
<column name="COMPONENT_TYPE_" type="java.sql.Types.NVARCHAR(50)" remarks="组件类型(INTEGER:整数;DECIMAL:小数,TEXT:文本;TEXTS:多行文本;ATTACHMENT:附件)"/> |
|||
<column name="CONDITION_" type="java.sql.Types.NVARCHAR(1000)" remarks="条件"/> |
|||
<column name="ENABLE_" type="java.sql.Types.SMALLINT" remarks="是否可用"/> |
|||
<column name="ORDER_" type="java.sql.Types.SMALLINT" remarks="排序"/> |
|||
<column name="ROWS_" type="java.sql.Types.SMALLINT" remarks="多行文本框行数"/> |
|||
<column name="PROMPT_" type="java.sql.Types.NVARCHAR(1000)" remarks="提示词"/> |
|||
<column name="ATTACHMENT_EXT_NAMES_" type="java.sql.Types.NVARCHAR(200)" remarks="允许上传附件的文件扩展名"/> |
|||
<column name="ATTACHMENT_MAX_COUNT_" type="java.sql.Types.SMALLINT" remarks="允许上传附件的最大个数"/> |
|||
<column name="INTEGER_VALUE_" type="java.sql.Types.SMALLINT" remarks="整数值"/> |
|||
<column name="DECIMAL_VALUE_" type="java.sql.Types.NUMERIC(24, 8)" remarks="小数值"/> |
|||
<column name="TEXT_VALUE_" type="java.sql.Types.NVARCHAR(200)" remarks="文本值"/> |
|||
<column name="TEXTS_VALUE_" type="java.sql.Types.NVARCHAR(1000)" remarks="多行文本值"/> |
|||
</createTable> |
|||
|
|||
<!-- 评级配置_调整项定义 --> |
|||
<createTable tableName="NS_R_CFG_ADJ_ITEM" remarks="评级配置_调整项定义"> |
|||
<column name="ID" type="java.sql.Types.NVARCHAR(36)" remarks="主键"> |
|||
<constraints primaryKey="true"/> |
|||
</column> |
|||
<column name="MODEL_CODE" type="java.sql.Types.NVARCHAR(50)" remarks="模型编号"/> |
|||
<column name="ADJ_ITEM_CODE" type="java.sql.Types.NVARCHAR(50)" remarks="调整项定义编号"/> |
|||
</createTable> |
|||
|
|||
<!-- 评级配置_调整项定义详情 --> |
|||
<createTable tableName="NS_R_CFG_ADJ_ITEM_DEF" remarks="评级配置_调整项定义详情"> |
|||
<column name="ID" type="java.sql.Types.NVARCHAR(36)" remarks="主键"> |
|||
<constraints primaryKey="true"/> |
|||
</column> |
|||
<column name="ADJ_ITEM_TYPE" type="java.sql.Types.NVARCHAR(50)" remarks="调整项类型"/> |
|||
<column name="ADJ_ITEM_CODE" type="java.sql.Types.NVARCHAR(50)" remarks="调整项编号"/> |
|||
<column name="ADJ_ITEM_NAME" type="java.sql.Types.NVARCHAR(50)" remarks="调整项名称"/> |
|||
<column name="ADJ_ITEM_DES" type="java.sql.Types.NVARCHAR(2000)" remarks="调整项描述"/> |
|||
<column name="ADJ_ITEM_VALUE" type="java.sql.Types.NVARCHAR(4)" remarks="调整项值"/> |
|||
</createTable> |
|||
|
|||
<!-- 评级征信指库结果表 --> |
|||
<createTable tableName="NS_ENTERPRISE_CREDIT_INDEX" remarks="评级征信指库结果表"> |
|||
<column name="REPORT_ID" type="java.sql.Types.NVARCHAR(50)" remarks="报告编号"/> |
|||
<column name="INDEX_CODE" type="java.sql.Types.NVARCHAR(20)" remarks="指标代码"/> |
|||
<column name="INDEX_NAME" type="java.sql.Types.NVARCHAR(200)" remarks="指标名称"/> |
|||
<column name="INDEX_VALUE" type="java.sql.Types.NVARCHAR(50)" remarks="指标值"/> |
|||
<column name="CUST_NO" type="java.sql.Types.NVARCHAR(50)" remarks="客户号"/> |
|||
</createTable> |
|||
<addUniqueConstraint tableName="NS_ENTERPRISE_CREDIT_INDEX" columnNames="REPORT_ID,CUST_NO,INDEX_CODE"></addUniqueConstraint> |
|||
|
|||
<!-- 客户评级试算记录表 --> |
|||
<createTable tableName="T_CUST_RATING_TEST_CALC" remarks="客户评级试算记录表"> |
|||
<column name="ID" type="java.sql.Types.NVARCHAR(50)" remarks="主键"> |
|||
<constraints primaryKey="true"/> |
|||
</column> |
|||
<column name="RATING_ID" type="java.sql.Types.NVARCHAR(50)" remarks="评级ID"/> |
|||
<column name="TEST_STEP" type="java.sql.Types.NVARCHAR(50)" remarks="试算步骤"/> |
|||
<column name="TEST_MAX_NUM" type="java.sql.Types.NUMERIC(8, 0)" remarks="评级时系统配置的最大试算次数"/> |
|||
<column name="CURR_NUM" type="java.sql.Types.NUMERIC(8, 0)" remarks="当前试算次数"/> |
|||
<column name="CURR_SCORE" type="java.sql.Types.NUMERIC(22, 8)" remarks="当前试算得分"/> |
|||
</createTable> |
|||
|
|||
<!-- 对公客户评级推翻记录 --> |
|||
<createTable tableName="NS_RATING_OVERTURN" remarks="对公客户评级推翻记录"> |
|||
<column name="ID_" type="java.sql.Types.NVARCHAR(36)" remarks="主键"> |
|||
<constraints primaryKey="true"/> |
|||
</column> |
|||
<column name="RATING_ID" type="java.sql.Types.NVARCHAR(36)" remarks="评级ID"/> |
|||
<column name="OVERTURN_TYPE" type="java.sql.Types.NVARCHAR(20)" remarks="推翻类型"/> |
|||
<column name="SUGGEST_LEVEL" type="java.sql.Types.NVARCHAR(5)" remarks="建议级别"/> |
|||
<column name="ADJ_REASON" type="java.sql.Types.NVARCHAR(2000)" remarks="调整原因"/> |
|||
<column name="FILE_COUNT" type="java.sql.Types.NUMERIC(10, 0)" remarks="附件数量"/> |
|||
<column name="ORG_ID" type="java.sql.Types.NVARCHAR(36)" remarks="机构"/> |
|||
<column name="USER_CODE" type="java.sql.Types.NVARCHAR(254)" remarks="用户编号"/> |
|||
<column name="USER_NAME" type="java.sql.Types.NVARCHAR(254)" remarks="用户名称"/> |
|||
<column name="ROLE_NAME" type="java.sql.Types.NVARCHAR(254)" remarks="角色名称"/> |
|||
<column name="ROLE_CODE" type="java.sql.Types.NVARCHAR(254)" remarks="角色编号"/> |
|||
<column name="OVER_NUM" type="java.sql.Types.NUMERIC(10, 0)" remarks="意见位置"/> |
|||
<column name="ORG_NAME" type="java.sql.Types.NVARCHAR(254)" remarks="机构名称"/> |
|||
<column name="OPERATION_OPINION" type="java.sql.Types.NVARCHAR(10)" remarks="操作意见"/> |
|||
<column name="IS_OVERTURN" type="java.sql.Types.NUMERIC(10, 0)" remarks="是否推翻"/> |
|||
<column name="DATA_COME_FROM_" type="java.sql.Types.NVARCHAR(10)" remarks="数据来源(INPUT:手工录入,IMPORT:系统自动导入)" defaultValue="INPUT"></column> |
|||
<column name="CREATOR_" type="java.sql.Types.NVARCHAR(255)" remarks="创建人"></column> |
|||
<column name="CREATE_DATE_" type="DATETIME" remarks="创建日期"></column> |
|||
<column name="LAST_MODIFIER_" type="java.sql.Types.NVARCHAR(255)" remarks="最后修改人"></column> |
|||
<column name="LAST_MODIFYDATE_" type="DATETIME" remarks="最后修改日期"></column> |
|||
<column name="CORP_CODE_" type="java.sql.Types.NVARCHAR(255)" remarks="所属法人代码" defaultValue="_PRIMARY_"> |
|||
|
|||
</column> |
|||
</createTable> |
|||
|
|||
<!-- 债项评级结果 --> |
|||
<createTable tableName="P_IRS_CONTR_RAITNG_RESULT" remarks="债项评级结果"> |
|||
<column name="DATA_DT" type="java.sql.Types.NVARCHAR(10)" remarks="数据日期"/> |
|||
<column name="CONT_NO" type="java.sql.Types.NVARCHAR(100)" remarks="合同编号"/> |
|||
<column name="LMT_NO" type="java.sql.Types.NVARCHAR(100)" remarks="额度编号"/> |
|||
<column name="CUST_NO" type="java.sql.Types.NVARCHAR(100)" remarks="客户编号"/> |
|||
<column name="CUST_NAME" type="java.sql.Types.NVARCHAR(100)" remarks="客户名称"/> |
|||
<column name="CCY_CD" type="java.sql.Types.NVARCHAR(100)" remarks="币种代码"/> |
|||
<column name="LMT_PROD_CD" type="java.sql.Types.NVARCHAR(100)" remarks="业务品种"/> |
|||
<column name="CONTR_AMT" type="java.sql.Types.NUMERIC(36, 8)" remarks="合同金额"/> |
|||
<column name="CONTR_BAL" type="java.sql.Types.NUMERIC(36, 8)" remarks="合同余额"/> |
|||
<column name="OWEINT_BAL" type="java.sql.Types.NUMERIC(36, 8)" remarks="欠息余额"/> |
|||
<column name="FEE_BAL" type="java.sql.Types.NUMERIC(36, 8)" remarks="费用余额"/> |
|||
<column name="CONT_SIGN_DT" type="java.sql.Types.NVARCHAR(100)" remarks="合同签订日期"/> |
|||
<column name="CONT_START_DT" type="java.sql.Types.NVARCHAR(100)" remarks="起始日期"/> |
|||
<column name="CONT_END_DT" type="java.sql.Types.NVARCHAR(100)" remarks="到期日期"/> |
|||
<column name="CONTR_TERM_CD" type="java.sql.Types.NVARCHAR(100)" remarks="合同期限类型代码"/> |
|||
<column name="BLOCK_IND" type="java.sql.Types.NVARCHAR(100)" remarks="冻结标志"/> |
|||
<column name="CONT_TYPE_CD" type="java.sql.Types.NVARCHAR(100)" remarks="合同类别代码"/> |
|||
<column name="CONT_STATUS_CD" type="java.sql.Types.NVARCHAR(100)" remarks="合同状态代码"/> |
|||
<column name="GUAR_WAY_CD" type="java.sql.Types.NVARCHAR(100)" remarks="担保方式"/> |
|||
<column name="TEN_CLASS_CD" type="java.sql.Types.NVARCHAR(100)" remarks="十级分类代码"/> |
|||
<column name="LOAN_DIRECTION_CD" type="java.sql.Types.NVARCHAR(100)" remarks="贷款行业投向"/> |
|||
<column name="CYCLE_FLAG" type="java.sql.Types.NVARCHAR(100)" remarks="循环标志"/> |
|||
<column name="EXPENSE_NAME" type="java.sql.Types.NVARCHAR(100)" remarks="费用名称"/> |
|||
<column name="EXPENSE_RATE" type="java.sql.Types.NUMERIC(36, 8)" remarks="实际费率"/> |
|||
<column name="MONTH_RATE" type="java.sql.Types.NUMERIC(36, 8)" remarks="月利率"/> |
|||
<column name="CONTR_OVDUE_DAYS" type="java.sql.Types.NUMERIC(36, 8)" remarks="合同逾期天数"/> |
|||
<column name="CONTR_OWEINT_DAYS" type="java.sql.Types.NUMERIC(36, 8)" remarks="合同欠息天数"/> |
|||
<column name="OVDUE_POST_REPAY_AMT" type="java.sql.Types.NUMERIC(36, 8)" remarks="折现后还款金额(违约后)"/> |
|||
<column name="OPERATE_ORG_NO" type="java.sql.Types.NVARCHAR(100)" remarks="管户机构编号"/> |
|||
<column name="OPERATOR_NO" type="java.sql.Types.NVARCHAR(100)" remarks="管户人编号"/> |
|||
<column name="IRS_LGD" type="java.sql.Types.NUMERIC(36, 8)" remarks="违约损失率"/> |
|||
<column name="IRS_EAD" type="java.sql.Types.NUMERIC(36, 4)" remarks="风险暴露"/> |
|||
<column name="IRS_OVDUE" type="java.sql.Types.NVARCHAR(100)" remarks="是否违约认定"/> |
|||
<column name="CONT_EXPENSE_FEE_LGD" type="java.sql.Types.NUMERIC(36, 8)" remarks="合同层实际LGD"/> |
|||
<column name="IRS_LGD_LEVEL" type="java.sql.Types.NVARCHAR(5)" remarks="LGD等级"/> |
|||
<column name="DY_VTL" type="java.sql.Types.NUMERIC(22, 6)" remarks="抵押VTL"/> |
|||
<column name="DBFS_VTL" type="java.sql.Types.NUMERIC(22, 6)" remarks="主要担保方式VTL"/> |
|||
<column name="NPHY_VTL" type="java.sql.Types.NUMERIC(22, 6)" remarks="内评行业VTL"/> |
|||
<column name="YPLX_VTL" type="java.sql.Types.NUMERIC(22, 6)" remarks="押品类型VTL"/> |
|||
<column name="SXFY_VTL" type="java.sql.Types.NUMERIC(22, 6)" remarks="三项费用比VTL"/> |
|||
<column name="JXJL_VTL" type="java.sql.Types.NUMERIC(22, 6)" remarks="经营活动现金流VTL"/> |
|||
<column name="YSZK_VTL" type="java.sql.Types.NUMERIC(22, 6)" remarks="应收账款增长率VTL"/> |
|||
<column name="LDBL_VTL" type="java.sql.Types.NUMERIC(22, 6)" remarks="流动性比率VTL"/> |
|||
</createTable> |
|||
<addUniqueConstraint tableName="P_IRS_CONTR_RAITNG_RESULT" columnNames="DATA_DT,CONT_NO,CUST_NO"></addUniqueConstraint> |
|||
|
|||
<!-- 重点客户清单表 --> |
|||
<createTable tableName="NS_FOCUS_CUSTOMER" remarks="重点客户清单表"> |
|||
<column name="ID_" type="java.sql.Types.NVARCHAR(50)" remarks="ID主键"> |
|||
<constraints primaryKey="true"/> |
|||
</column> |
|||
<column name="CUST_ID" type="java.sql.Types.NVARCHAR(50)" remarks="客户ID"></column> |
|||
<column name="CUST_NO" type="java.sql.Types.NVARCHAR(100)" remarks="客户编号"></column> |
|||
<column name="CUST_NAME" type="java.sql.Types.NVARCHAR(200)" remarks="客户中文名称"></column> |
|||
<column name="CUST_TYPE" type="java.sql.Types.NVARCHAR(10)" remarks="客户类别(1:一般公司客户;2:金融机构及发债企业客户)"></column> |
|||
<column name="MANAGER_CODE" type="java.sql.Types.NVARCHAR(50)" remarks="客户经理编号"></column> |
|||
<column name="MANAGER_NAME" type="java.sql.Types.NVARCHAR(50)" remarks="客户经理名称"></column> |
|||
<column name="MANAGER_ORG_CODE" type="java.sql.Types.NVARCHAR(50)" remarks="客户经理所在机构编号"></column> |
|||
<column name="MANAGER_ORG_NAME" type="java.sql.Types.NVARCHAR(200)" remarks="客户经理所在机构名称"></column> |
|||
<column name="JPA_VERSION_" type="java.sql.Types.SMALLINT" remarks="JPA乐观锁版本"></column> |
|||
<column name="DATA_COME_FROM_" type="java.sql.Types.NVARCHAR(10)" remarks="数据来源(INPUT:手工录入,IMPORT:系统自动导入)" defaultValue="INPUT"></column> |
|||
<column name="CREATOR_" type="java.sql.Types.NVARCHAR(255)" remarks="创建人"></column> |
|||
<column name="CREATE_DATE_" type="DATETIME" remarks="创建日期"></column> |
|||
<column name="LAST_MODIFIER_" type="java.sql.Types.NVARCHAR(255)" remarks="最后修改人"></column> |
|||
<column name="LAST_MODIFYDATE_" type="DATETIME" remarks="最后修改日期"></column> |
|||
<column name="CORP_CODE_" type="java.sql.Types.NVARCHAR(255)" remarks="所属法人代码" defaultValue="_PRIMARY_"> |
|||
|
|||
</column> |
|||
</createTable> |
|||
|
|||
<!-- 评级报告允许查看得分详情的审批角色 --> |
|||
<createTable tableName="NS_RATING_REPORT_SHOW_SCORE_ROLE" remarks="评级报告允许查看得分详情的审批角色"> |
|||
<column name="ID_" type="java.sql.Types.NVARCHAR(50)" remarks="ID主键"> |
|||
<constraints primaryKey="true"/> |
|||
</column> |
|||
<column name="ROLE_" type="java.sql.Types.NVARCHAR(50)" remarks="角色ID"></column> |
|||
<column name="JPA_VERSION_" type="java.sql.Types.SMALLINT" remarks="JPA乐观锁版本"></column> |
|||
<column name="DATA_COME_FROM_" type="java.sql.Types.NVARCHAR(10)" remarks="数据来源(INPUT:手工录入,IMPORT:系统自动导入)" defaultValue="INPUT"></column> |
|||
<column name="CREATOR_" type="java.sql.Types.NVARCHAR(255)" remarks="创建人"></column> |
|||
<column name="CREATE_DATE_" type="DATETIME" remarks="创建日期"></column> |
|||
<column name="LAST_MODIFIER_" type="java.sql.Types.NVARCHAR(255)" remarks="最后修改人"></column> |
|||
<column name="LAST_MODIFYDATE_" type="DATETIME" remarks="最后修改日期"></column> |
|||
<column name="CORP_CODE_" type="java.sql.Types.NVARCHAR(255)" remarks="所属法人代码" defaultValue="_PRIMARY_"> |
|||
|
|||
</column> |
|||
</createTable> |
|||
<addUniqueConstraint tableName="NS_RATING_REPORT_SHOW_SCORE_ROLE" columnNames="ROLE_"></addUniqueConstraint> |
|||
</changeSet> |
|||
</databaseChangeLog> |
@ -0,0 +1,48 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<databaseChangeLog |
|||
xmlns="http://www.liquibase.org/xml/ns/dbchangelog" |
|||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
|||
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" |
|||
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.5.xsd |
|||
http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd"> |
|||
|
|||
<changeSet id="20250714_RPT_VIEW_DDL" author="platform"> |
|||
<!-- 报表视图 --> |
|||
<createView fullDefinition="false" replaceIfExists="true" viewName="VIEW_RPT_BASE_INFO"> |
|||
SELECT |
|||
T.CUSTOMER_ID AS CUST_NO, |
|||
IFNULL(T.CUST_TYPE,'1') AS CUST_TYPE, |
|||
T.FINAL_LEVEL AS ORIGINAL_LEVEL, |
|||
T.INIT_LEVEL AS INIT_LEVEL, |
|||
T.ADJ_LEVEL AS ADJ_LEVEL, |
|||
CASE WHEN T.DEFAULT_IND = '1' THEN 'D' ELSE T.FINAL_LEVEL END AS FINAL_LEVEL, |
|||
S.PD, |
|||
CAST(DATE_FORMAT(T.EFFECTIVE_TIME,'%Y%m') AS DECIMAL) AS EFFECTIVE_MONTH, |
|||
D.ITEM_VALUE AS EFFECTIVE_Q, |
|||
LEFT(D.ITEM_VALUE,4) EFFECTIVE_Y, |
|||
IFNULL(T.MANAGER_ORG_CODE, '01002') MANAGER_ORG_CODE, |
|||
T.MODEL_CODE, |
|||
T.MODEL_NAME, |
|||
SUBSTR(IFNULL(C.INDU_SORT_CD, 'X'),1,1) AS INDUSTRY_CODE, |
|||
S.ORDER_NUM, |
|||
S1.ORDER_NUM AS INIT_ORDER_NUM, |
|||
S2.ORDER_NUM AS ADJ_ORDER_NUM, |
|||
T.MODEL_SCORE, |
|||
T.RATING_STATUS, |
|||
T.EFFECTIVE_TIME, |
|||
MAX(T.EFFECTIVE_TIME) OVER(PARTITION BY T.CUSTOMER_ID) AS MAX_EFFECTIVE_TIME, |
|||
SUM(BORR.BORR_BAL) OVER(PARTITION BY T.CUSTOMER_ID) AS BORR_BAL |
|||
FROM NS_COMPANY_RATING T |
|||
LEFT JOIN IRBS_CUST_CP_INFO C ON C.CUSTOMER_ID = T.CUSTOMER_ID |
|||
LEFT JOIN NS_CFG_MAIN_SCALE S ON S.SCALE_LEVEL = T.FINAL_LEVEL |
|||
LEFT JOIN NS_CFG_MAIN_SCALE S1 ON S1.SCALE_LEVEL = T.INIT_LEVEL |
|||
LEFT JOIN NS_CFG_MAIN_SCALE S2 ON S2.SCALE_LEVEL = T.ADJ_LEVEL |
|||
LEFT JOIN RPT_INIT_DATA D ON D.DATA_TP_CD = 'MONTH2QUARTER' |
|||
AND D.ITEM_NAME = LEFT(T.EFFECTIVE_TIME,7) |
|||
LEFT JOIN ( |
|||
select t.CUST_NO, t.BORR_BAL from irbs_loan_borr_info t |
|||
) BORR ON BORR.CUST_NO = T.CUSTOMER_ID |
|||
WHERE T.RATING_STATUS IN ('010','020','EFFECTIVE','EXPIRED') AND T.FINAL_LEVEL IS NOT NULL |
|||
</createView> |
|||
</changeSet> |
|||
</databaseChangeLog> |
After Width: | Height: | Size: 970 B |
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -0,0 +1,8 @@ |
|||
[ |
|||
/* |
|||
{ |
|||
"component": "组件名称", |
|||
"componentPath": "组件 .vue 文件路径" |
|||
} |
|||
*/ |
|||
] |
@ -1,167 +0,0 @@ |
|||
/** |
|||
* 评级等级下拉选项数组 |
|||
*/ |
|||
export const RatingLevelOptions = [ |
|||
{ label: 'AAA+', value: 'AAA+', numberValue: 15, color: 'green', denseLabel: false }, |
|||
{ label: 'AAA', value: 'AAA', numberValue: 14, color: 'green', denseLabel: false }, |
|||
{ label: 'AA+', value: 'AA+', numberValue: 13, color: 'green', denseLabel: false }, |
|||
{ label: 'AA', value: 'AA', numberValue: 12, color: 'green', denseLabel: false }, |
|||
{ label: 'AA-', value: 'AA-', numberValue: 11, color: 'green', denseLabel: false }, |
|||
{ label: 'A+', value: 'A+', numberValue: 10, color: 'green', denseLabel: false }, |
|||
{ label: 'A', value: 'A', numberValue: 9, color: 'green', denseLabel: false }, |
|||
{ label: 'A-', value: 'A-', numberValue: 8, color: 'green', denseLabel: false }, |
|||
{ label: 'BBB', value: 'BBB', numberValue: 7, color: 'green', denseLabel: false }, |
|||
{ label: 'BB', value: 'BB', numberValue: 6, color: 'red', denseLabel: false }, |
|||
{ label: 'B', value: 'B', numberValue: 5, color: 'red', denseLabel: false }, |
|||
{ label: 'CCC', value: 'CCC', numberValue: 4, color: 'red', denseLabel: false }, |
|||
{ label: 'CC', value: 'CC', numberValue: 3, color: 'red', denseLabel: false }, |
|||
{ label: 'C', value: 'C', numberValue: 2, color: 'red', denseLabel: false }, |
|||
{ label: 'D', value: 'D', numberValue: 1, color: 'red', denseLabel: false }, |
|||
]; |
|||
|
|||
/** |
|||
* 评级步骤对象 |
|||
*/ |
|||
export const RatingStep = { |
|||
CSWC: 'INIT_FINISH', // 初始化完成
|
|||
KHXX: 'CUST_INFO', // 客户信息
|
|||
DLFX: 'QUANTITATIVE', // 定量分析
|
|||
DXFX: 'QUALITATIVE_EDIT', // 定性分析
|
|||
CPJG: 'QUALITATIVE_SHOW', // 初评结果
|
|||
PJTZX: 'ADJUST_ITEM', // 评级调整项
|
|||
QSYJ: 'OTHER', // 签署意见
|
|||
PJBG: 'REPORT_INFO', // 评级报告
|
|||
}; |
|||
|
|||
/** |
|||
* 评级流程状态对象 |
|||
*/ |
|||
export const RatingProcessStatus = { |
|||
AWAIT_RATING: 'AWAIT_RATING', // 待评级
|
|||
AWAIT_SUBMIT: 'AWAIT_SUBMIT', // 待提交
|
|||
BACK: 'BACK', // 退回
|
|||
APPROVALING: 'APPROVALING', // 审批中
|
|||
PASS: 'PASS', // 通过
|
|||
NEGATIVED: 'NEGATIVED', // 否决
|
|||
END: 'END', // 已结束
|
|||
}; |
|||
|
|||
/** |
|||
* 评级流程操作 |
|||
*/ |
|||
export const RatingProcessOperationStatus = [ |
|||
{ |
|||
label: '提交', |
|||
value: '10', |
|||
}, |
|||
{ |
|||
label: '否决', |
|||
value: '20', |
|||
}, |
|||
{ |
|||
label: '退回', |
|||
value: '30', |
|||
}, |
|||
{ |
|||
label: '撤销', |
|||
value: '40', |
|||
}, |
|||
{ |
|||
label: '批准', |
|||
value: '50', |
|||
}, |
|||
{ |
|||
label: '同意', |
|||
value: '60', |
|||
}, |
|||
{ |
|||
label: '不同意', |
|||
value: '70', |
|||
}, |
|||
]; |
|||
|
|||
/** |
|||
* 评级流程操作标识 |
|||
*/ |
|||
export const RatingProcessOperation = { |
|||
// 通过
|
|||
APPROVE: 1, |
|||
// 否决
|
|||
REJECT: 2, |
|||
// 同意
|
|||
AGREE: 4, |
|||
// 不同意
|
|||
DISAGREE: 5, |
|||
// 提交下一步
|
|||
SUBMIT: 6, |
|||
// 提交到其他上级(信审会)
|
|||
UPPER_1: 8, |
|||
// 提交到上级
|
|||
UPPER: 9, |
|||
//退回起始步骤
|
|||
BACK_START: -1, |
|||
//退回到某步骤
|
|||
BACK: -2, |
|||
}; |
|||
|
|||
/** |
|||
* 违约认定流程状态对象 |
|||
*/ |
|||
export const DefaultProcessStatus = { |
|||
PASS: '03', // 通过
|
|||
}; |
|||
|
|||
/** |
|||
* 选择客户标记 |
|||
*/ |
|||
export const SelectCustomerFlag = { |
|||
RATING: 'rating', // 发起评级
|
|||
COGNIZANCE: 'cognizance', // 违约认定申请
|
|||
}; |
|||
|
|||
/** |
|||
* 财报类型对象 |
|||
*/ |
|||
export const FinanceReportType = { |
|||
QYL: '1', // 企业类
|
|||
SYL: '2', // 事业类
|
|||
}; |
|||
|
|||
/** |
|||
* 财报科目类型对象 |
|||
*/ |
|||
export const FinanceReportProjectType = { |
|||
QYLZCFZ: '01', // 企业类资产负债
|
|||
QYLXJL: '02', // 企业类现金流
|
|||
QYLSY: '03', // 企业类损益
|
|||
SYLZCFZ: '11', // 事业类资产负债
|
|||
SYLSRZC: '12', // 事业类收入支出表
|
|||
}; |
|||
|
|||
export const Round = (val: any, precision) => { |
|||
if (typeof precision !== 'number' || precision <= 0) return val; |
|||
let result = val; |
|||
if (val && typeof val === 'string') { |
|||
const patt = /^-?[0-9]+.?[0-9]*/; |
|||
if (patt.test(val)) { |
|||
result = parseFloat(val); |
|||
} |
|||
} |
|||
if (result && typeof result === 'number' && String(result).indexOf('.') > -1) { |
|||
let scale = '1'; |
|||
for (let i = 0; i < precision; i++) { |
|||
scale += 0; |
|||
} |
|||
const pre = 'e' + precision; |
|||
const post = 'e-' + precision; |
|||
return (+(Math.round(result + pre) + post)).toFixed(precision); |
|||
} |
|||
return result; |
|||
}; |
|||
|
|||
export const RatioFormat = (val) => { |
|||
if (val && typeof val === 'number') { |
|||
return Round(val * 100, 2) + '%'; |
|||
} |
|||
return val; |
|||
}; |
@ -1,218 +0,0 @@ |
|||
<template> |
|||
<div style="height: 100%"> |
|||
<w-grid |
|||
ref="companyRatingGridRef" |
|||
title="客户评级列表" |
|||
:data-url="Environment.apiContextPath('api/irbs/companyRating')" |
|||
:fetch-data-url="Environment.apiContextPath('api/irbs/companyRating/query')" |
|||
:sort-no="true" |
|||
group-mode="alone" |
|||
:checkbox-selection="false" |
|||
:query-form-cols-num="4" |
|||
:query-form-fields="companyRatingGrid.queryFormFields" |
|||
:columns="companyRatingGrid.columns" |
|||
:toolbar-actions="companyRatingGrid.buttons" |
|||
:query-criteria="{ |
|||
operator: 'and', |
|||
criteria: [ |
|||
{ |
|||
fieldName: 'triggerType', |
|||
operator: 'equals', |
|||
value: 'INDEPENDENT', |
|||
}, |
|||
{ |
|||
fieldName: 'launchUser', |
|||
operator: 'equals', |
|||
value: SessionManager.getUser().loginName, |
|||
}, |
|||
], |
|||
}" |
|||
:sort-by="['-createDate']" |
|||
></w-grid> |
|||
<LaunchRatingDialog ref="launchRatingdialogRef" :dictionary="dictionary" @refresh="refreshTable"></LaunchRatingDialog> |
|||
<RatingDialog ref="ratingdialogRef" @refresh="refreshTable"></RatingDialog> |
|||
<GrayModelDialog ref="grayDialogRef" @refresh="refreshTable"></GrayModelDialog> |
|||
</div> |
|||
</template> |
|||
|
|||
<script setup lang="ts"> |
|||
import { ref, shallowRef } from 'vue'; |
|||
import { useQuasar } from 'quasar'; |
|||
import { Environment, EnumTools, DictionaryTools, Options, Formater, axios, NotifyManager, Tools, SessionManager } from 'platform-core'; |
|||
import LaunchRatingDialog from './LaunchRatingDialog.vue'; |
|||
import RatingDialog from './RatingDialog.vue'; |
|||
import GrayModelDialog from './GrayModelDialog.vue'; |
|||
import { RatingLevelOptions, RatingProcessStatus, Round } from './CustRating.ts'; |
|||
import RatingLevel from './RatingLevel.vue'; |
|||
|
|||
const $q = useQuasar(); |
|||
const companyRatingGridRef = ref(); |
|||
const launchRatingdialogRef = ref(); |
|||
const ratingdialogRef = ref(); |
|||
const grayDialogRef = ref(); |
|||
|
|||
const RatingStatusEnum = await EnumTools.fetch('irbs.cust.rating.enums.RatingStatus'); |
|||
const RatingProcessStatusEnum = await EnumTools.fetch('irbs.cust.rating.enums.RatingProcessStatus'); |
|||
const dictCustomerTypeCd = await DictionaryTools.fetch('CustomerTypeCd'); |
|||
const optionsCustomerTypeCd = Options.dictionary(dictCustomerTypeCd); |
|||
const dictCustomerSizeCd = await DictionaryTools.fetch('CustomerSizeCd'); |
|||
const optionsCustomerSizeCd = Options.dictionary(dictCustomerSizeCd); |
|||
|
|||
const dictionary = { |
|||
dictCustomerTypeCd: dictCustomerTypeCd, |
|||
optionsCustomerTypeCd: optionsCustomerTypeCd, |
|||
dictCustomerSizeCd: dictCustomerSizeCd, |
|||
optionsCustomerSizeCd: optionsCustomerSizeCd, |
|||
}; |
|||
|
|||
const companyRatingGrid = { |
|||
buttons: [ |
|||
'query', |
|||
'reset', |
|||
'separator', |
|||
{ |
|||
extend: 'add', |
|||
label: '发起评级', |
|||
click: () => { |
|||
launchRatingdialogRef.value.show(); |
|||
}, |
|||
}, |
|||
{ |
|||
extend: 'edit', |
|||
label: '评级', |
|||
enableIf: (args) => { |
|||
if ( |
|||
args.selected && |
|||
(args.selected['processStatus'] === RatingProcessStatus.AWAIT_RATING || |
|||
args.selected['processStatus'] === RatingProcessStatus.AWAIT_SUBMIT || |
|||
args.selected['processStatus'] === RatingProcessStatus.BACK) |
|||
) { |
|||
return true; |
|||
} |
|||
return false; |
|||
}, |
|||
click: (args) => { |
|||
ratingdialogRef.value.show(args.selected); |
|||
}, |
|||
}, |
|||
// { |
|||
// extend: 'remove', |
|||
// label: '撤销', |
|||
// click: () => {}, |
|||
// }, |
|||
'separator', |
|||
{ |
|||
extend: 'view', |
|||
click: (args) => { |
|||
ratingdialogRef.value.show(args.selected, true); |
|||
}, |
|||
}, |
|||
'export', |
|||
'separator', |
|||
[ |
|||
{ |
|||
name: 'otherOp', |
|||
label: '其他操作', |
|||
icon: 'device_hub', |
|||
}, |
|||
{ |
|||
name: 'viewGray', |
|||
extend: 'view', |
|||
label: '查看灰度模型结果', |
|||
click: (args) => { |
|||
grayDialogRef.value.show(args.selected); |
|||
}, |
|||
}, |
|||
'separator', |
|||
{ |
|||
extend: 'remove', |
|||
name: 'delete', |
|||
label: '强制删除', |
|||
click: (args) => { |
|||
// args._click(); |
|||
$q.dialog({ |
|||
title: '询问', |
|||
message: '是否确认删除已生成评级信息及流程信息?', |
|||
cancel: { noCaps: true }, |
|||
ok: { noCaps: true }, |
|||
persistent: true, |
|||
}).onOk(() => { |
|||
axios |
|||
.post(Environment.apiContextPath('api/irbs/companyRating/removeRatingAndProcess/' + args.selected['id'])) |
|||
.then((resp) => { |
|||
if (resp && resp.data) { |
|||
NotifyManager.info('删除成功'); |
|||
companyRatingGridRef.value.refresh(); |
|||
} |
|||
}) |
|||
.catch((error) => { |
|||
console.info('error====', error); |
|||
NotifyManager.warn('删除失败'); |
|||
}); |
|||
}); |
|||
}, |
|||
}, |
|||
], |
|||
'separator', |
|||
], |
|||
queryFormFields: [ |
|||
{ label: '申请编号', name: 'id', type: 'w-text' }, |
|||
{ label: '客户号', name: 'custNo', type: 'w-text' }, |
|||
{ label: '客户名称', name: 'custName', type: 'w-text' }, |
|||
{ |
|||
label: '认定等级', |
|||
name: 'finalLevel', |
|||
type: 'w-select', |
|||
options: RatingLevelOptions, |
|||
}, |
|||
{ label: '流程状态', name: 'processStatus', type: 'w-select', options: Options.enum(RatingProcessStatusEnum) }, |
|||
{ label: '评级状态', name: 'ratingStatus', type: 'w-select', options: Options.enum(RatingStatusEnum) }, |
|||
], |
|||
columns: [ |
|||
{ name: 'id', label: '申请编号', align: 'center' }, |
|||
{ name: 'custNo', label: '客户号', align: 'center' }, |
|||
{ name: 'custName', label: '客户名称', width: 150 }, |
|||
{ name: 'industryTypeName', label: '行业类型' }, |
|||
{ name: 'modelScore', label: '模型得分' }, |
|||
{ name: 'modelLevel', label: '模型等级' }, |
|||
{ name: 'adjLevel', label: '调整后等级' }, |
|||
{ name: 'initLevel', label: '初评等级' }, |
|||
{ |
|||
name: 'finalLevel', |
|||
label: '认定等级', |
|||
format: (val) => { |
|||
if (!Tools.isEmpty(val)) { |
|||
return { |
|||
componentType: RatingLevel, |
|||
attrs: { |
|||
level: val, |
|||
dense: true, |
|||
}, |
|||
}; |
|||
} |
|||
return val; |
|||
}, |
|||
}, |
|||
{ |
|||
name: 'pd', |
|||
label: '违约概率', |
|||
format: (val) => { |
|||
if (val && typeof val === 'number') { |
|||
return Round(val * 100, 2) + '%'; |
|||
} |
|||
return val; |
|||
}, |
|||
}, |
|||
{ name: 'effectiveTime', label: '评级生效日', format: Formater.dateOnly() }, |
|||
{ name: 'matureTime', label: '评级失效日', format: Formater.dateOnly() }, |
|||
{ name: 'ratingStatus', label: '评级状态', format: Formater.enum(RatingStatusEnum) }, |
|||
{ name: 'launchUser', label: '发起人' }, |
|||
{ name: 'processStatus', label: '流程状态', format: Formater.enum(RatingProcessStatusEnum) }, |
|||
{ name: 'currentAssignee', label: '当前处理人' }, |
|||
], |
|||
}; |
|||
|
|||
const refreshTable = () => { |
|||
companyRatingGridRef.value.refresh(); |
|||
}; |
|||
</script> |
@ -1,5 +0,0 @@ |
|||
<template> |
|||
<div>111</div> |
|||
</template> |
|||
|
|||
<script setup lang="ts"></script> |
@ -1,5 +0,0 @@ |
|||
<template> |
|||
<div>111</div> |
|||
</template> |
|||
|
|||
<script setup lang="ts"></script> |
@ -1,349 +0,0 @@ |
|||
<template> |
|||
<w-dialog ref="dialogRef" :title="state.dialogTitle" width="80%" height="80%" body-padding="0px 0px 0px 0px" :maximized="true" :buttons="[]"> |
|||
<div> |
|||
<div class="p-[10px]"> |
|||
<span class="text-3xl text-amber-600" |
|||
>{{ state.custInfoObj['custName'] }}<q-badge v-if="state.custInfoObj['marketEnterprisesInd'] === '1'" color="red" align="top">上市</q-badge></span |
|||
> |
|||
<div class="flex pt-2"> |
|||
<div class="flex-1 text-center"> |
|||
<div>客户号</div> |
|||
<div class="text-blue-500"> |
|||
{{ state.custInfoObj['custNo'] }} |
|||
</div> |
|||
</div> |
|||
<div class="flex-1 text-center"> |
|||
<div>企业规模</div> |
|||
<div class="text-blue-500"> |
|||
{{ Formater.dictionary(dictCustomerSize)(state.custInfoObj['customerSize']) }} |
|||
</div> |
|||
</div> |
|||
<div class="flex-1 text-center"> |
|||
<div>企业类型</div> |
|||
<div class="text-blue-500"> |
|||
{{ Formater.dictionary(dictRegisteredType)(state.custInfoObj['registeredType']) }} |
|||
</div> |
|||
</div> |
|||
<div class="flex-1 text-center"> |
|||
<div>融资平台标志</div> |
|||
<div class="text-blue-500"> |
|||
{{ Formater.dictionary(dictGoverFinanceSign)(state.custInfoObj['goverFinanceSign']) }} |
|||
</div> |
|||
</div> |
|||
<div class="flex-1 text-center"> |
|||
<div>融资平台类型</div> |
|||
<div class="text-blue-500"> |
|||
{{ Formater.dictionary(dictGoverFinanceType)(state.custInfoObj['goverFinanceType']) }} |
|||
</div> |
|||
</div> |
|||
<div class="flex-1 text-center"> |
|||
<div>所在国家地区</div> |
|||
<div class="text-blue-500"> |
|||
{{ Formater.dictionary(dictNationCd)(state.custInfoObj['nation']) }} |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div class="pt-3"></div> |
|||
<div class="flex"> |
|||
<div class="flex-1 text-center"> |
|||
<div>注册所在地</div> |
|||
<div class="text-blue-500"> |
|||
{{ Formater.dictionary(dictRegistrationCd)(state.custInfoObj['registration']) }} |
|||
</div> |
|||
</div> |
|||
<div class="flex-1 text-center"> |
|||
<div>是否集团客户</div> |
|||
<div class="text-blue-500"> |
|||
{{ state.custInfoObj['groupCustInd'] === '1' ? '是' : '否' }} |
|||
</div> |
|||
</div> |
|||
<div class="flex-1 text-center"> |
|||
<div>成员类别</div> |
|||
<div class="text-blue-500"> |
|||
{{ Formater.dictionary(dictMemberTypeCd)(state.custInfoObj['memberType']) }} |
|||
</div> |
|||
</div> |
|||
<div class="flex-1 text-center"> |
|||
<div>行业类型(国标)</div> |
|||
<div class="text-blue-500"> |
|||
{{ state.custInfoObj['industryTypeName'] }} |
|||
</div> |
|||
</div> |
|||
<div class="flex-1 text-center"> |
|||
<div>成立日期</div> |
|||
<div class="text-blue-500"> |
|||
{{ state.custInfoObj['buildDate'] }} |
|||
</div> |
|||
</div> |
|||
<div class="flex-1 text-center"></div> |
|||
</div> |
|||
</div> |
|||
<q-separator /> |
|||
<div class="pt-[10px]"> |
|||
<q-card flat bordered> |
|||
<q-item dense class="pl-[8px]"> |
|||
<q-item-section> |
|||
<q-item-label>灰度模型结果</q-item-label> |
|||
</q-item-section> |
|||
</q-item> |
|||
<q-separator /> |
|||
<q-card-section class="p-[10px]"> |
|||
<div class="pt-[8px]"> |
|||
<w-info-panel :dense="state.dense" :info="state.reportCustRatingInfo" :column-num="3"></w-info-panel> |
|||
</div> |
|||
</q-card-section> |
|||
</q-card> |
|||
<div class="pt-[8px]"> |
|||
<q-list bordered class="rounded-borders"> |
|||
<q-expansion-item default-opened expand-separator icon="bubble_chart" label="得分详情"> |
|||
<q-separator /> |
|||
<q-splitter v-model="state.splitterModel"> |
|||
<template #before> |
|||
<div> |
|||
<div class="text-center"> |
|||
<q-chip outline color="orange" text-color="white" :clickable="false" :ripple="false"> 定量得分详情 </q-chip> |
|||
</div> |
|||
<q-list v-if="state.reportQuantitativeScoreDtl" padding> |
|||
<template v-for="(values, key, a) in state.reportQuantitativeScoreDtl" :key="a"> |
|||
<q-item-label header>{{ key }}</q-item-label> |
|||
|
|||
<template v-for="(dtl, index) in values" :key="index"> |
|||
<q-item> |
|||
<q-item-section> |
|||
<q-item-label>{{ dtl['INDEX_NAME'] }}</q-item-label> |
|||
<q-item-label caption> {{ Round(dtl['INDEX_VALUE'], 2) }} </q-item-label> |
|||
</q-item-section> |
|||
<q-item-section v-if="!Tools.isEmpty(dtl['INDEX_SCORE_G'])" side> |
|||
<q-chip :clickable="false" :ripple="false" color="green" text-color="white"> {{ Round(dtl['INDEX_SCORE_G'], 2) }} </q-chip> |
|||
</q-item-section> |
|||
</q-item> |
|||
</template> |
|||
<q-separator /> |
|||
</template> |
|||
</q-list> |
|||
</div> |
|||
</template> |
|||
|
|||
<template #after> |
|||
<q-splitter v-model="state.afterSplitterModel"> |
|||
<template #before> |
|||
<div> |
|||
<div class="text-center"> |
|||
<q-chip outline color="light-blue" text-color="white" :clickable="false" :ripple="false"> 定性得分详情 </q-chip> |
|||
</div> |
|||
<q-list v-if="state.reportQualitativeScoreDtl" padding> |
|||
<template v-for="(values, key, a) in state.reportQualitativeScoreDtl" :key="a"> |
|||
<q-item-label header>{{ key }}</q-item-label> |
|||
|
|||
<template v-for="(dtl, index) in values" :key="index"> |
|||
<q-item> |
|||
<q-item-section> |
|||
<q-item-label>{{ dtl['INDEX_NAME'] }}</q-item-label> |
|||
<q-item-label caption> {{ dtl['TEXT'] }} </q-item-label> |
|||
</q-item-section> |
|||
<q-item-section v-if="!Tools.isEmpty(dtl['INDEX_SCORE_G'])" side> |
|||
<q-chip :clickable="false" :ripple="false" color="green" text-color="white"> {{ Round(dtl['INDEX_SCORE_G'], 2) }} </q-chip> |
|||
</q-item-section> |
|||
</q-item> |
|||
</template> |
|||
<q-separator /> |
|||
</template> |
|||
</q-list> |
|||
</div> |
|||
</template> |
|||
|
|||
<template #after> |
|||
<div> |
|||
<div class="text-center"> |
|||
<q-chip outline color="lime" text-color="white" :clickable="false" :ripple="false"> 评级调整项详情 </q-chip> |
|||
</div> |
|||
<q-list v-if="state.reportAdjustScoreDtl" padding> |
|||
<template v-for="(values, key, a) in state.reportAdjustScoreDtl" :key="a"> |
|||
<q-item-label header>{{ key }}</q-item-label> |
|||
|
|||
<template v-for="(dtl, index) in values" :key="index"> |
|||
<q-item> |
|||
<q-item-section> |
|||
<q-item-label>{{ dtl['INDEX_NAME'] }}</q-item-label> |
|||
<q-item-label caption> {{ dtl['TEXT'] }} </q-item-label> |
|||
</q-item-section> |
|||
</q-item> |
|||
</template> |
|||
<q-separator /> |
|||
</template> |
|||
</q-list> |
|||
</div> |
|||
</template> |
|||
</q-splitter> |
|||
</template> |
|||
</q-splitter> |
|||
</q-expansion-item> |
|||
</q-list> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</w-dialog> |
|||
</template> |
|||
|
|||
<script setup lang="ts"> |
|||
import { DictionaryTools, Environment, Formater, axios, Tools } from 'platform-core'; |
|||
import { nextTick, reactive, ref } from 'vue'; |
|||
import { RatingStep, Round } from './CustRating.ts'; |
|||
import RatingLevel from './RatingLevel.vue'; |
|||
|
|||
const dialogRef = ref(); |
|||
|
|||
const state = reactive({ |
|||
splitterModel: 30, |
|||
afterSplitterModel: 50, |
|||
rating: {}, |
|||
dialogTitle: '灰度模型结果', |
|||
dense: false, |
|||
custInfoObj: {}, |
|||
reportCustRatingInfo: <any>[], |
|||
reportQuantitativeScoreDtl: <any>null, |
|||
reportQualitativeScoreDtl: <any>null, |
|||
reportAdjustScoreDtl: <any>null, |
|||
}); |
|||
|
|||
// 加载客户信息 |
|||
const loadCustInfo = async () => { |
|||
// 加载客户基本信息 |
|||
let customerType = ''; |
|||
await axios.get(Environment.apiContextPath('api/irbs/ratingCompanyCustomer/' + state.rating['custId'])).then((resp) => { |
|||
if (resp && resp.data) { |
|||
customerType = resp.data['customerType']; |
|||
state.custInfoObj = {}; |
|||
state.custInfoObj['custNo'] = resp.data['custNo']; |
|||
state.custInfoObj['custName'] = resp.data['custName']; |
|||
state.custInfoObj['certificateType'] = resp.data['certificateType']; |
|||
state.custInfoObj['certificateNum'] = resp.data['certificateNum']; |
|||
state.custInfoObj['customerType'] = resp.data['customerType']; |
|||
state.custInfoObj['customerSize'] = resp.data['customerSize']; |
|||
state.custInfoObj['registeredType'] = resp.data['registeredType']; |
|||
state.custInfoObj['goverFinanceSign'] = resp.data['goverFinanceSign']; |
|||
state.custInfoObj['goverFinanceType'] = resp.data['goverFinanceType']; |
|||
state.custInfoObj['registration'] = resp.data['registration']; |
|||
state.custInfoObj['nation'] = resp.data['nation']; |
|||
state.custInfoObj['memberType'] = resp.data['memberType']; |
|||
state.custInfoObj['groupCustInd'] = resp.data['groupCustInd']; |
|||
state.custInfoObj['marketEnterprisesInd'] = resp.data['marketEnterprisesInd']; |
|||
state.custInfoObj['industryType'] = resp.data['industryType']; |
|||
state.custInfoObj['industryTypeName'] = resp.data['industryTypeName']; |
|||
state.custInfoObj['buildDate'] = resp.data['buildDate']; |
|||
state.custInfoObj['customerManagerNo'] = resp.data['customerManagerNo']; |
|||
state.custInfoObj['customerManagerName'] = resp.data['customerManagerName']; |
|||
state.custInfoObj['handleOrgId'] = resp.data['handleOrgId']; |
|||
state.custInfoObj['handleTime'] = resp.data['handleTime']; |
|||
} |
|||
}); |
|||
}; |
|||
|
|||
const groupByProperties = (list, propName) => { |
|||
const map = {}; |
|||
list.forEach((item, index, arr) => { |
|||
if (!map[item[propName]]) { |
|||
map[item[propName]] = arr.filter((a) => a[propName] == item[propName]); |
|||
} |
|||
}); |
|||
return map; |
|||
}; |
|||
|
|||
const loadRatingReport = async () => { |
|||
// 加载评级信息 |
|||
state.reportCustRatingInfo = []; |
|||
await axios |
|||
.get(Environment.apiContextPath('api/irbs/companyRating/stepRatingReport'), { params: { ratingId: state.rating['id'] } }) |
|||
.then((resp) => { |
|||
if (resp && resp.data) { |
|||
state.rating = resp.data; |
|||
state.reportCustRatingInfo.push({ label: '模型名称', value: resp.data.modelNameGray }); |
|||
state.reportCustRatingInfo.push({ label: '定量得分', value: Round(resp.data.quanScoreGray, 2) }); |
|||
state.reportCustRatingInfo.push({ label: '定性得分', value: Round(resp.data.qualScoreGray, 2) }); |
|||
state.reportCustRatingInfo.push({ label: '模型得分', value: Round(resp.data.modelScoreGray, 2) }); |
|||
state.reportCustRatingInfo.push({ |
|||
label: '模型级别', |
|||
value: resp.data.modelLevelGray, |
|||
format: () => { |
|||
return { |
|||
componentType: RatingLevel, |
|||
attrs: { |
|||
level: resp.data.modelLevelGray, |
|||
dense: true, |
|||
}, |
|||
}; |
|||
}, |
|||
}); |
|||
state.reportCustRatingInfo.push({ |
|||
label: '调整项级别', |
|||
value: resp.data.adjLevelGray, |
|||
format: () => { |
|||
return { |
|||
componentType: RatingLevel, |
|||
attrs: { |
|||
level: resp.data.adjLevelGray, |
|||
dense: true, |
|||
}, |
|||
}; |
|||
}, |
|||
}); |
|||
} |
|||
}) |
|||
.catch((error) => { |
|||
console.info('error====', error); |
|||
}); |
|||
// 加载得分详情 |
|||
const urlSearchParams = new URLSearchParams({ sortBy: ['INDEX_TYPE', 'INDEX_CATEGORY'] }); |
|||
urlSearchParams.append('pageable', 'false'); |
|||
const criteria = { |
|||
fieldName: 'RATING_ID', |
|||
operator: 'equals', |
|||
value: state.rating['id'], |
|||
}; |
|||
urlSearchParams.append('criteria', JSON.stringify(criteria)); |
|||
await axios |
|||
.get(Environment.apiContextPath('api/irbs/ratingIndex/getGrayScoreDetail'), { params: urlSearchParams }) |
|||
.then((resp) => { |
|||
if (resp?.data?.content) { |
|||
const groupMap = groupByProperties(resp.data.content, 'INDEX_TYPE'); |
|||
state.reportQuantitativeScoreDtl = groupByProperties(groupMap[RatingStep.DLFX], 'INDEX_CATEGORY'); |
|||
state.reportQualitativeScoreDtl = groupByProperties(groupMap[RatingStep.DXFX], 'INDEX_CATEGORY'); |
|||
state.reportAdjustScoreDtl = groupByProperties( |
|||
groupMap[RatingStep.PJTZX].filter((item) => { |
|||
return item['INDEX_VALUE'] !== '0'; |
|||
}), |
|||
'INDEX_CATEGORY', |
|||
); |
|||
} |
|||
}) |
|||
.catch((error) => { |
|||
console.info('error====', error); |
|||
}); |
|||
}; |
|||
|
|||
const show = async (data: any) => { |
|||
dialogRef.value.show(); |
|||
state.rating = data; |
|||
state.dialogTitle = `公司客户灰度评级结果(客户:` + data['custName'] + `)`; |
|||
loadCustInfo(); |
|||
await loadRatingReport(); |
|||
}; |
|||
const hide = () => { |
|||
dialogRef.value.hide(); |
|||
}; |
|||
|
|||
defineExpose({ |
|||
show, |
|||
hide, |
|||
}); |
|||
|
|||
const dictCustomerSize = await DictionaryTools.fetch('CustomerSizeCd'); |
|||
const dictRegisteredType = await DictionaryTools.fetch('REGISTERED_TYPE'); |
|||
const dictGoverFinanceType = await DictionaryTools.fetch('GOVER_FINANCE_TYPE'); |
|||
const dictGoverFinanceSign = await DictionaryTools.fetch('GOVER_FINANCE_SIGN'); |
|||
const dictRegistrationCd = await DictionaryTools.fetch('REGISTRATION_CD'); |
|||
const dictNationCd = await DictionaryTools.fetch('NATION_CD'); |
|||
const dictMemberTypeCd = await DictionaryTools.fetch('MEMBER_TYPE_CD'); |
|||
</script> |
|||
|
|||
<style scoped lang="css"></style> |
@ -1,186 +0,0 @@ |
|||
<template> |
|||
<w-dialog ref="dialogRef" :title="state.dialogTitle" width="80%" height="80%" :buttons="dialogButtons"> |
|||
<w-grid |
|||
ref="customerGridRef" |
|||
title="客户列表" |
|||
:fetch-data-url="Environment.apiContextPath('api/irbs/companyCustomer/query')" |
|||
:sort-no="true" |
|||
:checkbox-selection="false" |
|||
:config-button="false" |
|||
:query-form-cols-num="3" |
|||
:query-form-fields="customerGrid.queryFormFields" |
|||
:columns="customerGrid.columns" |
|||
:toolbar-actions="customerGrid.buttons" |
|||
:sort-by="['-lastModifyDate']" |
|||
:query-criteria="{ |
|||
fieldName: 'mgerNo', |
|||
operator: 'equals', |
|||
value: SessionManager.getUser().loginName, |
|||
}" |
|||
></w-grid> |
|||
</w-dialog> |
|||
</template> |
|||
|
|||
<script setup lang="ts"> |
|||
import { ref, reactive } from 'vue'; |
|||
import { useQuasar } from 'quasar'; |
|||
import { useI18n } from 'vue-i18n'; |
|||
import { axios, noErrorAxios, Environment, NotifyManager, Formater, Tools, SessionManager } from 'platform-core'; |
|||
import { SelectCustomerFlag } from './CustRating.ts'; |
|||
|
|||
const { t } = useI18n(); |
|||
const $q = useQuasar(); |
|||
const dialogRef = ref(); |
|||
const customerGridRef = ref(); |
|||
const props = defineProps({ |
|||
dictionary: { |
|||
type: Object, |
|||
default: () => { |
|||
return {}; |
|||
}, |
|||
}, |
|||
}); |
|||
const emit = defineEmits(['refresh']); |
|||
|
|||
const state = reactive({ |
|||
dialogTitle: '选择客户', |
|||
flag: SelectCustomerFlag.RATING, // 发起评级或发起违约认定标记 |
|||
}); |
|||
|
|||
const generateRating = (rows) => { |
|||
showLoading(); |
|||
const requestParams = { |
|||
method: 'POST', |
|||
headers: { 'content-type': 'application/json;charset=utf-8;' }, |
|||
url: Environment.apiContextPath('api/irbs/companyRating/generateRating/' + rows[0]['custNo']), |
|||
}; |
|||
noErrorAxios(requestParams) |
|||
.then((resp) => { |
|||
hideLoading(); |
|||
emit('refresh'); |
|||
dialogRef.value.hide(); |
|||
NotifyManager.info('发起成功'); |
|||
}) |
|||
.catch((error) => { |
|||
const response = error?.response; |
|||
const status = response?.status; |
|||
const data = response?.data; |
|||
//其他错误 |
|||
if (status === 500 && data.exception === 'java.lang.RuntimeException' && !Tools.isEmpty(data.errorMessage)) { |
|||
NotifyManager.error(data.errorMessage); |
|||
} else if (status === 500) { |
|||
NotifyManager.error(t(data?.errorMessageI18nKey)); |
|||
} else { |
|||
NotifyManager.error(t(status)); |
|||
} |
|||
}); |
|||
}; |
|||
|
|||
const dialogButtons = [ |
|||
{ |
|||
label: '确定', |
|||
icon: 'beenhere', |
|||
click: async () => { |
|||
const rows = customerGridRef.value.getSelectedRows(); |
|||
if (rows.length === 0) { |
|||
NotifyManager.warn('请选择客户'); |
|||
return; |
|||
} |
|||
if (state.flag === SelectCustomerFlag.RATING) { |
|||
// 判断客户是否已达当月评级次数上限 |
|||
const monthLimit = await axios.post(Environment.apiContextPath('api/irbs/companyRating/getMonthRatingLimit/' + rows[0]['custNo'])); |
|||
console.info('monthLimit====', monthLimit); |
|||
if (monthLimit?.data?.result === true && monthLimit?.data?.tactics === '1') { |
|||
NotifyManager.warn('该客户当月已达评级次数上限(' + monthLimit?.data?.num + '次),无法再次发起评级'); |
|||
return; |
|||
} else if (monthLimit?.data?.result === true && monthLimit?.data?.tactics === '2') { |
|||
$q.dialog({ |
|||
title: '询问', |
|||
message: '该客户当月已发起评级次数超过:' + monthLimit?.data?.num + '次,是否继续发起?', |
|||
cancel: { noCaps: true }, |
|||
ok: { noCaps: true }, |
|||
persistent: true, |
|||
}).onOk(() => { |
|||
generateRating(rows); |
|||
}); |
|||
} else { |
|||
generateRating(rows); |
|||
} |
|||
} else if (state.flag === SelectCustomerFlag.COGNIZANCE) { |
|||
// 查询是否有在途流程 |
|||
const resp = await axios |
|||
.get(Environment.apiContextPath('api/irbs/defaultCognizance/queryDefaCustNo'), { params: { custNo: rows[0]['custNo'] } }) |
|||
.catch((error) => { |
|||
console.info('error-------------', error); |
|||
}); |
|||
if (resp && resp.data === '1') { |
|||
NotifyManager.warn('当前客户存在进行中违约认定流程'); |
|||
return; |
|||
} else if (resp && resp.data === '2') { |
|||
NotifyManager.warn('当前客户存在已人工认定违约认定结果,无法发起新的人工违约认定流程'); |
|||
return; |
|||
} else if (resp && resp.data === '0') { |
|||
// 发起 |
|||
showLoading(); |
|||
axios |
|||
.post(Environment.apiContextPath('api/irbs/defaultManager/cognizanceApply'), { custNo: rows[0]['custNo'], type: 'F' }) |
|||
.then((resp) => { |
|||
hideLoading(); |
|||
if (resp && resp['code'] === 200 && resp['data']) { |
|||
emit('refresh'); |
|||
dialogRef.value.hide(); |
|||
} |
|||
}) |
|||
.catch((error) => { |
|||
hideLoading(); |
|||
console.info('error-------------', error); |
|||
}); |
|||
} |
|||
} |
|||
}, |
|||
}, |
|||
]; |
|||
|
|||
const customerGrid = { |
|||
queryFormFields: [ |
|||
{ label: '客户号', name: 'custNo', type: 'w-text' }, //defaultValue: '2100601306' |
|||
{ label: '客户名称', name: 'custName', type: 'w-text' }, |
|||
{ label: '企业规模', name: 'corpSizeCd', type: 'w-select', options: props.dictionary.optionsCustomerSizeCd }, |
|||
], |
|||
buttons: ['query', 'reset'], |
|||
columns: [ |
|||
{ name: 'custNo', label: '客户号' }, |
|||
{ name: 'custName', label: '客户名称' }, |
|||
{ name: 'induSortName', label: '行业类型' }, |
|||
{ name: 'custTypeCd', label: '客户类型', format: Formater.dictionary(props.dictionary.dictCustomerTypeCd) }, |
|||
{ name: 'buildDt', label: '成立时间' }, |
|||
{ name: 'corpSizeCd', label: '企业规模', format: Formater.dictionary(props.dictionary.dictCustomerSizeCd) }, |
|||
], |
|||
}; |
|||
|
|||
const show = (flag) => { |
|||
if (flag) { |
|||
state.flag = flag; |
|||
} |
|||
dialogRef.value.show(); |
|||
}; |
|||
const hide = () => { |
|||
dialogRef.value.hide(); |
|||
}; |
|||
|
|||
const showLoading = (msg: string = '正在处理,请稍等...') => { |
|||
$q.loading.show({ |
|||
message: msg, |
|||
boxClass: 'bg-grey-2 text-grey-9', |
|||
spinnerColor: 'primary', |
|||
}); |
|||
}; |
|||
const hideLoading = () => { |
|||
$q.loading.hide(); |
|||
}; |
|||
|
|||
defineExpose({ |
|||
show, |
|||
hide, |
|||
}); |
|||
</script> |
File diff suppressed because it is too large
@ -1,31 +0,0 @@ |
|||
<template> |
|||
<div> |
|||
<q-knob v-model="value" :min="1" :max="10" readonly show-value :size="size" :color="color" track-color="grey-3" v-bind="attrs"> |
|||
<span>{{ props.level }}</span> |
|||
</q-knob> |
|||
</div> |
|||
</template> |
|||
|
|||
<script setup lang="ts"> |
|||
import { ref, useAttrs } from 'vue'; |
|||
import { RatingLevelOptions } from './CustRating.ts'; |
|||
|
|||
const attrs = useAttrs(); |
|||
const props = defineProps({ |
|||
level: { type: String, default: '' }, |
|||
size: { type: String, default: 'md' }, |
|||
}); |
|||
|
|||
const value = ref(0); |
|||
const color = ref('teal'); |
|||
|
|||
const ratingLevel = RatingLevelOptions.find((item) => { |
|||
return item['value'] === props.level; |
|||
}); |
|||
if (ratingLevel) { |
|||
value.value = ratingLevel.numberValue; |
|||
color.value = ratingLevel.color; |
|||
} |
|||
</script> |
|||
|
|||
<style scoped lang="css"></style> |
@ -1,69 +0,0 @@ |
|||
<template> |
|||
<div> |
|||
<q-btn |
|||
v-if="showComputed" |
|||
icon="mark_chat_unread" |
|||
color="primary" |
|||
label="批注" |
|||
@click=" |
|||
() => { |
|||
addAnnotationRef.show(); |
|||
} |
|||
" |
|||
/> |
|||
<w-drawer ref="addAnnotationRef" title="批注"> |
|||
<div class="p-2 h-full"> |
|||
<w-splitter :size="205" horizontal unit="px" disable :show-separator="false"> |
|||
<template #before> |
|||
<w-form ref="formRef" :cols-num="1" :fields="[{ label: '批注内容', name: 'annotation', type: 'w-textarea' }]"></w-form> |
|||
<br /> |
|||
<q-btn |
|||
icon="add" |
|||
color="primary" |
|||
label="添加" |
|||
@click=" |
|||
() => { |
|||
annotationGridRef.addLocalData({ nr: formRef.getData()['annotation'], sj: currDate() }); |
|||
} |
|||
" |
|||
/> |
|||
</template> |
|||
<template #after> |
|||
<div class="h-full"> |
|||
<w-grid |
|||
ref="annotationGridRef" |
|||
:auto-fetch-data="false" |
|||
:config-button="false" |
|||
:toolbar-actions="['refresh', 'remove']" |
|||
:columns="[ |
|||
{ label: '批注内容', name: 'nr' }, |
|||
{ label: '批注时间', name: 'sj', width: 200 }, |
|||
]" |
|||
> |
|||
</w-grid> |
|||
</div> |
|||
</template> |
|||
</w-splitter> |
|||
</div> |
|||
</w-drawer> |
|||
</div> |
|||
</template> |
|||
<script setup lang="ts"> |
|||
import { ref, inject, computed } from 'vue'; |
|||
import { Rating } from './ts/Rating'; |
|||
import { Step } from './ts/Step'; |
|||
import { Constant } from './ts/Constant'; |
|||
|
|||
const rating = <Rating>inject('rating'); |
|||
const addAnnotationRef = ref(); |
|||
const annotationGridRef = ref(); |
|||
const formRef = ref(); |
|||
const currDate = () => { |
|||
const now = new Date(); |
|||
const formattedTime = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')} ${String(now.getHours()).padStart(2, '0')}:${String(now.getMinutes()).padStart(2, '0')}:${String(now.getSeconds()).padStart(2, '0')}`; |
|||
return formattedTime; |
|||
}; |
|||
const showComputed = computed(() => { |
|||
return true; |
|||
}); |
|||
</script> |
@ -0,0 +1,33 @@ |
|||
<template> |
|||
<w-dialog ref="dialogRef" :title="state.dialogTitle" width="80%" height="80%" body-padding="0px 0px 0px 0px" :maximized="true" :buttons="[]"> 1111 </w-dialog> |
|||
</template> |
|||
|
|||
<script setup lang="ts"> |
|||
import { reactive, ref } from 'vue'; |
|||
|
|||
const dialogRef = ref(); |
|||
const state = reactive({ |
|||
splitterModel: 30, |
|||
afterSplitterModel: 50, |
|||
rating: {}, |
|||
dialogTitle: '灰度模型结果', |
|||
dense: false, |
|||
custInfoObj: {}, |
|||
reportCustRatingInfo: <any>[], |
|||
reportQuantitativeScoreDtl: <any>null, |
|||
reportQualitativeScoreDtl: <any>null, |
|||
reportAdjustScoreDtl: <any>null, |
|||
}); |
|||
|
|||
const show = async (data: any) => { |
|||
dialogRef.value.show(); |
|||
}; |
|||
const hide = () => { |
|||
dialogRef.value.hide(); |
|||
}; |
|||
|
|||
defineExpose({ |
|||
show, |
|||
hide, |
|||
}); |
|||
</script> |
@ -1,58 +0,0 @@ |
|||
<template> |
|||
<w-splitter :size="75" class="h-full" unit="px" disable> |
|||
<template #before> |
|||
<div class="h-full" style="display: flex; align-items: center"> |
|||
<q-tabs |
|||
v-model="rating.step.currStep.value" |
|||
vertical |
|||
indicator-color="amber" |
|||
active-color="amber" |
|||
align="left" |
|||
:dense="rating.cm.isAwaitSubmitProcessStatus.value" |
|||
style="height: auto" |
|||
@update:model-value="rating.step.click" |
|||
> |
|||
<template v-for="(step, index) in rating.step.steps.value" :key="step.value"> |
|||
<q-tab :name="step.value" :icon="step.icon" :label="step.label" :disable="step.disable" style="padding: 2px"> |
|||
<q-tooltip v-if="rating.cm.isAwaitSubmitProcessStatus.value" transition-show="rotate" transition-hide="rotate">{{ step.tooltip }}</q-tooltip> |
|||
</q-tab> |
|||
<div v-if="index !== rating.step.steps.value.length - 1 && rating.cm.isAwaitSubmitProcessStatus.value" style="width: 100%; text-align: center"> |
|||
<q-icon name="bi-arrow-down-short" size="sm"></q-icon> |
|||
</div> |
|||
</template> |
|||
</q-tabs> |
|||
</div> |
|||
</template> |
|||
<template #after> |
|||
<!-- 切分窗口 --> |
|||
<w-splitter v-if="!rating.cm.isAwaitSubmitProcessStatus.value" :size="77" :separator-color="rating.separatorColor" class="h-full"> |
|||
<template #before> |
|||
<q-tab-panels v-model="rating.step.currStep.value" class="p-0 h-full"> |
|||
<q-tab-panel v-for="step in rating.step.steps.value" :key="step.value" :name="step.value" class="p-0 h-full"> |
|||
<Content :step="step"></Content> |
|||
</q-tab-panel> |
|||
</q-tab-panels> |
|||
</template> |
|||
<template #after> |
|||
<Opinion></Opinion> |
|||
</template> |
|||
</w-splitter> |
|||
<!-- 不切分 --> |
|||
<q-tab-panels v-else v-model="rating.step.currStep.value" class="p-0 h-full"> |
|||
<q-tab-panel v-for="step in rating.step.steps.value" :key="step.value" :name="step.value" class="p-0 h-full"> |
|||
<Content :step="step"></Content> |
|||
</q-tab-panel> |
|||
</q-tab-panels> |
|||
</template> |
|||
</w-splitter> |
|||
</template> |
|||
|
|||
<script setup lang="ts"> |
|||
import { inject, ref, onMounted } from 'vue'; |
|||
import { Rating } from './ts/Rating'; |
|||
import Content from './Content.vue'; |
|||
import { Constant } from './ts/Constant'; |
|||
import Opinion from './content/Opinion.vue'; |
|||
|
|||
const rating = <Rating>inject('rating'); |
|||
</script> |
@ -1,48 +0,0 @@ |
|||
<template> |
|||
<w-workflow-action |
|||
v-if="showComputed" |
|||
:task-id="rating.ratingData.value['taskId']" |
|||
:data="rating.opinionData.value" |
|||
:default-submit-button="false" |
|||
:action-url="Environment.apiContextPath('/api/irbs/companyRatingProcess/submit')" |
|||
@before-submit=" |
|||
async (action, callback) => { |
|||
rating.opinionData.value = { |
|||
transientVariables: { |
|||
opaVal: action.transientVariables.goback, |
|||
desc: '客户名称:' + rating.ratingData.value['custName'], |
|||
}, |
|||
data: rating.refs.overturnFormRefFunction().getData(), |
|||
}; |
|||
const validateResult = await rating.refs.overturnFormRefFunction().validate(); |
|||
if (validateResult) { |
|||
callback(true); |
|||
} else { |
|||
callback(false); |
|||
} |
|||
} |
|||
" |
|||
@after-submit=" |
|||
() => { |
|||
rating.instance.emit('afterComplete'); |
|||
} |
|||
" |
|||
> |
|||
</w-workflow-action> |
|||
</template> |
|||
<script setup lang="ts"> |
|||
import { inject, computed } from 'vue'; |
|||
import { Environment } from 'platform-core'; |
|||
import { Rating } from './ts/Rating'; |
|||
import { Step } from './ts/Step'; |
|||
|
|||
const rating = <Rating>inject('rating'); |
|||
const showComputed = computed(() => { |
|||
if (rating.cm.isAwaitSubmitProcessStatus.value) { |
|||
return rating.step.currStep.value === Step.type.opinion.value; |
|||
} else if (rating.ratingData.value['taskId']) { |
|||
return true; |
|||
} |
|||
return false; |
|||
}); |
|||
</script> |
@ -0,0 +1,42 @@ |
|||
<template> |
|||
<span class="text-3xl"> |
|||
{{ custInfoData['custName'] }} |
|||
<q-badge color="orange" align="top">客户号:{{ custInfoData['custNo'] }}</q-badge |
|||
> <q-badge color="green" align="top">上市</q-badge> |
|||
<q-badge color="red" align="top">{{ Formater.dictionary(dictionary.customerSize)(custInfoData['customerSize']) }}</q-badge |
|||
> <q-badge align="top">{{ Formater.dictionary(dictionary.registeredType)(custInfoData['registeredType']) }}</q-badge |
|||
> <q-badge color="secondary" align="top">{{ custInfoData['groupCustInd'] === '1' ? '集团客户' : '非集团客户' }}</q-badge |
|||
> |
|||
<q-badge v-if="custInfoData['groupCustInd'] === '1'" align="top" |
|||
>集团成员类别:{{ Formater.dictionary(dictionary.memberTypeCd)(custInfoData['memberType']) }}</q-badge |
|||
><template v-if="custInfoData['groupCustInd'] === '1'"> </template> |
|||
<q-badge color="blue" align="top">行业:{{ custInfoData['industryTypeName'] }}</q-badge |
|||
> <q-badge color="brown" align="top">成立日期:{{ custInfoData['buildDate'] }}</q-badge |
|||
> |
|||
</span> |
|||
</template> |
|||
<script setup lang="ts"> |
|||
import { ref, onMounted } from 'vue'; |
|||
import { Formater, axios, Environment } from 'platform-core'; |
|||
import { Dictionary } from '@/views/custRating/company/ts/Dictionary'; |
|||
|
|||
const props = defineProps({ |
|||
custId: { type: String, default: '' }, |
|||
}); |
|||
const custInfoData = ref({}); |
|||
const dictionary = new Dictionary(); |
|||
|
|||
const loadCustInfo = () => { |
|||
axios.get(Environment.apiContextPath('api/irbs/ratingCompanyCustomer/' + props.custId)).then((resp) => { |
|||
if (resp && resp.data) { |
|||
custInfoData.value = resp.data; |
|||
} |
|||
}); |
|||
}; |
|||
|
|||
onMounted(() => { |
|||
loadCustInfo(); |
|||
}); |
|||
|
|||
await dictionary.load(); |
|||
</script> |
@ -0,0 +1,11 @@ |
|||
<template> |
|||
<q-icon name="bookmark" size="xs" class="qav-icon" color="orange"></q-icon> |
|||
</template> |
|||
<style lang="css"> |
|||
.qav-icon { |
|||
position: relative; |
|||
top: -7px; |
|||
right: -2px; |
|||
cursor: inherit; |
|||
} |
|||
</style> |
@ -0,0 +1,162 @@ |
|||
<template> |
|||
<w-splitter :model-value="titleSplitterModel" horizontal unit="px" disable class="h-full"> |
|||
<template #before> |
|||
<w-card-panel :bordered="false" :title-mode="true" icon="scatter_plot" :icon-attrs="{ color: 'green' }" color="green"> |
|||
<template #label> |
|||
<div class="flex justify-between"> |
|||
<div> |
|||
定性分析<q-badge v-if="existsWaitSelectComputed" color="red" floating transparent class="qa-badge">{{ |
|||
rating.waitSelectFields.value.length |
|||
}}</q-badge> |
|||
</div> |
|||
<q-toggle |
|||
v-if="qaMode || allowHideOptions" |
|||
v-model="showOptionsModel" |
|||
color="blue" |
|||
dense |
|||
size="40px" |
|||
icon="hdr_auto" |
|||
label="显示全部选项" |
|||
@update:model-value="toggleUpdate" |
|||
/> |
|||
</div> |
|||
</template> |
|||
</w-card-panel> |
|||
</template> |
|||
<template #after> |
|||
<w-form ref="qualitativeFormRef" :fields="qualFormFieldsComputed" :cols-num="1" :y-gap="10" class="pl-1 py-1" @update-value="formUpdateValue"></w-form> |
|||
</template> |
|||
</w-splitter> |
|||
</template> |
|||
<script setup lang="ts"> |
|||
import { inject, ref, computed, shallowRef } from 'vue'; |
|||
import { Rating } from '@/views/custRating/company/ts/Rating'; |
|||
import QualAddtionView from '@/views/custRating/company/components/QualAddtionView.vue'; |
|||
|
|||
const QualAddtionViewShallowRef = shallowRef(QualAddtionView); |
|||
const qualitativeFormRef = ref(); |
|||
const rating = <Rating>inject('rating'); |
|||
const titleSplitterModel = ref(34); |
|||
const getQualitativeFormRef = () => { |
|||
return qualitativeFormRef.value; |
|||
}; |
|||
rating.refs.setQualitativeFormRefFunction(getQualitativeFormRef); |
|||
|
|||
const props = defineProps({ |
|||
// 只读(只允许看,不允许选择) |
|||
readOnly: { type: Boolean, default: false }, |
|||
// 问卷模式(该模式下,定性指标默认一个一个填写,会高亮当前选项,同时隐藏其他指标选项) |
|||
qaMode: { type: Boolean, default: false }, |
|||
// 允许隐藏选项(该属性与`qaMode`互斥,`qaMode`启用后忽略该属性的配置,只有当`qaMode`关闭时,该属性才可生效) |
|||
allowHideOptions: { type: Boolean, default: true }, |
|||
// 默认显示所有选项(该属性用来控制属性默认是否全部显示,只有`allowHideOptions`启用时才可生效) |
|||
defaultShowOptions: { type: Boolean, default: false }, |
|||
}); |
|||
const showOptionsModel = ref(props.defaultShowOptions); |
|||
|
|||
const existsWaitSelectComputed = computed(() => { |
|||
return rating.waitSelectFields.value.length > 0 && !props.readOnly; |
|||
}); |
|||
const qualFormFieldsComputed = computed(() => { |
|||
if (props.qaMode) { |
|||
let targetName = ''; |
|||
if (rating.qualFormData.value && rating.waitSelectFields.value && rating.waitSelectFields.value[0]) { |
|||
targetName = rating.waitSelectFields.value[0]['field']['name']; |
|||
} |
|||
rating.qualFormData.value.forEach((item: any) => { |
|||
qaModeRecursiveHandle(item, targetName); |
|||
}); |
|||
} else if (props.allowHideOptions) { |
|||
rating.qualFormData.value.forEach((item: any) => { |
|||
recursiveHandle(item); |
|||
}); |
|||
} |
|||
if (props.readOnly) { |
|||
rating.qualFormData.value.forEach((item: any) => { |
|||
readOnlyRecursiveHandle(item); |
|||
}); |
|||
} |
|||
return rating.qualFormData.value; |
|||
}); |
|||
|
|||
const qaModeRecursiveHandle = (obj: any, targetName: string) => { |
|||
if (obj.type === 'w-ext-radio') { |
|||
obj.lightNotHideOptionsLabel = true; |
|||
if (obj.name === targetName) { |
|||
obj.hideOptions = false; |
|||
} else { |
|||
obj.hideOptions = true; |
|||
} |
|||
return; |
|||
} |
|||
|
|||
if (Array.isArray(obj.fields)) { |
|||
obj.fields.forEach((field) => qaModeRecursiveHandle(field, targetName)); |
|||
} |
|||
}; |
|||
const recursiveHandle = (obj: any) => { |
|||
if (obj.type === 'w-ext-radio') { |
|||
obj.hideOptions = true; |
|||
if (props.defaultShowOptions) { |
|||
if (qualitativeFormRef.value) { |
|||
const field = qualitativeFormRef.value.getFieldComponent(obj.name); |
|||
if (field) { |
|||
field.setExpandOptionsModelValue(true); |
|||
} |
|||
} |
|||
} |
|||
return; |
|||
} |
|||
|
|||
if (Array.isArray(obj.fields)) { |
|||
obj.fields.forEach((field) => recursiveHandle(field)); |
|||
} |
|||
}; |
|||
|
|||
const toggleUpdate = (value: boolean) => { |
|||
rating.qualFormData.value.forEach((item: any) => { |
|||
toggleRecursiveHandle(item, value); |
|||
}); |
|||
}; |
|||
|
|||
const toggleRecursiveHandle = (obj: any, value: boolean) => { |
|||
if (obj.type === 'w-ext-radio') { |
|||
obj.hideOptions = true; |
|||
if (qualitativeFormRef.value) { |
|||
const field = qualitativeFormRef.value.getFieldComponent(obj.name); |
|||
if (field) { |
|||
field.setExpandOptionsModelValue(value); |
|||
} |
|||
} |
|||
return; |
|||
} |
|||
|
|||
if (Array.isArray(obj.fields)) { |
|||
obj.fields.forEach((field) => toggleRecursiveHandle(field, value)); |
|||
} |
|||
}; |
|||
|
|||
const readOnlyRecursiveHandle = (obj: any) => { |
|||
if (obj.type !== 'w-form-group') { |
|||
obj.readOnlyIf = true; |
|||
obj.hideOptions = true; |
|||
return; |
|||
} |
|||
if (Array.isArray(obj.fields)) { |
|||
obj.fields.forEach((field) => readOnlyRecursiveHandle(field)); |
|||
} |
|||
}; |
|||
|
|||
const formUpdateValue = (args) => { |
|||
const result = rating.waitSelectFields.value.filter((field) => field.field['name'] !== args.fieldName); |
|||
rating.waitSelectFields.value = result; |
|||
}; |
|||
</script> |
|||
<style lang="css"> |
|||
.qa-badge { |
|||
position: relative; |
|||
top: -7px; |
|||
right: -2px; |
|||
cursor: inherit; |
|||
} |
|||
</style> |
@ -0,0 +1,36 @@ |
|||
<template> |
|||
<div v-if="rating.systemParameter.reportShowScoreDtl.value" class="h-full"> |
|||
<w-splitter :model-value="20" :separator-color="rating.separatorColor"> |
|||
<template #before> |
|||
<QuanAnalysis></QuanAnalysis> |
|||
</template> |
|||
|
|||
<template #after> |
|||
<w-splitter v-if="splitComputed" :model-value="75" class="h-full" :separator-color="rating.separatorColor"> |
|||
<template #before> |
|||
<QualAnalysis :qa-mode="false" :read-only="true" :default-show-options="rating.cm.isApplyUserProcessStatus ? false : true"></QualAnalysis> |
|||
</template> |
|||
<template #after> |
|||
<AdjustItemIndex></AdjustItemIndex> |
|||
</template> |
|||
</w-splitter> |
|||
<QualAnalysis v-else :qa-mode="false" :read-only="true"></QualAnalysis> |
|||
</template> |
|||
</w-splitter> |
|||
</div> |
|||
</template> |
|||
<script setup lang="ts"> |
|||
import { inject, computed } from 'vue'; |
|||
import { Rating } from '@/views/custRating/company/ts/Rating'; |
|||
import QuanAnalysis from '@/views/custRating/company/components/QuanAnalysis.vue'; |
|||
import QualAnalysis from '@/views/custRating/company/components/QualAnalysis.vue'; |
|||
import AdjustItemIndex from '@/views/custRating/company/components/AdjustItemIndex.vue'; |
|||
|
|||
const rating = <Rating>inject('rating'); |
|||
const splitComputed = computed(() => { |
|||
if (rating.adjustItemScoreDtlData.value && Object.keys(rating.adjustItemScoreDtlData.value).length > 0) { |
|||
return true; |
|||
} |
|||
return false; |
|||
}); |
|||
</script> |
@ -0,0 +1,29 @@ |
|||
<template> |
|||
<q-tabs |
|||
v-model="rating.step.currStep.value" |
|||
vertical |
|||
indicator-color="amber" |
|||
active-color="amber" |
|||
align="left" |
|||
:dense="rating.cm.isAwaitSubmitProcessStatus.value" |
|||
style="height: auto" |
|||
v-bind="attrs" |
|||
@update:model-value="rating.step.click" |
|||
> |
|||
<template v-for="(step, index) in rating.step.steps.value" :key="step.value"> |
|||
<q-tab :name="step.value" :icon="step.icon" :label="step.label" :disable="step.disable" style="padding: 2px"> |
|||
<q-tooltip v-if="rating.cm.isAwaitSubmitProcessStatus.value" transition-show="rotate" transition-hide="rotate">{{ step.tooltip }}</q-tooltip> |
|||
</q-tab> |
|||
<div v-if="index !== rating.step.steps.value.length - 1 && rating.cm.isAwaitSubmitProcessStatus.value" style="width: 100%; text-align: center"> |
|||
<q-icon name="bi-arrow-down-short" size="sm"></q-icon> |
|||
</div> |
|||
</template> |
|||
</q-tabs> |
|||
</template> |
|||
<script setup lang="ts"> |
|||
import { inject, useAttrs } from 'vue'; |
|||
import { Rating } from '@/views/custRating/company/ts/Rating'; |
|||
|
|||
const attrs = useAttrs(); |
|||
const rating = <Rating>inject('rating'); |
|||
</script> |
@ -0,0 +1,39 @@ |
|||
<template> |
|||
<div class="py-1 pl-1 flex flex-nowrap items-start gap-x-2"> |
|||
<div class="flex-1"> |
|||
<w-form |
|||
:cols-num="3" |
|||
:fields="[ |
|||
{ |
|||
label: '评分卡', |
|||
name: 'modelName', |
|||
type: 'w-select', |
|||
options: ['A评分卡', 'B评分卡', 'K评分卡'], |
|||
defaultValue: rating.ratingData.value['modelName'], |
|||
}, |
|||
{ |
|||
label: '更改评分卡说明', |
|||
name: 'updateModelDesc', |
|||
type: 'w-text', |
|||
colSpan: 2, |
|||
}, |
|||
]" |
|||
> |
|||
</w-form> |
|||
</div> |
|||
<div class="flex-none pr-4"> |
|||
<q-btn icon="task_alt" color="primary" label="更改" @click="click" /> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
<script setup lang="ts"> |
|||
import { inject } from 'vue'; |
|||
import { DialogManager } from 'platform-core'; |
|||
import { Rating } from '@/views/custRating/company/ts/Rating'; |
|||
|
|||
const rating = <Rating>inject('rating'); |
|||
|
|||
const click = () => { |
|||
DialogManager.confirm('更改评分卡后流程会经总行进行审批,确认要更改评分卡吗', () => {}); |
|||
}; |
|||
</script> |
@ -0,0 +1,309 @@ |
|||
<template> |
|||
<div> |
|||
<q-btn-dropdown |
|||
split |
|||
icon="mark_chat_unread" |
|||
color="primary" |
|||
label="批注" |
|||
class="ab-dropdown-button" |
|||
@click=" |
|||
() => { |
|||
annotationInputShowModelValue = true; |
|||
} |
|||
" |
|||
> |
|||
<q-list style="max-width: 800px"> |
|||
<q-item> |
|||
<q-item-section avatar> |
|||
<q-avatar icon="assignment" color="secondary" text-color="white" /> |
|||
</q-item-section> |
|||
<q-item-section> |
|||
<q-item-label>张三</q-item-label> |
|||
<q-item-label caption>企业自身状况选项存疑,后续持续跟进</q-item-label> |
|||
</q-item-section> |
|||
<q-item-section side> 2024-04-18 </q-item-section> |
|||
</q-item> |
|||
|
|||
<q-item> |
|||
<q-item-section avatar> |
|||
<q-avatar icon="assignment" color="secondary" text-color="white" /> |
|||
</q-item-section> |
|||
<q-item-section> |
|||
<q-item-label>李四</q-item-label> |
|||
<q-item-label caption>客户财报信息部分指标取值不准确,与客户最新披露的财报存在较大出入</q-item-label> |
|||
</q-item-section> |
|||
<q-item-section side> 2024-04-16 </q-item-section> |
|||
</q-item> |
|||
<q-item> |
|||
<q-item-section avatar> |
|||
<q-avatar icon="assignment" color="secondary" text-color="white" /> |
|||
</q-item-section> |
|||
<q-item-section> |
|||
<q-item-label>李四</q-item-label> |
|||
<q-item-label caption>客户财报信息部分指标取值不准确,与客户最新披露的财报存在较大出入</q-item-label> |
|||
</q-item-section> |
|||
<q-item-section side> 2024-04-16 </q-item-section> |
|||
</q-item> |
|||
<q-item v-close-popup clickable @click="updateAnnotation"> |
|||
<q-item-section avatar> |
|||
<q-avatar icon="person_pin" color="orange" text-color="white" /> |
|||
</q-item-section> |
|||
<q-item-section> |
|||
<q-item-label>admin</q-item-label> |
|||
<q-item-label caption>这是我自己加的批注</q-item-label> |
|||
</q-item-section> |
|||
<q-item-section side> 2024-04-16 </q-item-section> |
|||
</q-item> |
|||
<q-item> |
|||
<q-item-section avatar> |
|||
<q-avatar icon="assignment" color="secondary" text-color="white" /> |
|||
</q-item-section> |
|||
<q-item-section> |
|||
<q-item-label>李四</q-item-label> |
|||
<q-item-label caption>客户财报信息部分指标取值不准确,与客户最新披露的财报存在较大出入</q-item-label> |
|||
</q-item-section> |
|||
<q-item-section side> 2024-04-16 </q-item-section> |
|||
</q-item> |
|||
<q-item v-close-popup clickable @click="updateAnnotation"> |
|||
<q-item-section avatar> |
|||
<q-avatar icon="person_pin" color="orange" text-color="white" /> |
|||
</q-item-section> |
|||
<q-item-section> |
|||
<q-item-label>admin</q-item-label> |
|||
<q-item-label caption>备注一下,评级调整项可能需要更改</q-item-label> |
|||
</q-item-section> |
|||
<q-item-section side> 2024-04-15 </q-item-section> |
|||
</q-item> |
|||
<q-item> |
|||
<q-item-section avatar> |
|||
<q-avatar icon="assignment" color="secondary" text-color="white" /> |
|||
</q-item-section> |
|||
<q-item-section> |
|||
<q-item-label>李四</q-item-label> |
|||
<q-item-label caption>客户财报信息部分指标取值不准确,与客户最新披露的财报存在较大出入</q-item-label> |
|||
</q-item-section> |
|||
<q-item-section side> 2024-04-16 </q-item-section> |
|||
</q-item> |
|||
<q-item> |
|||
<q-item-section avatar> |
|||
<q-avatar icon="assignment" color="secondary" text-color="white" /> |
|||
</q-item-section> |
|||
<q-item-section> |
|||
<q-item-label>李四</q-item-label> |
|||
<q-item-label caption>客户财报信息部分指标取值不准确,与客户最新披露的财报存在较大出入</q-item-label> |
|||
</q-item-section> |
|||
<q-item-section side> 2024-04-16 </q-item-section> |
|||
</q-item> |
|||
<q-item> |
|||
<q-item-section avatar> |
|||
<q-avatar icon="assignment" color="secondary" text-color="white" /> |
|||
</q-item-section> |
|||
<q-item-section> |
|||
<q-item-label>李四</q-item-label> |
|||
<q-item-label caption>客户财报信息部分指标取值不准确,与客户最新披露的财报存在较大出入</q-item-label> |
|||
</q-item-section> |
|||
<q-item-section side> 2024-04-16 </q-item-section> |
|||
</q-item> |
|||
<q-item> |
|||
<q-item-section avatar> |
|||
<q-avatar icon="assignment" color="secondary" text-color="white" /> |
|||
</q-item-section> |
|||
<q-item-section> |
|||
<q-item-label>李四</q-item-label> |
|||
<q-item-label caption>客户财报信息部分指标取值不准确,与客户最新披露的财报存在较大出入</q-item-label> |
|||
</q-item-section> |
|||
<q-item-section side> 2024-04-16 </q-item-section> |
|||
</q-item> |
|||
<q-item> |
|||
<q-item-section avatar> |
|||
<q-avatar icon="assignment" color="secondary" text-color="white" /> |
|||
</q-item-section> |
|||
<q-item-section> |
|||
<q-item-label>李四</q-item-label> |
|||
<q-item-label caption>客户财报信息部分指标取值不准确,与客户最新披露的财报存在较大出入</q-item-label> |
|||
</q-item-section> |
|||
<q-item-section side> 2024-04-16 </q-item-section> |
|||
</q-item> |
|||
<q-item> |
|||
<q-item-section avatar> |
|||
<q-avatar icon="assignment" color="secondary" text-color="white" /> |
|||
</q-item-section> |
|||
<q-item-section> |
|||
<q-item-label>李四</q-item-label> |
|||
<q-item-label caption>客户财报信息部分指标取值不准确,与客户最新披露的财报存在较大出入</q-item-label> |
|||
</q-item-section> |
|||
<q-item-section side> 2024-04-16 </q-item-section> |
|||
</q-item> |
|||
<q-item> |
|||
<q-item-section avatar> |
|||
<q-avatar icon="assignment" color="secondary" text-color="white" /> |
|||
</q-item-section> |
|||
<q-item-section> |
|||
<q-item-label>李四</q-item-label> |
|||
<q-item-label caption>客户财报信息部分指标取值不准确,与客户最新披露的财报存在较大出入</q-item-label> |
|||
</q-item-section> |
|||
<q-item-section side> 2024-04-16 </q-item-section> |
|||
</q-item> |
|||
<q-item> |
|||
<q-item-section avatar> |
|||
<q-avatar icon="assignment" color="secondary" text-color="white" /> |
|||
</q-item-section> |
|||
<q-item-section> |
|||
<q-item-label>李四</q-item-label> |
|||
<q-item-label caption>客户财报信息部分指标取值不准确,与客户最新披露的财报存在较大出入</q-item-label> |
|||
</q-item-section> |
|||
<q-item-section side> 2024-04-16 </q-item-section> |
|||
</q-item> |
|||
<q-item> |
|||
<q-item-section avatar> |
|||
<q-avatar icon="assignment" color="secondary" text-color="white" /> |
|||
</q-item-section> |
|||
<q-item-section> |
|||
<q-item-label>李四</q-item-label> |
|||
<q-item-label caption>客户财报信息部分指标取值不准确,与客户最新披露的财报存在较大出入</q-item-label> |
|||
</q-item-section> |
|||
<q-item-section side> 2024-04-16 </q-item-section> |
|||
</q-item> |
|||
<q-item> |
|||
<q-item-section avatar> |
|||
<q-avatar icon="assignment" color="secondary" text-color="white" /> |
|||
</q-item-section> |
|||
<q-item-section> |
|||
<q-item-label>李四</q-item-label> |
|||
<q-item-label caption>客户财报信息部分指标取值不准确,与客户最新披露的财报存在较大出入</q-item-label> |
|||
</q-item-section> |
|||
<q-item-section side> 2024-04-16 </q-item-section> |
|||
</q-item> |
|||
<q-item> |
|||
<q-item-section avatar> |
|||
<q-avatar icon="assignment" color="secondary" text-color="white" /> |
|||
</q-item-section> |
|||
<q-item-section> |
|||
<q-item-label>李四</q-item-label> |
|||
<q-item-label caption>客户财报信息部分指标取值不准确,与客户最新披露的财报存在较大出入</q-item-label> |
|||
</q-item-section> |
|||
<q-item-section side> 2024-04-16 </q-item-section> |
|||
</q-item> |
|||
<q-item> |
|||
<q-item-section avatar> |
|||
<q-avatar icon="assignment" color="secondary" text-color="white" /> |
|||
</q-item-section> |
|||
<q-item-section> |
|||
<q-item-label>李四</q-item-label> |
|||
<q-item-label caption>客户财报信息部分指标取值不准确,与客户最新披露的财报存在较大出入</q-item-label> |
|||
</q-item-section> |
|||
<q-item-section side> 2024-04-16 </q-item-section> |
|||
</q-item> |
|||
<q-item> |
|||
<q-item-section avatar> |
|||
<q-avatar icon="assignment" color="secondary" text-color="white" /> |
|||
</q-item-section> |
|||
<q-item-section> |
|||
<q-item-label>李四</q-item-label> |
|||
<q-item-label caption |
|||
>客户财报信 息部分指标取值不准确,与客户最新披露的财报存在较大出 |
|||
入客户财报信息部分指标取值不准确,与客户最新披露的财报存在较大出入客户财报信息部分指标取值不准确,与客户最新披露的财报存在较大出入客户财报信息部分指标取值不准确,</q-item-label |
|||
> |
|||
</q-item-section> |
|||
<q-item-section side> 2024-04-16 </q-item-section> |
|||
</q-item> |
|||
<q-item> |
|||
<q-item-section avatar> |
|||
<q-avatar icon="assignment" color="secondary" text-color="white" /> |
|||
</q-item-section> |
|||
<q-item-section> |
|||
<q-item-label>李四</q-item-label> |
|||
<q-item-label caption>客户财报信息部分指标取值不准确,与客户最新披露的财报存在较大出入</q-item-label> |
|||
</q-item-section> |
|||
<q-item-section side> 2024-04-16 </q-item-section> |
|||
</q-item> |
|||
</q-list> |
|||
</q-btn-dropdown> |
|||
<q-popup-proxy v-model="annotationInputShowModelValue" no-parent-event> |
|||
<div style="height: 170px; width: 500px; padding: 10px; background-color: #fff7d1"> |
|||
<w-form |
|||
:cols-num="1" |
|||
:fields="[ |
|||
{ |
|||
name: 'annotation', |
|||
label: '批注', |
|||
type: 'w-textarea', |
|||
rows: 5, |
|||
}, |
|||
{ |
|||
type: 'w-form-group', |
|||
align: 'left', |
|||
fields: [ |
|||
{ |
|||
type: 'q-btn', |
|||
label: '保存', |
|||
icon: 'save', |
|||
color: 'primary', |
|||
onClick: () => { |
|||
annotationInputShowModelValue = false; |
|||
}, |
|||
}, |
|||
], |
|||
}, |
|||
]" |
|||
></w-form> |
|||
</div> |
|||
</q-popup-proxy> |
|||
<w-drawer ref="addAnnotationRef" title="批注"> |
|||
<div class="p-2 h-full"> |
|||
<w-splitter :model-value="205" horizontal unit="px" disable :show-separator="false"> |
|||
<template #before> |
|||
<w-form ref="formRef" :cols-num="1" :fields="[{ label: '批注内容', name: 'annotation', type: 'w-textarea' }]"></w-form> |
|||
<br /> |
|||
<q-btn |
|||
icon="add" |
|||
color="primary" |
|||
label="添加" |
|||
@click=" |
|||
() => { |
|||
annotationGridRef.addLocalData({ nr: formRef.getData()['annotation'], sj: currDate() }); |
|||
} |
|||
" |
|||
/> |
|||
</template> |
|||
<template #after> |
|||
<div class="h-full"> |
|||
<w-grid |
|||
ref="annotationGridRef" |
|||
:auto-fetch-data="false" |
|||
:config-button="false" |
|||
:toolbar-actions="['refresh', 'remove']" |
|||
:columns="[ |
|||
{ label: '批注内容', name: 'nr' }, |
|||
{ label: '批注时间', name: 'sj', width: 200 }, |
|||
]" |
|||
> |
|||
</w-grid> |
|||
</div> |
|||
</template> |
|||
</w-splitter> |
|||
</div> |
|||
</w-drawer> |
|||
</div> |
|||
</template> |
|||
<script setup lang="ts"> |
|||
import { ref, inject, computed } from 'vue'; |
|||
import { Rating } from '@/views/custRating/company/ts/Rating'; |
|||
|
|||
const rating = <Rating>inject('rating'); |
|||
const annotationInputShowModelValue = ref(false); |
|||
const addAnnotationRef = ref(); |
|||
const annotationGridRef = ref(); |
|||
const formRef = ref(); |
|||
const currDate = () => { |
|||
const now = new Date(); |
|||
const formattedTime = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')} ${String(now.getHours()).padStart(2, '0')}:${String(now.getMinutes()).padStart(2, '0')}:${String(now.getSeconds()).padStart(2, '0')}`; |
|||
return formattedTime; |
|||
}; |
|||
const showComputed = computed(() => { |
|||
return true; |
|||
}); |
|||
const updateAnnotation = () => { |
|||
annotationInputShowModelValue.value = true; |
|||
}; |
|||
</script> |
@ -0,0 +1,61 @@ |
|||
<template> |
|||
<w-workflow-action |
|||
v-if="showComputed" |
|||
:task-id="rating.ratingData.value['taskId']" |
|||
:data="rating.opinionData.value" |
|||
:default-submit-button="false" |
|||
:action-url="Environment.apiContextPath('/api/irbs/companyRatingProcess/submit')" |
|||
@before-submit=" |
|||
async (action, callback) => { |
|||
if (rating.cm.isAwaitSubmitProcessStatus.value && rating.step.currStep.value === Step.type.reportInfo.value) { |
|||
rating.opinionData.value = { |
|||
transientVariables: { |
|||
opaVal: action.transientVariables.goback, |
|||
desc: '客户名称:' + rating.ratingData.value['custName'], |
|||
}, |
|||
data: { |
|||
adjReason: '申请审核', |
|||
}, |
|||
}; |
|||
callback(true); |
|||
} else { |
|||
rating.opinionData.value = { |
|||
transientVariables: { |
|||
opaVal: action.transientVariables.goback, |
|||
desc: '客户名称:' + rating.ratingData.value['custName'], |
|||
}, |
|||
data: rating.refs.overturnFormRefFunction().getData(), |
|||
}; |
|||
const validateResult = await rating.refs.overturnFormRefFunction().validate(); |
|||
if (validateResult) { |
|||
callback(true); |
|||
} else { |
|||
callback(false); |
|||
} |
|||
} |
|||
} |
|||
" |
|||
@after-submit=" |
|||
() => { |
|||
rating.instance.emit('afterComplete'); |
|||
} |
|||
" |
|||
> |
|||
</w-workflow-action> |
|||
</template> |
|||
<script setup lang="ts"> |
|||
import { inject, computed } from 'vue'; |
|||
import { Environment } from 'platform-core'; |
|||
import { Rating } from '@/views/custRating/company/ts/Rating'; |
|||
import { Step } from '@/views/custRating/company/ts/Step'; |
|||
|
|||
const rating = <Rating>inject('rating'); |
|||
const showComputed = computed(() => { |
|||
if (rating.cm.isAwaitSubmitProcessStatus.value) { |
|||
return rating.step.currStep.value === Step.type.opinion.value || rating.step.currStep.value === Step.type.reportInfo.value; |
|||
} else if (rating.ratingData.value['taskId']) { |
|||
return true; |
|||
} |
|||
return false; |
|||
}); |
|||
</script> |
@ -1,18 +0,0 @@ |
|||
<template> |
|||
<w-splitter :size="45" unit="px" horizontal disable> |
|||
<template #before> |
|||
<FirstRatingResult></FirstRatingResult> |
|||
</template> |
|||
<template #after> |
|||
<AdjustItemGrid class="px-1"></AdjustItemGrid> |
|||
</template> |
|||
</w-splitter> |
|||
</template> |
|||
<script setup lang="ts"> |
|||
import { inject, computed } from 'vue'; |
|||
import { Rating } from '../ts/Rating'; |
|||
import FirstRatingResult from './FirstRatingResult.vue'; |
|||
import AdjustItemGrid from './AdjustItemGrid.vue'; |
|||
|
|||
const rating = <Rating>inject('rating'); |
|||
</script> |
@ -1,29 +0,0 @@ |
|||
<template> |
|||
<q-card flat bordered> |
|||
<q-card-section> |
|||
<span class="text-3xl"> |
|||
{{ rating.custInfoData.value['custName'] }} |
|||
<!-- <q-badge v-if="rating.custInfoData.value['marketEnterprisesInd'] === '1'" color="red" align="top">上市</q-badge> --> |
|||
<q-badge color="orange" align="top">客户号:{{ rating.custInfoData.value['custNo'] }}</q-badge |
|||
> <q-badge color="green" align="top">上市</q-badge> |
|||
<q-badge color="red" align="top">{{ Formater.dictionary(rating.dictionary.customerSize)(rating.custInfoData.value['customerSize']) }}</q-badge |
|||
> <q-badge align="top">{{ Formater.dictionary(rating.dictionary.registeredType)(rating.custInfoData.value['registeredType']) }}</q-badge |
|||
> <q-badge color="secondary" align="top">{{ rating.custInfoData.value['groupCustInd'] === '1' ? '集团客户' : '非集团客户' }}</q-badge |
|||
> |
|||
<q-badge v-if="rating.custInfoData.value['groupCustInd'] === '1'" align="top" |
|||
>集团成员类别:{{ Formater.dictionary(rating.dictionary.memberTypeCd)(rating.custInfoData.value['memberType']) }}</q-badge |
|||
><template v-if="rating.custInfoData.value['groupCustInd'] === '1'"> </template> |
|||
<q-badge color="blue" align="top">行业:{{ rating.custInfoData.value['industryTypeName'] }}</q-badge |
|||
> <q-badge color="brown" align="top">成立日期:{{ rating.custInfoData.value['buildDate'] }}</q-badge |
|||
> |
|||
</span> |
|||
</q-card-section> |
|||
</q-card> |
|||
</template> |
|||
<script setup lang="ts"> |
|||
import { Formater } from 'platform-core'; |
|||
import { inject } from 'vue'; |
|||
import { Rating } from '../ts/Rating'; |
|||
|
|||
const rating = <Rating>inject('rating'); |
|||
</script> |
@ -1,61 +0,0 @@ |
|||
<template> |
|||
<w-splitter :size="48" unit="px" horizontal disable> |
|||
<template #before> |
|||
<div class="py-1 pl-1 flex flex-nowrap items-start gap-x-2"> |
|||
<div class="flex-1"> |
|||
<w-form |
|||
:cols-num="3" |
|||
:fields="[ |
|||
{ |
|||
label: '评分卡', |
|||
name: 'modelName', |
|||
type: 'w-select', |
|||
options: ['A评分卡', 'B评分卡', 'K评分卡'], |
|||
defaultValue: rating.ratingData.value['modelName'], |
|||
}, |
|||
{ |
|||
label: '更改评分卡说明', |
|||
name: 'updateModelDesc', |
|||
type: 'w-text', |
|||
colSpan: 2, |
|||
}, |
|||
]" |
|||
> |
|||
</w-form> |
|||
</div> |
|||
<div class="flex-none pr-4"> |
|||
<q-btn icon="task_alt" color="primary" label="更改" @click="click" /> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
<template #after> |
|||
<w-splitter :size="70" :limits="[30, 95]" horizontal :separator-color="rating.separatorColor"> |
|||
<template #before> |
|||
<FinanceReportTabs></FinanceReportTabs> |
|||
</template> |
|||
<template #after> |
|||
<CreditReportGrid class="px-1"></CreditReportGrid> |
|||
</template> |
|||
</w-splitter> |
|||
</template> |
|||
</w-splitter> |
|||
</template> |
|||
<script setup lang="ts"> |
|||
import { ref, inject } from 'vue'; |
|||
import { DialogManager } from 'platform-core'; |
|||
import { Rating } from '../ts/Rating'; |
|||
import FinanceReportGrid from './FinanceReportGrid.vue'; |
|||
import CreditReportGrid from './CreditReportGrid.vue'; |
|||
import CustBaseInfo from './CustBaseInfo.vue'; |
|||
import FinanceReportTabs from './FinanceReportTabs.vue'; |
|||
|
|||
const rating = <Rating>inject('rating'); |
|||
const custFormRef = ref(); |
|||
const getCustFormRef = () => { |
|||
return custFormRef.value; |
|||
}; |
|||
rating.refs.setCustFormRefFunction(getCustFormRef); |
|||
const click = () => { |
|||
DialogManager.confirm('更改评分卡后流程会经总行进行审批,确认要更改评分卡吗', () => {}); |
|||
}; |
|||
</script> |
@ -1,146 +0,0 @@ |
|||
<template> |
|||
<div> |
|||
<w-grid |
|||
ref="financeReportGridRef" |
|||
title="财务报表" |
|||
:dense="rating.dense" |
|||
:height="150" |
|||
:pageable="false" |
|||
:hide-bottom="true" |
|||
:auto-fetch-data="false" |
|||
:fetch-data-url="Environment.apiContextPath('api/irbs/financeReport/getReport')" |
|||
:checkbox-selection="false" |
|||
:config-button="false" |
|||
:columns="[ |
|||
{ name: 'endDate', label: '财报日期', format: Formater.dateOnly() }, |
|||
// { name: 'type', label: '报表类型', format: Formater.dictionary(rating.dictionary.financeTypeCd) }, |
|||
{ |
|||
name: 'type', |
|||
label: '报表类型', |
|||
format: Formater.dictionary(rating.dictionary.financeTypeCd), |
|||
}, |
|||
{ name: 'sort', label: '报表类别', format: Formater.dictionary(rating.dictionary.financeSortTypeCd) }, |
|||
{ name: 'auditedInd', label: '是否审计', format: Formater.dictionary(rating.dictionary.financeStatusCd) }, |
|||
{ name: 'caliber', label: '报表口径', format: Formater.dictionary(rating.dictionary.caliberCd) }, |
|||
{ name: 'currency', label: '报表币种', format: Formater.dictionary(rating.dictionary.currencyTypeCd) }, |
|||
{ name: 'userNo', label: '经办人' }, |
|||
{ name: 'remarks', label: '备注' }, |
|||
{ |
|||
name: 'op', |
|||
label: '操作', |
|||
format: opFormat, |
|||
}, |
|||
]" |
|||
></w-grid> |
|||
<w-dialog ref="financeReportDetailDialogRef" title="财报详情" width="80%" height="80%" body-padding="0px 0px 0px 0px"> |
|||
<w-splitter :size="60" horizontal unit="px" disable class="h-full"> |
|||
<template #before> |
|||
<div class="p-1"> |
|||
<w-info-panel :info="financeReport.otherInfo" :column-num="5" :label-width="150"></w-info-panel> |
|||
</div> |
|||
</template> |
|||
|
|||
<template #after> |
|||
<div class="flex flex-nowrap items-start h-full"> |
|||
<div class="flex-none h-full"> |
|||
<q-tabs v-model="detailTab" vertical indicator-color="amber" active-color="amber"> |
|||
<template v-for="report in financeReport.tabsComputed.value" :key="report.value"> |
|||
<q-tab :name="report.value" :icon="report.icon" :label="report.label" /> |
|||
</template> |
|||
</q-tabs> |
|||
</div> |
|||
<q-separator vertical /> |
|||
<div class="flex-1 h-full"> |
|||
<q-tab-panels |
|||
v-model="detailTab" |
|||
:keep-alive="true" |
|||
animated |
|||
swipeable |
|||
vertical |
|||
transition-prev="jump-up" |
|||
transition-next="jump-up" |
|||
class="h-full" |
|||
> |
|||
<template v-for="report in financeReport.tabsComputed.value" :key="report.value"> |
|||
<q-tab-panel :name="report.value" class="h-full p-1"> |
|||
<FinanceProjectGrid |
|||
:query-criteria="{ |
|||
operator: 'and', |
|||
criteria: [ |
|||
{ |
|||
fieldName: 'reportId', |
|||
operator: 'equals', |
|||
value: financeReport.reportId, |
|||
}, |
|||
{ |
|||
fieldName: 'projectType', |
|||
operator: 'equals', |
|||
value: report.value, |
|||
}, |
|||
], |
|||
}" |
|||
></FinanceProjectGrid> |
|||
</q-tab-panel> |
|||
</template> |
|||
</q-tab-panels> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
</w-splitter> |
|||
</w-dialog> |
|||
</div> |
|||
</template> |
|||
<script setup lang="ts"> |
|||
import { ref, nextTick, reactive, inject } from 'vue'; |
|||
import { Formater, Environment } from 'platform-core'; |
|||
import { Rating } from '../ts/Rating'; |
|||
import FinanceProjectGrid from './FinanceProjectGrid.vue'; |
|||
import { FinanceReport, Constant } from '../ts/FinanceReport'; |
|||
|
|||
const rating = <Rating>inject('rating'); |
|||
const financeReportGridRef = ref(); |
|||
const getFinanceReportGridRef = () => { |
|||
return financeReportGridRef.value; |
|||
}; |
|||
rating.refs.setFinanceReportGridRefFunction(getFinanceReportGridRef); |
|||
const financeReportDetailDialogRef = ref(); |
|||
const financeReport = new FinanceReport(); |
|||
|
|||
const splitterModel = ref(60); |
|||
const detailTab = ref(''); |
|||
|
|||
const opFormat = (value, row) => { |
|||
if (row && row['sort']) { |
|||
return { |
|||
componentType: 'q-chip', |
|||
attrs: { |
|||
dense: true, |
|||
color: 'primary', |
|||
icon: 'visibility', |
|||
textColor: 'white', |
|||
square: true, |
|||
size: rating.dense ? 'xs' : 'md', |
|||
label: '查 看', |
|||
onclick: () => { |
|||
financeReport.reportType.value = row['sort']; |
|||
if (financeReport.reportType.value === Constant.REPORT_TYPE_COMPANY) { |
|||
detailTab.value = FinanceReport.reportDetail.c_balance_sheet.value; |
|||
} else { |
|||
detailTab.value = FinanceReport.reportDetail.p_balance_sheet.value; |
|||
} |
|||
financeReport.reportId = row['id']; |
|||
financeReportDetailDialogRef.value.show(); |
|||
financeReport.otherInfo = []; |
|||
financeReport.otherInfo.push({ label: '财务报表截至日期', value: row['endDate'], format: Formater.dateOnly() }); |
|||
financeReport.otherInfo.push({ label: '是否经过审计', value: row['auditedInd'], format: Formater.dictionary(rating.dictionary.financeStatusCd) }); |
|||
financeReport.otherInfo.push({ label: '财务报表类别', value: row['sort'], format: Formater.dictionary(rating.dictionary.financeTypeCd) }); |
|||
financeReport.otherInfo.push({ label: '财务报表口径', value: row['caliber'], format: Formater.dictionary(rating.dictionary.caliberCd) }); |
|||
financeReport.otherInfo.push({ label: '财务报表币种', value: row['currency'], format: Formater.dictionary(rating.dictionary.currencyTypeCd) }); |
|||
}, |
|||
}, |
|||
}; |
|||
} else { |
|||
return ''; |
|||
} |
|||
}; |
|||
</script> |
@ -1,106 +0,0 @@ |
|||
<template> |
|||
<w-splitter :size="titleSplitterModel" horizontal unit="px" disable class="h-full"> |
|||
<template #before> |
|||
<w-card-panel :bordered="false" :title-mode="true" icon="scatter_plot" :icon-attrs="{ color: 'green' }" color="green"> |
|||
<template #label> |
|||
<div class="flex justify-between"> |
|||
<div> |
|||
定性分析<q-badge v-if="existsWaitSelectComputed" color="red" floating transparent class="qa-badge">{{ |
|||
rating.waitSelectFields.value.length |
|||
}}</q-badge> |
|||
</div> |
|||
<q-toggle v-if="showToggleComputed" v-model="qaMode" color="blue" dense size="40px" icon="bi-quora" label="问卷模式" /> |
|||
<q-toggle v-if="props.readOnly" v-model="showOptionsModel" color="blue" dense size="40px" icon="hdr_auto" label="显示全部选项" /> |
|||
</div> |
|||
</template> |
|||
</w-card-panel> |
|||
</template> |
|||
<template #after> |
|||
<w-form |
|||
v-show="showQaPanelComputed" |
|||
ref="qa-qualFormRef" |
|||
:cols-num="1" |
|||
:fields="qaFormFieldComputed" |
|||
class="px-1 py-1" |
|||
@update-value="qaFormUpdateValue" |
|||
></w-form> |
|||
<w-form |
|||
v-show="!showQaPanelComputed" |
|||
ref="qualitativeFormRef" |
|||
:fields="qualFormFieldsComputed" |
|||
:cols-num="1" |
|||
:y-gap="10" |
|||
class="pl-1 py-1" |
|||
@update-value="formUpdateValue" |
|||
></w-form> |
|||
</template> |
|||
</w-splitter> |
|||
</template> |
|||
<script setup lang="ts"> |
|||
import { inject, ref, computed } from 'vue'; |
|||
import { Rating } from '../ts/Rating'; |
|||
|
|||
const qualitativeFormRef = ref(); |
|||
const rating = <Rating>inject('rating'); |
|||
const titleSplitterModel = ref(34); |
|||
const getQualitativeFormRef = () => { |
|||
return qualitativeFormRef.value; |
|||
}; |
|||
rating.refs.setQualitativeFormRefFunction(getQualitativeFormRef); |
|||
|
|||
const props = defineProps({ |
|||
// 问答模式 |
|||
qualQaMode: { type: Boolean, default: true }, |
|||
// 只读模式 |
|||
readOnly: { type: Boolean, default: false }, |
|||
// 显示所有选项 |
|||
showOptions: { type: Boolean, default: false }, |
|||
}); |
|||
const qaMode = ref(props.readOnly ? false : props.qualQaMode); |
|||
const showOptionsModel = ref(props.showOptions); |
|||
|
|||
const qaFormFieldComputed = computed(() => { |
|||
const result = <any>[]; |
|||
if (rating.waitSelectFields.value?.length > 0) { |
|||
result.push({ |
|||
type: 'w-form-group', |
|||
label: rating.waitSelectFields.value[0]['group'], |
|||
mode: 'card', |
|||
fields: [rating.waitSelectFields.value[0]['field']], |
|||
}); |
|||
} |
|||
return result; |
|||
}); |
|||
const showQaPanelComputed = computed(() => { |
|||
return showToggleComputed.value && qaMode.value; |
|||
}); |
|||
const showToggleComputed = computed(() => { |
|||
return props.qualQaMode && existsWaitSelectComputed.value; |
|||
}); |
|||
const existsWaitSelectComputed = computed(() => { |
|||
return rating.waitSelectFields.value.length > 0 && !props.readOnly; |
|||
}); |
|||
const qualFormFieldsComputed = computed(() => { |
|||
if (showOptionsModel.value) { |
|||
return rating.qualFormData.value; |
|||
} |
|||
return rating.qualSimpleOptionData.value; |
|||
}); |
|||
|
|||
const qaFormUpdateValue = (args) => { |
|||
qualitativeFormRef.value.setFieldValue(args.fieldName, args.fieldValue); |
|||
rating.waitSelectFields.value = rating.waitSelectFields.value.slice(1); |
|||
}; |
|||
const formUpdateValue = (args) => { |
|||
const result = rating.waitSelectFields.value.filter((field) => field.field['name'] !== args.fieldName); |
|||
rating.waitSelectFields.value = result; |
|||
}; |
|||
</script> |
|||
<style lang="css"> |
|||
.qa-badge { |
|||
position: relative; |
|||
top: -7px; |
|||
right: -2px; |
|||
cursor: inherit; |
|||
} |
|||
</style> |
@ -1,20 +0,0 @@ |
|||
<template> |
|||
<div class="h-full"> |
|||
<w-splitter :size="25" :separator-color="rating.separatorColor" class="h-full"> |
|||
<template #before> |
|||
<QuanAnalysis></QuanAnalysis> |
|||
</template> |
|||
<template #after> |
|||
<QualAnalysis :qual-qa-mode="rating.systemParameter.qualQaMode.value" :show-options="true"></QualAnalysis> |
|||
</template> |
|||
</w-splitter> |
|||
</div> |
|||
</template> |
|||
<script setup lang="ts"> |
|||
import { inject } from 'vue'; |
|||
import { Rating } from '../ts/Rating'; |
|||
import QuanAnalysis from './QuanAnalysis.vue'; |
|||
import QualAnalysis from './QualAnalysis.vue'; |
|||
|
|||
const rating = <Rating>inject('rating'); |
|||
</script> |
@ -1,36 +0,0 @@ |
|||
<template> |
|||
<div v-if="rating.systemParameter.reportShowScoreDtl.value" class="h-full"> |
|||
<w-splitter :size="25" :separator-color="rating.separatorColor"> |
|||
<template #before> |
|||
<QuanAnalysis></QuanAnalysis> |
|||
</template> |
|||
|
|||
<template #after> |
|||
<w-splitter v-if="splitComputed" :size="65" class="h-full" :separator-color="rating.separatorColor"> |
|||
<template #before> |
|||
<QualAnalysis :qual-qa-mode="false" :read-only="true"></QualAnalysis> |
|||
</template> |
|||
<template #after> |
|||
<AdjustItemIndex></AdjustItemIndex> |
|||
</template> |
|||
</w-splitter> |
|||
<QualAnalysis v-else :qual-qa-mode="false" :read-only="true"></QualAnalysis> |
|||
</template> |
|||
</w-splitter> |
|||
</div> |
|||
</template> |
|||
<script setup lang="ts"> |
|||
import { inject, computed } from 'vue'; |
|||
import { Rating } from '../ts/Rating'; |
|||
import QuanAnalysis from './QuanAnalysis.vue'; |
|||
import QualAnalysis from './QualAnalysis.vue'; |
|||
import AdjustItemIndex from './AdjustItemIndex.vue'; |
|||
|
|||
const rating = <Rating>inject('rating'); |
|||
const splitComputed = computed(() => { |
|||
if (rating.adjustItemScoreDtlData.value && Object.keys(rating.adjustItemScoreDtlData.value).length > 0) { |
|||
return true; |
|||
} |
|||
return false; |
|||
}); |
|||
</script> |
@ -0,0 +1,40 @@ |
|||
<template> |
|||
<w-splitter :model-value="75" class="h-full" unit="px" disable> |
|||
<template #before> |
|||
<div class="h-full" style="display: flex; align-items: center"> |
|||
<StepTabs></StepTabs> |
|||
</div> |
|||
</template> |
|||
<template #after> |
|||
<!-- 切分窗口 --> |
|||
<w-splitter v-if="!rating.cm.isAwaitSubmitProcessStatus.value" :model-value="80" :separator-color="rating.separatorColor" class="h-full"> |
|||
<template #before> |
|||
<q-tab-panels v-model="rating.step.currStep.value" class="p-0 h-full"> |
|||
<q-tab-panel v-for="step in rating.step.steps.value" :key="step.value" :name="step.value" class="p-0 h-full"> |
|||
<Content :step="step"></Content> |
|||
</q-tab-panel> |
|||
</q-tab-panels> |
|||
</template> |
|||
<template #after> |
|||
<Opinion></Opinion> |
|||
</template> |
|||
</w-splitter> |
|||
<!-- 不切分 --> |
|||
<q-tab-panels v-else v-model="rating.step.currStep.value" class="p-0 h-full"> |
|||
<q-tab-panel v-for="step in rating.step.steps.value" :key="step.value" :name="step.value" class="p-0 h-full"> |
|||
<Content :step="step"></Content> |
|||
</q-tab-panel> |
|||
</q-tab-panels> |
|||
</template> |
|||
</w-splitter> |
|||
</template> |
|||
|
|||
<script setup lang="ts"> |
|||
import { inject } from 'vue'; |
|||
import { Rating } from '@/views/custRating/company/ts/Rating'; |
|||
import Content from './Content.vue'; |
|||
import Opinion from './step/opinion/Opinion.vue'; |
|||
import StepTabs from '@/views/custRating/company/components/StepTabs.vue'; |
|||
|
|||
const rating = <Rating>inject('rating'); |
|||
</script> |
@ -0,0 +1,18 @@ |
|||
<template> |
|||
<w-splitter :model-value="45" unit="px" horizontal disable> |
|||
<template #before> |
|||
<FirstRatingResult></FirstRatingResult> |
|||
</template> |
|||
<template #after> |
|||
<AdjustItemGrid class="px-1"></AdjustItemGrid> |
|||
</template> |
|||
</w-splitter> |
|||
</template> |
|||
<script setup lang="ts"> |
|||
import { inject } from 'vue'; |
|||
import { Rating } from '@/views/custRating/company/ts/Rating'; |
|||
import AdjustItemGrid from '@/views/custRating/company/components/AdjustItemGrid.vue'; |
|||
import FirstRatingResult from '@/views/custRating/company/components/FirstRatingResult.vue'; |
|||
|
|||
const rating = <Rating>inject('rating'); |
|||
</script> |
@ -0,0 +1,31 @@ |
|||
<template> |
|||
<w-splitter :model-value="48" unit="px" horizontal disable> |
|||
<template #before> |
|||
<UpdateModel></UpdateModel> |
|||
</template> |
|||
<template #after> |
|||
<w-splitter :model-value="80" :limits="[30, 95]" horizontal :separator-color="rating.separatorColor"> |
|||
<template #before> |
|||
<FinanceReportTabs></FinanceReportTabs> |
|||
</template> |
|||
<template #after> |
|||
<CreditReportGrid class="px-1"></CreditReportGrid> |
|||
</template> |
|||
</w-splitter> |
|||
</template> |
|||
</w-splitter> |
|||
</template> |
|||
<script setup lang="ts"> |
|||
import { inject, ref } from 'vue'; |
|||
import { Rating } from '@/views/custRating/company/ts/Rating'; |
|||
import CreditReportGrid from '@/views/custRating/company/components/CreditReportGrid.vue'; |
|||
import FinanceReportTabs from '@/views/custRating/company/components/FinanceReportTabs.vue'; |
|||
import UpdateModel from '@/views/custRating/company/components/UpdateModel.vue'; |
|||
|
|||
const rating = <Rating>inject('rating'); |
|||
const custFormRef = ref(); |
|||
const getCustFormRef = () => { |
|||
return custFormRef.value; |
|||
}; |
|||
rating.refs.setCustFormRefFunction(getCustFormRef); |
|||
</script> |
@ -0,0 +1,20 @@ |
|||
<template> |
|||
<div class="h-full"> |
|||
<w-splitter :model-value="25" :separator-color="rating.separatorColor" class="h-full"> |
|||
<template #before> |
|||
<QuanAnalysis></QuanAnalysis> |
|||
</template> |
|||
<template #after> |
|||
<QualAnalysis :qa-mode="true"></QualAnalysis> |
|||
</template> |
|||
</w-splitter> |
|||
</div> |
|||
</template> |
|||
<script setup lang="ts"> |
|||
import { inject } from 'vue'; |
|||
import { Rating } from '@/views/custRating/company/ts/Rating'; |
|||
import QuanAnalysis from '@/views/custRating/company/components/QuanAnalysis.vue'; |
|||
import QualAnalysis from '@/views/custRating/company/components/QualAnalysis.vue'; |
|||
|
|||
const rating = <Rating>inject('rating'); |
|||
</script> |
@ -0,0 +1,79 @@ |
|||
import { Tools } from 'platform-core'; |
|||
|
|||
export class Addtion { |
|||
/** |
|||
* 组件类型映射 |
|||
*/ |
|||
static componentMapping = { |
|||
INTEGER: { |
|||
key: 'INTEGER', |
|||
componentType: 'w-integer', |
|||
}, |
|||
DECIMAL: { |
|||
key: 'DECIMAL', |
|||
componentType: 'w-number', |
|||
}, |
|||
TEXT: { |
|||
key: 'TEXT', |
|||
componentType: 'w-text', |
|||
}, |
|||
TEXTS: { |
|||
key: 'TEXTS', |
|||
componentType: 'w-textarea', |
|||
}, |
|||
ATTACHMENT: { |
|||
key: 'ATTACHMENT', |
|||
componentType: 'w-file', |
|||
}, |
|||
}; |
|||
|
|||
static expression(addtion: any, index: any, value: any) { |
|||
const condition = addtion.condition; |
|||
const replacedCondition = condition.replace(/\$\{(.*?)\}/g, (match, variable) => { |
|||
const values = {}; |
|||
values[index.indexName] = value; |
|||
return values[variable] || match; |
|||
}); |
|||
const result = eval(replacedCondition); |
|||
return result; |
|||
} |
|||
|
|||
/** |
|||
* 根据传入的补录配置,返回组件配置 |
|||
* @param addtion 补录配置 |
|||
* @param index 指标信息 |
|||
*/ |
|||
static getComponent(addtion: any, index: any) { |
|||
const component = { |
|||
type: this.componentMapping[addtion.componentType].componentType, |
|||
name: addtion.code, |
|||
label: addtion.name, |
|||
defaultValue: '1111111111', |
|||
hint: addtion.prompt, |
|||
}; |
|||
if (!Tools.isEmpty(addtion.condition)) { |
|||
component['showIf'] = (args) => { |
|||
const value = args.form.getFieldValue(index.indexCode); |
|||
if (!Tools.isEmpty(value)) { |
|||
return Addtion.expression(addtion, index, value); |
|||
} |
|||
return false; |
|||
}; |
|||
} else { |
|||
component['showIf'] = (args) => { |
|||
const field = args.form.getFields()[index.indexCode]; |
|||
const value = args.form.getFieldValue(index.indexCode); |
|||
if (!Tools.isEmpty(value) || (Tools.hasOwnProperty(field, 'hideOptions') && !field.hideOptions)) { |
|||
return true; |
|||
} |
|||
return false; |
|||
}; |
|||
} |
|||
switch (addtion.componentType) { |
|||
case this.componentMapping.TEXTS.key: |
|||
component['rows'] = addtion.rows; |
|||
break; |
|||
} |
|||
return component; |
|||
} |
|||
} |
Some files were not shown because too many files changed in this diff
Loading…
Reference in new issue