销售月评登记

This commit is contained in:
wuteng 2025-07-29 13:32:12 +08:00
parent bf0eba559b
commit 55bc334319
5 changed files with 596 additions and 18 deletions

View File

@ -0,0 +1,52 @@
import request from '@/utils/request'
//新增
export function addSalesMonthlyReview(data) {
return request({
url: '/emis/salesMonthlyReview',
method: 'post',
data
})
}
//查询
export function listSalesMonthlyReview(data) {
return request({
url: '/emis/salesMonthlyReview/list',
method: 'get',
params: data
})
}
//修改
export function updateSalesMonthlyReview(data) {
return request({
url: '/emis/salesMonthlyReview',
method: 'put',
data
})
}
//根据id查询
export function getSalesMonthlyReview(id) {
return request({
url: '/emis/salesMonthlyReview/' + id,
method: 'get'
})
}
//删除
export function deleteSalesMonthlyReview(ids) {
return request({
url: '/emis/salesMonthlyReview/' + ids,
method: 'delete'
})
}
//草稿新增
export function addSalesMonthlyReviewDraft(data) {
return request({
url: '/emis/salesMonthlyReview/draftSubmitReview',
method: 'post',
data
})
}

View File

@ -0,0 +1,72 @@
<template>
<el-select
style="width:100%"
filterable
clearable
v-model="svalue"
:placeholder="placeholder"
@change="onChange">
<el-option v-for="item in optionItems" :key="item.name" :label="item.name" :value="item.name" />
</el-select>
</template>
<script>
import { listPost } from "@/api/system/post";
export default {
name: "PostsPicker",
props: {
value: {
// type: [Array],
type:String,
required: false
},
placeholder:{
type: String,
required: false
},
isInitiated:{
type: [Boolean,String],
required: false,
default:false
}
},
data() {
return {
optionItems: [{"name":"销售一组"},{"name":"销售二组"}
,{"name":"销售三组"},{"name":"销售四组"},{"name":"销售五组"}
,{"name":"宁波站点"},{"name":"上海站点"},{"name":"柯桥站点"},{"name":"杭州站点"}],
svalue: this.value,
};
},
watch: {
value(newVal) {
console.log('newVal---',newVal)
this.svalue = newVal;
},
svalue(newVal, oldVal) {
this.$emit("input", this.svalue);
}
},
created() {
// this.queryData();
},
methods: {
onChange() {
this.$emit("input", this.svalue);
this.$emit("onChange");
},
queryData() {
let queryParams = {
pageNum: 1,
pageSize: 3000,
};
listPost(queryParams).then(response => {
this.optionItems = response.rows;
});
},
}
};
</script>

View File

@ -1,23 +1,13 @@
<template>
<!-- <el-select
<el-select
style="width:100%"
filterable
clearable
multiple
v-model="svalue"
:placeholder="placeholder"
@change="onChange">
<el-option v-for="item in optionItems" :key="item.postCode" :label="item.postName" :value="item.postCode" />
</el-select> -->
<el-checkbox-group v-model="svalue" @change="getCheckAll">
<el-checkbox
v-for="item in optionItems"
:key="item.postId"
:label="item.postName"
></el-checkbox>
</el-checkbox-group>
<el-option v-for="item in optionItems" :key="item.postName" :label="item.postName" :value="item.postName" />
</el-select>
</template>
<script>
@ -27,7 +17,8 @@ export default {
name: "PostsPicker",
props: {
value: {
type: [Array],
// type: [Array],
type:String,
required: false
},
placeholder:{
@ -42,7 +33,7 @@ props: {
},
data() {
return {
optionItems: [],
optionItems: [{"postName":"收派员"},{"postName":"销售顾问"},{"postName":"销售主管"},{"postName":"销售支持"},{"postName":"销售经理"},],
svalue: this.value,
};
},
@ -55,7 +46,7 @@ watch: {
}
},
created() {
this.queryData();
// this.queryData();
},
methods: {
onChange() {
@ -63,7 +54,6 @@ methods: {
this.$emit("onChange");
},
queryData() {
let queryParams = {
pageNum: 1,
pageSize: 3000,
@ -72,7 +62,6 @@ methods: {
this.optionItems = response.rows;
});
},
}
};
</script>

View File

@ -0,0 +1,176 @@
<template>
<div>
<el-form ref="form" size="mini" :model="form" :rules="rules" label-width="120px">
<el-row :gutter="0" style="display: flex;flex-wrap: wrap;">
<el-col :span="12">
<el-form-item label="员工姓名" prop="employeeName">
<EmpNamePicker v-model="form.employeeName" placeholder="请选择员工姓名" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="所属部门" prop="department">
<DepartmentPicker v-model="form.department" placeholder="请选择部门" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="岗位" prop="position">
<PostsPicker v-model="form.position" placeholder="请选择岗位" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="入职日期" prop="entryDate">
<el-date-picker
style="width: 100%;"
v-model="form.entryDate"
type="date"
placeholder="选择入职日期"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="考评月份" prop="reviewMonth">
<el-date-picker
style="width: 100%;"
v-model="form.reviewMonth"
type="month"
placeholder="选择考评月份"
format="yyyy-MM"
value-format="yyyy-MM"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="考核分数" prop="score">
<el-input type="number" v-model="form.score" placeholder="" maxlength="30" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="备注" prop="remark">
<el-input type="textarea" v-model="form.remark" placeholder="" maxlength="30" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<div style="text-align: center;margin-bottom: 10px;">
<el-button type="primary" @click="submitForm">确 定</el-button>
<el-button @click="cancel">取 消</el-button>
</div>
</div>
</template>
<script>
import { addSalesMonthlyReview, getSalesMonthlyReview, updateSalesMonthlyReview } from "@/api/emis/salesMonthlyReview";
import EmpNamePicker from '@/views/emis/EmisBaseTools/EmpNamePicker.vue';
import DepartmentPicker from "@/views/emis/EmisBaseTools/DepartmentPicker.vue";
import PostsPicker from "@/views/emis/EmisBaseTools/PostsPicker.vue";
export default {
name: "SalesMonthlyReviewForm",
props: {
id: {
type: Number
}
},
components: { EmpNamePicker,DepartmentPicker,PostsPicker},
data() {
return {
// 遮罩层
loading: true,
// 默认密码
initPassword: undefined,
// 表单参数
form: {},
// 表单校验
rules: {
employeeName: [
{ required: true, message: "员工姓名不能为空", trigger: ["change", "blur"] }
],
department: [
{ required: true, message: "所属部门不能为空", trigger: ["change", "blur"] }
],
position: [
{ required: true, message: "岗位不能为空", trigger: ["change", "blur"] }
],
entryDate: [
{ required: true, message: "入职日期不能为空", trigger: ["change", "blur"] }
],
reviewMonth: [
{ required: true, message: "考评月份不能为空", trigger: ["change", "blur"] }
],
score: [
{ required: true, message: "考核分数不能为空", trigger: ["change", "blur"] }
],
}
};
},
watch: {
"id": {
handler(newValue, oldValue) {
this.id = newValue;
this.initData();
},
deep: true
}
},
created() {
this.initData();
},
methods: {
initData() {
this.reset();
if (this.id !== null) {
getSalesMonthlyReview(this.id).then(response => {
this.form = response.data;
});
}
},
// 取消按钮
cancel() {
this.reset();
this.$emit("on-cancel");
},
// 表单重置
reset() {
this.form = {
salesExecutive: null,
salesExecutiveRatio: null,
salesmen: null,
salesmenRatio: null,
salesSupport: null,
salesSupportRatio: null,
createTime: null,
updateBy: null,
updateTime: null,
remark: null,
};
this.resetForm("form");
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
this.form.userName = this.form.empCode;
this.form.nickName = this.form.empName;
if (this.form.id != null) {
updateSalesMonthlyReview(this.form).then(response => {
this.$modal.msgSuccess("修改成功");
this.$emit("on-changed");
});
} else {
addSalesMonthlyReview(this.form).then(response => {
this.$modal.msgSuccess("添加成功");
this.$emit("on-changed");
});
}
}
});
}
}
};
</script>
<style scoped></style>

View File

@ -0,0 +1,289 @@
<template>
<XdPageContainer class="app-container">
<SearchForm slot="pageHeader" :model="queryParams" ref="queryForm" size="mini" :maxShow="20" label-width="80px"
v-show="showSearch" @search="handleQuery" @reset="resetQuery">
<el-form-item label="员工姓名" prop="employeeName">
<!-- <el-input v-model="queryParams.employeeName" placeholder="请输入员工姓名" /> -->
<emp-name-picker v-model="queryParams.employeeName" placeholder="请输入员工姓名" style="width:100%" />
</el-form-item>
<el-form-item label="分数范围" prop="scoreRange">
<number-range-picker style="width:200px" v-model="queryParams.params.scoreRange" :min="0" :max="100" :step="1"></number-range-picker>
</el-form-item>
<el-form-item label="所属部门" prop="department">
<!-- <treeselect class="myTree" v-model="queryParams.department" :options="deptOptions" :show-count="true" placeholder="请选择归属部门" style="width:100%" /> -->
<department-picker v-model="queryParams.department" placeholder="请选择归属部门" style="width:100%" />
</el-form-item>
<el-form-item label="岗位类型" prop="position">
<PostsPicker v-model="queryParams.position" placeholder="请选择岗位" style="width:100%" />
</el-form-item>
<el-form-item label="考评月份" prop="reviewMonth">
<el-date-picker
value-format="yyyy-MM"
style="width: 100%;"
v-model="queryParams.reviewMonth"
type="month"
placeholder="请选择考评月份"
>
</el-date-picker>
</el-form-item>
</SearchForm>
<XdTable slot="pageContent" slot-scope="slotProps" :height="(slotProps.contentHeight) + 'px'" ref="refTable"
v-loading="loading" border size="mini" :data="list" storageName="emisUser_main" :showSearch.sync="showSearch"
:total="total" highlight-current-row @queryTable="getList" :queryParams="queryParams"
@selection-change="handleSelectionChange" @sort-change="handleSortChange">
<div slot="toolbar">
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd">新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="el-icon-edit" size="mini" :disabled="single"
@click="handleUpdate">修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="el-icon-delete" size="mini" @click="handleDelete">删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport">导出</el-button>
</el-col>
</el-row>
</div>
<el-table-column type="selection" width="50" align="center" />
<el-table-column label="员工姓名" align="center" prop="employeeName" width="80">
</el-table-column>
<el-table-column label="所属部门" align="left" prop="department" :show-overflow-tooltip="true"
min-width="80">
</el-table-column>
<el-table-column label="入职时间" align="left" prop="entryDate" :show-overflow-tooltip="true" min-width="80">
</el-table-column>
<el-table-column label="岗位" align="center" prop="position" :show-overflow-tooltip="true"
min-width="100" />
<el-table-column label="考核月份" align="center" prop="reviewMonth"></el-table-column>
<el-table-column label="考核分数" align="center" prop="score" min-width="100">
</el-table-column>
<el-table-column label="备注" align="center" prop="remark" min-width="100" tooltip>
</el-table-column>
<el-table-column label="创建人" align="center" prop="createByName" width="80" :show-overflow-tooltip="true" />
<el-table-column label="创建时间" align="center" prop="createTime" width="170" />
<el-table-column label="创建网点" align="center" prop="createSiteName" width="80" :show-overflow-tooltip="true" />
<el-table-column label="修改人" align="center" prop="updateByName" width="80" :show-overflow-tooltip="true" />
<el-table-column label="修改网点" align="center" prop="updateSiteName" width="80" :show-overflow-tooltip="true" />
<el-table-column label="修改时间" align="center" prop="updateTime" width="170" />
</XdTable>
<el-dialog :title="titleForm" :visible.sync="openForm" width="40%" :destroy-on-close="true" v-dialogDrag
append-to-body>
<SalesMonthlyReviewForm :id="currentId" @on-changed="handleFormChanged" @on-cancel="cancelForm">
</SalesMonthlyReviewForm>
</el-dialog>
</XdPageContainer>
</template>
<script>
import { listSalesMonthlyReview, deleteSalesMonthlyReview } from "@/api/emis/salesMonthlyReview";
import SalesMonthlyReviewForm from '@/views/emis/salesMonthlyReview/editForm';
import { treeselect } from "@/api/system/dept";
import Treeselect from "@riophae/vue-treeselect";
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
import PostsPicker from "@/views/emis/EmisBaseTools/PostsPicker.vue";
import NumberRangePicker from '@/components/NumberRange/NumberRangePicker';
import EmpNamePicker from '@/views/emis/EmisBaseTools/EmpNamePicker.vue';
import DepartmentPicker from "@/views/emis/EmisBaseTools/DepartmentPicker.vue";
export default {
name: "SalesMonthlyReview",
components: { SalesMonthlyReviewForm,Treeselect,PostsPicker,NumberRangePicker,EmpNamePicker,DepartmentPicker },
data() {
return {
tableHeight: 200,
// 遮罩层
loading: false,
// 选中数组
ids: [],
// 非单个禁用
single: true,
// 非多个禁用
multiple: true,
// 显示搜索条件
showSearch: true,
// 总条数
total: 0,
// 用户表格数据
list: null,
// 弹出层标题
title: "",
currentId: null,
openForm: false,
titleForm: "",
selectionList: null,
// 查询参数
queryParams: {
pageNum: 1,
pageSize: 20,
employeeName:null,
position:null,
department:null,
reviewMonth:null,
params:{
scoreRange:null,
}
},
// 部门树选项
deptOptions: [],
};
},
watch: {
},
created() {
this.getList();
this.getTreeselect();
},
methods: {
/** 查询用户列表 */
getList() {
this.loading = true;
let qParam = { ...this.queryParams }
if (qParam.params.scoreRange && qParam.params.scoreRange.length > 0) {
qParam = this.addDateRange(qParam, qParam.params.scoreRange, 'Score')
}
listSalesMonthlyReview(qParam).then(response => {
this.list = response.rows;
this.total = response.total;
this.loading = false;
}
);
},
handleSortChange(column) {
this.queryParams.orderByColumn = column.prop;
this.queryParams.isAsc = column.order;
this.getList();
},
handleFormChanged() {
this.openForm = false;
this.getList();
},
cancelForm() {
this.openForm = false;
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.dateRange = [];
this.resetForm("queryForm");
this.handleQuery();
},
// 多选框选中数据
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id);
this.single = selection.length != 1;
this.multiple = !selection.length;
this.selectionList = selection;
},
/** 新增按钮操作 */
handleAdd() {
this.currentId = null;
this.openForm = true;
this.titleForm = "添加销售月评登记";
},
/** 修改按钮操作 */
handleUpdate(row) {
console.log('ids', this.ids)
this.currentId = row.id || this.ids[0];
this.openForm = true;
this.titleForm = "修改销售月评登记";
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids;
this.$modal.confirm('注意:确认是否删除?').then(function () {
deleteSalesMonthlyReview(ids);
}).then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
}).catch(() => { });
},
/** 导出按钮操作 */
handleExport() {
const loadingInstance = this.$loading({
text: '正在导出...'
})
if (this.selectionList && this.selectionList.length > 0) {
this.exportData(this.selectionList, loadingInstance);
}
else {
let qExportParam = { ...this.queryParams };
qExportParam.pageNum = 1;
qExportParam.pageSize = 20000;
qExportParam = this.addDateRange(qExportParam,qExportParam.params.scoreRange,'Score');
listSalesMonthlyReview(qExportParam).then(response => {
if (response.code === 200) {
this.exportData(response.rows, loadingInstance);
}
});
}
},
exportData(selData, loadingInstance) {
const curList = selData
import('@/vendor/Export2Excel').then(excel => {
const exportParam = this.$refs.refTable.getExportParam();
const tHeader = exportParam.header;
const filterVal = exportParam.filter;
const data = this.formatJson(filterVal, curList, selData)
excel.export_json_to_excel({
header: tHeader,
data,
filename: '销售月评登记表',
autoWidth: true
})
loadingInstance.close()
})
},
formatJson(filterVal, jsonData, resData) {
return jsonData.map(v => filterVal.map(j => {
if (j === 'status') {
if (v[j] == 1) {
return '启用';
} else {
return '停用';
}
}
return v[j]
}))
},
getTreeselect() {
treeselect().then(response => {
console.log(response.data)
this.deptOptions = response.data;
});
},
}
};
</script>
<style lang="scss" scoped>
// .myTree {
// display: inline-block;
// width: 200px !important;
// ::v-deep .vue-treeselect__control {
// height: 28px !important;
// border-radius:0px!important;
// .vue-treeselect__value-container .vue-treeselect__placeholder{
// line-height: 28px!important; //上下居中
// font-size: 12px!important;
// font-weight: 600!important;
// }
// }
// }
</style>