feat(contract): 新增合同发票管理功能

实现合同发票的增删改查功能,包括:
1. 添加ContractInvoiceVo实体类及相关ViewModel
2. 创建合同发票数据库表CONTRACT_INVOICE
3. 实现前后端发票管理服务ContractInvoiceService
4. 开发发票管理界面及标签页
5. 添加发票表格单元格组件
6. 完善销售订单表结构,增加客户联系人字段
7. 更新pom.xml版本至0.0.122-SNAPSHOT

修复销售订单界面搜索字段命名不一致问题
This commit is contained in:
2025-10-16 15:47:33 +08:00
parent cf0a7e18ea
commit 71a358fa77
28 changed files with 1274 additions and 40 deletions

View File

@@ -0,0 +1,61 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.CheckBox?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TableColumn?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?>
<BorderPane id="root" fx:id="root" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="700.0" prefWidth="900.0" xmlns="http://javafx.com/javafx/17" xmlns:fx="http://javafx.com/fxml/1">
<top>
<HBox alignment="CENTER_LEFT" prefHeight="40.0" prefWidth="900.0" spacing="10.0">
<Button mnemonicParsing="false" onAction="#onTableCreateNewAction" text="新建">
<HBox.margin>
<Insets left="10.0" />
</HBox.margin>
</Button>
<Button mnemonicParsing="false" onAction="#onTableRefreshAction" text="刷新">
<HBox.margin>
<Insets left="10.0" />
</HBox.margin>
</Button>
<Button mnemonicParsing="false" onAction="#onTableDeleteAction" text="删除">
<HBox.margin>
<Insets left="10.0" />
</HBox.margin>
</Button>
<TextField fx:id="searchField" promptText="搜索..." HBox.hgrow="ALWAYS">
<HBox.margin>
<Insets left="10.0" right="10.0" />
</HBox.margin>
</TextField>
</HBox>
</top>
<center>
<TableView fx:id="table" prefHeight="600.0" prefWidth="900.0">
<columns>
<TableColumn fx:id="idColumn" prefWidth="80.0" text="ID" />
<TableColumn fx:id="codeColumn" prefWidth="120.0" text="发票编号" />
<TableColumn fx:id="nameColumn" prefWidth="150.0" text="发票名称" />
<TableColumn fx:id="contractColumn" prefWidth="100.0" text="合同ID" />
<TableColumn fx:id="contractItemColumn" prefWidth="100.0" text="合同项目ID" />
</columns>
</TableView>
</center>
<bottom>
<HBox alignment="CENTER" prefHeight="40.0" prefWidth="900.0" spacing="10.0">
<Label fx:id="pageInfoLabel" text="第 1 页,共 1 页" />
<Button mnemonicParsing="false" onAction="#onPrevPageAction" text="上一页" />
<Button mnemonicParsing="false" onAction="#onNextPageAction" text="下一页" />
<Button mnemonicParsing="false" onAction="#onFirstPageAction" text="首页" />
<Button mnemonicParsing="false" onAction="#onLastPageAction" text="末页" />
<TextField fx:id="pageField" prefWidth="60.0" text="1" />
<Button mnemonicParsing="false" onAction="#onGotoPageAction" text="跳转" />
</HBox>
</bottom>
</BorderPane>

View File

@@ -0,0 +1,100 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.ScrollPane?>
<?import javafx.scene.control.Tab?>
<?import javafx.scene.control.TabPane?>
<?import javafx.scene.control.TextArea?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.RowConstraints?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.control.DatePicker?>
<?import javafx.scene.control.ComboBox?>
<BorderPane id="root" fx:id="root" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="700.0" prefWidth="900.0" xmlns="http://javafx.com/javafx/17" xmlns:fx="http://javafx.com/fxml/1"
fx:controller="com.ecep.contract.controller.contract.ContractInvoiceWindowController">
<top>
<HBox alignment="CENTER_LEFT" prefHeight="40.0" prefWidth="900.0" spacing="10.0">
<Button fx:id="saveBtn" mnemonicParsing="false" text="保存">
<HBox.margin>
<Insets left="10.0" />
</HBox.margin>
</Button>
<Button mnemonicParsing="false" onAction="#refresh" text="刷新">
<HBox.margin>
<Insets left="10.0" />
</HBox.margin>
</Button>
<Label fx:id="statusLabel" prefWidth="200.0">
<HBox.margin>
<Insets left="10.0" />
</HBox.margin>
</Label>
</HBox>
</top>
<center>
<TabPane fx:id="tabPane" prefHeight="660.0" prefWidth="900.0" tabClosingPolicy="UNAVAILABLE">
<Tab fx:id="baseInfoTab" text="基本信息">
<ScrollPane fitToWidth="true">
<VBox maxWidth="800.0" prefWidth="800.0">
<GridPane hgap="10.0" vgap="10.0">
<columnConstraints>
<ColumnConstraints halignment="RIGHT" hgrow="NEVER" prefWidth="100.0" />
<ColumnConstraints hgrow="ALWAYS" minWidth="0.0" prefWidth="200.0" />
<ColumnConstraints halignment="RIGHT" hgrow="NEVER" prefWidth="100.0" />
<ColumnConstraints hgrow="ALWAYS" minWidth="0.0" prefWidth="200.0" />
</columnConstraints>
<rowConstraints>
<RowConstraints prefHeight="30.0" vgrow="NEVER" />
<RowConstraints prefHeight="30.0" vgrow="NEVER" />
<RowConstraints prefHeight="30.0" vgrow="NEVER" />
<RowConstraints prefHeight="30.0" vgrow="NEVER" />
<RowConstraints prefHeight="30.0" vgrow="NEVER" />
<RowConstraints prefHeight="30.0" vgrow="NEVER" />
<RowConstraints prefHeight="100.0" vgrow="ALWAYS" />
</rowConstraints>
<Label text="ID:" GridPane.columnIndex="0" GridPane.rowIndex="0" />
<Label fx:id="idLabel" GridPane.columnIndex="1" GridPane.rowIndex="0" />
<Label text="发票编号:" GridPane.columnIndex="2" GridPane.rowIndex="0" />
<TextField fx:id="codeField" GridPane.columnIndex="3" GridPane.rowIndex="0" />
<Label text="发票名称:" GridPane.columnIndex="0" GridPane.rowIndex="1" />
<TextField fx:id="nameField" GridPane.columnIndex="1" GridPane.columnSpan="3" GridPane.rowIndex="1" />
<Label text="合同ID:" GridPane.columnIndex="0" GridPane.rowIndex="2" />
<TextField fx:id="contractField" GridPane.columnIndex="1" GridPane.rowIndex="2" />
<Label text="合同项目ID:" GridPane.columnIndex="2" GridPane.rowIndex="2" />
<TextField fx:id="contractItemField" GridPane.columnIndex="3" GridPane.rowIndex="2" />
<Label text="发票ID:" GridPane.columnIndex="0" GridPane.rowIndex="3" />
<TextField fx:id="invoiceField" GridPane.columnIndex="1" GridPane.rowIndex="3" />
<Label text="发票金额:" GridPane.columnIndex="2" GridPane.rowIndex="3" />
<TextField fx:id="amountField" GridPane.columnIndex="3" GridPane.rowIndex="3" />
<Label text="发票日期:" GridPane.columnIndex="0" GridPane.rowIndex="4" />
<DatePicker fx:id="invoiceDatePicker" GridPane.columnIndex="1" GridPane.rowIndex="4" />
<Label text="发票类型:" GridPane.columnIndex="2" GridPane.rowIndex="4" />
<ComboBox fx:id="invoiceTypeComboBox" GridPane.columnIndex="3" GridPane.rowIndex="4" />
<Label text="发票状态:" GridPane.columnIndex="0" GridPane.rowIndex="5" />
<ComboBox fx:id="statusComboBox" GridPane.columnIndex="1" GridPane.rowIndex="5" />
<Label text="用友ID:" GridPane.columnIndex="2" GridPane.rowIndex="5" />
<TextField fx:id="ufIdField" GridPane.columnIndex="3" GridPane.rowIndex="5" />
<Label text="开票单位:" GridPane.columnIndex="0" GridPane.rowIndex="6" />
<TextField fx:id="invoiceUnitField" GridPane.columnIndex="1" GridPane.rowIndex="6" />
<Label text="接收单位:" GridPane.columnIndex="2" GridPane.rowIndex="6" />
<TextField fx:id="receiveUnitField" GridPane.columnIndex="3" GridPane.rowIndex="6" />
<Label text="备注:" GridPane.columnIndex="0" GridPane.rowIndex="7" />
<TextArea fx:id="remarkTextArea" GridPane.columnIndex="1" GridPane.columnSpan="3" GridPane.rowIndex="7" />
</GridPane>
<VBox.margin>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</VBox.margin>
</VBox>
</ScrollPane>
</Tab>
<Tab fx:id="entityTab" text="实体信息" />
</TabPane>
</center>
</BorderPane>

View File

@@ -0,0 +1,39 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<AnchorPane xmlns="http://javafx.com/javafx/17" xmlns:fx="http://javafx.com/fxml/1"
fx:controller="com.ecep.contract.controller.tab.ContractTabSkinInvoices">
<children>
<HBox spacing="3.0">
<children>
<TextField fx:id="searchKeyField" promptText="搜索..." />
<Button fx:id="searchBtn" text="搜索"/>
<Button fx:id="refreshBtn" text="刷新"/>
<Button fx:id="addBtn" text="新增发票"/>
</children>
<padding>
<Insets bottom="10.0" left="7.0" right="10.0" top="10.0"/>
</padding>
</HBox>
<TableView fx:id="table" AnchorPane.bottomAnchor="5.0" AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="5.0"
AnchorPane.topAnchor="42.0">
<columns>
<TableColumn fx:id="idColumn" text="ID"/>
<TableColumn fx:id="codeColumn" text="编号"/>
<TableColumn fx:id="nameColumn" text="名称"/>
<TableColumn fx:id="invoiceColumn" text="发票"/>
<TableColumn fx:id="amountColumn" text="金额"/>
<TableColumn fx:id="remarkColumn" text="备注"/>
<TableColumn fx:id="creatorColumn" text="创建人"/>
<TableColumn fx:id="createDateColumn" text="创建日期"/>
<TableColumn fx:id="updaterColumn" text="更新人"/>
<TableColumn fx:id="updateDateColumn" text="更新日期"/>
</columns>
</TableView>
</children>
</AnchorPane>

View File

@@ -10,7 +10,7 @@
<children>
<HBox spacing="3.0">
<children>
<TextField fx:id="contractSearchKeyField" promptText="检索关键字"/>
<TextField fx:id="searchKeyField" promptText="检索关键字"/>
<Button fx:id="searchBtn" mnemonicParsing="false" text="检索"/>
</children>
<padding>
@@ -23,7 +23,6 @@
<columns>
<TableColumn fx:id="idColumn" prefWidth="75.0" text="ID"/>
<TableColumn fx:id="codeColumn" prefWidth="120" text="编号"/>
<TableColumn fx:id="customerColumn" prefWidth="100.0" text="客户"/>
<TableColumn fx:id="customerAddressColumn" prefWidth="150.0" text="客户地址"/>
<TableColumn fx:id="taxRateColumn" prefWidth="60.0" text="税率"/>
<TableColumn fx:id="refIdColumn" prefWidth="60.0" text="RefID"/>