Forráskód Böngészése

Merge branch 'master' of http://110.41.163.243:9980/kd-aiot/kd-aiot-frontend-wt

yusheng 8 hónapja
szülő
commit
556605d323

+ 268 - 0
src/BIZComponents/processSubmitDialog/components/businessComponent copy.vue

@@ -0,0 +1,268 @@
+<template>
+    <div>
+        <el-form ref="form" :model="info">
+            <div v-for="(row, $index) in info.blank_business_component" :key="$index">
+                <el-form-item>
+                    <div class="header">
+                        <span>事项{{ $index + 1 }}:</span>
+                        <el-button v-if="$index !== 0" type="danger" size="mini" icon="el-icon-delete" @click="delNewRow($index)">删除</el-button>
+                    </div>
+                </el-form-item>
+                <el-form-item
+                    label="出发日期"
+                    label-width="80px"
+                    :prop="'blank_business_component.' + $index + '.startDate'"
+                    :rules="{
+                        required: true,
+                        message: '选择出发日期',
+                        trigger: 'change'
+                    }"
+                >
+                    <el-date-picker
+                        style="width: 100%"
+                        v-model="row.startDate"
+                        value-format="yyyy-MM-dd"
+                        type="datetime"
+                        placeholder="选择日期"
+                    >
+                    </el-date-picker>
+                </el-form-item>
+                <el-form-item
+                    label="到达日期"
+                    label-width="80px"
+                    :prop="'blank_business_component.' + $index + '.endDate'"
+                    :rules="{
+                        required: true,
+                        message: '选择到达日期',
+                        trigger: 'change'
+                    }"
+                >
+                    <el-date-picker
+                        style="width: 100%"
+                        v-model="row.endDate"
+                        value-format="yyyy-MM-dd"
+                        type="datetime"
+                        placeholder="选择日期"
+                    >
+                    </el-date-picker>
+                </el-form-item>
+                <el-form-item
+                    label="出发地"
+                    label-width="80px"
+                    :prop="'blank_business_component.' + $index + '.startPlace'"
+                    :rules="{
+                        required: true,
+                        message: '输入出发地',
+                        trigger: 'change'
+                    }"
+                >
+                    <el-input
+                        v-model="row.startPlace"
+                    ></el-input>
+                </el-form-item>
+                <el-form-item
+                    label="目的地"
+                    label-width="80px"
+                    :prop="'blank_business_component.' + $index + '.endPlace'"
+                    :rules="{
+                        required: true,
+                        message: '输入目的地',
+                        trigger: 'change'
+                    }"
+                >
+                    <el-input
+                        v-model="row.endPlace"
+                    ></el-input>
+                </el-form-item>
+                <el-form-item 
+                    label="交通方式" 
+                    label-width="80px" 
+                    :prop="'blank_business_component.' + $index + '.transportationWay'"
+                    :rules="{
+                            required: true,
+                            message: '请选择交通方式',
+                            trigger: 'change'
+                        }"
+                >
+                    <el-select
+                        v-model="row.transportationWay"
+                        placeholder="请选择"
+                        style="width: 100%"
+                    >
+                        <el-option
+                            v-for="item in transportationWayList"
+                            :key="item.value"
+                            :label="item.label"
+                            :value="item.value"
+                        >
+                        </el-option>
+                    </el-select>
+                </el-form-item>
+                <el-form-item
+                    label="交通费用"
+                    label-width="80px"
+                    :prop="'blank_business_component.' + $index + '.price'"
+                    :rules="{
+                        required: true,
+                        message: '输入交通费用',
+                        trigger: 'change'
+                    }"
+                >
+                    <el-input
+                        v-model="row.price"
+                        type="number"
+                    ></el-input>
+                </el-form-item>
+            </div>
+            <el-form-item style="text-align: right;">
+                <el-button
+                    type="primary"
+                    size="small"
+                    @click="addNewRow('blank_business_component')"
+                    style="margin-bottom: 10px"
+                    >添加</el-button
+                >
+            </el-form-item>
+        </el-form>
+    </div>
+</template>
+<script>
+export default {
+    props: {
+        info: {
+            type: Object,
+            default: () => {}
+        },
+        generateForm: {
+            type: Object,
+            default: () => {}
+        },
+        id: {
+            type: String,
+            default: ''
+        },
+    },
+    watch: {
+        info: {
+            handler(newVal, oldVal) {
+                console.log('info', newVal);
+                // this.form = JSON.parse(JSON.stringify(newVal));
+            },
+            deep: true,
+            immediate: true
+        }
+    },
+    data() {
+        const formItem = {
+            startDate: '',
+            endDate: '',
+            startPlace: '',
+            endPlace: '',
+            transportationWay: '',
+            price: '',
+            remark: ''
+        }
+        return {
+            form: {
+                blank_business_component: [formItem]
+            },
+            formItem,
+            transportationWayList: [
+                {
+                    value: '火车',
+                    label: '火车'
+                },
+                {
+                    value: '飞机',
+                    label: '飞机'
+                },
+                {
+                    value: '高铁',
+                    label: '高铁'
+                },
+                {
+                    value: '公车',
+                    label: '公车'
+                },
+                {
+                    value: '私车',
+                    label: '私车'
+                },
+                {
+                    value: '大巴',
+                    label: '大巴'
+                },
+                {
+                    value: '顺风车',
+                    label: '顺风车'
+                },
+                {
+                    value: '滴滴',
+                    label: '滴滴'
+                }
+            ]
+        }
+    },
+    mounted() {
+        console.log('info~~~', this.info);
+        this.initForm();
+    },
+    methods: {
+        async initForm() {
+            let data = await this.generateForm.getData(false);
+            console.log('generateForm~~~', data);
+            data[this.id] = [this.formItem];
+            this.generateForm.setData({
+                [this.id]: data[this.id]
+            });
+        },
+        async addNewRow() {
+            let data = await this.generateForm.getData(false);
+            console.log(this.id, data[this.id]);
+            data[this.id].push(this.formItem);
+            this.generateForm.setData({
+                [this.id]: data[this.id]
+            });
+        },
+        async delNewRow(index) {
+            let data = await this.generateForm.getData(false);
+            data[this.id] = data[this.id].filter((item, index1) => index1 != index);
+            this.generateForm.setData({
+                [this.id]: data[this.id]
+            });
+        },
+        validateForm() {
+            //开始表单校验
+            return new Promise((resolve, reject) => {
+                this.$refs.form.validate((valid) => {
+                    if (!valid) {
+                        reject(false);
+                    } else {
+                        resolve(true);
+                    }
+                });
+            });
+        },
+    }
+}
+</script>
+<style scoped>
+.header {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    width: 100%;
+}
+.blank_business_component {
+    display: flex;
+    align-items: center;
+    margin-bottom: 10px;
+}
+.label {
+    width: 80px;
+}
+.value {
+    flex: 1;
+    width: calc(100% - 80px);
+}
+</style>

+ 518 - 0
src/BIZComponents/processSubmitDialog/components/businessComponent.vue

@@ -0,0 +1,518 @@
+<template>
+    <div>
+        <el-table
+            :data="tableData"
+            style="width: 100%"
+            size="mini"
+            border>
+            <el-table-column
+                prop="startDate"
+                align="center"
+                label="出发日期">
+            </el-table-column>
+            <el-table-column
+                prop="endDate"
+                align="center"
+                label="到达日期">
+            </el-table-column>
+            <el-table-column
+                prop="startPlace"
+                align="center"
+                label="出发地">
+            </el-table-column>
+            <el-table-column
+                prop="endPlace" 
+                align="center"
+                label="到达地">
+            </el-table-column>
+            <el-table-column
+                prop="transportationWay"
+                align="center"
+                label="交通方式">
+            </el-table-column>
+            <el-table-column
+                prop="price"
+                align="center"
+                label="交通费用">
+            </el-table-column>
+            <el-table-column
+                label="操作"
+                align="center"
+                width="100"
+                 v-if="!view">
+                <template slot-scope="scope">
+                    <!-- <el-button @click="editRow(scope.row, scope.$index)" type="text" size="mini">编辑</el-button> -->
+                    <el-button @click="deleteRow(scope.$index)" type="text" size="mini">删除</el-button>
+                </template>
+                </el-table-column>
+        </el-table>
+        <div v-if="!view" @click="addRow" style="text-align: center;">
+            <el-button type="text" icon="el-icon-plus">添加</el-button>
+        </div>
+        <ele-modal
+            title="明细"
+            custom-class="ele-dialog-form long-dialog-form"
+            :visible.sync="visible"
+            :before-close="handleClose"
+            :close-on-click-modal="false"
+            top="5vh"
+            :close-on-press-escape="false"
+            append-to-body
+            width="70%"
+            :maxable="true"
+        >
+            <el-card shadow="never">
+                <el-form ref="form" :model="form">
+                    <el-form-item
+                        label="出发日期"
+                        label-width="80px"
+                        prop="startDate"
+                        :rules="{
+                            required: true,
+                            message: '选择出发日期',
+                            trigger: 'change'
+                        }"
+                    >
+                        <el-date-picker
+                            style="width: 100%"
+                            v-model="form.startDate"
+                            value-format="yyyy-MM-dd HH:mm:ss"
+                            type="datetime"
+                            placeholder="选择日期"
+                        >
+                        </el-date-picker>
+                    </el-form-item>
+                    <el-form-item
+                        label="到达日期"
+                        label-width="80px"
+                        prop="endDate"
+                        :rules="{
+                            required: true,
+                            message: '选择到达日期',
+                            trigger: 'change'
+                        }"
+                    >
+                        <el-date-picker
+                            style="width: 100%"
+                            v-model="form.endDate"
+                            value-format="yyyy-MM-dd HH:mm:ss"
+                            type="datetime"
+                            placeholder="选择日期"
+                        >
+                        </el-date-picker>
+                    </el-form-item>
+                    <el-form-item
+                        label="出发地"
+                        label-width="80px"
+                        prop="startPlace"
+                        :rules="{
+                            required: true,
+                            message: '输入出发地',
+                            trigger: 'change'
+                        }"
+                    >
+                        <el-input
+                            v-model="form.startPlace"
+                        ></el-input>
+                    </el-form-item>
+                    <el-form-item
+                        label="目的地"
+                        label-width="80px"
+                        prop="endPlace"
+                        :rules="{
+                            required: true,
+                            message: '输入目的地',
+                            trigger: 'change'
+                        }"
+                    >
+                        <el-input
+                            v-model="form.endPlace"
+                        ></el-input>
+                    </el-form-item>
+                    <el-form-item 
+                        label="交通方式" 
+                        label-width="80px" 
+                        prop="transportationWay"
+                        :rules="{
+                                required: true,
+                                message: '请选择交通方式',
+                                trigger: 'change'
+                            }"
+                    >
+                        <el-select
+                            v-model="form.transportationWay"
+                            placeholder="请选择"
+                            style="width: 100%"
+                        >
+                            <el-option
+                                v-for="item in transportationWayList"
+                                :key="item.value"
+                                :label="item.label"
+                                :value="item.value"
+                            >
+                            </el-option>
+                        </el-select>
+                    </el-form-item>
+                    <el-form-item
+                        label="交通费用"
+                        label-width="80px"
+                        prop="price"
+                        :rules="{
+                            required: true,
+                            message: '输入交通费用',
+                            trigger: 'change'
+                        }"
+                    >
+                        <el-input
+                            v-model="form.price"
+                            type="number"
+                        ></el-input>
+                    </el-form-item>
+                </el-form>
+            </el-card>
+
+            <div slot="footer">
+                <el-button type="primary" size="small" @click="save">保存</el-button>
+                <el-button size="small" @click="handleClose">关闭</el-button>
+            </div>
+        </ele-modal>
+        <!-- <el-form ref="form" :model="info">
+            <div v-for="(row, $index) in info.blank_business_component" :key="$index">
+                <el-form-item>
+                    <div class="header">
+                        <span>事项{{ $index + 1 }}:</span>
+                        <el-button v-if="$index !== 0" type="danger" size="mini" icon="el-icon-delete" @click="delNewRow($index)">删除</el-button>
+                    </div>
+                </el-form-item>
+                <el-form-item
+                    label="出发日期"
+                    label-width="80px"
+                    :prop="'blank_business_component.' + $index + '.startDate'"
+                    :rules="{
+                        required: true,
+                        message: '选择出发日期',
+                        trigger: 'change'
+                    }"
+                >
+                    <el-date-picker
+                        style="width: 100%"
+                        v-model="row.startDate"
+                        value-format="yyyy-MM-dd"
+                        type="datetime"
+                        placeholder="选择日期"
+                    >
+                    </el-date-picker>
+                </el-form-item>
+                <el-form-item
+                    label="到达日期"
+                    label-width="80px"
+                    :prop="'blank_business_component.' + $index + '.endDate'"
+                    :rules="{
+                        required: true,
+                        message: '选择到达日期',
+                        trigger: 'change'
+                    }"
+                >
+                    <el-date-picker
+                        style="width: 100%"
+                        v-model="row.endDate"
+                        value-format="yyyy-MM-dd"
+                        type="datetime"
+                        placeholder="选择日期"
+                    >
+                    </el-date-picker>
+                </el-form-item>
+                <el-form-item
+                    label="出发地"
+                    label-width="80px"
+                    :prop="'blank_business_component.' + $index + '.startPlace'"
+                    :rules="{
+                        required: true,
+                        message: '输入出发地',
+                        trigger: 'change'
+                    }"
+                >
+                    <el-input
+                        v-model="row.startPlace"
+                    ></el-input>
+                </el-form-item>
+                <el-form-item
+                    label="目的地"
+                    label-width="80px"
+                    :prop="'blank_business_component.' + $index + '.endPlace'"
+                    :rules="{
+                        required: true,
+                        message: '输入目的地',
+                        trigger: 'change'
+                    }"
+                >
+                    <el-input
+                        v-model="row.endPlace"
+                    ></el-input>
+                </el-form-item>
+                <el-form-item 
+                    label="交通方式" 
+                    label-width="80px" 
+                    :prop="'blank_business_component.' + $index + '.transportationWay'"
+                    :rules="{
+                            required: true,
+                            message: '请选择交通方式',
+                            trigger: 'change'
+                        }"
+                >
+                    <el-select
+                        v-model="row.transportationWay"
+                        placeholder="请选择"
+                        style="width: 100%"
+                    >
+                        <el-option
+                            v-for="item in transportationWayList"
+                            :key="item.value"
+                            :label="item.label"
+                            :value="item.value"
+                        >
+                        </el-option>
+                    </el-select>
+                </el-form-item>
+                <el-form-item
+                    label="交通费用"
+                    label-width="80px"
+                    :prop="'blank_business_component.' + $index + '.price'"
+                    :rules="{
+                        required: true,
+                        message: '输入交通费用',
+                        trigger: 'change'
+                    }"
+                >
+                    <el-input
+                        v-model="row.price"
+                        type="number"
+                    ></el-input>
+                </el-form-item>
+            </div>
+            <el-form-item style="text-align: right;">
+                <el-button
+                    type="primary"
+                    size="small"
+                    @click="addNewRow('blank_business_component')"
+                    style="margin-bottom: 10px"
+                    >添加</el-button
+                >
+            </el-form-item>
+        </el-form> -->
+    </div>
+</template>
+<script>
+export default {
+    props: {
+        info: {
+            type: Object,
+            default: () => {}
+        },
+        generateForm: {
+            type: Object,
+            default: () => {}
+        },
+        id: {
+            type: String,
+            default: ''
+        },
+        view: {
+            type: Boolean,
+            default: false
+        },
+    },
+    watch: {
+        info: {
+            handler(newVal, oldVal) {
+                console.log('info', newVal);
+                // this.form = JSON.parse(JSON.stringify(newVal));
+                this.tableData = newVal[this.id] || [];
+            },
+            deep: true,
+            immediate: true
+        },
+    },
+    data() {
+        const formItem = {
+            startDate: '',
+            endDate: '',
+            startPlace: '',
+            endPlace: '',
+            transportationWay: '',
+            price: '',
+        }
+        return {
+            form: {},
+            formItem,
+            transportationWayList: [
+                {
+                    value: '火车',
+                    label: '火车'
+                },
+                {
+                    value: '飞机',
+                    label: '飞机'
+                },
+                {
+                    value: '高铁',
+                    label: '高铁'
+                },
+                {
+                    value: '公车',
+                    label: '公车'
+                },
+                {
+                    value: '私车',
+                    label: '私车'
+                },
+                {
+                    value: '大巴',
+                    label: '大巴'
+                },
+                {
+                    value: '顺风车',
+                    label: '顺风车'
+                },
+                {
+                    value: '滴滴',
+                    label: '滴滴'
+                }
+            ],
+            tableData: [],
+            visible: false,
+            currentItem: {},
+            currentIndex: null,
+            type: 'add'
+        }
+    },
+    mounted() {
+        // console.log('info~~~', this.info);
+        // this.initForm();
+    },
+    methods: {
+        // async initForm() {
+        //     let data = await this.generateForm.getData(false);
+        //     console.log('generateForm~~~', data);
+        //     data[this.id] = [this.formItem];
+        //     this.generateForm.setData({
+        //         [this.id]: data[this.id]
+        //     });
+        // },
+        // async addNewRow() {
+        //     let data = await this.generateForm.getData(false);
+        //     console.log(this.id, data[this.id]);
+        //     data[this.id].push(this.formItem);
+        //     this.generateForm.setData({
+        //         [this.id]: data[this.id]
+        //     });
+        // },
+        // async delNewRow(index) {
+        //     let data = await this.generateForm.getData(false);
+        //     data[this.id] = data[this.id].filter((item, index1) => index1 != index);
+        //     this.generateForm.setData({
+        //         [this.id]: data[this.id]
+        //     });
+        // },
+        async updateRowInfo() {
+            let data = await this.generateForm.getData(false);
+            this.generateForm.setData({
+                [this.id]: this.tableData
+            });
+            console.log('updateRowInfo', this.tableData, data);
+            // this.$forceUpdate();
+            // 重置form
+            // this.form = {};
+        },
+        validateForm() {
+            //开始表单校验
+            return new Promise((resolve, reject) => {
+                this.$refs.form.validate((valid) => {
+                    if (!valid) {
+                        reject(false);
+                    } else {
+                        resolve(true);
+                    }
+                });
+            });
+        },
+        addRow() {
+            this.type = 'add';
+            this.form = JSON.parse(JSON.stringify(this.formItem));
+            this.visible = true;
+
+        },
+        handleClose() {
+            this.visible = false;
+        },
+        editRow(row, index) {
+            this.type = 'edit';
+            console.log('编辑行', row, index);
+            this.currentItem = row;
+            this.currentIndex = index;
+            this.visible = true;
+            this.form = JSON.parse(JSON.stringify(row));
+        },
+        deleteRow(index) {
+            this.tableData.splice(index, 1);
+            this.updateRowInfo();
+            this.calculateTotalPrice();
+        },
+        async calculateTotalPrice() {
+            let data = await this.generateForm.getData(false);
+            let totalPrice = 0;
+            this.tableData.forEach(item => {
+                totalPrice += Number(item.price);
+            });
+            const price = Number(data.input_t2qmoggj);
+            this.generateForm.setData({
+                input_a1cnspuk: totalPrice + price
+            });
+        },
+        async save() {
+            try {
+                await this.validateForm();
+                console.log('表单验证通过');
+                // 深拷贝form对象,避免引用问题
+                const newForm = JSON.parse(JSON.stringify(this.form));
+                console.log('newForm', newForm);
+                if(this.type === 'add') {
+                    this.tableData.push(newForm);
+                } else {
+                    this.tableData[this.currentIndex] = newForm;
+                }
+                console.log('this.tableData', this.tableData);
+                this.updateRowInfo()
+                this.calculateTotalPrice()
+                this.handleClose(); // 保存后关闭弹窗
+            } catch (error) {
+                console.log('表单验证失败', error);
+            }
+        }
+    }
+}
+</script>
+<style scoped>
+.header {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    width: 100%;
+}
+.blank_business_component {
+    display: flex;
+    align-items: center;
+    margin-bottom: 10px;
+}
+.label {
+    width: 80px;
+}
+.value {
+    flex: 1;
+    width: calc(100% - 80px);
+}
+:deep(.el-form-box .el-table .el-table__row .el-table__cell .cell) {
+    padding-left: 10px;
+    padding-right: 10px;
+}
+</style>

+ 456 - 0
src/BIZComponents/processSubmitDialog/components/eventComponent.vue

@@ -0,0 +1,456 @@
+<template>
+    <div>
+        <el-table
+            :data="tableData"
+            style="width: 100%"
+            size="mini"
+            border>
+            <el-table-column
+                prop="eventTime"
+                align="center"
+                label="事件发生时间">
+            </el-table-column>
+            <el-table-column
+                prop="eventHospital"
+                align="center"
+                label="事件发生的医院及科室">
+            </el-table-column>
+            <el-table-column
+                prop="eventDesc"
+                align="center"
+                label="事件详细描述">
+            </el-table-column>
+            <el-table-column
+                prop="eventImage"
+                align="center"
+                label="图片上传">
+                <template slot-scope="scope">
+                    <div>
+                        <div v-for="img in scope.row.eventImage" style="color: #1890ff; cursor: pointer;" :key="img" @click="handleItem(img)">
+                            {{ img.name }}
+                        </div>
+                    </div>
+                </template>
+            </el-table-column>
+            <el-table-column
+                prop="eventOpinion"
+                align="center"
+                label="其他意见">
+            </el-table-column>
+            <el-table-column
+                label="操作"
+                align="center"
+                width="100"
+                 v-if="!view">
+                <template slot-scope="scope">
+                    <!-- <el-button @click="editRow(scope.row, scope.$index)" type="text" size="mini">编辑</el-button> -->
+                    <el-button @click="deleteRow(scope.$index)" type="text" size="mini">删除</el-button>
+                </template>
+                </el-table-column>
+        </el-table>
+        <div v-if="!view" @click="addRow" style="text-align: center;">
+            <el-button type="text" icon="el-icon-plus">添加</el-button>
+        </div>
+        <ele-modal
+            title="明细"
+            custom-class="ele-dialog-form long-dialog-form"
+            :visible.sync="visible"
+            :before-close="handleClose"
+            :close-on-click-modal="false"
+            top="5vh"
+            :close-on-press-escape="false"
+            append-to-body
+            width="70%"
+            :maxable="true"
+        >
+            <el-card shadow="never">
+                <el-form ref="form" :model="form">
+                    <el-form-item
+                        label="事件发生时间"
+                        label-width="110px"
+                        prop="eventTime"
+                        :rules="{
+                            required: true,
+                            message: '选择事件发生时间',
+                            trigger: 'change'
+                        }"
+                    >
+                        <el-date-picker
+                            style="width: 100%"
+                            v-model="form.eventTime"
+                            value-format="yyyy-MM-dd HH:mm:ss"
+                            type="datetime"
+                            placeholder="选择日期"
+                        >
+                        </el-date-picker>
+                    </el-form-item>
+        
+                    <el-form-item
+                        label="事件发生的医院及科室"
+                        label-width="110px"
+                        prop="eventHospital"
+                        :rules="{
+                            required: true,
+                            message: '输入事件发生的医院及科室',
+                            trigger: 'change'
+                        }"
+                    >
+                        <el-input
+                            v-model="form.eventHospital"
+                            type="textarea"
+                            placeholder="请输入"
+                            :autosize="{ minRows: 2, maxRows: 4}"
+                        ></el-input>
+                    </el-form-item>
+
+                    <el-form-item 
+                        label="事件详细描述" 
+                        label-width="110px" 
+                        prop="eventDesc"
+                    >
+                        <el-input
+                            v-model="form.eventDesc"
+                            type="textarea"
+                            placeholder="请输入"
+                            :autosize="{ minRows: 2, maxRows: 4}"
+                        ></el-input>
+                    </el-form-item>
+
+                    <el-form-item 
+                        label="图片上传" 
+                        label-width="110px" 
+                        prop="eventImage"
+                        :rules="{
+                                required: true,
+                                message: '上传图片',
+                                trigger: 'change'
+                            }"
+                    >
+                        <el-upload
+                            class="upload-demo"
+                            action="#"
+                            list-type="picture-card"
+                            :http-request="handlRequest"
+                            :before-remove="beforeRemove"
+                            :on-remove="handleRemove"
+                            :on-preview="handleItem"
+                            multiple
+                            :before-upload="beforeUpload"
+                            :file-list="form.eventImage"
+                            :show-file-list="true"
+                            accept=".jpg, .jpeg, .png, .gif"
+                        >
+                            <i class="el-icon-plus"></i>
+                        </el-upload>
+                    </el-form-item>
+
+                    <el-form-item 
+                        label="其他意见" 
+                        label-width="110px" 
+                        prop="eventOpinion"
+                    >
+                        <el-input
+                            v-model="form.eventOpinion"
+                            type="textarea"
+                            placeholder="请输入"
+                            :autosize="{ minRows: 2, maxRows: 4}"
+                        ></el-input>
+                    </el-form-item>
+                </el-form>
+            </el-card>
+
+            <div slot="footer">
+                <el-button type="primary" size="small" @click="save">保存</el-button>
+                <el-button size="small" @click="handleClose">关闭</el-button>
+            </div>
+        </ele-modal>
+        <ele-modal
+            title="预览"
+            custom-class="ele-dialog-form long-dialog-form"
+            :visible.sync="previewVisible"
+            :close-on-click-modal="false"
+            top="5vh"
+            :close-on-press-escape="false"
+            append-to-body
+            width="60%"
+            :maxable="true"
+        >
+            <el-card shadow="never" style="text-align: center;">
+                <img :src="currentImg.url" alt="" style="height: 300px;">
+            </el-card>
+        </ele-modal>
+    </div>
+</template>
+<script>
+import upload from '@/components/uploadImg';
+import { uploadFile } from '@/api/system/file/index.js';
+import {
+    removeFile,
+    getFile
+  } from '@/api/system/file/index.js';
+export default {
+    components: {
+        upload
+    },
+    props: {
+        info: {
+            type: Object,
+            default: () => {}
+        },
+        generateForm: {
+            type: Object,
+            default: () => {}
+        },
+        id: {
+            type: String,
+            default: ''
+        },
+        view: {
+            type: Boolean,
+            default: false
+        },
+    },
+    watch: {
+        info: {
+            handler(newVal, oldVal) {
+                console.log('info', newVal);
+                this.tableData = newVal[this.id] || [];
+            },
+            deep: true,
+            immediate: true
+        },
+    },
+    data() {
+        const formItem = {
+            eventType: '',
+            eventHospital: '',
+            eventDesc: '',
+            eventImage: [],
+            eventOpinion: '',
+        }
+        return {
+            form: {
+                eventImage: []
+            },
+            formItem,
+            tableData: [],
+            visible: false,
+            currentItem: {},
+            currentIndex: null,
+            type: 'add',
+            limit: 9,
+            size: 20,
+            module: 'processSubmit',
+            currentImg: {},
+            previewVisible: false
+        }
+    },
+    mounted() {
+        // console.log('info~~~', this.info);
+        // this.initForm();
+    },
+    methods: {
+        // 自定义上传方法,处理文件上传逻辑
+        handlRequest ({ file }) {
+            return this.beforeUpload(file);
+        },
+        // 上传前校验并处理上传
+        beforeUpload (file) {
+            // 1. 文件大小校验
+            if (file.size / 1024 / 1024 > this.size) {
+                this.$message.error(`大小不能超过 ${this.size}MB`);
+                return Promise.reject(new Error('文件大小超出限制'));
+            }
+
+            // 2. 文件数量校验
+            if (this.limit > 0 && this.form.eventImage.length >= this.limit) {
+                this.$message.error(`最多上传 ${this.limit}个文件`);
+                return Promise.reject(new Error('文件数量超出限制'));
+            }
+            
+            // 3. 文件类型校验(虽然accept属性已限制,但这里再做一层校验确保安全性)
+            const isImage = /\.(jpg|jpeg|png|gif)$/i.test(file.name);
+            if (!isImage) {
+                this.$message.error('请上传图片格式的文件');
+                return Promise.reject(new Error('文件类型不是图片'));
+            }
+            
+            // 4. 执行文件上传
+            return uploadFile({
+                module: this.module,
+                multiPartFile: file
+            }).then((res) => {
+                if (res.data) {
+                    // 将上传成功的文件添加到表单中
+                    const uploadedFile = { 
+                        ...file, 
+                        url: res.data.storePath, 
+                        ...res.data,
+                        status: 'success' // 标记为成功状态
+                    };
+                    
+                    // 检查文件是否已存在,避免重复添加
+                    const existingIndex = this.form.eventImage.findIndex(item => item.uid === file.uid);
+                    if (existingIndex === -1) {
+                        this.form.eventImage.push(uploadedFile);
+                    } else {
+                        this.form.eventImage.splice(existingIndex, 1, uploadedFile);
+                    }
+                    
+                    return res.data;
+                }
+                return Promise.reject(new Error('上传失败,未返回数据'));
+            }).catch(error => {
+                this.$message.error('文件上传失败');
+                return Promise.reject(error);
+            });
+        },
+        beforeRemove (file) {
+            if (file.id) {
+                return removeFile({
+                    fileId: file.id
+                }).then(() => {
+                    return true;
+                });
+            } else {
+                return true;
+            }
+        },
+        handleRemove (file, fileList) {
+            this.form.eventImage = fileList;
+        },
+        handleItem(file){
+            console.log(file,'5555')
+            // getFile({ objectName: file.storePath }, file.name);
+            this.currentImg = file;
+            this.previewVisible = true;
+
+        },
+        async updateRowInfo() {
+            let data = await this.generateForm.getData(false);
+            this.generateForm.setData({
+                [this.id]: this.tableData
+            });
+            console.log('updateRowInfo', this.tableData, data);
+        },
+        validateForm() {
+            //开始表单校验
+            return new Promise((resolve, reject) => {
+                this.$refs.form.validate((valid) => {
+                    if (!valid) {
+                        reject(false);
+                    } else {
+                        resolve(true);
+                    }
+                });
+            });
+        },
+        addRow() {
+            this.type = 'add';
+            this.form = JSON.parse(JSON.stringify(this.formItem));
+            this.visible = true;
+
+        },
+        handleClose() {
+            this.visible = false;
+        },
+        editRow(row, index) {
+            this.type = 'edit';
+            console.log('编辑行', row, index);
+            this.currentItem = row;
+            this.currentIndex = index;
+            this.visible = true;
+            this.form = JSON.parse(JSON.stringify(row));
+        },
+        deleteRow(index) {
+            this.tableData.splice(index, 1);
+            this.updateRowInfo();
+        },
+        async save() {
+            try {
+                // 1. 先进行表单基本验证
+                await this.validateForm();
+                
+                // 2. 额外验证图片上传是否有效
+                // if (!this.form.eventImage || this.form.eventImage.length === 0) {
+                //     this.$message.error('请上传图片');
+                //     return;
+                // }
+                
+                // // 3. 检查是否有上传中的图片或上传失败的图片
+                // const hasInvalidFile = this.form.eventImage.some(file => 
+                //     file.status === 'uploading' || file.status === 'fail'
+                // );
+                
+                // if (hasInvalidFile) {
+                //     this.$message.error('存在图片正在上传中或上传失败,请等待上传完成或重新上传');
+                //     return;
+                // }
+                
+                // console.log('表单验证通过,图片上传有效');
+                
+                // 4. 深拷贝form对象,避免引用问题
+                const newForm = JSON.parse(JSON.stringify(this.form));
+                
+                // 5. 过滤出有效的图片数据(只保留成功上传的图片)
+                newForm.eventImage = newForm.eventImage.filter(file => 
+                    file.status === 'success' && file.url
+                );
+                
+                console.log('newForm', newForm);
+                
+                // 6. 更新表格数据
+                if(this.type === 'add') {
+                    this.tableData.push(newForm);
+                } else {
+                    this.tableData[this.currentIndex] = newForm;
+                }
+                
+                console.log('this.tableData', this.tableData);
+                
+                // 7. 更新父组件数据
+                this.updateRowInfo();
+                
+                // 8. 保存成功后关闭弹窗并重置表单
+                this.handleClose();
+                
+                // 重置form
+                // this.form = {
+                //     eventType: '',
+                //     eventHospital: '',
+                //     eventDesc: '',
+                //     eventImage: [],
+                //     eventOpinion: ''
+                // };
+            } catch (error) {
+                console.log('表单验证失败', error);
+                // this.$message.error('表单验证失败,请检查输入内容');
+            }
+        }
+    }
+}
+</script>
+<style scoped>
+.header {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    width: 100%;
+}
+.blank_business_component {
+    display: flex;
+    align-items: center;
+    margin-bottom: 10px;
+}
+.label {
+    width: 80px;
+}
+.value {
+    flex: 1;
+    width: calc(100% - 80px);
+}
+:deep(.el-form-box .el-table .el-table__row .el-table__cell .cell) {
+    padding-left: 10px;
+    padding-right: 10px;
+}
+</style>

+ 297 - 0
src/BIZComponents/processSubmitDialog/components/productSpecificationComponent.vue

@@ -0,0 +1,297 @@
+<template>
+    <div>
+        <el-table
+            :data="tableData"
+            style="width: 100%"
+            size="mini"
+            border>
+            <el-table-column
+                prop="specification"
+                align="center"
+                label="产品规格型号">
+            </el-table-column>
+            <el-table-column
+                prop="num"
+                align="center"
+                label="数量">
+            </el-table-column>
+            <el-table-column
+                prop="batchNo"
+                align="center"
+                label="批号">
+            </el-table-column>
+            <el-table-column
+                label="操作"
+                align="center"
+                width="100"
+                 v-if="!view">
+                <template slot-scope="scope">
+                    <!-- <el-button @click="editRow(scope.row, scope.$index)" type="text" size="mini">编辑</el-button> -->
+                    <el-button @click="deleteRow(scope.$index)" type="text" size="mini">删除</el-button>
+                </template>
+                </el-table-column>
+        </el-table>
+        <div v-if="!view" @click="addRow" style="text-align: center;">
+            <el-button type="text" icon="el-icon-plus">添加</el-button>
+        </div>
+        <ele-modal
+            title="明细"
+            custom-class="ele-dialog-form long-dialog-form"
+            :visible.sync="visible"
+            :before-close="handleClose"
+            :close-on-click-modal="false"
+            top="5vh"
+            :close-on-press-escape="false"
+            append-to-body
+            width="70%"
+            :maxable="true"
+        >
+            <el-card shadow="never">
+                <el-form ref="form" :model="form">
+                    <el-form-item
+                        label="产品规格型号"
+                        label-width="110px"
+                        prop="specification"
+                        :rules="{
+                            required: true,
+                            message: '输入产品规格型号',
+                            trigger: 'change'
+                        }"
+                    >
+                        <el-input
+                            v-model="form.specification"
+                            placeholder="请输入"
+                        ></el-input>
+                    </el-form-item>
+        
+                    <el-form-item
+                        label="数量"
+                        label-width="110px"
+                        prop="num"
+                        :rules="{
+                            required: true,
+                            message: '输入数量',
+                            trigger: 'change'
+                        }"
+                    >
+                        <el-input
+                            v-model="form.num"
+                            placeholder="请输入"
+                        ></el-input>
+                    </el-form-item>
+                    <el-form-item 
+                        label="批号" 
+                        label-width="110px" 
+                        prop="batchNo"
+                        :rules="{
+                                required: true,
+                                message: '输入批号',
+                                trigger: 'change'
+                            }"
+                    >
+                        <el-input
+                            v-model="form.batchNo"
+                            placeholder="请输入"
+                        ></el-input>
+                    </el-form-item>
+                </el-form>
+            </el-card>
+
+            <div slot="footer">
+                <el-button type="primary" size="small" @click="save">保存</el-button>
+                <el-button size="small" @click="handleClose">关闭</el-button>
+            </div>
+        </ele-modal>
+    </div>
+</template>
+<script>
+export default {
+    props: {
+        info: {
+            type: Object,
+            default: () => {}
+        },
+        generateForm: {
+            type: Object,
+            default: () => {}
+        },
+        id: {
+            type: String,
+            default: ''
+        },
+        view: {
+            type: Boolean,
+            default: false
+        },
+    },
+    watch: {
+        info: {
+            handler(newVal, oldVal) {
+                console.log('info', newVal);
+                this.tableData = newVal[this.id] || [];
+            },
+            deep: true,
+            immediate: true
+        },
+    },
+    data() {
+        const formItem = {
+            specification: '',
+            num: '',
+            batchNo: '',
+        }
+        return {
+            form: {},
+            formItem,
+            useSealTypeList: [
+                {
+                    value: '加盖',
+                    label: '加盖'
+                },
+                {
+                    value: '借用',
+                    label: '借用'
+                },
+                {
+                    value: '无',
+                    label: '无'
+                },
+            ],
+            useSealNameList: [
+                {
+                    value: '总公司公章',
+                    label: '总公司公章'
+                },
+                {
+                    value: '合同专用章',
+                    label: '合同专用章'
+                },
+                {
+                    value: '法人章',
+                    label: '法人章'
+                },
+                {
+                    value: '财务专用章',
+                    label: '财务专用章'
+                },
+                {
+                    value: '发票专用章',
+                    label: '发票专用章'
+                },
+                {
+                    value: '质检专用章',
+                    label: '质检专用章'
+                },
+                {
+                    value: '业务专用章',
+                    label: '业务专用章'
+                },
+                {
+                    value: '出库专用章',
+                    label: '出库专用章'
+                },
+                {
+                    value: '无',
+                    label: '无'
+                },
+            ],
+            tableData: [],
+            visible: false,
+            currentItem: {},
+            currentIndex: null,
+            type: 'add'
+        }
+    },
+    mounted() {
+        // console.log('info~~~', this.info);
+        // this.initForm();
+    },
+    methods: {
+        async updateRowInfo() {
+            let data = await this.generateForm.getData(false);
+            this.generateForm.setData({
+                [this.id]: this.tableData
+            });
+            console.log('updateRowInfo', this.tableData, data);
+        },
+        validateForm() {
+            //开始表单校验
+            return new Promise((resolve, reject) => {
+                this.$refs.form.validate((valid) => {
+                    if (!valid) {
+                        reject(false);
+                    } else {
+                        resolve(true);
+                    }
+                });
+            });
+        },
+        addRow() {
+            this.type = 'add';
+            this.form = JSON.parse(JSON.stringify(this.formItem));
+            this.visible = true;
+
+        },
+        handleClose() {
+            this.visible = false;
+        },
+        editRow(row, index) {
+            this.type = 'edit';
+            console.log('编辑行', row, index);
+            this.currentItem = row;
+            this.currentIndex = index;
+            this.visible = true;
+            this.form = JSON.parse(JSON.stringify(row));
+        },
+        deleteRow(index) {
+            this.tableData.splice(index, 1);
+            this.updateRowInfo();
+        },
+        async save() {
+            try {
+                await this.validateForm();
+                console.log('表单验证通过');
+                // 深拷贝form对象,避免引用问题
+                const newForm = JSON.parse(JSON.stringify(this.form));
+                console.log('newForm', newForm);
+                if(this.type === 'add') {
+                    this.tableData.push(newForm);
+                } else {
+                    this.tableData[this.currentIndex] = newForm;
+                }
+                console.log('this.tableData', this.tableData);
+                this.updateRowInfo()
+                this.handleClose(); // 保存后关闭弹窗
+                // 重置form
+                this.form = {};
+            } catch (error) {
+                console.log('表单验证失败', error);
+            }
+        }
+    }
+}
+</script>
+<style scoped>
+.header {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    width: 100%;
+}
+.blank_business_component {
+    display: flex;
+    align-items: center;
+    margin-bottom: 10px;
+}
+.label {
+    width: 80px;
+}
+.value {
+    flex: 1;
+    width: calc(100% - 80px);
+}
+:deep(.el-form-box .el-table .el-table__row .el-table__cell .cell) {
+    padding-left: 10px;
+    padding-right: 10px;
+}
+</style>

+ 291 - 0
src/BIZComponents/processSubmitDialog/components/reissueComponent.vue

@@ -0,0 +1,291 @@
+<template>
+    <div>
+        <el-table
+            :data="tableData"
+            style="width: 100%"
+            size="mini"
+            border>
+            <el-table-column
+                prop="reissueType"
+                align="center"
+                label="补发型号规格">
+            </el-table-column>
+            <el-table-column
+                prop="reissueOtherType"
+                align="center"
+                label="补发其他规格型号">
+            </el-table-column>
+            <el-table-column
+                prop="reissueContact"
+                align="center"
+                label="收件地址/联系人/电话">
+            </el-table-column>
+            <el-table-column
+                prop="reissueOtherReq"
+                align="center"
+                label="其他要求">
+            </el-table-column>
+            <el-table-column
+                label="操作"
+                align="center"
+                width="100"
+                 v-if="!view">
+                <template slot-scope="scope">
+                    <!-- <el-button @click="editRow(scope.row, scope.$index)" type="text" size="mini">编辑</el-button> -->
+                    <el-button @click="deleteRow(scope.$index)" type="text" size="mini">删除</el-button>
+                </template>
+                </el-table-column>
+        </el-table>
+        <div v-if="!view" @click="addRow" style="text-align: center;">
+            <el-button type="text" icon="el-icon-plus">添加</el-button>
+        </div>
+        <ele-modal
+            title="明细"
+            custom-class="ele-dialog-form long-dialog-form"
+            :visible.sync="visible"
+            :before-close="handleClose"
+            :close-on-click-modal="false"
+            top="5vh"
+            :close-on-press-escape="false"
+            append-to-body
+            width="70%"
+            :maxable="true"
+        >
+            <el-card shadow="never">
+                <el-form ref="form" :model="form">
+                    <el-form-item
+                        label="补发型号规格"
+                        label-width="110px"
+                        prop="reissueType"
+                    >
+                        <el-select
+                            v-model="form.reissueType"
+                            placeholder="请选择"
+                            style="width: 100%"
+                        >
+                            <el-option
+                                v-for="item in reissueTypeList"
+                                :key="item.value"
+                                :label="item.label"
+                                :value="item.value"
+                            >
+                            </el-option>
+                        </el-select>
+                    </el-form-item>
+        
+                    <el-form-item
+                        label="补发其他规格型号"
+                        label-width="110px"
+                        prop="reissueOtherType"
+                    >
+                        <el-input
+                            v-model="form.reissueOtherType"
+                            type="textarea"
+                            placeholder="请输入"
+                            :autosize="{ minRows: 2, maxRows: 4}"
+                        ></el-input>
+                    </el-form-item>
+                    <el-form-item 
+                        label="收件地址/联系人/电话" 
+                        label-width="110px" 
+                        prop="reissueContact"
+                        :rules="{
+                                required: true,
+                                message: '请输入收件地址/联系人/电话',
+                                trigger: 'change'
+                            }"
+                    >
+                        <el-input
+                            v-model="form.reissueContact"
+                            type="textarea"
+                            placeholder="请输入"
+                            :autosize="{ minRows: 2, maxRows: 4}"
+                        ></el-input>
+                    </el-form-item>
+                    <el-form-item 
+                        label="其他要求" 
+                        label-width="110px" 
+                        prop="reissueOtherReq"
+                    >
+                        <el-input
+                            v-model="form.reissueOtherReq"
+                            type="textarea"
+                            placeholder="请输入"
+                            :autosize="{ minRows: 2, maxRows: 4}"
+                        ></el-input>
+                    </el-form-item>
+                </el-form>
+            </el-card>
+
+            <div slot="footer">
+                <el-button type="primary" size="small" @click="save">保存</el-button>
+                <el-button size="small" @click="handleClose">关闭</el-button>
+            </div>
+        </ele-modal>
+    </div>
+</template>
+<script>
+export default {
+    props: {
+        info: {
+            type: Object,
+            default: () => {}
+        },
+        generateForm: {
+            type: Object,
+            default: () => {}
+        },
+        id: {
+            type: String,
+            default: ''
+        },
+        view: {
+            type: Boolean,
+            default: false
+        },
+    },
+    watch: {
+        info: {
+            handler(newVal, oldVal) {
+                console.log('info', newVal);
+                this.tableData = newVal[this.id] || [];
+            },
+            deep: true,
+            immediate: true
+        },
+    },
+    data() {
+        const formItem = {
+            reissueType: '',
+            reissueOtherType: '',
+            reissueContact: '',
+            reissueOtherReq: '',
+        }
+        return {
+            form: {},
+            formItem,
+            reissueTypeList: [
+                {
+                    value: '同规格型号',
+                    label: '同规格型号'
+                },
+                {
+                    value: '其他规格型号',
+                    label: '其他规格型号'
+                },
+                {
+                    value: '无',
+                    label: '无'
+                },
+            ],
+            tableData: [],
+            visible: false,
+            currentItem: {},
+            currentIndex: null,
+            type: 'add'
+        }
+    },
+    mounted() {
+        // console.log('info~~~', this.info);
+        // this.initForm();
+    },
+    methods: {
+        async updateRowInfo() {
+            let data = await this.generateForm.getData(false);
+            this.generateForm.setData({
+                [this.id]: this.tableData
+            });
+            console.log('updateRowInfo', this.tableData, data);
+        },
+        validateForm() {
+            //开始表单校验
+            return new Promise((resolve, reject) => {
+                this.$refs.form.validate((valid) => {
+                    if (!valid) {
+                        reject(false);
+                    } else {
+                        resolve(true);
+                    }
+                });
+            });
+        },
+        addRow() {
+            this.type = 'add';
+            // 使用formItem初始化表单,确保所有字段都存在
+            this.form = JSON.parse(JSON.stringify(this.formItem));
+            this.visible = true;
+        },
+        handleClose() {
+            this.visible = false;
+        },
+        editRow(row, index) {
+            this.type = 'edit';
+            console.log('编辑行', row, index);
+            this.currentItem = row;
+            this.currentIndex = index;
+            this.visible = true;
+            this.form = JSON.parse(JSON.stringify(row));
+        },
+        deleteRow(index) {
+            this.tableData.splice(index, 1);
+            this.updateRowInfo();
+        },
+   
+        async save() {
+            try {
+                // 执行表单验证
+                await this.validateForm();
+                console.log('表单验证通过');
+                
+                // 深拷贝form对象,避免引用问题
+                const newForm = JSON.parse(JSON.stringify(this.form));
+                
+                // 根据操作类型更新表格数据
+                if(this.type === 'add') {
+                    this.tableData.push(newForm);
+                } else if (this.currentIndex !== null && this.currentIndex !== undefined) {
+                    this.tableData[this.currentIndex] = newForm;
+                }
+                
+                console.log('this.tableData', this.tableData);
+                
+                // 更新父组件数据
+                this.updateRowInfo();
+                
+                // 保存后关闭弹窗
+                this.handleClose();
+                
+                // 重置form为初始状态,使用formItem作为模板
+                this.form = JSON.parse(JSON.stringify(this.formItem));
+            } catch (error) {
+                console.error('表单验证失败', error);
+                // this.$message.error('表单验证失败,请检查必填项');
+            }
+        }
+    }
+}
+</script>
+<style scoped>
+.header {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    width: 100%;
+}
+.blank_business_component {
+    display: flex;
+    align-items: center;
+    margin-bottom: 10px;
+}
+.label {
+    width: 80px;
+}
+.value {
+    flex: 1;
+    width: calc(100% - 80px);
+}
+:deep(.el-form-box .el-table .el-table__row .el-table__cell .cell) {
+    padding-left: 10px;
+    padding-right: 10px;
+}
+</style>

+ 325 - 0
src/BIZComponents/processSubmitDialog/components/useQualificationComponent.vue

@@ -0,0 +1,325 @@
+<template>
+    <div>
+        <el-table
+            :data="tableData"
+            style="width: 100%"
+            size="mini"
+            border>
+            <el-table-column
+                prop="useQualificationType"
+                align="center"
+                label="资质类型">
+            </el-table-column>
+            <el-table-column
+                prop="useQualificationName"
+                align="center"
+                label="使用资质名称">
+            </el-table-column>
+            <el-table-column
+                prop="useQualificationRemark"
+                align="center"
+                label="资质使用事由">
+            </el-table-column>
+            <el-table-column
+                label="操作"
+                align="center"
+                width="100"
+                 v-if="!view">
+                <template slot-scope="scope">
+                    <el-button @click="editRow(scope.row, scope.$index)" type="text" size="mini">编辑</el-button>
+                    <el-button @click="deleteRow(scope.$index)" type="text" size="mini">删除</el-button>
+                </template>
+                </el-table-column>
+        </el-table>
+        <div v-if="!view" @click="addRow" style="text-align: center;">
+            <el-button type="text" icon="el-icon-plus">添加</el-button>
+        </div>
+        <ele-modal
+            title="明细"
+            custom-class="ele-dialog-form long-dialog-form"
+            :visible.sync="visible"
+            :before-close="handleClose"
+            :close-on-click-modal="false"
+            top="5vh"
+            :close-on-press-escape="false"
+            append-to-body
+            width="70%"
+            :maxable="true"
+        >
+            <el-card shadow="never">
+                <el-form ref="form" :model="form">
+                    <el-form-item
+                        label="资质类型"
+                        label-width="110px"
+                        prop="useQualificationType"
+                        :rules="{
+                            required: true,
+                            message: '选择资质类型',
+                            trigger: 'change'
+                        }"
+                    >
+                        <el-select
+                            v-model="form.useQualificationType"
+                            placeholder="请选择"
+                            style="width: 100%"
+                        >
+                            <el-option
+                                v-for="item in useQualificationTypeList"
+                                :key="item.value"
+                                :label="item.label"
+                                :value="item.value"
+                            >
+                            </el-option>
+                        </el-select>
+                    </el-form-item>
+
+                    <el-form-item
+                        label="使用资质名称"
+                        label-width="110px"
+                        prop="useQualificationName"
+                        :rules="{
+                            required: true,
+                            message: '选择使用资质名称',
+                            trigger: 'change'
+                        }"
+                    >
+                        <el-select
+                            v-model="form.useQualificationName"
+                            placeholder="请选择"
+                            style="width: 100%"
+                        >
+                            <el-option
+                                v-for="item in useQualificationNameList"
+                                :key="item.value"
+                                :label="item.label"
+                                :value="item.value"
+                            >
+                            </el-option>
+                        </el-select>
+                    </el-form-item>
+        
+                    <el-form-item
+                        label="资质使用事由"
+                        label-width="110px"
+                        prop="useQualificationRemark"
+                    >
+                        <el-input
+                            v-model="form.useQualificationRemark"
+                            type="textarea"
+                            placeholder="请输入"
+                            :autosize="{ minRows: 2, maxRows: 4}"
+                        ></el-input>
+                    </el-form-item>
+                </el-form>
+            </el-card>
+
+            <div slot="footer">
+                <el-button type="primary" size="small" @click="save">保存</el-button>
+                <el-button size="small" @click="handleClose">关闭</el-button>
+            </div>
+        </ele-modal>
+    </div>
+</template>
+<script>
+export default {
+    props: {
+        info: {
+            type: Object,
+            default: () => {}
+        },
+        generateForm: {
+            type: Object,
+            default: () => {}
+        },
+        id: {
+            type: String,
+            default: ''
+        },
+        view: {
+            type: Boolean,
+            default: false
+        },
+    },
+    watch: {
+        info: {
+            handler(newVal, oldVal) {
+                console.log('info', newVal);
+                this.tableData = newVal[this.id] || [];
+            },
+            deep: true,
+            immediate: true
+        },
+    },
+    data() {
+        const formItem = {
+            useQualificationType: '',
+            useQualificationRemark: '',
+            useQualificationName: '',
+        }
+        return {
+            form: {},
+            formItem,
+            useQualificationTypeList: [
+                {
+                    value: '原件',
+                    label: '原件'
+                },
+                {
+                    value: '复印',
+                    label: '复印'
+                },
+                {
+                    value: '无',
+                    label: '无'
+                },
+            ],
+            useQualificationNameList: [
+                {
+                    value: '营业执照正本(行政人事部)',
+                    label: '营业执照正本(行政人事部)'
+                },
+                {
+                    value: '营业执照副本(行政人事部)',
+                    label: '营业执照副本(行政人事部)'
+                },
+                {
+                    value: '第一类医疗器械生产备案凭证(行政人事部)',
+                    label: '第一类医疗器械生产备案凭证(行政人事部)'
+                },
+                {
+                    value: '开户许可证(行政人事部)',
+                    label: '开户许可证(行政人事部)'
+                },
+                {
+                    value: '医疗器械生产许可证(行政人事部)',
+                    label: '医疗器械生产许可证(行政人事部)'
+                },
+                {
+                    value: '医疗器械生产产品登记表(行政人事部)',
+                    label: '医疗器械生产产品登记表(行政人事部)'
+                },
+                {
+                    value: '专利证书(行政人事部)',
+                    label: '专利证书(行政人事部)'
+                },
+                {
+                    value: '二类注册证(注册法务部)',
+                    label: '二类注册证(注册法务部)'
+                },
+                {
+                    value: '无',
+                    label: '无'
+                },
+            ],
+            tableData: [],
+            visible: false,
+            currentItem: {},
+            currentIndex: null,
+            type: 'add'
+        }
+    },
+    mounted() {
+        // console.log('info~~~', this.info);
+        // this.initForm();
+    },
+    methods: {
+        async updateRowInfo() {
+            let data = await this.generateForm.getData(false);
+            this.generateForm.setData({
+                [this.id]: this.tableData
+            });
+            console.log('updateRowInfo', this.tableData, data);
+        },
+        validateForm() {
+            //开始表单校验
+            return new Promise((resolve, reject) => {
+                this.$refs.form.validate((valid) => {
+                    if (!valid) {
+                        reject(false);
+                    } else {
+                        resolve(true);
+                    }
+                });
+            });
+        },
+        addRow() {
+            this.type = 'add';
+            this.visible = true;
+
+        },
+        handleClose() {
+            this.visible = false;
+        },
+        editRow(row, index) {
+            this.type = 'edit';
+            console.log('编辑行', row, index);
+            this.currentItem = row;
+            this.currentIndex = index;
+            this.visible = true;
+            this.form = JSON.parse(JSON.stringify(row));
+        },
+        deleteRow(index) {
+            this.tableData.splice(index, 1);
+            this.updateRowInfo();
+            this.calculateTotalPrice();
+        },
+        async calculateTotalPrice() {
+            let data = await this.generateForm.getData(false);
+            let totalPrice = 0;
+            this.tableData.forEach(item => {
+                totalPrice += Number(item.price);
+            });
+            const price = Number(data.input_t2qmoggj);
+            this.generateForm.setData({
+                input_a1cnspuk: totalPrice + price
+            });
+        },
+        async save() {
+            try {
+                await this.validateForm();
+                console.log('表单验证通过');
+                // 深拷贝form对象,避免引用问题
+                const newForm = JSON.parse(JSON.stringify(this.form));
+                console.log('newForm', newForm);
+                if(this.type === 'add') {
+                    this.tableData.push(newForm);
+                } else {
+                    this.tableData[this.currentIndex] = newForm;
+                }
+                console.log('this.tableData', this.tableData);
+                this.updateRowInfo()
+                this.calculateTotalPrice()
+                this.handleClose(); // 保存后关闭弹窗
+                // 重置form
+                this.form = {};
+            } catch (error) {
+                console.log('表单验证失败', error);
+            }
+        }
+    }
+}
+</script>
+<style scoped>
+.header {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    width: 100%;
+}
+.blank_business_component {
+    display: flex;
+    align-items: center;
+    margin-bottom: 10px;
+}
+.label {
+    width: 80px;
+}
+.value {
+    flex: 1;
+    width: calc(100% - 80px);
+}
+:deep(.el-form-box .el-table .el-table__row .el-table__cell .cell) {
+    padding-left: 10px;
+    padding-right: 10px;
+}
+</style>

+ 317 - 0
src/BIZComponents/processSubmitDialog/components/useSealComponent.vue

@@ -0,0 +1,317 @@
+<template>
+    <div>
+        <el-table
+            :data="tableData"
+            style="width: 100%"
+            size="mini"
+            border>
+            <el-table-column
+                prop="useSealType"
+                align="center"
+                label="印章使用类型">
+            </el-table-column>
+            <el-table-column
+                prop="useSealRemark"
+                align="center"
+                label="印章使用事由">
+            </el-table-column>
+            <el-table-column
+                prop="useSealName"
+                align="center"
+                label="印章名称">
+            </el-table-column>
+            <el-table-column
+                label="操作"
+                align="center"
+                width="100"
+                 v-if="!view">
+                <template slot-scope="scope">
+                    <!-- <el-button @click="editRow(scope.row, scope.$index)" type="text" size="mini">编辑</el-button> -->
+                    <el-button @click="deleteRow(scope.$index)" type="text" size="mini">删除</el-button>
+                </template>
+                </el-table-column>
+        </el-table>
+        <div v-if="!view" @click="addRow" style="text-align: center;">
+            <el-button type="text" icon="el-icon-plus">添加</el-button>
+        </div>
+        <ele-modal
+            title="明细"
+            custom-class="ele-dialog-form long-dialog-form"
+            :visible.sync="visible"
+            :before-close="handleClose"
+            :close-on-click-modal="false"
+            top="5vh"
+            :close-on-press-escape="false"
+            append-to-body
+            width="70%"
+            :maxable="true"
+        >
+            <el-card shadow="never">
+                <el-form ref="form" :model="form">
+                    <el-form-item
+                        label="印章使用类型"
+                        label-width="110px"
+                        prop="useSealType"
+                        :rules="{
+                            required: true,
+                            message: '选择印章使用类型',
+                            trigger: 'change'
+                        }"
+                    >
+                        <el-select
+                            v-model="form.useSealType"
+                            placeholder="请选择"
+                            style="width: 100%"
+                        >
+                            <el-option
+                                v-for="item in useSealTypeList"
+                                :key="item.value"
+                                :label="item.label"
+                                :value="item.value"
+                            >
+                            </el-option>
+                        </el-select>
+                    </el-form-item>
+        
+                    <el-form-item
+                        label="印章使用事由"
+                        label-width="110px"
+                        prop="useSealRemark"
+                        :rules="{
+                            required: true,
+                            message: '输入印章使用事由',
+                            trigger: 'change'
+                        }"
+                    >
+                        <el-input
+                            v-model="form.useSealRemark"
+                            type="textarea"
+                            placeholder="请输入"
+                            :autosize="{ minRows: 2, maxRows: 4}"
+                        ></el-input>
+                    </el-form-item>
+                    <el-form-item 
+                        label="印章名称" 
+                        label-width="110px" 
+                        prop="useSealName"
+                        :rules="{
+                                required: true,
+                                message: '请选择印章名称',
+                                trigger: 'change'
+                            }"
+                    >
+                        <el-select
+                            v-model="form.useSealName"
+                            placeholder="请选择"
+                            style="width: 100%"
+                        >
+                            <el-option
+                                v-for="item in useSealNameList"
+                                :key="item.value"
+                                :label="item.label"
+                                :value="item.value"
+                            >
+                            </el-option>
+                        </el-select>
+                    </el-form-item>
+                </el-form>
+            </el-card>
+
+            <div slot="footer">
+                <el-button type="primary" size="small" @click="save">保存</el-button>
+                <el-button size="small" @click="handleClose">关闭</el-button>
+            </div>
+        </ele-modal>
+    </div>
+</template>
+<script>
+export default {
+    props: {
+        info: {
+            type: Object,
+            default: () => {}
+        },
+        generateForm: {
+            type: Object,
+            default: () => {}
+        },
+        id: {
+            type: String,
+            default: ''
+        },
+        view: {
+            type: Boolean,
+            default: false
+        },
+    },
+    watch: {
+        info: {
+            handler(newVal, oldVal) {
+                console.log('info', newVal);
+                this.tableData = newVal[this.id] || [];
+            },
+            deep: true,
+            immediate: true
+        },
+    },
+    data() {
+        const formItem = {
+            useSealType: '',
+            useSealRemark: '',
+            useSealName: '',
+        }
+        return {
+            form: {},
+            formItem,
+            useSealTypeList: [
+                {
+                    value: '加盖',
+                    label: '加盖'
+                },
+                {
+                    value: '借用',
+                    label: '借用'
+                },
+                {
+                    value: '无',
+                    label: '无'
+                },
+            ],
+            useSealNameList: [
+                {
+                    value: '总公司公章',
+                    label: '总公司公章'
+                },
+                {
+                    value: '合同专用章',
+                    label: '合同专用章'
+                },
+                {
+                    value: '法人章',
+                    label: '法人章'
+                },
+                {
+                    value: '财务专用章',
+                    label: '财务专用章'
+                },
+                {
+                    value: '发票专用章',
+                    label: '发票专用章'
+                },
+                {
+                    value: '质检专用章',
+                    label: '质检专用章'
+                },
+                {
+                    value: '业务专用章',
+                    label: '业务专用章'
+                },
+                {
+                    value: '出库专用章',
+                    label: '出库专用章'
+                },
+                {
+                    value: '无',
+                    label: '无'
+                },
+            ],
+            tableData: [],
+            visible: false,
+            currentItem: {},
+            currentIndex: null,
+            type: 'add'
+        }
+    },
+    mounted() {
+        // console.log('info~~~', this.info);
+        // this.initForm();
+    },
+    methods: {
+        async updateRowInfo() {
+            let data = await this.generateForm.getData(false);
+            this.generateForm.setData({
+                [this.id]: this.tableData
+            });
+            console.log('updateRowInfo', this.tableData, data);
+        },
+        validateForm() {
+            //开始表单校验
+            return new Promise((resolve, reject) => {
+                this.$refs.form.validate((valid) => {
+                    if (!valid) {
+                        reject(false);
+                    } else {
+                        resolve(true);
+                    }
+                });
+            });
+        },
+        addRow() {
+            this.type = 'add';
+            this.form = JSON.parse(JSON.stringify(this.formItem));
+            this.visible = true;
+
+        },
+        handleClose() {
+            this.visible = false;
+        },
+        editRow(row, index) {
+            this.type = 'edit';
+            console.log('编辑行', row, index);
+            this.currentItem = row;
+            this.currentIndex = index;
+            this.visible = true;
+            this.form = JSON.parse(JSON.stringify(row));
+        },
+        deleteRow(index) {
+            this.tableData.splice(index, 1);
+            this.updateRowInfo();
+        },
+        async save() {
+            try {
+                await this.validateForm();
+                console.log('表单验证通过');
+                // 深拷贝form对象,避免引用问题
+                const newForm = JSON.parse(JSON.stringify(this.form));
+                console.log('newForm', newForm);
+                if(this.type === 'add') {
+                    this.tableData.push(newForm);
+                } else {
+                    this.tableData[this.currentIndex] = newForm;
+                }
+                console.log('this.tableData', this.tableData);
+                this.updateRowInfo()
+                this.handleClose(); // 保存后关闭弹窗
+                // 重置form
+                // this.form = {};
+            } catch (error) {
+                console.log('表单验证失败', error);
+            }
+        }
+    }
+}
+</script>
+<style scoped>
+.header {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    width: 100%;
+}
+.blank_business_component {
+    display: flex;
+    align-items: center;
+    margin-bottom: 10px;
+}
+.label {
+    width: 80px;
+}
+.value {
+    flex: 1;
+    width: calc(100% - 80px);
+}
+:deep(.el-form-box .el-table .el-table__row .el-table__cell .cell) {
+    padding-left: 10px;
+    padding-right: 10px;
+}
+</style>

+ 103 - 4
src/BIZComponents/processSubmitDialog/processSubmitDialog.vue

@@ -73,6 +73,37 @@
                 ></el-input>
             </div>
           </template>
+
+          <!-- 差旅交通 -->
+          <template v-slot:blank_business_component="scope">
+            <businessComponent  ref="blank_business_component" id="blank_business_component" :generateForm="$refs.generateForm" :info="scope.model"></businessComponent>
+          </template>
+
+          <!-- 印章使用 -->
+          <template v-slot:blank_use_seal="scope">
+            <useSealComponent  ref="blank_use_seal" id="blank_use_seal" :generateForm="$refs.generateForm" :info="scope.model"></useSealComponent>
+          </template>
+
+          <!-- 资质使用 -->
+          <template v-slot:blank_use_qualification="scope">
+            <useQualificationComponent  ref="blank_use_qualification" id="blank_use_qualification" :generateForm="$refs.generateForm" :info="scope.model"></useQualificationComponent>
+          </template>
+
+          <!-- 产品规格 -->
+          <template v-slot:blank_product_specification="scope">
+            <productSpecificationComponent  ref="blank_product_specification" id="blank_product_specification" :generateForm="$refs.generateForm" :info="scope.model"></productSpecificationComponent>
+          </template>
+
+          <!-- 事件 -->
+          <template v-slot:blank_event_component="scope">
+            <eventComponent  ref="blank_event_component" id="blank_event_component" :generateForm="$refs.generateForm" :info="scope.model"></eventComponent>
+          </template>
+
+          <!-- 补发 -->
+          <template v-slot:blank_reissue_component="scope">
+            <reissueComponent  ref="blank_reissue_component" id="blank_reissue_component" :generateForm="$refs.generateForm" :info="scope.model"></reissueComponent>
+          </template>
+
         </fm-generate-form>
       </div>
       <div
@@ -313,9 +344,15 @@
   import parentList from './components/parentList.vue';
   import { number } from 'echarts';
   import { del } from 'vue';
+  import businessComponent from './components/businessComponent.vue';
+  import useSealComponent from './components/useSealComponent.vue';
+  import useQualificationComponent from './components/useQualificationComponent.vue';
+  import productSpecificationComponent from './components/productSpecificationComponent.vue';
+  import eventComponent from './components/eventComponent.vue';
+  import reissueComponent from './components/reissueComponent.vue';
   export default {
     name: 'processSubmitDialog',
-    components: { visibilityRangeDialog, staffSelection, parentList },
+    components: { visibilityRangeDialog, staffSelection, parentList, businessComponent, useSealComponent, useQualificationComponent, productSpecificationComponent, eventComponent, reissueComponent },
     mixins: [dictMixins],
     props: {
       processSubmitDialogFlag: {
@@ -369,7 +406,8 @@
           start: '',
           end: '',
           days: ''
-        }
+        },
+        componentRef: ['blank_business_component', 'blank_use_seal', 'blank_use_qualification', 'blank_product_specification', 'blank_event_component', 'blank_reissue_component']
       };
     },
     computed: {
@@ -458,6 +496,19 @@ this.postOptions.push(...response.data);
         });
       },
 
+      // 获取组件的中文名称,用于错误提示
+      getComponentName(componentKey) {
+        const nameMap = {
+          'blank_business_component': '差旅交通',
+          'blank_use_seal': '印章使用',
+          'blank_use_qualification': '资质使用',
+          'blank_product_specification': '产品规格',
+          'blank_event_component': '事件',
+          'blank_reissue_component': '补发信息'
+        }
+        return nameMap[componentKey] || componentKey;
+      },
+      
       async addContact(type) {
         console.log(type);
         let data = await this.$refs.generateForm.getData(false);
@@ -722,9 +773,57 @@ this.postOptions.push(...response.data);
         });
       },
       async submit() {
-        this.form.valueJson = await this.generateFormValid();
+        // console.log('this.form~~~', this.$refs.businessComponentRef.form);
+        
+        // const businessComponentForm = this.$refs.businessComponentRef.form;
+        let data = await this.$refs.generateForm.getData(false);
+        // data['blank_business_component'] = businessComponentForm.blank_business_component;
+        // this.$refs.generateForm.setData({
+        //   'blank_business_component': data['blank_business_component']
+        // });
+        // 获取所有组件的引用
+        let validArr = []
+        // 过滤出存在于componentRef中的键
+        Object.keys(data).forEach((key) => {
+          if (this.componentRef.includes(key)) {
+            validArr.push(key)
+          }
+        })
+        
+        // 检查每个组件的数据是否为空数组
+        let emptyComponents = []
+        validArr.forEach(item => {
+          // 检查data[item]是否存在且为数组,并且长度为0
+          if (Array.isArray(data[item]) && data[item].length === 0) {
+            emptyComponents.push(item)
+          }
+        })
+        
+        // 如果有未填写的组件,显示提示信息
+        if (emptyComponents.length > 0) {
+          // this.$message.warning(`请填写完整信息:${emptyComponents.map(comp => this.getComponentName(comp)).join('、')}`);
+          this.$message.warning(`请填写完整信息`);
+          return false;
+        }
+        
+        // 使用Promise.all并行校验所有组件
+        // try {
+        //   await Promise.all(validArr.map(key => {
+        //     if (this.$refs[key] && typeof this.$refs[key].validateForm === 'function') {
+        //       return this.$refs[key].validateForm();
+        //     }
+        //     return Promise.resolve(true); // 如果组件不存在或没有validateForm方法,默认通过
+        //   }));
+        //   console.log('所有组件校验通过');
+        // } catch (error) {
+        //   console.error('表单校验失败:', error);
+        //   this.$message.error('表单校验失败,请检查必填项');
+        //   return false; // 任一组件校验失败则整体失败
+        // }
+        // console.log('data~~~~', data);
+        this.form.valueJson = await this.generateFormValid()
         this.form.processType = '1';
-
+        console.log('formformformform', this.form);
         await processInstanceCreateAPI({
           ...this.form,
           variables: { ...this.form.valueJson }

+ 1 - 1
src/views/boss/orderTracking/index.vue

@@ -63,7 +63,7 @@
           <div v-if="row.deliveryStatus === 1" class="delivery-status">
             <span> 已发:{{ row.deliveryQuantity }} </span>
             <span>
-              未发:{{ row.productQuantity - row.deliveryQuantity }}
+              未发:{{ row.orderQuantity - row.deliveryQuantity }}
             </span>
           </div>
 

+ 128 - 39
src/views/bpm/collaborative/detail.vue

@@ -25,45 +25,107 @@
         </el-tag>
       </div>
     </template>
-    <div class="eleModalBox">
-      <fm-generate-form
-        v-if="Object.keys(form?.formJson || {}).length !== 0"
-        :data="jsonData"
-        :value="form.valueJson"
-        :edit="false"
-        ref="generateForm"
-      >
-        <template v-slot:blank_adopzrdd="scope">
-          <div v-for="(item, index) in scope.model.blank_adopzrdd" :key="index">
-            <div class="blank_adopzrdd">
-              <span>{{ index + 1 }}报销事项:</span>
-              <el-input
-                v-model="scope.model.blank_adopzrdd[index].remark"
-                type="textarea"
-                style="width: calc(100% - 80px)"
-              ></el-input>
-            </div>
-            <div class="blank_adopzrdd">
-              <span>金额:</span>
-              <el-input
-                v-model="scope.model.blank_adopzrdd[index].price"
-                type="number"
-                style="width: calc(100% - 80px)"
-              ></el-input>
-            </div>
-          </div>
-        </template>
-        <!-- 客户名称 -->
-          <template v-slot:eom_contact="scope">
-            <div class="eom_contact">
-              <el-input
-                  v-model="scope.model.eom_contact.name"
-                  style="width: 100%"
+    <div style="display: flex; height: 100%; justify-content: space-between">
+      <div class="form-box">
+        <fm-generate-form
+          v-if="Object.keys(form?.formJson || {}).length !== 0"
+          :data="jsonData"
+          :value="form.valueJson"
+          :edit="false"
+          ref="generateForm"
+        >
+          <template v-slot:blank_adopzrdd="scope">
+            <div v-for="(item, index) in scope.model.blank_adopzrdd" :key="index">
+              <div class="blank_adopzrdd">
+                <span>{{ index + 1 }}报销事项:</span>
+                <el-input
+                  v-model="scope.model.blank_adopzrdd[index].remark"
+                  type="textarea"
+                  style="width: calc(100% - 80px)"
                 ></el-input>
+              </div>
+              <div class="blank_adopzrdd">
+                <span>金额:</span>
+                <el-input
+                  v-model="scope.model.blank_adopzrdd[index].price"
+                  type="number"
+                  style="width: calc(100% - 80px)"
+                ></el-input>
+              </div>
             </div>
           </template>
-      </fm-generate-form>
+          <!-- 客户名称 -->
+            <template v-slot:eom_contact="scope">
+              <div class="eom_contact">
+                <el-input
+                    v-model="scope.model.eom_contact.name"
+                    style="width: 100%"
+                  ></el-input>
+              </div>
+            </template>
+
+            <!-- 差旅 -->
+            <template v-slot:blank_business_component="scope">
+              <businessComponent  ref="blank_business_component" id="blank_business_component" :generateForm="$refs.generateForm" :info="scope.model" :view="view"></businessComponent>
+            </template>
+
+            <!-- 印章使用 -->
+            <template v-slot:blank_use_seal="scope">
+              <useSealComponent  ref="blank_use_seal" id="blank_use_seal" :generateForm="$refs.generateForm" :info="scope.model" :view="view"></useSealComponent>
+            </template>
+
+            <!-- 资质使用 -->
+            <template v-slot:blank_use_qualification="scope">
+              <useQualificationComponent  ref="blank_use_qualification" id="blank_use_qualification" :generateForm="$refs.generateForm" :info="scope.model" :view="view"></useQualificationComponent>
+            </template>
+
+            <!-- 产品规格 -->
+            <template v-slot:blank_product_specification="scope">
+              <productSpecificationComponent  ref="blank_product_specification" id="blank_product_specification" :generateForm="$refs.generateForm" :info="scope.model" :view="view"></productSpecificationComponent>
+            </template>
+
+            <!-- 事件 -->
+            <template v-slot:blank_event_component="scope">
+              <eventComponent  ref="blank_event_component" id="blank_event_component" :generateForm="$refs.generateForm" :info="scope.model" :view="view"></eventComponent>
+            </template>
+
+            <!-- 补发 -->
+            <template v-slot:blank_reissue_component="scope">
+              <reissueComponent  ref="blank_reissue_component" id="blank_reissue_component" :generateForm="$refs.generateForm" :info="scope.model" :view="view"></reissueComponent>
+            </template>
+
+        </fm-generate-form>
+      </div>
+      <div
+        style="
+          align-self: center;
+          display: flex;
+          color: #1890ff;
+          cursor: pointer;
+          width: 15px;
+        "
+        @click="() => (isRight = !isRight)"
+      >
+        <span
+          style="
+            align-self: center;
+
+            transform: scale(1.5);
+          "
+          :class="isRight ? 'el-icon-caret-left' : 'el-icon-caret-right'"
+        >
+        </span>
+        <span style="writing-mode: vertical-rl">选择流程</span>
+      </div>
+      <div style="flex: 1" v-if="isRight">
+        <Detail
+          :view="true"
+          :id="form.id"
+          ref="formDetailDialogRef"
+        ></Detail>
+      </div>
     </div>
+    
     <outgoingDetails
       v-if="outgoingData.id"
       :business-id="outgoingData.id"
@@ -79,27 +141,47 @@
   import { getToken } from '@/utils/token-util';
   import outgoingDetails from '@/views/bpm/outgoingManagement/details.vue';
   import storageApi from '@/api/warehouseManagement';
+  import businessComponent from '@/BIZComponents/processSubmitDialog/components/businessComponent.vue';
+  import useSealComponent from '@/BIZComponents/processSubmitDialog/components/useSealComponent.vue';
+  import useQualificationComponent from '@/BIZComponents/processSubmitDialog/components/useQualificationComponent.vue';
+  import productSpecificationComponent from '@/BIZComponents/processSubmitDialog/components/productSpecificationComponent.vue';
+  import eventComponent from '@/BIZComponents/processSubmitDialog/components/eventComponent.vue';
+  import reissueComponent from '@/BIZComponents/processSubmitDialog/components/reissueComponent.vue';
+  import Detail from '@/views/bpm/processInstance/detailNew.vue';
 
   export default {
     name: 'formDetailDialog',
-    components: {outgoingDetails},
+    components: {outgoingDetails, businessComponent, useSealComponent, useQualificationComponent, productSpecificationComponent, eventComponent, reissueComponent, Detail},
     props: {
       formDetailDialogFlag: {
         type: Boolean,
         default: false
-      }
+      },
+      view: {
+        type: Boolean,
+        default: false
+      },
     },
     mixins: [dictMixins],
     data() {
       return {
         form: {},
         jsonData: {},
-        outgoingData:{}
+        outgoingData:{},
+        isRight: false,
       };
     },
     computed: {
+      // modelWidth() {
+      //   return (this.outgoingData?.id || this.jsonData.config?.platform && this.jsonData.config.platform === 'pc') ? '80%' : '400px';
+      // }
       modelWidth() {
-        return (this.outgoingData?.id || this.jsonData.config?.platform && this.jsonData.config.platform === 'pc') ? '80%' : '400px';
+        let width = this.jsonData.config?.platform && this.jsonData.config.platform === 'pc' ? 1100 : 450;
+        if(this.isRight) {
+          return width + 750 + 'px'
+        } else {
+          return width + 'px'
+        }
       }
     },
     methods: {
@@ -148,6 +230,13 @@
     overflow: auto;
   }
 
+  .form-box {
+    // max-height: 500px;
+    min-width: 400px;
+    overflow: auto;
+    background: #4298fd0d;
+  }
+
   ::v-deep .el-dialog__header {
     display: flex;
     justify-content: space-between;

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 602 - 591
src/views/bpm/collaborative/index.vue


+ 2 - 1
src/views/bpm/handleTask/components/businessOpportunity/opportunityDetailDialog.vue

@@ -91,11 +91,12 @@
           'salesManagerApprove'
         ].includes(taskDefinitionKey)
       "
-    :isCustomerMark="false"
+      :isCustomerMark="false"
       ref="inventoryTable"
       :isDeliveryDeadline="false"
       :isGuaranteePeriod="false"
       :isDiscount="false"
+      :isProduceDeliveryDeadline="true"
       :pricing-way="form.pricingWay"
       
     ></inventoryTable>

+ 5 - 4
src/views/bpm/handleTask/components/financialManage/payableManage/components/detailDialog.vue

@@ -145,8 +145,8 @@
         dialogType: '',
         form: {
           accountingSubjectCode: '',
-          accountingSubjectId: '',
-          accountingSubjectName: '',
+          accountingSubjectId: '1779719367139792004',
+          accountingSubjectName: '应付账款',
           contactId: '',
           contactName: '',
           files: [],
@@ -194,8 +194,8 @@
           invoiceData = await invoiceApplyInfoAPI(data.invoiceId);
         }
         this.form.accountingSubjectCode = invoiceData.accountingSubjectCode;
-        this.form.accountingSubjectId = invoiceData.accountingSubjectId;
-        this.form.accountingSubjectName = invoiceData.accountingSubjectName;
+        this.form.accountingSubjectId = invoiceData.accountingSubjectId || '1779719367139792004';
+        this.form.accountingSubjectName = invoiceData.accountingSubjectName || '应付账款';
       },
       downloadFile(file) {
         getFile({ objectName: file.storePath }, file.name);
@@ -208,6 +208,7 @@
       },
       //获取会计科目选中数据
       changeSubjectInfo(val) {
+        console.log(val);
         if (!val) return (this.form.accountingSubjectName = '');
         let data = this.$refs.treeSelect?.$refs?.tree?.getCurrentNode() || {};
         this.form.accountingSubjectName = data.name;

+ 6 - 4
src/views/bpm/handleTask/components/financialManage/receivableManage/components/detailDialog.vue

@@ -149,8 +149,8 @@
         dialogType: '',
         form: {
           accountingSubjectCode: '',
-          accountingSubjectId: '',
-          accountingSubjectName: '',
+          accountingSubjectId: '1779719367139791006',
+          accountingSubjectName: '应收账款',
           contactId: '',
           contactName: '',
           files: [],
@@ -197,14 +197,15 @@
         await this.getClassifyList(24, 'accountingSubjectList');
         let data = await getFinReceivableInfoAPI(id);
         this.form = data;
+        console.log('获取详情', data);
         let invoiceData = {};
         if (data.invoiceId) {
           invoiceData = await invoiceApplyInfoAPI(data.invoiceId);
         }
 
         this.form.accountingSubjectCode = invoiceData.accountingSubjectCode;
-        this.form.accountingSubjectId = invoiceData.accountingSubjectId;
-        this.form.accountingSubjectName = invoiceData.accountingSubjectName;
+        this.form.accountingSubjectId = invoiceData.accountingSubjectId || '1779719367139791006';
+        this.form.accountingSubjectName = invoiceData.accountingSubjectName || '应收账款';
       },
       downloadFile(file) {
         getFile({ objectName: file.storePath }, file.name);
@@ -217,6 +218,7 @@
       },
       //获取会计科目选中数据
       changeSubjectInfo(val) {
+        console.log(val);
         if (!val) return (this.form.accountingSubjectName = '');
         let data = this.$refs.treeSelect?.$refs?.tree?.getCurrentNode() || {};
         this.form.accountingSubjectName = data.name;

+ 5 - 1
src/views/bpm/handleTask/components/targetManage/salesTarget/viewDialog.vue

@@ -179,7 +179,11 @@
     created() {},
     methods: {
       renderContent(h, data) {
-        let ratio = +((data.number / data.value) * 100 || 0).toFixed(1);
+        let ratio = +(
+          (data.number /
+            (data.unit == '万元' ? data.value * 10000 : data.value)) *
+            100 || 0
+        ).toFixed(1);
         return (
           <div>
             <div class={!data.type ? 'treeItem1 treeItem' : 'treeItem'}>

+ 16 - 2
src/views/bpm/processInstance/detailNew.vue

@@ -150,8 +150,21 @@
         tasks: []
       };
     },
-    created() {
-      this.getDetail();
+    watch: {
+      id: {
+        handler(newVal, oldVal) {
+          if (newVal) {
+            console.log(newVal,'watchnewVal')
+            this.getDetail();
+          }
+        },
+        immediate: true
+      }
+    },
+    mounted() {
+      // this.$nextTick(() => {
+      //   this.getDetail();
+      // })
     },
     methods: {
       getChildren(data) {
@@ -167,6 +180,7 @@
       getDetail() {
         // 获得流程实例相关
         this.processInstanceLoading = true;
+        console.log(this.id,'this.id')
         getProcessInstance(this.id).then((response) => {
           if (!response) {
             this.$message.error('查询不到流程信息!');

Nem az összes módosított fájl került megjelenítésre, mert túl sok fájl változott