You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1132 lines
34 KiB

<template>
<div>
<Drawer
:value="isShow"
:width="device === 'mobile' ? 100 : 74"
:title="title||'编辑'"
:mask-closable="false"
@input="e => $emit('update:isShow', e)">
<div style="padding: 20px;">
<el-form ref="elForm" size="small" :model="form" :rules="rules" label-width="120px">
<el-form-item prop="name" label="项目名称" required :class="device === 'desktop' ? 'span2' : ''">
<el-input
placeholder="请填写项目名称"
v-model="form.name"
style="width: 100%"
/>
</el-form-item>
<template v-if="!isLedger">
<el-form-item v-if="!isOtherFlow" prop="is_simple" label="是否为直接支付" :class="device === 'desktop' ? 'span2' : ''">
<el-switch
v-model="form.is_simple"
active-text="是"
inactive-text="否"
:active-value="1"
:inactive-value="0"
/>
<span style="flex: 1; text-align: right">(无需采购流程,如水电邮寄费等)</span>
</el-form-item>
<el-form-item prop="flow_mod_id" label="事前流程" v-if="!form.is_simple">
<template v-if="!form.is_common_purchase">
<el-select v-model="form.flow_mod_id" style="width: 100%">
<el-option v-for="item in flowIdsFormat" :key="item.id" :value="item.id" :label="item.name"></el-option>
</el-select>
</template>
<template v-else>
<el-input
readonly
placeholder="请填写项目名称"
value="一般采购"
style="width: 100%"
/>
</template>
</el-form-item>
<el-form-item v-if="!isOtherFlow" prop="is_contract" label="是否需要签订合同">
<el-switch
v-model="form.is_contract"
active-text="是"
inactive-text="否"
:active-value="1"
:inactive-value="0"
/>
</el-form-item>
<el-form-item v-if="!isOtherFlow" prop="is_trade" label="是否为工会项目">
<el-switch
v-model="form.is_trade"
active-text="是"
inactive-text="否"
:active-value="1"
:inactive-value="0"
/>
</el-form-item>
<el-form-item prop="money_way_id" label="资金渠道">
<el-select
multiple
size="small"
clearable
placeholder="请选择资金渠道"
:value="
form.money_way_id
? form.money_way_id.split(',').map((i) => Number(i))
: []
"
style="width: 100%"
@change="
(e) => {
form.money_way_id = e.length > 0 ? e.toString() : '';
}
"
>
<el-option
v-for="item in moneyWay"
:value="item.id"
:label="item.value"
></el-option>
</el-select>
</el-form-item>
<template v-if="form.is_simple">
<el-form-item prop="supply" label="承包商/供货商">
<el-input
v-model="form.supply"
placeholder="请填写承包商/供货商"
style="width: 100%"
/>
</el-form-item>
<el-form-item prop="money" label="金额(元)">
<InputNumber
style="width: 100%"
:min="0"
:step="10000"
:precision="2"
:active-change="false"
:value="Number(form.money)"
@input="e => form.money = e"
:formatter="
(value) => `${value}`.replace(/\B(?=(\d{3})+(?!\d))/g, ',')
"
:parser="(value) => value.replace(/\$\s?|(,*)/g, '')"
></InputNumber>
</el-form-item>
</template>
<template v-else>
<el-form-item prop="type" label="项目类型" v-if="isNeedMore">
<el-select
clearable
placeholder="请选择项目类型"
v-model="form.type"
style="width: 100%"
>
<el-option
v-for="item in types"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item prop="purchase_type_id" label="采购形式" v-if="isNeedMore">
<el-select
ref="purchaseTypeInput"
clearable
placeholder="请选择采购形式"
v-model="form.purchase_type_id"
style="width: 100%"
>
<el-option
v-for="item in purchaseType"
:label="item.value"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item prop="purchase_way_id" label="采购方式" v-if="isNeedMore">
<el-select
clearable
placeholder="请选择采购方式"
v-model="form.purchase_way_id"
style="width: 100%"
>
<el-option
v-for="item in purchaseWay"
:label="item.value"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item prop="group_type" label="组织形式" v-if="isNeedMore">
<el-select
clearable
placeholder="请选择组织形式"
v-model="form.group_type"
style="width: 100%"
>
<el-option
v-for="item in groupType"
:label="item.value"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item prop="plan_price" label="预算价(元)">
<InputNumber
style="width: 100%"
:min="0"
:step="10000"
:precision="2"
:active-change="false"
:value="Number(form.plan_price)"
:formatter="
(value) => `${value}`.replace(/\B(?=(\d{3})+(?!\d))/g, ',')
"
:parser="(value) => value.replace(/\$\s?|(,*)/g, '')"
@input="e => form.plan_price = e"
></InputNumber>
</el-form-item>
<el-form-item label="流程状态" v-if="userList.indexOf($store.state.user.username) !== -1" :class="device === 'desktop' ? 'span2' : ''">
<div>
<el-button size="small" type="primary" icon="el-icon-plus" @click="form.flow_list.push({flow_id: '',flow_status: '',custom_model_id: '',flow_title: ''})">新增记录</el-button>
<xy-table :list="form.flow_list"
style="width: 100%;margin-top: 10px;"
:show-index="false"
:height="400"
:table-item="statusTable">
<template #btns></template>
</xy-table>
</div>
</el-form-item>
<el-form-item prop="contract_plan_links"
label="关联预算计划"
v-if="!form.is_common_purchase">
<div class="plan-pick"
style="width: 100%;"
@click="isShowPlan = true,getPlan()">
<template v-if="form.contract_plan_links instanceof Array && form.contract_plan_links.length > 0">
<template v-for="item in form.contract_plan_links">
<el-tag
effect="dark"
size="mini"
closable
color="primary"
@close="_ => {
let findIndex = form.contract_plan_links.findIndex(j => j.id === item.id)
if (findIndex !== -1) {
form.contract_plan_links.splice(findIndex, 1)
}
}">{{ item.label }}</el-tag>
</template>
</template>
<template v-else>
<div class="plan-pick-none">请选择关联计划</div>
</template>
</div>
</el-form-item>
</template>
<el-form-item
v-if="!isOtherFlow"
prop="use_framework_buy"
label="是否使用框架协议采购内容"
>
<el-switch
v-model="form.use_framework_buy"
active-text="是"
inactive-text="否"
:active-value="1"
:inactive-value="0"
/>
</el-form-item>
<el-form-item
v-if="!isOtherFlow"
prop="is_framework"
label="是否新生成框架协议"
v-show="isShowIsFramework"
>
<el-switch
v-model="form.is_framework"
active-text="是"
inactive-text="否"
:active-value="1"
:inactive-value="0"
/>
</el-form-item>
<el-form-item
prop="contract_to_contracts"
label="关联的框架协议合同"
v-show="form.use_framework_buy"
>
<div class="plan-pick" style="width: 100%;" @click="isShowContractToContracts = true">
<template v-if="selections.length > 0">
<template v-for="item in selections">
<el-tag effect="dark"
size="mini"
closable
color="primary"
@close="delSelections(item)">{{ item.name }}</el-tag>
</template>
</template>
<template v-else>
<div class="plan-pick-none">请选择关联的框架协议合同</div>
</template>
</div>
</el-form-item>
</template>
<template v-else>
<el-form-item prop="is_contract" label="是否需要签订合同">
<el-switch
disabled
:value="true"
active-text="是"
inactive-text="否"
/>
</el-form-item>
<el-form-item prop="contract_type" label="是否需要签订合同">
<el-select style="width: 100%" v-model="form.contract_type">
<el-option v-for="(item,index) in contractTypes" :label="item.label" :value="item.value"></el-option>
</el-select>
</el-form-item>
<el-form-item prop="supply" label="承包商\供应商">
<el-input style="width: 100%;" placeholder="请填写承包商\供应商" v-model="form.supply" />
</el-form-item>
<el-form-item prop="money" label="金额(元)">
<InputNumber
style="width: 100%"
:min="0"
:step="10000"
:precision="2"
:active-change="false"
v-model="form.money"
:formatter="
(value) => `${value}`.replace(/\B(?=(\d{3})+(?!\d))/g, ',')
"
:parser="(value) => value.replace(/\$\s?|(,*)/g, '')"
></InputNumber>
</el-form-item>
<el-form-item
prop="is_framework"
label="是否新生成框架协议"
v-show="isShowIsFramework"
>
<el-switch
active-text="是"
inactive-text="否"
:active-value="1"
:inactive-value="0"
/>
</el-form-item>
<el-form-item
prop="contract_to_contracts"
label="关联的框架协议合同"
v-show="form.use_framework_buy"
>
<div class="plan-pick" style="width: 100%;" @click="isShowContractToContracts = true">
<template v-if="selections.length > 0">
<template v-for="item in selections">
<el-tag effect="dark"
size="mini"
closable
color="primary"
@close="delSelections(item)">{{ item.name }}</el-tag>
</template>
</template>
<template v-else>
<div class="plan-pick-none">请选择关联的框架协议合同</div>
</template>
</div>
</el-form-item>
</template>
<el-form-item class="span2">
<div style="display: flex;align-items: center;justify-content: center;">
<el-button type="primary" plain style="width: 100px;" @click="reset">重置</el-button>
<el-button type="primary" style="width: 100px; margin-left: 40px;" @click="submit">确认</el-button>
</div>
</el-form-item>
</el-form>
</div>
</Drawer>
<!-- 编辑中 预算计划 -->
<xy-dialog :is-show.sync="isShowPlan"
title="预算计划"
:width="820">
<template>
<div style="display: flex;align-items: center;">
<DatePicker
:value="planSelect.year"
placeholder="选择所属年份"
placement="bottom-start"
style="width: 140px;margin-right: 10px;"
type="year"
@on-change="(e) => {
planSelect.year = e
getPlan()
}"
></DatePicker>
<el-select
placeholder="科室选择"
clearable
size="small"
v-model="planSelect.plan_department_id"
style="width: 180px;margin-right: 10px;"
@change="getPlan"
>
<el-option
v-for="item in departments"
:label="item.name"
:value="item.id"
:key="item.id"
>
</el-option>
</el-select>
<Input v-model="planSelect.name"
search
enter-button="搜 索"
placeholder="搜索预算计划.."
@on-search="getPlan" />
</div>
<xy-table :list="plans"
:show-index="false"
:table-item="planTable"
:height="310"
style="margin-top: 10px;"
ref="PlanTable"
row-key="id"
border
default-expand-all
:tree-props="{ children: 'notChildren', hasChildren: 'hasChildren' }"
@selection-change="planPick">
<template v-slot:btns>
<el-table-column label="使用金额(元)" header-align="center" width="150" fixed="right">
<template slot-scope="scope" v-if="scope.row.pid === 0">
<InputNumber
style="width: 120px"
:min="0"
:precision="2"
:active-change="false"
:value="Number(scope.row._inputMoney)"
@input="e => scope.row._inputMoney = e"
:formatter="
(value) => `${value}`.replace(/\B(?=(\d{3})+(?!\d))/g, ',')
"
:parser="(value) => value.replace(/\$\s?|(,*)/g, '')"
></InputNumber>
</template>
</el-table-column>
</template>
</xy-table>
</template>
<template v-slot:footerContent>
<Button type="primary" @click="isShowPlan = false">确定</Button>
</template>
</xy-dialog>
<!-- 新增表 框架合同-->
<xy-dialog title="框架协议" :is-show.sync="isShowContractToContracts" :width="820">
<Table
:data="contractList"
:columns="contractTable"
:loading="loading"
border
size="small"
@on-selection-change="selectionChange"
></Table>
<div style="display: flex; justify-content: center; margin: 10px 0">
<Page :total="contractTotal"
size="small"
show-elevator
show-total
@on-change="e => {
contractSelect.page = e;
getContractToContracts();
}"/>
</div>
<span slot="footer" class="dialog-footer">
<el-button @click="isShowContractToContracts = false">取 消</el-button>
<el-button type="primary" @click="isShowContractToContracts = false">确 定</el-button>
</span>
</xy-dialog>
</div>
</template>
<script>
import {checkContractName, detailContract, editorContract, getContract} from '@/api/contract/contract'
import { getparameter, getparameterTree } from "@/api/system/dictionary";
import { deepCopy } from "@/utils";
import { getBudget } from "@/api/budget/budget";
import { flowStatusConfig } from "@/api/common";
export default {
props: {
isShow: {
type: Boolean,
default: false
},
flowIds: {
type: Array,
default: () => []
},
groupType: {
type: Array,
default: () => []
},
purchaseType: {
type: Array,
default: () => []
},
moneyWay: {
type: Array,
default: () => []
},
purchaseWay: {
type: Array,
default: () => []
},
commonPurchaseType: {
type: Array,
default: () => []
},
types: {
type: Array,
default: () => []
},
departments: {
type: Array,
default: () => []
}
},
data() {
return {
// flow_list
userList: ['admin','xiaoyi'],
flowConfig: [],
flowStatus: new Map([
[2, "待申请"],
[-1, "已退回"],
[-2, "-"],
[0, "流转中"],
[1, "已办结"]
]),
statusTable: [
{
prop: 'flow_id',
label: '流程id',
customFn: (row) => {
return (
<el-input size="small" vModel={row.flow_id}></el-input>
)
}
},
{
prop: 'flow_status',
label: '状态',
customFn: (row) => {
return (
<el-select size="small" vModel={row.flow_status} placeholder="请选择">
{
Array.from(this.flowStatus).map(item => (
<el-option label={item[1]} value={item[0]}></el-option>
))
}
</el-select>
)
}
},
{
prop: 'custom_model_id',
label: '流程',
customFn: (row) => {
return (
<el-select size="small" vModel={row.custom_model_id} placeholder="请选择">
{
this.flowIds.map(item => (
<el-option label={item.name} value={item.id}></el-option>
))
}
</el-select>
)
}
},
{
prop: 'flow_title',
label: '标题',
customFn: (row) => {
return (
<el-input size="small" vModel={row.flow_title}></el-input>
)
}
}
],
//
// contract_to_contracts
selections: [],
contractSelect: {
page: 1,
page_size: 10,
is_framework: 1
},
contractList: [],
loading: false,
contractTable: [
{
type: "selection",
width: 56,
align: "center",
},
{
title: "项目名称",
key: "name",
minWidth: 180,
align: "left",
},
{
title: "采购形势",
width: 120,
render: (h,{row}) => {
return h('span',{},row.purchase_type?.value || "")
}
},
{
title: "项目类型",
width: 120,
render: (h,{row}) => {
let map = new Map([
[1,"服务"],
[2,"货物"],
[3,"工程"]
])
return h('span',{},map.get(row.type))
}
},
{
title: "采购方式",
width: 120,
render: (h,{row}) => {
return h('span',{},row.purchase_way?.value || "")
}
}
],
contractTotal: 0,
isShowContractToContracts: false,
//
// plan
isShowPlan: false,
plans: [],
planSelect: {
name: "",
page_size: 20,
page: 1,
is_tree: 1,
year: new Date().getFullYear().toString(),
plan_department_id: "",
type: ""
},
planTable: [{
fixed: 'left',
sortable: false,
width: 44,
reserveSelection: true,
type: "selection",
selectable: (row, index) => {
return row.pid === 0
},
},
{
label: "科室",
prop: 'plan_department.name',
width: 160,
align: 'center'
},
{
label: "年份",
prop: 'year',
width: 80,
align: 'center'
},
{
label: "分类",
prop: 'type_detail.value',
},
{
label: "名称",
prop: 'name',
align: 'left',
width: 220,
},
{
label: "计划金额",
prop: 'money',
align: 'right',
width: 120,
},
{
label: "实付金额",
prop: 'use_money_total',
width: 120,
align: 'right'
},
{
label: '已用金额',
prop: 'has_money_total',
width: 120,
align: 'right'
}
],
planTotal: 0,
//
title: "编辑",
form: {
id: "",
type: "",
is_plan: 1,
purchase_type_id: "",
flow_mod_id: "",
is_contract: 1,
purchase_way_id: "",
money_way_id: "",
group_type: "",
plan_price: 0,
name: "",
contract_plan_links: [],
is_simple: 0,
supply: "",
money: 0,
status: 1,
is_framework: 0,
use_framework_buy: 0,
content: "",
contract_to_contracts: [],
outcome_type: 1,
is_purchase: 1,
is_trade: 0,
remark: '',
is_common_purchase: 0,
common_type: '',
flow_list: []
},
rules: {
name: [
{
required: true,
message: "必填",
trigger: "blur",
},
{
validator: async (rule, value, callback) => {
if (!this.hasValue(value)) {
callback(new Error("必填"));
} else {
if (value === this.title) {
callback()
return
}
const res = await checkContractName({ name: value });
if (res === "未重名" || value === this.title) {
callback();
} else {
callback(new Error("名称重名"));
}
}
},
trigger: "blur",
},
],
supply: [
{
validator: (rule, value, callback) => {
if (this.form.is_simple) {
if (!this.hasValue(value)) {
callback(new Error("必填"));
} else {
callback();
}
} else {
callback();
}
},
trigger: "change",
},
],
type: [
{
validator: (rule, value, callback) => {
if (!this.form.is_simple || !this.isNeedMore || !this.form.is_common_purchase) {
if (!this.hasValue(value)) {
callback(new Error("必填"));
} else {
callback();
}
} else {
callback();
}
},
trigger: "change",
},
],
purchase_type_id: [
{
validator: (rule, value, callback) => {
if (!this.form.is_simple || !this.isNeedMore || !this.form.is_common_purchase) {
if (!this.hasValue(value)) {
callback(new Error("必填"));
} else {
callback();
}
} else {
callback();
}
},
trigger: "change",
},
],
purchase_way_id: [
{
validator: (rule, value, callback) => {
if (!this.form.is_simple || !this.isNeedMore || !this.form.is_common_purchase) {
if (!this.hasValue(value)) {
callback(new Error("必填"));
} else {
callback();
}
} else {
callback();
}
},
trigger: "change",
},
],
money: [
{
validator: (rule, value, callback) => {
if (this.form.is_simple) {
if (!this.hasValue(value)) {
callback(new Error("必填"));
} else {
if (/^\d+(\.\d+)?$/.test(value)) {
callback();
} else {
callback(new Error("必须为数字"));
}
}
} else {
callback();
}
},
trigger: "blur",
},
],
plan_money: [
{
validator: (rule, value, callback) => {
if (!this.form.is_simple || !this.form.is_common_purchase) {
if (!this.hasValue(value)) {
callback(new Error("必填"));
} else {
if (/^\d+(\.\d+)?$/.test(value)) {
callback();
} else {
callback(new Error("必须为数字"));
}
}
} else {
callback();
}
},
trigger: "blur",
},
],
money_way_id: [
{
validator: (rule, value, callback) => {
if (!this.hasValue(value) || !this.form.is_common_purchase) {
callback(new Error("必填"));
} else {
callback();
}
},
trigger: "change",
},
],
contract_plan_links: [
{
validator: (rule, value, callback) => {
if (this.form.is_plan) {
if (this.form.contract_plan_links.length === 0) {
return callback(new Error("必选"));
} else {
callback();
}
} else {
callback();
}
},
trigger: "change",
},
],
contract_to_contracts: [
{
validator: (rule, value, callback) => {
if (this.form.use_framework_buy) {
if (this.form.contract_to_contracts.length === 0) {
return callback(new Error("必选"));
} else {
callback();
}
} else {
callback();
}
},
trigger: "change",
},
],
},
contractTypes: [
{ label: "收入类", value: 1 },
{ label: "支出类", value: 2 },
{ label: "技术协议", value: 3 },
],
}
},
methods: {
hasValue(value) {
return (
value !== "" &&
value !== undefined &&
value !== "undefined" &&
value !== null
);
},
planPick(selection) {
this.form.contract_plan_links = selection.map(i => ({
id: i._linkId,
label: i.name,
plan_id: i.id,
use_money: i._inputMoney,
new_money: i.money
}))
},
async getDetail(id) {
try {
const res = await detailContract({ id })
for (let key in this.form) {
if (res.hasOwnProperty(key)) {
this.form[key] = res[key]
}
}
this.title = res.name
this.form.contract_plan_links = res.plan_link.map(link => {
let myPlan = res.plans.find(j => j.id === link.plan_id)
if (myPlan) {
return {
id: link.id,
label: myPlan.name,
plan_id: link.plan_id,
use_money: link.use_money,
new_money: myPlan.money
}
} else {
return false
}
}).filter(i => !!i)
setTimeout(() => {
this.copyForm = deepCopy(this.form)
}, 500)
} catch (err) {
console.error(err)
}
},
async getFlowConfig() {
try {
const res = await flowStatusConfig()
this.flowConfig = res.map(i => JSON.parse(i.value))
} catch (err) {
this.flowConfig = []
}
},
async getPlan() {
try {
let res = await getBudget(this.planSelect)
let copyPlan = deepCopy(this.form.contract_plan_links)
this.$refs['PlanTable'].clearSelection()
res.list.forEach((item) => {
let temp = copyPlan.find(i => i.plan_id === item.id)
if (temp) {
item._linkId = temp.id
item._inputMoney = temp.use_money
this.$nextTick(() => {
this.$refs['PlanTable'].toggleRowSelection(item, true)
})
} else {
item._inputMoney = 0
}
});
this.plans = res.list;
this.planTotal = res.list.total ?? 0;
} catch (e) {
}
},
//框架合同
async getContractToContracts() {
const res = await getContract(this.contractSelect)
let selectedIds = this.selections.map(i => i.id)
this.contractList = res.list.data.map(item => {
return {
...item,
_checked: !!selectedIds.find(i => i === item.id),
}
})
this.contractTotal = res.list.total
},
selectionChange(selection) {
this.selections = Array.from(
new Set(
selection
)
);
},
delSelections(val) {
this.selections.map((item, index) => {
if (item.id === val.id) {
this.selections.splice(index, 1)
}
})
},
reset() {
this.form = this.copyForm
},
submit() {
this.$refs['elForm'].validate().then(_ => {
this.form.contract_to_contracts = this.selections.map(i => {
return {
contract_id: this.contrantId,
to_contract_id: i.id,
use_money: i.money
}
})
this.form.contract_flow_links = this.form.flow_list.map(i => ({
...i,
tag: this.flowConfig.find(j => j.custom_model_id == i.custom_model_id)?.tag
}))
editorContract(this.form).then(_ => {
this.$message.success('修改成功')
this.$emit('update:isShow', false)
this.$emit('refresh')
})
})
}
},
computed: {
device() {
return this.$store.state.app.device
},
isLedger () {
return this.$route.query.isLedger;
},
isShowIsFramework() {
let temp1 = this.form.purchase_type_id;
let temp2 = this.form.use_framework_buy;
if (
this.$refs["purchaseTypeInput"]?.selected?.label === "直接采购" &&
this.form.use_framework_buy
) {
this.form.is_framework = true;
return false;
} else {
return true;
}
},
contractToContractsSelections () {
let temp = this.form.contract_to_contracts;
return this.$refs["contractToContractsTable"]?.getSelection() || []
},
flowIdsFormat () {
let temp = this.form.is_trade;
return temp ? this.flowIds?.filter(i => /工会/g.test(i.name)) : this.flowIds
},
isOtherFlow () {
return this.flowIds?.find(i => i.id === this.form.flow_mod_id)?.type == 1;
},
isNeedMore () {
//是否需要组织形式等
return this.flowIds?.find(i => i.id === this.form.flow_mod_id)?.name === "政府采购流转" || this.flowIds?.find(i => i.id === this.form.flow_mod_id)?.name === "政府小额采购"
},
purchaseWayFormat() {
return function () {
if (!this.form.purchase_type_id) {
return this.purchaseWay;
} else {
let temp = this.purchaseType.find((i) => i.id === this.form.purchase_type_id);
let arr = temp?.remark?.split(",")?.map((i) => Number(i));
return this.purchaseWay.filter((i) => arr.indexOf(i.id) !== -1);
}
};
},
created() {
this.getFlowConfig()
}
},
}
</script>
<style scoped lang="scss">
.plan-pick {
min-height: 30px;
border: 1px solid #dcdee2;
border-radius: 4px;
display: flex;
flex-wrap: wrap;
align-items: center;
align-content: center;
padding: 0 8px;
::v-deep .el-tag {
margin: 2px;
}
&-none {
height: 30px;
line-height: 30px;
color: #CDD0D5;
}
}
::v-deep .el-form {
display: grid;
grid-template-columns: repeat(2, 1fr);
grid-gap: 0 10px;
}
.span2 {
grid-column: span 2;
}
@media (max-width: 768px) {
::v-deep .el-form {
display: grid;
grid-template-columns: repeat(1, 1fr);
grid-gap: 0;
}
}
</style>