337 lines
11 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form class="-mb-15px" :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px">
<el-form-item label="所属项目" prop="brandId">
<el-select v-model="queryParams.brandId" placeholder="请选择项目" clearable class="!w-240px">
<el-option v-for="organizationNameOptions in option" :key="organizationNameOptions.id"
:label="organizationNameOptions.name" :value="organizationNameOptions.id" />
</el-select>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable class="!w-240px">
<el-option v-for="dict in getIntDictOptions(DICT_TYPE.TECHNICIAN_STATUS)" :key="dict.value"
:label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item label="创建时间" prop="createTime">
<el-date-picker v-model="queryParams.createTime" value-format="YYYY-MM-DD HH:mm:ss" type="daterange"
start-placeholder="开始日期" end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]" class="!w-240px" />
</el-form-item>
<el-form-item>
<el-button @click="handleQuery">
<Icon icon="ep:search" class="mr-5px" /> 搜索
</el-button>
<el-button @click="resetQuery">
<Icon icon="ep:refresh" class="mr-5px" /> 重置
</el-button>
<el-button type="primary" plain @click="openForm('create')"
v-hasPermi="['subscribe:litemall-technician:create']">
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-button type="success" plain @click="handleExport" :loading="exportLoading"
v-hasPermi="['subscribe:litemall-technician:export']">
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="ID" align="center" prop="id" />
<el-table-column label="名称" align="center" prop="name" />
<el-table-column label="图片" align="center" prop="photo">
<template #default="{ row }">
<div class="flex justify-center items-center">
<el-image fit="cover" :src="row.photo" class="flex-none w-50px h-50px"
@click="imagePreview(row.photo)" />
</div>
</template>
</el-table-column>
<!-- <el-table-column label="服务时间段" align="center" prop="serviceTimeArray" width="200" /> -->
<el-table-column label="服务范围" align="center" prop="serviceScope" />
<!-- <el-table-column label="约满标记" align="center" prop="ym" /> -->
<el-table-column label="状态" align="center" prop="status">
<template #default="scope">
<dict-tag :type="DICT_TYPE.TECHNICIAN_STATUS" :value="scope.row.status" />
</template>
</el-table-column>
<el-table-column label="介绍" align="center" prop="content">
<template #default="scope">
<div v-html="scope.row.content"></div>
</template>
</el-table-column>
<el-table-column label="归属项目" align="center" prop="brandName" />
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column label="创建时间" align="center" prop="createTime" :formatter="dateFormatter" width="180px" />
<el-table-column label="操作" align="center" fixed="right" width="220">
<template #default="scope">
<el-button type="info" @click="openday(scope.row.projectId,scope.row.id)">
时间段配置
</el-button>
<el-button link type="primary" @click="openForm('update', scope.row.id)"
v-hasPermi="['subscribe:litemall-technician:update']">
编辑
</el-button>
<el-button link type="danger" @click="handleDelete(scope.row.id)"
v-hasPermi="['subscribe:litemall-technician:delete']">
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination :total="total" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize"
@pagination="getList" />
</ContentWrap>
<!-- 表单弹窗:添加/修改 -->
<LitemallTechnicianForm ref="formRef" @success="getList" />
<Dialog :title="dialogTitle" v-model="dialogVisible" width="800px">
<el-form label-width="100px" v-loading="formLoading">
<el-form-item label="可预约日期">
<el-select v-model="formData.projectdayId" placeholder="请选择日期" size="large" clearable class="!w-240px" @change="handleProjectChange(formData.projectdayId)">
<el-option v-for="item in optionDays" :key="item.id" :label="item.days" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="服务时间段" prop="serviceTime">
<div v-for="(item, index) in timeRanges" :key="index" class="time-range">
<div class="left">
<el-time-select v-model="item.start" :max-time="item.end" class="mr-4" placeholder="开始时间"
start="07:00" step="00:05" end="23:30" />
</div>
<div class="center">
-
</div>
<div class="right">
<el-time-select v-model="item.end" :min-time="item.start" placeholder="结束时间" start="07:00"
step="00:05" end="23:30" />
</div>
<span>可预约数 </span>
<input v-model="item.subscribeNum" style="width: 40px;margin-right: 20px;" />
<el-button @click="removeTime(index)" type="danger" size="mini">移除</el-button>
</div>
<el-button @click="addTime" type="primary" size="small">添加时间段</el-button>
</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 { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import { LitemallTechnicianApi, LitemallTechnicianVO } from '@/api/subscribe/technician'
import LitemallTechnicianForm from './LitemallTechnicianForm.vue'
import { createImageViewer } from "@/components/ImageViewer";
import { ProjectApi, ProjectVO } from '@/api/subscribe/project'
import { ConfigurationApi, ConfigurationVO } from '@/api/subscribe/configuration'
/** 人员管理 列表 */
defineOptions({ name: 'LitemallTechnician' })
const dialogTitle = ref('') // 弹窗的标题
const message = useMessage() // 消息弹窗
const { t } = useI18n() // 国际化
const option = ref<ProjectVO[]>([]);
const loading = ref(true) // 列表的加载中
const list = ref<LitemallTechnicianVO[]>([]) // 列表的数据
const total = ref(0) // 列表的总页数
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
techSn: undefined,
type: undefined,
technicianName: undefined,
brandId: undefined,
sex: undefined,
photo: undefined,
serviceTime: [],
serviceScope: undefined,
phone: undefined,
ym: undefined,
status: undefined,
content: undefined,
remark: undefined,
createTime: [],
})
const queryFormRef = ref() // 搜索的表单
const exportLoading = ref(false) // 导出的加载中
const formData = ref({
id: undefined,
serviceTimes: '',
projectdayId: undefined,
technicianId: undefined,
timeQuantum: undefined,
availableNumber: undefined,
residueNumber: undefined,
status: undefined,
})
const formLoading = ref(false) // 表单的加载中1修改时的数据加载2提交的按钮禁用
const dialogVisible = ref(false) // 弹窗的是否展示
const timeRanges = ref([{ id: '', start: '', end: '', subscribeNum: '' }]);
const addTime = () => {
timeRanges.value.push({ id: '', start: '', end: '', subscribeNum: '' });
};
const optionDays = ref()
const technicianDay = ref()
const serviceTimes = ref('') //时间段
const taoCanId = ref() //套餐id
const removeTime = (index : number) => {
if (timeRanges.value.length > 1) {
timeRanges.value.splice(index, 1);
}
};
//打开弹窗
const openday = async (projectId: number,id) => {
formData.value.projectdayId = undefined
timeRanges.value = ([]) //清空timeRanges的数据
formData.value.technicianId = id
optionDays.value = await ProjectApi.getProjectDay(projectId)
dialogVisible.value = true
}
//监听预约天的下拉框
const handleProjectChange = async (id: number) => {
timeRanges.value = ([]) //清空timeRanges的数据
console.log('选择的预约日期 ID:', id);
technicianDay.value = await ProjectApi.getConfiguration(id)
const timeRange = technicianDay.value
for (var i = 0; i < timeRange.length; i++) {
timeRanges.value.push(timeRange[i]); //原有的时间段push上去
}
if(timeRange.length <= 0){
timeRanges.value.push({ id: '', start: '', end: '', subscribeNum: '' }); //再将timeRaanges设置为{ start: '', end: '' }
}
};
/** 提交表单 */
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
const submitForm = async () => {
// 校验表单
// await formRef.value.validate()
// 提交请求
formLoading.value = true
try {
formData.value.serviceTimes = JSON.stringify(timeRanges.value);
console.log('1111111', JSON.stringify(timeRanges.value))
const data = formData.value as unknown as ConfigurationVO
await ConfigurationApi.addUpdConfiguration(data)
dialogVisible.value = false
// 发送操作成功的事件
emit('success')
} finally {
formLoading.value = false
}
}
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await LitemallTechnicianApi.getLitemallTechnicianPage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
//预约项目下拉框
const getProjectName = async () => {
loading.value = true
try {
option.value = await ProjectApi.getProjectName()
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
const imagePreview = (imgUrl : string) => {
createImageViewer({
urlList: [imgUrl]
})
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type : string, id ?: number) => {
formRef.value.open(type, id)
}
/** 删除按钮操作 */
const handleDelete = async (id : number) => {
try {
// 删除的二次确认
await message.delConfirm()
// 发起删除
await LitemallTechnicianApi.deleteLitemallTechnician(id)
message.success(t('common.delSuccess'))
// 刷新列表
await getList()
} catch { }
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
// 导出的二次确认
await message.exportConfirm()
// 发起导出
exportLoading.value = true
const data = await LitemallTechnicianApi.exportLitemallTechnician(queryParams)
download.excel(data, '人员管理.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 **/
onMounted(() => {
getList()
getProjectName()
})
</script>