lgl 2 months ago
parent
commit
96cfb5fce1
  1. 4
      gradle.properties
  2. 1
      irbs.cust.rating/build.gradle
  3. 10
      irbs.cust.rating/src/main/java/irbs/cust/rating/enums/BusinessCodeSuffix.java
  4. 111
      irbs.cust.rating/src/main/java/irbs/cust/rating/jpa/entity/BusinessCode.java
  5. 11
      irbs.cust.rating/src/main/java/irbs/cust/rating/jpa/entity/RatingIndex.java
  6. 292
      irbs.cust.rating/src/main/java/irbs/cust/rating/jpa/entity/RatingQualIndexAddtion.java
  7. 10
      irbs.cust.rating/src/main/java/irbs/cust/rating/jpa/repository/BusinessCodeRepository.java
  8. 11
      irbs.cust.rating/src/main/java/irbs/cust/rating/jpa/repository/RatingQualIndexAddtionRepository.java
  9. 72
      irbs.cust.rating/src/main/java/irbs/cust/rating/jpa/vo/BusinessCodeVo.java
  10. 13
      irbs.cust.rating/src/main/java/irbs/cust/rating/jpa/vo/FinanceReportDetailsVo.java
  11. 11
      irbs.cust.rating/src/main/java/irbs/cust/rating/jpa/vo/RatingIndexVo.java
  12. 224
      irbs.cust.rating/src/main/java/irbs/cust/rating/jpa/vo/RatingQualIndexAddtionVo.java
  13. 19
      irbs.cust.rating/src/main/java/irbs/cust/rating/service/BusinessCodeService.java
  14. 9
      irbs.cust.rating/src/main/java/irbs/cust/rating/service/RatingQualIndexAddtionService.java
  15. 16
      irbs.cust.rating/src/main/java/irbs/cust/rating/service/impl/BusiProcessServiceImpl.java
  16. 57
      irbs.cust.rating/src/main/java/irbs/cust/rating/service/impl/BusinessCodeServiceImpl.java
  17. 8
      irbs.cust.rating/src/main/java/irbs/cust/rating/service/impl/CompanyRatingServiceImpl.java
  18. 133
      irbs.cust.rating/src/main/java/irbs/cust/rating/service/impl/FinanceReportDetailServiceImpl.java
  19. 14
      irbs.cust.rating/src/main/java/irbs/cust/rating/service/impl/FinanceReportIndexServiceImpl.java
  20. 16
      irbs.cust.rating/src/main/java/irbs/cust/rating/service/impl/MainScaleVersionServiceImpl.java
  21. 15
      irbs.cust.rating/src/main/java/irbs/cust/rating/service/impl/ModelLibServiceImpl.java
  22. 62
      irbs.cust.rating/src/main/java/irbs/cust/rating/service/impl/RatingIndexServiceImpl.java
  23. 12
      irbs.cust.rating/src/main/java/irbs/cust/rating/service/impl/RatingQualIndexAddtionServiceImpl.java
  24. 2
      irbs.cust.rating/src/main/resources/META-INF/platform/plugins/liquibase.json
  25. 2
      irbs.cust.rating/src/main/resources/META-INF/platform/plugins/parameters.json
  26. 36
      irbs.cust.rating/src/main/resources/liquibase/20240321_CUST_RATING_DDL.xml
  27. 439
      irbs.cust.rating/src/main/resources/liquibase/20250528_DG_KH_DDL.xml
  28. 48
      irbs.cust.rating/src/main/resources/liquibase/20250714_RPT_VIEW__DDL.xml
  29. 16
      irbs.defaultManager/src/main/java/irbs/defaultManager/service/impl/DefaultCognizanceServiceImpl.java
  30. 16
      irbs.defaultManager/src/main/java/irbs/defaultManager/service/impl/DefaultRebirthServiceImpl.java
  31. 16
      irbs.feature/src/main/java/irbs/feature/service/impl/CustFeatureCalcBatchServiceImpl.java
  32. 2
      irbs.frontend/.npmrc
  33. 16
      irbs.frontend/package.json
  34. 3
      irbs.frontend/public/engine.svg
  35. 83
      irbs.frontend/public/webjars/tailwindcss/3.4.16/tailwind.css.js
  36. 62
      irbs.frontend/public/webjars/tailwindcss/3.4.5/tailwind.css.js
  37. 4
      irbs.frontend/src/boostrap.ts
  38. 12
      irbs.frontend/src/components/index.ts
  39. 8
      irbs.frontend/src/remote-components/remote-components.json
  40. 27
      irbs.frontend/src/routes/routes.json
  41. 167
      irbs.frontend/src/views/custRating/CustRating.ts
  42. 218
      irbs.frontend/src/views/custRating/CustRating.vue
  43. 5
      irbs.frontend/src/views/custRating/CustSeparateRating.vue
  44. 5
      irbs.frontend/src/views/custRating/FinancialRating.vue
  45. 349
      irbs.frontend/src/views/custRating/GrayModelDialog.vue
  46. 186
      irbs.frontend/src/views/custRating/LaunchRatingDialog.vue
  47. 2060
      irbs.frontend/src/views/custRating/RatingDialog.vue
  48. 31
      irbs.frontend/src/views/custRating/RatingLevel.vue
  49. 69
      irbs.frontend/src/views/custRating/company/AnnotationButton.vue
  50. 33
      irbs.frontend/src/views/custRating/company/GrayModelDialog.vue
  51. 45
      irbs.frontend/src/views/custRating/company/RatingDialog.vue
  52. 23
      irbs.frontend/src/views/custRating/company/RatingManager.vue
  53. 58
      irbs.frontend/src/views/custRating/company/Step.vue
  54. 48
      irbs.frontend/src/views/custRating/company/WorkflowButton.vue
  55. 2
      irbs.frontend/src/views/custRating/company/components/AdjustItemGrid.vue
  56. 4
      irbs.frontend/src/views/custRating/company/components/AdjustItemIndex.vue
  57. 2
      irbs.frontend/src/views/custRating/company/components/CreditReportGrid.vue
  58. 42
      irbs.frontend/src/views/custRating/company/components/CustBaseInfo.vue
  59. 4
      irbs.frontend/src/views/custRating/company/components/DefaultCognizanceGrid.vue
  60. 4
      irbs.frontend/src/views/custRating/company/components/DefaultRebirthGrid.vue
  61. 6
      irbs.frontend/src/views/custRating/company/components/FinanceProjectCompare.vue
  62. 25
      irbs.frontend/src/views/custRating/company/components/FinanceProjectGrid.vue
  63. 9
      irbs.frontend/src/views/custRating/company/components/FinanceReportTabs.vue
  64. 4
      irbs.frontend/src/views/custRating/company/components/FirstRatingResult.vue
  65. 4
      irbs.frontend/src/views/custRating/company/components/HistRatingGrid.vue
  66. 10
      irbs.frontend/src/views/custRating/company/components/HistTab.vue
  67. 4
      irbs.frontend/src/views/custRating/company/components/OpinionGrid.vue
  68. 4
      irbs.frontend/src/views/custRating/company/components/Overturn.vue
  69. 11
      irbs.frontend/src/views/custRating/company/components/QualAddtionView.vue
  70. 162
      irbs.frontend/src/views/custRating/company/components/QualAnalysis.vue
  71. 6
      irbs.frontend/src/views/custRating/company/components/QuanAnalysis.vue
  72. 2
      irbs.frontend/src/views/custRating/company/components/RatingLevelSlider.vue
  73. 36
      irbs.frontend/src/views/custRating/company/components/ReportIndex.vue
  74. 54
      irbs.frontend/src/views/custRating/company/components/ReportRating.vue
  75. 29
      irbs.frontend/src/views/custRating/company/components/StepTabs.vue
  76. 4
      irbs.frontend/src/views/custRating/company/components/Timeline.vue
  77. 39
      irbs.frontend/src/views/custRating/company/components/UpdateModel.vue
  78. 309
      irbs.frontend/src/views/custRating/company/components/buttons/AnnotationButton.vue
  79. 6
      irbs.frontend/src/views/custRating/company/components/buttons/NextButton.vue
  80. 8
      irbs.frontend/src/views/custRating/company/components/buttons/TestCalcButton.vue
  81. 61
      irbs.frontend/src/views/custRating/company/components/buttons/WorkflowButton.vue
  82. 18
      irbs.frontend/src/views/custRating/company/content/AdjustItem.vue
  83. 29
      irbs.frontend/src/views/custRating/company/content/CustBaseInfo.vue
  84. 61
      irbs.frontend/src/views/custRating/company/content/CustInfo.vue
  85. 146
      irbs.frontend/src/views/custRating/company/content/FinanceReportGrid.vue
  86. 106
      irbs.frontend/src/views/custRating/company/content/QualAnalysis.vue
  87. 20
      irbs.frontend/src/views/custRating/company/content/QuanQualAnalysis.vue
  88. 36
      irbs.frontend/src/views/custRating/company/content/ReportIndex.vue
  89. 16
      irbs.frontend/src/views/custRating/company/template/shrcb/Content.vue
  90. 31
      irbs.frontend/src/views/custRating/company/template/shrcb/Index.vue
  91. 40
      irbs.frontend/src/views/custRating/company/template/shrcb/Layout.vue
  92. 18
      irbs.frontend/src/views/custRating/company/template/shrcb/step/adjust-item/AdjustItem.vue
  93. 31
      irbs.frontend/src/views/custRating/company/template/shrcb/step/cust-info/CustInfo.vue
  94. 19
      irbs.frontend/src/views/custRating/company/template/shrcb/step/opinion/Opinion.vue
  95. 20
      irbs.frontend/src/views/custRating/company/template/shrcb/step/quan-qual-analysis/QuanQualAnalysis.vue
  96. 12
      irbs.frontend/src/views/custRating/company/template/shrcb/step/rating-report/ReportInfo.vue
  97. 79
      irbs.frontend/src/views/custRating/company/ts/Addtion.ts
  98. 47
      irbs.frontend/src/views/custRating/company/ts/RequestApi.ts
  99. 14
      irbs.frontend/src/views/custRating/company/ts/Step.ts
  100. 80
      irbs.frontend/src/views/custRating/company/ts/Utils.ts

4
gradle.properties

@ -36,9 +36,9 @@ application_version=1.0.1
# platform
###########################################################rwa_version
platform_group=io.sc
platform_version=8.2.11
platform_version=8.2.23
platform_plugin_version=8.2.10
platform_core_frontend_version=8.2.50
platform_core_frontend_version=8.2.84
###########################################################
# product dependencies version

1
irbs.cust.rating/build.gradle

@ -4,6 +4,7 @@ dependencies {
"io.sc:io.sc.engine.rule.client.spring:${platform_version}",
"io.sc:io.sc.platform.flowable:${platform_version}",
"io.sc:io.sc.platform.lcdp:${platform_version}",
"io.sc:io.sc.standard:${platform_version}",
project(":irbs.defaultManager"),
project(":irbs.financialTemplate"),

10
irbs.cust.rating/src/main/java/irbs/cust/rating/enums/BusinessCodeSuffix.java

@ -0,0 +1,10 @@
package irbs.cust.rating.enums;
/**
* 业务流水号后缀
*/
public enum BusinessCodeSuffix {
YYYYMMDD, //年月日
YYYYMM //年月
;
}

111
irbs.cust.rating/src/main/java/irbs/cust/rating/jpa/entity/BusinessCode.java

@ -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;
}
}

11
irbs.cust.rating/src/main/java/irbs/cust/rating/jpa/entity/RatingIndex.java

@ -91,6 +91,8 @@ public class RatingIndex extends CorporationAuditorEntity<RatingIndexVo> {
@Transient
protected List<RatingSelectValuesConfig> options;
@Transient
protected List<RatingQualIndexAddtion> addtions;
public RatingIndex() {
}
@ -148,6 +150,7 @@ public class RatingIndex extends CorporationAuditorEntity<RatingIndexVo> {
vo.setIndexScore(this.getIndexScore());
vo.setIndexScoreGray(this.getIndexScoreGray());
vo.setOptions(this.getOptions());
vo.setAddtions(this.getAddtions());
return vo;
}
@ -286,4 +289,12 @@ public class RatingIndex extends CorporationAuditorEntity<RatingIndexVo> {
public void setOptions(List<RatingSelectValuesConfig> options) {
this.options = options;
}
public List<RatingQualIndexAddtion> getAddtions() {
return addtions;
}
public void setAddtions(List<RatingQualIndexAddtion> addtions) {
this.addtions = addtions;
}
}

292
irbs.cust.rating/src/main/java/irbs/cust/rating/jpa/entity/RatingQualIndexAddtion.java

@ -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;
}
}

10
irbs.cust.rating/src/main/java/irbs/cust/rating/jpa/repository/BusinessCodeRepository.java

@ -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);
}

11
irbs.cust.rating/src/main/java/irbs/cust/rating/jpa/repository/RatingQualIndexAddtionRepository.java

@ -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);
}

72
irbs.cust.rating/src/main/java/irbs/cust/rating/jpa/vo/BusinessCodeVo.java

@ -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;
}
}

13
irbs.cust.rating/src/main/java/irbs/cust/rating/jpa/vo/FinanceReportDetailsVo.java

@ -21,6 +21,11 @@ public class FinanceReportDetailsVo extends BaseVo {
*/
private String name;
/**
* 缩进
*/
private Integer tab;
/**
* 科目本期值
*/
@ -65,6 +70,14 @@ public class FinanceReportDetailsVo extends BaseVo {
this.name = name;
}
public Integer getTab() {
return tab;
}
public void setTab(Integer tab) {
this.tab = tab;
}
public BigDecimal getValue() {
return value;
}

11
irbs.cust.rating/src/main/java/irbs/cust/rating/jpa/vo/RatingIndexVo.java

@ -1,6 +1,7 @@
package irbs.cust.rating.jpa.vo;
import io.sc.platform.orm.api.vo.CorporationAuditorVo;
import irbs.cust.rating.jpa.entity.RatingQualIndexAddtion;
import irbs.cust.rating.jpa.entity.RatingSelectValuesConfig;
import javax.persistence.Column;
@ -59,6 +60,8 @@ public class RatingIndexVo extends CorporationAuditorVo {
private List<RatingSelectValuesConfig> options;
private List<RatingQualIndexAddtion> addtions;
public String getId() {
return id;
}
@ -194,4 +197,12 @@ public class RatingIndexVo extends CorporationAuditorVo {
public void setOptions(List<RatingSelectValuesConfig> options) {
this.options = options;
}
public List<RatingQualIndexAddtion> getAddtions() {
return addtions;
}
public void setAddtions(List<RatingQualIndexAddtion> addtions) {
this.addtions = addtions;
}
}

224
irbs.cust.rating/src/main/java/irbs/cust/rating/jpa/vo/RatingQualIndexAddtionVo.java

@ -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;
}
}

19
irbs.cust.rating/src/main/java/irbs/cust/rating/service/BusinessCodeService.java

@ -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;
}

9
irbs.cust.rating/src/main/java/irbs/cust/rating/service/RatingQualIndexAddtionService.java

@ -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> {
}

16
irbs.cust.rating/src/main/java/irbs/cust/rating/service/impl/BusiProcessServiceImpl.java

@ -47,14 +47,14 @@ public class BusiProcessServiceImpl implements BusiProcessService {
@Override
public ProcessTaskWrapper findTaskByProcInstId(String procInstId) throws Exception {
ProcessTaskWrapper taskWrapper = null;
// QueryParameter parameter = new QueryParameter();
// parameter.setPageable(false);
// Equals eq = new Equals();
// eq.setFieldName("processInstanceId");
// eq.setValue(procInstId);
// parameter.addCriteria(eq);
// List<ProcessTaskWrapper> list = processQueryService.queryProcessTasks(parameter).getContent();
List<ProcessTaskWrapper> list = processQueryService.queryProcessTasks(procInstId, null);
QueryParameter parameter = new QueryParameter();
parameter.setPageable(false);
Equals eq = new Equals();
eq.setFieldName("processInstanceId");
eq.setValue(procInstId);
parameter.addCriteria(eq);
List<ProcessTaskWrapper> list = processQueryService.queryProcessTasks(parameter).getContent();
// List<ProcessTaskWrapper> list = processQueryService.queryProcessTasks(procInstId, null);
if (null != list && list.size() > 1) {
// 同一个流程实例查找出多个任务则为多实例任务,还需再根据任务处理人匹配。
List<ProcessTaskWrapper> userTaskList = list.stream().filter(task-> SecurityUtil.getLoginName().equals(task.getAssignee())).collect(Collectors.toList());

57
irbs.cust.rating/src/main/java/irbs/cust/rating/service/impl/BusinessCodeServiceImpl.java

@ -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);
}
}

8
irbs.cust.rating/src/main/java/irbs/cust/rating/service/impl/CompanyRatingServiceImpl.java

@ -62,6 +62,8 @@ public class CompanyRatingServiceImpl extends DaoServiceImpl<CompanyRating, Stri
private ProcessEngine processEngine;
@Autowired
private MainScaleVersionRepository mainScaleVersionRepository;
@Autowired
private BusinessCodeService businessCodeService;
@Override
public Page<CompanyRatingVo> pageQuery(QueryParameter queryParameter) throws Exception {
@ -104,7 +106,9 @@ public class CompanyRatingServiceImpl extends DaoServiceImpl<CompanyRating, Stri
if(null == companyCustomer.getMgerNo() || "".equals(companyCustomer.getMgerNo())){
throw new RuntimeException("客户经理为空");
}
CompanyRating companyRating = new CompanyRating();
companyRating.setTriggerRea(businessCodeService.getBusinessCode("R", BusinessCodeSuffix.YYYYMMDD, 3));
companyRating.setCustNo(companyCustomer.getCustNo());
companyRating.setCustName(companyCustomer.getCustName());
companyRating.setManagerName(companyCustomer.getMgerCna());
@ -136,7 +140,7 @@ public class CompanyRatingServiceImpl extends DaoServiceImpl<CompanyRating, Stri
}
}
if (RatingStepType.CHECK_FINISH.getText().equals(companyRating.getCurrentStep())){
// TODO 20240329 跳过上述步骤,直接生并启动流程
// TODO 20240329 跳过上述步骤,直接生并启动流程
if(customer == null) {
customer = ratingCompanyCustomerService.findById(companyRating.getCustId());
}
@ -314,6 +318,8 @@ public class CompanyRatingServiceImpl extends DaoServiceImpl<CompanyRating, Stri
// CompanyRatingProcDealImpl.class
);
companyRating.setProcessInstanceId(processInstance.getProcessInstanceId());
ProcessTaskWrapper ptw = busiProcessService.findTaskByProcInstId(processInstance.getId());
companyRating.setTaskId(ptw.getId());
getRepository().save(companyRating);
}

133
irbs.cust.rating/src/main/java/irbs/cust/rating/service/impl/FinanceReportDetailServiceImpl.java

@ -5,7 +5,13 @@ import io.sc.platform.orm.service.impl.DaoServiceImpl;
import io.sc.platform.orm.service.support.OperatorType;
import io.sc.platform.orm.service.support.QueryParameter;
import io.sc.platform.orm.service.support.criteria.Criteria;
import io.sc.platform.orm.service.support.criteria.impl.Equals;
import io.sc.platform.orm.service.support.criteria.impl.InSet;
import io.sc.standard.api.enums.FinancialReportingStandard;
import io.sc.standard.api.enums.FinancialReportingSubjectCategory;
import io.sc.standard.api.enums.FinancialReportingType;
import io.sc.standard.jpa.entity.FinancialReportingSubjectEntity;
import io.sc.standard.service.FinancialReportingSubjectService;
import irbs.cust.rating.jpa.entity.FinanceReport;
import irbs.cust.rating.jpa.entity.FinanceReportDetail;
import irbs.cust.rating.jpa.entity.RatingCompanyCustomer;
@ -17,9 +23,7 @@ import irbs.cust.rating.service.RatingCompanyCustomerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.stream.Collectors;
@Service("financeReportDetailService")
@ -29,39 +33,52 @@ public class FinanceReportDetailServiceImpl extends DaoServiceImpl<FinanceReport
private RatingCompanyCustomerService ratingCompanyCustomerService;
@Autowired
private FinanceReportRepository financeReportRepository;
@Autowired
private FinancialReportingSubjectService financialReportingSubjectService;
@Override
public List<FinanceReportDetailsVo> queryDetail(String custId, QueryParameter queryParameter) throws Exception {
List<String> reportIds = getReportIds(custId);
RatingCompanyCustomer customer = ratingCompanyCustomerService.findById(custId);
Equals eq = (Equals) queryParameter.getCriteriaByFieldName("projectType");
String projectType = eq.getValue();
List<FinanceReportDetailsVo> result = new ArrayList<>();
// 获得报告ID集合
List<String> reportIds = getReportIds(customer);
addCriteria(reportIds, queryParameter);
// 查询财报数据
List<FinanceReportDetail> list = this.list(queryParameter);
List<FinanceReportDetailsVo> result = new ArrayList<>();
resultHandler(reportIds, list, result);
// 查询标准财报模板
List<FinancialReportingSubjectEntity> sdSubjectList = listSdSubject(projectType, customer);
// 结果处理
resultHandler(reportIds, list, result, sdSubjectList);
return result;
}
private void resultHandler(List<String> reportIds, List<FinanceReportDetail> list, List<FinanceReportDetailsVo> result) throws Exception {
private void resultHandler(List<String> reportIds, List<FinanceReportDetail> list, List<FinanceReportDetailsVo> result, List<FinancialReportingSubjectEntity> sdSubjectList) throws Exception {
List<FinanceReportDetail> currList = null;
List<FinanceReportDetail> previousPeriodList = new ArrayList<>();
List<FinanceReportDetail> previousPeriod2List = new ArrayList<>();
List<FinanceReportDetail> previousPeriod3List = new ArrayList<>();
if (list!=null && list.size()>0) {
Map<String, List<FinanceReportDetail>> map = list.stream().collect(Collectors.groupingBy(FinanceReportDetail::getReportId));
//以本期值为基础
List<FinanceReportDetail> currList = map.get(reportIds.get(0));
currList = map.get(reportIds.get(0));
// 上期值
List<FinanceReportDetail> previousPeriodList = new ArrayList<>();
if (reportIds.size() > 1 && map.containsKey(reportIds.get(1))) {
previousPeriodList = map.get(reportIds.get(1));
}
// 上2期值
List<FinanceReportDetail> previousPeriod2List = new ArrayList<>();
if (reportIds.size() > 2 && map.containsKey(reportIds.get(2))) {
previousPeriod2List = map.get(reportIds.get(2));
}
// 上3期值
List<FinanceReportDetail> previousPeriod3List = new ArrayList<>();
if (reportIds.size() > 3 && map.containsKey(reportIds.get(3))) {
previousPeriod3List = map.get(reportIds.get(3));
}
list2ListVo(currList, result, previousPeriodList, previousPeriod2List, previousPeriod3List);
}
list2ListVo(currList, result, previousPeriodList, previousPeriod2List, previousPeriod3List, sdSubjectList);
}
private void list2ListVo(
@ -69,13 +86,19 @@ public class FinanceReportDetailServiceImpl extends DaoServiceImpl<FinanceReport
List<FinanceReportDetailsVo> listVo,
List<FinanceReportDetail> previousPeriodList,
List<FinanceReportDetail> previousPeriod2List,
List<FinanceReportDetail> previousPeriod3List
) {
for(FinanceReportDetail frd: list) {
List<FinanceReportDetail> previousPeriod3List,
List<FinancialReportingSubjectEntity> sdSubjectList
) throws Exception {
if (sdSubjectList!=null) {
for (FinancialReportingSubjectEntity frse: sdSubjectList) {
FinanceReportDetailsVo vo = new FinanceReportDetailsVo();
if (list!=null) {
Optional<FinanceReportDetail> optionalEntity = list.stream()
.filter(entity -> entity != null && entity.getProjectCode().equals(frse.getMappingCode()))
.findFirst();
optionalEntity.ifPresent(frd -> {
// 处理找到的实体
vo.setId(frd.getId());
vo.setCode(frd.getProjectCode());
vo.setName(frd.getProjectName());
vo.setValue(frd.getProjectValue());
if (previousPeriodList.size() > 0) {
FinanceReportDetail tmp = previousPeriodList.stream().filter(entity -> entity.getProjectCode().equals(frd.getProjectCode())).findFirst().get();
@ -89,9 +112,78 @@ public class FinanceReportDetailServiceImpl extends DaoServiceImpl<FinanceReport
FinanceReportDetail tmp = previousPeriod3List.stream().filter(entity -> entity.getProjectCode().equals(frd.getProjectCode())).findFirst().get();
vo.setPreviousPeriod3value(tmp.getProjectValue());
}
});
}
vo.setCode(frse.getCode());
vo.setName(frse.getName());
vo.setTab(frse.getTab());
listVo.add(vo);
}
}
}
/**
* 获取数据标准中财报模板
* @return
* @throws Exception
*/
private List<FinancialReportingSubjectEntity> listSdSubject(String projectType, RatingCompanyCustomer customer) throws Exception {
QueryParameter parameter = new QueryParameter();
parameter.setPageable(false);
List<String> sortList = new ArrayList();
sortList.add("category");
sortList.add("row");
parameter.setSortBy(sortList);
Equals standard = new Equals<String>();
standard.setFieldName("standard");
standard.setValue(FinancialReportingStandard.NEW.name());
parameter.addCriteria(standard);
Equals type = new Equals<String>();
type.setFieldName("type");
if (!customer.getCustomerType().equals("1")) {
type.setValue(FinancialReportingType.INSTITUTION.name());
} else {
type.setValue(FinancialReportingType.COMPANY.name());
}
parameter.addCriteria(type);
if (projectType.equals("01")) {
String[] values = new String[]{FinancialReportingSubjectCategory.COMPANY_ASSETS.name(), FinancialReportingSubjectCategory.COMPANY_LIABILITIES_AND_OWNERS_EQUITY.name()};
// 企业类资产负债表
InSet categorys = new InSet();
categorys.setFieldName("category");
categorys.setValue(values);
parameter.addCriteria(categorys);
} else if (projectType.equals("02")) {
// 企业类现金流表
Equals category = new Equals<>();
category.setFieldName("category");
category.setValue(FinancialReportingSubjectCategory.COMPANY_CASH_FLOWS.name());
parameter.addCriteria(category);
} else if (projectType.equals("03")) {
// 企业类损益表
Equals category = new Equals<>();
category.setFieldName("category");
category.setValue(FinancialReportingSubjectCategory.COMPANY_PROFIT.name());
parameter.addCriteria(category);
} else if (projectType.equals("11")) {
// 事业类资产负债表
InSet categorys = new InSet();
categorys.setFieldName("category");
categorys.setValue(new String[]{FinancialReportingSubjectCategory.INSTITUTION_ASSETS.name(), FinancialReportingSubjectCategory.INSTITUTION_LIABILITIES_AND_NET_ASSETS.name()});
parameter.addCriteria(categorys);
} else if (projectType.equals("12")) {
// 事业类收入支出表
InSet categorys = new InSet();
categorys.setFieldName("category");
categorys.setValue(new String[]{FinancialReportingSubjectCategory.INSTITUTION_INCOME_AND_EXPENSES.name(), FinancialReportingSubjectCategory.INSTITUTION_CASH_FLOWS.name()});
parameter.addCriteria(categorys);
sortList = new ArrayList();
sortList.add("-category");
sortList.add("row");
parameter.setSortBy(sortList);
}
return financialReportingSubjectService.list(parameter);
}
private void addCriteria(List<String> reportIds, QueryParameter queryParameter) throws Exception {
InSet inSet = new InSet();
@ -107,17 +199,16 @@ public class FinanceReportDetailServiceImpl extends DaoServiceImpl<FinanceReport
/**
* 根据客户ID查询最新多期报表ID企业类3期其他4期
* @param custId
* @param customer
* @return
* @throws Exception
*/
private List<String> getReportIds(String custId) throws Exception {
RatingCompanyCustomer customer = ratingCompanyCustomerService.findById(custId);
private List<String> getReportIds(RatingCompanyCustomer customer) throws Exception {
Integer periodNum = 3;
if (!customer.getCustomerType().equals("1")) {
periodNum = 4;
}
List<FinanceReport> reports = financeReportRepository.findByCustIdOrderByEndDateDesc(custId);
List<FinanceReport> reports = financeReportRepository.findByCustIdOrderByEndDateDesc(customer.getId());
List<String> reportIds = new ArrayList<>();
if (reports!=null && reports.size() > 0) {
if (reports.size() <= periodNum) {

14
irbs.cust.rating/src/main/java/irbs/cust/rating/service/impl/FinanceReportIndexServiceImpl.java

@ -1,8 +1,9 @@
package irbs.cust.rating.service.impl;
import io.sc.engine.rule.client.spring.service.ExecutorFactoryService;
import io.sc.engine.rule.core.ExecuteResult;
import io.sc.engine.rule.core.ParameterResult;
import io.sc.engine.rule.core.ResourceResult;
import io.sc.engine.rule.core.client.Executor;
import io.sc.platform.mvc.service.SystemParameterService;
import irbs.cust.rating.jpa.entity.FinanceReport;
import irbs.cust.rating.jpa.entity.FinanceReportDetail;
@ -15,9 +16,6 @@ import irbs.cust.rating.service.FinanceReportService;
import liquibase.repackaged.org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import io.sc.engine.rule.client.Executor;
import io.sc.engine.rule.client.ExecutorBuilder;
import io.sc.engine.rule.client.enums.ExecutorMode;
import java.math.BigDecimal;
import java.util.ArrayList;
@ -88,8 +86,8 @@ public class FinanceReportIndexServiceImpl implements FinanceReportIndexService
}
kiMap.put("QYCB1",lastMap);
// 调用模型引擎
Executor executor = executorFactoryService.getExecutor();
ResourceResult result = executor.executeByCode("QYCW_ZB",null,kiMap);
Executor executor = executorFactoryService.getClientExecutor();
ExecuteResult result = executor.executeByCode("QYCW_ZB",null,kiMap);
if(result != null && CollectionUtils.isNotEmpty(result.getData())) {
List<ParameterResult> results = result.getData();
List<FinanceReportResult> res = new ArrayList<>();
@ -177,8 +175,8 @@ public class FinanceReportIndexServiceImpl implements FinanceReportIndexService
// 调用模型引擎
// String modelResourceUrl = systemParameterService.getParameter("parameter.irbs.engine.remote.config.re.url");
// Executor executor = new ExecutorBuilder().executor(ExecutorMode.REMOTE).url(modelResourceUrl).build();
Executor executor = executorFactoryService.getExecutor();
ResourceResult result = executor.executeByCode("SYCW_ZB",null,kiMap);
Executor executor = executorFactoryService.getClientExecutor();
ExecuteResult result = executor.executeByCode("SYCW_ZB",null,kiMap);
if(result != null && CollectionUtils.isNotEmpty(result.getData())) {
List<ParameterResult> results = result.getData();
List<FinanceReportResult> res = new ArrayList<>();

16
irbs.cust.rating/src/main/java/irbs/cust/rating/service/impl/MainScaleVersionServiceImpl.java

@ -69,14 +69,14 @@ public class MainScaleVersionServiceImpl extends DaoServiceImpl<MainScaleVersion
@Override
public ProcessTaskWrapper findTaskByProcInstId(String procInstId) throws Exception {
ProcessTaskWrapper taskWrapper = null;
// QueryParameter parameter = new QueryParameter();
// parameter.setPageable(false);
// Equals eq = new Equals();
// eq.setFieldName("processInstanceId");
// eq.setValue(procInstId);
// parameter.addCriteria(eq);
// List<ProcessTaskWrapper> list = processQueryService.queryProcessTasks(parameter).getContent();
List<ProcessTaskWrapper> list = processQueryService.queryProcessTasks(procInstId, null);
QueryParameter parameter = new QueryParameter();
parameter.setPageable(false);
Equals eq = new Equals();
eq.setFieldName("processInstanceId");
eq.setValue(procInstId);
parameter.addCriteria(eq);
List<ProcessTaskWrapper> list = processQueryService.queryProcessTasks(parameter).getContent();
// List<ProcessTaskWrapper> list = processQueryService.queryProcessTasks(procInstId, null);
if (null != list && list.size() > 1) {
// 同一个流程实例查找出多个任务则为多实例任务,还需再根据任务处理人匹配。
List<ProcessTaskWrapper> userTaskList = list.stream().filter(task-> SecurityUtil.getLoginName().equals(task.getAssignee())).collect(Collectors.toList());

15
irbs.cust.rating/src/main/java/irbs/cust/rating/service/impl/ModelLibServiceImpl.java

@ -1,25 +1,20 @@
package irbs.cust.rating.service.impl;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.sc.engine.rule.client.enums.LoaderMode;
import io.sc.engine.rule.client.spring.service.ExecutorFactoryService;
import io.sc.engine.rule.core.ExecuteResult;
import io.sc.engine.rule.core.ParameterResult;
import io.sc.engine.rule.core.ResourceResult;
import io.sc.engine.rule.core.client.Executor;
import io.sc.engine.rule.core.code.ExecuteUnit;
import io.sc.engine.rule.core.code.ExecuteUnit4Resource;
import io.sc.engine.rule.core.enums.ParameterType;
import io.sc.engine.rule.server.resource.service.support.ResourceWrapper;
import io.sc.platform.mvc.service.SystemParameterService;
import irbs.cust.rating.jpa.entity.RatingCompanyCustomer;
import irbs.cust.rating.service.FinanceReportService;
import irbs.cust.rating.service.ModelLibService;
import irbs.cust.rating.util.DateUtil;
import liquibase.repackaged.org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import io.sc.engine.rule.client.Executor;
import io.sc.engine.rule.client.ExecutorBuilder;
import io.sc.engine.rule.client.enums.ExecutorMode;
import io.sc.engine.rule.core.po.resource.ModelResource;
import java.util.HashMap;
@ -72,14 +67,14 @@ public class ModelLibServiceImpl implements ModelLibService {
params.put(custCode, ratingCustomer.getId());
// 模型路由结果
ResourceResult result;
ExecuteResult result;
String callModelCode = "";
try {
// Map<String, String> parameterMap = systemParameterService.getParameters(new String[]{"parameter.re.client.remoteApiUrl","parameter.re.client.loaderMode","parameter.re.client.executorMode"});
// ExecutorMode executorMode = ExecutorMode.valueOf(parameterMap.get("parameter.re.client.executorMode"));
// LoaderMode loaderMode = LoaderMode.valueOf(parameterMap.get("parameter.re.client.loaderMode"));
// String remoteApiUrl = parameterMap.get("parameter.re.client.remoteApiUrl");
Executor executor = executorFactoryService.getExecutor();
Executor executor = executorFactoryService.getClientExecutor();
// TODO 灰度模型
if (grayFlag) {
@ -120,7 +115,7 @@ public class ModelLibServiceImpl implements ModelLibService {
public ModelResource getModelResource(String modelCode) throws Exception {
// String modelResourceUrl = systemParameterService.getParameter("parameter.irbs.engine.remote.config.re.url");
// Executor executor = new ExecutorBuilder().executor(ExecutorMode.REMOTE).url(modelResourceUrl).build();
Executor executor = executorFactoryService.getExecutor();
Executor executor = executorFactoryService.getClientExecutor();
ExecuteUnit resourceWrapper = executor.getLoader().load(modelCode, null);
if(resourceWrapper != null) {
if(resourceWrapper instanceof ExecuteUnit4Resource) {

62
irbs.cust.rating/src/main/java/irbs/cust/rating/service/impl/RatingIndexServiceImpl.java

@ -1,10 +1,16 @@
package irbs.cust.rating.service.impl;
import io.sc.engine.rule.client.spring.service.ExecutorFactoryService;
import io.sc.engine.rule.core.ExecuteResult;
import io.sc.engine.rule.core.ParameterResult;
import io.sc.engine.rule.core.ResourceResult;
import io.sc.engine.rule.core.client.Executor;
import io.sc.engine.rule.core.enums.ParameterType;
import io.sc.engine.rule.core.po.model.Model;
import io.sc.engine.rule.core.po.model.Parameter;
import io.sc.engine.rule.core.po.model.ParameterInOptionAddtion;
import io.sc.engine.rule.core.po.model.ParameterInOptionItem;
import io.sc.engine.rule.core.po.model.parameter.InOptionParameter;
import io.sc.engine.rule.core.po.model.parameter.IndicatorParameter;
import io.sc.platform.jdbc.sql.condition.Condition;
import io.sc.platform.lcdp.form.service.JdbcTemplateService;
import io.sc.platform.mvc.service.SystemParameterService;
import io.sc.platform.orm.service.impl.DaoServiceImpl;
@ -16,6 +22,7 @@ import irbs.cust.rating.enums.ModelReturnCode;
import irbs.cust.rating.enums.RatingStepType;
import irbs.cust.rating.jpa.entity.*;
import irbs.cust.rating.jpa.repository.RatingIndexRepository;
import irbs.cust.rating.jpa.repository.RatingQualIndexAddtionRepository;
import irbs.cust.rating.jpa.repository.RatingStepRepository;
import irbs.cust.rating.service.*;
import irbs.cust.rating.util.CommonUtils;
@ -23,14 +30,6 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.stereotype.Service;
import io.sc.engine.rule.client.Executor;
import io.sc.engine.rule.client.ExecutorBuilder;
import io.sc.engine.rule.client.enums.ExecutorMode;
import io.sc.engine.rule.core.enums.ParameterType;
import io.sc.engine.rule.core.po.model.Model;
import io.sc.engine.rule.core.po.model.Parameter;
import io.sc.engine.rule.core.po.model.ParameterInOptionItem;
import io.sc.engine.rule.core.po.model.parameter.InOptionParameter;
import java.math.BigDecimal;
import java.util.*;
@ -67,6 +66,8 @@ public class RatingIndexServiceImpl extends DaoServiceImpl<RatingIndex, String,
private SystemParameterService systemParameterService;
@Autowired
private JdbcTemplateService jdbcTemplateService;
@Autowired
private RatingQualIndexAddtionRepository ratingQualIndexAddtionRepository;
@Override
public void genRatingIndexByModel(RatingStep step, List<Model> models, String type) {
@ -144,8 +145,8 @@ public class RatingIndexServiceImpl extends DaoServiceImpl<RatingIndex, String,
String indexName = parameter.getName();
indexName = indexName.replaceAll("输入值", "");
index.setIndexName(indexName);
InOptionParameter InOptionParameter = (InOptionParameter)parameter;
List<ParameterInOptionItem> options = InOptionParameter.getOptions();
InOptionParameter inOptionParameter = (InOptionParameter)parameter;
List<ParameterInOptionItem> options = inOptionParameter.getOptions();
if(options!=null && options.size()>0) {
for (ParameterInOptionItem option : options) {
RatingSelectValuesConfig selectItem = new RatingSelectValuesConfig();
@ -159,6 +160,25 @@ public class RatingIndexServiceImpl extends DaoServiceImpl<RatingIndex, String,
ratingSelectValuesConfigService.getRepository().save(selectItem);
}
}
List<ParameterInOptionAddtion> addtions = inOptionParameter.getAdditons();
if (addtions!=null && addtions.size()>0) {
for (ParameterInOptionAddtion addtion : addtions) {
RatingQualIndexAddtion rqia = new RatingQualIndexAddtion();
rqia.setDefId(defId);
rqia.setCode(addtion.getCode());
rqia.setName(addtion.getName());
rqia.setDescription(addtion.getDescription());
rqia.setComponentType(addtion.getComponentType());
rqia.setCondition(addtion.getCondition());
rqia.setEnable(addtion.getEnable());
rqia.setOrder(addtion.getOrder());
rqia.setRows(3);
rqia.setPrompt(addtion.getPrompt());
rqia.setAttachmentExtNames(addtion.getAttachmentExtendNames());
rqia.setAttachmentMaxCount(addtion.getAttachmentMaxCount());
ratingQualIndexAddtionRepository.save(rqia);
}
}
} else if (ParameterType.INDICATOR.equals(parameter.getType()) && parameter.getCode().endsWith("_SHOW")) {
// TODO 20240717,模型升级,指标类型的数据也存下来
IndicatorParameter indicatorParameter = (IndicatorParameter) parameter;
@ -274,21 +294,21 @@ public class RatingIndexServiceImpl extends DaoServiceImpl<RatingIndex, String,
}
}
// 调用模型引擎
Executor executor = executorFactoryService.getExecutor();
ResourceResult result = executor.executeById(rating.getModelId(), ModelParamCode.DL.getCode(), kiMap);
Executor executor = executorFactoryService.getClientExecutor();
ExecuteResult result = executor.executeById(rating.getModelId(), ModelParamCode.DL.getCode(), kiMap);
indexResultHandler(result, ratingIndexs, rating, false);
// TODO 灰度
String grayModelEnable = systemParameterService.getParameter("parameter.irbs.params.gm.enable");
if ("1".equals(grayModelEnable)) {
ResourceResult grayResult = executor.executeById(rating.getModelIdGray(), ModelParamCode.DL.getCode(), kiMap);
ExecuteResult grayResult = executor.executeById(rating.getModelIdGray(), ModelParamCode.DL.getCode(), kiMap);
indexResultHandler(grayResult, ratingIndexs, rating, true);
}
getRepository().saveAll(ratingIndexs);
return rating;
}
public void indexResultHandler(ResourceResult result, List<RatingIndex> ratingIndexs, CompanyRating rating, Boolean grayFlag) throws Exception {
public void indexResultHandler(ExecuteResult result, List<RatingIndex> ratingIndexs, CompanyRating rating, Boolean grayFlag) throws Exception {
if(result != null && null!=result.getData() && result.getData().size() >0 && null!=ratingIndexs && ratingIndexs.size() >0) {
List<ParameterResult> results = result.getData();
for (ParameterResult parameterResult : results) {
@ -355,6 +375,8 @@ public class RatingIndexServiceImpl extends DaoServiceImpl<RatingIndex, String,
indices.forEach((idx)->{
List<RatingSelectValuesConfig> listOptions = ratingSelectValuesConfigService.getRepository().findByDefIdOrderByOrderNumAsc(idx.getConfigId());
idx.setOptions(listOptions);
List<RatingQualIndexAddtion> listAddtions = ratingQualIndexAddtionRepository.findByDefIdOrderByOrderAsc(idx.getConfigId());
idx.setAddtions(listAddtions);
});
return indices;
}
@ -390,21 +412,21 @@ public class RatingIndexServiceImpl extends DaoServiceImpl<RatingIndex, String,
}
}
// 调用模型引擎
Executor executor = executorFactoryService.getExecutor();
ResourceResult result = executor.executeById(rating.getModelId(),kiMap);
Executor executor = executorFactoryService.getClientExecutor();
ExecuteResult result = executor.executeById(rating.getModelId(),kiMap);
qualIndexResultHandler(result, qualIndexs, rating, false);
// TODO 灰度
String grayModelEnable = systemParameterService.getParameter("parameter.irbs.params.gm.enable");
if ("1".equals(grayModelEnable)) {
ResourceResult grayResult = executor.executeById(rating.getModelIdGray(),kiMap);
ExecuteResult grayResult = executor.executeById(rating.getModelIdGray(),kiMap);
qualIndexResultHandler(grayResult, qualIndexs, rating, true);
}
getRepository().saveAll(qualIndexs);
return rating;
}
public void qualIndexResultHandler(ResourceResult result, List<RatingIndex> qualIndexs, CompanyRating rating, Boolean grayFlag) throws Exception {
public void qualIndexResultHandler(ExecuteResult result, List<RatingIndex> qualIndexs, CompanyRating rating, Boolean grayFlag) throws Exception {
if(result != null && null!=result.getData() && result.getData().size() >0) {
List<ParameterResult> results = result.getData();
for (ParameterResult parameterResult : results) {

12
irbs.cust.rating/src/main/java/irbs/cust/rating/service/impl/RatingQualIndexAddtionServiceImpl.java

@ -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 {
}

2
irbs.cust.rating/src/main/resources/META-INF/platform/plugins/liquibase.json

@ -44,7 +44,7 @@
"locations":[
"classpath:/liquibase/20240326_ALL_TABLES_DDL.xml",
"classpath:/liquibase/20240401_REPORTS_TABLES_DDL.xml",
"classpath:/liquibase/20240401_REPORTS_VIEW.xml"
"classpath:/liquibase/20250714_RPT_VIEW__DDL.xml"
]
},
{

2
irbs.cust.rating/src/main/resources/META-INF/platform/plugins/parameters.json

@ -95,7 +95,7 @@
"id" : "parameter.irbs.params.ratingUI.totalScore",
"parentId" : "parameter.irbs.params.ratingUI",
"code" : "parameter.irbs.params.ratingUI.totalScore",
"defaultValue" : "show",
"defaultValue" : "hide",
"options" : {
"show": "展示",
"hide": "隐藏"

36
irbs.cust.rating/src/main/resources/liquibase/20240321_CUST_RATING_DDL.xml

@ -7,6 +7,19 @@
http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd">
<changeSet id="20240321_CUST_RATING_DDL" author="platform">
<!-- 最大业务流水号记录表 -->
<createTable tableName="T_BUSINESS_CODE" remarks="最大业务流水号记录表">
<column name="ID_" type="java.sql.Types.NVARCHAR(50)" remarks="ID主键">
<constraints primaryKey="true"/>
</column>
<column name="PREFIX_" type="java.sql.Types.NVARCHAR(10)" remarks="前缀(一般为字母,用来标识是什么业务)"></column>
<column name="SUFFIX_" type="java.sql.Types.NVARCHAR(10)" remarks="后缀(包括:YYYYMMDD,YYYYMM)"></column>
<column name="LENGTH_" type="java.sql.Types.SMALLINT" remarks="流水号长度(减掉前缀后缀后的长度,长度为4的示例:R202505280001)"></column>
<column name="LAST_DATE_" type="java.sql.Types.NVARCHAR(20)" remarks="最后获取流水号的时间"></column>
<column name="MAX_NUM_" type="java.sql.Types.SMALLINT" remarks="当前最大序号(每获取一次+1)"></column>
</createTable>
<addUniqueConstraint tableName="T_BUSINESS_CODE" columnNames="PREFIX_,SUFFIX_,LENGTH_"></addUniqueConstraint>
<!-- 公司客户评级主表 -->
<createTable tableName="NS_COMPANY_RATING" remarks="公司客户评级主表">
<column name="ID_" type="java.sql.Types.NVARCHAR(50)" remarks="ID主键">
@ -250,6 +263,29 @@
<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="主键">

439
irbs.cust.rating/src/main/resources/liquibase/20250528_DG_KH_DDL.xml

@ -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>

48
irbs.cust.rating/src/main/resources/liquibase/20250714_RPT_VIEW__DDL.xml

@ -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>

16
irbs.defaultManager/src/main/java/irbs/defaultManager/service/impl/DefaultCognizanceServiceImpl.java

@ -127,14 +127,14 @@ public class DefaultCognizanceServiceImpl extends DaoServiceImpl<DefaultCognizan
public ProcessTaskWrapper findTaskByProcInstId(String procInstId) throws Exception {
ProcessTaskWrapper taskWrapper = null;
// QueryParameter parameter = new QueryParameter();
// parameter.setPageable(false);
// Equals eq = new Equals();
// eq.setFieldName("processInstanceId");
// eq.setValue(procInstId);
// parameter.addCriteria(eq);
// List<ProcessTaskWrapper> list = processQueryService.queryProcessTasks(parameter).getContent();
List<ProcessTaskWrapper> list = processQueryService.queryProcessTasks(procInstId, null);
QueryParameter parameter = new QueryParameter();
parameter.setPageable(false);
Equals eq = new Equals();
eq.setFieldName("processInstanceId");
eq.setValue(procInstId);
parameter.addCriteria(eq);
List<ProcessTaskWrapper> list = processQueryService.queryProcessTasks(parameter).getContent();
// List<ProcessTaskWrapper> list = processQueryService.queryProcessTasks(procInstId, null);
if (null != list && list.size() > 1) {
// 同一个流程实例查找出多个任务则为多实例任务,还需再根据任务处理人匹配。
List<ProcessTaskWrapper> userTaskList = list.stream().filter(task-> SecurityUtil.getLoginName().equals(task.getAssignee())).collect(Collectors.toList());

16
irbs.defaultManager/src/main/java/irbs/defaultManager/service/impl/DefaultRebirthServiceImpl.java

@ -67,14 +67,14 @@ public class DefaultRebirthServiceImpl extends DaoServiceImpl<DefaultRebirth, St
public ProcessTaskWrapper findTaskByProcInstId(String procInstId) throws Exception {
ProcessTaskWrapper taskWrapper = null;
// QueryParameter parameter = new QueryParameter();
// parameter.setPageable(false);
// Equals eq = new Equals();
// eq.setFieldName("processInstanceId");
// eq.setValue(procInstId);
// parameter.addCriteria(eq);
// List<ProcessTaskWrapper> list = processQueryService.queryProcessTasks(parameter).getContent();
List<ProcessTaskWrapper> list = processQueryService.queryProcessTasks(procInstId, null);
QueryParameter parameter = new QueryParameter();
parameter.setPageable(false);
Equals eq = new Equals();
eq.setFieldName("processInstanceId");
eq.setValue(procInstId);
parameter.addCriteria(eq);
List<ProcessTaskWrapper> list = processQueryService.queryProcessTasks(parameter).getContent();
// List<ProcessTaskWrapper> list = processQueryService.queryProcessTasks(procInstId, null);
if (null != list && list.size() > 1) {
// 同一个流程实例查找出多个任务则为多实例任务,还需再根据任务处理人匹配。
List<ProcessTaskWrapper> userTaskList = list.stream().filter(task-> SecurityUtil.getLoginName().equals(task.getAssignee())).collect(Collectors.toList());

16
irbs.feature/src/main/java/irbs/feature/service/impl/CustFeatureCalcBatchServiceImpl.java

@ -1,11 +1,11 @@
package irbs.feature.service.impl;
import io.sc.engine.rule.client.Executor;
import io.sc.engine.rule.client.runtime.impl.groovy.GroovyScriptEngineService;
import io.sc.engine.rule.client.runtime.impl.groovy.GroovyScriptEngineServiceImpl;
import io.sc.engine.rule.client.spring.service.ExecutorFactoryService;
import io.sc.engine.rule.core.ExecuteResult;
import io.sc.engine.rule.core.ParameterResult;
import io.sc.engine.rule.core.ResourceResult;
import io.sc.engine.rule.core.client.Executor;
import io.sc.engine.rule.core.code.ExecuteUnit;
import io.sc.engine.rule.core.code.SourceCode;
import io.sc.engine.rule.core.code.generator.GroovySourceCodeGenerator;
@ -69,7 +69,7 @@ public class CustFeatureCalcBatchServiceImpl implements CustFeatureCalcBatchServ
if(list != null){
DatabaseType type = DatabaseType.fromMetaData(dataSource);
String dbType = type.getProductName();
Executor executor =executorFactoryService.getExecutor();
Executor executor =executorFactoryService.getClientExecutor();
ExecuteUnit resourceWrapper =executor.getLoader().load(SHRCB_LIB_CODE,null);
SourceCode groovySourceCode =new GroovySourceCodeGenerator().generate(SHRCB_LIB_CODE,null,resourceWrapper);
int i = 1;
@ -87,7 +87,7 @@ public class CustFeatureCalcBatchServiceImpl implements CustFeatureCalcBatchServ
executeParameter.put("executor", executor);
executeParameter.put("subModelCode", null);
executeParameter.put("argument", kiMap);
ResourceResult result =(ResourceResult)groovyScriptEngineService.eval(groovySourceCode.getSource(),"INPUT_PARAMETER",executeParameter);
ExecuteResult result=(ExecuteResult)groovyScriptEngineService.eval(groovySourceCode,"INPUT_PARAMETER",executeParameter);
if(result != null && !CollectionUtils.isEmpty(result.getData())) {
List<ParameterResult> results = result.getData();
List<CustFeatureRet> res = new ArrayList<>();
@ -509,8 +509,8 @@ public class CustFeatureCalcBatchServiceImpl implements CustFeatureCalcBatchServ
setModelValue(kiMap, rptVals);
}
}
Executor executor = executorFactoryService.getExecutor();
ResourceResult result = executor.executeByCode("QYCW_ZB", null, kiMap);
Executor executor = executorFactoryService.getClientExecutor();
ExecuteResult result = executor.executeByCode("QYCW_ZB", null, kiMap);
if(result != null && !CollectionUtils.isEmpty(result.getData())) {
List<ParameterResult> results = result.getData();
List<CustFeatureRet> res = new ArrayList<>();
@ -654,8 +654,8 @@ public class CustFeatureCalcBatchServiceImpl implements CustFeatureCalcBatchServ
setModelValue(kiMap, rptVals);
}
}
Executor executor = executorFactoryService.getExecutor();
ResourceResult result = executor.executeByCode("SYCW_ZB",null,kiMap);
Executor executor = executorFactoryService.getClientExecutor();
ExecuteResult result = executor.executeByCode("SYCW_ZB",null,kiMap);
if(result != null && !CollectionUtils.isEmpty(result.getData())) {
List<ParameterResult> results = result.getData();
List<CustFeatureRet> res = new ArrayList<>();

2
irbs.frontend/.npmrc

@ -1,5 +1,5 @@
# npm 仓库地址, 在 npm install 时使用
registry=http://nexus.sc.io:8000/repository/npm-public/
registry=http://58.33.84.154:8000/repository/npm-public/
# 用户邮箱
email=

16
irbs.frontend/package.json

@ -72,18 +72,18 @@
"webpack-merge": "6.0.1"
},
"dependencies": {
"@codemirror/autocomplete": "6.18.4",
"@codemirror/commands": "6.8.0",
"@codemirror/autocomplete": "6.18.6",
"@codemirror/commands": "6.8.1",
"@codemirror/lang-html": "6.4.9",
"@codemirror/lang-java": "6.0.1",
"@codemirror/lang-javascript": "6.2.2",
"@codemirror/lang-javascript": "6.2.3",
"@codemirror/lang-json": "6.0.1",
"@codemirror/lang-sql": "6.8.0",
"@codemirror/lang-xml": "6.1.0",
"@codemirror/language": "6.10.8",
"@codemirror/search": "6.5.8",
"@codemirror/state": "6.5.1",
"@codemirror/view": "6.36.2",
"@codemirror/language": "6.11.0",
"@codemirror/search": "6.5.10",
"@codemirror/state": "6.5.2",
"@codemirror/view": "6.36.5",
"@maxgraph/core": "0.14.0",
"@quasar/extras": "1.16.15",
"@quasar/quasar-ui-qmarkdown": "2.0.5",
@ -111,7 +111,7 @@
"mockjs": "1.1.0",
"node-sql-parser": "5.3.6",
"pinia": "2.3.0",
"platform-core": "v999.999.7",
"platform-core": "8.2.84",
"quasar": "2.17.6",
"sort-array": "5.0.0",
"svg-path-commander": "2.1.7",

3
irbs.frontend/public/engine.svg

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="white" class="bi bi-browser-edge" viewBox="0 0 16 16">
<path d="M3.362 10.11c0 .926-.756 1.681-1.681 1.681S0 11.036 0 10.111.756 8.43 1.68 8.43h1.682zm.846 0c0-.924.756-1.68 1.681-1.68s1.681.756 1.681 1.68v4.21c0 .924-.756 1.68-1.68 1.68a1.685 1.685 0 0 1-1.682-1.68zM5.89 3.362c-.926 0-1.682-.756-1.682-1.681S4.964 0 5.89 0s1.68.756 1.68 1.68v1.682zm0 .846c.924 0 1.68.756 1.68 1.681S6.814 7.57 5.89 7.57H1.68C.757 7.57 0 6.814 0 5.89c0-.926.756-1.682 1.68-1.682zm6.749 1.682c0-.926.755-1.682 1.68-1.682S16 4.964 16 5.889s-.756 1.681-1.68 1.681h-1.681zm-.848 0c0 .924-.755 1.68-1.68 1.68A1.685 1.685 0 0 1 8.43 5.89V1.68C8.43.757 9.186 0 10.11 0c.926 0 1.681.756 1.681 1.68zm-1.681 6.748c.926 0 1.682.756 1.682 1.681S11.036 16 10.11 16s-1.681-.756-1.681-1.68v-1.682h1.68zm0-.847c-.924 0-1.68-.755-1.68-1.68s.756-1.681 1.68-1.681h4.21c.924 0 1.68.756 1.68 1.68 0 .926-.756 1.681-1.68 1.681z"/>
</svg>

After

Width:  |  Height:  |  Size: 970 B

83
irbs.frontend/public/webjars/tailwindcss/3.4.16/tailwind.css.js

File diff suppressed because one or more lines are too long

62
irbs.frontend/public/webjars/tailwindcss/3.4.5/tailwind.css.js

File diff suppressed because one or more lines are too long

4
irbs.frontend/src/boostrap.ts

@ -15,10 +15,12 @@ import App from './App.vue';
import 'platform-core/dist/css/platform-core.css';
// 导入 tailwind utilities css
import 'tailwindcss/utilities.css';
// 导入 quasar-ui-qmarkdown css
import '@quasar/quasar-ui-qmarkdown/dist/index.css';
// 设置远程组件加载器
// 覆盖 platform-core 包中的 remoteComponentLoader 函数
// 只有在主前端项目中编写如下的 remoteComponentLoader 函数才能实现 webpack MF 的 shared 功能
// 只有在主前端项目中编写如下的 remoteComponentLoader 函数才能实现 webpack Module Federation 的 shared 功能
ComponentManager.setRemoteComponentLoader((moduleName: string, componentName: string): any => {
return async () => {
await __webpack_init_sharing__('default');

12
irbs.frontend/src/components/index.ts

@ -6,9 +6,9 @@ import irbs_irbsHome from '@/views/IrbsHome.vue';
import irbs_todoTask from '@/views/workbench/TodoTask.vue';
import irbs_doneTask from '@/views/workbench/DoneTask.vue';
import irbs_endTask from '@/views/workbench/EndTask.vue';
import irbs_custRating from '@/views/custRating/CustRating.vue';
import irbs_custSeparateRating from '@/views/custRating/CustSeparateRating.vue';
import irbs_financialRating from '@/views/custRating/FinancialRating.vue';
import irbs_company_custRating from '@/views/custRating/company/RatingGrid.vue';
import irbs_company_apply from '@/views/custRating/company/Apply.vue';
import irbs_company_mockCmis from '@/views/custRating/mock/MockCmis.vue';
import irbs_cognizanceApply from '@/views/default/CognizanceApply.vue';
import irbs_rebirthApply from '@/views/default/RebirthApply.vue';
import irbs_lgdQuery from '@/views/debtRating/LgdQuery.vue';
@ -50,9 +50,9 @@ const localComponents = {
'irbs.todoTask': irbs_todoTask,
'irbs.doneTask': irbs_doneTask,
'irbs.endTask': irbs_endTask,
'irbs.custRating': irbs_custRating,
'irbs.custSeparateRating': irbs_custSeparateRating,
'irbs.financialRating': irbs_financialRating,
'irbs.company.custRating': irbs_company_custRating,
'irbs.company.apply': irbs_company_apply,
'irbs.company.mockCmis': irbs_company_mockCmis,
'irbs.cognizanceApply': irbs_cognizanceApply,
'irbs.rebirthApply': irbs_rebirthApply,
'irbs.lgdQuery': irbs_lgdQuery,

8
irbs.frontend/src/remote-components/remote-components.json

@ -0,0 +1,8 @@
[
/*
{
"component": "组件名称",
"componentPath": "组件 .vue 文件路径"
}
*/
]

27
irbs.frontend/src/routes/routes.json

@ -66,6 +66,7 @@
"children": []
},
{
"force": true,
"parent": "/",
"name": "route.irbs.rating.apply",
"path": "/irbs/rating/apply",
@ -92,32 +93,6 @@
},
"children": []
},
{
"name": "route.irbs.custRating.custSeparateRating",
"path": "irbs/custSeparateRating",
"parent": "/",
"priority": -1,
"component": "irbs.custSeparateRating",
"componentPath": "@/views/custRating/CustSeparateRating.vue",
"redirect": null,
"meta": {
"permissions": ["/example/**/*"]
},
"children": []
},
{
"name": "route.irbs.custRating.financialRating",
"path": "irbs/financialRating",
"parent": "/",
"priority": -1,
"component": "irbs.financialRating",
"componentPath": "@/views/custRating/FinancialRating.vue",
"redirect": null,
"meta": {
"permissions": ["/example/**/*"]
},
"children": []
},
{
"name": "route.irbs.default.cognizance",
"path": "irbs/cognizanceApply",

167
irbs.frontend/src/views/custRating/CustRating.ts

@ -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;
};

218
irbs.frontend/src/views/custRating/CustRating.vue

@ -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>

5
irbs.frontend/src/views/custRating/CustSeparateRating.vue

@ -1,5 +0,0 @@
<template>
<div>111</div>
</template>
<script setup lang="ts"></script>

5
irbs.frontend/src/views/custRating/FinancialRating.vue

@ -1,5 +0,0 @@
<template>
<div>111</div>
</template>
<script setup lang="ts"></script>

349
irbs.frontend/src/views/custRating/GrayModelDialog.vue

@ -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>

186
irbs.frontend/src/views/custRating/LaunchRatingDialog.vue

@ -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>

2060
irbs.frontend/src/views/custRating/RatingDialog.vue

File diff suppressed because it is too large

31
irbs.frontend/src/views/custRating/RatingLevel.vue

@ -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>

69
irbs.frontend/src/views/custRating/company/AnnotationButton.vue

@ -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>

33
irbs.frontend/src/views/custRating/company/GrayModelDialog.vue

@ -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>

45
irbs.frontend/src/views/custRating/company/RatingDialog.vue

@ -1,38 +1,20 @@
<template>
<w-dialog ref="dialogRef" width="95%" height="95%" body-padding="0px 0px 0px 0px" @hide="hideEvent">
<w-dialog ref="dialogRef" width="98%" height="98%" body-padding="0px 0px 0px 0px" @hide="hideEvent">
<template #title>
<div>
<span class="text-xl">客户评级</span>
<span class="text-3xl">
{{ custInfoData['custName'] }}
<q-badge color="orange" align="top">客户号{{ custInfoData['custNo'] }}</q-badge
>&nbsp; <q-badge color="green" align="top">上市</q-badge>&nbsp;
<q-badge color="red" align="top">{{ Formater.dictionary(dictionary.customerSize)(custInfoData['customerSize']) }}</q-badge
>&nbsp; <q-badge align="top">{{ Formater.dictionary(dictionary.registeredType)(custInfoData['registeredType']) }}</q-badge
>&nbsp; <q-badge color="secondary" align="top">{{ custInfoData['groupCustInd'] === '1' ? '集团客户' : '非集团客户' }}</q-badge
>&nbsp;
<q-badge v-if="custInfoData['groupCustInd'] === '1'" align="top"
>集团成员类别{{ Formater.dictionary(dictionary.memberTypeCd)(custInfoData['memberType']) }}</q-badge
><template v-if="custInfoData['groupCustInd'] === '1'">&nbsp;</template>
<q-badge color="blue" align="top">行业{{ custInfoData['industryTypeName'] }}</q-badge
>&nbsp; <q-badge color="brown" align="top">成立日期{{ custInfoData['buildDate'] }}</q-badge
>&nbsp;
</span>
<CustBaseInfo :cust-id="custId"></CustBaseInfo>
</div>
</template>
<RatingPage :rating-data="props.ratingData" :read-mode="props.readMode" @after-complete="afterComplete"></RatingPage>
<ShrcbIndex :rating-data="props.ratingData" :read-mode="props.readMode" @after-complete="afterComplete"></ShrcbIndex>
</w-dialog>
</template>
<script setup lang="ts">
import { ref, computed, nextTick } from 'vue';
import { axios, Environment, Formater } from 'platform-core';
import RatingPage from './RatingPage.vue';
import { Dictionary } from './ts/Dictionary';
import { ref, nextTick } from 'vue';
import CustBaseInfo from '@/views/custRating/company/components/CustBaseInfo.vue';
import ShrcbIndex from '@/views/custRating/company/template/shrcb/Index.vue';
const dialogRef = ref();
const custInfoData = ref({});
const dictionary = new Dictionary();
const custId = ref('');
const props = defineProps({
ratingData: {
type: Object,
@ -47,22 +29,13 @@ const props = defineProps({
});
const emit = defineEmits(['refresh']);
const titleComputed = computed(() => {
return `公司客户评级 客户:` + props.ratingData['custName'] + ` 评级模型:` + (props.ratingData['modelName'] || '');
});
/**
* 显示评级窗口
*/
const show = () => {
dialogRef.value.show();
nextTick(() => {
const custId = props.ratingData['custId'];
axios.get(Environment.apiContextPath('api/irbs/ratingCompanyCustomer/' + custId)).then((resp) => {
if (resp && resp.data) {
custInfoData.value = resp.data;
}
});
custId.value = props.ratingData['custId'];
});
};
/**
@ -88,6 +61,4 @@ defineExpose({
show,
hide,
});
await dictionary.load();
</script>

23
irbs.frontend/src/views/custRating/company/RatingManager.vue

@ -106,7 +106,7 @@
{ label: '评级状态', name: 'ratingStatus', type: 'w-select', options: Options.enum(RatingStatusEnum) },
]"
:columns="[
{ name: 'id', label: '申请编号', align: 'center' },
{ name: 'triggerRea', label: '申请编号', align: 'center' },
{ name: 'custNo', label: '客户号', align: 'center' },
{ name: 'custName', label: '客户名称', width: 150 },
{ name: 'industryTypeName', label: '行业类型' },
@ -117,25 +117,13 @@
{
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 round(val * 100, 2) + '%';
}
return val;
},
@ -156,13 +144,12 @@
</template>
<script setup lang="ts">
import { ref, nextTick, onMounted } from 'vue';
import { ref, onMounted } from 'vue';
import { useQuasar } from 'quasar';
import { axios, EnumTools, Environment, Formater, noErrorAxios, NotifyManager, Options, SessionManager, Tools, ServerExceptionHandler } from 'platform-core';
import { RatingLevelOptions, RatingProcessStatus, Round } from '../CustRating.ts';
import GrayModelDialog from '../GrayModelDialog.vue';
import { RatingLevelOptions, RatingProcessStatus, round } from '@/views/custRating/company/ts/Utils';
import GrayModelDialog from './GrayModelDialog.vue';
import RatingDialog from './RatingDialog.vue';
import RatingLevel from '../RatingLevel.vue';
import CustSelectDialog from './CustSelectDialog.vue';
import LoadingDialog from '@/views/components/LoadingDialog.vue';

58
irbs.frontend/src/views/custRating/company/Step.vue

@ -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>

48
irbs.frontend/src/views/custRating/company/WorkflowButton.vue

@ -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>

2
irbs.frontend/src/views/custRating/company/content/AdjustItemGrid.vue → irbs.frontend/src/views/custRating/company/components/AdjustItemGrid.vue

@ -57,7 +57,7 @@
</template>
<script setup lang="ts">
import { inject, ref } from 'vue';
import { Rating } from '../ts/Rating';
import { Rating } from '@/views/custRating/company/ts/Rating';
const rating = <Rating>inject('rating');
const adjustItemGridRef = ref();

4
irbs.frontend/src/views/custRating/company/content/AdjustItemIndex.vue → irbs.frontend/src/views/custRating/company/components/AdjustItemIndex.vue

@ -1,5 +1,5 @@
<template>
<w-splitter :size="34" horizontal unit="px" disable class="h-full">
<w-splitter :model-value="34" horizontal unit="px" disable class="h-full">
<template #before>
<w-card-panel
label="评级调整项详情"
@ -31,6 +31,6 @@
</template>
<script setup lang="ts">
import { inject } from 'vue';
import { Rating } from '../ts/Rating';
import { Rating } from '@/views/custRating/company/ts/Rating';
const rating = <Rating>inject('rating');
</script>

2
irbs.frontend/src/views/custRating/company/content/CreditReportGrid.vue → irbs.frontend/src/views/custRating/company/components/CreditReportGrid.vue

@ -27,7 +27,7 @@
<script setup lang="ts">
import { ref, inject } from 'vue';
import { Formater, Environment } from 'platform-core';
import { Rating } from '../ts/Rating';
import { Rating } from '@/views/custRating/company/ts/Rating';
const rating = <Rating>inject('rating');
const creditReportGridRef = ref();

42
irbs.frontend/src/views/custRating/company/components/CustBaseInfo.vue

@ -0,0 +1,42 @@
<template>
<span class="text-3xl">
{{ custInfoData['custName'] }}
<q-badge color="orange" align="top">客户号{{ custInfoData['custNo'] }}</q-badge
>&nbsp; <q-badge color="green" align="top">上市</q-badge>&nbsp;
<q-badge color="red" align="top">{{ Formater.dictionary(dictionary.customerSize)(custInfoData['customerSize']) }}</q-badge
>&nbsp; <q-badge align="top">{{ Formater.dictionary(dictionary.registeredType)(custInfoData['registeredType']) }}</q-badge
>&nbsp; <q-badge color="secondary" align="top">{{ custInfoData['groupCustInd'] === '1' ? '集团客户' : '非集团客户' }}</q-badge
>&nbsp;
<q-badge v-if="custInfoData['groupCustInd'] === '1'" align="top"
>集团成员类别{{ Formater.dictionary(dictionary.memberTypeCd)(custInfoData['memberType']) }}</q-badge
><template v-if="custInfoData['groupCustInd'] === '1'">&nbsp;</template>
<q-badge color="blue" align="top">行业{{ custInfoData['industryTypeName'] }}</q-badge
>&nbsp; <q-badge color="brown" align="top">成立日期{{ custInfoData['buildDate'] }}</q-badge
>&nbsp;
</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>

4
irbs.frontend/src/views/custRating/company/content/DefaultCognizanceGrid.vue → irbs.frontend/src/views/custRating/company/components/DefaultCognizanceGrid.vue

@ -39,8 +39,8 @@
<script setup lang="ts">
import { Environment } from 'platform-core';
import { inject } from 'vue';
import { Constant } from '../ts/Constant';
import { Rating } from '../ts/Rating';
import { Constant } from '@/views/custRating/company/ts/Constant';
import { Rating } from '@/views/custRating/company/ts/Rating';
const rating = <Rating>inject('rating');
</script>

4
irbs.frontend/src/views/custRating/company/content/DefaultRebirthGrid.vue → irbs.frontend/src/views/custRating/company/components/DefaultRebirthGrid.vue

@ -38,8 +38,8 @@
<script setup lang="ts">
import { Environment } from 'platform-core';
import { inject } from 'vue';
import { Constant } from '../ts/Constant';
import { Rating } from '../ts/Rating';
import { Constant } from '@/views/custRating/company/ts/Constant';
import { Rating } from '@/views/custRating/company/ts/Rating';
const rating = <Rating>inject('rating');
</script>

6
irbs.frontend/src/views/custRating/company/content/FinanceProjectCompare.vue → irbs.frontend/src/views/custRating/company/components/FinanceProjectCompare.vue

@ -1,10 +1,10 @@
<template>
<div v-if="!Tools.isEmpty(valueComputed)">{{ formatAmt(valueComputed) }} <q-icon :name="iconComputed?.name" :color="iconComputed?.color"></q-icon></div>
<div v-if="!Tools.isEmpty(valueComputed)">{{ RatioFormat(valueComputed) }} <q-icon :name="iconComputed?.name" :color="iconComputed?.color"></q-icon></div>
</template>
<script setup lang="ts">
import { computed } from 'vue';
import { Tools } from 'platform-core';
import { formatAmt } from '../ts/Utils';
import { formatAmt, RatioFormat } from '@/views/custRating/company/ts/Utils';
const props = defineProps({
//
@ -30,7 +30,7 @@ const icon = {
const valueComputed = computed(() => {
if (!Tools.isEmpty(props.value) && !Tools.isEmpty(props.previousPeriod)) {
const result = props.value - props.previousPeriod;
const result = (props.value - props.previousPeriod) / props.previousPeriod;
return result;
}
return undefined;

25
irbs.frontend/src/views/custRating/company/content/FinanceProjectGrid.vue → irbs.frontend/src/views/custRating/company/components/FinanceProjectGrid.vue

@ -5,6 +5,7 @@
:hide-bottom="true"
:auto-fetch-data="true"
:dense="true"
:stripe="true"
:fetch-data-url="Environment.apiContextPath('api/irbs/financeReportDetail/query/' + rating.ratingData.value['custId'])"
:checkbox-selection="false"
:sort-no="true"
@ -16,10 +17,10 @@
</template>
<script setup lang="ts">
import { inject, onMounted, computed } from 'vue';
import { Environment } from 'platform-core';
import { Rating } from '../ts/Rating';
import FinanceProjectCompare from './FinanceProjectCompare.vue';
import { formatAmt } from '../ts/Utils';
import { Environment, Tools } from 'platform-core';
import { Rating } from '@/views/custRating/company/ts/Rating';
import FinanceProjectCompare from '@/views/custRating/company/components/FinanceProjectCompare.vue';
import { formatAmt } from '@/views/custRating/company/ts/Utils';
const rating = <Rating>inject('rating');
const props = defineProps({
@ -29,7 +30,21 @@ const props = defineProps({
const columnsComputed = computed(() => {
const columns = <any>[
{ name: 'code', label: '科目编码' },
{ name: 'name', label: '科目名称' },
{
name: 'name',
label: '科目名称',
title: (title_) => {
return title_;
},
format: (value: any, row: any) => {
if (value) {
if (!Tools.isNill(row.tab)) {
return "<span style='padding-left:" + row.tab * 20 + "px;'>" + value + '</span>';
}
}
return value;
},
},
];
if (rating.financeReport.value.length > 0) {
const columnNames = ['value', 'previousPeriodvalue', 'previousPeriod2value', 'previousPeriod3value'];

9
irbs.frontend/src/views/custRating/company/content/FinanceReportTabs.vue → irbs.frontend/src/views/custRating/company/components/FinanceReportTabs.vue

@ -1,6 +1,6 @@
<template>
<div class="h-full">
<w-splitter :size="36" horizontal class="h-full" unit="px" disable>
<w-splitter :model-value="36" horizontal class="h-full" unit="px" disable>
<template #before>
<q-tabs v-model="tab" inline-label dense indicator-color="amber" align="right" active-color="amber">
<template v-for="report in financeReport.tabsComputed.value" :key="report.value">
@ -28,10 +28,9 @@
</template>
<script setup lang="ts">
import { inject, ref } from 'vue';
import { Environment, Formater } from 'platform-core';
import { Rating } from '../ts/Rating';
import { FinanceReport, Constant } from '../ts/FinanceReport';
import FinanceProjectGrid from './FinanceProjectGrid.vue';
import { FinanceReport } from '@/views/custRating/company/ts/FinanceReport';
import { Rating } from '@/views/custRating/company/ts/Rating';
import FinanceProjectGrid from '@/views/custRating/company/components/FinanceProjectGrid.vue';
const rating = <Rating>inject('rating');
const financeReport = new FinanceReport();

4
irbs.frontend/src/views/custRating/company/content/FirstRatingResult.vue → irbs.frontend/src/views/custRating/company/components/FirstRatingResult.vue

@ -16,8 +16,8 @@
</template>
<script setup lang="ts">
import { inject, computed } from 'vue';
import { Rating } from '../ts/Rating';
import RatingLevelSlider from '../../RatingLevelSlider.vue';
import { Rating } from '@/views/custRating/company/ts/Rating';
import RatingLevelSlider from './RatingLevelSlider.vue';
const rating = <Rating>inject('rating');
const firstRatingLevelComputed = computed(() => {

4
irbs.frontend/src/views/custRating/company/content/HistRatingGrid.vue → irbs.frontend/src/views/custRating/company/components/HistRatingGrid.vue

@ -44,8 +44,8 @@
<script setup lang="ts">
import { Environment, Formater } from 'platform-core';
import { inject } from 'vue';
import { Constant } from '../ts/Constant';
import { Rating } from '../ts/Rating';
import { Constant } from '@/views/custRating/company/ts/Constant';
import { Rating } from '@/views/custRating/company/ts/Rating';
const rating = <Rating>inject('rating');
</script>

10
irbs.frontend/src/views/custRating/company/content/HistTab.vue → irbs.frontend/src/views/custRating/company/components/HistTab.vue

@ -1,6 +1,6 @@
<template>
<div class="h-full">
<w-splitter :size="36" horizontal class="h-full" unit="px" disable>
<w-splitter :model-value="36" horizontal class="h-full" unit="px" disable>
<template #before>
<q-tabs v-model="tab" inline-label dense indicator-color="amber" align="left" active-color="amber">
<template v-for="item in HistGird.tabs" :key="item.value">
@ -24,10 +24,10 @@
</template>
<script setup lang="ts">
import { ref } from 'vue';
import { HistGird } from '../ts/HistGrid';
import HistRatingGrid from './HistRatingGrid.vue';
import DefaultCognizanceGrid from './DefaultCognizanceGrid.vue';
import DefaultRebirthGrid from './DefaultRebirthGrid.vue';
import { HistGird } from '@/views/custRating/company/ts/HistGrid';
import HistRatingGrid from '@/views/custRating/company/components/HistRatingGrid.vue';
import DefaultCognizanceGrid from '@/views/custRating/company/components/DefaultCognizanceGrid.vue';
import DefaultRebirthGrid from '@/views/custRating/company/components/DefaultRebirthGrid.vue';
const tab = ref(HistGird.type.histRating.value);
</script>

4
irbs.frontend/src/views/custRating/company/content/OpinionGrid.vue → irbs.frontend/src/views/custRating/company/components/OpinionGrid.vue

@ -31,8 +31,8 @@
<script setup lang="ts">
import { inject, ref } from 'vue';
import { Environment, Formater } from 'platform-core';
import { Rating } from '../ts/Rating';
import { RatingProcessOperationStatus } from '../../CustRating';
import { Rating } from '@/views/custRating/company/ts/Rating';
import { RatingProcessOperationStatus } from '@/views/custRating/company/ts/Utils';
const rating = <Rating>inject('rating');
const overturnFormRef = ref();

4
irbs.frontend/src/views/custRating/company/content/Overturn.vue → irbs.frontend/src/views/custRating/company/components/Overturn.vue

@ -52,8 +52,8 @@
<script setup lang="ts">
import { Options } from 'platform-core';
import { computed, ref, inject } from 'vue';
import { RatingLevelOptions } from '../../CustRating';
import { Rating } from '../ts/Rating';
import { RatingLevelOptions } from '@/views/custRating/company/ts/Utils';
import { Rating } from '@/views/custRating/company/ts/Rating';
const rating = <Rating>inject('rating');
const overturnFormRef = ref();

11
irbs.frontend/src/views/custRating/company/components/QualAddtionView.vue

@ -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>

162
irbs.frontend/src/views/custRating/company/components/QualAnalysis.vue

@ -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>

6
irbs.frontend/src/views/custRating/company/content/QuanAnalysis.vue → irbs.frontend/src/views/custRating/company/components/QuanAnalysis.vue

@ -1,5 +1,5 @@
<template>
<w-splitter :size="34" horizontal unit="px" disable class="h-full">
<w-splitter :model-value="34" horizontal unit="px" disable class="h-full">
<template #before>
<w-card-panel label="定量分析" :bordered="false" :title-mode="true" icon="bar_chart" :icon-attrs="{ color: 'teal' }" color="teal"></w-card-panel>
</template>
@ -35,8 +35,8 @@
<script setup lang="ts">
import { Tools } from 'platform-core';
import { inject } from 'vue';
import { Rating } from '../ts/Rating';
import { round } from '../ts/Utils';
import { Rating } from '@/views/custRating/company/ts/Rating';
import { round } from '@/views/custRating/company/ts/Utils';
const rating = <Rating>inject('rating');
</script>

2
irbs.frontend/src/views/custRating/RatingLevelSlider.vue → irbs.frontend/src/views/custRating/company/components/RatingLevelSlider.vue

@ -14,7 +14,7 @@
</template>
<script setup lang="ts">
import { ref, computed } from 'vue';
import { RatingLevelOptions } from './CustRating';
import { RatingLevelOptions } from '@/views/custRating/company/ts/Utils';
const modelValue = defineModel<string>();
const minLevel = ref(RatingLevelOptions.find((item) => item.value === 'D')?.numberValue);

36
irbs.frontend/src/views/custRating/company/components/ReportIndex.vue

@ -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>

54
irbs.frontend/src/views/custRating/company/content/ReportRating.vue → irbs.frontend/src/views/custRating/company/components/ReportRating.vue

@ -1,44 +1,4 @@
<template>
<!-- <w-card-panel label="评级结果" :bordered="false">
<div class="flex">
<div class="flex-1 text-center">
<div>模型名称</div>
<div :class="valueClassComputed">
<q-chip outline square size="md" :clickable="false" :ripple="false" :label="rating.ratingData.value['modelName']" />
</div>
</div>
<div class="flex-1 text-center">
<div>模型级别</div>
<div :class="valueClassComputed">
<q-chip outline square size="md" :clickable="false" :ripple="false" :label="rating.ratingData.value['modelLevel']" />
</div>
</div>
<div class="flex-1 text-center">
<div>调整后级别</div>
<div v-if="rating.ratingData.value['adjLevel']" :class="valueClassComputed">
<q-chip outline square size="md" :clickable="false" :ripple="false" :label="rating.ratingData.value['adjLevel']" />
</div>
</div>
<div class="flex-1 text-center">
<div>推翻级别</div>
<div v-if="rating.ratingData.value['tf']" :class="valueClassComputed">
<q-chip outline square size="md" :clickable="false" :ripple="false" :label="rating.ratingData.value['tf']" />
</div>
</div>
<div class="flex-1 text-center">
<div>最终认定级别</div>
<div v-if="rating.ratingData.value['finalLevel']" :class="valueClassComputed">
<q-chip outline square size="md" :clickable="false" :ripple="false" :label="rating.ratingData.value['finalLevel']" />
</div>
</div>
<div class="flex-1 text-center">
<div>客户经理</div>
<div v-if="rating.ratingData.value['managerName']" :class="valueClassComputed">
<q-chip outline square size="md" :clickable="false" :ripple="false" :label="rating.ratingData.value['managerName']" />
</div>
</div>
</div>
</w-card-panel> -->
<div class="flex">
<div class="flex-1">
<div :class="classComputed">
@ -49,19 +9,19 @@
<div :class="itemClassComputed">
<div :class="labelClassComputed">模型评级等级</div>
<div :class="valueClassComputed" @mouseover="handleHover('.rr-modelLevel', rating.ratingData.value['modelLevel'])" @mouseout="handleOut">
<span class="rr-modelLevel underline">{{ rating.ratingData.value['modelLevel'] }}</span>
<span class="rr-modelLevel">{{ rating.ratingData.value['modelLevel'] }}</span>
</div>
</div>
<div :class="itemClassComputed">
<div :class="labelClassComputed">调整后级别</div>
<div :class="valueClassComputed" @mouseover="handleHover('.rr-adjLevel', rating.ratingData.value['adjLevel'])" @mouseout="handleOut">
<span class="rr-adjLevel underline">{{ rating.ratingData.value['adjLevel'] }}</span>
<span class="rr-adjLevel">{{ rating.ratingData.value['adjLevel'] }}</span>
</div>
</div>
<div :class="itemClassComputed">
<div :class="labelClassComputed">最终认定级别</div>
<div :class="valueClassComputed" @mouseover="handleHover('.rr-finalLevel', rating.ratingData.value['finalLevel'])" @mouseout="handleOut">
<span class="rr-finalLevel underline">{{ rating.ratingData.value['finalLevel'] }}</span>
<span class="rr-finalLevel">{{ rating.ratingData.value['finalLevel'] }}</span>
</div>
</div>
<div :class="itemClassComputed">
@ -72,13 +32,13 @@
<div :class="itemClassComputed">
<div :class="labelClassComputed">初始级别</div>
<div :class="valueClassComputed" @mouseover="handleHover('.rr-initLevel', rating.ratingData.value['initLevel'])" @mouseout="handleOut">
<span class="rr-initLevel underline">{{ rating.ratingData.value['initLevel'] }}</span>
<span class="rr-initLevel">{{ rating.ratingData.value['initLevel'] }}</span>
</div>
</div>
<div :class="itemClassComputed">
<div :class="labelClassComputed">上一次建议级别</div>
<div :class="valueClassComputed" @mouseover="handleHover('.rr-spLevel', rating.ratingData.value['spLevel'])" @mouseout="handleOut">
<span class="rr-spLevel underline">{{ rating.ratingData.value['spLevel'] }}</span>
<span class="rr-spLevel">{{ rating.ratingData.value['spLevel'] }}</span>
</div>
</div>
<div :class="itemClassComputed">
@ -124,8 +84,8 @@
<script setup lang="ts">
import { ref, inject, computed } from 'vue';
import { Formater } from 'platform-core';
import { Rating } from '../ts/Rating';
import RatingLevelSlider from '../../RatingLevelSlider.vue';
import { Rating } from '@/views/custRating/company/ts/Rating';
import RatingLevelSlider from './RatingLevelSlider.vue';
const ratingLevelShowModel = ref(false);
const ratingLevel = ref('');

29
irbs.frontend/src/views/custRating/company/components/StepTabs.vue

@ -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>

4
irbs.frontend/src/views/custRating/company/content/Timeline.vue → irbs.frontend/src/views/custRating/company/components/Timeline.vue

@ -26,8 +26,8 @@
<script setup lang="ts">
import { ref, onMounted, inject } from 'vue';
import { $t, axios, Environment } from 'platform-core';
import { Rating } from '../ts/Rating';
import { RatingProcessOperationStatus } from '../../CustRating';
import { Rating } from '@/views/custRating/company/ts/Rating';
import { RatingProcessOperationStatus } from '@/views/custRating/company/ts/Utils';
const timelineData = ref([]);
const rating = <Rating>inject('rating');

39
irbs.frontend/src/views/custRating/company/components/UpdateModel.vue

@ -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>

309
irbs.frontend/src/views/custRating/company/components/buttons/AnnotationButton.vue

@ -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>

6
irbs.frontend/src/views/custRating/company/NextButton.vue → irbs.frontend/src/views/custRating/company/components/buttons/NextButton.vue

@ -3,9 +3,9 @@
</template>
<script setup lang="ts">
import { inject, computed } from 'vue';
import { Rating } from './ts/Rating';
import { Step } from './ts/Step';
import { Constant } from './ts/Constant';
import { Rating } from '@/views/custRating/company/ts/Rating';
import { Step } from '@/views/custRating/company/ts/Step';
import { Constant } from '@/views/custRating/company/ts/Constant';
const rating = <Rating>inject('rating');
const showComputed = computed(() => {

8
irbs.frontend/src/views/custRating/company/TestCalcButton.vue → irbs.frontend/src/views/custRating/company/components/buttons/TestCalcButton.vue

@ -10,10 +10,10 @@
import { ref, inject, computed, onBeforeMount } from 'vue';
import { useQuasar } from 'quasar';
import { axios, Environment, NotifyManager, Tools } from 'platform-core';
import { Rating } from './ts/Rating';
import { Step } from './ts/Step';
import { Constant } from './ts/Constant';
import { round } from './ts/Utils';
import { Rating } from '@/views/custRating/company/ts/Rating';
import { Step } from '@/views/custRating/company/ts/Step';
import { Constant } from '@/views/custRating/company/ts/Constant';
import { round } from '@/views/custRating/company/ts/Utils';
const $q = useQuasar();
const rating = <Rating>inject('rating');

61
irbs.frontend/src/views/custRating/company/components/buttons/WorkflowButton.vue

@ -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>

18
irbs.frontend/src/views/custRating/company/content/AdjustItem.vue

@ -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>

29
irbs.frontend/src/views/custRating/company/content/CustBaseInfo.vue

@ -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
>&nbsp; <q-badge color="green" align="top">上市</q-badge>&nbsp;
<q-badge color="red" align="top">{{ Formater.dictionary(rating.dictionary.customerSize)(rating.custInfoData.value['customerSize']) }}</q-badge
>&nbsp; <q-badge align="top">{{ Formater.dictionary(rating.dictionary.registeredType)(rating.custInfoData.value['registeredType']) }}</q-badge
>&nbsp; <q-badge color="secondary" align="top">{{ rating.custInfoData.value['groupCustInd'] === '1' ? '集团客户' : '非集团客户' }}</q-badge
>&nbsp;
<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'">&nbsp;</template>
<q-badge color="blue" align="top">行业{{ rating.custInfoData.value['industryTypeName'] }}</q-badge
>&nbsp; <q-badge color="brown" align="top">成立日期{{ rating.custInfoData.value['buildDate'] }}</q-badge
>&nbsp;
</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>

61
irbs.frontend/src/views/custRating/company/content/CustInfo.vue

@ -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>

146
irbs.frontend/src/views/custRating/company/content/FinanceReportGrid.vue

@ -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>

106
irbs.frontend/src/views/custRating/company/content/QualAnalysis.vue

@ -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>

20
irbs.frontend/src/views/custRating/company/content/QuanQualAnalysis.vue

@ -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>

36
irbs.frontend/src/views/custRating/company/content/ReportIndex.vue

@ -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>

16
irbs.frontend/src/views/custRating/company/Content.vue → irbs.frontend/src/views/custRating/company/template/shrcb/Content.vue

@ -6,14 +6,14 @@
<Opinion v-else-if="opinionComputed"></Opinion>
</template>
<script setup lang="ts">
import { ref, PropType, computed } from 'vue';
import type { StepType } from './ts/type/StepType';
import { Step } from './ts/Step';
import CustInfo from './content/CustInfo.vue';
import QuanQualAnalysis from './content/QuanQualAnalysis.vue';
import AdjustItem from './content/AdjustItem.vue';
import ReportInfo from './content/ReportInfo.vue';
import Opinion from './content/Opinion.vue';
import { PropType, computed } from 'vue';
import type { StepType } from '@/views/custRating/company/ts/type/StepType';
import { Step } from '@/views/custRating/company/ts/Step';
import CustInfo from './step/cust-info/CustInfo.vue';
import QuanQualAnalysis from './step/quan-qual-analysis/QuanQualAnalysis.vue';
import AdjustItem from './step/adjust-item/AdjustItem.vue';
import ReportInfo from './step/rating-report/ReportInfo.vue';
import Opinion from './step/opinion/Opinion.vue';
const props = defineProps({
step: { type: Object as PropType<StepType>, default: undefined },

31
irbs.frontend/src/views/custRating/company/RatingPage.vue → irbs.frontend/src/views/custRating/company/template/shrcb/Index.vue

@ -1,7 +1,7 @@
<template>
<w-splitter :size="46" horizontal disable reverse unit="px" style="height: 100%">
<w-splitter :model-value="46" horizontal disable reverse unit="px" style="height: 100%">
<template #before>
<Step ref="stepRef" class="h-full"></Step>
<Layout class="h-full"></Layout>
</template>
<template #after>
@ -16,16 +16,14 @@
</template>
<script setup lang="ts">
import { VueTools } from 'platform-core';
import { getCurrentInstance, onMounted, provide, ref, shallowRef } from 'vue';
import RatingLevel from '../RatingLevel.vue';
import NextButton from './NextButton.vue';
import Step from './Step.vue';
import TestCalcButton from './TestCalcButton.vue';
import { Rating } from './ts/Rating';
import WorkflowButton from './WorkflowButton.vue';
import AnnotationButton from './AnnotationButton.vue';
import { getCurrentInstance, onMounted, provide } from 'vue';
import NextButton from '@/views/custRating/company/components/buttons/NextButton.vue';
import Layout from './Layout.vue';
import TestCalcButton from '@/views/custRating/company/components/buttons/TestCalcButton.vue';
import { Rating } from '@/views/custRating/company/ts/Rating';
import WorkflowButton from '@/views/custRating/company/components/buttons/WorkflowButton.vue';
import AnnotationButton from '@/views/custRating/company/components/buttons/AnnotationButton.vue';
const RatingLevelRef = shallowRef(RatingLevel);
const props = defineProps({
ratingData: {
type: Object,
@ -44,17 +42,6 @@ const rating = new Rating(props.ratingData, props.readMode);
await rating.dictionary.load();
await rating.enum.load();
await rating.systemParameter.load();
const ratingLevelFormat = (modelLevel: any, size: string) => {
return {
componentType: RatingLevelRef,
attrs: {
level: modelLevel,
dense: true,
size: size,
},
};
};
rating.refs.setRatingLevelFormatFunction(ratingLevelFormat);
onMounted(() => {
rating.step.setCurrStep(rating.ratingData.value['currentStep']);

40
irbs.frontend/src/views/custRating/company/template/shrcb/Layout.vue

@ -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>

18
irbs.frontend/src/views/custRating/company/template/shrcb/step/adjust-item/AdjustItem.vue

@ -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>

31
irbs.frontend/src/views/custRating/company/template/shrcb/step/cust-info/CustInfo.vue

@ -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>

19
irbs.frontend/src/views/custRating/company/content/Opinion.vue → irbs.frontend/src/views/custRating/company/template/shrcb/step/opinion/Opinion.vue

@ -1,8 +1,15 @@
<template>
<div class="h-full pl-1">
<w-splitter v-if="!rating.cm.isAwaitSubmitProcessStatus.value" :size="rating.readMode ? 100 : 50" horizontal class="h-full" disable :show-separator="false">
<w-splitter
v-if="!rating.cm.isAwaitSubmitProcessStatus.value"
:model-value="rating.readMode ? 100 : 50"
horizontal
class="h-full"
disable
:show-separator="false"
>
<template #before>
<w-splitter :size="36" horizontal class="h-full" unit="px" disable :show-separator="false">
<w-splitter :model-value="36" horizontal class="h-full" unit="px" disable :show-separator="false">
<template #before>
<q-tabs v-model="histTab" dense no-caps inline-label align="right">
<q-tab name="timeline" icon="query_builder" label="审批时间线" />
@ -30,10 +37,10 @@
</template>
<script setup lang="ts">
import { inject, ref } from 'vue';
import { Rating } from '../ts/Rating';
import OpinionGrid from './OpinionGrid.vue';
import Overturn from './Overturn.vue';
import Timeline from './Timeline.vue';
import { Rating } from '@/views/custRating/company/ts/Rating';
import OpinionGrid from '@/views/custRating/company/components/OpinionGrid.vue';
import Overturn from '@/views/custRating/company/components/Overturn.vue';
import Timeline from '@/views/custRating/company/components/Timeline.vue';
const rating = <Rating>inject('rating');
const histTab = ref('timeline');

20
irbs.frontend/src/views/custRating/company/template/shrcb/step/quan-qual-analysis/QuanQualAnalysis.vue

@ -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>

12
irbs.frontend/src/views/custRating/company/content/ReportInfo.vue → irbs.frontend/src/views/custRating/company/template/shrcb/step/rating-report/ReportInfo.vue

@ -1,11 +1,11 @@
<template>
<div class="h-full">
<w-splitter :size="splitterSizeComputed" :limits="[0, Infinity]" horizontal unit="px" disable class="h-full">
<w-splitter :model-value="splitterSizeComputed" :limits="[0, Infinity]" horizontal unit="px" disable class="h-full">
<template #before>
<ReportRating></ReportRating>
</template>
<template #after>
<w-splitter :size="70" horizontal :separator-color="rating.separatorColor">
<w-splitter :model-value="80" horizontal :separator-color="rating.separatorColor">
<template #before>
<ReportIndex></ReportIndex>
</template>
@ -19,10 +19,10 @@
</template>
<script setup lang="ts">
import { computed, inject } from 'vue';
import { Rating } from '../ts/Rating';
import HistTab from './HistTab.vue';
import ReportIndex from './ReportIndex.vue';
import ReportRating from './ReportRating.vue';
import { Rating } from '@/views/custRating/company/ts/Rating';
import HistTab from '@/views/custRating/company/components/HistTab.vue';
import ReportRating from '@/views/custRating/company/components/ReportRating.vue';
import ReportIndex from '@/views/custRating/company/components/ReportIndex.vue';
const rating = <Rating>inject('rating');
const splitterSizeComputed = computed(() => {

79
irbs.frontend/src/views/custRating/company/ts/Addtion.ts

@ -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;
}
}

47
irbs.frontend/src/views/custRating/company/ts/RequestApi.ts

@ -4,6 +4,8 @@ import { Constant } from './Constant';
import { round, groupBy } from './Utils';
import { Step } from './Step';
import { StepType } from './type/StepType';
import { Addtion } from './Addtion';
import { group } from 'console';
/**
* api
@ -95,6 +97,13 @@ export class RequestApi {
this.rating.qualFormData.value.push(group);
this.rating.qualSimpleOptionData.value.push(simpleGroup);
});
const formValue = {};
if (resp.data.indices) {
resp.data.indices.forEach((item) => {
formValue[item.indexCode] = item.indexValue;
});
this.rating.refs.qualitativeFormRefFunction().setData(formValue);
}
}
})
.catch((error) => {
@ -113,12 +122,10 @@ export class RequestApi {
for (let i = 0; i < arr.length; i++) {
const index = arr[i];
const indexOptions = <any>[];
// 选项处理
if (index.options && index.options.length > 0) {
index.options.forEach((item, index_) => {
index.options.forEach((item) => {
const option = { label: item.text, value: item.disVal };
if (index_ === 0) {
option['desc'] = { label: '选项说明' };
}
if (allOptions || (!Tools.isEmpty(index.indexValue) && index.indexValue === item.disVal)) {
indexOptions.push(option);
}
@ -133,13 +140,37 @@ export class RequestApi {
selectedColor: 'blue',
selectedLabelColor: '#2196f3',
};
if (i !== 0) {
radio['class'] = 'pt-1';
}
if (!Tools.isEmpty(index.indexValue)) {
radio['defaultValue'] = index.indexValue;
}
resultArr.push(radio);
// 补录处理
let field = {};
if (index.addtions && index.addtions.length > 0) {
const addtions = <any>[];
index.addtions.forEach((addtion: any) => {
addtions.push(Addtion.getComponent(addtion, index));
});
field = {
type: 'w-form-group',
layout: 'form',
colsNum: 2,
fields: [
radio,
{
type: 'w-form-group',
layout: 'form',
colsNum: 1,
fields: addtions,
},
],
};
} else {
field = radio;
}
if (i !== 0) {
field['class'] = 'pt-1';
}
resultArr.push(field);
if (allOptions) {
this.rating.waitSelectFields.value.push({ group: index.indexCategory, field: radio });
this.rating.qualFormObj.value[index.indexCode] = [i + 1 + '、' + index.indexName, index];

14
irbs.frontend/src/views/custRating/company/ts/Step.ts

@ -56,11 +56,11 @@ export class Step {
disable: false,
},
/**
*
*
*/
opinion: <StepType>{
label: '签署意见',
tooltip: '评级推翻提交审核',
label: '评级推翻',
tooltip: '评级推翻提交审核',
value: 'OTHER',
icon: 'bi-5-circle-fill',
order: 5,
@ -191,7 +191,7 @@ export class Step {
const errorRows = <any>[];
const keys = Object.keys(formData);
for (let i = 0; i < keys.length; i++) {
if (Tools.isEmpty(formData[keys[i]])) {
if (Tools.isEmpty(formData[keys[i]]) && this.rating.qualFormObj.value[keys[i]]) {
result = false;
errorRows.push({
label: this.rating.qualFormObj.value[keys[i]][0],
@ -204,10 +204,12 @@ export class Step {
dense: true,
});
} else {
if (this.rating.qualFormObj.value[keys[i]]) {
this.rating.qualFormObj.value[keys[i]][1].indexValue = formData[keys[i]];
submitData.push(this.rating.qualFormObj.value[keys[i]][1]);
}
}
}
if (!result) {
Dialog.create({
title: '提示',
@ -264,7 +266,7 @@ export class Step {
const value_ = value === 'INIT_FINISH' ? Step.type.custInfo.value : value;
if (value_) {
this.currStep.value = value_;
nextTick(() => {
nextTick(async () => {
switch (value_) {
case Step.type.custInfo.value:
this.rating.api.loadCustInfo();
@ -277,7 +279,7 @@ export class Step {
break;
case Step.type.reportInfo.value:
this.rating.api.loadCustInfo();
this.rating.api.loadQuanQualInfo();
await this.rating.api.loadQuanQualInfo();
this.rating.api.loadRatingReport();
break;
case Step.type.opinion.value:

80
irbs.frontend/src/views/custRating/company/ts/Utils.ts

@ -19,13 +19,21 @@ export const round = (val: any, precision: any) => {
return result;
};
export const groupBy = (arr, prop) =>
arr.reduce((acc, item) => {
export const RatioFormat = (val) => {
if (val && typeof val === 'number') {
return round(val * 100, 2) + '%';
}
return val;
};
export const groupBy = (arr, prop) => {
return arr.reduce((acc, item) => {
const key = item[prop];
if (!acc[key]) acc[key] = [];
acc[key].push(item);
return acc;
}, {});
};
export const formatAmt = (num: any) => {
if (num) {
@ -39,3 +47,71 @@ export const formatAmt = (num: any) => {
}
return num;
};
/**
*
*/
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 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',
},
];

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save