irc_web/src/views/trials/trials-panel/setting/reading-unit/components/ArbitrationRules.vue

907 lines
29 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<!-- eslint-disable vue/no-unused-vars -->
<!-- eslint-disable vue/no-template-shadow -->
/* eslint-disable */
<template>
<el-form v-loading="loading">
<!-- -->
<el-form-item
:label="$t('trials:adRules:title:arbitrationRule')"
:label-width="'180px'"
>
<el-radio-group
v-model="JudgyInfo.ArbitrationRule"
:disabled="OtherInfo.IsSign"
>
<el-radio
v-for="item of $d.ArbitrationRule"
:key="item.id"
:disabled="!JudgyInfo.IsReadingTaskViewInOrder || true"
:label="item.value"
@change="changeArbitrationRule"
>
{{ item.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-collapse v-model="activeNames">
<el-collapse-item
v-for="(item, index) of QuestionList"
:key="item.ReadingQuestionTrialId"
style="position: relative"
:name="item.ReadingQuestionTrialId"
>
<div slot="title">
{{ item.PageName }}Q{{ index + 1 }}{{ item.QuestionName }}
</div>
<div style="position: relative">
<el-button
v-hasPermi="['trials:trials-panel:setting:reading-unit:edit']"
style="position: absolute; right: 0; top: 0; z-index: 10"
size="mini"
type="primary"
:disabled="OtherInfo.IsSign"
@click="apply(item.ReadingQuestionTrialId, index)"
>{{ $t("common:button:save") }}</el-button
>
<el-button
v-hasPermi="['trials:trials-panel:setting:reading-unit:edit']"
style="position: absolute; right: 60px; top: 0; z-index: 10"
size="mini"
type="primary"
:disabled="OtherInfo.IsSign"
@click="reset(item.ReadingQuestionTrialId, index)"
>{{ $t("common:button:reset") }}</el-button
>
<!-- 产生裁判阅片的条件 -->
<el-form-item
:label-width="'280px'"
:label="$t('trials:adRules:title:judgeTypeEnum')"
>
<el-radio-group
v-model="QuestionList[index].JudgeType"
@input="(val) => JudgeTypeChange(val, index)"
>
<template v-for="item of $d.JudgeTypeEnum">
<el-radio
:key="item.id"
:disabled="
OtherInfo.IsSign ||
!hasPermi(['trials:trials-panel:setting:reading-unit:edit'])
"
:label="item.value"
v-if="
JudgyInfo.ArbitrationRule === 1 ||
(item.value !== 4 && item.value !== 5)
"
>{{ item.label }}</el-radio
>
</template>
</el-radio-group>
</el-form-item>
</div>
<div
v-if="QuestionList[index].JudgeType === 3"
style="text-align: right; margin: 10px 0"
>
<!-- 添加规则 -->
<el-button
v-hasPermi="['trials:trials-panel:setting:reading-unit:edit']"
size="mini"
type="primary"
:disabled="OtherInfo.IsSign"
@click="addGroup(index, null)"
>{{ $t("trials:adRules:button:addRule") }}</el-button
>
</div>
<el-table
v-if="QuestionList[index].JudgeType === 3"
v-loading="loading"
:data="QuestionList[index].AnswerGroupList"
border
stripe
>
<!-- 序号 -->
<el-table-column
prop="AnswerGroupA"
:label="$t('trials:adRules:title:order')"
width="160"
>
<template slot-scope="scope">
{{ scope.$index + 1 }}
</template>
</el-table-column>
<!-- 阅片人A -->
<el-table-column
prop="AnswerGroupA"
:label="$t('trials:adRules:title:answerGroupA')"
min-width="100"
>
<template slot-scope="scope">
{{
QuestionList[index].QuestionGenre === 3
? scope.row.AnswerGroupA.map((v) =>
$fd(QuestionList[index].DictionaryCode, parseInt(v))
).toString()
: scope.row.AnswerGroupA.toString()
}}
</template>
</el-table-column>
<!-- 阅片人B -->
<el-table-column
prop="AnswerGroupB"
:label="$t('trials:adRules:title:answerGroupB')"
min-width="100"
>
<template slot-scope="scope">
{{
QuestionList[index].QuestionGenre === 3
? scope.row.AnswerGroupB.map((v) =>
$fd(QuestionList[index].DictionaryCode, parseInt(v))
).toString()
: scope.row.AnswerGroupB.toString()
}}
</template>
</el-table-column>
<el-table-column
prop="AnswerGroupB"
:label="$t('common:action:action')"
min-width="80"
>
<template slot-scope="scope">
<!-- 编辑 -->
<el-button
icon="el-icon-edit"
circle
:title="$t('common:button:edit')"
size="mini"
:disabled="OtherInfo.IsSign"
@click="addGroup(index, scope.$index)"
/>
<!-- 删除 -->
<el-button
icon="el-icon-delete"
circle
:title="$t('common:button:delete')"
size="mini"
:disabled="OtherInfo.IsSign"
@click="tagClose(index, scope.$index)"
/>
</template>
</el-table-column>
</el-table>
<div v-if="QuestionList[index].JudgeType === 2">
<div
style="
background: #f6f6f6;
border-radius: 20px;
padding: 15px 20px;
margin-top: 10px;
"
>
<el-checkbox-group
v-if="QuestionList[index].QuestionGenre === 3"
v-model="QuestionList[index].grouping"
>
<template v-for="item of $d[QuestionList[index].DictionaryCode]">
<el-checkbox
v-if="item.value !== -1"
:key="item.id"
:disabled="OtherInfo.IsSign"
:label="item.value"
>{{ item.label }}</el-checkbox
>
</template>
</el-checkbox-group>
<el-checkbox-group v-else v-model="QuestionList[index].grouping">
<el-checkbox
v-for="item of item.TypeValue.split('|')"
:key="item"
:disabled="OtherInfo.IsSign"
:label="item"
>{{ item }}</el-checkbox
>
</el-checkbox-group>
<div style="margin-top: 20px">
<!-- 当前选择答案分组: -->
{{ $t("trials:adRules:title:selectAnswerGroup") }}
<el-tag
v-if="
QuestionList[index].grouping.length > 0 &&
QuestionList[index].QuestionGenre !== 3
"
>{{
QuestionList[index].grouping.toString().replaceAll(",", "|")
}}</el-tag
>
<el-tag
v-if="
QuestionList[index].grouping.length > 0 &&
QuestionList[index].QuestionGenre === 3
"
>{{
QuestionList[index].grouping
.map(
(v) =>
$d[QuestionList[index].DictionaryCode].find(
(v1) => v1.value === v
).label
)
.toString()
.replaceAll(",", "|")
}}</el-tag
>
<el-button
size="mini"
type="primary"
:disabled="OtherInfo.IsSign"
@click="addGroup2(index)"
>
<!-- 添加分组 -->
{{ $t("trials:adRules:title:addGroup") }}
</el-button>
</div>
</div>
<div
v-if="QuestionList[index].QuestionGenre !== 3"
style="margin-top: 20px"
>
分组:
<el-tag
v-for="itemA of QuestionList[index].AnswerGroup2List"
:key="itemA"
closable
style="margin-right: 10px"
@close="
() => {
return tagClose2(index, indexA);
}
"
>{{ itemA }}</el-tag
>
</div>
<div
v-if="QuestionList[index].QuestionGenre === 3"
style="margin-top: 20px"
>
<!-- 分组: -->
{{ $t("trials:adRules:title:group") }}
<el-tag
v-for="itemA of QuestionList[index].AnswerGroup2List"
:key="itemA"
closable
style="margin-right: 10px"
@close="
() => {
return tagClose2(index, indexA);
}
"
>
{{
itemA
.split("|")
.map((v) =>
$fd(QuestionList[index].DictionaryCode, parseInt(v))
)
.join("|")
}}
</el-tag>
</div>
</div>
<div
v-if="
QuestionList[index].JudgeType === 4 ||
QuestionList[index].JudgeType === 5
"
>
<el-form
:inline="true"
:model="QuestionList[index]"
class="demo-form-inline"
:ref="
'JudgeDifferenceValue' + QuestionList[index].JudgeType + index
"
:rules="JudgeDifferenceValueQRules"
>
<el-form-item
:label="
$t(
`trials:trials-panel:setting:reading-unit:JudgeDifferenceValue${QuestionList[index].JudgeType}`
)
"
prop="JudgeDifferenceValue"
>
<el-input
v-model="QuestionList[index].JudgeDifferenceValue"
clearable
:disabled="OtherInfo.IsSign"
></el-input>
</el-form-item>
<el-form-item
:label="
$t(
`trials:trials-panel:setting:reading-unit:JudgeDifferenceType`
)
"
prop="JudgeDifferenceType"
>
<el-select
v-model="QuestionList[index].JudgeDifferenceType"
placeholder="请选择"
>
<el-option
v-for="item of $d.JudgeDifferenceType"
:key="item.id"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
</el-form-item>
</el-form>
</div>
</el-collapse-item>
</el-collapse>
<!-- </el-tab-pane>-->
<!-- </el-tabs>-->
<!-- 选择答案 -->
<el-dialog
v-if="QuestionVisible"
:title="$t('trials:adRules:title:selectAnswer')"
:visible.sync="QuestionVisible"
width="800px"
:close-on-click-modal="false"
custom-class="base-dialog-wrapper"
append-to-body
>
<div class="base-dialog-body">
<!-- 阅片人A -->
<el-form-item
label-width="110px"
:label="$t('trials:adRules:title:answerGroupA')"
>
<el-checkbox-group v-model="QuestionList[selectIndex].groupingA">
<template
v-for="item of QuestionList[selectIndex].TypeValue.split('|')"
>
<el-checkbox
v-if="QuestionList[selectIndex].QuestionGenre !== 3"
:key="item"
:label="item"
:disabled="
QuestionList[selectIndex].groupingB.length
? ~QuestionList[selectIndex].groupingB.indexOf(item)
: false
"
>{{ item }}</el-checkbox
>
</template>
<template
v-for="item of $d[QuestionList[selectIndex].DictionaryCode]"
>
<el-checkbox
v-if="
QuestionList[selectIndex].QuestionGenre === 3 &&
item.value !== -1
"
:key="item.id"
:label="item.value"
:disabled="
QuestionList[selectIndex].groupingB.length
? ~QuestionList[selectIndex].groupingB.indexOf(item.value)
: false
"
>{{ item.label }}</el-checkbox
>
</template>
</el-checkbox-group>
</el-form-item>
<!-- 阅片人B -->
<el-form-item
label-width="110px"
:label="$t('trials:adRules:title:answerGroupB')"
>
<el-checkbox-group v-model="QuestionList[selectIndex].groupingB">
<template
v-for="item of QuestionList[selectIndex].TypeValue.split('|')"
>
<el-checkbox
v-if="QuestionList[selectIndex].QuestionGenre !== 3"
:key="item"
:label="item"
:disabled="
QuestionList[selectIndex].groupingA.length
? ~QuestionList[selectIndex].groupingA.indexOf(item)
: false
"
>{{ item }}</el-checkbox
>
</template>
<template
v-for="item of $d[QuestionList[selectIndex].DictionaryCode]"
>
<el-checkbox
v-if="
QuestionList[selectIndex].QuestionGenre === 3 &&
item.value !== -1
"
:key="item.id"
:label="item.value"
:disabled="
QuestionList[selectIndex].groupingA.length
? ~QuestionList[selectIndex].groupingA.indexOf(item.value)
: false
"
>{{ item.label }}</el-checkbox
>
</template>
</el-checkbox-group>
</el-form-item>
</div>
<div
class="base-dialog-footer"
style="text-align: right; margin-top: 10px"
>
<!-- 取消 -->
<el-button
v-hasPermi="['trials:trials-panel:setting:reading-unit:edit']"
:disabled="btnLoading"
size="small"
type="primary"
@click="
QuestionVisible = false;
$set(QuestionList[selectIndex], 'groupingA', []);
$set(QuestionList[selectIndex], 'groupingB', []);
"
>
{{ $t("common:button:cancel") }}
</el-button>
<el-button
v-hasPermi="['trials:trials-panel:setting:reading-unit:edit']"
:disabled="btnLoading"
size="small"
type="primary"
@click="save"
>
{{ $t("common:button:save") }}
</el-button>
</div>
</el-dialog>
</el-form>
</template>
<script>
import {
getTrialConfirmCriterionList,
getTrialCriterionJudgeQuestionList,
setTrialCriterionJudgeQuestionAnswerGroup,
} from "@/api/trials/reading";
import { setTrialJudgyInfo, getTrialJudgyInfo } from "@/api/trials/setting";
export default {
props: {
trialReadingCriterionId: {
type: String,
default: "",
},
},
data() {
return {
CriterionList: [],
QuestionList: [],
ReadingQuestionCriterionTrialId: null,
btnLoading: false,
loading: false,
index: 0,
QuestionVisible: false,
activeNames: null,
indexA: null,
type: null,
OtherInfo: {
IsSign: true,
},
JudgyInfo: {},
JudgeDifferenceValueQRules: {
JudgeDifferenceType: [
{
required: true,
message: this.$t(
"trials:trials-list:setitng:JudgeDifferenceTypeRequired"
),
trigger: "blur",
},
],
JudgeDifferenceValue: [
{
required: true,
message: this.$t(
"trials:trials-list:setitng:JudgeDifferenceValueRequired"
),
trigger: "blur",
},
{
pattern: /^[0-9]+(.[0-9]{2})?$/,
message: this.$t("trials:trials-list:setitng:JudgeDifferenceValue"),
trigger: "blur",
},
{
validator: (rule, value, callback) => {
if (value <= 0) {
callback(
new Error(
this.$t(
"trials:trials-list:setitng:JudgeDifferenceValueMin"
)
)
);
} else {
callback();
}
},
trigger: "blur",
},
],
},
};
},
watch: {
TrialReadingCriterionId(v) {
if (v === null) return;
this.loading = true;
getTrialCriterionJudgeQuestionList({
TrialId: this.$route.query.trialId,
// ReadingQuestionCriterionTrialId: v,
TrialReadingCriterionId: this.trialReadingCriterionId,
})
.then((res) => {
this.loading = false;
this.QuestionList = res.Result;
this.OtherInfo = res.OtherInfo;
this.activeNames = this.QuestionList.map(
(v) => v.ReadingQuestionTrialId
);
this.QuestionList.forEach((v) => {
this.$set(v, "grouping", []);
this.$set(v, "groupingA", []);
this.$set(v, "groupingB", []);
this.$set(
v,
"AnswerGroupList",
Object.assign([], v.AnswerCombination)
);
this.$set(v, "AnswerGroup2List", Object.assign([], v.AnswerGroup));
});
})
.catch(() => {
this.btnLoading = false;
this.loading = false;
});
},
},
mounted() {
this.getList();
this.getTrialJudgyInfo();
},
methods: {
// 修改仲裁规则
changeArbitrationRule(value) {
if (value !== 1) {
this.QuestionList.forEach((item) => {
item.JudgeDifferenceValue = 0;
item.JudgeDifferenceType = 0;
});
}
},
JudgeTypeChange(value, index) {
this.$nextTick(() => {
if (value === 4 || value === 5) {
if (this.$refs["JudgeDifferenceValue" + value + index][0]) {
this.$refs["JudgeDifferenceValue" + value + index][0].resetFields();
// this.QuestionList[index].JudgeDifferenceValue = 0;
}
}
});
},
saveAllSync() {
return new Promise((resolve, reject) => {
var arr = [];
this.QuestionList.forEach((v, i) => {
arr.push(this.applySync(v.ReadingQuestionTrialId, i));
});
Promise.all(arr)
.then((res) => {
console.log(res);
resolve(true);
})
.catch((res) => {
console.log("进入catch");
resolve(false);
});
});
},
applySync(ReadingQuestionTrialId, index) {
return new Promise(async (resolve, reject) => {
console.log(this.QuestionList[index].JudgeType);
if (this.QuestionList[index].JudgeType === 0) {
reject(false);
return;
}
if (
this.QuestionList[index].JudgeType === 2 &&
this.QuestionList[index].AnswerGroup2List.length === 0
) {
reject(false);
return;
}
if (
this.QuestionList[index].JudgeType === 3 &&
this.QuestionList[index].AnswerGroupList.length === 0
) {
reject(false);
return;
}
if (
this.QuestionList[index].JudgeType === 4 ||
this.QuestionList[index].JudgeType === 5
) {
try {
let validate = await this.$refs[
"JudgeDifferenceValue" +
this.QuestionList[index].JudgeType +
index
][0].validate();
if (!validate) return reject(false);
} catch (err) {
return reject(false);
}
}
this.btnLoading = true;
this.loading = true;
setTrialCriterionJudgeQuestionAnswerGroup({
ReadingQuestionTrialId: ReadingQuestionTrialId,
AnswerGroup: this.QuestionList[index].AnswerGroup2List,
AnswerCombination: this.QuestionList[index].AnswerGroupList,
JudgeType: this.QuestionList[index].JudgeType,
JudgeDifferenceValue: Number(
this.QuestionList[index].JudgeDifferenceValue
),
JudgeDifferenceType: Number(
this.QuestionList[index].JudgeDifferenceType
),
})
.then((res) => {
resolve();
this.btnLoading = false;
this.loading = false;
})
.catch(() => {
reject(false);
this.btnLoading = false;
this.loading = false;
});
});
},
setTrialJudgyInfo() {
this.loading = true;
setTrialJudgyInfo({
TrialId: this.$route.query.trialId,
ArbitrationRule: this.JudgyInfo.ArbitrationRule,
TrialReadingCriterionId: this.trialReadingCriterionId,
})
.then((res) => {
this.loading = false;
this.$message.success(this.$t("common:message:savedSuccessfully")); // '保存成功'
})
.catch(() => {
this.loading = false;
});
},
getTrialJudgyInfo() {
this.loading = true;
getTrialJudgyInfo({
TrialId: this.$route.query.trialId,
TrialReadingCriterionId: this.trialReadingCriterionId,
})
.then((res) => {
this.JudgyInfo = res.Result;
this.loading = false;
})
.catch((v) => {
this.loading = false;
});
},
tagClose2(index, indexA) {
// '删除该规则组?'
this.$confirm(this.$t("trials:adRules:message:msg1")).then(() => {
this.QuestionList[index].AnswerGroup2List.splice(indexA, 1);
});
},
tagClose(index, indexA) {
// '删除该规则组?'
this.$confirm(this.$t("trials:adRules:message:msg1")).then(() => {
this.QuestionList[index].AnswerGroupList.splice(indexA, 1);
});
},
save() {
var index = this.selectIndex;
var indexA = this.indexA;
if (this.QuestionList[index].groupingA.length === 0) {
this.$alert(this.$t("trials:adRules:message:msg2")); // '请先选择答案A'
return;
}
if (this.QuestionList[index].groupingB.length === 0) {
this.$alert(this.$t("trials:adRules:message:msg3")); // '请先选择答案B'
return;
}
if (this.type === "add") {
this.QuestionList[index].AnswerGroupList.push({
AnswerGroupA: this.QuestionList[index].groupingA,
AnswerGroupB: this.QuestionList[index].groupingB,
});
} else {
this.$set(
this.QuestionList[index].AnswerGroupList[indexA],
"AnswerGroupA",
this.QuestionList[index].groupingA
);
this.$set(
this.QuestionList[index].AnswerGroupList[indexA],
"AnswerGroupB",
this.QuestionList[index].groupingB
);
}
this.$set(this.QuestionList[index], "groupingA", []);
this.$set(this.QuestionList[index], "groupingB", []);
this.$message.success(this.$t("trials:adRules:message:msg4")); // '成功新增答案规则'
this.QuestionVisible = false;
},
addGroup2(index) {
if (this.QuestionList[index].grouping.length === 0) {
this.$alert(this.$t("trials:adRules:message:msg5")); // '请先选择答案,再添加分组'
return;
}
var grouping = this.QuestionList[index].grouping
.toString()
.replaceAll(",", "|");
this.QuestionList[index].AnswerGroup2List.push(`|${grouping}|`);
this.$set(this.QuestionList[index], "grouping", []);
},
addGroup(index, indexA) {
this.selectIndex = index;
this.type = "add";
if (indexA !== null) {
this.indexA = indexA;
this.type = "edit";
this.$set(
this.QuestionList[index],
"groupingA",
this.QuestionList[index].AnswerGroupList[indexA].AnswerGroupA
);
this.$set(
this.QuestionList[index],
"groupingB",
this.QuestionList[index].AnswerGroupList[indexA].AnswerGroupB
);
}
this.QuestionVisible = true;
},
reset(ReadingQuestionTrialId, index) {
// '确定重置当前设置的裁判任务生成规则吗?'
this.$confirm(this.$t("trials:adRules:message:msg6")).then(() => {
this.btnLoading = true;
this.loading = true;
setTrialCriterionJudgeQuestionAnswerGroup({
ReadingQuestionTrialId: ReadingQuestionTrialId,
AnswerGroup: [],
AnswerCombination: [],
JudgeType: 0,
JudgeDifferenceValue: 0,
JudgeDifferenceType: 0,
})
.then((res) => {
this.$set(this.QuestionList[index], "AnswerGroup2List", []);
this.$set(this.QuestionList[index], "AnswerGroupList", []);
this.$set(this.QuestionList[index], "JudgeType", 0);
this.$set(this.QuestionList[index], "JudgeDifferenceValue", 0);
this.$set(this.QuestionList[index], "JudgeDifferenceType", 0);
this.$message.success(this.$t("trials:adRules:message:msg7")); // '重置成功'
this.btnLoading = false;
this.loading = false;
})
.catch(() => {
this.btnLoading = false;
this.loading = false;
});
});
},
async apply(ReadingQuestionTrialId, index) {
if (this.QuestionList[index].JudgeType === 0) {
this.$alert(this.$t("trials:adRules:message:msg8")); // '请先配置规则才能应用'
return;
}
if (
this.QuestionList[index].JudgeType === 2 &&
this.QuestionList[index].AnswerGroup2List.length === 0
) {
this.$alert(this.$t("trials:adRules:message:msg8")); // '请先配置规则才能应用'
return;
}
if (
this.QuestionList[index].JudgeType === 3 &&
this.QuestionList[index].AnswerGroupList.length === 0
) {
this.$alert(this.$t("trials:adRules:message:msg8"));
return;
}
if (
this.QuestionList[index].JudgeType === 4 ||
this.QuestionList[index].JudgeType === 5
) {
try {
let validate = await this.$refs[
"JudgeDifferenceValue" + this.QuestionList[index].JudgeType + index
][0].validate();
if (!validate) return;
} catch (err) {
return;
}
}
this.btnLoading = true;
this.loading = true;
setTrialCriterionJudgeQuestionAnswerGroup({
ReadingQuestionTrialId: ReadingQuestionTrialId,
AnswerGroup: this.QuestionList[index].AnswerGroup2List,
AnswerCombination: this.QuestionList[index].AnswerGroupList,
JudgeType: this.QuestionList[index].JudgeType,
JudgeDifferenceValue: Number(
this.QuestionList[index].JudgeDifferenceValue
),
JudgeDifferenceType: Number(
this.QuestionList[index].JudgeDifferenceType
),
})
.then((res) => {
this.$message.success(this.$t("trials:adRules:message:msg9")); // '应用成功'
this.btnLoading = false;
this.loading = false;
})
.catch(() => {
this.btnLoading = false;
this.loading = false;
});
},
tabClick(v) {
this.ReadingQuestionCriterionTrialId =
this.CriterionList[this.index].ReadingQuestionCriterionTrialId;
},
getList() {
this.loading = true;
getTrialCriterionJudgeQuestionList({
TrialId: this.$route.query.trialId,
TrialReadingCriterionId: this.trialReadingCriterionId,
})
.then((res) => {
this.loading = false;
this.QuestionList = res.Result;
this.OtherInfo = res.OtherInfo;
this.activeNames = this.QuestionList.map(
(v) => v.ReadingQuestionTrialId
);
this.QuestionList.forEach((v) => {
this.$set(v, "grouping", []);
this.$set(v, "groupingA", []);
this.$set(v, "groupingB", []);
this.$set(
v,
"AnswerGroupList",
Object.assign([], v.AnswerCombination)
);
this.$set(v, "AnswerGroup2List", Object.assign([], v.AnswerGroup));
});
})
.catch(() => {
this.btnLoading = false;
this.loading = false;
});
},
},
};
</script>