feat(base): 新增制造商信息管理功能

- 实现制造商信息的增删改查功能- 支持制造商编码、名称、联系人等字段查询
- 添加默认仓库和拥有仓库的选择功能
- 集成仓库列表接口用于仓库信息展示
- 实现制造商合作状态的字典标签展示
- 添加制造商信息导出功能
- 完善表单校验规则确保数据完整性
dev_1.0.0
chenhao 2025-11-12 10:49:56 +08:00
parent 7dcbffe211
commit e49f8b1463
17 changed files with 3304 additions and 104 deletions

View File

@ -9,13 +9,13 @@
<template v-if="device!=='mobile'">
<search id="header-search" class="right-menu-item" />
<el-tooltip content="源码地址" effect="dark" placement="bottom">
<ruo-yi-git id="ruoyi-git" class="right-menu-item hover-effect" />
</el-tooltip>
<!-- <el-tooltip content="源码地址" effect="dark" placement="bottom">-->
<!-- <ruo-yi-git id="ruoyi-git" class="right-menu-item hover-effect" />-->
<!-- </el-tooltip>-->
<el-tooltip content="文档地址" effect="dark" placement="bottom">
<ruo-yi-doc id="ruoyi-doc" class="right-menu-item hover-effect" />
</el-tooltip>
<!-- <el-tooltip content="文档地址" effect="dark" placement="bottom">-->
<!-- <ruo-yi-doc id="ruoyi-doc" class="right-menu-item hover-effect" />-->
<!-- </el-tooltip>-->
<screenfull id="screenfull" class="right-menu-item hover-effect" />

View File

@ -0,0 +1,400 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="98px">
<el-form-item label="制造商编码" prop="vendorCode">
<el-input
v-model="queryParams.vendorCode"
placeholder="请输入制造商编码"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="制造商名称" prop="vendorName">
<el-input
v-model="queryParams.vendorName"
placeholder="请输入制造商名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="制造商全称" prop="vendorAddress">
<el-input
v-model="queryParams.vendorAddress"
placeholder="请输入制造商全称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="联系人" prop="vendorUser">
<el-input
v-model="queryParams.vendorUser"
placeholder="请输入联系人"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="合作状态" prop="vendorStatus">
<el-select v-model="queryParams.vendorStatus" placeholder="请选择合作状态" clearable>
<el-option
v-for="dict in dict.type.vendor_status"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"></el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"></el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['system:vendor:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['system:vendor:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['system:vendor:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['system:vendor:export']"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="vendorList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="制造商编码" align="center" prop="vendorCode" />
<el-table-column label="制造商名称" align="center" prop="vendorName" />
<el-table-column label="制造商全称" align="center" prop="vendorAddress" />
<el-table-column label="默认仓库" align="center" prop="warehouseName" />
<el-table-column label="联系人" align="center" prop="vendorUser" />
<el-table-column label="联系邮箱" align="center" prop="vendorEmail" />
<el-table-column label="联系电话" align="center" prop="vendorPhone" />
<el-table-column label="合作状态" align="center" prop="vendorStatus">
<template slot-scope="scope">
<dict-tag :options="dict.type.vendor_status" :value="scope.row.vendorStatus"/>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['system:vendor:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['system:vendor:remove']"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改制造商信息对话框 -->
<el-dialog :title="title" :visible.sync="open" width="600px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="110px">
<el-row>
<el-col :span="12">
<el-form-item label="制造商编码" prop="vendorCode">
<el-input v-model="form.vendorCode" placeholder="请输入制造商编码" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="制造商名称" prop="vendorName">
<el-input v-model="form.vendorName" placeholder="请输入制造商名称" />
</el-form-item>
</el-col>
</el-row>
<el-form-item label="制造商全称" prop="vendorAddress">
<el-input v-model="form.vendorAddress" placeholder="请输入制造商全称" />
</el-form-item>
<el-row>
<el-col :span="12">
<el-form-item label="联系人" prop="vendorUser">
<el-input v-model="form.vendorUser" placeholder="请输入联系人" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="联系邮箱" prop="vendorEmail">
<el-input v-model="form.vendorEmail" placeholder="请输入联系邮箱" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="联系电话" prop="vendorPhone">
<el-input v-model="form.vendorPhone" placeholder="请输入联系电话" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="合作状态" prop="vendorStatus">
<el-select v-model="form.vendorStatus" placeholder="请选择合作状态">
<el-option
v-for="dict in dict.type.vendor_status"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="默认仓库" prop="warehouseId">
<el-select v-model="form.warehouseId" placeholder="请选择默认仓库" style="width: 100%">
<el-option
v-for="item in warehouseOptions"
:key="item.id"
:label="item.warehouseName"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="拥有仓库" prop="warehouseIdList">
<el-select v-model="form.warehouseIdList" multiple placeholder="请选择拥有仓库" style="width: 100%">
<el-option
v-for="item in warehouseOptions"
:key="item.id"
:label="item.warehouseName"
:value="String(item.id)"
></el-option>
</el-select>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listVendor, getVendor, delVendor, addVendor, updateVendor, exportVendor, listAllWarehouse } from "@/api/base/vendor";
export default {
name: "Vendor",
dicts: ['vendor_status'],
data() {
return {
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
vendorList: [],
//
title: "",
//
open: false,
//
warehouseOptions: [],
//
queryParams: {
pageNum: 1,
pageSize: 10,
vendorCode: null,
vendorName: null,
vendorAddress: null,
vendorUser: null,
vendorStatus: null,
},
//
form: {},
//
rules: {
vendorCode: [
{ required: true, message: "制造商编码不能为空", trigger: "blur" }
],
vendorName: [
{ required: true, message: "制造商名称不能为空", trigger: "blur" }
],
vendorUser: [
{ required: true, message: "联系人不能为空", trigger: "blur" }
],
vendorPhone: [
{ required: true, message: "联系电话不能为空", trigger: "blur" }
],
vendorStatus: [
{ required: true, message: "合作状态不能为空", trigger: "change" }
],
}
};
},
created() {
this.getList();
this.getWarehouseList();
},
methods: {
/** 查询制造商信息列表 */
getList() {
this.loading = true;
listVendor(this.queryParams).then(response => {
this.vendorList = response.rows;
this.total = response.total;
this.loading = false;
});
},
/** 查询仓库列表 */
getWarehouseList() {
listAllWarehouse().then(response => {
this.warehouseOptions = response.data;
});
},
//
cancel() {
this.open = false;
this.reset();
},
//
reset() {
this.form = {
vendorId: null,
vendorCode: null,
vendorName: null,
vendorAddress: null,
vendorUser: null,
vendorEmail: null,
vendorPhone: null,
vendorStatus: "0",
warehouseId: null,
warehouseIdList: []
};
this.resetForm("form");
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm");
this.handleQuery();
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.vendorId)
this.single = selection.length!==1
this.multiple = !selection.length
},
/** 新增按钮操作 */
handleAdd() {
this.reset();
this.open = true;
this.title = "添加制造商信息";
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset();
const vendorId = row.vendorId || this.ids
getVendor(vendorId).then(response => {
this.form = response.data;
if (this.form.warehouseId) {
this.form.warehouseId = Number(this.form.warehouseId);
}
this.open = true;
this.title = "修改制造商信息";
});
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.vendorId != null) {
updateVendor(this.form).then(response => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
});
} else {
addVendor(this.form).then(response => {
this.$modal.msgSuccess("新增成功");
this.open = false;
this.getList();
});
}
}
});
},
/** 删除按钮操作 */
handleDelete(row) {
const vendorIds = row.vendorId || this.ids;
this.$modal.confirm('是否确认删除制造商信息编号为"' + vendorIds + '"的数据项?').then(function() {
return delVendor(vendorIds);
}).then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
}).catch(() => {});
},
/** 导出按钮操作 */
handleExport() {
const queryParams = this.queryParams;
this.$modal.confirm('是否确认导出所有制造商信息数据项?').then(() => {
this.exportLoading = true;
return exportVendor(queryParams);
}).then(response => {
const fileName = response.msg;
window.location.href = process.env.VUE_APP_BASE_API + "/common/download?fileName=" + encodeURIComponent(fileName) + "&delete=" + true;
this.exportLoading = false;
}).catch(() => {
this.exportLoading = false;
});
}
}
};
</script>

View File

@ -0,0 +1,399 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="98px">
<el-form-item label="代表处编码" prop="agentCode">
<el-input
v-model="queryParams.agentCode"
placeholder="请输入代表处编码"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="代表处名称" prop="agentName">
<el-input
v-model="queryParams.agentName"
placeholder="请输入代表处名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="所在省" prop="province">
<el-select v-model="queryParams.province" placeholder="请选择省" style="width: 100%" @change="handleSearchProvinceChange">
<el-option
v-for="item in searchProvinceOptions"
:key="item.id"
:label="item.n"
:value="item.n"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="所在市" prop="city">
<el-select v-model="queryParams.city" placeholder="请选择市" style="width: 100%">
<el-option
v-for="item in searchCityOptions"
:key="item.id"
:label="item.n"
:value="item.n"
></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"></el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"></el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['system:agent:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['system:agent:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['system:agent:export']"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="agentList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="代表处编码" align="center" prop="agentCode" />
<el-table-column label="代表处名称" align="center" prop="agentName" />
<el-table-column label="所在省" align="center" prop="province" />
<el-table-column label="所在市" align="center" prop="city" />
<el-table-column label="创建时间" align="center" prop="createAt" width="180">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createAt, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['system:agent:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['system:agent:remove']"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改办事处信息对话框 -->
<el-dialog :title="title" :visible.sync="open" width="800px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="110px">
<el-row>
<el-col :span="12">
<el-form-item label="代表处编码" prop="agentCode">
<el-input v-model="form.agentCode" placeholder="请输入代表处编码" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="代表处名称" prop="agentName">
<el-input v-model="form.agentName" placeholder="请输入代表处名称" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="省" prop="province">
<el-select v-model="form.province" placeholder="请选择省" style="width: 100%" @change="handleProvinceChange">
<el-option
v-for="item in provinceOptions"
:key="item.id"
:label="item.n"
:value="item.n"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="市" prop="city">
<el-select v-model="form.city" placeholder="请选择市" style="width: 100%">
<el-option
v-for="item in cityOptions"
:key="item.id"
:label="item.n"
:value="item.n"
></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="详细地址" prop="address">
<el-input v-model="form.address" placeholder="请输入详细地址" />
</el-form-item>
<el-row>
<el-col :span="12">
<el-form-item label="联系人" prop="contactPerson">
<el-input v-model="form.contactPerson" placeholder="请输入联系人" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="联系电话" prop="contactPhone">
<el-input v-model="form.contactPhone" placeholder="请输入联系电话" />
</el-form-item>
</el-col>
</el-row>
<el-form-item label="联系邮件" prop="contactEmail">
<el-input v-model="form.contactEmail" placeholder="请输入联系邮件" />
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listAgent, getAgent, delAgent, addAgent, updateAgent, exportAgent } from "@/api/system/agent";
import { listAreas } from "@/api/system/area";
export default {
name: "Agent",
data() {
return {
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
agentList: [],
//
title: "",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
agentCode: null,
agentName: null,
province: null,
city: null
},
//
provinceOptions: [],
//
cityOptions: [],
//
searchProvinceOptions: [],
//
searchCityOptions: [],
//
form: {},
//
rules: {
agentCode: [
{ required: true, message: "代表处编码不能为空", trigger: "blur" }
],
agentName: [
{ required: true, message: "代表处名称不能为空", trigger: "blur" }
],
province: [
{ required: true, message: "省份不能为空", trigger: "change" }
],
city: [
{ required: true, message: "城市不能为空", trigger: "change" }
]
}
};
},
created() {
this.getList();
this.getProvinceList();
},
methods: {
/** 查询办事处信息列表 */
getList() {
this.loading = true;
listAgent(this.queryParams).then(response => {
this.agentList = response.rows;
this.total = response.total;
this.loading = false;
});
},
/** 查询省份列表 */
getProvinceList() {
listAreas(0).then(response => {
this.provinceOptions = response;
this.searchProvinceOptions = response;
});
},
/** 搜索省份选择改变时 */
handleSearchProvinceChange(provinceName) {
this.queryParams.city = null; // Clear city selection when province changes
const selectedProvince = this.searchProvinceOptions.find(p => p.n === provinceName);
if (selectedProvince) {
this.searchCityOptions = selectedProvince.s;
} else {
this.searchCityOptions = [];
}
},
/** 省份选择改变时 */
handleProvinceChange(provinceName) {
this.form.city = null; // Clear city selection when province changes
const selectedProvince = this.provinceOptions.find(p => p.n === provinceName);
if (selectedProvince) {
this.cityOptions = selectedProvince.s;
} else {
this.cityOptions = [];
}
},
//
cancel() {
this.open = false;
this.reset();
},
//
reset() {
this.form = {
id: null,
agentCode: null,
agentName: null,
province: null,
city: null,
address: null,
contactPerson: null,
contactPhone: null,
contactEmail: null,
remark: null,
createAt: null,
updatedAt: null
};
this.cityOptions = []; // Clear city options on reset
this.resetForm("form");
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm");
this.queryParams.city = null;
this.searchCityOptions = [];
this.handleQuery();
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length!==1
this.multiple = !selection.length
},
/** 新增按钮操作 */
handleAdd() {
this.reset();
this.open = true;
this.title = "添加办事处信息";
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset();
const id = row.id || this.ids
getAgent(id).then(response => {
this.form = response.data;
// Populate city options if province is already set
if (this.form.province) {
const selectedProvince = this.provinceOptions.find(p => p.n === this.form.province);
if (selectedProvince) {
this.cityOptions = selectedProvince.s;
}
}
this.open = true;
this.title = "修改办事处信息";
});
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
updateAgent(this.form).then(response => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
});
} else {
addAgent(this.form).then(response => {
this.$modal.msgSuccess("新增成功");
this.open = false;
this.getList();
});
}
}
});
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids;
this.$modal.confirm('是否确认删除办事处信息编号为"' + ids + '"的数据项?').then(function() {
return delAgent(ids);
}).then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
}).catch(() => {});
},
/** 导出按钮操作 */
handleExport() {
this.$modal.confirm('是否确认导出所有办事处信息数据项?').then(() => {
return exportAgent(this.queryParams);
}).then(response => {
this.$download.name(response.msg);
}).catch(() => {});
}
}
};
</script>

View File

@ -0,0 +1,499 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="98px">
<el-form-item label="客户编码" prop="customerCode">
<el-input
v-model="queryParams.customerCode"
placeholder="请输入客户编码"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="最终客户名称" prop="customerName">
<el-input
v-model="queryParams.customerName"
placeholder="请输入最终客户名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="所在省" prop="province">
<el-select v-model="queryParams.province" placeholder="请选择省" @change="handleSearchProvinceChange">
<el-option
v-for="item in searchProvinceOptions"
:key="item.id"
:label="item.n"
:value="item.n"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="所在市" prop="city">
<el-select v-model="queryParams.city" placeholder="请选择市">
<el-option
v-for="item in searchCityOptions"
:key="item.id"
:label="item.n"
:value="item.n"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="BG" prop="bgProperty">
<el-select v-model="queryParams.bgProperty" placeholder="请选择BG" @change="handleSearchBgChange">
<el-option
v-for="dict in dict.type.bg_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="行业" prop="industryType">
<el-select v-model="queryParams.industryType" placeholder="请选择行业">
<el-option
v-for="item in searchIndustryOptions"
:key="item.value"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"></el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"></el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['system:customer:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['system:customer:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['system:customer:export']"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="customerList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="客户编码" prop="customerCode" width="160" />
<el-table-column label="最终客户名称" prop="customerName" width="250" />
<el-table-column label="客户邮编" prop="customerPostcode" width="80" />
<el-table-column label="所在省" prop="province" width="80" />
<el-table-column label="所在市" prop="city" width="80" />
<el-table-column label="详细地址" prop="address" width="200" show-overflow-tooltip/>
<el-table-column label="联系人" prop="contactPerson" width="100" />
<el-table-column label="联系电话" prop="contactPhone" width="100" show-overflow-tooltip/>
<el-table-column label="联系邮件" prop="contactEmail" width="200" show-overflow-tooltip />
<el-table-column label="BG" prop="bgProperty" width="100">
<template slot-scope="scope">
<dict-tag :options="dict.type.bg_type" :value="scope.row.bgProperty"/>
</template>
</el-table-column>
<el-table-column label="所属行业" prop="industryType" width="100">
<template slot-scope="scope">
<dict-tag v-if="scope.row.bgProperty === 'YYS'" :options="dict.type.bg_yys" :value="scope.row.industryType"/>
<dict-tag v-else :options="dict.type.bg_hysy" :value="scope.row.industryType"/>
</template>
</el-table-column>
<el-table-column label="备注" prop="remark" width="100" />
<el-table-column label="创建时间" prop="createAt" width="180">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createAt, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="150" fixed="right">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['system:customer:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['system:customer:remove']"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改客户信息对话框 -->
<el-dialog :title="title" :visible.sync="open" width="800px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="120px">
<el-row>
<el-col :span="12">
<el-form-item label="客户编码" prop="customerCode">
<el-input v-model="form.customerCode" placeholder="自动生成" readonly />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="最终客户名称" prop="customerName">
<el-input v-model="form.customerName" placeholder="请输入最终客户名称" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="省" prop="province">
<el-select v-model="form.province" placeholder="请选择省" @change="handleProvinceChange">
<el-option
v-for="item in provinceOptions"
:key="item.id"
:label="item.n"
:value="item.n"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="市" prop="city">
<el-select v-model="form.city" placeholder="请选择市">
<el-option
v-for="item in cityOptions"
:key="item.id"
:label="item.n"
:value="item.n"
></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="BG" prop="bgProperty">
<el-select v-model="form.bgProperty" placeholder="请选择BG" @change="handleBgChange">
<el-option
v-for="dict in dict.type.bg_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="行业" prop="industryType">
<el-select v-model="form.industryType" placeholder="请选择行业">
<el-option
v-for="item in industryOptions"
:key="item.value"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="详细地址" prop="address">
<el-input v-model="form.address" placeholder="请输入详细地址" />
</el-form-item>
<el-row>
<el-col :span="12">
<el-form-item label="联系人" prop="contactPerson">
<el-input v-model="form.contactPerson" placeholder="请输入联系人" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="联系电话" prop="contactPhone">
<el-input v-model="form.contactPhone" placeholder="请输入联系电话" />
</el-form-item>
</el-col>
</el-row>
<el-form-item label="联系邮件" prop="contactEmail">
<el-input v-model="form.contactEmail" placeholder="请输入联系邮件" />
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listCustomer, getCustomer, delCustomer, addCustomer, updateCustomer, exportCustomer } from "@/api/system/customer";
import { listAreas } from "@/api/system/area";
export default {
name: "Customer",
dicts: ['bg_type', 'bg_yys', 'bg_hysy'],
data() {
return {
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
customerList: [],
//
title: "",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
customerCode: null,
customerName: null,
province: null,
city: null,
bgProperty: null,
industryType: null
},
//
provinceOptions: [],
//
cityOptions: [],
//
searchProvinceOptions: [],
//
searchCityOptions: [],
//
industryOptions: [],
//
searchIndustryOptions: [],
//
form: {},
//
rules: {
customerName: [
{ required: true, message: "最终客户名称不能为空", trigger: "blur" }
],
province: [
{ required: true, message: "省份不能为空", trigger: "change" }
],
city: [
{ required: true, message: "城市不能为空", trigger: "change" }
],
bgProperty: [
{ required: true, message: "BG不能为空", trigger: "change" }
],
industryType: [
{ required: true, message: "行业不能为空", trigger: "change" }
]
}
};
},
created() {
this.getList();
this.getProvinceList();
},
methods: {
/** 查询客户信息列表 */
getList() {
this.loading = true;
listCustomer(this.queryParams).then(response => {
this.customerList = response.rows;
this.total = response.total;
this.loading = false;
});
},
/** 查询省份列表 */
getProvinceList() {
listAreas(0).then(response => {
this.provinceOptions = response;
this.searchProvinceOptions = response;
});
},
/** 搜索省份选择改变时 */
handleSearchProvinceChange(provinceName) {
this.queryParams.city = null;
const selectedProvince = this.searchProvinceOptions.find(p => p.n === provinceName);
if (selectedProvince) {
this.searchCityOptions = selectedProvince.s;
} else {
this.searchCityOptions = [];
}
},
/** 省份选择改变时 */
handleProvinceChange(provinceName) {
this.form.city = null;
const selectedProvince = this.provinceOptions.find(p => p.n === provinceName);
if (selectedProvince) {
this.cityOptions = selectedProvince.s;
} else {
this.cityOptions = [];
}
},
/** 搜索BG选择改变时 */
handleSearchBgChange(bgValue) {
this.queryParams.industryType = null;
if (bgValue === 'YYS') {
this.searchIndustryOptions = this.dict.type.bg_yys;
} else {
this.searchIndustryOptions = this.dict.type.bg_hysy;
}
},
/** BG选择改变时 */
handleBgChange(bgValue) {
this.form.industryType = null;
if (bgValue === 'YYS') {
this.industryOptions = this.dict.type.bg_yys;
} else {
this.industryOptions = this.dict.type.bg_hysy;
}
},
//
cancel() {
this.open = false;
this.reset();
},
//
reset() {
this.form = {
id: null,
customerCode: null,
customerName: null,
province: null,
city: null,
address: null,
contactPerson: null,
contactPhone: null,
contactEmail: null,
bgProperty: null,
industryType: null,
remark: null
};
this.cityOptions = [];
this.industryOptions = [];
this.resetForm("form");
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm");
this.queryParams.city = null;
this.queryParams.industryType = null;
this.searchCityOptions = [];
this.searchIndustryOptions = [];
this.handleQuery();
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length!==1
this.multiple = !selection.length
},
/** 新增按钮操作 */
handleAdd() {
this.reset();
this.open = true;
this.title = "添加客户信息";
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset();
const id = row.id || this.ids
getCustomer(id).then(response => {
this.form = response.data;
if (this.form.province) {
const selectedProvince = this.provinceOptions.find(p => p.n === this.form.province);
if (selectedProvince) {
this.cityOptions = selectedProvince.s;
}
}
if (this.form.bgProperty) {
if (this.form.bgProperty === 'YYS') {
this.industryOptions = this.dict.type.bg_yys;
} else {
this.industryOptions = this.dict.type.bg_hysy;
}
}
this.open = true;
this.title = "修改客户信息";
});
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
updateCustomer(this.form).then(response => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
});
} else {
addCustomer(this.form).then(response => {
this.$modal.msgSuccess("新增成功");
this.open = false;
this.getList();
});
}
}
});
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids;
this.$modal.confirm('是否确认删除客户信息编号为"' + ids + '"的数据项?').then(function() {
return delCustomer(ids);
}).then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
}).catch(() => {});
},
/** 导出按钮操作 */
handleExport() {
this.$modal.confirm('是否确认导出所有客户信息数据项?').then(() => {
return exportCustomer(this.queryParams);
}).then(response => {
this.$download.name(response.msg);
}).catch(() => {});
}
}
};
</script>

View File

@ -0,0 +1,470 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="98px">
<el-form-item label="代理商编码" prop="partnerCode">
<el-input
v-model="queryParams.partnerCode"
placeholder="请输入代理商编码"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="代理商名称" prop="partnerName">
<el-input
v-model="queryParams.partnerName"
placeholder="请输入代理商名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="认证级别" prop="level">
<el-select v-model="queryParams.level" placeholder="请选择认证级别" clearable>
<el-option
v-for="dict in dict.type.identify_level"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="省" prop="province">
<el-select v-model="queryParams.province" placeholder="请选择省" style="width: 100%" @change="handleSearchProvinceChange">
<el-option
v-for="item in searchProvinceOptions"
:key="item.id"
:label="item.n"
:value="item.n"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="市" prop="city">
<el-select v-model="queryParams.city" placeholder="请选择市" style="width: 100%">
<el-option
v-for="item in searchCityOptions"
:key="item.id"
:label="item.n"
:value="item.n"
></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"></el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"></el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['system:partner:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['system:partner:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['system:partner:export']"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="partnerList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="代理商编码" align="center" prop="partnerCode" />
<el-table-column label="代理商名称" align="center" prop="partnerName" width="200" />
<el-table-column label="省" align="center" prop="province" />
<el-table-column label="市" align="center" prop="city" />
<el-table-column label="详细地址" align="center" prop="address" show-overflow-tooltip width="250" >
</el-table-column>
<el-table-column label="联系人" align="center" prop="contactPerson" />
<el-table-column label="联系电话" align="center" prop="contactPhone" />
<el-table-column label="邮件" align="center" prop="contactEmail" show-overflow-tooltip width="180" />
<el-table-column label="认证级别" align="center" prop="level">
<template slot-scope="scope">
<dict-tag :options="dict.type.identify_level" :value="scope.row.level"/>
</template>
</el-table-column>
<el-table-column label="创建时间" align="center" prop="createAt" width="180">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createAt, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="120">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['system:partner:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['system:partner:remove']"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改代理商管理对话框 -->
<el-dialog :title="title" :visible.sync="open" width="800px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="110px">
<el-row>
<el-col :span="12">
<el-form-item label="代理商编码" prop="partnerCode">
<el-input v-model="form.partnerCode" placeholder="编码自动生成" readonly />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="代理商名称" prop="partnerName">
<el-input v-model="form.partnerName" placeholder="请输入代理商名称" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="省" prop="province">
<el-select v-model="form.province" placeholder="请选择省" style="width: 100%" @change="handleProvinceChange">
<el-option
v-for="item in provinceOptions"
:key="item.id"
:label="item.n"
:value="item.n"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="市" prop="city">
<el-select v-model="form.city" placeholder="请选择市" style="width: 100%">
<el-option
v-for="item in cityOptions"
:key="item.id"
:label="item.n"
:value="item.n"
></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="认证级别" prop="level">
<el-select v-model="form.level" placeholder="请选择认证级别" style="width: 100%">
<el-option
v-for="dict in dict.type.identify_level"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="系统用户" prop="systemUserName">
<el-input v-model="form.systemUserName" placeholder="请选择系统用户" readonly @click.native="openSelectUser" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="联系人" prop="contactPerson">
<el-input v-model="form.contactPerson" placeholder="请输入联系人" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="联系电话" prop="contactPhone">
<el-input v-model="form.contactPhone" placeholder="请输入联系电话" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="邮件" prop="contactEmail">
<el-input v-model="form.contactEmail" placeholder="请输入邮件" />
</el-form-item>
</el-col>
</el-row>
<el-form-item label="地址" prop="address">
<el-input v-model="form.address" type="textarea" placeholder="请输入详细地址" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
<select-user :visible.sync="selectUserVisible" @user-selected="handleUserSelected" />
</div>
</template>
<script>
import { listPartner, getPartner, delPartner, addPartner, updatePartner, exportPartner } from "@/api/system/partner";
import { listAreas } from "@/api/system/area";
import SelectUser from "@/views/system/user/selectUser";
export default {
name: "Partner",
components: { SelectUser },
dicts: ['identify_level'],
data() {
return {
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
partnerList: [],
//
title: "",
//
open: false,
//
selectUserVisible: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
partnerCode: null,
partnerName: null,
level: null,
province: null,
city: null,
},
//
provinceOptions: [],
//
cityOptions: [],
//
searchProvinceOptions: [],
//
searchCityOptions: [],
//
form: {
province: null,
city: null,
},
//
rules: {
partnerName: [
{ required: true, message: "代理商名称不能为空", trigger: "blur" }
],
level: [
{ required: true, message: "认证级别不能为空", trigger: "change" }
],
systemUserName: [
{ required: true, message: "系统用户不能为空", trigger: "blur" }
],
contactEmail: [
{ required: true, message: "邮件不能为空", trigger: "blur" }
],
province: [
{ required: true, message: "省份不能为空", trigger: "change" }
],
city: [
{ required: true, message: "城市不能为空", trigger: "change" }
],
}
};
},
created() {
this.getList();
this.getProvinceList();
},
methods: {
/** 查询省份列表 */
getProvinceList() {
listAreas(0).then(response => {
this.provinceOptions = response;
this.searchProvinceOptions = response;
});
},
/** 搜索省份选择改变时 */
handleSearchProvinceChange(provinceName) {
this.queryParams.city = null; // Clear city selection when province changes
const selectedProvince = this.searchProvinceOptions.find(p => p.n === provinceName);
if (selectedProvince) {
this.searchCityOptions = selectedProvince.s;
} else {
this.searchCityOptions = [];
}
},
/** 省份选择改变时 */
handleProvinceChange(provinceName) {
this.form.city = null; // Clear city selection when province changes
const selectedProvince = this.provinceOptions.find(p => p.n === provinceName);
if (selectedProvince) {
this.cityOptions = selectedProvince.s;
} else {
this.cityOptions = [];
}
},
/** 查询代理商管理列表 */
getList() {
this.loading = true;
listPartner(this.queryParams).then(response => {
this.partnerList = response.rows;
this.total = response.total;
this.loading = false;
});
},
//
cancel() {
this.open = false;
this.reset();
},
//
reset() {
this.form = {
id: null,
partnerCode: null,
partnerName: null,
province: null,
city: null,
address: null,
contactPerson: null,
contactPhone: null,
contactEmail: null,
level: null,
systemUserId: null,
systemUserName: null,
createAt: null,
updatedAt: null
};
this.cityOptions = []; // Clear city options on reset
this.resetForm("form");
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm");
this.queryParams.city = null;
this.searchCityOptions = [];
this.handleQuery();
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length!==1
this.multiple = !selection.length
},
/** 新增按钮操作 */
handleAdd() {
this.reset();
this.open = true;
this.title = "添加代理商管理";
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset();
const id = row.id || this.ids
getPartner(id).then(response => {
this.form = response.data;
// Populate city options if province is already set
if (this.form.province) {
const selectedProvince = this.provinceOptions.find(p => p.n === this.form.province);
if (selectedProvince) {
this.cityOptions = selectedProvince.s;
}
}
this.open = true;
this.title = "修改代理商管理";
});
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
updatePartner(this.form).then(response => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
});
} else {
addPartner(this.form).then(response => {
this.$modal.msgSuccess("新增成功");
this.open = false;
this.getList();
});
}
}
});
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids;
this.$modal.confirm('是否确认删除代理商管理编号为"' + ids + '"的数据项?').then(function() {
return delPartner(ids);
}).then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
}).catch(() => {});
},
/** 导出按钮操作 */
handleExport() {
this.$modal.confirm('是否确认导出所有代理商管理数据项?').then(() => {
return exportPartner(this.queryParams);
}).then(response => {
this.$download.name(response.msg);
}).catch(() => {});
},
/** 打开选择用户对话框 */
openSelectUser() {
this.selectUserVisible = true;
},
/** 处理用户选择 */
handleUserSelected(user) {
this.form.systemUserName = user.userName;
this.form.systemUserId = user.userId;
this.selectUserVisible = false;
}
}
};
</script>

View File

@ -0,0 +1,414 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="98px">
<el-form-item label="编码" prop="productCode">
<el-input
v-model="queryParams.productCode"
placeholder="请输入BOM编码"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="产品名称" prop="productName">
<el-input
v-model="queryParams.productName"
placeholder="请输入产品名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="产品型号" prop="model">
<el-input
v-model="queryParams.model"
placeholder="请输入产品型号"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="制造商" prop="vendorName">
<el-input
v-model="queryParams.vendorName"
placeholder="请输入制造商名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"></el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"></el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['system:product:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['system:product:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['system:product:export']"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="productList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="BOM编码" align="center" prop="productCode" />
<el-table-column label="华智编码" align="center" prop="hzCode" />
<el-table-column label="产品名称" align="center" prop="productName" />
<el-table-column label="产品型号" align="center" prop="model" />
<el-table-column label="制造商" align="center" prop="vendorName" />
<el-table-column label="目录单价" align="center" prop="cataloguePrice" />
<el-table-column label="指导折扣" align="center" prop="guidanceDiscount">
<template slot-scope="scope">
<span>{{ scope.row.guidanceDiscount ? (scope.row.guidanceDiscount * 100).toFixed(2) + '%' : '-' }}</span>
</template>
</el-table-column>
<el-table-column label="创建时间" align="center" prop="createdAt" width="180">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createdAt, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['system:product:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['system:product:remove']"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改产品管理对话框 -->
<el-dialog :title="title" :visible.sync="open" width="600px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="110px">
<el-row>
<el-col :span="12">
<el-form-item label="BOM编码" prop="productCode">
<el-input v-model="form.productCode" placeholder="请输入BOM编码" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="华智编码" prop="hzCode">
<el-input v-model="form.hzCode" placeholder="请输入华智编码" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="产品名称" prop="productName">
<el-input v-model="form.productName" placeholder="请输入产品名称" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="产品型号" prop="model">
<el-input v-model="form.model" placeholder="请输入产品型号" />
</el-form-item>
</el-col>
</el-row>
<el-form-item label="产品类型" prop="type">
<el-select v-model="form.type" placeholder="请选择产品类型">
<el-option
v-for="dict in dict.type.product_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
</el-select>
</el-form-item>
<el-row>
<el-col :span="12">
<el-form-item label="目录单价" prop="cataloguePrice">
<el-input-number v-model="form.cataloguePrice" :precision="2" :step="0.1" placeholder="请输入目录单价" style="width:100%"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="指导折扣" prop="guidanceDiscount">
<el-input v-model="guidanceDiscountPercent" placeholder="请输入指导折扣">
<template slot="append">%</template>
</el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="制造商" prop="vendorCode">
<el-select v-model="form.vendorCode" placeholder="请选择制造商" style="width: 100%">
<el-option
v-for="item in vendorOptions"
:key="item.vendorCode"
:label="item.vendorName"
:value="item.vendorCode"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="产品描述" prop="description">
<el-input v-model="form.description" type="textarea" placeholder="请输入产品描述" />
</el-form-item>
<el-form-item v-if="form.type == '11' || form.type == '22'" label="维保年限" prop="value">
<el-input-number v-model="form.value" placeholder="请输入维保年限" />
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入备注" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listProduct, getProduct, delProduct, addProduct, updateProduct, exportProduct, listAllVendor } from "@/api/system/product";
export default {
name: "Product",
dicts: ['product_type'],
data() {
return {
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
productList: [],
//
title: "",
//
open: false,
//
vendorOptions: [],
//
queryParams: {
pageNum: 1,
pageSize: 10,
productCode: null,
productName: null,
model: null,
vendorName: null,
},
//
form: {},
//
rules: {
productCode: [
{ required: true, message: "BOM编码不能为空", trigger: "blur" }
],
hzCode: [
{ required: true, message: "华智编码不能为空", trigger: "blur" }
],
productName: [
{ required: true, message: "产品名称不能为空", trigger: "blur" }
],
model: [
{ required: true, message: "产品型号不能为空", trigger: "blur" }
],
type: [
{ required: true, message: "产品类型不能为空", trigger: "change" }
],
cataloguePrice: [
{ required: true, message: "目录单价不能为空", trigger: "blur" }
],
guidanceDiscount: [
{ required: true, message: "指导折扣不能为空", trigger: "blur" }
],
vendorCode: [
{ required: true, message: "制造商不能为空", trigger: "change" }
],
value: [
{ required: true, message: "维保年限不能为空", trigger: "blur" }
]
}
};
},
computed: {
guidanceDiscountPercent: {
get() {
if (this.form.guidanceDiscount === null || this.form.guidanceDiscount === undefined) {
return '';
}
return (this.form.guidanceDiscount * 100).toString();
},
set(val) {
if (val === '' || val === null) {
this.form.guidanceDiscount = null;
} else {
this.form.guidanceDiscount = parseFloat(val) / 100;
}
}
}
},
created() {
this.getList();
this.getVendorList();
},
methods: {
/** 查询产品管理列表 */
getList() {
this.loading = true;
listProduct(this.queryParams).then(response => {
this.productList = response.rows;
this.total = response.total;
this.loading = false;
});
},
/** 查询制造商列表 */
getVendorList() {
listAllVendor().then(response => {
this.vendorOptions = response.data;
});
},
//
cancel() {
this.open = false;
this.reset();
},
//
reset() {
this.form = {
id: null,
productCode: null,
hzCode: null,
productName: null,
model: null,
type: null,
cataloguePrice: null,
guidanceDiscount: null,
vendorCode: null,
description: null,
value: null,
remark: null,
createdAt: null,
updatedAt: null,
deletedAt: null
};
this.resetForm("form");
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm");
this.handleQuery();
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length!==1
this.multiple = !selection.length
},
/** 新增按钮操作 */
handleAdd() {
this.reset();
this.open = true;
this.title = "添加产品管理";
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset();
const id = row.id || this.ids
getProduct(id).then(response => {
this.form = response.data;
this.open = true;
this.title = "修改产品管理";
});
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
updateProduct(this.form).then(response => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
});
} else {
addProduct(this.form).then(response => {
this.$modal.msgSuccess("新增成功");
this.open = false;
this.getList();
});
}
}
});
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids;
this.$modal.confirm('是否确认删除产品管理编号为"' + ids + '"的数据项?').then(function() {
return delProduct(ids);
}).then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
}).catch(() => {});
},
/** 导出按钮操作 */
handleExport() {
const queryParams = this.queryParams;
this.$modal.confirm('是否确认导出所有产品管理数据项?').then(() => {
this.exportLoading = true;
return exportProduct(queryParams);
}).then(response => {
const fileName = response.msg;
window.location.href = process.env.VUE_APP_BASE_API + "/common/download?fileName=" + encodeURIComponent(fileName) + "&delete=" + true;
this.exportLoading = false;
}).catch(() => {
this.exportLoading = false;
});
}
}
};
</script>

View File

@ -0,0 +1,103 @@
<template>
<el-dialog title="选择用户" :visible.sync="visible" width="800px" append-to-body @close="handleClose">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true">
<el-form-item label="用户名称" prop="userName">
<el-input
v-model="queryParams.userName"
placeholder="请输入用户名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"></el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"></el-button>
</el-form-item>
</el-form>
<el-table v-loading="loading" :data="userList" @row-click="handleRowClick">
<el-table-column label="用户名称" align="center" prop="loginName" />
<el-table-column label="用户昵称" align="center" prop="userName" />
<el-table-column label="部门" align="center" prop="dept.deptName" />
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<div slot="footer" class="dialog-footer">
<el-button @click="handleClose"> </el-button>
</div>
</el-dialog>
</template>
<script>
import { listUser } from "@/api/system/user";
export default {
name: "SelectUser",
props: {
visible: {
type: Boolean,
default: false,
},
},
data() {
return {
//
loading: true,
//
total: 0,
//
userList: [],
//
queryParams: {
pageNum: 1,
pageSize: 10,
userName: null,
},
};
},
watch: {
visible(val) {
if (val) {
this.getList();
}
},
},
methods: {
/** 查询用户列表 */
getList() {
this.loading = true;
listUser(this.queryParams).then(response => {
this.userList = response.rows;
this.total = response.total;
this.loading = false;
});
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm");
this.handleQuery();
},
/** 行点击事件 */
handleRowClick(row) {
this.$emit("user-selected", row);
this.handleClose();
},
/** 关闭按钮 */
handleClose() {
this.$emit("update:visible", false);
},
},
};
</script>

View File

@ -0,0 +1,368 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="98px">
<el-form-item label="仓库名称" prop="warehouseName">
<el-input
v-model="queryParams.warehouseName"
placeholder="请输入仓库名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="类型" prop="warehouseType">
<el-select v-model="queryParams.warehouseType" placeholder="请选择类型" clearable>
<el-option
v-for="dict in dict.type.warehouse_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="状态" prop="warehouseStatus">
<el-select v-model="queryParams.warehouseStatus" placeholder="请选择状态" clearable>
<el-option
v-for="dict in dict.type.warehouse_status"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="联系人" prop="managerName">
<el-input
v-model="queryParams.managerName"
placeholder="请输入联系人"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="联系人电话" prop="managerPhone">
<el-input
v-model="queryParams.managerPhone"
placeholder="请输入联系人电话"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="联系人邮件" prop="managerEmail">
<el-input
v-model="queryParams.managerEmail"
placeholder="请输入联系人邮件"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"></el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"></el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['warehouse:info:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['warehouse:info:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['warehouse:info:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['warehouse:info:export']"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="infoList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="仓库名称" align="center" prop="warehouseName" />
<el-table-column label="类型" align="center" prop="warehouseType">
<template slot-scope="scope">
<dict-tag :options="dict.type.warehouse_type" :value="scope.row.warehouseType"/>
</template>
</el-table-column>
<el-table-column label="状态" align="center" prop="warehouseStatus">
<template slot-scope="scope">
<dict-tag :options="dict.type.warehouse_status" :value="scope.row.warehouseStatus"/>
</template>
</el-table-column>
<el-table-column label="详细地址" align="center" prop="address" />
<el-table-column label="联系人" align="center" prop="managerName" />
<el-table-column label="联系人电话" align="center" prop="managerPhone" />
<el-table-column label="联系人邮件" align="center" prop="managerEmail" />
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['warehouse:info:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['warehouse:info:remove']"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改仓库基础信息对话框 -->
<el-dialog :title="title" :visible.sync="open" width="600px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="110px">
<el-form-item label="仓库名称" prop="warehouseName">
<el-input v-model="form.warehouseName" placeholder="请输入仓库名称" />
</el-form-item>
<el-form-item label="类型" prop="warehouseType">
<el-select v-model="form.warehouseType" placeholder="请选择类型">
<el-option
v-for="dict in dict.type.warehouse_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="状态" prop="warehouseStatus">
<el-select v-model="form.warehouseStatus" placeholder="请选择状态">
<el-option
v-for="dict in dict.type.warehouse_status"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="详细地址" prop="address">
<el-input v-model="form.address" type="textarea" placeholder="请输入详细地址" />
</el-form-item>
<el-form-item label="联系人" prop="managerName">
<el-input v-model="form.managerName" placeholder="请输入联系人" />
</el-form-item>
<el-form-item label="联系人电话" prop="managerPhone">
<el-input v-model="form.managerPhone" placeholder="请输入联系人电话" />
</el-form-item>
<el-form-item label="联系人邮件" prop="managerEmail">
<el-input v-model="form.managerEmail" placeholder="请输入联系人邮件" />
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" placeholder="请输入备注" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listInfo, getInfo, delInfo, addInfo, updateInfo, exportInfo } from "@/api/warehouse/info";
export default {
name: "WarehouseInfo",
dicts: ['warehouse_type', 'warehouse_status'],
data() {
return {
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
infoList: [],
//
title: "",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
warehouseName: null,
warehouseType: null,
warehouseStatus: null,
managerName: null,
managerPhone: null,
managerEmail: null,
},
//
form: {},
//
rules: {
warehouseName: [
{ required: true, message: "仓库名称不能为空", trigger: "blur" }
],
warehouseType: [
{ required: true, message: "类型不能为空", trigger: "change" }
],
warehouseStatus: [
{ required: true, message: "状态不能为空", trigger: "change" }
],
}
};
},
created() {
this.getList();
},
methods: {
/** 查询仓库基础信息列表 */
getList() {
this.loading = true;
listInfo(this.queryParams).then(response => {
this.infoList = response.rows;
this.total = response.total;
this.loading = false;
});
},
//
cancel() {
this.open = false;
this.reset();
},
//
reset() {
this.form = {
id: null,
warehouseName: null,
warehouseType: null,
warehouseStatus: null,
address: null,
managerName: null,
managerPhone: null,
managerEmail: null,
remark: null
};
this.resetForm("form");
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm");
this.handleQuery();
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length!==1
this.multiple = !selection.length
},
/** 新增按钮操作 */
handleAdd() {
this.reset();
this.open = true;
this.title = "添加仓库基础信息";
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset();
const id = row.id || this.ids
getInfo(id).then(response => {
this.form = response.data;
this.open = true;
this.title = "修改仓库基础信息";
});
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
updateInfo(this.form).then(response => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
});
} else {
addInfo(this.form).then(response => {
this.$modal.msgSuccess("新增成功");
this.open = false;
this.getList();
});
}
}
});
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids;
this.$modal.confirm('是否确认删除仓库基础信息编号为"' + ids + '"的数据项?').then(function() {
return delInfo(ids);
}).then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
}).catch(() => {});
},
/** 导出按钮操作 */
handleExport() {
const queryParams = this.queryParams;
this.$modal.confirm('是否确认导出所有仓库基础信息数据项?').then(() => {
this.exportLoading = true;
return exportInfo(queryParams);
}).then(response => {
const fileName = response.msg;
window.location.href = process.env.VUE_APP_BASE_API + "/common/download?fileName=" + encodeURIComponent(fileName) + "&delete=" + true;
this.exportLoading = false;
}).catch(() => {
this.exportLoading = false;
});
}
}
};
</script>

View File

@ -233,7 +233,7 @@ public class SysUserController extends BaseController
return prefix + "/resetPwd";
}
// TODO: The frontend expects a PUT request to '/resetPwd' with a JSON body. This endpoint uses POST and takes form data.
@RequiresPermissions("system:user:resetPwd")
@Log(title = "重置密码", businessType = BusinessType.UPDATE)
@PostMapping("/resetPwd")
@ -264,7 +264,7 @@ public class SysUserController extends BaseController
/**
*
*/
// TODO: The frontend expects a GET request to this URL that returns JSON data (user and roles), not a view name.
@RequiresPermissions("system:user:edit")
@GetMapping("/authRole/{userId}")
public String authRole(@PathVariable("userId") Long userId, ModelMap mmap)
@ -280,7 +280,7 @@ public class SysUserController extends BaseController
/**
*
*/
// TODO: The frontend expects a PUT request to '/system/user/authRole'. This endpoint is at '/authRole/insertAuthRole' and uses POST.
@RequiresPermissions("system:user:edit")
@Log(title = "用户管理", businessType = BusinessType.GRANT)
@PostMapping("/authRole/insertAuthRole")
@ -294,7 +294,7 @@ public class SysUserController extends BaseController
return success();
}
// TODO: The frontend expects a DELETE request to '/system/user/{userIds}'. This endpoint is at '/remove' and uses POST.
@RequiresPermissions("system:user:remove")
@Log(title = "用户管理", businessType = BusinessType.DELETE)
@PostMapping("/remove")
@ -447,96 +447,96 @@ public class SysUserController extends BaseController
}
// ----------------------新增的个人信息 业务处理---------------------------
/**
*
*/
@GetMapping("/profile")
@ResponseBody
public AjaxResult profile()
{
SysUser user = getSysUser();
AjaxResult ajax = AjaxResult.success(user);
ajax.put("roleGroup", userService.selectUserRoleGroup(user.getUserId()));
ajax.put("postGroup", userService.selectUserPostGroup(user.getUserId()));
return ajax;
}
/**
*
*/
@Log(title = "个人信息", businessType = BusinessType.UPDATE)
@PutMapping("/profile")
@ResponseBody
public AjaxResult updateProfile(@RequestBody SysUser user)
{
SysUser currentUser = getSysUser();
currentUser.setUserName(user.getUserName());
currentUser.setEmail(user.getEmail());
currentUser.setPhonenumber(user.getPhonenumber());
currentUser.setSex(user.getSex());
if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(currentUser))
{
return error("修改用户'" + currentUser.getLoginName() + "'失败,手机号码已存在");
}
else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(currentUser))
{
return error("修改用户'" + currentUser.getLoginName() + "'失败,邮箱账号已存在");
}
if (userService.updateUserInfo(currentUser) > 0)
{
setSysUser(currentUser);
return success();
}
return error();
}
/**
*
*/
@Log(title = "个人信息", businessType = BusinessType.UPDATE)
@PutMapping("/profile/updatePwd")
@ResponseBody
public AjaxResult updatePwd(String oldPassword, String newPassword)
{
SysUser user = getSysUser();
if (!passwordService.matches(user, oldPassword))
{
return error("修改密码失败,旧密码错误");
}
if (passwordService.matches(user, newPassword))
{
return error("新密码不能与旧密码相同");
}
user.setSalt(ShiroUtils.randomSalt());
user.setPassword(passwordService.encryptPassword(user.getLoginName(), newPassword, user.getSalt()));
user.setPwdUpdateDate(DateUtils.getNowDate());
if (userService.resetUserPwd(user) > 0)
{
setSysUser(userService.selectUserById(user.getUserId()));
return success();
}
return error("修改密码异常,请联系管理员");
}
/**
*
*/
@Log(title = "用户头像", businessType = BusinessType.UPDATE)
@PostMapping("/profile/avatar")
@ResponseBody
public AjaxResult avatar(@RequestParam("avatarfile") MultipartFile file) throws IOException
{
if (!file.isEmpty())
{
SysUser currentUser = getSysUser();
String avatar = FileUploadUtils.upload(ruoYiConfig.getAvatarPath(), file);
currentUser.setAvatar(avatar);
if (userService.updateUserInfo(currentUser) > 0)
{
setSysUser(currentUser);
return AjaxResult.success().put("imgUrl", avatar);
}
}
return error();
}
// /**
// * 个人信息
// */
// @GetMapping("/profile")
// @ResponseBody
// public AjaxResult profile()
// {
// SysUser user = getSysUser();
// AjaxResult ajax = AjaxResult.success(user);
// ajax.put("roleGroup", userService.selectUserRoleGroup(user.getUserId()));
// ajax.put("postGroup", userService.selectUserPostGroup(user.getUserId()));
// return ajax;
// }
//
// /**
// * 修改用户
// */
// @Log(title = "个人信息", businessType = BusinessType.UPDATE)
// @PutMapping("/profile")
// @ResponseBody
// public AjaxResult updateProfile(@RequestBody SysUser user)
// {
// SysUser currentUser = getSysUser();
// currentUser.setUserName(user.getUserName());
// currentUser.setEmail(user.getEmail());
// currentUser.setPhonenumber(user.getPhonenumber());
// currentUser.setSex(user.getSex());
// if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(currentUser))
// {
// return error("修改用户'" + currentUser.getLoginName() + "'失败,手机号码已存在");
// }
// else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(currentUser))
// {
// return error("修改用户'" + currentUser.getLoginName() + "'失败,邮箱账号已存在");
// }
// if (userService.updateUserInfo(currentUser) > 0)
// {
// setSysUser(currentUser);
// return success();
// }
// return error();
// }
//
// /**
// * 重置密码
// */
// @Log(title = "个人信息", businessType = BusinessType.UPDATE)
// @PutMapping("/profile/updatePwd")
// @ResponseBody
// public AjaxResult updatePwd(String oldPassword, String newPassword)
// {
// SysUser user = getSysUser();
// if (!passwordService.matches(user, oldPassword))
// {
// return error("修改密码失败,旧密码错误");
// }
// if (passwordService.matches(user, newPassword))
// {
// return error("新密码不能与旧密码相同");
// }
// user.setSalt(ShiroUtils.randomSalt());
// user.setPassword(passwordService.encryptPassword(user.getLoginName(), newPassword, user.getSalt()));
// user.setPwdUpdateDate(DateUtils.getNowDate());
// if (userService.resetUserPwd(user) > 0)
// {
// setSysUser(userService.selectUserById(user.getUserId()));
// return success();
// }
// return error("修改密码异常,请联系管理员");
// }
//
// /**
// * 头像上传
// */
// @Log(title = "用户头像", businessType = BusinessType.UPDATE)
// @PostMapping("/profile/avatar")
// @ResponseBody
// public AjaxResult avatar(@RequestParam("avatarfile") MultipartFile file) throws IOException
// {
// if (!file.isEmpty())
// {
// SysUser currentUser = getSysUser();
// String avatar = FileUploadUtils.upload(ruoYiConfig.getAvatarPath(), file);
// currentUser.setAvatar(avatar);
// if (userService.updateUserInfo(currentUser) > 0)
// {
// setSysUser(currentUser);
// return AjaxResult.success().put("imgUrl", avatar);
// }
// }
// return error();
// }
}

View File

@ -125,4 +125,4 @@ public class OmsWarehouseInfoController extends BaseController
{
return toAjax(omsWarehouseInfoService.deleteOmsWarehouseInfoByIds(ids));
}
}
}

View File

@ -227,4 +227,4 @@ public class VendorInfoController extends BaseController
log.error("下载文件失败", e);
}
}
}
}

View File

@ -0,0 +1,94 @@
package com.ruoyi.sip.controller.vue;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.core.text.Convert;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.sip.domain.AgentInfo;
import com.ruoyi.sip.service.IAgentInfoService;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
* Controller for Vue
*
* @author mula
* @date 2025-05-13
*/
@RestController
@RequestMapping("/system/agent/vue")
public class VueAgentInfoController extends BaseController {
@Autowired
private IAgentInfoService agentInfoService;
/**
*
*/
@RequiresPermissions("system:agent:list")
@GetMapping("/list")
public TableDataInfo list(AgentInfo agentInfo) {
startPage();
List<AgentInfo> list = agentInfoService.selectAgentInfoList(agentInfo);
return getDataTable(list);
}
/**
*
*/
@RequiresPermissions("system:agent:export")
@Log(title = "办事处信息", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public AjaxResult export(AgentInfo agentInfo) {
List<AgentInfo> list = agentInfoService.selectAgentInfoList(agentInfo);
ExcelUtil<AgentInfo> util = new ExcelUtil<AgentInfo>(AgentInfo.class);
return util.exportExcel(list, "办事处信息数据");
}
/**
*
*/
@RequiresPermissions("system:agent:query")
@GetMapping(value = "/{id}")
public AjaxResult getInfo(@PathVariable("id") Long id) {
return success(agentInfoService.selectAgentInfoById(id));
}
/**
*
*/
@RequiresPermissions("system:agent:add")
@Log(title = "办事处信息", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody AgentInfo agentInfo) {
return toAjax(agentInfoService.insertAgentInfo(agentInfo));
}
/**
*
*/
@RequiresPermissions("system:agent:edit")
@Log(title = "办事处信息", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody AgentInfo agentInfo) {
return toAjax(agentInfoService.updateAgentInfo(agentInfo));
}
/**
*
*/
@RequiresPermissions("system:agent:remove")
@Log(title = "办事处信息", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public AjaxResult remove(@PathVariable Long[] ids) {
return toAjax(agentInfoService.deleteAgentInfoByIds(Arrays.stream(ids).map(String::valueOf).collect(Collectors.joining(","))));
}
}

View File

@ -0,0 +1,92 @@
package com.ruoyi.sip.controller.vue;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.core.text.Convert;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.sip.domain.CustomerInfo;
import com.ruoyi.sip.service.ICustomerInfoService;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* Controller for Vue
*
* @author ruoyi
* @date 2025-05-14
*/
@RestController
@RequestMapping("/system/customer/vue")
public class VueCustomerInfoController extends BaseController {
@Autowired
private ICustomerInfoService customerInfoService;
/**
*
*/
@RequiresPermissions("system:customer:list")
@GetMapping("/list")
public TableDataInfo list(CustomerInfo customerInfo) {
startPage();
List<CustomerInfo> list = customerInfoService.selectCustomerInfoList(customerInfo);
return getDataTable(list);
}
/**
*
*/
@RequiresPermissions("system:customer:export")
@Log(title = "客户信息", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public AjaxResult export(CustomerInfo customerInfo) {
List<CustomerInfo> list = customerInfoService.selectCustomerInfoList(customerInfo);
ExcelUtil<CustomerInfo> util = new ExcelUtil<CustomerInfo>(CustomerInfo.class);
return util.exportExcel(list, "客户信息数据");
}
/**
*
*/
@RequiresPermissions("system:customer:query")
@GetMapping(value = "/{id}")
public AjaxResult getInfo(@PathVariable("id") Long id) {
return success(customerInfoService.selectCustomerInfoById(id));
}
/**
*
*/
@RequiresPermissions("system:customer:add")
@Log(title = "客户信息", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody CustomerInfo customerInfo) {
return toAjax(customerInfoService.insertCustomerInfo(customerInfo));
}
/**
*
*/
@RequiresPermissions("system:customer:edit")
@Log(title = "客户信息", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody CustomerInfo customerInfo) {
return toAjax(customerInfoService.updateCustomerInfo(customerInfo));
}
/**
*
*/
@RequiresPermissions("system:customer:remove")
@Log(title = "客户信息", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public AjaxResult remove(@PathVariable String ids) {
return toAjax(customerInfoService.deleteCustomerInfoByIds(ids));
}
}

View File

@ -0,0 +1,91 @@
package com.ruoyi.sip.controller.vue;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.sip.domain.PartnerInfo;
import com.ruoyi.sip.service.IPartnerInfoService;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* Controller (Vue)
*
* @author mula
* @date 2025-04-30
*/
@RestController
@RequestMapping("/system/partner/vue")
public class VuePartnerInfoController extends BaseController {
@Autowired
private IPartnerInfoService partnerInfoService;
/**
*
*/
@RequiresPermissions("system:partner:list")
@GetMapping("/list")
public TableDataInfo list(PartnerInfo partnerInfo) {
startPage();
List<PartnerInfo> list = partnerInfoService.selectPartnerInfoList(partnerInfo);
return getDataTable(list);
}
/**
*
*/
@RequiresPermissions("system:partner:query")
@GetMapping(value = "/{id}")
public AjaxResult getInfo(@PathVariable("id") Long id) {
return success(partnerInfoService.selectPartnerInfoById(id));
}
/**
*
*/
@RequiresPermissions("system:partner:add")
@Log(title = "代理商管理", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody PartnerInfo partnerInfo) {
return toAjax(partnerInfoService.insertPartnerInfo(partnerInfo));
}
/**
*
*/
@RequiresPermissions("system:partner:edit")
@Log(title = "代理商管理", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody PartnerInfo partnerInfo) {
return toAjax(partnerInfoService.updatePartnerInfo(partnerInfo));
}
/**
*
*/
@RequiresPermissions("system:partner:remove")
@Log(title = "代理商管理", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public AjaxResult remove(@PathVariable String ids) {
return toAjax(partnerInfoService.deletePartnerInfoByIds(ids));
}
/**
*
*/
@RequiresPermissions("system:partner:export")
@Log(title = "代理商管理", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public AjaxResult export(@RequestBody PartnerInfo partnerInfo) {
List<PartnerInfo> list = partnerInfoService.selectPartnerInfoList(partnerInfo);
ExcelUtil<PartnerInfo> util = new ExcelUtil<>(PartnerInfo.class);
return util.exportExcel(list, "代理商管理数据");
}
}

View File

@ -0,0 +1,91 @@
package com.ruoyi.sip.controller.vue;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.sip.domain.ProductInfo;
import com.ruoyi.sip.service.IProductInfoService;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* Controller (Vue)
*
* @author mula
* @date 2025-04-11
*/
@RestController
@RequestMapping("/system/product/vue")
public class VueProductInfoController extends BaseController {
@Autowired
private IProductInfoService productInfoService;
/**
*
*/
@RequiresPermissions("system:product:list")
@GetMapping("/list")
public TableDataInfo list(ProductInfo productInfo) {
startPage();
List<ProductInfo> list = productInfoService.selectProductInfoList(productInfo);
return getDataTable(list);
}
/**
*
*/
@RequiresPermissions("system:product:query")
@GetMapping(value = "/{id}")
public AjaxResult getInfo(@PathVariable("id") Long id) {
return success(productInfoService.selectProductInfoById(id));
}
/**
*
*/
@RequiresPermissions("system:product:add")
@Log(title = "产品管理", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody ProductInfo productInfo) {
return toAjax(productInfoService.insertProductInfo(productInfo));
}
/**
*
*/
@RequiresPermissions("system:product:edit")
@Log(title = "产品管理", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody ProductInfo productInfo) {
return toAjax(productInfoService.updateProductInfo(productInfo));
}
/**
*
*/
@RequiresPermissions("system:product:remove")
@Log(title = "产品管理", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public AjaxResult remove(@PathVariable String ids) {
return toAjax(productInfoService.deleteProductInfoByIds(ids));
}
/**
*
*/
@RequiresPermissions("system:product:export")
@Log(title = "产品管理", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public AjaxResult export(@RequestBody ProductInfo productInfo) {
List<ProductInfo> list = productInfoService.selectProductInfoList(productInfo);
ExcelUtil<ProductInfo> util = new ExcelUtil<>(ProductInfo.class);
return util.exportExcel(list, "产品管理数据");
}
}

View File

@ -0,0 +1,86 @@
package com.ruoyi.sip.controller.vue;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.sip.domain.VendorInfo;
import com.ruoyi.sip.service.IVendorInfoService;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* Controller (Vue)
*
* @author ruoyi
*/
@RestController
@RequestMapping("/system/vendor/vue")
public class VueVendorInfoController extends BaseController {
@Autowired
private IVendorInfoService vendorInfoService;
/**
*
*/
@RequiresPermissions("system:vendor:list")
@GetMapping("/list")
public TableDataInfo list(VendorInfo vendorInfo) {
startPage();
List<VendorInfo> list = vendorInfoService.selectVendorInfoList(vendorInfo);
return getDataTable(list);
}
/**
*
*/
@RequiresPermissions("system:vendor:query")
@GetMapping(value = "/{vendorId}")
public AjaxResult getInfo(@PathVariable("vendorId") Long vendorId) {
return AjaxResult.success(vendorInfoService.selectVendorInfoByVendorId(vendorId));
}
/**
*
*/
@RequiresPermissions("system:vendor:add")
@Log(title = "制造商信息", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody VendorInfo vendorInfo) {
return toAjax(vendorInfoService.insertVendorInfo(vendorInfo));
}
/**
*
*/
@RequiresPermissions("system:vendor:edit")
@Log(title = "制造商信息", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody VendorInfo vendorInfo) {
return toAjax(vendorInfoService.updateVendorInfo(vendorInfo));
}
/**
*
*/
@RequiresPermissions("system:vendor:remove")
@Log(title = "制造商信息", businessType = BusinessType.DELETE)
@DeleteMapping("/{vendorIds}")
public AjaxResult remove(@PathVariable String vendorIds) {
return toAjax(vendorInfoService.deleteVendorInfoByVendorIds(vendorIds));
}
/**
*
*/
@GetMapping("/listAll")
public AjaxResult listAll() {
List<VendorInfo> list = vendorInfoService.selectVendorInfoList(new VendorInfo());
return AjaxResult.success(list);
}
}

View File

@ -0,0 +1,93 @@
package com.ruoyi.sip.controller.vue;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.sip.domain.OmsWarehouseInfo;
import com.ruoyi.sip.service.IOmsWarehouseInfoService;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* Controller (Vue)
*
* @author ruoyi
*/
@RestController
@RequestMapping("/warehouse/info/vue")
public class VueWarehouseInfoController extends BaseController {
@Autowired
private IOmsWarehouseInfoService omsWarehouseInfoService;
/**
*
*/
@RequiresPermissions("warehouse:info:list")
@GetMapping("/list")
public TableDataInfo list(OmsWarehouseInfo omsWarehouseInfo)
{
startPage();
List<OmsWarehouseInfo> list = omsWarehouseInfoService.list(omsWarehouseInfo);
return getDataTable(list);
}
/**
*
*/
@RequiresPermissions("warehouse:info:query")
@GetMapping(value = "/{id}")
public AjaxResult getInfo(@PathVariable("id") Long id)
{
return success(omsWarehouseInfoService.selectOmsWarehouseInfoById(id));
}
/**
*
*/
@RequiresPermissions("warehouse:info:add")
@Log(title = "仓库基础信息", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody OmsWarehouseInfo omsWarehouseInfo)
{
return toAjax(omsWarehouseInfoService.insertOmsWarehouseInfo(omsWarehouseInfo));
}
/**
*
*/
@RequiresPermissions("warehouse:info:edit")
@Log(title = "仓库基础信息", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody OmsWarehouseInfo omsWarehouseInfo)
{
return toAjax(omsWarehouseInfoService.updateOmsWarehouseInfo(omsWarehouseInfo));
}
/**
*
*/
@RequiresPermissions("warehouse:info:remove")
@Log(title = "仓库基础信息", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public AjaxResult remove(@PathVariable String ids)
{
return toAjax(omsWarehouseInfoService.deleteOmsWarehouseInfoByIds(ids));
}
/**
*
*/
@GetMapping("/listAll")
public AjaxResult listAll() {
OmsWarehouseInfo params = new OmsWarehouseInfo();
params.setWarehouseStatus(OmsWarehouseInfo.WarehouseStatusEnum.NORMAL.getValue());
List<OmsWarehouseInfo> list = omsWarehouseInfoService.list(params);
return AjaxResult.success(list);
}
}