<template>
|
<div class="container">
|
<div class="title">
|
{{ topHeader }}
|
<span class="back" @click="back"> <i class="iconfont icon-fanhui"></i> 返回 </span>
|
</div>
|
|
<div class="log-list">
|
<el-divider content-position="left" direction="vertical" class="top-class"></el-divider>
|
<el-text type="primary">可以根据下面预设值进行初始化</el-text>
|
<div>
|
<el-form :model="project" ref="form" :inline="true" class="pre-form-class" label-position="top">
|
<el-form-item label="所属项目" prop="project_id">
|
<el-select
|
v-model="project.project_id"
|
placeholder="所属项目"
|
clearable
|
filterable
|
size="small"
|
@change="value => handleProjectChangeBatch(value)"
|
>
|
<el-option v-for="item in projectInfoArr" :key="item.id" :label="item.project_name" :value="item.id" />
|
</el-select>
|
</el-form-item>
|
<el-form-item label="项目模块" prop="module_id">
|
<el-cascader
|
v-model="project.module_id"
|
:options="projectModuleTreeArr"
|
width="100%"
|
clearable
|
filterable
|
size="small"
|
placeholder="项目模块"
|
@change="value => handleModuleChangeBatch(value)"
|
:props="moduleCascaderProps"
|
:show-all-levels="false"
|
/>
|
</el-form-item>
|
|
<el-form-item label="任务类型" prop="type">
|
<el-select v-model="project.type" placeholder="任务类型" clearable filterable size="small">
|
<el-option v-for="item in projectTaskTypeArr" :key="item.value" :label="item.label" :value="item.value" />
|
</el-select>
|
</el-form-item>
|
|
<el-form-item label="优先级" prop="priority">
|
<el-select v-model="project.priority" placeholder="优先级" clearable filterable size="small">
|
<el-option
|
v-for="item in projectTaskPriorityArr"
|
:key="item.value"
|
:label="item.label"
|
:value="item.value"
|
/>
|
</el-select>
|
</el-form-item>
|
|
<el-form-item label="任务状态" prop="status">
|
<el-select v-model="project.status" placeholder="任务状态" clearable filterable size="small">
|
<el-option
|
v-for="item in projectTaskStatusArr"
|
:key="item.value"
|
:label="item.label"
|
:value="item.value"
|
/>
|
</el-select>
|
</el-form-item>
|
|
<el-form-item label="排配状态" prop="assign_status">
|
<el-select v-model="project.assign_status" placeholder="排配状态" clearable filterable size="small">
|
<el-option
|
v-for="item in projectTaskAssignStatus"
|
:key="item.value"
|
:label="item.label"
|
:value="item.value"
|
/>
|
</el-select>
|
</el-form-item>
|
|
<el-form-item label="评估人" prop="evaluator_users" class="selectClass">
|
<el-select
|
v-model="project.evaluator_users"
|
placeholder="请选择评估人"
|
clearable
|
filterable
|
:multiple="true"
|
size="small"
|
style="width: 200px !important"
|
>
|
<el-option v-for="item in userList" :key="item.id" :label="item.nickname" :value="item.id" />
|
</el-select>
|
</el-form-item>
|
|
<el-form-item label="计划工时" prop="plan_hour">
|
<el-input-number
|
v-model="project.plan_hour"
|
:min="0"
|
:max="999"
|
label="计划工时"
|
size="small"
|
:precision="1"
|
:step="0.5"
|
></el-input-number>
|
</el-form-item>
|
|
<el-form-item label="计划时间" prop="plan_date" :rules="rules.plan_date">
|
<el-date-picker
|
v-model="project.plan_date"
|
type="daterange"
|
range-separator="-"
|
start-placeholder="计划开始时间"
|
end-placeholder="计划结束时间"
|
size="small"
|
format="YYYY-MM-DD"
|
value-format="YYYY-MM-DD HH:mm:ss"
|
/>
|
</el-form-item>
|
|
<el-form-item label="初始化条数">
|
<el-input
|
type="number"
|
v-model="itemSize"
|
placeholder="初始化条数"
|
style="width: 80px"
|
size="small"
|
@change="preItemSizeChange"
|
/>
|
</el-form-item>
|
|
<!-- <el-form-item>
|
<el-button @click="addRow" class="add-button" type="primary" size="small" >增加</el-button>
|
<el-button @click="submitForm" class="add-button" type="primary" size="small">保存</el-button>
|
</el-form-item> -->
|
</el-form>
|
</div>
|
<div class="add-button-class">
|
<el-button @click="addRow" class="add-button" type="primary" size="small">增加</el-button>
|
<el-button @click="submitForm" class="add-button" type="primary" size="small">保存</el-button>
|
</div>
|
</div>
|
<div class="project-batch">
|
<div v-for="(project, index) in projects" :key="index" class="log-item">
|
<el-form
|
inline="true"
|
:ref="refHandler"
|
:key="index"
|
:model="project"
|
label-position="top"
|
:label-width="labelWidth"
|
@submit.prevent
|
>
|
<el-form-item label-width="30" :label="index === -1 ? '序号' : ''">
|
<el-text class="log-index">{{ index + 1 }}</el-text>
|
</el-form-item>
|
|
<el-form-item :label="index === -1 ? '所属项目' : ''" prop="project_id" :rules="rules.project_id">
|
<el-select
|
v-model="project.project_id"
|
placeholder="所属项目"
|
clearable
|
filterable
|
size="small"
|
@change="value => handleProjectChange(value, project)"
|
>
|
<el-option v-for="item in projectInfoArr" :key="item.id" :label="item.project_name" :value="item.id" />
|
</el-select>
|
</el-form-item>
|
|
<el-form-item :label="index === -1 ? '项目模块' : ''" prop="module_id" :rules="rules.module_id">
|
<el-cascader
|
v-model="project.module_id"
|
:options="project.projectModuleTreeArr"
|
width="100%"
|
clearable
|
filterable
|
size="small"
|
placeholder="项目模块"
|
:props="moduleCascaderProps"
|
:show-all-levels="false"
|
@change="value => handleModuleChange(value, project)"
|
/>
|
</el-form-item>
|
|
<el-form-item :label="index === -1 ? '任务名称' : ''" prop="name" :rules="rules.name">
|
<el-input v-model="project.name" placeholder="任务名称" clearable size="small" />
|
</el-form-item>
|
|
<el-form-item :label="index === -1 ? '任务描述' : ''" prop="description" :rules="rules.description">
|
<el-input placeholder="任务描述" size="small" v-model="project.description"> </el-input>
|
</el-form-item>
|
|
<el-form-item :label="index === -1 ? '任务类型' : ''" prop="type" :rules="rules.type">
|
<el-select v-model="project.type" placeholder="任务类型" clearable filterable size="small">
|
<el-option v-for="item in projectTaskTypeArr" :key="item.value" :label="item.label" :value="item.value" />
|
</el-select>
|
</el-form-item>
|
|
<el-form-item :label="index === -1 ? '优先级' : ''" prop="priority" :rules="rules.priority">
|
<el-select v-model="project.priority" placeholder="优先级" clearable filterable size="small">
|
<el-option
|
v-for="item in projectTaskPriorityArr"
|
:key="item.value"
|
:label="item.label"
|
:value="item.value"
|
/>
|
</el-select>
|
</el-form-item>
|
|
<el-form-item :label="index === -1 ? '任务状态' : ''" prop="status" :rules="rules.status">
|
<el-select v-model="project.status" placeholder="任务状态" clearable filterable size="small">
|
<el-option
|
v-for="item in projectTaskStatusArr"
|
:key="item.value"
|
:label="item.label"
|
:value="item.value"
|
/>
|
</el-select>
|
</el-form-item>
|
|
<el-form-item :label="index === -1 ? '排配状态' : ''" prop="assign_status" :rules="rules.assign_status">
|
<el-select v-model="project.assign_status" placeholder="排配状态" clearable filterable size="small">
|
<el-option
|
v-for="item in projectTaskAssignStatus"
|
:key="item.value"
|
:label="item.label"
|
:value="item.value"
|
/>
|
</el-select>
|
</el-form-item>
|
|
<el-form-item
|
:label="index === -1 ? '评估人' : ''"
|
prop="evaluator_users"
|
class="selectClass"
|
:rules="rules.evaluator_users"
|
>
|
<el-select
|
v-model="project.evaluator_users"
|
placeholder="评估人"
|
clearable
|
filterable
|
:multiple="true"
|
size="small"
|
style="width: 200px !important"
|
>
|
<el-option v-for="item in userList" :key="item.id" :label="item.nickname" :value="item.id" />
|
</el-select>
|
</el-form-item>
|
|
<el-form-item :label="index === -1 ? '计划工时' : ''" prop="plan_hour" :rules="rules.plan_hour">
|
<el-tooltip class="box-item" effect="dark" content="计划工时" placement="top-start">
|
<el-input-number
|
v-model="project.plan_hour"
|
:min="0"
|
:max="999"
|
aria-label="计划工时"
|
size="small"
|
:precision="1"
|
:step="0.5"
|
></el-input-number>
|
</el-tooltip>
|
</el-form-item>
|
|
<el-form-item :label="index === -1 ? '计划时间' : ''" prop="plan_date" :rules="rules.plan_date">
|
<el-date-picker
|
v-model="project.plan_date"
|
type="daterange"
|
range-separator="-"
|
start-placeholder="计划开始时间"
|
end-placeholder="计划结束时间"
|
size="small"
|
format="YYYY-MM-DD"
|
value-format="YYYY-MM-DD HH:mm:ss"
|
/>
|
</el-form-item>
|
|
<!-- <el-form-item label="开发者" prop="developer_users" class="selectClass">
|
<el-select v-model="project.developer_users" placeholder="请选择开发者" clearable filterable :multiple="true">
|
<el-option v-for="item in userList" :key="item.id" :label="item.nickname" :value="item.id" />
|
</el-select>
|
</el-form-item> -->
|
<!-- <el-form-item label="实际工时" prop="actual_hour">
|
<el-input-number v-model="project.actual_hour" :min="1" :max="10" label="计划工时" :precision="1"
|
:step="0.5" ></el-input-number >
|
</el-form-item>
|
<el-form-item label="实际时间" prop="actual_date">
|
<el-date-picker v-model="project.actual_date" type="daterange" range-separator="-" start-placeholder="实际开始时间"
|
end-placeholder="实际结束时间" size="small"
|
format="YYYY-MM-DD"
|
value-format="YYYY-MM-DD HH:mm:ss"
|
/>
|
</el-form-item> -->
|
|
<el-form-item :label="index === -1 ? '备注' : ''" prop="remark">
|
<el-input
|
:autosize="{ minRows: 4, maxRows: 8 }"
|
placeholder="请输入备注"
|
size="small"
|
v-model="project.remark"
|
>
|
</el-input>
|
</el-form-item>
|
|
<el-form-item>
|
<!-- <span @click="deleteRow(index)" class="delete-button" :key="index">删除</span> -->
|
<i class="iconfont icon-jian1 minus" @click="deleteRow(index)" :key="index"></i>
|
</el-form-item>
|
</el-form>
|
</div>
|
</div>
|
</div>
|
</template>
|
|
<script>
|
import { reactive, ref, onMounted, watch } from 'vue'
|
import { ElMessageBox, ElMessage } from 'element-plus'
|
import sysDictItemModel from '@/model/sysDictItem'
|
import ProjectInfo from '@/model/projectInfo'
|
import ProjectModuleInfo from '@/model/projectModuleInfo'
|
import AdminInfo from '@/lin/model/admin'
|
import ProjectTaskInfo from '@/model/projectTaskInfo'
|
|
export default {
|
props: {
|
comfirmFlag: {
|
type: Boolean,
|
default: false,
|
},
|
editDailyDate: {
|
type: String,
|
default: null,
|
},
|
},
|
setup(props, context) {
|
const topHeader = ref('日志新增')
|
const labelWidth = ref('120')
|
const labelWidthSort = ref('60')
|
const loading = ref(false)
|
|
const dailyTypeArr = ref([])
|
const dailyStatusArr = ref([])
|
|
const project = reactive({
|
id: '',
|
project_id: '',
|
module_id: '',
|
name: '',
|
description: '',
|
type: '',
|
priority: '',
|
status: '',
|
assign_status: '',
|
evaluator_users: [],
|
developer_users: [],
|
plan_hour: '',
|
plan_date: [],
|
plan_begin_date: '',
|
plan_end_date: '',
|
actual_date: [],
|
actual_begin_date: '',
|
actual_end_date: '',
|
remark: '',
|
})
|
|
const itemSize = ref(3)
|
const projects = ref([])
|
const form = ref({})
|
const ruleForm = ref([])
|
const refHandler = el => {
|
if (el) {
|
ruleForm.value.push(el)
|
}
|
}
|
|
const projectTaskStatusArr = ref([])
|
const projectTaskAssignStatus = ref([])
|
const projectTaskTypeArr = ref([])
|
const projectTaskPriorityArr = ref([])
|
const userList = ref([])
|
const projectInfoArr = ref([])
|
const projectModuleArr = ref([])
|
const projectModuleTreeArr = ref([])
|
const moduleCascaderProps = {
|
value: 'id', // 设置 value 字段
|
label: 'name', // 设置 label 字段
|
children: 'children', // 设置子项的字段
|
checkStrictly: true, // 设置任意节点的子节点是否可以勾选
|
}
|
|
// 单条记录编辑
|
const handleProjectChange = async (e, tmp) => {
|
// 编辑操作
|
const tmpModuleTree = await ProjectModuleInfo.getProjectModuleTree({ project_id: e })
|
tmp.projectModuleTreeArr = [...tmpModuleTree]
|
tmp.module_id = null
|
}
|
|
const handleModuleChange = (value, tmpProject) => {
|
if (value && value.length > 0) {
|
// 仅保存最后一级的 id
|
tmpProject.module_id = value[value.length - 1] // 取最后一个值
|
} else {
|
tmpProject.module_id = null // 如果没有选择,则清空
|
}
|
}
|
|
// 批量编辑
|
|
const handleProjectChangeBatch = async e => {
|
// 编辑操作
|
const tmpModuleTree = await ProjectModuleInfo.getProjectModuleTree({ project_id: e })
|
projectModuleTreeArr.value = [...tmpModuleTree]
|
project.module_id = null
|
projects.value.forEach(tmpProject => {
|
tmpProject.project_id = e
|
tmpProject.projectModuleTreeArr = [...tmpModuleTree]
|
tmpProject.module_id = null
|
})
|
}
|
|
const handleModuleChangeBatch = value => {
|
let moduleId = null
|
if (value && value.length > 0) {
|
// 仅保存最后一级的 id
|
moduleId = value[value.length - 1] // 取最后一个值
|
}
|
project.module_id = moduleId
|
projects.value.forEach(tmpProject => {
|
tmpProject.projectModuleTreeArr = [...projectModuleTreeArr.value]
|
tmpProject.module_id = moduleId
|
tmpProject.project_id = project.project_id
|
})
|
}
|
|
const listAssign = (a, b) => Object.keys(a).forEach(key => {
|
a[key] = b[key] || a[key]
|
})
|
|
const formatDate = date => {
|
const d = new Date(date)
|
const year = d.getFullYear()
|
const month = (d.getMonth() + 1).toString().padStart(2, '0') // 获取月份,补充零
|
const day = d.getDate().toString().padStart(2, '0') // 获取日期,补充零
|
return `${year}-${month}-${day}` // 返回格式化后的日期
|
}
|
|
/**
|
* 表单规则验证
|
*/
|
const rules = {
|
project_id: [{ message: '请选择项目', trigger: ['blur', 'change'], required: true }],
|
module_id: [
|
{
|
validator: (rule, value, callback) => {
|
if (!value) {
|
callback(new Error('请选择项目'))
|
}
|
const project = projectInfoArr.value.filter(item => item.id === value)
|
if (project && project.length > 0) {
|
callback(new Error('根节点为项目节点,不可选择'))
|
}
|
|
callback()
|
},
|
trigger: 'blur,change',
|
required: true,
|
},
|
],
|
name: [{ message: '请输入任务名称', trigger: ['blur', 'change'], required: true }],
|
description: [{ message: '请输入任务描述', trigger: ['blur', 'change'], required: true }],
|
type: [{ message: '请选择任务类型', trigger: ['blur', 'change'], required: true }],
|
priority: [{ message: '请选择优先级', trigger: ['blur', 'change'], required: true }],
|
status: [{ message: '请选择任务状态', trigger: ['blur', 'change'], required: true }],
|
assign_status: [{ message: '请选择排配状态', trigger: ['blur', 'change'], required: true }],
|
evaluator_users: [{ message: '请选择评估人', trigger: ['blur', 'change'], required: true }],
|
// developer_users: [{ message: '请选择开发人员', trigger: ['blur', 'change'], required: true }],
|
plan_hour: [
|
{ message: '请输入计划工时', trigger: ['blur', 'change'], required: true },
|
{
|
validator: (rule, value, callback) => {
|
if (value <= 0) {
|
callback(new Error('计划工时必须大于 0'))
|
} else {
|
callback() // 验证通过
|
}
|
},
|
trigger: ['blur', 'change'],
|
},
|
],
|
// plan_date: [{ message: '请输入计划时间', trigger: ['blur', 'change'], required: true }],
|
plan_date: [
|
{ message: '请输入计划时间', trigger: ['blur', 'change'], required: true },
|
{
|
validator: (rule, value, callback) => {
|
if (!value || value.length !== 2) {
|
return callback(new Error('请选择完整的日期范围'))
|
}
|
|
// 获取当前日期,格式为 "YYYY-MM-DD"
|
const today = formatDate(new Date())
|
|
// 获取选择的开始时间和结束时间
|
const startDate = formatDate(value[0])
|
const endDate = formatDate(value[1])
|
// 比较开始日期和结束日期
|
if (startDate < today) {
|
callback(new Error('计划开始时间不能小于今天'))
|
} else {
|
callback() // 验证通过
|
}
|
},
|
trigger: ['blur', 'change'],
|
},
|
],
|
}
|
|
onMounted(() => {
|
loadDictDitems()
|
if (props.editId) {
|
// getdaily()
|
}
|
// 根据初始化条件显示批量条数
|
loadBatchRows()
|
})
|
|
// 根据字典类型查询字典
|
const loadDictDitems = async () => {
|
// if (props.editId) {
|
// projectModuleTreeArr.value = await ProjectModuleInfo.getProjectModuleTree({ projectId: project.project_id })
|
// } else {
|
// projectModuleTreeArr.value = await ProjectModuleInfo.getProjectModuleTree({})
|
// }
|
|
projectTaskStatusArr.value = await sysDictItemModel.getSysDictItemListByType('project_task_status')
|
projectTaskAssignStatus.value = await sysDictItemModel.getSysDictItemListByType('project_task_assign_status')
|
projectTaskTypeArr.value = await sysDictItemModel.getSysDictItemListByType('project_task_type')
|
projectTaskPriorityArr.value = await sysDictItemModel.getSysDictItemListByType('project_task_priority')
|
|
projectInfoArr.value = await ProjectInfo.getProjectInfoList('')
|
projectModuleArr.value = await ProjectModuleInfo.getProjectModuleInfoList({})
|
|
// const res = await AdminInfo.getAdminUsers({ groupId: 7, count: 30 })
|
const res = await AdminInfo.getAdminUsers({ count: 30 })
|
if (res && res.items) {
|
userList.value = res.items
|
}
|
}
|
|
// 根据字典类型查询字典
|
const loadBatchRows = () => {
|
// 循环10次
|
for (let i = 0; i < itemSize.value; i++) {
|
addRow()
|
}
|
}
|
|
const preItemSizeChange = () => {
|
projects.value = []
|
loadBatchRows()
|
}
|
|
// 重置表单
|
const resetForm = () => {
|
const forms = ruleForm.value
|
forms.forEach(tmpForm => {
|
if (tmpForm) {
|
tmpForm.resetFields()
|
}
|
})
|
}
|
|
const validForm = () => {
|
const forms = ruleForm.value
|
const validateArray = forms.map(async (tmpForm, index, array) => await tmpForm.validate(valid => valid))
|
|
const result = Promise.all(validateArray)
|
return result
|
}
|
|
const submitForm = async formName => {
|
const result = validForm()
|
result.then(res => {
|
let validateFlag = true
|
res.forEach(validateRes => {
|
validateFlag &= validateRes
|
})
|
if (validateFlag) {
|
ElMessageBox.confirm('确认保存吗, 是否继续?', '提示', {
|
confirmButtonText: '确定',
|
cancelButtonText: '取消',
|
type: 'warning',
|
})
|
.then(async () => {
|
loading.value = true
|
|
// const newData = camel(projects.value)
|
// const tempForm = { project_task_list: JSON.stringify(newData) }
|
projects.value.forEach(tmpProject => {
|
tmpProject.plan_begin_date = tmpProject.plan_date[0]
|
tmpProject.plan_end_date = tmpProject.plan_date[1]
|
})
|
const tempForm = { project_task_list: projects.value }
|
|
const res = await ProjectTaskInfo.createBatch(tempForm)
|
|
if (res.code < window.MAX_SUCCESS_CODE) {
|
// 重新初始化
|
resetForm()
|
ElMessage.success(`${res.message}`)
|
loading.value = false
|
} else {
|
ElMessage.error(`${res.message}`)
|
loading.value = false
|
}
|
})
|
.catch(e => {
|
// 用户点击取消按钮时执行的操作
|
// 可以选择不做任何事情,也可以显示取消消息
|
// ElMessage.error('操作已取消'); // 如果需要显示取消消息,可以取消注释
|
})
|
}
|
})
|
}
|
|
const addRow = () => {
|
// projects.value.push({
|
// id: '',
|
// project_id: '',
|
// module_id: '',
|
// name: '',
|
// description: '',
|
// type: '',
|
// priority: '',
|
// status: '',
|
// assign_status: '',
|
// evaluator_users: [],
|
// developer_users: [],
|
// plan_hour: '',
|
// plan_date: [],
|
// plan_begin_date: '',
|
// plan_end_date: '',
|
// actual_date: [],
|
// actual_begin_date: '',
|
// actual_end_date: '',
|
// remark: '',
|
// projectModuleTreeArr: [...projectModuleTreeArr.value]
|
// })
|
// let tmp_module_id=null;
|
// if(project.module_id){
|
// // 判断是否是数组
|
// if(Array.isArray(project.module_id)){
|
// tmp_module_id=project.module_id[project.module_id.length-1]
|
// }else{
|
// tmp_module_id=project.module_id
|
// }
|
// }
|
projects.value.push({
|
id: '',
|
project_id: project.project_id,
|
module_id: project.module_id,
|
name: '',
|
description: '',
|
type: project.type,
|
priority: project.priority,
|
status: project.status,
|
assign_status: project.assign_status,
|
evaluator_users: [...project.evaluator_users],
|
developer_users: [...project.developer_users],
|
plan_hour: project.plan_hour,
|
plan_date: [...project.plan_date],
|
plan_begin_date: project.plan_begin_date,
|
plan_end_date: project.plan_begin_date,
|
actual_date: [...project.actual_date],
|
actual_begin_date: project.actual_begin_date,
|
actual_end_date: project.actual_begin_date,
|
remark: '',
|
projectModuleTreeArr: [...projectModuleTreeArr.value],
|
})
|
}
|
|
function isBlank(str) {
|
return !str || str.replace(/\s/g, '').length === 0
|
}
|
|
const deleteRow = index => {
|
projects.value.splice(index, 1)
|
}
|
|
const back = () => {
|
context.emit('editClose')
|
}
|
|
watch(
|
project,
|
newVal => {
|
projects.value.forEach(item => {
|
// if (newVal.project_id) item.project_id = newVal.project_id;
|
// if (newVal.module_id) item.module_id = newVal.module_id;
|
if (newVal.type) item.type = newVal.type
|
if (newVal.priority) item.priority = newVal.priority
|
if (newVal.status) item.status = newVal.status
|
if (newVal.assign_status) item.assign_status = newVal.assign_status
|
if (newVal.plan_hour) item.plan_hour = newVal.plan_hour
|
if (newVal.evaluator_users.length) item.evaluator_users = [...newVal.evaluator_users]
|
if (newVal.plan_date.length) item.plan_date = [...newVal.plan_date]
|
})
|
},
|
{ deep: true }, // 深度监听
|
)
|
|
return {
|
back,
|
rules,
|
resetForm,
|
submitForm,
|
|
topHeader,
|
labelWidth,
|
labelWidthSort,
|
|
project,
|
projects,
|
addRow,
|
deleteRow,
|
|
dailyTypeArr,
|
dailyStatusArr,
|
|
form,
|
itemSize,
|
|
loading,
|
|
ruleForm,
|
refHandler,
|
|
projectTaskStatusArr,
|
projectTaskAssignStatus,
|
projectTaskTypeArr,
|
projectTaskPriorityArr,
|
userList,
|
|
projectInfoArr,
|
projectModuleArr,
|
projectModuleTreeArr,
|
moduleCascaderProps,
|
|
handleModuleChange,
|
handleProjectChange,
|
|
preItemSizeChange,
|
handleProjectChangeBatch,
|
handleModuleChangeBatch,
|
}
|
},
|
}
|
function getDefaultDate() {
|
const today = new Date()
|
const year = today.getFullYear()
|
const month = String(today.getMonth() + 1).padStart(2, '0')
|
const day = String(today.getDate()).padStart(2, '0')
|
const now = `${year}-${month}-${day}`
|
return now
|
}
|
|
/**
|
* 下划线转驼峰
|
*/
|
function camel(data) {
|
if (typeof data !== 'object' || !data) return data
|
if (Array.isArray(data)) {
|
return data.map(item => camel(item))
|
}
|
|
const newData = {}
|
for (const key in data) {
|
const newKey = key.replace(/_([a-z])/g, (p, m) => m.toUpperCase())
|
newData[newKey] = camel(data[key])
|
}
|
return newData
|
}
|
|
/**
|
* 驼峰转下划线
|
*/
|
function underline(data) {
|
if (typeof data !== 'object' || !data) return data
|
if (Array.isArray(data)) {
|
return data.map(item => underline(item))
|
}
|
|
const newData = {}
|
for (const key in data) {
|
const newKey = key.replace(/([A-Z])/g, (p, m) => `_${m.toLowerCase()}`)
|
newData[newKey] = underline(data[key])
|
}
|
return newData
|
}
|
</script>
|
|
<style lang="scss" scoped>
|
.container {
|
.title {
|
height: 59px;
|
line-height: 59px;
|
color: $parent-title-color;
|
font-size: 16px;
|
font-weight: 500;
|
text-indent: 40px;
|
border-bottom: 1px solid #dae1ec;
|
|
.back {
|
float: right;
|
margin-right: 40px;
|
cursor: pointer;
|
}
|
}
|
|
.wrap {
|
padding: 20px;
|
}
|
|
.submit {
|
float: left;
|
}
|
}
|
</style>
|
|
<style scoped>
|
.el-select {
|
display: inline-block;
|
position: relative;
|
vertical-align: middle;
|
width: var(--el-select-width);
|
width: 100px !important;
|
}
|
|
.top-class {
|
margin: 10 5 5 5;
|
}
|
|
.pre-form-class {
|
margin: 5px;
|
}
|
|
.log-list {
|
margin-top: 10px;
|
max-height: 90%;
|
/* 设置最大高度,出现滚动条 */
|
overflow-y: auto;
|
/* 垂直滚动条 */
|
width: 99%;
|
overflow-x: auto;
|
scrollbar-width: thin;
|
scrollbar-color: #ccc #f2f2f2;
|
}
|
|
.log-index {
|
width: 30px;
|
text-align: center;
|
}
|
|
.log-item {
|
margin: 10px;
|
width: 3000px;
|
height: 30px;
|
}
|
|
.log-item-content {
|
display: flex;
|
flex-direction: row;
|
flex-wrap: nowrap;
|
align-items: center;
|
justify-content: center;
|
justify-items: center;
|
}
|
|
.log-item-action {
|
flex-shrink: 0;
|
margin-left: 5px;
|
}
|
|
.delete-button {
|
cursor: pointer;
|
font-size: 14px;
|
}
|
|
.add-button {
|
margin: 5px;
|
}
|
.add-button-class {
|
display: flex;
|
justify-content: flex-end;
|
}
|
</style>
|