<template>
|
<div class="container">
|
<div class="title" v-if="!editId">
|
任务分配{{ editId }}
|
<span class="back" @click="back"> <i class="iconfont icon-fanhui"></i> 返回 </span>
|
</div>
|
<div class="title" v-else>
|
<span>任务分配</span> <span class="back" @click="back"> <i class="iconfont icon-fanhui"></i> 返回 </span>
|
</div>
|
<div class="wrap" style="width: 100%">
|
<el-collapse v-model="activeNames" @change="handleChange" style="padding: 10px">
|
<el-collapse-item title="基础信息" name="0">
|
<div style="margin: 10px">
|
<el-descriptions>
|
<!-- <el-descriptions-item label="所属项目">{{ project.project_name }}</el-descriptions-item>
|
<el-descriptions-item label="项目模块">{{ project.module_name }}</el-descriptions-item> -->
|
<el-descriptions-item label="所属项目">{{ project.project_name_src }}</el-descriptions-item>
|
<el-descriptions-item label="项目模块">{{ project.module_name_src }}</el-descriptions-item>
|
<el-descriptions-item label="任务名称">{{ project.name }}</el-descriptions-item>
|
<el-descriptions-item label="任务描述">{{ project.description }} </el-descriptions-item>
|
<el-descriptions-item label="任务类型">{{
|
getDictLabel(projectTaskTypeArr, project.type)
|
}}</el-descriptions-item>
|
<el-descriptions-item label="优先级">{{
|
getDictLabel(projectTaskPriorityArr, project.priority)
|
}}</el-descriptions-item>
|
<el-descriptions-item label="任务状态">{{
|
getDictLabel(projectTaskStatusArr, project.status)
|
}}</el-descriptions-item>
|
<el-descriptions-item label="排配状态">{{
|
getDictLabel(projectTaskAssignStatus, project.assign_status)
|
}}</el-descriptions-item>
|
<el-descriptions-item label="评估人">{{
|
getPropertyValues(userList, project.evaluator_users, 'nickname')
|
}}</el-descriptions-item>
|
<el-descriptions-item label="计划工时">{{ project.plan_hour }}</el-descriptions-item>
|
<el-descriptions-item label="计划时间"
|
>{{ formatDateToDateString(project.plan_begin_date) }} ~
|
{{ formatDateToDateString(project.plan_end_date) }}</el-descriptions-item
|
>
|
<el-descriptions-item label="备注">{{ project.remark }}</el-descriptions-item>
|
</el-descriptions>
|
</div>
|
</el-collapse-item>
|
<el-collapse-item title="计划调整" name="1">
|
<div style="margin: 10px">
|
<el-form label-width="120" :model="planForm" ref="planFormRef" :rules="planFormrules">
|
<el-form-item label="计划工时" prop="plan_hour">
|
<el-input-number
|
v-model="planForm.plan_hour"
|
:min="0"
|
:max="999"
|
:precision="1"
|
:step="0.5"
|
label="计划工时"
|
size="small"
|
style="width: 220px"
|
:disabled="project.status === 'FY'"
|
></el-input-number>
|
</el-form-item>
|
<el-form-item label="计划开始时间" prop="plan_begin_date">
|
<el-date-picker
|
v-model="planForm.plan_begin_date"
|
type="date"
|
placeholder="计划开始时间"
|
size="small"
|
format="YYYY-MM-DD"
|
value-format="YYYY-MM-DD HH:mm:ss"
|
:disabled="project.status !== 'FN'"
|
/>
|
</el-form-item>
|
|
<el-form-item label="计划结束时间" prop="plan_end_date">
|
<el-date-picker
|
v-model="planForm.plan_end_date"
|
type="date"
|
placeholder="计划结束时间"
|
size="small"
|
format="YYYY-MM-DD"
|
value-format="YYYY-MM-DD HH:mm:ss"
|
:disabled="project.status === 'FY'"
|
/>
|
</el-form-item>
|
|
<el-form-item class="submit" :style="{ display: project.status === 'FY' ? 'none' : 'block' }">
|
<el-button type="primary" @click="submitPlanForm">保 存</el-button>
|
<el-button @click="resetPlanForm">重 置</el-button>
|
</el-form-item>
|
</el-form>
|
</div>
|
</el-collapse-item>
|
<el-collapse-item title="已排配信息" name="2">
|
<div class="project-batch">
|
<el-table :data="project.project_daily_list" style="width: 100%">
|
<el-table-column label="序号" align="center" width="80">
|
<template #default="scope">
|
<span>{{ scope.$index + 1 }}</span>
|
</template>
|
</el-table-column>
|
|
<el-table-column label="开发者" prop="create_user_name" width="120" align="center">
|
<template #default="scope">
|
<el-input v-model="scope.row.create_user_name" placeholder="开发者" size="small" clearable readonly />
|
</template>
|
</el-table-column>
|
|
<el-table-column label="日志日期" prop="daily_date" width="150" align="center">
|
<template #default="scope">
|
<el-date-picker
|
v-model="scope.row.daily_date"
|
type="date"
|
placeholder="日志日期"
|
value-format="YYYY-MM-DD"
|
size="small"
|
clearable
|
:disabled="getDailyEditFlag(scope.row)"
|
/>
|
</template>
|
</el-table-column>
|
|
<el-table-column label="日志类型" prop="daily_type" width="150" align="center">
|
<template #default="scope">
|
<el-select
|
v-model="scope.row.daily_type"
|
placeholder="日志类型"
|
size="small"
|
clearable
|
:disabled="true"
|
filterable
|
>
|
<el-option v-for="item in dailyTypeArr" :key="item.value" :label="item.label" :value="item.value" />
|
</el-select>
|
</template>
|
</el-table-column>
|
|
<el-table-column label="日志状态" prop="daily_status" width="150" align="center">
|
<template #default="scope">
|
<el-select
|
v-model="scope.row.daily_status"
|
placeholder="日志状态"
|
size="small"
|
clearable
|
:disabled="true"
|
filterable
|
>
|
<el-option
|
v-for="item in dailyStatusArr"
|
:key="item.value"
|
:label="item.label"
|
:value="item.value"
|
/>
|
</el-select>
|
</template>
|
</el-table-column>
|
|
<el-table-column label="日志内容" prop="daily_content" align="center" show-overflow-tooltip>
|
<template #default="scope">
|
<el-input
|
v-model="scope.row.daily_content"
|
placeholder="日志内容"
|
size="small"
|
clearable
|
:disabled="getDailyEditFlag(scope.row)"
|
/>
|
</template>
|
</el-table-column>
|
|
<el-table-column label="计划用时" prop="estimated_hours" width="150" align="center">
|
<template #default="scope">
|
<el-tooltip class="box-item" effect="dark" content="计划工时" placement="top-start">
|
<el-input-number
|
v-model="scope.row.estimated_hours"
|
:min="0"
|
:max="999"
|
:step="0.5"
|
:precision="1"
|
placeholder="计划用时"
|
size="small"
|
:disabled="getDailyEditFlag(scope.row)"
|
/>
|
</el-tooltip>
|
</template>
|
</el-table-column>
|
|
<el-table-column label="操作" width="120" align="center">
|
<template #default="scope">
|
<i
|
class="el-icon-remove-outline"
|
@click="deleteTaskDailyRow(scope.row)"
|
style="cursor: pointer; margin-left: 10px"
|
v-if="!getDailyEditFlag(scope.row)"
|
></i>
|
<i
|
class="el-icon-circle-check"
|
@click="updateTaskDailyRow(scope.row)"
|
style="cursor: pointer; margin-left: 10px"
|
v-if="!getDailyEditFlag(scope.row)"
|
></i>
|
</template>
|
</el-table-column>
|
</el-table>
|
</div>
|
</el-collapse-item>
|
<el-collapse-item
|
title="任务排配"
|
name="3"
|
v-if="project.status === 'AN' || project.status === 'AY' || project.status === 'FN' || project.status === 'P'"
|
>
|
<div class="project-batch">
|
<el-form :model="project" status-icon ref="form" label-width="auto" @submit.prevent :rules="rules">
|
<el-form-item label="开发者" prop="developer_users" class="selectClass">
|
<el-select
|
v-model="project.developer_users"
|
placeholder="请选择开发者"
|
clearable
|
filterable
|
:multiple="true"
|
@change="handleDeveloperChange"
|
>
|
<el-option v-for="item in developerUserList" :key="item.id" :label="item.nickname" :value="item.id" />
|
</el-select>
|
</el-form-item>
|
|
<el-form-item label="排配信息" v-if="dailys && dailys.length > 0" prop="dailys" class="selectClass">
|
<div>
|
<div v-for="(daily, index) in dailys" :key="index" class="log-item">
|
<el-form
|
inline="true"
|
:ref="refHandler"
|
:key="index"
|
:model="daily"
|
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="user_id" class="selectClass">
|
<el-select
|
v-model="daily.user_id"
|
placeholder="请选择开发者"
|
clearable
|
filterable
|
:multiple="false"
|
size="small"
|
style="width: 120px"
|
:disabled="assignFlag"
|
>
|
<el-option
|
v-for="item in developerUserList"
|
:key="item.id"
|
:label="item.nickname"
|
:value="item.id"
|
/>
|
</el-select>
|
</el-form-item>
|
|
<el-form-item :label="index === -1 ? '日志日期' : ''" prop="daily_date" :rules="rules.daily_date">
|
<el-date-picker
|
v-model="daily.daily_date"
|
type="date"
|
placeholder="日志日期"
|
value-format="YYYY-MM-DD"
|
style="width: 120px"
|
size="small"
|
clearable
|
/>
|
</el-form-item>
|
|
<el-form-item :label="index === -1 ? '日志类型' : ''" prop="daily_type" :rules="rules.daily_type">
|
<el-select
|
v-model="daily.daily_type"
|
placeholder="日志类型"
|
style="width: 100px"
|
clearable
|
filterable
|
size="small"
|
>
|
<el-option
|
v-for="item in dailyTypeArr"
|
:key="item.value"
|
:label="item.label"
|
:value="item.value"
|
/>
|
</el-select>
|
</el-form-item>
|
|
<el-form-item
|
:label="index === -1 ? '日志状态' : ''"
|
prop="daily_status"
|
:rules="rules.daily_status"
|
>
|
<el-select
|
v-model="daily.daily_status"
|
placeholder="日志状态"
|
style="width: 100px"
|
clearable
|
filterable
|
size="small"
|
>
|
<el-option
|
v-for="item in dailyStatusArr"
|
:key="item.value"
|
:label="item.label"
|
:value="item.value"
|
/>
|
</el-select>
|
</el-form-item>
|
|
<el-form-item
|
:label="index === -1 ? '日志内容' : ''"
|
prop="daily_content"
|
:rules="rules.daily_content"
|
>
|
<el-input
|
v-model="daily.daily_content"
|
placeholder="日志内容"
|
style="width: 200px"
|
:key="index"
|
size="small"
|
clearable
|
/>
|
</el-form-item>
|
|
<el-form-item
|
:label="index === -1 ? '计划用时' : ''"
|
prop="estimated_hours"
|
:rules="rules.estimated_hours"
|
>
|
<el-tooltip class="box-item" effect="dark" content="计划工时" placement="top-start">
|
<el-input-number
|
v-model="daily.estimated_hours"
|
:min="0"
|
:max="999"
|
:step="0.5"
|
:precision="1"
|
label="计划用时"
|
placeholder="计划用时"
|
:key="index"
|
size="small"
|
clearable
|
/>
|
</el-tooltip>
|
</el-form-item>
|
<el-form-item>
|
<i class="el-icon-remove-outline" @click="deleteRow(index)" :key="index"></i>
|
</el-form-item>
|
</el-form>
|
</div>
|
</div>
|
</el-form-item>
|
|
<el-form-item class="submit">
|
<div v-if="dailys && dailys.length > 0">
|
<el-button type="primary" @click="submitForm">保 存</el-button>
|
<el-button @click="resetForm">重 置</el-button>
|
</div>
|
</el-form-item>
|
</el-form>
|
</div>
|
</el-collapse-item>
|
</el-collapse>
|
</div>
|
</div>
|
</template>
|
|
<script>
|
import { reactive, ref, onMounted, computed } from 'vue'
|
import { debounce } from 'lodash'
|
import { ElMessageBox, ElMessage } from 'element-plus'
|
import ProjectInfo from '@/model/projectInfo'
|
import sysDictItemModel from '@/model/sysDictItem'
|
import ProjectModuleInfo from '@/model/projectModuleInfo'
|
import AdminInfo from '@/lin/model/admin'
|
import ProjectTaskInfo from '@/model/projectTaskInfo'
|
import ProjectDaily from '@/model/projectDaily'
|
import dayjs from 'dayjs'
|
|
export default {
|
props: {
|
editId: {
|
type: String,
|
default: null,
|
},
|
},
|
setup(props, context) {
|
// 防抖函数,避免动态表格数据变化时产生的抖动
|
const resizeObserver = window.ResizeObserver
|
|
window.ResizeObserver = class extends resizeObserver {
|
constructor(callback) {
|
const debouncedCallback = debounce(callback, 100)
|
super(debouncedCallback)
|
}
|
}
|
|
const activeNames = ref(['0', '1', '2', '3'])
|
const assignFlag = ref(true)
|
const form = ref(null)
|
const loading = ref(false)
|
|
const dailys = ref([])
|
|
const ruleForm = ref([])
|
const refHandler = el => {
|
if (el) {
|
ruleForm.value.push(el)
|
}
|
}
|
|
const deleteRow = index => {
|
// 获取列表
|
const delDaiy = dailys.value[index]
|
// 把project里面的developer_users删除
|
project.developer_users = project.developer_users.filter(item => item !== delDaiy.user_id)
|
dailys.value.splice(index, 1)
|
}
|
|
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: '',
|
project_daily_list: '',
|
|
project_name: '',
|
module_name: '',
|
|
project_name_src: '',
|
module_name_src: '',
|
})
|
|
const planForm = ref({
|
id: '',
|
plan_hour: '',
|
plan_begin_date: '',
|
plan_end_date: '',
|
})
|
const planFormRef = ref(null)
|
|
const projectTaskStatusArr = ref([])
|
const projectTaskAssignStatus = ref([])
|
const projectTaskTypeArr = ref([])
|
const projectTaskPriorityArr = ref([])
|
const userList = ref([])
|
const developerUserList = ref([])
|
|
const projectInfoArr = ref([])
|
const projectModuleArr = ref([])
|
const projectModuleTreeArr = ref([])
|
const moduleCascaderProps = {
|
value: 'id', // 设置 value 字段
|
label: 'name', // 设置 label 字段
|
children: 'children', // 设置子项的字段
|
checkStrictly: true, // 设置任意节点的子节点是否可以勾选
|
}
|
|
const dailyTypeArr = ref([])
|
const dailyStatusArr = ref([])
|
|
const listAssign = (a, b) => Object.keys(a).forEach(key => {
|
a[key] = b[key] || a[key]
|
})
|
|
const deleteTaskDailyRow = row => {
|
// 删除操作
|
ElMessageBox.confirm('此操作将永久删除该记录, 是否继续?', '提示', {
|
confirmButtonText: '确定',
|
cancelButtonText: '取消',
|
type: 'warning',
|
})
|
.then(async () => {
|
const res = await ProjectTaskInfo.deleteTaskDaily(row.id)
|
if (res.code < window.MAX_SUCCESS_CODE) {
|
getProjectInfo()
|
ElMessage.success(`${res.message}`)
|
}
|
})
|
.catch(() => {
|
// 用户点击取消按钮时执行的操作
|
// 可以选择不做任何事情,也可以显示取消消息
|
// ElMessage.info('操作已取消'); // 如果需要显示取消消息,可以取消注释
|
})
|
}
|
const updateTaskDailyRow = row => {
|
// 删除操作
|
ElMessageBox.confirm('确认修改该记录嘛, 是否继续?', '提示', {
|
confirmButtonText: '确定',
|
cancelButtonText: '取消',
|
type: 'warning',
|
})
|
.then(async () => {
|
const res = await ProjectTaskInfo.updateTaskDaily(row.id, row)
|
if (res.code < window.MAX_SUCCESS_CODE) {
|
await getProjectInfo()
|
ElMessage.success(`${res.message}`)
|
}
|
})
|
.catch(() => {
|
// 用户点击取消按钮时执行的操作
|
// 可以选择不做任何事情,也可以显示取消消息
|
// ElMessage.info('操作已取消'); // 如果需要显示取消消息,可以取消注释
|
})
|
}
|
const handleProjectChange = async e => {
|
projectModuleTreeArr.value = await ProjectModuleInfo.getProjectModuleTree({ projectId: e })
|
}
|
|
const getDailyEditFlag = row => {
|
if (project.status === 'FY') {
|
// 已经确认过了则不可以编辑
|
return true
|
}
|
|
// 1. 提交后不能改
|
if (row.is_commit == '1') {
|
return true
|
}
|
|
// 2. 排配以前时间不可改
|
const today = new Date() // 获取今天的日期
|
today.setHours(0, 0, 0, 0)
|
const dailyDate = new Date(row.daily_date) // 转换 daily_date 为 Date 对象
|
dailyDate.setHours(0, 0, 0, 0)
|
if (dailyDate < today) {
|
return true
|
}
|
|
// 3. 已完成不能改
|
if (row.daily_status == '2') {
|
return true
|
}
|
return false
|
}
|
|
/**
|
* 表单规则验证
|
*/
|
const rules = {
|
daily_date: [
|
{ message: '请输入日期', trigger: ['blur', 'change'], required: true },
|
{
|
message: '排配日期不能小于今天',
|
trigger: ['blur', 'change'],
|
validator: (rule, value, callback) => {
|
// 获取当前日期,忽略时间部分
|
const today = new Date()
|
today.setHours(0, 0, 0, 0) // 清除时间部分,保留日期
|
|
// 检查日期是否小于今天
|
if (value && new Date(value) < today) {
|
callback(new Error('排配日期不能小于今天'))
|
} else {
|
callback() // 校验通过
|
}
|
},
|
},
|
],
|
daily_type: [{ message: '请选择日志类型', trigger: ['blur', 'change'], required: true }],
|
project_id: [{ message: '请选择项目', trigger: ['blur', 'change'], required: true }],
|
daily_status: [{ message: '请选择日志状态', trigger: ['blur', 'change'], required: true }],
|
daily_content: [{ message: '请输入日志内容', trigger: ['blur', 'change'], required: true }],
|
estimated_hours: [
|
{
|
message: '请输入计划工时',
|
trigger: ['blur', 'change'],
|
required: true,
|
},
|
{
|
message: '工时不能小于 0.5',
|
trigger: ['blur', 'change'],
|
validator: (rule, value, callback) => {
|
if (value < 0.5) {
|
callback(new Error('工时不能小于 0.5'))
|
} else {
|
callback() // 验证通过
|
}
|
},
|
},
|
],
|
}
|
|
const planFormrules = {
|
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_begin_date: [
|
{
|
message: '请选择计划开始时间',
|
trigger: 'blur,change',
|
required: true,
|
},
|
{
|
validator: (rule, value, callback) => {
|
const today = new Date()
|
const selectedDate = new Date(value)
|
|
// 清除时分秒,确保只比较年月日
|
today.setHours(0, 0, 0, 0)
|
selectedDate.setHours(0, 0, 0, 0)
|
|
// 如果项目状态不是未开始,那么不能修改
|
console.log(project.status)
|
if (project.status === 'FN' && selectedDate < today) {
|
callback(new Error('计划开始时间不能小于今天'))
|
} else {
|
callback()
|
}
|
},
|
trigger: 'blur,change',
|
},
|
],
|
|
plan_end_date: [
|
{
|
message: '请选择计划结束时间',
|
trigger: 'blur,change',
|
required: true,
|
},
|
{
|
validator: (rule, value, callback) => {
|
const planBeginDate = new Date(planForm.value.plan_begin_date)
|
const selectedEndDate = new Date(value)
|
|
// 清除时分秒,确保只比较年月日
|
planBeginDate.setHours(0, 0, 0, 0)
|
selectedEndDate.setHours(0, 0, 0, 0)
|
|
if (selectedEndDate < planBeginDate) {
|
callback(new Error('计划结束时间不能小于计划开始时间'))
|
} else {
|
callback()
|
}
|
},
|
trigger: 'blur,change',
|
},
|
],
|
}
|
|
onMounted(() => {
|
loadDictDitems()
|
})
|
|
const loadDictDitems = async () => {
|
if (props.editId) {
|
await getProjectInfo()
|
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
|
developerUserList.value = res.items.filter(item => item.groups.some(group => group.id === 7))
|
}
|
|
dailyTypeArr.value = await sysDictItemModel.getSysDictItemListByType('daily_type')
|
dailyStatusArr.value = await sysDictItemModel.getSysDictItemListByType('daily_status')
|
}
|
|
const getProjectInfo = async () => {
|
loading.value = true
|
const res = await ProjectTaskInfo.get(props.editId)
|
listAssign(project, res)
|
// 赋值给表单
|
listAssign(planForm.value, res)
|
project.plan_date = []
|
project.plan_date.push(`${project.plan_begin_date}`)
|
project.plan_date.push(`${project.plan_end_date}`)
|
if (project.evaluator_users) {
|
const evaluatorUsers = project.evaluator_users.map(item => Number(item.evaluator_id))
|
project.evaluator_users = evaluatorUsers
|
}
|
project.project_daily_list = res.project_daily_list
|
project.value = res
|
loading.value = false
|
}
|
|
const handleModuleChange = value => {
|
if (value && value.length > 0) {
|
// 仅保存最后一级的 id
|
project.module_id = value[value.length - 1] // 取最后一个值
|
} else {
|
project.module_id = null // 如果没有选择,则清空
|
}
|
}
|
|
const handleDeveloperChange = value => {
|
// 遍历循环dailys,查找是否有userId是否在value中,如果不存在,则新增值
|
value.forEach(item => {
|
const index = dailys.value.findIndex(v => v.user_id === item)
|
if (index === -1) {
|
dailys.value.push({
|
user_id: item,
|
task_id: project.id,
|
project_id: project.project_id,
|
module_id: project.module_id,
|
task_name: project.name,
|
task_desc: project.description,
|
daily_type: '1',
|
daily_content: project.name,
|
daily_status: '0',
|
daily_date: `${dayjs().format('YYYY-MM-DD')} 00:00:00`,
|
estimated_hours: '2',
|
|
project_name: '',
|
module_name: '',
|
})
|
}
|
})
|
|
// 遍历dailys 把不在value里面的元素给移除
|
dailys.value = dailys.value.filter(item => value.includes(item.user_id))
|
}
|
|
// 重置表单
|
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 tempForm = { daily_list: dailys.value }
|
const res = await ProjectDaily.createBatchWithTask(tempForm)
|
|
if (res.code < window.MAX_SUCCESS_CODE) {
|
// 重新初始化
|
resetForm()
|
// 更新项目信息
|
project.developer_users = []
|
dailys.value = []
|
getProjectInfo()
|
ElMessage.success(`${res.message}`)
|
loading.value = false
|
} else {
|
ElMessage.error(`${res.message}`)
|
loading.value = false
|
}
|
})
|
.catch(e => {
|
// 用户点击取消按钮时执行的操作
|
// 可以选择不做任何事情,也可以显示取消消息
|
// ElMessage.error('操作已取消') // 如果需要显示取消消息,可以取消注释
|
})
|
}
|
})
|
}
|
|
// 提交表单
|
const submitPlanForm = () => {
|
planFormRef.value.validate(async valid => {
|
if (valid) {
|
// 处理提交逻辑
|
ElMessageBox.confirm('确认保存吗, 是否继续?', '提示', {
|
confirmButtonText: '确定',
|
cancelButtonText: '取消',
|
type: 'warning',
|
})
|
.then(async () => {
|
loading.value = true
|
|
const res = await ProjectTaskInfo.updateTaskPlanInfo(planForm.value)
|
|
if (res.code < window.MAX_SUCCESS_CODE) {
|
getProjectInfo()
|
ElMessage.success(`${res.message}`)
|
loading.value = false
|
} else {
|
ElMessage.error(`${res.message}`)
|
loading.value = false
|
}
|
})
|
.catch(e => {
|
// 用户点击取消按钮时执行的操作
|
// 可以选择不做任何事情,也可以显示取消消息
|
// ElMessage.error('操作已取消') // 如果需要显示取消消息,可以取消注释
|
})
|
} else {
|
console.log('表单验证失败')
|
return false
|
}
|
})
|
}
|
|
// 格式化日期的函数
|
const formatDateToDateString = dateString => {
|
if (dateString) {
|
const date = new Date(dateString)
|
const year = date.getFullYear()
|
const month = String(date.getMonth() + 1).padStart(2, '0') // 月份从 0 开始
|
const day = String(date.getDate()).padStart(2, '0')
|
return `${year}-${month}-${day}`
|
}
|
return ''
|
}
|
|
const resetPlanForm = () => {
|
planFormRef?.value?.resetFields()
|
}
|
|
const back = () => {
|
context.emit('editClose')
|
}
|
|
const getDictLabel = (dictList, dictValue) => {
|
const dictItem = dictList.find(item => item.value === dictValue)
|
return dictItem ? dictItem.label : ''
|
}
|
|
const getPropertyValues = (userList, idList, propertyName) => {
|
// 过滤出与idList匹配的用户对象
|
const filteredUsers = userList.filter(user => idList.includes(user.id))
|
|
// 提取每个用户对象的指定属性值,并用逗号连接
|
const values = filteredUsers.map(user => user[propertyName]).join(', ')
|
|
return values
|
}
|
|
return {
|
back,
|
project,
|
form,
|
rules,
|
resetForm,
|
submitForm,
|
|
projectTaskStatusArr,
|
projectTaskAssignStatus,
|
projectTaskTypeArr,
|
projectTaskPriorityArr,
|
userList,
|
|
projectInfoArr,
|
projectModuleArr,
|
projectModuleTreeArr,
|
moduleCascaderProps,
|
|
handleProjectChange,
|
handleModuleChange,
|
|
assignFlag,
|
dailys,
|
handleDeveloperChange,
|
dailyTypeArr,
|
dailyStatusArr,
|
deleteRow,
|
ruleForm,
|
refHandler,
|
developerUserList,
|
activeNames,
|
getDictLabel,
|
getPropertyValues,
|
|
planForm,
|
planFormRef,
|
submitPlanForm,
|
resetPlanForm,
|
getDailyEditFlag,
|
|
deleteTaskDailyRow,
|
updateTaskDailyRow,
|
planFormrules,
|
formatDateToDateString,
|
}
|
},
|
}
|
</script>
|
|
<style lang="scss" scoped>
|
.project-batch {
|
margin: 10px;
|
padding: 10px;
|
}
|
|
.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>
|