<template>
    <div class="caseInputForm">
        <el-form :inline="true" :model="dataForm" :rules="dataRule" ref="dataForm" class="demo-form-inline" label-width="90px">
            <el-card class="box-card">
                <div slot="header">
                    <span class="item-title-font"><i class="el-icon-minus icon-minus-rotated"></i>实训信息</span>
                    <el-button type="primary" style="float: right;" size="medium" @click="goBackList">返回</el-button>
                </div>
                <el-row :gutter="20">
                    <el-col :span="8">
                        <el-form-item label="实训名称" prop="name">
                            <el-input v-model.trim="dataForm.name" :disabled="formAction==2" placeholder="实训名称" style="width: 280px;"></el-input>
                        </el-form-item>
                    </el-col>
                    <el-col :span="8">
                        <el-form-item label="实训用途" prop="type">
                            <el-select v-model="dataForm.type" placeholder="实训用途" :disabled="formAction==2">
                                <el-option label="考核" value="1"></el-option>
                                <el-option label="练习" value="2"></el-option>
                            </el-select>
                        </el-form-item>
                    </el-col>
                </el-row>
            </el-card>
            <el-card class="box-card">
                <div slot="header">
                    <span class="item-title-font"><i class="el-icon-minus icon-minus-rotated"></i>判分设置</span>
                </div>
                <div>
                    <div><p>量化指标：</p>
                        <el-transfer
                                filterable
                                :filter-method="filterMethod"
                                filter-placeholder="请输入指标名称"
                                v-model="value"
                                :data="data">
                        </el-transfer>
                    </div>
                </div>
            </el-card>
        </el-form>
    </div>
</template>

<script>
    // import DictCaseData from "./dictCaseData";
    // import DictTradeList from "./dictTradeList";

    export default {
        name: 'case-detail',
        // components: {DictTradeList, DictCaseData},
        data() {
            // 自定义校验规则
            var validateScore = (rule, value, callback) => {
                if (!value) {
                    callback(new Error('请输入分数'));
                } else if (!(/^(([1-9][0-9]*)|(([0]\.\d{0,2}|[1-9][0-9]*\.\d{0,2})))$/.test(value)) || value > 100) {
                    callback(new Error('请输入0-100之间最多两位小数的数字'));
                } else {
                    callback();
                }
            };
            var validateContent = (rule, value, callback) => {
                if (!value.trim()) {
                    callback(new Error('请填写案例描述'));
                } else if (value.length > 3000) {
                    callback(new Error('长度在 1 到 3000 个字符'));
                } else {
                    callback();
                }
            };
            return {
                isShowData: false,
                tradeDialogVisible: false,
                isShowTradeDelBtn: false,
                formAction: 0, // 0：add,1:edit,2:view
                dataForm: {
                    id: '',
                    type: '',
                    name: '',
                    content: '',
                    totalScore: 0,
                    caseDataList: [],
                    tradeList: [],
                    isAdmin: 1, // 默认 管理员内置
                },
                dataRule: {
                    name: [
                        { required: true, message: '请输入项目名称', trigger: 'blur' },
                        { min: 1, max: 30, message: '长度在 1 到 30 个字符', trigger: 'blur' }
                    ],
                    type: [
                        { required: true, message: '请选择项目权限', trigger: 'change' }
                    ],
                    content: [
                        {validator: validateContent, trigger: 'blur'}
                    ],
                    score: [
                        {validator: validateScore, trigger: 'blur'}
                    ],
                },
                dictCaseDataList: [],
                selectedItemRows: [],
                selectedTradeItems: [],
                delTradeItems: [],
                tradeNotInIds: [],
            }
        },
        created() {
            if (this.$route.query.id) {
                this.dataForm.id = this.$route.query.id;
                this.$http.get('/authapi/bs_projectManage/getDetail?id=' + this.dataForm.id).then(response => {
                    this.dataForm = response;
                    // 下拉框标签回显问题
                    this.dataForm.type = String(response.type);
                    // 回显案例数据
                    this.selectedItemRows = this.dataForm.caseDataList;
                    // 计分交易赋值
                    this.selectedTradeItems = this.dataForm.tradeList;

                    if (this.$route.query.isEdit === 1) {
                        // 编辑
                        this.formAction = 1;
                        if (this.selectedTradeItems && this.selectedTradeItems.length > 0) {
                            this.isShowTradeDelBtn = true;// 显示删除按钮
                        }
                    } else {
                        // 查看
                        this.formAction = 2;
                    }
                });
            }
        },
        methods: {
            goBackList() {
                // this.$router.push({name: 'CaseList'});
                this.$router.go(-1);
            },
            goBackAdd() {
                this.isShowData = false;
            },
            toAddCaseData() {
                // 页面滚动条回到顶部
                window.scrollTo(0, 0);
                this.isShowData = true;
                this.getCaseData(null);
            },
            getCaseData(condition) {
                this.$http.get('/authapi/bs_projectManage/getDictCaseDataList', {params: condition}).then(response => {
                    this.dictCaseDataList = response;

                    // 对于已经确定勾选的，在此打开选择界面，需回显已勾选的数据
                    if (this.selectedItemRows && this.selectedItemRows.length > 0) {
                        let selectedItemIds = this.selectedItemRows.map(function (row) {
                            return row.id;
                        });
                        this.dictCaseDataList.forEach(p => {
                            if (selectedItemIds.indexOf(p.id) > -1) {
                                p.checked = true;
                            }
                        });
                    }
                });
            },
            handleItemSelectionChange(val) {
                this.selectedItemRows = val;
            },
            doAddCaseData() {
                if (!this.selectedItemRows || this.selectedItemRows.length === 0) {
                    this.$notify.warning({
                        title: '系统提示',
                        message: '您没选择任何数据，请先选择！',
                        duration: 2000,
                    });
                    return;
                }
                this.isShowData = false;
                this.dataForm.caseDataList = this.selectedItemRows;
            },
            cancelAddCaseData() {
                this.isShowData = false;
                this.selectedItemRows = this.dataForm.caseDataList;
            },
            getFileUrl(file) {
                return window.SITE_CONFIG['serverUrl'] + file.imgUrl;
            },
            toAddTrade() { // 打开添加计分点弹窗
                this.tradeDialogVisible = true;
                // 获取已添加的交易id集合
                this.tradeNotInIds = this.selectedTradeItems.map(item => {
                    return item.id;
                });
            },
            doAddSelectTrade(val) {// 添加已选中的计分点到新增界面
                if (this.selectedTradeItems && this.selectedTradeItems.length > 0) {
                    // 追加val数组的所有元素
                    this.selectedTradeItems.push.apply(this.selectedTradeItems, val);
                } else {
                    this.selectedTradeItems = val;
                }
                this.dataForm.tradeList = this.selectedTradeItems;
                this.dataForm.tradeList.forEach(item => {
                    this.$set(item, 'score', '');
                    // this.$set(item, 'tradeId', item.id);
                });

                this.isShowTradeDelBtn = true;// 显示删除按钮
            },
            closeTradeDialog() { // 关闭计分点弹窗
                this.tradeDialogVisible = false;
            },
            handleTradeSelectionChange(val) {
                this.delTradeItems = val;
            },
            checkboxIsEnabled() { // 复选框是否可用
                if (this.formAction === 2) {
                    return false;
                } else {
                    return true;
                }
            },
            removeTradeItemBatch() { // 批量移除选中项
                if (!this.delTradeItems || this.delTradeItems.length === 0) {
                    this.$notify.warning({
                        title: '系统提示',
                        message: '您没选择任何数据，请先选择！',
                        duration: 2000,
                    });
                    return;
                }
                // 遍历当前选中项
                this.delTradeItems.forEach(item => {
                    if (this.selectedTradeItems.indexOf(item) > -1) {
                        // 移除当前项
                        this.selectedTradeItems.splice(this.selectedTradeItems.indexOf(item), 1);
                        // this.dataForm.tradeList.splice(this.dataForm.tradeList.indexOf(item), 1);
                    }
                });
                if (this.selectedTradeItems.length === 0) {
                    this.isShowTradeDelBtn = false; // 隐藏删除按钮
                }
            },
            removeTradeItem(row) { // 移除当前行
                let index = this.selectedTradeItems.findIndex(item => {
                    return item.id == row.id;
                });
                if (index > -1) {
                    this.selectedTradeItems.splice(this.selectedTradeItems.indexOf(row), 1);
                }
            },
            moveUpTradeItem(index,row) { // 向上移动
                let that = this;
                // console.log('上移', index, row);
                // console.log(that.dataForm.tradeList[index]);
                if (index > 0) {
                    let upDate = that.dataForm.tradeList[index - 1];
                    that.dataForm.tradeList.splice(index - 1, 1);
                    that.dataForm.tradeList.splice(index, 0, upDate);
                } else {
                    alert('已经是第一条，不可上移');
                }
            },
            moveDownTradeItem(index,row) { // 向下移动
                let that = this;
                // console.log('下移', index, row);
                if ((index + 1) === that.dataForm.tradeList.length) {
                    alert('已经是最后一条，不可下移');
                } else {
                    // console.log(index);
                    let downDate = that.dataForm.tradeList[index + 1];
                    that.dataForm.tradeList.splice(index + 1, 1);
                    that.dataForm.tradeList.splice(index, 0, downDate);
                }
            },
            getScoreSummaries(param) { // 计算总分
                const { columns, data } = param;
                const sums = [];
                let values = [];
                columns.forEach((column, index) => {
                    if (index === 0) {
                        sums[index] = '总分';
                        return;
                    }

                    if (index === 6) { // 分数栏
                        values = data.map(item => Number(item['score']));
                        sums[index] = values.reduce((prev, curr) => {
                            const value = Number(curr);
                            if (!isNaN(value)) {
                                return prev + curr;
                            } else {
                                return prev;
                            }
                        }, 0);
                        // 给右上角总分赋值
                        this.$set(this.dataForm,'totalScore',sums[index]);
                        sums[index] += ' 分';
                    } else {
                        sums[index] = '--';
                    }
                });

                return sums;
            },
            submitForm(formName) {
                let self = this;
                self.$refs[formName].validate((valid) => {
                    if (valid) {
                        let totalScore = self.dataForm.totalScore;
                        if (totalScore === 0) {
                            self.$notify.error({
                                title: '错误提示',
                                message: '判分设置模块没有添加计分点！',
                                duration: 2000,
                            });
                            return;
                        } else if (totalScore > 100) {
                            self.$notify.error({
                                title: '错误提示',
                                message: '判分设置模块总分超过100分！',
                                duration: 2000,
                            });
                            return;
                        } else if (totalScore < 100) {
                            self.$notify.error({
                                title: '错误提示',
                                message: '判分设置模块总分不足100分！',
                                duration: 2000,
                            });
                            return;
                        }
                        // userType 0学生 1教师 2管理员
                        if (self.formAction == 0 && self.$store.state.app.user.userType) {
                            self.dataForm.isAdmin = self.$store.state.app.user.userType == 1 ? 0 : 1;
                        }

                        self.$http.post('/authapi/bs_projectManage/addOrUpdateProject', self.dataForm).then(response => {
                            if(response.status==1) {
                                self.dataForm = Object.assign({}, self.dataForm, response.id);
                                self.formAction = 1;
                                self.$notify.success({
                                    title: '操作成功！',
                                    message: '新增项目成功！',
                                    duration: 2000,
                                });
                                self.goBackList();
                            }else{
                                self.$message.error(response.msg);
                            }
                        }).catch(error => {
                            self.$message.error(error);
                        })
                    } else {
                        self.$notify.error({
                            title: '错误提示',
                            message: '系统输入验证失败！',
                            duration: 2000,
                        });
                        return false;
                    }
                });
            }
        }
    }
</script>

<style lang="scss">
    .caseInputForm{
        .box-card {
            margin-bottom: 10px;
            .el-card__header{
                border-bottom: 1px dashed #c9cacc;
                padding-bottom: 10px;
                padding-top: 10px;
                height: auto;
            }
            .el-button--medium{
                padding: 8px 20px;
            }
            .el-form-item.is-required .el-form-item__label:after {
                content: '';
            }

            .score-input {
                margin-bottom: 0px;
                /deep/ .el-form-item__error {
                    position: unset;
                }
            }
            .icon-minus-rotated:before {
                -ms-transform: rotate(90deg); /* IE 9 */
                -moz-transform: rotate(90deg); /* Firefox */
                -webkit-transform: rotate(90deg); /* Safari 和 Chrome */
                -o-transform: rotate(90deg); /* Opera */
                transform: rotate(90deg);
                display: inline-block;
                font-weight: bolder;
            }

            .item-title-font {
                font-weight: bold;
                font-size: 15px;
                vertical-align: middle;
                line-height: 29px;
            }
        }
    }
</style>