Commit 894ce7f6 authored by 张耀's avatar 张耀

feat:

工单管理新增编辑功能
parent b02fb229
...@@ -5,4 +5,5 @@ export const METHODS = { ...@@ -5,4 +5,5 @@ export const METHODS = {
} }
// 可以新增的数量 // 可以新增的数量
export const ADD_NUM = 5 // export const ADD_NUM = 5
\ No newline at end of file export const ADD_NUM = null
\ No newline at end of file
<template> <template>
<el-form :model="state.form" ref="form" :rules="state.rules" label-width="80px" :disabled="disabled"> <el-form
<el-form-item label="通知方式" prop="method"> :model="state.form"
ref="form_ref"
:rules="state.rules"
label-width="110px"
:disabled="disabled"
style="width: 100%">
<el-form-item :label="methodLabel || '通知方式'" prop="method">
<el-checkbox-group v-model="state.form.method"> <el-checkbox-group v-model="state.form.method">
<el-checkbox v-for="(value, key) in METHODS" :key="key" :label="key"> <el-checkbox v-for="(value, key) in METHODS" :key="key" :label="key">
{{ value }} {{ value }}
</el-checkbox> </el-checkbox>
</el-checkbox-group> </el-checkbox-group>
</el-form-item> </el-form-item>
<el-form-item label="" prop="lists" class="user-table bg-scroll"> <el-form-item
<el-form :model="state.form.lists" ref="table_form" :rules="table_rules" label-width="0"> label=" "
prop="lists"
class="user-table bg-scroll"
:class="{
'no-el-label': noElLabel,
}">
<el-form :model="state.form.lists" ref="table_form" :rules="state.tableRules" label-width="0" style="width: 100%">
<el-table :data="state.form.lists" stripe border> <el-table :data="state.form.lists" stripe border>
<el-table-column type="index" label="序号" width="60px"> </el-table-column> <el-table-column type="index" label="序号" width="60px"> </el-table-column>
<el-table-column <el-table-column
...@@ -49,7 +61,7 @@ ...@@ -49,7 +61,7 @@
link link
type="primary" type="primary"
@click="Add($index)" @click="Add($index)"
:disabled="userLists.length <= state.form.lists.length || addTrue >= ADD_NUM"> :disabled="userLists.length <= state.form.lists.length || (ADD_NUM && addTrue >= ADD_NUM)">
新增 新增
</el-button> </el-button>
<span class="line"></span> <span class="line"></span>
...@@ -73,8 +85,20 @@ const props = defineProps({ ...@@ -73,8 +85,20 @@ const props = defineProps({
type: Boolean, type: Boolean,
default: false, default: false,
}, },
noElLabel: {
type: Boolean,
default: true,
},
methodLabel: {
type: String,
default: "",
},
history: {
type: Object,
default: () => ({}),
},
}); });
const form = ref(null); const form_ref = ref(null);
// 表单数据 // 表单数据
const state = reactive({ const state = reactive({
form: { form: {
...@@ -118,20 +142,14 @@ const headers = [ ...@@ -118,20 +142,14 @@ const headers = [
]; ];
const table_form = ref(null); const table_form = ref(null);
// 立即下发 // 立即下发
const Submit = (cb = null) => { const Submit = async (cb = null) => {
form.value.validate((valid) => { let form_valid = await new Promise((resolve, reject) => {
if (valid) { form_ref.value.validate((res) => resolve(res));
table_form.value.validate((t_v) => { });
if (t_v) { let table_form_valid = await new Promise((resolve, reject) => {
cb && cb(state.form); table_form.value.validate((res) => resolve(res));
} else {
return false;
}
});
} else {
return false;
}
}); });
return form_valid && table_form_valid;
}; };
// 已经新增的数量记录 // 已经新增的数量记录
const addTrue = ref(0); const addTrue = ref(0);
...@@ -191,7 +209,7 @@ const userOptions = computed(() => { ...@@ -191,7 +209,7 @@ const userOptions = computed(() => {
// 表格新增 // 表格新增
const Add = (index) => { const Add = (index) => {
// 新增上限 // 新增上限
if (addTrue.value >= ADD_NUM) return; if (ADD_NUM && addTrue.value >= ADD_NUM) return;
state.form.lists.splice(index + 1, 0, { state.form.lists.splice(index + 1, 0, {
user_id: "", user_id: "",
user_name: "", user_name: "",
...@@ -204,19 +222,26 @@ const Remove = (index) => { ...@@ -204,19 +222,26 @@ const Remove = (index) => {
state.form.lists.splice(index, 1); state.form.lists.splice(index, 1);
addTrue.value -= 1; addTrue.value -= 1;
}; };
// 初始化加载基础数据和获取用户下拉列表 watch(
const init = (history) => { () => props.history,
getUserLists(); (n) => {
state.form.method = history?.method || []; let history = { ...n };
state.form.lists = history?.lists || []; getUserLists();
// 如果没有默认下发用户则创建一条空数据 state.form.method = history?.method || [];
if (state.form.lists.length == 0) { state.form.lists = history?.lists || [];
Add(0); // 如果没有默认下发用户则创建一条空数据
if (state.form.lists.length == 0) {
Add(0);
}
setTimeout(() => {
form_ref.value.clearValidate();
});
},
{
deep: true,
immediate: true,
} }
setTimeout(() => { );
form.value.clearValidate();
});
};
// 选择用户操作 // 选择用户操作
const chooseUser = ($event, index) => { const chooseUser = ($event, index) => {
let user = userLists.value.find((e) => e.user_id == state.form.lists[index].user_id); let user = userLists.value.find((e) => e.user_id == state.form.lists[index].user_id);
...@@ -225,16 +250,9 @@ const chooseUser = ($event, index) => { ...@@ -225,16 +250,9 @@ const chooseUser = ($event, index) => {
}; };
defineExpose({ defineExpose({
Submit, Submit,
form, form_ref,
init, form: state.form,
}); });
watch(
() => state.form.lists,
(n) => {
console.log(n);
},
{ deep: true }
);
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
...@@ -251,11 +269,16 @@ watch( ...@@ -251,11 +269,16 @@ watch(
} }
.user-table { .user-table {
max-height: 345px; max-height: 345px;
:deep(.el-table thead th) {
background-color: #f5f6f9;
}
}
.no-el-label {
:deep(.el-form-item__content) { :deep(.el-form-item__content) {
margin-left: 0 !important; margin-left: 0 !important;
.el-table thead th {
background-color: #f5f6f9;
}
} }
} }
:deep(.el-form-item .el-form-item) {
margin-bottom: 0 !important;
}
</style> </style>
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
<GapTitle title="手动下发"></GapTitle> <GapTitle title="手动下发"></GapTitle>
</template> </template>
<div class="manual-distribution"> <div class="manual-distribution">
<Form ref="form" /> <Form :history="history" ref="form" />
</div> </div>
<template #footer> <template #footer>
<el-button size="default" @click="Close">关闭</el-button> <el-button size="default" @click="Close">关闭</el-button>
...@@ -29,6 +29,12 @@ const props = defineProps({ ...@@ -29,6 +29,12 @@ const props = defineProps({
default: null, default: null,
}, },
// 默认数据展示 // 默认数据展示
row: {
type: Object,
default: null,
},
});
const history = computed(() => {
/* /*
{ {
methd:['1','2'], methd:['1','2'],
...@@ -41,16 +47,13 @@ const props = defineProps({ ...@@ -41,16 +47,13 @@ const props = defineProps({
] ]
} }
*/ */
history: { return props.row?.history || null;
type: Object,
default: null,
},
}); });
const emits = defineEmits(["update:visible"]); const emits = defineEmits(["update:visible"]);
const form = ref(null); const form = ref(null);
// 关闭调用 // 关闭调用
const Close = async () => { const Close = async () => {
form.value.form.resetFields(); form.value.form_ref.resetFields();
emits("update:visible", false); emits("update:visible", false);
}; };
const show = computed({ const show = computed({
...@@ -67,7 +70,6 @@ watch( ...@@ -67,7 +70,6 @@ watch(
async (n) => { async (n) => {
if (!n) return; if (!n) return;
await nextTick(); await nextTick();
form.value.init(props.history);
}, },
{ {
immediate: true, immediate: true,
...@@ -79,13 +81,13 @@ const beforeClose = () => { ...@@ -79,13 +81,13 @@ const beforeClose = () => {
Close(); Close();
}; };
// 立即下发 // 立即下发
const Submit = () => { const Submit = async () => {
form.value.Submit(async (form) => { let form_valid = await form.value.Submit();
let res = { ...form }; if (!form_valid) return;
console.log("res: ", res); let res = { ...form.value.form };
await nextTick(); console.log("res: ", res);
Close(); await nextTick();
}); Close();
}; };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
......
...@@ -7,15 +7,12 @@ ...@@ -7,15 +7,12 @@
</div> </div>
<div class="value"> <div class="value">
<div class="value-body"> <div class="value-body">
<span v-if="item.prop == 'status'"> <slot :name="item.prop" :item="item" :valueData="valueData" v-if="slots[item.prop]" />
<slot name="status" :item="item" :valueData="valueData" v-if="slots.status" /> <span v-else>
<span class="status-body" v-else> <span v-if="item.prop == 'status'" class="status-body">
<span class="status" :class="`status-${valueData.status}`"></span> <span class="status" :class="`status-${valueData.status}`"></span>
<span>{{ STATUS_OBJ[valueData[item.prop]] }}</span> <span>{{ STATUS_OBJ[valueData[item.prop]] }}</span>
</span> </span>
</span>
<span v-else>
<slot name="value" :item="item" :valueData="valueData" v-if="slots.value" />
<span v-else>{{ valueData[item.prop] }}</span> <span v-else>{{ valueData[item.prop] }}</span>
</span> </span>
</div> </div>
......
...@@ -21,9 +21,12 @@ ...@@ -21,9 +21,12 @@
<gap-title :hasLine="true" title="推送方式"></gap-title> <gap-title :hasLine="true" title="推送方式"></gap-title>
<div class="info"> <div class="info">
<Info :labelData="notificationMethod" :valueData="info"> <Info :labelData="notificationMethod" :valueData="info">
<template #value="{ item, valueData }"> <template #notification_method="{ valueData }">
<span>{{ valueData[item.prop].map((e) => METHODS[e]).join("") }}</span> <span>{{ valueData.notification_method.map((e) => METHODS[e]).join("") }}</span>
</template> </template>
<!-- <template #value="{ item, valueData }">
<span>{{ valueData[item.prop].map((e) => METHODS[e]).join(",") }}</span>
</template> -->
</Info> </Info>
<div class="notification-lists"> <div class="notification-lists">
<bg-table border ref="listtable" :headers="headers" :rows="rows" height="100%" :isIndex="true"> </bg-table> <bg-table border ref="listtable" :headers="headers" :rows="rows" height="100%" :isIndex="true"> </bg-table>
......
...@@ -3,15 +3,39 @@ ...@@ -3,15 +3,39 @@
<div class="breadcrumb"> <div class="breadcrumb">
<bg-breadcrumb /> <bg-breadcrumb />
</div> </div>
<div class="content bg-scroll"> <div class="content">
<add-form></add-form> <div class="add-form-main bg-scroll">
<add-form ref="add_form"></add-form>
</div>
<div class="add-btns">
<el-button size="default" @click="Cancle">取消</el-button>
<el-button type="primary" size="default" @click="Save">保存</el-button>
<el-button type="primary" size="default" @click="Distribute">立即下发</el-button>
</div>
</div> </div>
</div> </div>
</template> </template>
<script setup> <script setup>
import { ref } from "vue";
import { useRouter } from "vue-router";
import bgBreadcrumb from "@/components/bg-breadcrumb.vue"; import bgBreadcrumb from "@/components/bg-breadcrumb.vue";
import addForm from "../modules/add-form.vue"; import addForm from "../modules/add-form.vue";
const router = useRouter();
const Cancle = () => {
router.go(-1);
};
const add_form = ref(null);
const Save = async () => {
let res = await add_form.value.Submit();
if (!res) return;
console.log("res: ", res);
};
const Distribute = async () => {
let res = await add_form.value.Submit();
if (!res) return;
console.log("res: ", res);
};
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
...@@ -29,7 +53,17 @@ import addForm from "../modules/add-form.vue"; ...@@ -29,7 +53,17 @@ import addForm from "../modules/add-form.vue";
background-color: #ffffff; background-color: #ffffff;
box-shadow: 0px 1px 4px 0px rgba(0, 7, 101, 0.15); box-shadow: 0px 1px 4px 0px rgba(0, 7, 101, 0.15);
border-radius: 6px; border-radius: 6px;
padding: 24px; .add-form-main {
padding: 24px;
height: calc(100% - 68px);
}
.add-btns {
height: 68px;
display: flex;
align-items: center;
justify-content: flex-end;
border-top: 1px solid #ddd;
}
} }
} }
</style> </style>
...@@ -18,9 +18,12 @@ ...@@ -18,9 +18,12 @@
<gap-title :hasLine="true" title="推送方式"></gap-title> <gap-title :hasLine="true" title="推送方式"></gap-title>
<div class="info"> <div class="info">
<Info :labelData="notificationMethod" :valueData="info"> <Info :labelData="notificationMethod" :valueData="info">
<template #value="{ item, valueData }"> <template #notification_method="{ valueData }">
<span>{{ valueData[item.prop].map((e) => METHODS[e]).join("") }}</span> <span>{{ valueData.notification_method.map((e) => METHODS[e]).join("") }}</span>
</template> </template>
<!-- <template #value="{ item, valueData }">
<span>{{ valueData[item.prop].map((e) => METHODS[e]).join(",") }}</span>
</template> -->
</Info> </Info>
<div class="notification-lists"> <div class="notification-lists">
<bg-table border ref="notification_table" :headers="headers" :rows="rows" height="100%" :isIndex="true"> <bg-table border ref="notification_table" :headers="headers" :rows="rows" height="100%" :isIndex="true">
...@@ -30,9 +33,12 @@ ...@@ -30,9 +33,12 @@
<gap-title :hasLine="true" title="定时规则"></gap-title> <gap-title :hasLine="true" title="定时规则"></gap-title>
<div class="info"> <div class="info">
<Info :labelData="timeingRules" :valueData="info"> <Info :labelData="timeingRules" :valueData="info">
<template #value="{ item, valueData }"> <template #timeing_rules="{ valueData }">
<span>{{ TIMEING_RULES[valueData[item.prop]] }}</span> <span>{{ TIMEING_RULES[valueData.timeing_rules] }}</span>
</template> </template>
<!-- <template #value="{ item, valueData }">
<span>{{ TIMEING_RULES[valueData[item.prop]] }}</span>
</template> -->
</Info> </Info>
<div class="notification-lists"> <div class="notification-lists">
<bg-table <bg-table
......
<template> <template>
<div class="edit-ticket"> <div class="add-ticket">
<div class="breadcrumb"> <div class="breadcrumb">
<bg-breadcrumb /> <bg-breadcrumb />
</div> </div>
<div class="content bg-scroll"></div> <div class="content">
<div class="add-form-main bg-scroll">
<add-form ref="add_form" :row="infoData"></add-form>
</div>
<div class="add-btns">
<el-button size="default" @click="Cancle">取消</el-button>
<el-button type="primary" size="default" @click="Save">保存</el-button>
<el-button type="success" size="default" @click="Distribute">立即下发</el-button>
</div>
</div>
</div> </div>
</template> </template>
<script setup> <script setup>
import { onMounted, ref } from "vue";
import { useRouter } from "vue-router";
import bgBreadcrumb from "@/components/bg-breadcrumb.vue"; import bgBreadcrumb from "@/components/bg-breadcrumb.vue";
import addForm from "../modules/add-form.vue";
const router = useRouter();
const infoData = ref({});
const Cancle = () => {
router.go(-1);
};
const add_form = ref(null);
const Save = async () => {
let res = await add_form.value.Submit();
if (!res) return;
console.log("res: ", res);
};
const Distribute = async () => {
let res = await add_form.value.Submit();
if (!res) return;
console.log("res: ", res);
};
onMounted(() => {
setTimeout(() => {
infoData.value = {
ticket_name: 11,
id: 111,
status: 1,
finish: 10,
all: 10,
history: {
method: ["1", "2"],
lists: [
{
user_id: "1111",
user_name: "11111111",
phone: "13011111111",
},
],
},
ticket_name: "1",
ticket_level: 1,
ticket_desc: "1111",
timing_rules: 2,
rules: {
lists: [
{
date: ["2023-01-01", "2023-12-31"],
time: "00:00:00",
},
{
date: ["2023-01-01", "2023-12-31"],
time: "00:00:01",
},
],
week_days: [1, 2, 3, 4, 6],
time: "00:00:03",
},
};
}, 1000);
});
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.edit-ticket { .add-ticket {
width: 100%; width: 100%;
height: 100%; height: 100%;
padding: 0 24px 16px; padding: 0 24px 16px;
...@@ -26,7 +93,18 @@ import bgBreadcrumb from "@/components/bg-breadcrumb.vue"; ...@@ -26,7 +93,18 @@ import bgBreadcrumb from "@/components/bg-breadcrumb.vue";
background-color: #ffffff; background-color: #ffffff;
box-shadow: 0px 1px 4px 0px rgba(0, 7, 101, 0.15); box-shadow: 0px 1px 4px 0px rgba(0, 7, 101, 0.15);
border-radius: 6px; border-radius: 6px;
padding: 40px 54px; .add-form-main {
padding: 24px;
height: calc(100% - 68px);
}
.add-btns {
height: 68px;
display: flex;
align-items: center;
justify-content: flex-end;
border-top: 1px solid #ddd;
padding: 0 24px;
}
} }
} }
</style> </style>
...@@ -93,13 +93,26 @@ ...@@ -93,13 +93,26 @@
<span v-if="row.status != 3">{{ row.finish }}/{{ row.all }}</span> <span v-if="row.status != 3">{{ row.finish }}/{{ row.all }}</span>
</span> </span>
</template> </template>
<template #enable="{ row }">
<el-switch
v-model="row.enable"
active-text="是"
inactive-text="否"
inline-prompt
:active-value="true"
:inactive-value="false"
@change="Enable(row)">
</el-switch>
</template>
<template #operation="{ row }"> <template #operation="{ row }">
<div class="table-operation"> <div class="table-operation">
<span class="primary-edit" @click="operation(row)"> 手动下发 </span> <el-button type="primary" link size="default" @click="operation(row)">手动下发</el-button>
<span class="line"></span> <span class="line"></span>
<span class="primary-edit" @click="Edit(row)"> 编辑 </span> <el-button type="primary" link size="default" @click="Edit(row)" :disabled="row.enable">编辑</el-button>
<span class="line"></span> <span class="line"></span>
<span class="primary-edit" @click="Delete(row)"> 删除 </span> <el-button type="primary" link size="default" @click="Delete(row)" :disabled="row.enable">
删除
</el-button>
</div> </div>
</template> </template>
</bg-table> </bg-table>
...@@ -115,7 +128,7 @@ ...@@ -115,7 +128,7 @@
</div> </div>
</div> </div>
<ManualDistribution v-model:visible="visible" :active_row="active_row" /> <ManualDistribution v-model:visible="visible" :row="active_row" />
</div> </div>
</div> </div>
</template> </template>
...@@ -197,7 +210,7 @@ let headers = reactive([ ...@@ -197,7 +210,7 @@ let headers = reactive([
}, },
{ {
label: "定时是否启用", label: "定时是否启用",
prop: "status", prop: "enable",
align: "left", align: "left",
width: 150, width: 150,
}, },
...@@ -215,13 +228,31 @@ let headers = reactive([ ...@@ -215,13 +228,31 @@ let headers = reactive([
label: "操作", label: "操作",
prop: "operation", prop: "operation",
align: "left", align: "left",
width: "200px", width: "220px",
fixed: "right",
}, },
]); ]);
let rows = ref([ let rows = ref([
{ ticket_name: 11, id: 111, status: 1, finish: 10, all: 10 }, {
{ ticket_name: 22, id: 222, status: 2, finish: 5, all: 10 }, ticket_name: 11,
{ ticket_name: 33, id: 333, status: 3, finish: 0, all: 10 }, id: 111,
status: 1,
finish: 10,
all: 10,
history: {
method: ["1", "2"],
lists: [
{
user_id: "1111",
user_name: "11111111",
phone: "13011111111",
},
],
},
enable: true,
},
{ ticket_name: 22, id: 222, status: 2, finish: 5, all: 10, enable: false },
{ ticket_name: 33, id: 333, status: 3, finish: 0, all: 10, enable: false },
]); ]);
const changeSize = (size) => { const changeSize = (size) => {
filter.limit = size; filter.limit = size;
...@@ -310,6 +341,7 @@ const goTo = ({ id }) => { ...@@ -310,6 +341,7 @@ const goTo = ({ id }) => {
}, },
}); });
}; };
const Enable = (row) => {};
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
...@@ -389,6 +421,11 @@ const goTo = ({ id }) => { ...@@ -389,6 +421,11 @@ const goTo = ({ id }) => {
display: inline-block; display: inline-block;
} }
} }
:deep(.el-switch__inner) {
.is-hide {
display: none;
}
}
} }
} }
</style> </style>
<template> <template>
<div class="add-form"> <div class="add-form">
<el-form :model="state.form" ref="form" :rules="state.rules" label-width="80px"> <el-form :model="state.form" ref="form" :rules="state.rules" label-width="110px">
<el-form-item label="工单名称" prop="ticket_name"> <el-form-item label="工单名称" prop="ticket_name">
<el-input v-model="state.form.ticket_name" placeholder="请输入工单名称"></el-input> <el-input v-model="state.form.ticket_name" :disabled="isEdit" placeholder="请输入工单名称"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="工单等级" prop="ticket_level"> <el-form-item label="工单等级" prop="ticket_level">
<el-select v-model="state.form.ticket_level" placeholder="请选择工单等级" clearable filterable style="flex: 1"> <el-select v-model="state.form.ticket_level" placeholder="请选择工单等级" clearable filterable style="flex: 1">
...@@ -13,9 +13,34 @@ ...@@ -13,9 +13,34 @@
<el-form-item label="工单描述" prop="ticket_desc"> <el-form-item label="工单描述" prop="ticket_desc">
<el-input type="textarea" :rows="5" v-model="state.form.ticket_desc" placeholder="请输入工单描述"></el-input> <el-input type="textarea" :rows="5" v-model="state.form.ticket_desc" placeholder="请输入工单描述"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="推送方式" prop="push_method"> <el-form-item class="no-el-label" label="" prop="push_method">
<div style="width: 100%">
<ManualDistributionForm
ref="manual_distribution_form"
:noElLabel="false"
methodLabel="推送方式"
:history="history" />
</div>
</el-form-item>
<el-form-item label="定时规则" prop="timing_rules">
<div style="flex: 1"> <div style="flex: 1">
<ManualDistributionForm ref="manual_distribution_form" /> <div class="choose-rule">
<el-select
v-model="state.form.timing_rules"
placeholder=""
clearable
filterable
@change="changeTimeRules"
style="width: 100%">
<el-option v-for="item in timeRulesOptions" :key="item.id" :label="item.name" :value="item.id">
</el-option>
</el-select>
</div>
</div>
</el-form-item>
<el-form-item class="no-el-label" label="" prop="" v-if="state.form.timing_rules != 1">
<div style="width: 100%">
<component ref="rule_ref" :is="coms[state.form.timing_rules]" :rules="rules"></component>
</div> </div>
</el-form-item> </el-form-item>
</el-form> </el-form>
...@@ -23,9 +48,29 @@ ...@@ -23,9 +48,29 @@
</template> </template>
<script setup> <script setup>
import { computed, reactive, ref } from "vue"; import { computed, onMounted, reactive, ref, shallowReactive, defineExpose, watch } from "vue";
import ManualDistributionForm from "@/components/manual-distribution/form.vue"; import ManualDistributionForm from "@/components/manual-distribution/form.vue";
import customTime from "./custom-time.vue";
import byWeek from "./by-week.vue";
const manual_distribution_form = ref(null); const manual_distribution_form = ref(null);
const coms = shallowReactive({
2: byWeek,
3: customTime,
});
const timeRulesOptions = ref([
{
id: 1,
name: "手动下发",
},
{
id: 2,
name: "按周",
},
{
id: 3,
name: "自定义时间",
},
]);
const TICKET_LEVEL_OPTIONS = [ const TICKET_LEVEL_OPTIONS = [
{ {
id: 1, id: 1,
...@@ -41,18 +86,19 @@ const TICKET_LEVEL_OPTIONS = [ ...@@ -41,18 +86,19 @@ const TICKET_LEVEL_OPTIONS = [
}, },
]; ];
const props = defineProps({ const props = defineProps({
defaultValue: { row: {
type: Object, type: Object,
default: null, default: null,
}, },
}); });
const isEdit = computed(() => !!props.defaultValue); const isEdit = computed(() => !!props.row);
console.log("isEdit: ", isEdit); const history = computed(() => props.row?.history || null);
const state = reactive({ const state = reactive({
form: { form: {
ticket_name: "", ticket_name: "",
ticket_level: "", ticket_level: "",
ticket_desc: "", ticket_desc: "",
timing_rules: 1,
}, },
rules: { rules: {
ticket_name: [{ required: true, message: "请输入工单名称", trigger: "blur" }], ticket_name: [{ required: true, message: "请输入工单名称", trigger: "blur" }],
...@@ -61,11 +107,54 @@ const state = reactive({ ...@@ -61,11 +107,54 @@ const state = reactive({
}, },
ticketLevelOptions: TICKET_LEVEL_OPTIONS, ticketLevelOptions: TICKET_LEVEL_OPTIONS,
}); });
const rules = computed(() => props.row?.rules || null);
watch(
() => isEdit.value,
(n) => {
if (!n) return;
let { ticket_name, ticket_level, ticket_desc, timing_rules } = props.row;
state.form.ticket_name = ticket_name;
state.form.ticket_level = ticket_level;
state.form.ticket_desc = ticket_desc;
state.form.timing_rules = timing_rules;
},
{
deep: true,
immediate: true,
}
);
const changeTimeRules = () => {};
const rule_ref = ref(null);
const form = ref(null);
const Submit = async () => {
const manual_distribution_form_valid = await manual_distribution_form.value.Submit();
const rule_ref_valid = !rule_ref.value ? true : await rule_ref.value.Submit();
const form_valid = await new Promise((resolve, reject) => {
form.value.validate((res) => resolve(res));
});
if (!form_valid || !rule_ref_valid || !manual_distribution_form_valid) return;
return {
...state.form,
...manual_distribution_form.value.form,
...rule_ref.value.form,
};
};
defineExpose({
Submit,
});
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.add-form { .add-form {
width: 100%; width: 100%;
max-width: 1050px; max-width: 1050px;
.no-el-label {
:deep(.el-form-item__content) {
margin-left: 0 !important;
}
}
:deep(.el-form-item .el-form-item) {
margin-bottom: 18px;
}
} }
</style> </style>
<template>
<el-form :model="state.form" ref="form" :rules="rules" label-width="110px">
<el-form-item label="按周 (多选)" prop="week_days">
<el-select v-model="state.form.week_days" :multiple="true" placeholder="请选择" style="flex: 1">
<el-option v-for="item in weekDayOptions" :key="item.id" :label="item.name" :value="item.id"> </el-option>
</el-select>
</el-form-item>
<el-form-item label="时间点" prop="time">
<el-time-picker v-model="state.form.time" placeholder="请选择时间点" value-format="HH:mm:ss" style="flex: 1">
</el-time-picker>
</el-form-item>
</el-form>
</template>
<script setup>
import { reactive, ref, watch } from "vue";
const props = defineProps({
rules: {
type: Object,
default: null,
},
});
const weekDayOptions = [
{
id: 1,
name: "周一",
},
{
id: 2,
name: "周二",
},
{
id: 3,
name: "周三",
},
{
id: 4,
name: "周四",
},
{
id: 5,
name: "周五",
},
{
id: 6,
name: "周六",
},
{
id: 7,
name: "周日",
},
];
const state = reactive({
form: {
week_days: [],
time: "",
},
});
const rules = {
week_days: [{ type: "array", required: true, message: "请至少选择一天", trigger: "change" }],
time: [{ required: true, message: "请选择时间点", trigger: "change" }],
};
watch(
() => props.rules,
(n) => {
if (n) {
state.form.week_days = n.week_days || [];
state.form.time = n.time || "";
}
},
{
deep: true,
immediate: true,
}
);
const form = ref(null);
const Submit = async () => {
const isValid = await new Promise((resolve, reject) => {
form.value.validate((res) => resolve(res));
});
return isValid;
};
defineExpose({
Submit,
form: state.form,
});
</script>
<template>
<div class="custom-time">
<el-form :model="state.form.rules" ref="form" :rules="rules" label-width="0" style="width: 100%">
<el-table :data="state.form.rules" border stripe>
<el-table-column label="日期范围" prop="date">
<template #default="{ $index }">
<el-form-item :prop="`[${$index}].date`" :rules="rules.date">
<el-date-picker
v-model="state.form.rules[$index].date"
type="daterange"
range-separator="-"
value-format="YYYY-MM-DD"
start-placeholder="开始日期"
end-placeholder="结束日期"
style="width: 100%">
</el-date-picker>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="时间点" prop="time">
<template #default="{ $index }">
<el-form-item :prop="`[${$index}].time`" :rules="rules.time">
<el-time-picker
style="width: 100%"
v-model="state.form.rules[$index].time"
placeholder="请选择时间"
value-format="HH:mm:ss">
</el-time-picker>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="操作" prop="" width="125px">
<template #default="{ $index }">
<div class="table-operation">
<el-button link type="primary" @click="Add($index)" :disabled="state.form.rules.length >= ADD_NUM">
新增
</el-button>
<span class="line"></span>
<el-button link type="primary" @click="Remove($index)" :disabled="state.form.rules.length == 1">
删除
</el-button>
</div>
</template>
</el-table-column>
</el-table>
</el-form>
</div>
</template>
<script setup>
import { reactive, ref, watch } from "vue";
const ADD_NUM = 8;
const props = defineProps({
rules: {
type: Object,
default: null,
},
});
const state = reactive({
form: {
rules: [],
},
});
const rules = {
date: [{ required: true, message: "请选择", trigger: "change" }],
time: [{ required: true, message: "请选择", trigger: "change" }],
};
const addTrue = ref(0);
// 表格新增
const Add = (index) => {
// 新增上限
if (state.form.rules.length >= ADD_NUM) return;
state.form.rules.splice(index + 1, 0, {
date: [],
time: "",
});
addTrue.value += 1;
};
// 表格删除
const Remove = (index) => {
state.form.rules.splice(index, 1);
addTrue.value -= 1;
};
watch(
() => props.rules,
(n) => {
state.form.rules =
n?.lists.map((e) => {
return {
date: e.date,
time: e.time,
};
}) || [];
if (state.form.rules.length == 0) {
Add(-1);
}
},
{
deep: true,
immediate: true,
}
);
const form = ref(null);
const Submit = async () => {
const isValid = await new Promise((resolve, reject) => {
form.value.validate((res) => resolve(res));
});
return isValid;
};
defineExpose({
Submit,
form: state.form,
});
</script>
<style lang="scss" scoped>
.table-operation {
display: flex;
align-items: center;
.line {
width: 1px;
height: 14px;
background-color: #c1c7d7;
margin: 0 16px;
display: inline-block;
}
}
.custom-time {
padding-left: 110px;
}
:deep(.el-form-item) {
margin-bottom: 0 !important;
}
</style>
...@@ -21,9 +21,12 @@ ...@@ -21,9 +21,12 @@
<gap-title :hasLine="true" title="推送方式"></gap-title> <gap-title :hasLine="true" title="推送方式"></gap-title>
<div class="info"> <div class="info">
<Info :labelData="notificationMethod" :valueData="info"> <Info :labelData="notificationMethod" :valueData="info">
<template #value="{ item, valueData }"> <template #notification_method="{ valueData }">
<span>{{ valueData[item.prop].map((e) => METHODS[e]).join("") }}</span> <span>{{ valueData.notification_method.map((e) => METHODS[e]).join("") }}</span>
</template> </template>
<!-- <template #value="{ item, valueData }">
<span>{{ valueData[item.prop].map((e) => METHODS[e]).join(",") }}</span>
</template> -->
</Info> </Info>
<div class="notification-lists"> <div class="notification-lists">
<bg-table border ref="listtable" :headers="headers" :rows="rows" height="100%" :isIndex="true"> </bg-table> <bg-table border ref="listtable" :headers="headers" :rows="rows" height="100%" :isIndex="true"> </bg-table>
......
...@@ -79,34 +79,12 @@ ...@@ -79,34 +79,12 @@
</div> </div>
</div> </div>
</div> </div>
<!-- <el-button type="primary" size="default" @click="feedback">
处置反馈
</el-button> -->
<!-- <ManualDistributionForm ref="form" :disabled="true" /> -->
<FeedBack v-model:visible="visible" :active_row="active_row" /> <FeedBack v-model:visible="visible" :active_row="active_row" />
<!-- <ManualDistribution v-model:visible="visible" /> -->
</div> </div>
</div> </div>
</template> </template>
<script setup> <script setup>
// import { nextTick, onBeforeMount, onMounted, ref } from "vue";
// import ManualDistribution from "@/components/manual-distribution/index.vue";
// import ManualDistributionForm from "@/components/manual-distribution/form.vue";
// const form = ref(null);
// onMounted(async () => {
// await nextTick();
// form.value.init({
// method: ["1", "2"],
// lists: [
// {
// user_id: 1,
// user_name: 1111,
// phone: "13011111111",
// },
// ],
// });
// });
import { ref, reactive, onMounted, nextTick } from "vue"; import { ref, reactive, onMounted, nextTick } from "vue";
import bgBreadcrumb from "@/components/bg-breadcrumb.vue"; import bgBreadcrumb from "@/components/bg-breadcrumb.vue";
import FeedBack from "../modules/feedback.vue"; import FeedBack from "../modules/feedback.vue";
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment