|
@@ -11,6 +11,7 @@
|
|
|
<article>
|
|
|
<h2 v-show="type==='require'" class="form-title">需求范围</h2>
|
|
|
<h2 v-show="type==='task'" class="form-title">任务范围</h2>
|
|
|
+ <h2 v-show="type==='bug'" class="form-title">缺陷范围</h2>
|
|
|
<el-form ref="form" :model="formData" label-width="100px" label-position="left">
|
|
|
<el-form-item v-if="type === 'require'" label="需求方向">
|
|
|
<el-cascader
|
|
@@ -25,7 +26,7 @@
|
|
|
class="input-width"
|
|
|
/>
|
|
|
</el-form-item>
|
|
|
- <el-form-item v-if="type === 'task'" label="技术模块">
|
|
|
+ <el-form-item v-if="type === 'task' || type === 'bug'" label="技术模块">
|
|
|
<el-cascader
|
|
|
v-model="formData.techModuleIdList"
|
|
|
size="small"
|
|
@@ -40,12 +41,17 @@
|
|
|
</el-form-item>
|
|
|
</el-form>
|
|
|
<el-form ref="form" :model="formData" label-width="100px" label-position="left" :inline="true">
|
|
|
- <el-form-item label="跟版客户端">
|
|
|
+ <el-form-item v-if="type === 'bug'" label="端类型">
|
|
|
+ <el-select v-model="formData.sysType" size="small" style="width: 209px;" :disabled="disabled" clearable filterable placeholder="请选择">
|
|
|
+ <el-option v-for="item in sysTypeEnumList" :key="item.code" :label="item.name" :value="item.code" />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item v-if="type === 'require' || type === 'task'" label="跟版客户端">
|
|
|
<el-select v-model="formData.clientId" placeholder="请选择" size="small" :disabled="disabled" clearable>
|
|
|
<el-option v-for="item in appClientList" :key="'app'+item.code" :label="item.msg" :value="item.code" />
|
|
|
</el-select>
|
|
|
</el-form-item>
|
|
|
- <el-form-item>
|
|
|
+ <el-form-item v-if="type === 'require' || type === 'task'">
|
|
|
<el-select v-model="formData.clientVersionId" placeholder="请选择" size="small" :disabled="disabled" clearable>
|
|
|
<el-option v-for="item in clientList" :key="'client'+item.code" :label="item.msg" :value="item.code" />
|
|
|
</el-select>
|
|
@@ -57,21 +63,33 @@
|
|
|
<el-select v-model="item.type" placeholder="请选择类型" size="small" class="condition-select" :disabled="disabled" @change="changeNoticeItem(item)">
|
|
|
<el-option v-for="key in typeList" :key="key.label" :label="key.label" :value="key.value" />
|
|
|
</el-select>
|
|
|
- <el-select v-show="item.type === 1 || item.type === 3" v-model="item.status" placeholder="请选择状态" size="small" class="condition-select" :disabled="disabled">
|
|
|
+ <el-select v-show="item.type === 1 || item.type === 3 || item.type === 5" v-model="item.status" placeholder="请选择状态" size="small" class="condition-select" :disabled="disabled">
|
|
|
<el-option v-for="key in statusList" :key="'status'+key.code" :label="key.msg" :value="key.code" />
|
|
|
</el-select>
|
|
|
- <el-select v-show="item.type === 1 || item.type === 3" v-model="item.triggerEvent" placeholder="请选择" size="small" class="condition-select" :disabled="disabled">
|
|
|
+ <el-select v-show="item.type === 103 || item.type === 203" v-model="item.status" placeholder="请选择状态" size="small" class="condition-select" :disabled="disabled">
|
|
|
+ <el-option v-for="key in noticeConditionScheduleTypeList" :key="'statu'+key.code" :label="key.name" :value="key.code" />
|
|
|
+ </el-select>
|
|
|
+ <el-select v-show="item.type === 1 || item.type === 3 || item.type === 5" v-model="item.triggerEvent" placeholder="请选择" size="small" class="condition-select" :disabled="disabled">
|
|
|
<el-option v-for="key in triggerList" :key="'trigger'+key.code" :label="key.name" :value="key.code" />
|
|
|
</el-select>
|
|
|
+ <el-select v-show="item.type === 103 || item.type === 203" v-model="item.triggerEvent" placeholder="请选择" size="small" class="condition-select" :disabled="disabled">
|
|
|
+ <el-option v-for="key in noticeScheduleOpList" :key="'trigge'+key.code" :label="key.name" :value="key.code" />
|
|
|
+ </el-select>
|
|
|
<el-select v-show="item.type === 2 || item.type === 4" v-model="item.triggerEvent" placeholder="请选择" size="small" class="condition-select" :disabled="disabled">
|
|
|
<el-option v-for="key in noticeEventList" :key="'event'+key.code" :label="key.name" :value="key.code" />
|
|
|
</el-select>
|
|
|
<el-select v-show="item.type === 1 || item.type === 3" v-model="item.greaterTime" placeholder="请选择" size="small" class="condition-select" :disabled="disabled">
|
|
|
<el-option v-for="key in rangDaysList" :key="'greaterTime'+key.value" :label="key.label" :value="key.value" />
|
|
|
</el-select>
|
|
|
+ <el-select v-show="item.type === 5" v-model="item.greaterTime" placeholder="请选择" size="small" class="condition-select" :disabled="disabled">
|
|
|
+ <el-option v-for="key in sDaysList" :key="'s'+key.value" :label="key.label" :value="key.value" />
|
|
|
+ </el-select>
|
|
|
<el-select v-show="item.type === 2 || item.type === 4" v-model="item.lessTime" placeholder="请选择" size="small" class="condition-select" :disabled="disabled">
|
|
|
<el-option v-for="key in aheadDaysList" :key="'lessTime'+key.value" :label="key.label" :value="key.value" />
|
|
|
</el-select>
|
|
|
+ <el-select v-show="item.type === 103 || item.type === 203" v-model="item.greaterTime" placeholder="请选择" size="small" class="condition-select" :disabled="disabled">
|
|
|
+ <el-option v-for="key in DaysList" :key="'daily'+key.value" :label="key.label" :value="key.value" />
|
|
|
+ </el-select>
|
|
|
<i v-show="!disabled" class="el-icon-remove-outline" @click="removeItem(index)" />
|
|
|
</el-form-item>
|
|
|
<div v-show="!disabled" class="add-condition" @click="addCondition()"><i class="el-icon-circle-plus-outline" /> 添加条件</div>
|
|
@@ -144,8 +162,9 @@
|
|
|
</div>
|
|
|
</el-form>
|
|
|
<h2 class="form-title">通知时刻</h2>
|
|
|
- <div class="notice-time">
|
|
|
+ <!-- <div class="notice-time">
|
|
|
<el-time-select
|
|
|
+ v-if="type === 'task' || type === 'require'"
|
|
|
v-model="formData.noticeTime"
|
|
|
placeholder="任意时间点"
|
|
|
size="small"
|
|
@@ -157,7 +176,19 @@
|
|
|
}"
|
|
|
:disabled="disabled"
|
|
|
/>
|
|
|
- </div>
|
|
|
+ </div> -->
|
|
|
+ <el-form :model="formData" label-width="100px" label-position="left" :inline="true">
|
|
|
+ <el-form-item label="时间">
|
|
|
+ <el-select v-model="formData.noticeTimeList" multiple placeholder="任意时间点" size="small" style="width: 209px;" :disabled="disabled" clearable>
|
|
|
+ <el-option v-for="(key, index) in timeDateEnum" :key="'continuity'+index" :label="key" :value="key" />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item><br>
|
|
|
+ <el-form-item label="频次">
|
|
|
+ <el-select v-model="formData.noticeFrequency" placeholder="请选择" size="small" style="width: 209px;" :disabled="disabled" clearable>
|
|
|
+ <el-option v-for="key in continuityDaysList" :key="'continuity'+key.value" :label="key.label" :value="key.value" />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
</article>
|
|
|
</normal-dialog>
|
|
|
</template>
|
|
@@ -173,7 +204,7 @@ import {
|
|
|
} from '@/api/configure'
|
|
|
import { teamQueryTeamListBelowBiz } from '@/api/toConfigure.js'
|
|
|
import { settingQueryBizRqmtOrntList } from '@/api/requirement.js'
|
|
|
-import { settingQueryBizModuleList } from '@/api/defectManage'
|
|
|
+import { settingQueryBizModuleList, bugGetEnum } from '@/api/defectManage'
|
|
|
// import { queryTeamInfoList } from '@/api/workSchedule'
|
|
|
import { showAppClientEnum } from '@/api/version.js'
|
|
|
import normalDialog from '@/components/dialog/normalDialog'
|
|
@@ -225,7 +256,7 @@ export default {
|
|
|
directionList: [], // 需求方面列表
|
|
|
modulesList: [], // 任务模块列表
|
|
|
formData: {
|
|
|
- type: this.type === 'require' ? 0 : 1,
|
|
|
+ type: this.type === 'bug' ? 2 : this.type === 'require' ? 0 : 1,
|
|
|
bizId: this.bizId,
|
|
|
requireOrientIdList: [], // 需求方向
|
|
|
techModuleIdList: [], // 技术模块
|
|
@@ -249,6 +280,7 @@ export default {
|
|
|
DChart: false, // DChart系统通知
|
|
|
Group: false // DChart群通知
|
|
|
},
|
|
|
+ timeDateEnum: [], // 时间list
|
|
|
noticeGroupList: [], // 通知人群类型选择列表
|
|
|
teamList: [], // 团队选择列表
|
|
|
show: this.visible, // 显示弹框
|
|
@@ -256,6 +288,7 @@ export default {
|
|
|
typeList: [], // 条件类型选择列表
|
|
|
statusList: [], // 状态选择列表
|
|
|
noticeEventList: [], // 事件列表
|
|
|
+ sysTypeEnumList: [], // 端类型
|
|
|
triggerList: [], // 触发事件: 0 停留 1 交付 2 提测
|
|
|
aheadDaysList: [
|
|
|
{ label: '3天前开始提醒', value: 3 },
|
|
@@ -263,7 +296,12 @@ export default {
|
|
|
{ label: '1天前开始提醒', value: 1 },
|
|
|
{ label: '过期提醒', value: 0 }
|
|
|
], // 提前几天提醒
|
|
|
- rangDaysList: [] // 条件中大于天数列表
|
|
|
+ noticeScheduleOpList: [],
|
|
|
+ noticeConditionScheduleTypeList: [], // 全周期
|
|
|
+ rangDaysList: [], // 条件中大于天数列表
|
|
|
+ sDaysList: [],
|
|
|
+ DaysList: [], // 排期天数
|
|
|
+ continuityDaysList: [] // 通知时刻频次列表
|
|
|
}
|
|
|
},
|
|
|
computed: {
|
|
@@ -358,22 +396,31 @@ export default {
|
|
|
this.getRequireDirection()
|
|
|
this.settingQueryBizModuleList()
|
|
|
this.showAppClientEnum()
|
|
|
+ this.showBugListEnum()
|
|
|
this.queryTeamInfoList()
|
|
|
this.init()
|
|
|
+ this.gettimeDate(15)
|
|
|
},
|
|
|
methods: {
|
|
|
initData(data) {
|
|
|
+ if (this.type === 'bug') {
|
|
|
+ data.noticeConditionList.map(item => {
|
|
|
+ item.timeUnit === 'DAY' ? item.greaterTime = item.greaterTime + 'D' : item.greaterTime = item.greaterTime + 'H'
|
|
|
+ })
|
|
|
+ }
|
|
|
this.formData = {
|
|
|
type: data.type,
|
|
|
id: data.id,
|
|
|
bizId: data.bizId,
|
|
|
+ sysType: data.sysType,
|
|
|
requireOrientIdList: data.requireOrientIdList, // 需求方向
|
|
|
techModuleIdList: data.techModuleIdList, // 技术模块
|
|
|
clientId: data.clientId || null, // 客户端
|
|
|
clientVersionId: data.clientVersionId, // 版本
|
|
|
noticeConditionList: data.noticeConditionList || [], // 条件列表
|
|
|
noticeSetting: {}, // 通知方式
|
|
|
- noticeTime: data.noticeTime // 通知时刻
|
|
|
+ noticeTimeList: data.noticeTimeList, // 通知时刻
|
|
|
+ noticeFrequency: data.noticeFrequency // 频次
|
|
|
}
|
|
|
if (data.noticeSetting.email && data.noticeSetting.email.length > 0) {
|
|
|
this.EmailList = Array(data.noticeSetting.email.length).fill({ type: 0, member: true, teams: [], customStaffs: [] })
|
|
@@ -397,6 +444,8 @@ export default {
|
|
|
async getBizNoticeSettingEnum() { // 任务需求事件列表
|
|
|
const res = await getBizNoticeSettingEnum(this.bizId)
|
|
|
if (res.code === 200) {
|
|
|
+ this.noticeConditionScheduleTypeList = res.data.noticeConditionScheduleTypeList
|
|
|
+ this.noticeScheduleOpList = res.data.noticeScheduleOpList
|
|
|
this.triggerList = res.data.noticeConditionOpList
|
|
|
this.type === 'require'
|
|
|
? this.noticeEventList = res.data.noticeEventRequireOpList
|
|
@@ -415,6 +464,20 @@ export default {
|
|
|
this.modulesList = this.getTaskData(res.data)
|
|
|
}
|
|
|
},
|
|
|
+ gettimeDate(minute) {
|
|
|
+ const seconds = minute * 60
|
|
|
+ const len = (60 * 24 * 60) / seconds // 数组长度
|
|
|
+ for (var i = 0, total = 0, newArr = []; i < len; i++) {
|
|
|
+ const h = parseInt(total / 3600)
|
|
|
+ const min = parseInt(total % 3600 / 60)
|
|
|
+ newArr.push(this.s(h) + ':' + this.s(min))
|
|
|
+ total = total + seconds
|
|
|
+ }
|
|
|
+ this.timeDateEnum = newArr
|
|
|
+ },
|
|
|
+ s(n) {
|
|
|
+ return n < 10 ? '0' + n : n
|
|
|
+ },
|
|
|
getRequireData(data) {
|
|
|
for (let i = 0; i < data.length; i++) {
|
|
|
data[i].childRqmtOrnts.length < 1 ? delete data[i].childRqmtOrnts : this.getRequireData(data[i].childRqmtOrnts)
|
|
@@ -433,6 +496,16 @@ export default {
|
|
|
this.appClientList = res.data.appClient
|
|
|
}
|
|
|
},
|
|
|
+ async showBugListEnum() {
|
|
|
+ const res = await bugGetEnum()
|
|
|
+ if (res.code === 200) {
|
|
|
+ this.statusList = res.data.bugEnumList.filter(item => {
|
|
|
+ item.msg = item.name
|
|
|
+ return item.name !== '已完成' && item.name !== 'Hold'
|
|
|
+ }) // status
|
|
|
+ this.sysTypeEnumList = res.data.sysTypeEnumList // 端类型
|
|
|
+ }
|
|
|
+ },
|
|
|
async showRequireStatusEnum() { // 获取需求状态列表
|
|
|
const res = await showRequireStatusEnum(this.bizId)
|
|
|
if (res.code === 200) {
|
|
@@ -459,34 +532,51 @@ export default {
|
|
|
init() {
|
|
|
if (this.type === 'require') {
|
|
|
this.data && !this.copy ? this.title = '编辑需求定时通知' : this.title = '新建需求定时通知'
|
|
|
- this.typeList = [{ label: '需求状态', value: 1 }, { label: '需求事件', value: 2 }]
|
|
|
+ this.typeList = [{ label: '需求状态', value: 1 }, { label: '需求事件', value: 2 }, { label: '需求排期', value: 103 }]
|
|
|
this.noticeGroupList = [{ label: '需求成员', value: 0 }, { label: '团队', value: 1 }, { label: '自定义人员', value: 2 }]
|
|
|
this.showRequireStatusEnum()
|
|
|
- } else {
|
|
|
+ } else if (this.type === 'task') {
|
|
|
this.data && !this.copy ? this.title = '编辑任务定时通知' : this.title = '新建任务定时通知'
|
|
|
- this.typeList = [{ label: '任务状态', value: 3 }, { label: '任务事件', value: 4 }]
|
|
|
+ this.typeList = [{ label: '任务状态', value: 3 }, { label: '任务事件', value: 4 }, { label: '任务排期', value: 203 }]
|
|
|
this.noticeGroupList = [{ label: '任务成员', value: 0 }, { label: '团队', value: 1 }, { label: '自定义人员', value: 2 }]
|
|
|
this.showTaskStatusEnum()
|
|
|
+ } else if (this.type === 'bug') {
|
|
|
+ this.data && !this.copy ? this.title = '编辑缺陷定时通知' : this.title = '新建缺陷定时通知'
|
|
|
+ this.typeList = [{ label: '缺陷状态', value: 5 }]
|
|
|
+ this.noticeGroupList = [{ label: '缺陷成员', value: 0 }, { label: '自定义人员', value: 2 }]
|
|
|
+ this.showBugListEnum()
|
|
|
}
|
|
|
let i = 1
|
|
|
+ let number = 1
|
|
|
+ while (number <= 24) {
|
|
|
+ number >= 6 ? this.sDaysList.push({ label: `大于${number}小时`, value: `${number}H` }) : ''
|
|
|
+ number++
|
|
|
+ }
|
|
|
while (i <= 100) {
|
|
|
this.rangDaysList.push({ label: `大于${i}天`, value: i })
|
|
|
+ this.sDaysList.push({ label: `大于${i}天`, value: `${i}D` })
|
|
|
+ this.DaysList.push({ label: `${i}天`, value: i })
|
|
|
+ this.continuityDaysList.push({ label: `连续${i}天`, value: i })
|
|
|
i++
|
|
|
}
|
|
|
+ this.continuityDaysList.unshift({ label: `每天`, value: -1 })
|
|
|
},
|
|
|
changeNoticeItem(item) { // 修改条件
|
|
|
if (item.type === 1 || item.type === 3) {
|
|
|
item.triggerEvent = this.triggerList[0].code
|
|
|
} else if (item.type === 2 || item.type === 4) {
|
|
|
item.triggerEvent = this.noticeEventList[0].code
|
|
|
+ } else if (item.type === 103 || item.type === 203) {
|
|
|
+ item.triggerEvent = this.noticeScheduleOpList[0].code
|
|
|
+ item.greaterTime = 1
|
|
|
}
|
|
|
},
|
|
|
- addCondition() { // 添加条件
|
|
|
+ addCondition(val) { // 添加条件
|
|
|
this.formData.noticeConditionList.push({
|
|
|
type: this.typeList[0].value, // 1 需求状态 2 需求事件 3 任务状态 4 任务事件
|
|
|
status: 0,
|
|
|
triggerEvent: this.triggerList[0].code, // 触发事件
|
|
|
- greaterTime: 1, // 大于的时间
|
|
|
+ greaterTime: this.type === 'bug' ? 1 + 'D' : 1, // 大于的时间
|
|
|
lessTime: 3 // 提前提醒的时间
|
|
|
})
|
|
|
},
|
|
@@ -540,7 +630,7 @@ export default {
|
|
|
this.$message({ message: '请选择一种通知方式', type: 'error', duration: 1000, offset: 150 })
|
|
|
return false
|
|
|
}
|
|
|
- if (!this.formData.noticeTime) {
|
|
|
+ if (!this.formData.noticeTimeList) {
|
|
|
this.$message({ message: '请选择通知时刻', type: 'error', duration: 1000, offset: 150 })
|
|
|
return false
|
|
|
}
|
|
@@ -549,6 +639,16 @@ export default {
|
|
|
dChat: this.noticeList.DChart ? this.DChartList : [],
|
|
|
dChatGroup: this.noticeList.Group ? this.GroupList : []
|
|
|
}
|
|
|
+ if (this.type === 'bug') {
|
|
|
+ this.formData.noticeConditionList.map(item => {
|
|
|
+ const numDay = item.greaterTime
|
|
|
+ const str = numDay.split('')
|
|
|
+ const targetStr = str[str.length - 1]
|
|
|
+ item.timeUnit = targetStr === 'D' ? 'DAY' : 'HOUR'
|
|
|
+ const num = numDay.slice(0, numDay.length - 1)
|
|
|
+ item.greaterTime = num
|
|
|
+ })
|
|
|
+ }
|
|
|
this.data && !this.copy ? this.updateBizNoticeSetting() : this.addBizNoticeSetting()
|
|
|
},
|
|
|
async addBizNoticeSetting() { // 新增通知
|
|
@@ -610,6 +710,7 @@ article{
|
|
|
}
|
|
|
.condition-select {
|
|
|
width: 22%;
|
|
|
+ margin-right: 10px;
|
|
|
}
|
|
|
.add-condition,.add-notice {
|
|
|
cursor: pointer;
|