惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
H
Hacker News: Front Page
P
Palo Alto Networks Blog
T
ThreatConnect
Apple Machine Learning Research
Apple Machine Learning Research
博客园_首页
T
True Tiger Recordings
P
Privacy & Cybersecurity Law Blog
B
Blog
IT之家
IT之家
Last Week in AI
Last Week in AI
F
Full Disclosure
Hacker News: Ask HN
Hacker News: Ask HN
C
Comments on: Blog
Microsoft Azure Blog
Microsoft Azure Blog
C
Cybersecurity and Infrastructure Security Agency CISA
Microsoft Security Blog
Microsoft Security Blog
博客园 - 【当耐特】
N
News and Events Feed by Topic
NISL@THU
NISL@THU
腾讯CDC
雷峰网
雷峰网
Security Latest
Security Latest
李成银的技术随笔
M
Microsoft Research Blog - Microsoft Research
L
LangChain Blog
L
Lohrmann on Cybersecurity
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Check Point Blog
Y
Y Combinator Blog
Recent Announcements
Recent Announcements
博客园 - Franky
N
News | PayPal Newsroom
V
V2EX
A
About on SuperTechFans
The Register - Security
The Register - Security
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google Online Security Blog
Google Online Security Blog
MyScale Blog
MyScale Blog
Cisco Talos Blog
Cisco Talos Blog
Vercel News
Vercel News
WordPress大学
WordPress大学
C
Cyber Attacks, Cyber Crime and Cyber Security
The Hacker News
The Hacker News
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
爱范儿
爱范儿
A
Arctic Wolf
L
LINUX DO - 最新话题
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

博客园 - 雪莉06

antd vue 树形表格 vue2 jeecgBoot keepalive 解决方案 vue中实现页面全屏和指定元素全屏 screenfull全屏组件的基本使用 网页导出EXCEL格式数据,长数字变为科学计数法的解决方法 dedecms织梦自定义表单导出到excel的方法 织梦dede:arclist按最新修改排序orderby=pubdate无效的解决方法 vue-router报错:Uncaught (in promise) NavigationDuplicated {_name: ‘NavigationDuplicated‘, name: ‘Navig nvm的安装和使用(转) elementUI 的 input无法输入bug解决 vue数字翻牌效果 j-modal的 slot="footer" 失效 v-if判断页脚按钮 帝国CMS后台登录空白怎么办?如何修改成https ES6两个数组进行比较 vue 父子组件传值报错:this.$emit is not a function 解决 dede列表页调用二三级导航栏(转载) a-table 鼠标滑过显示小手,当前行可点击(转载) echarts折线图使用dataZoom,切换数据时渲染异常,出现竖线bug vue里面修改title样式
element ui form表单 表格下嵌套动态表格,新增行,删除行
雪莉06 · 2024-08-22 · via 博客园 - 雪莉06

<template>

  <el-dialog

    :modal-append-to-body="false"

    :append-to-body="true"

    :title="title"

    :visible.sync="addRequireVisible"

    width="1300px"

    show-close

  >

    <el-form :rules="requireRuleForm" ref="requireRef" :model="requireForm" label-width="180px">

      <el-row>

        <el-col :span="12">

          <el-form-item label="模型编码:" prop="modelId">

            <el-input style="width: 100%" v-model="requireForm.modelId" />

          </el-form-item>

        </el-col>

        <el-col :span="12">

          <el-form-item label="模型名称:" prop="modelName">

            <el-input style="width: 100%" v-model="requireForm.modelName" />

          </el-form-item>

        </el-col>

        <el-col :span="12">

          <el-form-item label="口径:" prop="koujing">

            <el-input

              :clearable="true"

              @input="forceUpdate($event)"

              style="width: 100%"

              v-model="requireForm.koujing"

              placeholder="请输入"

            />

          </el-form-item>

        </el-col>

        <el-col :span="12">

          <el-form-item label="风险点:" prop="fengxiandian">

            <el-input

              :clearable="true"

              @input="forceUpdate($event)"

              style="width: 100%"

              v-model="requireForm.fengxiandian"

              placeholder="请输入"

            />

          </el-form-item>

        </el-col>

        <el-col :span="12">

          <el-form-item label="数据周期:" prop="dataCycle">

            <el-select

              :clearable="true"

              @change="forceUpdate($event)"

              style="width: 100%"

              v-model="requireForm.dataCycle"

              placeholder="请选择"

            >

              <el-option v-for="(el, i) in dataCycleOpt" :key="i" :value="el.value" :label="el.name" />

            </el-select>

          </el-form-item>

        </el-col>

        <el-col :span="12">

          <el-form-item label="模型所需工作量" prop="gongzuoliang">

            <el-input

              :clearable="true"

              @input="forceUpdate($event)"

              style="width: 90%"

              v-model="requireForm.gongzuoliang"

              placeholder="请输入"

            />

            <span style="margin-left: 6px">人日</span>

          </el-form-item>

        </el-col>

        <el-col :span="12">

          <el-form-item label="模型负责人:" prop="fuzeren">

            <el-select

              :clearable="true"

              @change="forceUpdate($event)"

              style="width: 100%"

              v-model="requireForm.fuzeren"

              placeholder="请选择"

            >

              <el-option v-for="(el, i) in fuzerenOpt" :key="i" :value="el.value" :label="el.name" />

            </el-select>

          </el-form-item>

        </el-col>

        <el-col :span="12">

          <el-form-item label="审批人:" prop="shenpiren">

            <el-select

              :clearable="true"

              @change="forceUpdate($event)"

              style="width: 100%"

              v-model="requireForm.shenpiren"

              placeholder="请选择"

            >

              <el-option v-for="(el, i) in shenpirenOpt" :key="i" :value="el.value" :label="el.name" />

            </el-select>

          </el-form-item>

        </el-col>

        <el-col :span="12">

          <el-form-item label="结果表名称:" prop="resultTableName">

            <el-input

              :clearable="true"

              @input="forceUpdate($event)"

              :autosize="{ minRows: 2, maxRows: 2 }"

              type="textarea"

              style="width: 100%"

              v-model="requireForm.resultTableName"

              placeholder="请输入"

            />

          </el-form-item>

        </el-col>

        <el-col :span="12">

          <el-form-item label="结果表字段:" prop="resultTableColumn">

            <el-input

              :clearable="true"

              @input="forceUpdate($event)"

              :autosize="{ minRows: 2, maxRows: 2 }"

              type="textarea"

              style="width: 100%"

              v-model="requireForm.resultTableColumn"

              placeholder="请输入"

            />

          </el-form-item>

        </el-col>

        <el-col :span="12">

          <el-form-item label="数据开发人员:" prop="dataDeveloper">

            <el-select

              :clearable="true"

              @change="forceUpdate($event)"

              style="width: 100%"

              v-model="requireForm.dataDeveloper"

              placeholder="请选择"

            >

              <el-option v-for="(el, i) in dataDeveloperOpt" :key="i" :value="el.value" :label="el.name" />

            </el-select>

          </el-form-item>

        </el-col>

        <el-col :span="12">

          <el-form-item label="是否涉及接口表:" prop="IsJiekouTable">

            <el-radio-group v-model="requireForm.IsJiekouTable">

              <el-radio label="0">涉及</el-radio>

              <el-radio label="1">不涉及</el-radio>

            </el-radio-group>

          </el-form-item>

        </el-col>

        <el-col :span="24" v-if="requireForm.IsJiekouTable == 0">

          <el-form-item label="涉及接口表信息:" prop="interfaceTableInfo">

            <el-form :model="formData" ref="data" label-width="auto">

              <el-table

                border

                :header-cell-style="{ 'text-align': 'center' }"

                :cell-style="{ 'text-align': 'center' }"

                :data="formData.tableData"

                ref="table"

                style="width: 100%"

              >

                ​

                <el-table-column align="center" prop="sourceSysName" label="来源系统名">

                  <template slot-scope="scope">

                    <!--表格里面嵌套表单-->

                    <el-form-item

                      :prop="scope.$index + '.sourceSysName'"

                      :rules="{ required: true, message: '来源系统名不能为空', trigger: 'blur' }"

                    >

                      <el-select

                        :clearable="true"

                        @change="forceUpdate($event)"

                        style="width: 100%"

                        v-model="scope.row.sourceSysName"

                        placeholder="请选择"

                      >

                        <el-option v-for="(el, i) in sourceSysNameOpt" :key="i" :value="el.value" :label="el.name" />

                      </el-select>

                    </el-form-item>

                  </template> </el-table-column

                >​

                <el-table-column align="center" prop="dataTabName" label="数据表名">

                  <template slot-scope="scope">

                    <!--表格里面嵌套表单-->

                    <el-form-item

                      :prop="scope.$index + '.dataTabName'"

                      :rules="{ required: true, message: '数据表名不能为空', trigger: 'blur' }"

                    >

                      <el-input

                        v-model="scope.row.dataTabName"

                        autocomplete="off"

                        :autosize="{ minRows: 2, maxRows: 2 }"

                        type="textarea"

                        size="small"

                        placeholder="数据表名"

                      ></el-input>

                    </el-form-item>

                  </template> </el-table-column

                >​

                <el-table-column align="center" prop="dataTransferCycle" label="数据传输周期">

                  <template slot-scope="scope">

                    <!--表格里面嵌套表单-->

                    <el-form-item

                      :prop="scope.$index + '.dataTransferCycle'"

                      :rules="{ required: true, message: '数据传输周期不能为空', trigger: 'blur' }"

                    >

                      <el-select

                        :clearable="true"

                        @change="forceUpdate($event)"

                        style="width: 100%"

                        v-model="scope.row.dataTransferCycle"

                        placeholder="请选择"

                      >

                        <el-option

                          v-for="(el, i) in dataTransferCycleOpt"

                          :key="i"

                          :value="el.value"

                          :label="el.name"

                        />

                      </el-select>

                    </el-form-item>

                  </template> </el-table-column

                >​

                <el-table-column align="center" prop="sysAdmin" label="系统管理员">

                  <template slot-scope="scope">

                    <!--表格里面嵌套表单-->

                    <el-form-item

                      :prop="scope.$index + '.sysAdmin'"

                      :rules="{ required: true, message: '系统管理员不能为空', trigger: 'blur' }"

                    >

                      <el-input

                        v-model="scope.row.sysAdmin"

                        autocomplete="off"

                        :autosize="{ minRows: 2, maxRows: 2 }"

                        type="textarea"

                        size="small"

                        placeholder="系统管理员"

                      ></el-input>

                    </el-form-item>

                  </template> </el-table-column

                >​

                <el-table-column align="center" prop="jishuyuan" label="技术员">

                  <template slot-scope="scope">

                    <!--表格里面嵌套表单-->

                    <el-form-item

                      :prop="scope.$index + '.jishuyuan'"

                      :rules="{ required: true, message: '技术员不能为空', trigger: 'blur' }"

                    >

                      <el-input

                        v-model="scope.row.jishuyuan"

                        autocomplete="off"

                        :autosize="{ minRows: 2, maxRows: 2 }"

                        type="textarea"

                        size="small"

                        placeholder="技术员"

                      ></el-input>

                    </el-form-item>

                  </template> </el-table-column

                >​

                <el-table-column align="center" prop="laiyuanshujukoujing" label="来源数据口径">

                  <template slot-scope="scope">

                    <!--表格里面嵌套表单-->

                    <el-form-item

                      :prop="scope.$index + '.laiyuanshujukoujing'"

                      :rules="{ required: true, message: '来源数据口径不能为空', trigger: 'blur' }"

                    >

                      <el-input

                        v-model="scope.row.laiyuanshujukoujing"

                        autocomplete="off"

                        :autosize="{ minRows: 2, maxRows: 2 }"

                        type="textarea"

                        size="small"

                        placeholder="技术员"

                      ></el-input>

                    </el-form-item>

                  </template> </el-table-column

                >​

                <el-table-column label="操作" resizable align="center" header-align="center" width="80">

                  <template slot-scope="{ $index }">

                    <el-button

                      type="primary"

                      icon="el-icon-plus"

                      circle

                      @click="addRow()"

                      v-if="$index == 0"

                    ></el-button>

                    <el-button icon="el-icon-minus" circle @click="delRow($index)" v-if="$index > 0"></el-button>

                  </template>

                </el-table-column>

              </el-table>

            </el-form>

            <i

              class="el-icon-circle-plus-outline"

              style="font-size: 20px; color: #1890ff; margin-top: 10px"

              @click="addRow"

            ></i>

          </el-form-item>

        </el-col>

        <el-col :span="24">

          <el-form-item label="附件上传:" prop="fujian">

            <el-upload

              action

              :on-change="onChange"

              :on-remove="handleRemove"

              :file-list="requireForm.fileList"

              :auto-upload="false"

              v-if="!isSee"

            >

              <el-button plain size="small" type="primary">点击上传</el-button>

              <span style="margin-left: 6px">只能上传docx/xlsx文件,且不超过1000kb</span>

            </el-upload>

          </el-form-item>

        </el-col>

      </el-row>

    </el-form>

    <span slot="footer">

      <el-button @click="addRequireVisible = false">取 消</el-button>

      <el-button type="primary" @click="onSubmit" :loading="confirmLoading">确 定</el-button>

    </span>

  </el-dialog>

</template>

<script>

import { addProjectProblems, getCategoryListByCodes, updateProjectProblems } from '@/api/projectManage.js'

import moment from 'moment'

export default {

  name: 'AddRequire',

  components: {},

  data() {

    let validateMoney = (rule, value, callback) => {

      if (0 != Number(value) && !Number(value)) {

        return callback(new Error(rule.message))

      } else {

        callback()

      }

    }

    return {

      riskLevelOpt: [],

      rectWayOpt: [],

      requireRuleForm: {

        requireName: [{ required: true, message: '请输入需求名称' }],

        modelName: [{ required: true, message: '请输入模型名称' }],

        koujing: [{ required: true, message: '请输入口径' }],

        fengxiandian: [{ required: true, message: '请输入风险点' }],

        dataCycle: [{ required: true, message: '请选择数据周期' }],

        gongzuoliang: [{ required: true, message: '请输入模型所需工作量' }],

        fuzeren: [{ required: true, message: '请输入模型负责人' }],

        shenpiren: [{ required: true, message: '请输入审批人' }],

        resultTableName: [{ required: true, message: '请输入结果表名称' }],

        resultTableColumn: [{ required: true, message: '请输入结果名字段' }],

        dataDeveloper: [{ required: true, message: '请选择数据开发人员' }],

        IsJiekouTable: [{ required: true, message: '请选择是否涉及接口表' }],

      },

      requireForm: {

        requireId: '',

        requireName: '',

        modelId: '',

        modelName: '',

        koujing: '',

        fengxiandian: '',

        dataCycle: undefined,

        fuzeren: undefined,

        shenpiren: '',

        resultTableName: '',

        resultTableColumn: '',

        dataDeveloper: '',

        IsJiekouTable: 1,

        fileList: [],

      },

      interfaceTableInfo: [],

      title: '新增需求',

      addRequireVisible: false,

      isEdit: false,

      confirmLoading: false,

      dataDeveloperOpt: [

        {

          name: '张三',

          value: 1,

        },

        {

          name: '李四',

          value: 2,

        },

        {

          name: '王五',

          value: 3,

        },

      ],

      dataCycleOpt: [

        {

          name: '日',

          value: 11,

        },

        {

          name: '周',

          value: 12,

        },

        {

          name: '半年',

          value: 13,

        },

        {

          name: '年',

          value: 14,

        },

      ],

      fuzerenOpt: [

        {

          name: '张三',

          value: 1,

        },

        {

          name: '李四',

          value: 2,

        },

        {

          name: '王五',

          value: 3,

        },

      ],

      shenpirenOpt: [

        {

          name: '张三',

          value: 1,

        },

        {

          name: '李四',

          value: 2,

        },

        {

          name: '王五',

          value: 3,

        },

      ],

      sourceSysNameOpt: [

        {

          name: '划小系统',

          value: 1,

        },

        {

          name: '沙盘系统',

          value: 2,

        },

      ],

      dataTransferCycleOpt: [

        {

          name: '每小时',

          value: 1,

        },

        {

          name: '每天',

          value: 2,

        },

        {

          name: '每周',

          value: 2,

        },

      ],

      isSee: false,

      formData: {

        tableData: [

          {

            sourceSysName: '',

            dataTabName: '',

          },

        ],

      },

    }

  },

  mounted() {

    // 风险程度

    getCategoryListByCodes({ categoryCodes: 'zgxh_risk_level' }).then((res) => {

      this.riskLevelOpt = (res.result.zgxhRiskLevel || []).map((item) => ({

        ...item,

        value: item.codeLowercase,

        name: item.nameLowercase,

      }))

    })

    //  整改方式

    getCategoryListByCodes({ categoryCodes: 'zgxh_rect_way' }).then((res) => {

      this.rectWayOpt = (res.result.zgxhRectWay || []).map((item) => ({

        ...item,

        value: item.codeLowercase,

        name: item.nameLowercase,

      }))

    })

  },

  methods: {

    forceUpdate(e) {

      this.$forceUpdate()

    },

    showInit(row) {

      if (row.requireId) {

        this.isEdit = true

        this.title = '编辑需求'

        this.requireForm = {

          requireId: row.required,

          requireName: row.requireName,

          modelId: row.modelId,

          modelName: row.modelName,

          koujing: row.koujing,

          fengxiandian: row.fengxiandian,

          dataCycle: row.dataCycle,

          fuzeren: row.fuzeren,

          gongzuoliang: row.gongzuoliang,

          shenpiren: row.shenpiren,

          resultTableName: row.resultTableName,

          resultTableColumn: row.resultTableColumn,

          dataDeveloper: row.dataDeveloper,

          IsJiekouTable: 1,

        }

      } else {

        this.isEdit = false

        this.title = '新增需求'

        this.$nextTick(() => {

           this.requireForm = {

            // requireId: 'DM231572',

            // requireName: '',

            // modelId: 'MD05612',

            // modelName: '',

            // koujing: '',

            // fengxiandian: '',

            // dataCycle: '',

            // fuzeren: '',

            // gongzuoliang: '',

            // shenpiren: '',

            // resultTableName: '',

            // resultTableColumn: '',

            // dataDeveloper: '',

            // IsJiekouTable: null,

          }

          // this.$refs.requireRef.resetFields()

        })

      }

      this.addRequireVisible = true

    },

    addRow() {

      let newArr = [

        {

          sourceSysName: '',

          dataTabName: '',

          dataTransferCycle: '',

          sysAdmin: '',

          jishuyuan: '',

          laiyuanshujukoujing: '',

        },

      ]

      this.formData.tableData.push(...newArr)

    },

    delRow(index) {

      this.formData.tableData.splice(index, 1)

    },

    handleRemove(file) {

      const index = this.requireForm.fileList.indexOf(file)

      const newFileList = this.requireForm.fileList.slice()

      newFileList.splice(index, 1)

      this.requireForm.fileList = newFileList

    },

    onChange(file) {

      console.log(this.requireForm.fileList)

      this.requireForm.fileList.push(file)

    },

    onSubmit() {

      this.$refs.requireRef.validate((valid) => {

        if (valid) {

          this.confirmLoading = true

          if (!this.isEdit) {

            addProjectProblems({ ...this.requireForm }).then((res) => {

              if (res.success) {

                this.$message.success('操作成功')

                this.addRequireVisible = false

                this.$emit('refreshList')

              } else {

                this.$message.error(res.message)

              }

              this.confirmLoading = false

            })

          } else {

            updateProjectProblems({ ...this.requireForm }).then((res) => {

              if (res.success) {

                this.$message.success('操作成功')

                this.addRequireVisible = false

                this.$emit('refreshList')

              } else {

                this.$message.error(res.message)

              }

              this.confirmLoading = false

            })

          }

        } else {

          return false

        }

      })

    },

  },

}

</script>

<style lang="less">

@import '~@assets/less/common.less';

</style>

<style scoped lang="less">

/deep/.el-form-item--mini.el-form-item {

  margin-bottom: 20px;

}

/deep/.el-dialog__body {

  padding-right: 40px;

}

/deep/ .el-dialog {

  max-height: unset;

}

</style>