diff --git a/base-server/pom.xml b/base-server/pom.xml
index a4933a05..f82352da 100644
--- a/base-server/pom.xml
+++ b/base-server/pom.xml
@@ -40,7 +40,11 @@
zt-module-erp-server
${revision}
-
+
+ com.zt.plat
+ zt-module-unit-management-server
+ ${revision}
+
com.zt.plat
diff --git a/pom.xml b/pom.xml
index c92f4b71..39e73ac7 100644
--- a/pom.xml
+++ b/pom.xml
@@ -12,6 +12,7 @@
zt-module-contract-order
zt-module-erp
base-server
+ zt-module-unit-management
${project.artifactId}
diff --git a/zt-module-base/zt-module-base-api/src/main/java/com/zt/plat/module/base/enums/ErrorCodeConstants.java b/zt-module-base/zt-module-base-api/src/main/java/com/zt/plat/module/base/enums/ErrorCodeConstants.java
index a53335ba..c36bd6e0 100644
--- a/zt-module-base/zt-module-base-api/src/main/java/com/zt/plat/module/base/enums/ErrorCodeConstants.java
+++ b/zt-module-base/zt-module-base-api/src/main/java/com/zt/plat/module/base/enums/ErrorCodeConstants.java
@@ -19,6 +19,7 @@ public interface ErrorCodeConstants {
ErrorCode COMPANY_RELATIVITY_NOT_EXISTS = new ErrorCode(1_001_000_001, "示例不存在");
ErrorCode WAREHOUSE_NOT_EXISTS = new ErrorCode(1_001_000_001, "示例不存在");
ErrorCode FACTORY_NOT_EXISTS = new ErrorCode(1_001_000_001, "示例不存在");
+ ErrorCode TAX_NOT_EXISTS = new ErrorCode(1_001_000_001, "示例不存在");
ErrorCode BUSINESS_RULE_NOT_EXISTS = new ErrorCode(1_027_100_001, "规则模型不存在");
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/base/TaxController.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/base/TaxController.java
new file mode 100644
index 00000000..0e8ff365
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/base/TaxController.java
@@ -0,0 +1,105 @@
+package com.zt.plat.module.base.controller.admin.base;
+
+import com.zt.plat.framework.apilog.core.annotation.ApiAccessLog;
+import com.zt.plat.framework.business.interceptor.BusinessControllerMarker;
+import com.zt.plat.framework.common.pojo.CommonResult;
+import com.zt.plat.framework.common.pojo.PageParam;
+import com.zt.plat.framework.common.pojo.PageResult;
+import com.zt.plat.framework.common.pojo.vo.BatchDeleteReqVO;
+import com.zt.plat.framework.common.util.object.BeanUtils;
+import com.zt.plat.framework.excel.core.util.ExcelUtils;
+import com.zt.plat.module.base.controller.admin.base.vo.TaxPageReqVO;
+import com.zt.plat.module.base.controller.admin.base.vo.TaxRespVO;
+import com.zt.plat.module.base.controller.admin.base.vo.TaxSaveReqVO;
+import com.zt.plat.module.base.dal.dataobject.base.TaxDO;
+import com.zt.plat.module.base.service.base.TaxService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.Valid;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.io.IOException;
+import java.util.List;
+
+import static com.zt.plat.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
+import static com.zt.plat.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "管理后台 - 税码信息")
+@RestController
+@RequestMapping("/base/tax")
+@Validated
+public class TaxController implements BusinessControllerMarker {
+
+
+ @Resource
+ private TaxService taxService;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建税码信息")
+ @PreAuthorize("@ss.hasPermission('base:tax:create')")
+ public CommonResult createTax(@Valid @RequestBody TaxSaveReqVO createReqVO) {
+ return success(taxService.createTax(createReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "更新税码信息")
+ @PreAuthorize("@ss.hasPermission('base:tax:update')")
+ public CommonResult updateTax(@Valid @RequestBody TaxSaveReqVO updateReqVO) {
+ taxService.updateTax(updateReqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "删除税码信息")
+ @Parameter(name = "id", description = "编号", required = true)
+ @PreAuthorize("@ss.hasPermission('base:tax:delete')")
+ public CommonResult deleteTax(@RequestParam("id") Long id) {
+ taxService.deleteTax(id);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete-list")
+ @Parameter(name = "ids", description = "编号", required = true)
+ @Operation(summary = "批量删除税码信息")
+ @PreAuthorize("@ss.hasPermission('base:tax:delete')")
+ public CommonResult deleteTaxList(@RequestBody BatchDeleteReqVO req) {
+ taxService.deleteTaxListByIds(req.getIds());
+ return success(true);
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "获得税码信息")
+ @Parameter(name = "id", description = "编号", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('base:tax:query')")
+ public CommonResult getTax(@RequestParam("id") Long id) {
+ TaxDO tax = taxService.getTax(id);
+ return success(BeanUtils.toBean(tax, TaxRespVO.class));
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "获得税码信息分页")
+ @PreAuthorize("@ss.hasPermission('base:tax:query')")
+ public CommonResult> getTaxPage(@Valid TaxPageReqVO pageReqVO) {
+ PageResult pageResult = taxService.getTaxPage(pageReqVO);
+ return success(BeanUtils.toBean(pageResult, TaxRespVO.class));
+ }
+
+ @GetMapping("/export-excel")
+ @Operation(summary = "导出税码信息 Excel")
+ @PreAuthorize("@ss.hasPermission('base:tax:export')")
+ @ApiAccessLog(operateType = EXPORT)
+ public void exportTaxExcel(@Valid TaxPageReqVO pageReqVO,
+ HttpServletResponse response) throws IOException {
+ pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+ List list = taxService.getTaxPage(pageReqVO).getList();
+ // 导出 Excel
+ ExcelUtils.write(response, "税码信息.xls", "数据", TaxRespVO.class,
+ BeanUtils.toBean(list, TaxRespVO.class));
+ }
+
+}
\ No newline at end of file
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/base/vo/TaxPageReqVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/base/vo/TaxPageReqVO.java
new file mode 100644
index 00000000..49acb7c4
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/base/vo/TaxPageReqVO.java
@@ -0,0 +1,45 @@
+package com.zt.plat.module.base.controller.admin.base.vo;
+
+import com.zt.plat.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+import static com.zt.plat.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 税码信息分页 Request VO")
+@Data
+public class TaxPageReqVO extends PageParam {
+
+ @Schema(description = "类型(字典: SPLY_BSN_TP)", example = "2")
+ private String type;
+
+ @Schema(description = "类别")
+ private String category;
+
+ @Schema(description = "税码")
+ private String taxCoding;
+
+ @Schema(description = "税码描述")
+ private String remark;
+
+ @Schema(description = "税率")
+ private BigDecimal tax;
+
+ @Schema(description = "创建时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime[] createTime;
+
+ @Schema(description = "是否启用")
+ private String isEnable;
+
+ @Schema(description = "公司编码")
+ private String customerNumber;
+
+ @Schema(description = "公司名称", example = "王五")
+ private String customerName;
+
+}
\ No newline at end of file
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/base/vo/TaxRespVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/base/vo/TaxRespVO.java
new file mode 100644
index 00000000..dfc4b678
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/base/vo/TaxRespVO.java
@@ -0,0 +1,56 @@
+package com.zt.plat.module.base.controller.admin.base.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 税码信息 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class TaxRespVO {
+
+ @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "26656")
+ @ExcelProperty("主键")
+ private Long id;
+
+ @Schema(description = "类型(字典: SPLY_BSN_TP)", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+ @ExcelProperty("类型(字典: SPLY_BSN_TP)")
+ private String type;
+
+ @Schema(description = "类别", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("类别")
+ private String category;
+
+ @Schema(description = "税码", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("税码")
+ private String taxCoding;
+
+ @Schema(description = "税码描述")
+ @ExcelProperty("税码描述")
+ private String remark;
+
+ @Schema(description = "税率")
+ @ExcelProperty("税率")
+ private BigDecimal tax;
+
+ @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("创建时间")
+ private LocalDateTime createTime;
+
+ @Schema(description = "是否启用")
+ @ExcelProperty("是否启用")
+ private String isEnable;
+
+ @Schema(description = "公司编码")
+ @ExcelProperty("公司编码")
+ private String customerNumber;
+
+ @Schema(description = "公司名称", example = "王五")
+ @ExcelProperty("公司名称")
+ private String customerName;
+
+}
\ No newline at end of file
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/base/vo/TaxSaveReqVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/base/vo/TaxSaveReqVO.java
new file mode 100644
index 00000000..3d3ba947
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/base/vo/TaxSaveReqVO.java
@@ -0,0 +1,43 @@
+package com.zt.plat.module.base.controller.admin.base.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotEmpty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Schema(description = "管理后台 - 税码信息新增/修改 Request VO")
+@Data
+public class TaxSaveReqVO {
+
+ @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "26656")
+ private Long id;
+
+ @Schema(description = "类型(字典: SPLY_BSN_TP)", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+ @NotEmpty(message = "类型(字典: SPLY_BSN_TP)不能为空")
+ private String type;
+
+ @Schema(description = "类别", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "类别不能为空")
+ private String category;
+
+ @Schema(description = "税码", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "税码不能为空")
+ private String taxCoding;
+
+ @Schema(description = "税码描述")
+ private String remark;
+
+ @Schema(description = "税率")
+ private BigDecimal tax;
+
+ @Schema(description = "是否启用")
+ private String isEnable;
+
+ @Schema(description = "公司编码")
+ private String customerNumber;
+
+ @Schema(description = "公司名称", example = "王五")
+ private String customerName;
+
+}
\ No newline at end of file
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/onlyoffice/controller/OnlyOfficeCallbackController.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/onlyoffice/controller/OnlyOfficeCallbackController.java
index 3735ad17..86408279 100644
--- a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/onlyoffice/controller/OnlyOfficeCallbackController.java
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/onlyoffice/controller/OnlyOfficeCallbackController.java
@@ -39,4 +39,19 @@ public class OnlyOfficeCallbackController {
response.put("error", 0);
return new ResponseEntity<>(response, HttpStatus.OK);
}
+
+ /**
+ * 处理OnlyOffice文档编辑服务发送的回调
+ */
+ @PostMapping("/contract /callback/{id}")
+ @PermitAll
+ @TenantIgnore
+ public ResponseEntity