feat: Jira缺陷类型配置改到项目下

This commit is contained in:
chenjianxing 2022-01-20 21:09:13 +08:00 committed by zhangdahai112
parent 6541607bd5
commit b7ef16c5e6
22 changed files with 564 additions and 256 deletions

View File

@ -45,14 +45,14 @@ public class Project implements Serializable {
private String azureFilterId;
private String apiQuick;
private Boolean casePublic;
private String platform;
private Boolean thirdPartTemplate;
private Boolean casePublic;
private String apiQuick;
private Boolean versionEnable;
private Boolean cleanTrackReport;
@ -67,5 +67,7 @@ public class Project implements Serializable {
private String cleanLoadReportExpr;
private String issueConfig;
private static final long serialVersionUID = 1L;
}

View File

@ -1434,136 +1434,6 @@ public class ProjectExample {
return (Criteria) this;
}
public Criteria andApiQuickIsNull() {
addCriterion("api_quick is null");
return (Criteria) this;
}
public Criteria andApiQuickIsNotNull() {
addCriterion("api_quick is not null");
return (Criteria) this;
}
public Criteria andApiQuickEqualTo(String value) {
addCriterion("api_quick =", value, "apiQuick");
return (Criteria) this;
}
public Criteria andApiQuickNotEqualTo(String value) {
addCriterion("api_quick <>", value, "apiQuick");
return (Criteria) this;
}
public Criteria andApiQuickGreaterThan(String value) {
addCriterion("api_quick >", value, "apiQuick");
return (Criteria) this;
}
public Criteria andApiQuickGreaterThanOrEqualTo(String value) {
addCriterion("api_quick >=", value, "apiQuick");
return (Criteria) this;
}
public Criteria andApiQuickLessThan(String value) {
addCriterion("api_quick <", value, "apiQuick");
return (Criteria) this;
}
public Criteria andApiQuickLessThanOrEqualTo(String value) {
addCriterion("api_quick <=", value, "apiQuick");
return (Criteria) this;
}
public Criteria andApiQuickLike(String value) {
addCriterion("api_quick like", value, "apiQuick");
return (Criteria) this;
}
public Criteria andApiQuickNotLike(String value) {
addCriterion("api_quick not like", value, "apiQuick");
return (Criteria) this;
}
public Criteria andApiQuickIn(List<String> values) {
addCriterion("api_quick in", values, "apiQuick");
return (Criteria) this;
}
public Criteria andApiQuickNotIn(List<String> values) {
addCriterion("api_quick not in", values, "apiQuick");
return (Criteria) this;
}
public Criteria andApiQuickBetween(String value1, String value2) {
addCriterion("api_quick between", value1, value2, "apiQuick");
return (Criteria) this;
}
public Criteria andApiQuickNotBetween(String value1, String value2) {
addCriterion("api_quick not between", value1, value2, "apiQuick");
return (Criteria) this;
}
public Criteria andCasePublicIsNull() {
addCriterion("case_public is null");
return (Criteria) this;
}
public Criteria andCasePublicIsNotNull() {
addCriterion("case_public is not null");
return (Criteria) this;
}
public Criteria andCasePublicEqualTo(Boolean value) {
addCriterion("case_public =", value, "casePublic");
return (Criteria) this;
}
public Criteria andCasePublicNotEqualTo(Boolean value) {
addCriterion("case_public <>", value, "casePublic");
return (Criteria) this;
}
public Criteria andCasePublicGreaterThan(Boolean value) {
addCriterion("case_public >", value, "casePublic");
return (Criteria) this;
}
public Criteria andCasePublicGreaterThanOrEqualTo(Boolean value) {
addCriterion("case_public >=", value, "casePublic");
return (Criteria) this;
}
public Criteria andCasePublicLessThan(Boolean value) {
addCriterion("case_public <", value, "casePublic");
return (Criteria) this;
}
public Criteria andCasePublicLessThanOrEqualTo(Boolean value) {
addCriterion("case_public <=", value, "casePublic");
return (Criteria) this;
}
public Criteria andCasePublicIn(List<Boolean> values) {
addCriterion("case_public in", values, "casePublic");
return (Criteria) this;
}
public Criteria andCasePublicNotIn(List<Boolean> values) {
addCriterion("case_public not in", values, "casePublic");
return (Criteria) this;
}
public Criteria andCasePublicBetween(Boolean value1, Boolean value2) {
addCriterion("case_public between", value1, value2, "casePublic");
return (Criteria) this;
}
public Criteria andCasePublicNotBetween(Boolean value1, Boolean value2) {
addCriterion("case_public not between", value1, value2, "casePublic");
return (Criteria) this;
}
public Criteria andPlatformIsNull() {
addCriterion("platform is null");
return (Criteria) this;
@ -1694,6 +1564,136 @@ public class ProjectExample {
return (Criteria) this;
}
public Criteria andCasePublicIsNull() {
addCriterion("case_public is null");
return (Criteria) this;
}
public Criteria andCasePublicIsNotNull() {
addCriterion("case_public is not null");
return (Criteria) this;
}
public Criteria andCasePublicEqualTo(Boolean value) {
addCriterion("case_public =", value, "casePublic");
return (Criteria) this;
}
public Criteria andCasePublicNotEqualTo(Boolean value) {
addCriterion("case_public <>", value, "casePublic");
return (Criteria) this;
}
public Criteria andCasePublicGreaterThan(Boolean value) {
addCriterion("case_public >", value, "casePublic");
return (Criteria) this;
}
public Criteria andCasePublicGreaterThanOrEqualTo(Boolean value) {
addCriterion("case_public >=", value, "casePublic");
return (Criteria) this;
}
public Criteria andCasePublicLessThan(Boolean value) {
addCriterion("case_public <", value, "casePublic");
return (Criteria) this;
}
public Criteria andCasePublicLessThanOrEqualTo(Boolean value) {
addCriterion("case_public <=", value, "casePublic");
return (Criteria) this;
}
public Criteria andCasePublicIn(List<Boolean> values) {
addCriterion("case_public in", values, "casePublic");
return (Criteria) this;
}
public Criteria andCasePublicNotIn(List<Boolean> values) {
addCriterion("case_public not in", values, "casePublic");
return (Criteria) this;
}
public Criteria andCasePublicBetween(Boolean value1, Boolean value2) {
addCriterion("case_public between", value1, value2, "casePublic");
return (Criteria) this;
}
public Criteria andCasePublicNotBetween(Boolean value1, Boolean value2) {
addCriterion("case_public not between", value1, value2, "casePublic");
return (Criteria) this;
}
public Criteria andApiQuickIsNull() {
addCriterion("api_quick is null");
return (Criteria) this;
}
public Criteria andApiQuickIsNotNull() {
addCriterion("api_quick is not null");
return (Criteria) this;
}
public Criteria andApiQuickEqualTo(String value) {
addCriterion("api_quick =", value, "apiQuick");
return (Criteria) this;
}
public Criteria andApiQuickNotEqualTo(String value) {
addCriterion("api_quick <>", value, "apiQuick");
return (Criteria) this;
}
public Criteria andApiQuickGreaterThan(String value) {
addCriterion("api_quick >", value, "apiQuick");
return (Criteria) this;
}
public Criteria andApiQuickGreaterThanOrEqualTo(String value) {
addCriterion("api_quick >=", value, "apiQuick");
return (Criteria) this;
}
public Criteria andApiQuickLessThan(String value) {
addCriterion("api_quick <", value, "apiQuick");
return (Criteria) this;
}
public Criteria andApiQuickLessThanOrEqualTo(String value) {
addCriterion("api_quick <=", value, "apiQuick");
return (Criteria) this;
}
public Criteria andApiQuickLike(String value) {
addCriterion("api_quick like", value, "apiQuick");
return (Criteria) this;
}
public Criteria andApiQuickNotLike(String value) {
addCriterion("api_quick not like", value, "apiQuick");
return (Criteria) this;
}
public Criteria andApiQuickIn(List<String> values) {
addCriterion("api_quick in", values, "apiQuick");
return (Criteria) this;
}
public Criteria andApiQuickNotIn(List<String> values) {
addCriterion("api_quick not in", values, "apiQuick");
return (Criteria) this;
}
public Criteria andApiQuickBetween(String value1, String value2) {
addCriterion("api_quick between", value1, value2, "apiQuick");
return (Criteria) this;
}
public Criteria andApiQuickNotBetween(String value1, String value2) {
addCriterion("api_quick not between", value1, value2, "apiQuick");
return (Criteria) this;
}
public Criteria andVersionEnableIsNull() {
addCriterion("version_enable is null");
return (Criteria) this;

View File

@ -16,15 +16,21 @@ public interface ProjectMapper {
int insertSelective(Project record);
List<Project> selectByExampleWithBLOBs(ProjectExample example);
List<Project> selectByExample(ProjectExample example);
Project selectByPrimaryKey(String id);
int updateByExampleSelective(@Param("record") Project record, @Param("example") ProjectExample example);
int updateByExampleWithBLOBs(@Param("record") Project record, @Param("example") ProjectExample example);
int updateByExample(@Param("record") Project record, @Param("example") ProjectExample example);
int updateByPrimaryKeySelective(Project record);
int updateByPrimaryKeyWithBLOBs(Project record);
int updateByPrimaryKey(Project record);
}

View File

@ -22,10 +22,10 @@
<result column="mock_tcp_port" jdbcType="INTEGER" property="mockTcpPort" />
<result column="is_mock_tcp_open" jdbcType="BIT" property="isMockTcpOpen" />
<result column="azure_filter_id" jdbcType="VARCHAR" property="azureFilterId" />
<result column="api_quick" jdbcType="VARCHAR" property="apiQuick" />
<result column="case_public" jdbcType="BIT" property="casePublic" />
<result column="platform" jdbcType="VARCHAR" property="platform" />
<result column="third_part_template" jdbcType="BIT" property="thirdPartTemplate" />
<result column="case_public" jdbcType="BIT" property="casePublic" />
<result column="api_quick" jdbcType="VARCHAR" property="apiQuick" />
<result column="version_enable" jdbcType="BIT" property="versionEnable" />
<result column="clean_track_report" jdbcType="BIT" property="cleanTrackReport" />
<result column="clean_track_report_expr" jdbcType="VARCHAR" property="cleanTrackReportExpr" />
@ -34,6 +34,9 @@
<result column="clean_load_report" jdbcType="BIT" property="cleanLoadReport" />
<result column="clean_load_report_expr" jdbcType="VARCHAR" property="cleanLoadReportExpr" />
</resultMap>
<resultMap extends="BaseResultMap" id="ResultMapWithBLOBs" type="io.metersphere.base.domain.Project">
<result column="issue_config" jdbcType="LONGVARCHAR" property="issueConfig" />
</resultMap>
<sql id="Example_Where_Clause">
<where>
<foreach collection="oredCriteria" item="criteria" separator="or">
@ -96,10 +99,29 @@
id, workspace_id, `name`, description, create_time, update_time, tapd_id, jira_key,
zentao_id, azure_devops_id, `repeatable`, case_template_id, issue_template_id, custom_num,
scenario_custom_num, create_user, system_id, mock_tcp_port, is_mock_tcp_open, azure_filter_id,
api_quick, case_public, platform, third_part_template, version_enable, clean_track_report,
platform, third_part_template, case_public, api_quick, version_enable, clean_track_report,
clean_track_report_expr, clean_api_report, clean_api_report_expr, clean_load_report,
clean_load_report_expr
</sql>
<sql id="Blob_Column_List">
issue_config
</sql>
<select id="selectByExampleWithBLOBs" parameterType="io.metersphere.base.domain.ProjectExample" resultMap="ResultMapWithBLOBs">
select
<if test="distinct">
distinct
</if>
<include refid="Base_Column_List" />
,
<include refid="Blob_Column_List" />
from project
<if test="_parameter != null">
<include refid="Example_Where_Clause" />
</if>
<if test="orderByClause != null">
order by ${orderByClause}
</if>
</select>
<select id="selectByExample" parameterType="io.metersphere.base.domain.ProjectExample" resultMap="BaseResultMap">
select
<if test="distinct">
@ -114,9 +136,11 @@
order by ${orderByClause}
</if>
</select>
<select id="selectByPrimaryKey" parameterType="java.lang.String" resultMap="BaseResultMap">
<select id="selectByPrimaryKey" parameterType="java.lang.String" resultMap="ResultMapWithBLOBs">
select
<include refid="Base_Column_List" />
,
<include refid="Blob_Column_List" />
from project
where id = #{id,jdbcType=VARCHAR}
</select>
@ -137,22 +161,22 @@
azure_devops_id, `repeatable`, case_template_id,
issue_template_id, custom_num, scenario_custom_num,
create_user, system_id, mock_tcp_port,
is_mock_tcp_open, azure_filter_id, api_quick,
case_public, platform, third_part_template,
is_mock_tcp_open, azure_filter_id, platform,
third_part_template, case_public, api_quick,
version_enable, clean_track_report, clean_track_report_expr,
clean_api_report, clean_api_report_expr, clean_load_report,
clean_load_report_expr)
clean_load_report_expr, issue_config)
values (#{id,jdbcType=VARCHAR}, #{workspaceId,jdbcType=VARCHAR}, #{name,jdbcType=VARCHAR},
#{description,jdbcType=VARCHAR}, #{createTime,jdbcType=BIGINT}, #{updateTime,jdbcType=BIGINT},
#{tapdId,jdbcType=VARCHAR}, #{jiraKey,jdbcType=VARCHAR}, #{zentaoId,jdbcType=VARCHAR},
#{azureDevopsId,jdbcType=VARCHAR}, #{repeatable,jdbcType=BIT}, #{caseTemplateId,jdbcType=VARCHAR},
#{issueTemplateId,jdbcType=VARCHAR}, #{customNum,jdbcType=BIT}, #{scenarioCustomNum,jdbcType=BIT},
#{createUser,jdbcType=VARCHAR}, #{systemId,jdbcType=VARCHAR}, #{mockTcpPort,jdbcType=INTEGER},
#{isMockTcpOpen,jdbcType=BIT}, #{azureFilterId,jdbcType=VARCHAR}, #{apiQuick,jdbcType=VARCHAR},
#{casePublic,jdbcType=BIT}, #{platform,jdbcType=VARCHAR}, #{thirdPartTemplate,jdbcType=BIT},
#{isMockTcpOpen,jdbcType=BIT}, #{azureFilterId,jdbcType=VARCHAR}, #{platform,jdbcType=VARCHAR},
#{thirdPartTemplate,jdbcType=BIT}, #{casePublic,jdbcType=BIT}, #{apiQuick,jdbcType=VARCHAR},
#{versionEnable,jdbcType=BIT}, #{cleanTrackReport,jdbcType=BIT}, #{cleanTrackReportExpr,jdbcType=VARCHAR},
#{cleanApiReport,jdbcType=BIT}, #{cleanApiReportExpr,jdbcType=VARCHAR}, #{cleanLoadReport,jdbcType=BIT},
#{cleanLoadReportExpr,jdbcType=VARCHAR})
#{cleanLoadReportExpr,jdbcType=VARCHAR}, #{issueConfig,jdbcType=LONGVARCHAR})
</insert>
<insert id="insertSelective" parameterType="io.metersphere.base.domain.Project">
insert into project
@ -217,18 +241,18 @@
<if test="azureFilterId != null">
azure_filter_id,
</if>
<if test="apiQuick != null">
api_quick,
</if>
<if test="casePublic != null">
case_public,
</if>
<if test="platform != null">
platform,
</if>
<if test="thirdPartTemplate != null">
third_part_template,
</if>
<if test="casePublic != null">
case_public,
</if>
<if test="apiQuick != null">
api_quick,
</if>
<if test="versionEnable != null">
version_enable,
</if>
@ -250,6 +274,9 @@
<if test="cleanLoadReportExpr != null">
clean_load_report_expr,
</if>
<if test="issueConfig != null">
issue_config,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="id != null">
@ -312,18 +339,18 @@
<if test="azureFilterId != null">
#{azureFilterId,jdbcType=VARCHAR},
</if>
<if test="apiQuick != null">
#{apiQuick,jdbcType=VARCHAR},
</if>
<if test="casePublic != null">
#{casePublic,jdbcType=BIT},
</if>
<if test="platform != null">
#{platform,jdbcType=VARCHAR},
</if>
<if test="thirdPartTemplate != null">
#{thirdPartTemplate,jdbcType=BIT},
</if>
<if test="casePublic != null">
#{casePublic,jdbcType=BIT},
</if>
<if test="apiQuick != null">
#{apiQuick,jdbcType=VARCHAR},
</if>
<if test="versionEnable != null">
#{versionEnable,jdbcType=BIT},
</if>
@ -345,6 +372,9 @@
<if test="cleanLoadReportExpr != null">
#{cleanLoadReportExpr,jdbcType=VARCHAR},
</if>
<if test="issueConfig != null">
#{issueConfig,jdbcType=LONGVARCHAR},
</if>
</trim>
</insert>
<select id="countByExample" parameterType="io.metersphere.base.domain.ProjectExample" resultType="java.lang.Long">
@ -416,18 +446,18 @@
<if test="record.azureFilterId != null">
azure_filter_id = #{record.azureFilterId,jdbcType=VARCHAR},
</if>
<if test="record.apiQuick != null">
api_quick = #{record.apiQuick,jdbcType=VARCHAR},
</if>
<if test="record.casePublic != null">
case_public = #{record.casePublic,jdbcType=BIT},
</if>
<if test="record.platform != null">
platform = #{record.platform,jdbcType=VARCHAR},
</if>
<if test="record.thirdPartTemplate != null">
third_part_template = #{record.thirdPartTemplate,jdbcType=BIT},
</if>
<if test="record.casePublic != null">
case_public = #{record.casePublic,jdbcType=BIT},
</if>
<if test="record.apiQuick != null">
api_quick = #{record.apiQuick,jdbcType=VARCHAR},
</if>
<if test="record.versionEnable != null">
version_enable = #{record.versionEnable,jdbcType=BIT},
</if>
@ -449,11 +479,52 @@
<if test="record.cleanLoadReportExpr != null">
clean_load_report_expr = #{record.cleanLoadReportExpr,jdbcType=VARCHAR},
</if>
<if test="record.issueConfig != null">
issue_config = #{record.issueConfig,jdbcType=LONGVARCHAR},
</if>
</set>
<if test="_parameter != null">
<include refid="Update_By_Example_Where_Clause" />
</if>
</update>
<update id="updateByExampleWithBLOBs" parameterType="map">
update project
set id = #{record.id,jdbcType=VARCHAR},
workspace_id = #{record.workspaceId,jdbcType=VARCHAR},
`name` = #{record.name,jdbcType=VARCHAR},
description = #{record.description,jdbcType=VARCHAR},
create_time = #{record.createTime,jdbcType=BIGINT},
update_time = #{record.updateTime,jdbcType=BIGINT},
tapd_id = #{record.tapdId,jdbcType=VARCHAR},
jira_key = #{record.jiraKey,jdbcType=VARCHAR},
zentao_id = #{record.zentaoId,jdbcType=VARCHAR},
azure_devops_id = #{record.azureDevopsId,jdbcType=VARCHAR},
`repeatable` = #{record.repeatable,jdbcType=BIT},
case_template_id = #{record.caseTemplateId,jdbcType=VARCHAR},
issue_template_id = #{record.issueTemplateId,jdbcType=VARCHAR},
custom_num = #{record.customNum,jdbcType=BIT},
scenario_custom_num = #{record.scenarioCustomNum,jdbcType=BIT},
create_user = #{record.createUser,jdbcType=VARCHAR},
system_id = #{record.systemId,jdbcType=VARCHAR},
mock_tcp_port = #{record.mockTcpPort,jdbcType=INTEGER},
is_mock_tcp_open = #{record.isMockTcpOpen,jdbcType=BIT},
azure_filter_id = #{record.azureFilterId,jdbcType=VARCHAR},
platform = #{record.platform,jdbcType=VARCHAR},
third_part_template = #{record.thirdPartTemplate,jdbcType=BIT},
case_public = #{record.casePublic,jdbcType=BIT},
api_quick = #{record.apiQuick,jdbcType=VARCHAR},
version_enable = #{record.versionEnable,jdbcType=BIT},
clean_track_report = #{record.cleanTrackReport,jdbcType=BIT},
clean_track_report_expr = #{record.cleanTrackReportExpr,jdbcType=VARCHAR},
clean_api_report = #{record.cleanApiReport,jdbcType=BIT},
clean_api_report_expr = #{record.cleanApiReportExpr,jdbcType=VARCHAR},
clean_load_report = #{record.cleanLoadReport,jdbcType=BIT},
clean_load_report_expr = #{record.cleanLoadReportExpr,jdbcType=VARCHAR},
issue_config = #{record.issueConfig,jdbcType=LONGVARCHAR}
<if test="_parameter != null">
<include refid="Update_By_Example_Where_Clause" />
</if>
</update>
<update id="updateByExample" parameterType="map">
update project
set id = #{record.id,jdbcType=VARCHAR},
@ -476,10 +547,10 @@
mock_tcp_port = #{record.mockTcpPort,jdbcType=INTEGER},
is_mock_tcp_open = #{record.isMockTcpOpen,jdbcType=BIT},
azure_filter_id = #{record.azureFilterId,jdbcType=VARCHAR},
api_quick = #{record.apiQuick,jdbcType=VARCHAR},
case_public = #{record.casePublic,jdbcType=BIT},
platform = #{record.platform,jdbcType=VARCHAR},
third_part_template = #{record.thirdPartTemplate,jdbcType=BIT},
case_public = #{record.casePublic,jdbcType=BIT},
api_quick = #{record.apiQuick,jdbcType=VARCHAR},
version_enable = #{record.versionEnable,jdbcType=BIT},
clean_track_report = #{record.cleanTrackReport,jdbcType=BIT},
clean_track_report_expr = #{record.cleanTrackReportExpr,jdbcType=VARCHAR},
@ -551,18 +622,18 @@
<if test="azureFilterId != null">
azure_filter_id = #{azureFilterId,jdbcType=VARCHAR},
</if>
<if test="apiQuick != null">
api_quick = #{apiQuick,jdbcType=VARCHAR},
</if>
<if test="casePublic != null">
case_public = #{casePublic,jdbcType=BIT},
</if>
<if test="platform != null">
platform = #{platform,jdbcType=VARCHAR},
</if>
<if test="thirdPartTemplate != null">
third_part_template = #{thirdPartTemplate,jdbcType=BIT},
</if>
<if test="casePublic != null">
case_public = #{casePublic,jdbcType=BIT},
</if>
<if test="apiQuick != null">
api_quick = #{apiQuick,jdbcType=VARCHAR},
</if>
<if test="versionEnable != null">
version_enable = #{versionEnable,jdbcType=BIT},
</if>
@ -584,9 +655,47 @@
<if test="cleanLoadReportExpr != null">
clean_load_report_expr = #{cleanLoadReportExpr,jdbcType=VARCHAR},
</if>
<if test="issueConfig != null">
issue_config = #{issueConfig,jdbcType=LONGVARCHAR},
</if>
</set>
where id = #{id,jdbcType=VARCHAR}
</update>
<update id="updateByPrimaryKeyWithBLOBs" parameterType="io.metersphere.base.domain.Project">
update project
set workspace_id = #{workspaceId,jdbcType=VARCHAR},
`name` = #{name,jdbcType=VARCHAR},
description = #{description,jdbcType=VARCHAR},
create_time = #{createTime,jdbcType=BIGINT},
update_time = #{updateTime,jdbcType=BIGINT},
tapd_id = #{tapdId,jdbcType=VARCHAR},
jira_key = #{jiraKey,jdbcType=VARCHAR},
zentao_id = #{zentaoId,jdbcType=VARCHAR},
azure_devops_id = #{azureDevopsId,jdbcType=VARCHAR},
`repeatable` = #{repeatable,jdbcType=BIT},
case_template_id = #{caseTemplateId,jdbcType=VARCHAR},
issue_template_id = #{issueTemplateId,jdbcType=VARCHAR},
custom_num = #{customNum,jdbcType=BIT},
scenario_custom_num = #{scenarioCustomNum,jdbcType=BIT},
create_user = #{createUser,jdbcType=VARCHAR},
system_id = #{systemId,jdbcType=VARCHAR},
mock_tcp_port = #{mockTcpPort,jdbcType=INTEGER},
is_mock_tcp_open = #{isMockTcpOpen,jdbcType=BIT},
azure_filter_id = #{azureFilterId,jdbcType=VARCHAR},
platform = #{platform,jdbcType=VARCHAR},
third_part_template = #{thirdPartTemplate,jdbcType=BIT},
case_public = #{casePublic,jdbcType=BIT},
api_quick = #{apiQuick,jdbcType=VARCHAR},
version_enable = #{versionEnable,jdbcType=BIT},
clean_track_report = #{cleanTrackReport,jdbcType=BIT},
clean_track_report_expr = #{cleanTrackReportExpr,jdbcType=VARCHAR},
clean_api_report = #{cleanApiReport,jdbcType=BIT},
clean_api_report_expr = #{cleanApiReportExpr,jdbcType=VARCHAR},
clean_load_report = #{cleanLoadReport,jdbcType=BIT},
clean_load_report_expr = #{cleanLoadReportExpr,jdbcType=VARCHAR},
issue_config = #{issueConfig,jdbcType=LONGVARCHAR}
where id = #{id,jdbcType=VARCHAR}
</update>
<update id="updateByPrimaryKey" parameterType="io.metersphere.base.domain.Project">
update project
set workspace_id = #{workspaceId,jdbcType=VARCHAR},
@ -608,10 +717,10 @@
mock_tcp_port = #{mockTcpPort,jdbcType=INTEGER},
is_mock_tcp_open = #{isMockTcpOpen,jdbcType=BIT},
azure_filter_id = #{azureFilterId,jdbcType=VARCHAR},
api_quick = #{apiQuick,jdbcType=VARCHAR},
case_public = #{casePublic,jdbcType=BIT},
platform = #{platform,jdbcType=VARCHAR},
third_part_template = #{thirdPartTemplate,jdbcType=BIT},
case_public = #{casePublic,jdbcType=BIT},
api_quick = #{apiQuick,jdbcType=VARCHAR},
version_enable = #{versionEnable,jdbcType=BIT},
clean_track_report = #{cleanTrackReport,jdbcType=BIT},
clean_track_report_expr = #{cleanTrackReportExpr,jdbcType=VARCHAR},

View File

@ -53,7 +53,8 @@
p.mock_tcp_port AS mockTcpPort,
p.is_mock_tcp_open AS isMockTcpOpen,
p.scenario_custom_num,
p.platform, p.third_part_template
p.platform, p.third_part_template,
p.issue_config
FROM project p
JOIN workspace w ON p.workspace_id = w.id
LEFT JOIN user ON user.id = p.create_user

View File

@ -14,7 +14,9 @@ import io.metersphere.dto.IssueTemplateDao;
import io.metersphere.log.annotation.MsAuditLog;
import io.metersphere.notice.annotation.SendNotice;
import io.metersphere.track.issue.domain.PlatformUser;
import io.metersphere.track.issue.domain.jira.JiraIssueType;
import io.metersphere.track.issue.domain.zentao.ZentaoBuild;
import io.metersphere.track.request.issues.JiraIssueTypeRequest;
import io.metersphere.track.request.testcase.AuthUserIssueRequest;
import io.metersphere.track.request.testcase.IssuesRequest;
import io.metersphere.track.request.testcase.IssuesUpdateRequest;
@ -161,4 +163,8 @@ public class IssuesController {
return issuesService.getThirdPartTemplate(projectId);
}
@PostMapping("/jira/issuetype")
public List<JiraIssueType> getJiraIssueType(@RequestBody JiraIssueTypeRequest request) {
return issuesService.getIssueTypes(request);
}
}

View File

@ -16,6 +16,7 @@ import io.metersphere.dto.CustomFieldItemDTO;
import io.metersphere.dto.IssueTemplateDao;
import io.metersphere.dto.UserDTO;
import io.metersphere.service.*;
import io.metersphere.track.issue.domain.ProjectIssueConfig;
import io.metersphere.track.request.testcase.IssuesRequest;
import io.metersphere.track.request.testcase.IssuesUpdateRequest;
import io.metersphere.track.service.IssuesService;
@ -141,6 +142,10 @@ public abstract class AbstractIssuePlatform implements IssuesPlatform {
public abstract String getProjectId(String projectId);
public String getProjectId(String projectId, Function<Project, String> getProjectKeyFuc) {
return getProjectKeyFuc.apply(getProject(projectId, getProjectKeyFuc));
}
public Project getProject(String projectId, Function<Project, String> getProjectKeyFuc) {
Project project;
if (StringUtils.isNotBlank(projectId)) {
project = projectService.getProjectById(projectId);
@ -149,8 +154,20 @@ public abstract class AbstractIssuePlatform implements IssuesPlatform {
project = projectService.getProjectById(testCase.getProjectId());
}
String projectKey = getProjectKeyFuc.apply(project);
if (StringUtils.isBlank(projectKey)) MSException.throwException("请在项目设置配置 " + key + "项目ID");
return projectKey;
if (StringUtils.isBlank(projectKey)) {
MSException.throwException("请在项目设置配置 " + key + "项目ID");
}
return project;
}
public ProjectIssueConfig getProjectConfig(String configStr) {
ProjectIssueConfig issueConfig;
if (StringUtils.isNotBlank(configStr)) {
issueConfig = JSONObject.parseObject(configStr, ProjectIssueConfig.class);
} else {
issueConfig = new ProjectIssueConfig();
}
return issueConfig;
}
protected boolean isIntegratedPlatform(String workspaceId, String platform) {
@ -491,7 +508,9 @@ public abstract class AbstractIssuePlatform implements IssuesPlatform {
public <T> T getConfig(String platform, Class<T> clazz) {
String config = getPlatformConfig(platform);
if (StringUtils.isBlank(config)) MSException.throwException("配置为空");
if (StringUtils.isBlank(config)) {
MSException.throwException("配置为空");
}
return JSONObject.parseObject(config, clazz);
}

View File

@ -19,6 +19,7 @@ import io.metersphere.service.CustomFieldService;
import io.metersphere.track.dto.DemandDTO;
import io.metersphere.track.issue.client.JiraClientV2;
import io.metersphere.track.issue.domain.PlatformUser;
import io.metersphere.track.issue.domain.ProjectIssueConfig;
import io.metersphere.track.issue.domain.jira.*;
import io.metersphere.track.request.testcase.IssuesRequest;
import io.metersphere.track.request.testcase.IssuesUpdateRequest;
@ -103,12 +104,11 @@ public class JiraPlatform extends AbstractIssuePlatform {
@Override
public List<DemandDTO> getDemandList(String projectId) {
List<DemandDTO> list = new ArrayList<>();
JiraConfig config = getConfig();
Project project = getProject();
int maxResults = 50, startAt = 0;
JSONArray demands;
String key = validateJiraKey(projectId);
do {
demands = jiraClientV2.getDemands(key, config.getStorytype(), startAt, maxResults);
demands = jiraClientV2.getDemands(project.getJiraKey(), getStoryType(project.getIssueConfig()), startAt, maxResults);
for (int i = 0; i < demands.size(); i++) {
JSONObject o = demands.getJSONObject(i);
String issueKey = o.getString("key");
@ -130,24 +130,18 @@ public class JiraPlatform extends AbstractIssuePlatform {
if (config == null) {
MSException.throwException("jira config is null");
}
if (StringUtils.isBlank(config.getIssuetype())) {
MSException.throwException("Jira 问题类型为空");
}
}
private String validateJiraKey(String projectId) {
String jiraKey = getProjectId(projectId);
if (StringUtils.isBlank(jiraKey)) {
MSException.throwException("未关联Jira 项目Key");
}
return jiraKey;
public List<JiraIssueType> getIssueTypes(String jiraKey) {
return jiraClientV2.getIssueType(jiraKey);
}
@Override
public IssuesWithBLOBs addIssue(IssuesUpdateRequest issuesRequest) {
JiraConfig jiraConfig = setUserConfig();
JSONObject addJiraIssueParam = buildUpdateParam(issuesRequest, jiraConfig.getIssuetype());
setUserConfig();
Project project = getProject();
JSONObject addJiraIssueParam = buildUpdateParam(issuesRequest, getIssueType(project.getIssueConfig()), project.getJiraKey());
JiraAddIssueResponse result = jiraClientV2.addIssue(JSONObject.toJSONString(addJiraIssueParam));
JiraIssue issues = jiraClientV2.getIssues(result.getId());
@ -170,53 +164,57 @@ public class JiraPlatform extends AbstractIssuePlatform {
return res;
}
public Project getProject() {
return super.getProject(this.projectId, Project::getJiraKey);
}
/**
* 参数比较特殊需要特别处理
* @param fields
*/
private void setSpecialParam(JSONObject fields) {
String projectKey = getProjectId(this.projectId);
JiraConfig config = getConfig();
Map<String, JiraCreateMetadataResponse.Field> createMetadata = new HashMap<>();
Project project = getProject();
try {
createMetadata = jiraClientV2.getCreateMetadata(projectKey, config.getIssuetype());
} catch (Exception e) {}
Map<String, JiraCreateMetadataResponse.Field> createMetadata = jiraClientV2.getCreateMetadata(project.getJiraKey(), getIssueType(project.getIssueConfig()));
List<JiraUser> userOptions = jiraClientV2.getAssignableUser(project.getJiraKey());
for (String name : createMetadata.keySet()) {
JiraCreateMetadataResponse.Field item = createMetadata.get(name);
JiraCreateMetadataResponse.Schema schema = item.getSchema();
String key = item.getKey();
if (StringUtils.isBlank(key)) {
continue;
Boolean isUserKey = false;
if (CollectionUtils.isNotEmpty(userOptions) && StringUtils.isBlank(userOptions.get(0).getAccountId())) {
isUserKey = true;
}
if (schema != null && schema.getCustom() != null && schema.getCustom().endsWith("sprint")) {
try {
for (String name : createMetadata.keySet()) {
JiraCreateMetadataResponse.Field item = createMetadata.get(name);
JiraCreateMetadataResponse.Schema schema = item.getSchema();
String key = item.getKey();
if (StringUtils.isBlank(key) || schema == null) {
continue;
}
if (schema.getCustom() != null && schema.getCustom().endsWith("sprint")) {
try {
JSONObject field = fields.getJSONObject(key);
// sprint 传参数比较特殊需要要传数值
fields.put(key, field.getInteger("id"));
} catch (Exception e) {}
}
if (schema.getType() != null && schema.getType().endsWith("user")) {
JSONObject field = fields.getJSONObject(key);
// sprint 传参数比较特殊需要要传数值
fields.put(key, field.getInteger("id"));
} catch (Exception e) {}
}
if (key.equals("reporter")) {
JSONObject field = fields.getJSONObject(key);
try {
UUID.fromString(field.getString("id"));
} catch (Exception e) {
// 如果不是uuid则是用户的key参数调整为key
JSONObject newField = new JSONObject();
newField.put("key", field.getString("id"));
fields.put(key, newField);
if (isUserKey) {
// 如果不是用户ID则是用户的key参数调整为key
JSONObject newField = new JSONObject();
newField.put("name", field.getString("id"));
fields.put(key, newField);
}
}
}
} catch (Exception e) {
LogUtil.error(e);
}
}
private JSONObject buildUpdateParam(IssuesUpdateRequest issuesRequest, String issuetypeStr) {
private JSONObject buildUpdateParam(IssuesUpdateRequest issuesRequest, String issuetypeStr, String jiraKey) {
issuesRequest.setPlatform(key);
String jiraKey = validateJiraKey(issuesRequest.getProjectId());
JSONObject fields = new JSONObject();
JSONObject project = new JSONObject();
@ -309,8 +307,9 @@ public class JiraPlatform extends AbstractIssuePlatform {
@Override
public void updateIssue(IssuesUpdateRequest request) {
JiraConfig jiraConfig = setUserConfig();
JSONObject param = buildUpdateParam(request, jiraConfig.getIssuetype());
setUserConfig();
Project project = getProject();
JSONObject param = buildUpdateParam(request, getIssueType(project.getIssueConfig()), project.getJiraKey());
handleIssueUpdate(request);
jiraClientV2.updateIssue(request.getPlatformId(), JSONObject.toJSONString(param));
}
@ -406,9 +405,11 @@ public class JiraPlatform extends AbstractIssuePlatform {
add("timetracking");
add("attachment");
}};
JiraConfig config = getConfig();
String projectKey = getProjectId(this.projectId);
Map<String, JiraCreateMetadataResponse.Field> createMetadata = jiraClientV2.getCreateMetadata(projectKey, config.getIssuetype());
Project project = getProject();
Map<String, JiraCreateMetadataResponse.Field> createMetadata = jiraClientV2.getCreateMetadata(projectKey, getIssueType(project.getIssueConfig()));
String userOptions = getUserOptions(projectKey);
List<CustomFieldDao> fields = new ArrayList<>();
char filedKey = 'A';
@ -451,6 +452,24 @@ public class JiraPlatform extends AbstractIssuePlatform {
return issueTemplateDao;
}
public String getIssueType(String configStr) {
ProjectIssueConfig projectConfig = super.getProjectConfig(configStr);
String jiraIssueType = projectConfig.getJiraIssueType();
if (StringUtils.isBlank(jiraIssueType)) {
MSException.throwException("请在项目中配置 Jira 问题类型!");
}
return jiraIssueType;
}
public String getStoryType(String configStr) {
ProjectIssueConfig projectConfig = super.getProjectConfig(configStr);
String jiraStoryType = projectConfig.getJiraStoryType();
if (StringUtils.isBlank(jiraStoryType)) {
MSException.throwException("请在项目中配置 Jira 需求类型!");
}
return jiraStoryType;
}
private void setCustomFiledType(JiraCreateMetadataResponse.Schema schema, CustomFieldDao customFieldDao, String userOptions) {
Map<String, String> fieldTypeMap = new HashMap() {{
put("summary", CustomFieldType.INPUT.getValue());
@ -574,7 +593,7 @@ public class JiraPlatform extends AbstractIssuePlatform {
if (StringUtils.isNotBlank(val.getAccountId())) {
jsonObject.put("value", val.getAccountId());
} else {
jsonObject.put("value", val.getKey());
jsonObject.put("value", val.getName());
}
jsonObject.put("text", val.getDisplayName());
options.add(jsonObject);

View File

@ -55,6 +55,31 @@ public abstract class JiraAbstractClient extends BaseClient {
return fields;
}
public List<JiraIssueType> getIssueType(String projectKey) {
JiraIssueProject project = getProject(projectKey);
String url = getUrl("/issuetype/project?projectId={0}");
ResponseEntity<String> response = null;
try {
response = restTemplate.exchange(url, HttpMethod.GET, getAuthHttpEntity(), String.class, project.getId());
} catch (Exception e) {
LogUtil.error(e.getMessage(), e);
MSException.throwException(e.getMessage());
}
return (List<JiraIssueType>) getResultForList(JiraIssueType.class, response);
}
public JiraIssueProject getProject(String projectKey) {
String url = getUrl("/project/" + projectKey);
ResponseEntity<String> response = null;
try {
response = restTemplate.exchange(url, HttpMethod.GET, getAuthHttpEntity(), String.class);
} catch (Exception e) {
LogUtil.error(e.getMessage(), e);
MSException.throwException(e.getMessage());
}
return (JiraIssueProject) getResultForObject(JiraIssueProject.class, response);
}
public List<JiraUser> getAssignableUser(String projectKey) {
String url = getBaseUrl() + "/user/assignable/search?project={1}";
ResponseEntity<String> response = null;
@ -160,6 +185,10 @@ public abstract class JiraAbstractClient extends BaseClient {
return ENDPOINT + PREFIX;
}
protected String getUrl(String path) {
return getBaseUrl() + path;
}
public void setConfig(JiraConfig config) {
if (config == null) {
MSException.throwException("config is null");

View File

@ -0,0 +1,12 @@
package io.metersphere.track.issue.domain;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class ProjectIssueConfig {
private String jiraIssueType;
private String jiraStoryType;
private String projectKey;
}

View File

@ -0,0 +1,12 @@
package io.metersphere.track.issue.domain.jira;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class JiraIssueProject {
private String id;
private String name;
private String key;
}

View File

@ -0,0 +1,12 @@
package io.metersphere.track.issue.domain.jira;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class JiraIssueType {
private String id;
private String name;
private String untranslatedName;
}

View File

@ -8,6 +8,7 @@ import lombok.Setter;
public class JiraUser {
private String accountId;
private String key;
private String name;
private String displayName;
private String emailAddress;
private Boolean active;

View File

@ -0,0 +1,12 @@
package io.metersphere.track.request.issues;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class JiraIssueTypeRequest {
private String projectId;
private String workspaceId;
private String jiraKey;
}

View File

@ -64,6 +64,7 @@ public class DemandService {
}
issueRequest.setWorkspaceId(workspaceId);
issueRequest.setProjectId(projectId);
List<AbstractIssuePlatform> platformList = IssueFactory.createPlatforms(platforms, issueRequest);
platformList.forEach(platform -> {
List<DemandDTO> demand = platform.getDemandList(projectId);

View File

@ -29,7 +29,9 @@ import io.metersphere.track.dto.TestPlanFunctionResultReportDTO;
import io.metersphere.track.dto.TestPlanSimpleReportDTO;
import io.metersphere.track.issue.*;
import io.metersphere.track.issue.domain.PlatformUser;
import io.metersphere.track.issue.domain.jira.JiraIssueType;
import io.metersphere.track.issue.domain.zentao.ZentaoBuild;
import io.metersphere.track.request.issues.JiraIssueTypeRequest;
import io.metersphere.track.request.testcase.AuthUserIssueRequest;
import io.metersphere.track.request.testcase.IssuesRequest;
import io.metersphere.track.request.testcase.IssuesUpdateRequest;
@ -647,12 +649,26 @@ public class IssuesService {
public IssueTemplateDao getThirdPartTemplate(String projectId) {
if (StringUtils.isNotBlank(projectId)) {
Project project = projectService.getProjectById(projectId);
IssuesRequest issuesRequest = new IssuesRequest();
issuesRequest.setProjectId(projectId);
issuesRequest.setWorkspaceId(project.getWorkspaceId());
return IssueFactory.createPlatform(IssuesManagePlatform.Jira.toString(), issuesRequest)
return IssueFactory.createPlatform(IssuesManagePlatform.Jira.toString(), getDefaultIssueRequest(projectId, project.getWorkspaceId()))
.getThirdPartTemplate();
}
return new IssueTemplateDao();
}
public IssuesRequest getDefaultIssueRequest(String projectId, String workspaceId) {
IssuesRequest issuesRequest = new IssuesRequest();
issuesRequest.setProjectId(projectId);
issuesRequest.setWorkspaceId(workspaceId);
return issuesRequest;
}
public List<JiraIssueType> getIssueTypes(JiraIssueTypeRequest request) {
IssuesRequest issuesRequest = getDefaultIssueRequest(request.getProjectId(), request.getWorkspaceId());
JiraPlatform platform = (JiraPlatform) IssueFactory.createPlatform(IssuesManagePlatform.Jira.toString(), issuesRequest);
if (StringUtils.isNotBlank(request.getJiraKey())) {
return platform.getIssueTypes(request.getJiraKey());
} else {
return new ArrayList<>();
}
}
}

View File

@ -193,3 +193,6 @@ UPDATE test_case
ALTER TABLE `test_plan_report_content` ADD COLUMN `error_report_cases` LONGTEXT COMMENT '误报状态接口用例';
ALTER TABLE `test_plan_report_content` ADD COLUMN `error_report_scenarios` LONGTEXT COMMENT '误报状态场景用例';
-- 缺陷相关配置
ALTER TABLE project ADD issue_config TEXT NULL;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

View File

@ -43,14 +43,9 @@
<el-form-item :label-width="labelWidth" :label="$t('project.tapd_id')" v-if="tapd">
<el-input v-model="form.tapdId" autocomplete="off"></el-input>
</el-form-item>
<el-form-item :label-width="labelWidth" :label="$t('project.jira_key')" v-if="jira">
<el-input v-model="form.jiraKey" autocomplete="off"/>
<ms-instructions-icon effect="light">
<template>
<img class="jira-image" src="../../../../assets/jira-key.png"/>
</template>
</ms-instructions-icon>
</el-form-item>
<project-jira-config v-if="jira" :label-width="labelWidth" :form="form"/>
<el-form-item :label-width="labelWidth" :label="$t('project.zentao_id')" v-if="zentao">
<el-input v-model="form.zentaoId" autocomplete="off"></el-input>
<ms-instructions-icon effect="light">
@ -100,7 +95,7 @@
import {
getCurrentProjectID,
getCurrentUser, getCurrentUserId,
getCurrentWorkspaceId, hasLicense,
getCurrentWorkspaceId,
listenGoBack,
removeGoBackListener
} from "@/common/js/utils";
@ -124,10 +119,12 @@ import MsTablePagination from "@/business/components/common/pagination/TablePagi
import MsTableHeader from "@/business/components/common/components/MsTableHeader";
import MsDialogFooter from "@/business/components/common/components/MsDialogFooter";
import {ISSUE_PLATFORM_OPTION} from "@/common/js/table-constants";
import ProjectJiraConfig from "@/business/components/project/menu/components/ProjectJiraConfig";
export default {
name: "EditProject",
components: {
ProjectJiraConfig,
MsInstructionsIcon,
TemplateSelect,
MsResourceFiles,
@ -220,9 +217,10 @@ export default {
this.createVisible = true;
listenGoBack(this.handleClose);
if (row) {
row.issueConfigObj = row.issueConfig ? JSON.parse(row.issueConfig) : {};
this.form = Object.assign({}, row);
} else {
this.form = {};
this.form = {issueConfigObj: {}};
}
this.platformOptions = [];
this.platformOptions.push(...ISSUE_PLATFORM_OPTION);
@ -257,6 +255,7 @@ export default {
this.form.protocal = protocol;
this.form.workspaceId = getCurrentWorkspaceId();
this.form.createUser = getCurrentUserId();
this.form.issueConfig = JSON.stringify(this.form.issueConfigObj);
this.result = this.$post("/project/" + saveType, this.form, () => {
this.createVisible = false;
this.reload();

View File

@ -0,0 +1,61 @@
<template>
<div>
<el-form-item :label-width="labelWidth" :label="$t('project.jira_key')">
<el-input v-model="form.jiraKey" autocomplete="off" @blur="getIssueTypeOption"/>
<ms-instructions-icon effect="light">
<template>
<img class="jira-image" src="@/assets/jira-key.png"/>
</template>
</ms-instructions-icon>
</el-form-item>
<el-form-item :label-width="labelWidth" :label="$t('organization.integration.jira_issuetype')" prop="issuetype">
<el-select filterable v-model="form.issueConfigObj.jiraIssueType">
<el-option v-for="item in issueTypes" :key="item.id" :label="item.name" :value="item.untranslatedName">
</el-option>
</el-select>
</el-form-item>
<el-form-item :label-width="labelWidth" :label="$t('organization.integration.jira_storytype')" prop="storytype">
<el-select filterable v-model="form.issueConfigObj.jiraStoryType">
<el-option v-for="item in issueTypes" :key="item.id" :label="item.name" :value="item.untranslatedName">
</el-option>
</el-select>
</el-form-item>
</div>
</template>
<script>
import MsInstructionsIcon from "@/business/components/common/components/MsInstructionsIcon";
import {getJiraIssueType} from "@/network/Issue";
import {getCurrentWorkspaceId} from "@/common/js/utils";
export default {
name: "ProjectJiraConfig",
components: {MsInstructionsIcon},
props: ['labelWidth', 'form'],
data() {
return {
issueTypes: []
}
},
mounted() {
this.getIssueTypeOption();
},
methods: {
getIssueTypeOption() {
this.issueTypes = [];
getJiraIssueType({
projectId: this.form.id,
workspaceId: getCurrentWorkspaceId(),
jiraKey: this.form.jiraKey
}, (data) => {
this.issueTypes = data;
});
}
}
}
</script>
<style scoped>
.el-input, .el-textarea {
width: 80%;
}
</style>

View File

@ -13,22 +13,6 @@
<el-form-item :label="$t('organization.integration.jira_url')" prop="url">
<el-input v-model="form.url" :placeholder="$t('organization.integration.input_jira_url')"/>
</el-form-item>
<el-form-item :label="$t('organization.integration.jira_issuetype')" prop="issuetype">
<el-input v-model="form.issuetype" :placeholder="$t('organization.integration.input_jira_issuetype')"/>
<ms-instructions-icon effect="light">
<template>
<img class="jira-image" src="@/assets/jira-type.png"/>
</template>
</ms-instructions-icon>
</el-form-item>
<el-form-item :label="$t('organization.integration.jira_storytype')" prop="storytype">
<el-input v-model="form.storytype" :placeholder="$t('organization.integration.input_jira_storytype')"/>
<ms-instructions-icon effect="light">
<template>
<img class="jira-image" src="@/assets/jira-type.png"/>
</template>
</ms-instructions-icon>
</el-form-item>
</el-form>
</div>

View File

@ -151,3 +151,7 @@ export function isThirdPartEnable(callback) {
callback(project.platform !== LOCAL);
});
}
export function getJiraIssueType(param, callback) {
return basePost('/issues/jira/issuetype', param, callback);
}