eight
2024-08-28 2bc74ebfec4a30beddc66fd55be4947e5f7cf498
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
<template>
  <Dialog :title="dialogTitle" v-model="dialogVisible">
    <el-form
      ref="formRef"
      :model="formData"
      :rules="formRules"
      label-width="100px"
      v-loading="formLoading"
    >
      <el-form-item label="状态组名" prop="name">
        <el-input v-model="formData.name" placeholder="请输入状态组名" />
      </el-form-item>
      <el-form-item label="应用部门" prop="deptIds">
        <template #label>
          <Tooltip message="不选择部门时,默认全公司生效" title="应用部门" />
        </template>
        <el-tree
          ref="treeRef"
          :data="deptList"
          :props="defaultProps"
          :check-strictly="!checkStrictly"
          node-key="id"
          placeholder="请选择归属部门"
          show-checkbox
        />
      </el-form-item>
      <el-form-item label="阶段设置" prop="statuses">
        <el-table
          border
          style="width: 100%"
          :data="formData.statuses.concat(BusinessStatusApi.DEFAULT_STATUSES)"
        >
          <el-table-column align="center" label="阶段" width="70">
            <template #default="scope">
              <el-text v-if="!scope.row.defaultStatus">阶段 {{ scope.$index + 1 }}</el-text>
              <el-text v-else>结束</el-text>
            </template>
          </el-table-column>
          <el-table-column align="center" label="阶段名称" width="160" prop="name">
            <template #default="{ row }">
              <el-input v-if="!row.endStatus" v-model="row.name" placeholder="请输入状态名称" />
              <el-text v-else>{{ row.name }}</el-text>
            </template>
          </el-table-column>
          <el-table-column width="140" align="center" label="赢单率(%)" prop="percent">
            <template #default="{ row }">
              <el-input-number
                v-if="!row.endStatus"
                v-model="row.percent"
                placeholder="请输入赢单率"
                controls-position="right"
                :min="0"
                :max="100"
                :precision="2"
                class="!w-1/1"
              />
              <el-text v-else>{{ row.percent }}</el-text>
            </template>
          </el-table-column>
          <el-table-column label="操作" width="110" align="center">
            <template #default="scope">
              <el-button
                v-if="!scope.row.endStatus"
                link
                type="primary"
                @click="addStatus(scope.$index)"
              >
                添加
              </el-button>
              <el-button
                v-if="!scope.row.endStatus"
                link
                type="danger"
                @click="deleteStatusArea(scope.$index)"
                :disabled="formData.statuses.length <= 1"
              >
                删除
              </el-button>
            </template>
          </el-table-column>
        </el-table>
      </el-form-item>
    </el-form>
    <template #footer>
      <el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
      <el-button @click="dialogVisible = false">取 消</el-button>
    </template>
  </Dialog>
</template>
<script setup lang="ts">
import * as BusinessStatusApi from '@/api/crm/business/status'
import { defaultProps, handleTree } from '@/utils/tree'
import * as DeptApi from '@/api/system/dept'
 
const { t } = useI18n() // 国际化
const message = useMessage() // 消息弹窗
 
const dialogVisible = ref(false) // 弹窗的是否展示
const dialogTitle = ref('') // 弹窗的标题
const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
const formType = ref('') // 表单的组:create - 新增;update - 修改
const formData = ref({
  id: undefined,
  name: '',
  deptIds: [],
  statuses: []
})
const formRules = reactive({
  name: [{ required: true, message: '状态组名不能为空', trigger: 'blur' }]
})
const formRef = ref() // 表单 Ref
const deptList = ref<Tree[]>([]) // 树形结构
const treeRef = ref() // 菜单树组件 Ref
const checkStrictly = ref(true) // 是否严格模式,即父子不关联
 
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
  dialogVisible.value = true
  dialogTitle.value = t('action.' + type)
  formType.value = type
  resetForm()
  // 修改时,设置数据
  if (id) {
    formLoading.value = true
    try {
      formData.value = await BusinessStatusApi.getBusinessStatus(id)
      treeRef.value.setCheckedKeys(formData.value.deptIds)
      if (formData.value.statuses.length == 0) {
        addStatus()
      }
    } finally {
      formLoading.value = false
    }
  } else {
    addStatus()
  }
  // 加载部门树
  deptList.value = handleTree(await DeptApi.getSimpleDeptList())
}
defineExpose({ open }) // 提供 open 方法,用于打开弹窗
 
/** 提交表单 */
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
const submitForm = async () => {
  // 校验表单
  await formRef.value.validate()
  // 提交请求
  formLoading.value = true
  try {
    const data = formData.value as unknown as BusinessStatusApi.BusinessStatusTypeVO
    data.deptIds = treeRef.value.getCheckedKeys(false)
    if (formType.value === 'create') {
      await BusinessStatusApi.createBusinessStatus(data)
      message.success(t('common.createSuccess'))
    } else {
      await BusinessStatusApi.updateBusinessStatus(data)
      message.success(t('common.updateSuccess'))
    }
    dialogVisible.value = false
    // 发送操作成功的事件
    emit('success')
  } finally {
    formLoading.value = false
  }
}
 
/** 重置表单 */
const resetForm = () => {
  checkStrictly.value = true
  formData.value = {
    id: undefined,
    name: '',
    deptIds: [],
    statuses: []
  }
  treeRef.value?.setCheckedNodes([])
  formRef.value?.resetFields()
}
 
/** 添加状态 */
const addStatus = () => {
  const data = formData.value
  data.statuses.push({
    name: '',
    percent: undefined
  })
}
 
/** 删除状态 */
const deleteStatusArea = (index: number) => {
  const data = formData.value
  data.statuses.splice(index, 1)
}
</script>