|
@@ -1,5 +1,5 @@
|
|
|
<template>
|
|
<template>
|
|
|
- <el-dialog v-model="visible" :title="titleMap[mode]" fullscreen :close-on-click-modal="false" @closed="$emit('closed')">
|
|
|
|
|
|
|
+ <el-dialog v-model="visible" :title="titleMap[mode]" fullscreen :z-index="2008" :close-on-click-modal="false" @closed="$emit('closed')">
|
|
|
<el-form ref="formRef" :model="form" :rules="rules" label-width="100">
|
|
<el-form ref="formRef" :model="form" :rules="rules" label-width="100">
|
|
|
<el-collapse v-model="activeNames">
|
|
<el-collapse v-model="activeNames">
|
|
|
<el-collapse-item title="基本信息" name="basic">
|
|
<el-collapse-item title="基本信息" name="basic">
|
|
@@ -30,22 +30,8 @@
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
</el-col>
|
|
</el-col>
|
|
|
<el-col :md="8" :xs="24">
|
|
<el-col :md="8" :xs="24">
|
|
|
- <el-form-item label="年份" prop="year">
|
|
|
|
|
- <el-date-picker v-model="form.year" type="year" :readonly="!!form.children.length || form.parentId != 0" :clearable="false" placeholder="请选择计划年份" />
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
- </el-col>
|
|
|
|
|
- <el-col v-if="form.type == 'quarter'" :md="8" :xs="24">
|
|
|
|
|
- <el-form-item label="季度" prop="quarter">
|
|
|
|
|
- <el-select v-model="form.quarter" :clearable="false" placeholder="请选择计划季度">
|
|
|
|
|
- <el-option v-for="item in 4" :key="item" :label="`Q${item}`" :value="item" :disabled="quarterDisabled(item)"></el-option>
|
|
|
|
|
- </el-select>
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
- </el-col>
|
|
|
|
|
- <el-col v-if="form.type == 'month'" :md="8" :xs="24">
|
|
|
|
|
- <el-form-item label="月份" prop="month">
|
|
|
|
|
- <el-select v-model="form.month" :clearable="false" placeholder="请选择计划月份">
|
|
|
|
|
- <el-option v-for="item in 12" :key="item" :label="`${item}月`" :value="item" :disabled="monthDisabled(item)"></el-option>
|
|
|
|
|
- </el-select>
|
|
|
|
|
|
|
+ <el-form-item :label="pickerLabel[form.type]" prop="beginDate">
|
|
|
|
|
+ <vxe-date-picker v-model="form.beginDate" :type="form.type" value-format="yyyy-MM-dd" :label-format="form.type == 'quarter' ? 'yyyy-Qq' : undefined" :start-date="parentPlan.beginDate" :end-date="parentPlan.endDate" transfer :placeholder="`请选择计划${pickerLabel[form.type]}`"></vxe-date-picker>
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
</el-col>
|
|
</el-col>
|
|
|
<el-col :md="8" :xs="24">
|
|
<el-col :md="8" :xs="24">
|
|
@@ -84,6 +70,11 @@ import XEUtils from "xe-utils";
|
|
|
import API from "@/api";
|
|
import API from "@/api";
|
|
|
import store from "@/store";
|
|
import store from "@/store";
|
|
|
import { salesDic } from "@/utils/basicDic";
|
|
import { salesDic } from "@/utils/basicDic";
|
|
|
|
|
+const pickerLabel = {
|
|
|
|
|
+ year: "年份",
|
|
|
|
|
+ quarter: "季度",
|
|
|
|
|
+ month: "月份"
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
const $emit = defineEmits(["success", "closed"]);
|
|
const $emit = defineEmits(["success", "closed"]);
|
|
|
const visible = ref(false);
|
|
const visible = ref(false);
|
|
@@ -96,8 +87,11 @@ const titleMap = reactive({
|
|
|
edit: "修改销售计划"
|
|
edit: "修改销售计划"
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
-const parentType = ref(null);
|
|
|
|
|
-
|
|
|
|
|
|
|
+const parentPlan = reactive({
|
|
|
|
|
+ type: null,
|
|
|
|
|
+ beginDate: null,
|
|
|
|
|
+ endDate: null
|
|
|
|
|
+});
|
|
|
const tenantName = computed(() => XEUtils.get(XEUtils.find(store.state.tenant.tenants, item => item.id == form.value.tenantId), "name"));
|
|
const tenantName = computed(() => XEUtils.get(XEUtils.find(store.state.tenant.tenants, item => item.id == form.value.tenantId), "name"));
|
|
|
const form = ref({
|
|
const form = ref({
|
|
|
id: null,
|
|
id: null,
|
|
@@ -106,9 +100,7 @@ const form = ref({
|
|
|
name: null,
|
|
name: null,
|
|
|
code: null,
|
|
code: null,
|
|
|
type: "year",
|
|
type: "year",
|
|
|
- year: moment().format("YYYY"),
|
|
|
|
|
- quarter: moment().quarter(),
|
|
|
|
|
- month: moment().month() + 1,
|
|
|
|
|
|
|
+ beginDate: moment().format("YYYY-01-01"),
|
|
|
saleAmount: null,
|
|
saleAmount: null,
|
|
|
remark: null,
|
|
remark: null,
|
|
|
children: []
|
|
children: []
|
|
@@ -116,10 +108,8 @@ const form = ref({
|
|
|
const rules = reactive({
|
|
const rules = reactive({
|
|
|
tenantId: [{ required: true, message: "请选择所属租户" }],
|
|
tenantId: [{ required: true, message: "请选择所属租户" }],
|
|
|
name: [{ required: true, message: "请输入计划名称" }],
|
|
name: [{ required: true, message: "请输入计划名称" }],
|
|
|
- type: [{ required: true, message: "请选择计划类型" }],
|
|
|
|
|
- year: [{ required: true, message: "请选择计划年份" }],
|
|
|
|
|
- quarter: [{ required: true, message: "请选择计划季度" }],
|
|
|
|
|
- month: [{ required: true, message: "请选择计划月份" }],
|
|
|
|
|
|
|
+ type: [{ required: true, message: `"请选择计划类型"` }],
|
|
|
|
|
+ beginDate: [{ required: true, message: `请选择计划${pickerLabel[form.type]}` }],
|
|
|
saleAmount: [{ required: true, message: "请选择计划销售金额" }]
|
|
saleAmount: [{ required: true, message: "请选择计划销售金额" }]
|
|
|
});
|
|
});
|
|
|
|
|
|
|
@@ -127,60 +117,38 @@ const setData = (parent, data, model = "add") => {
|
|
|
visible.value = true;
|
|
visible.value = true;
|
|
|
mode.value = model;
|
|
mode.value = model;
|
|
|
if (parent && !XEUtils.isEmpty(parent)) {
|
|
if (parent && !XEUtils.isEmpty(parent)) {
|
|
|
- parentType.value = parent.type;
|
|
|
|
|
-
|
|
|
|
|
- XEUtils.set(form.value, "parentId", XEUtils.get(parent, "id"));
|
|
|
|
|
- XEUtils.set(form.value, "type", parent.type == "year" ? "quarter" : "month");
|
|
|
|
|
- XEUtils.set(form.value, "year", moment(XEUtils.get(parent, "beginDate")).format("YYYY"));
|
|
|
|
|
- XEUtils.set(form.value, "quarter", moment(XEUtils.get(parent, "beginDate")).quarter());
|
|
|
|
|
- XEUtils.set(form.value, "month", moment().quarter(form.value.quarter).startOf("quarter").month() + 1);
|
|
|
|
|
|
|
+ XEUtils.objectEach(parentPlan, (_, key) => XEUtils.set(parentPlan, key, XEUtils.get(parent, key)));
|
|
|
|
|
+ if (model == "add") {
|
|
|
|
|
+ XEUtils.set(form.value, "parentId", XEUtils.get(parent, "id"));
|
|
|
|
|
+ XEUtils.set(form.value, "type", parent.type == "year" ? "quarter" : "month");
|
|
|
|
|
+ XEUtils.set(form.value, "beginDate", XEUtils.get(parent, "beginDate"));
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if (model == "edit") {
|
|
if (model == "edit") {
|
|
|
- XEUtils.objectEach(form.value, (_, key) => {
|
|
|
|
|
- if (key == "year") XEUtils.set(form.value, key, moment(XEUtils.get(data, "beginDate")).format("YYYY"));
|
|
|
|
|
- else if (key == "quarter") XEUtils.set(form.value, "quarter", moment(XEUtils.get(data, "beginDate")).quarter());
|
|
|
|
|
- else if (key == "month") XEUtils.set(form.value, "month", moment(XEUtils.get(data, "beginDate")).month() + 1);
|
|
|
|
|
- else XEUtils.set(form.value, key, XEUtils.get(data, key));
|
|
|
|
|
- });
|
|
|
|
|
|
|
+ XEUtils.objectEach(form.value, (_, key) => XEUtils.set(form.value, key, XEUtils.get(data, key)));
|
|
|
|
|
+
|
|
|
|
|
+ if (XEUtils.get(data, "children", []).length) {
|
|
|
|
|
+ XEUtils.set(parentPlan, "beginDate", XEUtils.get(data, "beginDate"));
|
|
|
|
|
+ XEUtils.set(parentPlan, "endDate", XEUtils.get(data, "endDate"));
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
const mapRadio = computed((() => {
|
|
const mapRadio = computed((() => {
|
|
|
if (form.value.children.length) return XEUtils.pick(salesDic.planType, form.value.type);
|
|
if (form.value.children.length) return XEUtils.pick(salesDic.planType, form.value.type);
|
|
|
|
|
|
|
|
- if (parentType.value == "year") return XEUtils.omit(salesDic.planType, "year");
|
|
|
|
|
- if (parentType.value == "quarter") return XEUtils.pick(salesDic.planType, "month");
|
|
|
|
|
|
|
+ if (parentPlan.type == "year") return XEUtils.omit(salesDic.planType, "year");
|
|
|
|
|
+ if (parentPlan.type == "quarter") return XEUtils.pick(salesDic.planType, "month");
|
|
|
return salesDic.planType;
|
|
return salesDic.planType;
|
|
|
}));
|
|
}));
|
|
|
|
|
|
|
|
-const monthDisabled = month => {
|
|
|
|
|
- if (parentType.value == "quarter") return month - 1 < moment().quarter(form.value.quarter).startOf("quarter").month() || month - 1 > moment().quarter(form.value.quarter).endOf("quarter").month()
|
|
|
|
|
- return false;
|
|
|
|
|
-};
|
|
|
|
|
-
|
|
|
|
|
-const quarterDisabled = quarter => {
|
|
|
|
|
- if (form.value.children.length) return form.value.quarter !== quarter;
|
|
|
|
|
- return false;
|
|
|
|
|
-};
|
|
|
|
|
-
|
|
|
|
|
const formRef = ref();
|
|
const formRef = ref();
|
|
|
const submit = () => {
|
|
const submit = () => {
|
|
|
formRef.value.validate(async valid => {
|
|
formRef.value.validate(async valid => {
|
|
|
if (valid) {
|
|
if (valid) {
|
|
|
- const data = XEUtils.omit(form.value, "year", "quarter", "month");
|
|
|
|
|
- let beginDate = moment(form.value.year).startOf("year").format("YYYY-MM-DD");
|
|
|
|
|
- let endDate = moment(form.value.year).endOf("year").format("YYYY-MM-DD");
|
|
|
|
|
- if (form.value.type == "quarter") {
|
|
|
|
|
- beginDate = moment(form.value.year).quarter(form.value.quarter).startOf("quarter").format("YYYY-MM-DD");
|
|
|
|
|
- endDate = moment(form.value.year).quarter(form.value.quarter).endOf("quarter").format("YYYY-MM-DD");
|
|
|
|
|
- } else if (form.value.type == "month") {
|
|
|
|
|
- beginDate = moment(form.value.year).month(form.value.month - 1).startOf("month").format("YYYY-MM-DD");
|
|
|
|
|
- endDate = moment(form.value.year).month(form.value.month - 1).endOf("month").format("YYYY-MM-DD");
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- XEUtils.set(data, "beginDate", beginDate);
|
|
|
|
|
- XEUtils.set(data, "endDate", endDate);
|
|
|
|
|
|
|
+ const data = XEUtils.omit(form.value, "children");
|
|
|
|
|
+ XEUtils.set(data, "endDate", moment(form.value.beginDate).endOf(form.value.type).format("YYYY-MM-DD"));
|
|
|
|
|
|
|
|
isSaving.value = true;
|
|
isSaving.value = true;
|
|
|
API.sales.plan[mode.value](data).then(res => {
|
|
API.sales.plan[mode.value](data).then(res => {
|
|
@@ -206,6 +174,10 @@ defineExpose({
|
|
|
.el-form .el-select :deep(.el-select__wrapper.is-disabled) {background-color: var(--el-fill-color-blank);box-shadow: 0 0 0 1px var(--el-border-color) inset;cursor: pointer;}
|
|
.el-form .el-select :deep(.el-select__wrapper.is-disabled) {background-color: var(--el-fill-color-blank);box-shadow: 0 0 0 1px var(--el-border-color) inset;cursor: pointer;}
|
|
|
.el-form .el-select :deep(.el-select__wrapper.is-disabled) .el-select__selected-item {color: var(--el-text-color-regular);}
|
|
.el-form .el-select :deep(.el-select__wrapper.is-disabled) .el-select__selected-item {color: var(--el-text-color-regular);}
|
|
|
|
|
|
|
|
|
|
+.el-form .vxe-date-picker {width: 100%;flex-direction: row-reverse;}
|
|
|
|
|
+.el-form .vxe-date-picker :deep(.vxe-date-picker--suffix) {border-radius: var(--vxe-ui-base-border-radius) 0 0 var(--vxe-ui-base-border-radius);}
|
|
|
|
|
+.el-form .vxe-date-picker :deep(.vxe-date-picker--control-icon) {padding-left: .5em;padding-right: 0;}
|
|
|
|
|
+
|
|
|
.el-form .el-input-number {width: 100%;}
|
|
.el-form .el-input-number {width: 100%;}
|
|
|
.el-form .el-input-number :deep(.el-input__inner) {text-align: unset;}
|
|
.el-form .el-input-number :deep(.el-input__inner) {text-align: unset;}
|
|
|
.el-form .el-input-number :deep(.el-input__suffix) {font-size: 12px;}
|
|
.el-form .el-input-number :deep(.el-input__suffix) {font-size: 12px;}
|