feat(invoice): 实现发票申请功能优化

- 将销售方名称改为下拉选择框,支持公司信息自动填充
- 新增公司信息管理模块,包含增删改查功能
- 集成公司信息API接口,支持公司列表查询
- 实现销售方银行信息自动填充功能
- 优化发票申请表单,支持银行信息自动带入
- 更新发票状态筛选,使用字典数据动态渲染选项
- 添加公司信息详情查看功能
- 实现发票备注信息自动生成,包含购销双方银行信息
dev_1.0.1
chenhao 2025-12-26 10:28:52 +08:00
parent 389deac133
commit 5ead2c13b2
14 changed files with 1388 additions and 157 deletions

View File

@ -0,0 +1,44 @@
import request from '@/utils/request'
// 查询公司信息列表
export function listCompanyInfo(query) {
return request({
url: '/sip/companyInfo/list',
method: 'get',
params: query
})
}
// 查询公司信息详细
export function getCompanyInfo(id) {
return request({
url: '/sip/companyInfo/' + id,
method: 'get'
})
}
// 新增公司信息
export function addCompanyInfo(data) {
return request({
url: '/sip/companyInfo',
method: 'post',
data: data
})
}
// 修改公司信息
export function updateCompanyInfo(data) {
return request({
url: '/sip/companyInfo',
method: 'put',
data: data
})
}
// 删除公司信息
export function delCompanyInfo(id) {
return request({
url: '/sip/companyInfo/' + id,
method: 'delete'
})
}

View File

@ -56,7 +56,21 @@
<div class="column-label">销售方<br>信息</div> <div class="column-label">销售方<br>信息</div>
<div class="column-content"> <div class="column-content">
<el-form-item label="名称" prop="sellerName" class="condensed-item"> <el-form-item label="名称" prop="sellerName" class="condensed-item">
<el-input v-model="form.sellerName" placeholder="请输入名称"/> <el-select
v-model="form.sellerName"
placeholder="请输入名称"
filterable
clearable
@change="handleSellerChange"
style="width: 100%"
>
<el-option
v-for="item in companyOptions"
:key="item.id"
:label="item.companyName"
:value="item.companyName"
/>
</el-select>
</el-form-item> </el-form-item>
<el-form-item label="统一社会信用代码/纳税人识别号" prop="sellerCreditCode" <el-form-item label="统一社会信用代码/纳税人识别号" prop="sellerCreditCode"
class="condensed-item label-wrap"> class="condensed-item label-wrap">
@ -159,6 +173,7 @@
<script> <script>
import {getInvoiceProducts, applyInvoice} from "@/api/finance/invoice"; import {getInvoiceProducts, applyInvoice} from "@/api/finance/invoice";
import { listCompanyInfo } from "@/api/system/companyInfo";
export default { export default {
name: "ApplyInvoice", name: "ApplyInvoice",
@ -176,12 +191,17 @@ export default {
data() { data() {
return { return {
loading: false, loading: false,
companyOptions: [],
form: { form: {
invoiceType: this.rowData.invoiceType || '-', invoiceType: this.rowData.invoiceType || '-',
buyerName: undefined, buyerName: undefined,
buyerCreditCode: undefined, buyerCreditCode: undefined,
buyerBank: undefined,
buyerBankAccount: undefined,
sellerName: undefined, sellerName: undefined,
sellerCreditCode: undefined, sellerCreditCode: undefined,
sellerBank: undefined,
sellerBankAccount: undefined,
remark: undefined, remark: undefined,
invoiceBillCode: this.rowData.invoiceBillCode, invoiceBillCode: this.rowData.invoiceBillCode,
detailList: [ detailList: [
@ -205,6 +225,9 @@ export default {
} }
}; };
}, },
created() {
this.getCompanyList();
},
computed: { computed: {
totalAmountNumber() { totalAmountNumber() {
let total = 0; let total = 0;
@ -228,13 +251,27 @@ export default {
} }
}, },
methods: { methods: {
getCompanyList() {
listCompanyInfo().then(response => {
this.companyOptions = response.rows;
if (this.visible && !this.form.sellerName && this.companyOptions.length > 0) {
const defaultCompany = this.companyOptions[0];
this.form.sellerName = defaultCompany.companyName;
this.handleSellerChange(defaultCompany.companyName);
}
});
},
reset() { reset() {
this.form = { this.form = {
invoiceType: 'ELECTRONIC', invoiceType: 'ELECTRONIC',
buyerName: undefined, buyerName: undefined,
buyerCreditCode: undefined, buyerCreditCode: undefined,
buyerBank: undefined,
buyerBankAccount: undefined,
sellerName: undefined, sellerName: undefined,
sellerCreditCode: undefined, sellerCreditCode: undefined,
sellerBank: undefined,
sellerBankAccount: undefined,
remark: undefined, remark: undefined,
detailList: [] detailList: []
}; };
@ -246,12 +283,22 @@ export default {
this.form.buyerCreditCode = this.rowData.buyerCreditCode ; this.form.buyerCreditCode = this.rowData.buyerCreditCode ;
this.form.buyerBank = this.rowData.buyerBank ; this.form.buyerBank = this.rowData.buyerBank ;
this.form.buyerBankAccount = this.rowData.buyerBankAccount ; this.form.buyerBankAccount = this.rowData.buyerBankAccount ;
this.form.sellerName = this.rowData.sellerName || "紫光汇智信息技术有限公司";
this.form.sellerCreditCode = this.rowData.sellerCreditCode || "91500108MA6078GXXQ"; if (this.rowData.sellerName) {
this.form.sellerName = this.rowData.sellerName;
this.form.sellerCreditCode = this.rowData.sellerCreditCode;
this.form.sellerBank = this.rowData.sellerBank; this.form.sellerBank = this.rowData.sellerBank;
this.form.sellerBankAccount = this.rowData.sellerBankAccount; this.form.sellerBankAccount = this.rowData.sellerBankAccount;
} else if (this.companyOptions.length > 0) {
const defaultCompany = this.companyOptions[0];
this.form.sellerName = defaultCompany.companyName;
this.handleSellerChange(defaultCompany.companyName);
}
this.form.invoiceBillCode = this.rowData.invoiceBillCode; this.form.invoiceBillCode = this.rowData.invoiceBillCode;
this.updateRemark();
if (this.rowData.invoiceBillCode) { if (this.rowData.invoiceBillCode) {
getInvoiceProducts(this.rowData.invoiceBillCode).then(response => { getInvoiceProducts(this.rowData.invoiceBillCode).then(response => {
if (response.data && response.data.length > 0) { if (response.data && response.data.length > 0) {
@ -278,6 +325,22 @@ export default {
} }
} }
}, },
handleSellerChange(val) {
const company = this.companyOptions.find(item => item.companyName === val);
if (company) {
this.form.sellerCreditCode = company.socialCredit;
this.form.sellerBank = company.payBankOpenAddress;
this.form.sellerBankAccount = company.payBankNumber;
this.updateRemark();
}
},
updateRemark() {
const bBank = this.form.buyerBank || '';
const bAccount = this.form.buyerBankAccount || '';
const sBank = this.form.sellerBank || '';
const sAccount = this.form.sellerBankAccount || '';
this.form.remark = `购方开户银行 : ${bBank} 银行账号 ${bAccount}\n销方开户银行 ${sBank} 银行账号 ${sAccount}`;
},
handleClose() { handleClose() {
this.$emit("update:visible", false); this.$emit("update:visible", false);
}, },

View File

@ -48,16 +48,22 @@
</el-form-item> </el-form-item>
<el-form-item label="审批状态" prop="approveStatus"> <el-form-item label="审批状态" prop="approveStatus">
<el-select v-model="queryParams.approveStatus" placeholder="请选择审批状态" clearable> <el-select v-model="queryParams.approveStatus" placeholder="请选择审批状态" clearable>
<el-option label="待提交" value="0" /> <el-option
<el-option label="审批中" value="1" /> v-for="dict in dict.type.approve_status"
<el-option label="已审批" value="2" /> :key="dict.value"
<el-option label="已驳回" value="3" /> :label="dict.label"
:value="dict.value"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="收票状态" prop="invoiceStatus"> <el-form-item label="收票状态" prop="invoiceStatus">
<el-select v-model="queryParams.invoiceStatus" placeholder="请选择收票状态" clearable> <el-select v-model="queryParams.invoiceStatus" placeholder="请选择收票状态" clearable>
<el-option label="待收票" value="0" /> <el-option
<el-option label="已收票" value="1" /> v-for="dict in dict.type.invoice_status"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="审批节点" prop="approveNode"> <el-form-item label="审批节点" prop="approveNode">

View File

@ -0,0 +1,405 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="公司名称" prop="companyName">
<el-input
v-model="queryParams.companyName"
placeholder="请输入公司名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="公司编码" prop="companyCode">
<el-input
v-model="queryParams.companyCode"
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="['sip:companyInfo: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="['sip:companyInfo: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="['sip:companyInfo: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="['sip:companyInfo:export']"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="companyInfoList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<!-- <el-table-column label="公司编码" align="center" prop="companyCode" />-->
<el-table-column label="公司名称" align="center" prop="companyName" />
<el-table-column label="联系用户" align="center" prop="companyUser" />
<el-table-column label="联系电话" align="center" prop="companyPhone" />
<el-table-column label="联系邮箱" align="center" prop="companyEmail" />
<el-table-column label="公司地址" align="center" prop="companyAddress" show-overflow-tooltip />
<el-table-column label="账户名称" align="center" prop="payName" />
<el-table-column label="银行卡号" align="center" prop="payBankNumber" />
<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-view"
@click="handleView(scope.row)"
v-hasPermi="['sip:companyInfo:query']"
>详情</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['sip:companyInfo:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['sip:companyInfo: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="140px">
<el-row>
<!-- <el-col :span="12">-->
<!-- <el-form-item label="公司编码" prop="companyCode">-->
<!-- <el-input v-model="form.companyCode" placeholder="请输入公司编码" />-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<el-col :span="12">
<el-form-item label="公司名称" prop="companyName">
<el-input v-model="form.companyName" placeholder="请输入公司名称" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="联系用户" prop="companyUser">
<el-input v-model="form.companyUser" placeholder="请输入联系用户" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="联系电话" prop="companyPhone">
<el-input v-model="form.companyPhone" placeholder="请输入联系电话" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="联系邮箱" prop="companyEmail">
<el-input v-model="form.companyEmail" placeholder="请输入联系邮箱" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="统一社会信用代码" prop="socialCredit">
<el-input v-model="form.socialCredit" placeholder="请输入统一社会信用代码" />
</el-form-item>
</el-col>
</el-row>
<el-form-item label="公司地址" prop="companyAddress">
<el-input v-model="form.companyAddress" placeholder="请输入公司地址" />
</el-form-item>
<el-row>
<el-col :span="12">
<el-form-item label="账户名称" prop="payName">
<el-input v-model="form.payName" placeholder="请输入账户名称" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="银行卡号" prop="payBankNumber">
<el-input v-model="form.payBankNumber" placeholder="请输入银行卡号" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="银行开户行" prop="payBankOpenAddress">
<el-input v-model="form.payBankOpenAddress" placeholder="请输入银行开户行" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="银行行号" prop="bankNumber">
<el-input v-model="form.bankNumber" placeholder="请输入银行行号" />
</el-form-item>
</el-col>
</el-row>
</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>
<!-- 公司信息详情对话框 -->
<el-dialog title="公司信息详情" :visible.sync="detailOpen" width="800px" append-to-body>
<el-form ref="detailForm" :model="detailForm" label-width="140px" size="mini">
<el-row>
<!-- <el-col :span="12">-->
<!-- <el-form-item label="公司编码:">{{ detailForm.companyCode }}</el-form-item>-->
<!-- </el-col>-->
<el-col :span="12">
<el-form-item label="公司名称:">{{ detailForm.companyName }}</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="联系用户:">{{ detailForm.companyUser }}</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="联系电话:">{{ detailForm.companyPhone }}</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="联系邮箱:">{{ detailForm.companyEmail }}</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="统一社会信用代码:">{{ detailForm.socialCredit }}</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="公司地址:">{{ detailForm.companyAddress }}</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="账户名称:">{{ detailForm.payName }}</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="银行卡号:">{{ detailForm.payBankNumber }}</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="银行开户行:">{{ detailForm.payBankOpenAddress }}</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="银行行号:">{{ detailForm.bankNumber }}</el-form-item>
</el-col>
</el-row>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="detailOpen = false"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listCompanyInfo, getCompanyInfo, delCompanyInfo, addCompanyInfo, updateCompanyInfo } from "@/api/system/companyInfo";
export default {
name: "CompanyInfo",
data() {
return {
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
companyInfoList: [],
//
title: "",
//
open: false,
//
detailOpen: false,
detailForm: {},
//
queryParams: {
pageNum: 1,
pageSize: 10,
companyName: null,
companyCode: null,
},
//
form: {},
//
rules: {
companyName: [
{ required: true, message: "公司名称不能为空", trigger: "blur" }
],
// companyCode: [
// { required: true, message: "", trigger: "blur" }
// ],
}
};
},
created() {
this.getList();
},
methods: {
/** 查询公司信息列表 */
getList() {
this.loading = true;
listCompanyInfo(this.queryParams).then(response => {
this.companyInfoList = response.rows;
this.total = response.total;
this.loading = false;
});
},
//
cancel() {
this.open = false;
this.reset();
},
//
reset() {
this.form = {
id: null,
companyName: null,
companyCode: null,
companyUser: null,
companyEmail: null,
companyPhone: null,
companyAddress: null,
payBankNumber: null,
payBankOpenAddress: null,
bankNumber: null,
socialCredit: null,
payName: 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
getCompanyInfo(id).then(response => {
this.form = response.data;
this.open = true;
this.title = "修改公司信息";
});
},
/** 详情按钮操作 */
handleView(row) {
this.detailForm = row;
this.detailOpen = true;
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
updateCompanyInfo(this.form).then(response => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
});
} else {
addCompanyInfo(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 delCompanyInfo(ids);
}).then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
}).catch(() => {});
},
/** 导出按钮操作 */
handleExport() {
this.download('sip/companyInfo/export', {
...this.queryParams
}, `companyInfo_${new Date().getTime()}.xlsx`)
}
}
};
</script>

View File

@ -141,7 +141,7 @@
<!-- 添加或修改代理商管理对话框 --> <!-- 添加或修改代理商管理对话框 -->
<el-dialog :title="title" :visible.sync="open" :close-on-click-modal="false" width="800px" append-to-body> <el-dialog :title="title" :visible.sync="open" :close-on-click-modal="false" width="800px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="110px"> <el-form ref="form" :model="form" :rules="rules" label-width="140px">
<el-row> <el-row>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="代理商编码" prop="partnerCode"> <el-form-item label="代理商编码" prop="partnerCode">
@ -223,6 +223,37 @@
<el-form-item label="地址" prop="address"> <el-form-item label="地址" prop="address">
<el-input v-model="form.address" type="textarea" placeholder="请输入详细地址" /> <el-input v-model="form.address" type="textarea" placeholder="请输入详细地址" />
</el-form-item> </el-form-item>
<el-row>
<el-col :span="12">
<el-form-item label="统一社会信用代码" prop="socialCredit">
<el-input v-model="form.socialCredit" placeholder="请输入统一社会信用代码" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="账户名称" prop="payName">
<el-input v-model="form.payName" placeholder="请输入账户名称" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="银行卡号" prop="payBankNumber">
<el-input v-model="form.payBankNumber" placeholder="请输入银行卡号" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="开户行" prop="payBankOpenAddress">
<el-input v-model="form.payBankOpenAddress" placeholder="请输入开户行" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="银行行号" prop="bankNumber">
<el-input v-model="form.bankNumber" placeholder="请输入银行行号" />
</el-form-item>
</el-col>
</el-row>
</el-form> </el-form>
<div slot="footer" class="dialog-footer"> <div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button> <el-button type="primary" @click="submitForm"> </el-button>
@ -396,6 +427,11 @@ export default {
level: null, level: null,
systemUserId: null, systemUserId: null,
systemUserName: null, systemUserName: null,
payName: null,
payBankNumber: null,
payBankOpenAddress: null,
bankNumber: null,
socialCredit: null,
createAt: null, createAt: null,
updatedAt: null updatedAt: null
}; };

View File

@ -0,0 +1,105 @@
package com.ruoyi.sip.controller;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.sip.domain.OmsCompanyInfo;
import com.ruoyi.sip.service.IOmsCompanyInfoService;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.core.page.TableDataInfo;
/**
* Controller
*
* @author mula
* @date 2025-04-30
*/
@RestController
@RequestMapping("/sip/companyInfo")
public class OmsCompanyInfoController extends BaseController
{
@Autowired
private IOmsCompanyInfoService omsCompanyInfoService;
/**
*
*/
@RequiresPermissions("sip:companyInfo:list")
@GetMapping("/list")
public TableDataInfo list(OmsCompanyInfo omsCompanyInfo)
{
startPage();
List<OmsCompanyInfo> list = omsCompanyInfoService.selectOmsCompanyInfoList(omsCompanyInfo);
return getDataTable(list);
}
/**
*
*/
@RequiresPermissions("sip:companyInfo:export")
@Log(title = "公司信息", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, OmsCompanyInfo omsCompanyInfo)
{
List<OmsCompanyInfo> list = omsCompanyInfoService.selectOmsCompanyInfoList(omsCompanyInfo);
ExcelUtil<OmsCompanyInfo> util = new ExcelUtil<OmsCompanyInfo>(OmsCompanyInfo.class);
util.exportExcel(response, list, "公司信息数据");
}
/**
*
*/
@RequiresPermissions("sip:companyInfo:query")
@GetMapping(value = "/{id}")
public AjaxResult getInfo(@PathVariable("id") Long id)
{
return AjaxResult.success(omsCompanyInfoService.selectOmsCompanyInfoById(id));
}
/**
*
*/
@RequiresPermissions("sip:companyInfo:add")
@Log(title = "公司信息", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody OmsCompanyInfo omsCompanyInfo)
{
return toAjax(omsCompanyInfoService.insertOmsCompanyInfo(omsCompanyInfo));
}
/**
*
*/
@RequiresPermissions("sip:companyInfo:edit")
@Log(title = "公司信息", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody OmsCompanyInfo omsCompanyInfo)
{
return toAjax(omsCompanyInfoService.updateOmsCompanyInfo(omsCompanyInfo));
}
/**
*
*/
@RequiresPermissions("sip:companyInfo:remove")
@Log(title = "公司信息", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public AjaxResult remove(@PathVariable Long[] ids)
{
return toAjax(omsCompanyInfoService.deleteOmsCompanyInfoByIds(ids));
}
}

View File

@ -0,0 +1,191 @@
package com.ruoyi.sip.domain;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
/**
* oms_company_info
*
* @author mula
* @date 2025-04-30
*/
public class OmsCompanyInfo extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** 主键 */
private Long id;
/** 公司名称 */
@Excel(name = "公司名称")
private String companyName;
/** 公司编码 */
@Excel(name = "公司编码")
private String companyCode;
/** 联系用户 */
@Excel(name = "联系用户")
private String companyUser;
/** 联系邮箱 */
@Excel(name = "联系邮箱")
private String companyEmail;
/** 联系电话 */
@Excel(name = "联系电话")
private String companyPhone;
/** 公司地址 */
@Excel(name = "公司地址")
private String companyAddress;
/** 银行卡号 */
@Excel(name = "银行卡号")
private String payBankNumber;
/** 银行开户行 */
@Excel(name = "银行开户行")
private String payBankOpenAddress;
/** 银行行号 */
@Excel(name = "银行行号")
private String bankNumber;
/** 统一社会信用代码 */
@Excel(name = "统一社会信用代码")
private String socialCredit;
/** 账户名称 */
@Excel(name = "账户名称")
private String payName;
public void setId(Long id)
{
this.id = id;
}
public Long getId()
{
return id;
}
public void setCompanyName(String companyName)
{
this.companyName = companyName;
}
public String getCompanyName()
{
return companyName;
}
public void setCompanyCode(String companyCode)
{
this.companyCode = companyCode;
}
public String getCompanyCode()
{
return companyCode;
}
public void setCompanyUser(String companyUser)
{
this.companyUser = companyUser;
}
public String getCompanyUser()
{
return companyUser;
}
public void setCompanyEmail(String companyEmail)
{
this.companyEmail = companyEmail;
}
public String getCompanyEmail()
{
return companyEmail;
}
public void setCompanyPhone(String companyPhone)
{
this.companyPhone = companyPhone;
}
public String getCompanyPhone()
{
return companyPhone;
}
public void setCompanyAddress(String companyAddress)
{
this.companyAddress = companyAddress;
}
public String getCompanyAddress()
{
return companyAddress;
}
public void setPayBankNumber(String payBankNumber)
{
this.payBankNumber = payBankNumber;
}
public String getPayBankNumber()
{
return payBankNumber;
}
public void setPayBankOpenAddress(String payBankOpenAddress)
{
this.payBankOpenAddress = payBankOpenAddress;
}
public String getPayBankOpenAddress()
{
return payBankOpenAddress;
}
public void setBankNumber(String bankNumber)
{
this.bankNumber = bankNumber;
}
public String getBankNumber()
{
return bankNumber;
}
public void setSocialCredit(String socialCredit)
{
this.socialCredit = socialCredit;
}
public String getSocialCredit()
{
return socialCredit;
}
public void setPayName(String payName)
{
this.payName = payName;
}
public String getPayName()
{
return payName;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
.append("id", getId())
.append("companyName", getCompanyName())
.append("companyCode", getCompanyCode())
.append("companyUser", getCompanyUser())
.append("companyEmail", getCompanyEmail())
.append("companyPhone", getCompanyPhone())
.append("companyAddress", getCompanyAddress())
.append("payBankNumber", getPayBankNumber())
.append("payBankOpenAddress", getPayBankOpenAddress())
.append("bankNumber", getBankNumber())
.append("socialCredit", getSocialCredit())
.append("payName", getPayName())
.toString();
}
}

View File

@ -69,6 +69,15 @@ public class PartnerInfo extends BaseEntity
/** */ /** */
private Integer status; private Integer status;
//账户名称
private String payName;
//银行卡号
private String payBankNumber;
//开户行
private String payBankOpenAddress;
//银行行号
private String bankNumber;
//统一社会信用代码
private String socialCredit;
} }

View File

@ -0,0 +1,61 @@
package com.ruoyi.sip.mapper;
import java.util.List;
import com.ruoyi.sip.domain.OmsCompanyInfo;
/**
* Mapper
*
* @author mula
* @date 2025-04-30
*/
public interface OmsCompanyInfoMapper
{
/**
*
*
* @param id
* @return
*/
public OmsCompanyInfo selectOmsCompanyInfoById(Long id);
/**
*
*
* @param omsCompanyInfo
* @return
*/
public List<OmsCompanyInfo> selectOmsCompanyInfoList(OmsCompanyInfo omsCompanyInfo);
/**
*
*
* @param omsCompanyInfo
* @return
*/
public int insertOmsCompanyInfo(OmsCompanyInfo omsCompanyInfo);
/**
*
*
* @param omsCompanyInfo
* @return
*/
public int updateOmsCompanyInfo(OmsCompanyInfo omsCompanyInfo);
/**
*
*
* @param id
* @return
*/
public int deleteOmsCompanyInfoById(Long id);
/**
*
*
* @param ids
* @return
*/
public int deleteOmsCompanyInfoByIds(Long[] ids);
}

View File

@ -0,0 +1,61 @@
package com.ruoyi.sip.service;
import java.util.List;
import com.ruoyi.sip.domain.OmsCompanyInfo;
/**
* Service
*
* @author mula
* @date 2025-04-30
*/
public interface IOmsCompanyInfoService
{
/**
*
*
* @param id
* @return
*/
public OmsCompanyInfo selectOmsCompanyInfoById(Long id);
/**
*
*
* @param omsCompanyInfo
* @return
*/
public List<OmsCompanyInfo> selectOmsCompanyInfoList(OmsCompanyInfo omsCompanyInfo);
/**
*
*
* @param omsCompanyInfo
* @return
*/
public int insertOmsCompanyInfo(OmsCompanyInfo omsCompanyInfo);
/**
*
*
* @param omsCompanyInfo
* @return
*/
public int updateOmsCompanyInfo(OmsCompanyInfo omsCompanyInfo);
/**
*
*
* @param ids
* @return
*/
public int deleteOmsCompanyInfoByIds(Long[] ids);
/**
*
*
* @param id
* @return
*/
public int deleteOmsCompanyInfoById(Long id);
}

View File

@ -0,0 +1,93 @@
package com.ruoyi.sip.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.sip.mapper.OmsCompanyInfoMapper;
import com.ruoyi.sip.domain.OmsCompanyInfo;
import com.ruoyi.sip.service.IOmsCompanyInfoService;
/**
* Service
*
* @author mula
* @date 2025-04-30
*/
@Service
public class OmsCompanyInfoServiceImpl implements IOmsCompanyInfoService
{
@Autowired
private OmsCompanyInfoMapper omsCompanyInfoMapper;
/**
*
*
* @param id
* @return
*/
@Override
public OmsCompanyInfo selectOmsCompanyInfoById(Long id)
{
return omsCompanyInfoMapper.selectOmsCompanyInfoById(id);
}
/**
*
*
* @param omsCompanyInfo
* @return
*/
@Override
public List<OmsCompanyInfo> selectOmsCompanyInfoList(OmsCompanyInfo omsCompanyInfo)
{
return omsCompanyInfoMapper.selectOmsCompanyInfoList(omsCompanyInfo);
}
/**
*
*
* @param omsCompanyInfo
* @return
*/
@Override
public int insertOmsCompanyInfo(OmsCompanyInfo omsCompanyInfo)
{
return omsCompanyInfoMapper.insertOmsCompanyInfo(omsCompanyInfo);
}
/**
*
*
* @param omsCompanyInfo
* @return
*/
@Override
public int updateOmsCompanyInfo(OmsCompanyInfo omsCompanyInfo)
{
return omsCompanyInfoMapper.updateOmsCompanyInfo(omsCompanyInfo);
}
/**
*
*
* @param ids
* @return
*/
@Override
public int deleteOmsCompanyInfoByIds(Long[] ids)
{
return omsCompanyInfoMapper.deleteOmsCompanyInfoByIds(ids);
}
/**
*
*
* @param id
* @return
*/
@Override
public int deleteOmsCompanyInfoById(Long id)
{
return omsCompanyInfoMapper.deleteOmsCompanyInfoById(id);
}
}

View File

@ -53,6 +53,11 @@ public class OmsReceivableBillServiceImpl implements IOmsReceivableBillService
@Autowired @Autowired
private IOmsReceivableInvoicePlanService invoicePlanService; private IOmsReceivableInvoicePlanService invoicePlanService;
@Autowired
private IPartnerInfoService partnerInfoService;
@Autowired
private IOmsCompanyInfoService companyInfoService;
@Autowired @Autowired
private IOmsReceivableInvoiceDetailService invoiceDetailService; private IOmsReceivableInvoiceDetailService invoiceDetailService;
@Value("${oms.inventory.innerTax:0.13}") @Value("${oms.inventory.innerTax:0.13}")
@ -342,7 +347,23 @@ public class OmsReceivableBillServiceImpl implements IOmsReceivableBillService
// Set Calculated Tax Info // Set Calculated Tax Info
invoiceBill.setTotalPriceWithoutTax(totalWithoutTax); invoiceBill.setTotalPriceWithoutTax(totalWithoutTax);
List<PartnerInfo> partnerInfos = partnerInfoService.selectPartnerInfoByCode(Collections.singletonList(firstReceivableBill.getPartnerCode()));
if (CollUtil.isNotEmpty(partnerInfos)){
PartnerInfo partnerInfo = partnerInfos.get(0);
invoiceBill.setBuyerName(partnerInfo.getPartnerName());
invoiceBill.setBuyerCreditCode(partnerInfo.getSocialCredit());
invoiceBill.setBuyerBank(partnerInfo.getPayBankOpenAddress());
invoiceBill.setBuyerBankAccount(partnerInfo.getPayBankNumber());
}
List<OmsCompanyInfo> omsCompanyInfos = companyInfoService.selectOmsCompanyInfoList(new OmsCompanyInfo());
if (CollUtil.isNotEmpty(omsCompanyInfos)){
//todo 后续多个公司 需确认取哪个公司信息 目前只有一个信息 所以默认取第一条数据
OmsCompanyInfo omsCompanyInfo = omsCompanyInfos.get(0);
invoiceBill.setSellerName(omsCompanyInfo.getCompanyName());
invoiceBill.setSellerCreditCode(omsCompanyInfo.getSocialCredit());
invoiceBill.setSellerBank(omsCompanyInfo.getPayBankOpenAddress());
invoiceBill.setSellerBankAccount(omsCompanyInfo.getPayBankNumber());
}
invoiceBill.setInvoiceBillType(OmsInvoiceBill.InvoiceBillTypeEnum.FROM_RECEIVABLE.getCode()); invoiceBill.setInvoiceBillType(OmsInvoiceBill.InvoiceBillTypeEnum.FROM_RECEIVABLE.getCode());
invoiceBill.setInvoiceStatus(OmsInvoiceBill.InvoiceStatusEnum.WAIT_INVOICE.getCode()); invoiceBill.setInvoiceStatus(OmsInvoiceBill.InvoiceStatusEnum.WAIT_INVOICE.getCode());
invoiceBillService.insertOmsInvoiceBill(invoiceBill); invoiceBillService.insertOmsInvoiceBill(invoiceBill);

View File

@ -0,0 +1,115 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.sip.mapper.OmsCompanyInfoMapper">
<resultMap type="OmsCompanyInfo" id="OmsCompanyInfoResult">
<result property="id" column="id" />
<result property="companyName" column="company_name" />
<result property="companyCode" column="company_code" />
<result property="companyUser" column="company_user" />
<result property="companyEmail" column="company_email" />
<result property="companyPhone" column="company_phone" />
<result property="companyAddress" column="company_address" />
<result property="payBankNumber" column="pay_bank_number" />
<result property="payBankOpenAddress" column="pay_bank_open_address" />
<result property="bankNumber" column="bank_number" />
<result property="socialCredit" column="social_credit" />
<result property="payName" column="pay_name" />
</resultMap>
<sql id="selectOmsCompanyInfoVo">
select id, company_name, company_code, company_user, company_email, company_phone, company_address,
pay_bank_number, pay_bank_open_address, bank_number, social_credit, pay_name
from oms_company_info
</sql>
<select id="selectOmsCompanyInfoList" parameterType="OmsCompanyInfo" resultMap="OmsCompanyInfoResult">
<include refid="selectOmsCompanyInfoVo"/>
<where>
<if test="companyName != null and companyName != ''"> and company_name like concat('%', #{companyName}, '%')</if>
<if test="companyCode != null and companyCode != ''"> and company_code = #{companyCode}</if>
<if test="companyUser != null and companyUser != ''"> and company_user like concat('%', #{companyUser}, '%')</if>
<if test="companyEmail != null and companyEmail != ''"> and company_email = #{companyEmail}</if>
<if test="companyPhone != null and companyPhone != ''"> and company_phone = #{companyPhone}</if>
<if test="companyAddress != null and companyAddress != ''"> and company_address like concat('%', #{companyAddress}, '%')</if>
<if test="payBankNumber != null and payBankNumber != ''"> and pay_bank_number = #{payBankNumber}</if>
<if test="payBankOpenAddress != null and payBankOpenAddress != ''"> and pay_bank_open_address = #{payBankOpenAddress}</if>
<if test="bankNumber != null and bankNumber != ''"> and bank_number = #{bankNumber}</if>
<if test="socialCredit != null and socialCredit != ''"> and social_credit = #{socialCredit}</if>
<if test="payName != null and payName != ''"> and pay_name = #{payName}</if>
</where>
</select>
<select id="selectOmsCompanyInfoById" parameterType="Long" resultMap="OmsCompanyInfoResult">
<include refid="selectOmsCompanyInfoVo"/>
where id = #{id}
</select>
<insert id="insertOmsCompanyInfo" parameterType="OmsCompanyInfo" useGeneratedKeys="true" keyProperty="id">
insert into oms_company_info
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="companyName != null and companyName != ''">company_name,</if>
<if test="companyCode != null and companyCode != ''">company_code,</if>
<if test="companyUser != null">company_user,</if>
<if test="companyEmail != null">company_email,</if>
<if test="companyPhone != null">company_phone,</if>
<if test="companyAddress != null">company_address,</if>
<if test="payBankNumber != null">pay_bank_number,</if>
<if test="payBankOpenAddress != null">pay_bank_open_address,</if>
<if test="bankNumber != null">bank_number,</if>
<if test="socialCredit != null">social_credit,</if>
<if test="payName != null">pay_name,</if>
<if test="createBy != null and createBy!=''">create_by,</if>
<if test="createTime != null">create_time,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="companyName != null and companyName != ''">#{companyName},</if>
<if test="companyCode != null and companyCode != ''">#{companyCode},</if>
<if test="companyUser != null">#{companyUser},</if>
<if test="companyEmail != null">#{companyEmail},</if>
<if test="companyPhone != null">#{companyPhone},</if>
<if test="companyAddress != null">#{companyAddress},</if>
<if test="payBankNumber != null">#{payBankNumber},</if>
<if test="payBankOpenAddress != null">#{payBankOpenAddress},</if>
<if test="bankNumber != null">#{bankNumber},</if>
<if test="socialCredit != null">#{socialCredit},</if>
<if test="payName != null">#{payName},</if>
<if test="createBy != null and createBy!=''">#{createBy},</if>
<if test="createTime != null">#{createTime},</if>
</trim>
</insert>
<update id="updateOmsCompanyInfo" parameterType="OmsCompanyInfo">
update oms_company_info
<trim prefix="SET" suffixOverrides=",">
<if test="companyName != null and companyName != ''">company_name = #{companyName},</if>
<if test="companyCode != null and companyCode != ''">company_code = #{companyCode},</if>
<if test="companyUser != null">company_user = #{companyUser},</if>
<if test="companyEmail != null">company_email = #{companyEmail},</if>
<if test="companyPhone != null">company_phone = #{companyPhone},</if>
<if test="companyAddress != null">company_address = #{companyAddress},</if>
<if test="payBankNumber != null">pay_bank_number = #{payBankNumber},</if>
<if test="payBankOpenAddress != null">pay_bank_open_address = #{payBankOpenAddress},</if>
<if test="bankNumber != null">bank_number = #{bankNumber},</if>
<if test="socialCredit != null">social_credit = #{socialCredit},</if>
<if test="payName != null">pay_name = #{payName},</if>
<if test="updateBy != null and updateBy!=''">update_by = #{updateBy},</if>
<if test="updateTime != null">update_time = #{updateTime},</if>
</trim>
where id = #{id}
</update>
<delete id="deleteOmsCompanyInfoById" parameterType="Long">
delete from oms_company_info where id = #{id}
</delete>
<delete id="deleteOmsCompanyInfoByIds" parameterType="String">
delete from oms_company_info where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
</mapper>

View File

@ -18,11 +18,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="updateAt" column="update_at" /> <result property="updateAt" column="update_at" />
<result property="deleteAt" column="delete_at" /> <result property="deleteAt" column="delete_at" />
<result property="status" column="status" /> <result property="status" column="status" />
<result property="payName" column="pay_name" />
<result property="payBankNumber" column="pay_bank_number" />
<result property="payBankOpenAddress" column="pay_bank_open_address" />
<result property="bankNumber" column="bank_number" />
<result property="socialCredit" column="social_credit" />
</resultMap> </resultMap>
<sql id="selectPartnerInfoVo"> <sql id="selectPartnerInfoVo">
select t1.id, t1.partner_code, t1.partner_name, t1.contact_email,t1.province, t1.city, t1.address, t1.contact_person, t1.contact_phone select t1.id, t1.partner_code, t1.partner_name, t1.contact_email,t1.province, t1.city, t1.address, t1.contact_person, t1.contact_phone
, t1.level, t1.create_at, t1.update_at, t1.delete_at, t1.status,t1.system_user_id,t2.user_name as system_user_name , t1.level, t1.create_at, t1.update_at, t1.delete_at, t1.status, t1.pay_name, t1.pay_bank_number, t1.pay_bank_open_address, t1.bank_number, t1.social_credit
, t1.system_user_id, t2.user_name as system_user_name
from partner_info t1 left join sys_user t2 on t1.system_user_id=t2.user_id from partner_info t1 left join sys_user t2 on t1.system_user_id=t2.user_id
</sql> </sql>
@ -87,6 +93,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="updateAt != null">update_at,</if> <if test="updateAt != null">update_at,</if>
<if test="deleteAt != null">delete_at,</if> <if test="deleteAt != null">delete_at,</if>
<if test="status != null">status,</if> <if test="status != null">status,</if>
<if test="payName != null">pay_name,</if>
<if test="payBankNumber != null">pay_bank_number,</if>
<if test="payBankOpenAddress != null">pay_bank_open_address,</if>
<if test="bankNumber != null">bank_number,</if>
<if test="socialCredit != null">social_credit,</if>
<if test="createBy != null and createBy!=''">create_by,</if> <if test="createBy != null and createBy!=''">create_by,</if>
</trim> </trim>
<trim prefix="values (" suffix=")" suffixOverrides=","> <trim prefix="values (" suffix=")" suffixOverrides=",">
@ -104,6 +115,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="updateAt != null">#{updateAt},</if> <if test="updateAt != null">#{updateAt},</if>
<if test="deleteAt != null">#{deleteAt},</if> <if test="deleteAt != null">#{deleteAt},</if>
<if test="status != null">#{status},</if> <if test="status != null">#{status},</if>
<if test="payName != null">#{payName},</if>
<if test="payBankNumber != null">#{payBankNumber},</if>
<if test="payBankOpenAddress != null">#{payBankOpenAddress},</if>
<if test="bankNumber != null">#{bankNumber},</if>
<if test="socialCredit != null">#{socialCredit},</if>
<if test="createBy != null and createBy!=''">#{createBy},</if> <if test="createBy != null and createBy!=''">#{createBy},</if>
</trim> </trim>
</insert> </insert>
@ -125,6 +141,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="updateAt != null">update_at = #{updateAt},</if> <if test="updateAt != null">update_at = #{updateAt},</if>
<if test="deleteAt != null">delete_at = #{deleteAt},</if> <if test="deleteAt != null">delete_at = #{deleteAt},</if>
<if test="status != null">status = #{status},</if> <if test="status != null">status = #{status},</if>
<if test="payName != null">pay_name = #{payName},</if>
<if test="payBankNumber != null">pay_bank_number = #{payBankNumber},</if>
<if test="payBankOpenAddress != null">pay_bank_open_address = #{payBankOpenAddress},</if>
<if test="bankNumber != null">bank_number = #{bankNumber},</if>
<if test="socialCredit != null">social_credit = #{socialCredit},</if>
<if test="updateBy != null and updateBy!=''">update_by = #{updateBy},</if> <if test="updateBy != null and updateBy!=''">update_by = #{updateBy},</if>
</trim> </trim>
where id = #{id} where id = #{id}