From 292d4a534d8a1bf293b35c70ff0e1bb47273d922 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BD=98=E8=8D=A3=E6=99=9F?= <9691125+pan-rongsheng@user.noreply.gitee.com> Date: Thu, 6 Nov 2025 16:06:16 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E9=80=9A=E8=BF=87=E6=B6=88?= =?UTF-8?q?=E8=B4=B9=E8=AE=A2=E5=8D=95=E6=98=8E=E7=BB=86id=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E6=98=8E=E7=BB=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../OnlyOfficeCallbackController.java | 11 +- .../OnlyOfficeCallbackServiceImpl.java | 2 + .../vo/TemplateInstanceDataRespVO.java | 5 + .../vo/TemplateInstanceItemRespVO.java | 1 + .../tmpltp/TemplateInstanceDataDO.java | 4 + .../TemplateInstanceItemServiceImpl.java | 2 +- .../tmpltp/TemplateInstanceServiceImpl.java | 23 +++- .../service/tmpltp/TmplTpFldServiceImpl.java | 3 + .../salesorder/vo/SalesOrderSaveReqVO.java | 16 +-- .../dataobject/salesorder/SalesOrderDO.java | 12 +- .../plat/module/erp/api/InvoiceticketApi.java | 26 ++++ .../api/dto/ErpInvoiceticketSubmitReqDTO.java | 29 ++++ .../dto/ErpInvoiceticketSubmitRespDTO.java | 61 +++++++++ .../module/erp/api/InvoiceticketImpl.java | 25 ++++ .../service/erp/ErpInvoiceticketService.java | 8 ++ .../erp/ErpInvoiceticketServiceImpl.java | 126 ++++++++++++++++++ 16 files changed, 328 insertions(+), 26 deletions(-) create mode 100644 zt-module-erp/zt-module-erp-api/src/main/java/com/zt/plat/module/erp/api/InvoiceticketApi.java create mode 100644 zt-module-erp/zt-module-erp-api/src/main/java/com/zt/plat/module/erp/api/dto/ErpInvoiceticketSubmitReqDTO.java create mode 100644 zt-module-erp/zt-module-erp-api/src/main/java/com/zt/plat/module/erp/api/dto/ErpInvoiceticketSubmitRespDTO.java create mode 100644 zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/api/InvoiceticketImpl.java create mode 100644 zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpInvoiceticketService.java create mode 100644 zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpInvoiceticketServiceImpl.java 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 8640827..282464b 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 @@ -7,6 +7,7 @@ import com.zt.plat.module.base.controller.admin.templtp.onlyoffice.service.OnlyO import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.security.PermitAll; import jakarta.servlet.http.HttpServletRequest; +import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -14,6 +15,7 @@ import org.springframework.web.bind.annotation.*; import java.util.HashMap; import java.util.Map; +@Slf4j @RestController @RequestMapping("/base/onlyoffice") @Tag(name = "管理后台 - onlyOffice回调") @@ -31,19 +33,21 @@ public class OnlyOfficeCallbackController { @PostMapping("/callback/{id}") @PermitAll @TenantIgnore - public ResponseEntity> handleCallback(@RequestBody OnlyOfficeCallback callback, @PathVariable String id,@RequestParam("fileName") String fileName) { + public ResponseEntity> handleCallback(@RequestBody OnlyOfficeCallback callback, @PathVariable String id,@RequestParam("fileName") String fileName) { // 处理回调逻辑 callbackService.processCallback(callback,id,fileName); + log.info("回调参数:【{}】",callback.toString()); // 返回必须的响应,否则OnlyOffice会显示错误 - Map response = new HashMap<>(); + Map response = new HashMap<>(); response.put("error", 0); + // response.put("version", 100); return new ResponseEntity<>(response, HttpStatus.OK); } /** * 处理OnlyOffice文档编辑服务发送的回调 */ - @PostMapping("/contract /callback/{id}") + @PostMapping("/contract/callback/{id}") @PermitAll @TenantIgnore public ResponseEntity> handleContractCallback(@RequestBody OnlyOfficeCallback callback, @PathVariable String id,@RequestParam("fileName") String fileName) { @@ -52,6 +56,7 @@ public class OnlyOfficeCallbackController { // 返回必须的响应,否则OnlyOffice会显示错误 Map response = new HashMap<>(); response.put("error", 0); + // response.put("version", 0); return new ResponseEntity<>(response, HttpStatus.OK); } } diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/onlyoffice/service/OnlyOfficeCallbackServiceImpl.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/onlyoffice/service/OnlyOfficeCallbackServiceImpl.java index 14d75f9..70a16ed 100644 --- a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/onlyoffice/service/OnlyOfficeCallbackServiceImpl.java +++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/onlyoffice/service/OnlyOfficeCallbackServiceImpl.java @@ -168,6 +168,7 @@ public class OnlyOfficeCallbackServiceImpl implements OnlyOfficeCallbackService fileInfo.put("id",String.valueOf(fileRespDTO.getId())); fileInfo.put("name", fileRespDTO.getName()); fileInfo.put("directory", fileRespDTO.getDirectory()); + fileInfo.put("key", callback.getKey()); templateInstanceService.updateTemplateInstanceFileUrlByInstanceId(id, JSONObject.toJSONString(fileInfo)); } else { // 创建文件失败,处理错误 @@ -352,6 +353,7 @@ public class OnlyOfficeCallbackServiceImpl implements OnlyOfficeCallbackService fileInfo.put("id",String.valueOf(fileRespDTO.getId())); fileInfo.put("name", fileRespDTO.getName()); fileInfo.put("directory", fileRespDTO.getDirectory()); + fileInfo.put("key", callback.getKey()); templateInstanceService.updateTemplateInstanceFileUrlByInstanceId(id, JSONObject.toJSONString(fileInfo)); } else { // 创建文件失败,处理错误 diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/vo/TemplateInstanceDataRespVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/vo/TemplateInstanceDataRespVO.java index a744a72..9dd2a17 100644 --- a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/vo/TemplateInstanceDataRespVO.java +++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/vo/TemplateInstanceDataRespVO.java @@ -16,6 +16,11 @@ public class TemplateInstanceDataRespVO { @ExcelProperty("主键") private Long id; + + @Schema(description = "字段名字", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("字段名字") + private String fldName; + @Schema(description = "关联实例主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "25824") @ExcelProperty("关联实例主键") private String inscId; diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/vo/TemplateInstanceItemRespVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/vo/TemplateInstanceItemRespVO.java index 430a579..0fec83f 100644 --- a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/vo/TemplateInstanceItemRespVO.java +++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/vo/TemplateInstanceItemRespVO.java @@ -1,5 +1,6 @@ package com.zt.plat.module.base.controller.admin.templtp.vo; +import com.baomidou.mybatisplus.annotation.TableField; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/tmpltp/TemplateInstanceDataDO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/tmpltp/TemplateInstanceDataDO.java index b4547d2..ca0b381 100644 --- a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/tmpltp/TemplateInstanceDataDO.java +++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/tmpltp/TemplateInstanceDataDO.java @@ -44,4 +44,8 @@ public class TemplateInstanceDataDO extends BusinessBaseDO { @TableField("FLD_VAL") private String fldVal; + + @TableField(exist = false) + private String fldName; + } diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/tmpltp/TemplateInstanceItemServiceImpl.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/tmpltp/TemplateInstanceItemServiceImpl.java index a831abf..cf21051 100644 --- a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/tmpltp/TemplateInstanceItemServiceImpl.java +++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/tmpltp/TemplateInstanceItemServiceImpl.java @@ -46,7 +46,7 @@ public class TemplateInstanceItemServiceImpl implements TemplateInstanceItemServ @Override public void updateTemplateInstanceItem(TemplateInstanceItemSaveReqVO updateReqVO) { // 校验存在 - validateTemplateInstanceItemExists(updateReqVO.getInscId()); + validateTemplateInstanceItemExists(updateReqVO.getId()); // 更新 TemplateInstanceItemDO updateObj = BeanUtils.toBean(updateReqVO, TemplateInstanceItemDO.class); templateInstanceItemMapper.updateById(updateObj); diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/tmpltp/TemplateInstanceServiceImpl.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/tmpltp/TemplateInstanceServiceImpl.java index 6db2e29..c4c9ee5 100644 --- a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/tmpltp/TemplateInstanceServiceImpl.java +++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/tmpltp/TemplateInstanceServiceImpl.java @@ -217,18 +217,18 @@ public class TemplateInstanceServiceImpl implements TemplateInstanceService { // 校验当前状态是否能够进行发布 publishReqVOS.forEach(reqVO -> { TemplateInstanceDO templateInstanceDO = templateInstanceMapper.selectById(reqVO.getId()); - if (templateInstanceDO.getCntt()==null||templateInstanceDO.getCntt().isEmpty()){ + if (templateInstanceDO.getCntt() == null || templateInstanceDO.getCntt().isEmpty()) { throw exception(TEMPLATE_INSTANCE_FILE_NOT_EXISTS); } String currentStatus = reqVO.getCurrentStatus(); if (currentStatus.isEmpty()) { - currentStatus =templateInstanceDO.getSts(); + currentStatus = templateInstanceDO.getSts(); } PublishStatusEnum status = PublishStatusEnum.fromCode(currentStatus); boolean transitionAllowed = false; if (status != null) { transitionAllowed = status.isTransitionAllowed(TmplStsEnum.DRAFT.getCode()); - if (!transitionAllowed){ + if (!transitionAllowed) { transitionAllowed = status.isTransitionAllowed(TmplStsEnum.START.getCode()); } } @@ -286,7 +286,7 @@ public class TemplateInstanceServiceImpl implements TemplateInstanceService { newTpInstanceDO.setTenantId(templateInstanceDO.getTenantId()); newTpInstanceDO.setVer(incrementVersion(templateInstanceDO.getVer())); newTpInstanceDO.setPublishTime(LocalDateTime.now()); - newTpInstanceDO.setOrigCntt(templateInstanceDO.getCntt()!=null?templateInstanceDO.getCntt():templateInstanceDO.getOrigCntt());//模板实例内容,默认为上一个版本的当前文件内容 + newTpInstanceDO.setOrigCntt(templateInstanceDO.getCntt() != null ? templateInstanceDO.getCntt() : templateInstanceDO.getOrigCntt());//模板实例内容,默认为上一个版本的当前文件内容 newTpInstanceDO.setCreateTime(null); newTpInstanceDO.setUpdateTime(null); templateInstanceMapper.insert(newTpInstanceDO); @@ -409,9 +409,18 @@ public class TemplateInstanceServiceImpl implements TemplateInstanceService { // 实例数据 private List setTemplateInstanceDataRespVOS(Long id) { - return BeanUtils.toBean(templateInstanceDataMapper.selectList(new LambdaQueryWrapper() + List templateInstanceDataRespVOS = BeanUtils.toBean(templateInstanceDataMapper.selectList(new LambdaQueryWrapper() .eq(TemplateInstanceDataDO::getInscId, id) .eq(TemplateInstanceDataDO::getCompanyId, CompanyContextHolder.getCompanyId())), TemplateInstanceDataRespVO.class); + List tmplTpListByValKeys = tmplTpFldService.getTmplTpListByValKeys(templateInstanceDataRespVOS.stream().map(TemplateInstanceDataRespVO::getFldKy).toList()); + templateInstanceDataRespVOS.forEach(templateInstanceDataRespVO -> { + tmplTpListByValKeys.forEach(tmplTpFldDO -> { + if (templateInstanceDataRespVO.getFldKy().equals(tmplTpFldDO.getFldKy())) { + templateInstanceDataRespVO.setFldName(tmplTpFldDO.getFldName()); + } + }); + }); + return templateInstanceDataRespVOS; } private void validateStatusCanDelete(List ids) { @@ -470,11 +479,11 @@ public class TemplateInstanceServiceImpl implements TemplateInstanceService { List itmIds = templateInstanceItemMapper.selectList(new LambdaQueryWrapper().eq(TemplateInstanceItemDO::getInscId, id)).stream().map(TemplateInstanceItemDO::getItmId).toList(); // 例模版条款去条款库查询条款信息 - if (!itmIds.isEmpty()){ + if (!itmIds.isEmpty()) { List tmplItmRespVOS = BeanUtils.toBean(tmplItmService.listTmplItmByIds(itmIds), TmplItmRespVO.class); fieldAndClauseRespVO.setTmplItmRespVOS(BeanUtils.toBean(tmplItmRespVOS, TmplItmRespVO.class)); } - if (!valKeys.isEmpty()){ + if (!valKeys.isEmpty()) { //例模版字段去字段库查询字段信息 List tmplTpListByValKeys = tmplTpFldService.getTmplTpListByValKeys(valKeys); fieldAndClauseRespVO.setTmplFldRespVOS(BeanUtils.toBean(tmplTpListByValKeys, TmplFldRespVO.class)); diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/tmpltp/TmplTpFldServiceImpl.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/tmpltp/TmplTpFldServiceImpl.java index e50c1aa..4472e84 100644 --- a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/tmpltp/TmplTpFldServiceImpl.java +++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/tmpltp/TmplTpFldServiceImpl.java @@ -96,6 +96,9 @@ public class TmplTpFldServiceImpl extends ServiceImpl getTmplTpListByValKeys(List valNames) { + if (CollUtil.isEmpty(valNames)){ + return new ArrayList<>(); + } return baseMapper.selectList(new LambdaQueryWrapper().in(TmplTpFldDO::getFldKy, valNames)); } diff --git a/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/controller/admin/salesorder/vo/SalesOrderSaveReqVO.java b/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/controller/admin/salesorder/vo/SalesOrderSaveReqVO.java index 2fa08df..1083eb1 100644 --- a/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/controller/admin/salesorder/vo/SalesOrderSaveReqVO.java +++ b/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/controller/admin/salesorder/vo/SalesOrderSaveReqVO.java @@ -133,7 +133,6 @@ public class SalesOrderSaveReqVO { private String erpSalesCompanyName; - @Schema(description = "ERP状态(字典: ERP_REQ_STS)", example = "2") private String erpStatus; @@ -172,17 +171,10 @@ public class SalesOrderSaveReqVO { @ExcelProperty("订单分类") private String splyBsnTp; - /** - * 销售组织编码 - * - */ @Schema(description = "销售组织编码", example = "2") @ExcelProperty("销售组织编码") private String saleOrgzCd; - /** - * 销售组织名称 - * - */ + @Schema(description = "销售组织名称", example = "2") @ExcelProperty("销售组织名称") private String saleOrgzName; @@ -200,4 +192,10 @@ public class SalesOrderSaveReqVO { @Schema(description = "产品组编码") @ExcelProperty("产品组编码") private String pdtGrpCdg; + @Schema(description = "付款方名称") + @ExcelProperty("付款方名称") + private String payerName; + @Schema(description = "付款方编码") + @ExcelProperty("付款方编码") + private String payerNum; } diff --git a/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/dal/dataobject/salesorder/SalesOrderDO.java b/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/dal/dataobject/salesorder/SalesOrderDO.java index 30602a3..b57601f 100644 --- a/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/dal/dataobject/salesorder/SalesOrderDO.java +++ b/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/dal/dataobject/salesorder/SalesOrderDO.java @@ -295,7 +295,7 @@ public class SalesOrderDO extends BusinessBaseDO { * 付款方名称 * */ - @TableField("PYER_NUM") + @TableField("PYER_NAME") private String payerName; /** * 付款方编码 @@ -303,9 +303,9 @@ public class SalesOrderDO extends BusinessBaseDO { */ @TableField("PYER_NUM") private String payerNum; - /** - * 税码 - */ - @TableField("TAX_NUM") - private String taxNum; +// /** +// * 税码 +// */ +// @TableField("TAX_NUM") +// private String taxNum; } diff --git a/zt-module-erp/zt-module-erp-api/src/main/java/com/zt/plat/module/erp/api/InvoiceticketApi.java b/zt-module-erp/zt-module-erp-api/src/main/java/com/zt/plat/module/erp/api/InvoiceticketApi.java new file mode 100644 index 0000000..c1c1cf4 --- /dev/null +++ b/zt-module-erp/zt-module-erp-api/src/main/java/com/zt/plat/module/erp/api/InvoiceticketApi.java @@ -0,0 +1,26 @@ +package com.zt.plat.module.erp.api; + +import com.zt.plat.framework.common.pojo.CommonResult; +import com.zt.plat.module.erp.api.dto.ErpInvoiceticketSubmitReqDTO; +import com.zt.plat.module.erp.api.dto.ErpInvoiceticketSubmitRespDTO; +import com.zt.plat.module.erp.api.dto.ErpSubmitReqDTO; +import com.zt.plat.module.erp.enums.ApiConstants; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +import java.util.HashMap; + +@FeignClient(name = ApiConstants.NAME) +@Tag(name = "RPC 服务 - ERP") +public interface InvoiceticketApi { + + String PREFIX = ApiConstants.PREFIX + "/invoiceticket"; + + @PostMapping(PREFIX + "/submit") + @Operation(summary = "erp数据提交") + CommonResult submitDataToErp(@Valid @RequestBody ErpInvoiceticketSubmitReqDTO reqDTO); +} diff --git a/zt-module-erp/zt-module-erp-api/src/main/java/com/zt/plat/module/erp/api/dto/ErpInvoiceticketSubmitReqDTO.java b/zt-module-erp/zt-module-erp-api/src/main/java/com/zt/plat/module/erp/api/dto/ErpInvoiceticketSubmitReqDTO.java new file mode 100644 index 0000000..82cce75 --- /dev/null +++ b/zt-module-erp/zt-module-erp-api/src/main/java/com/zt/plat/module/erp/api/dto/ErpInvoiceticketSubmitReqDTO.java @@ -0,0 +1,29 @@ +package com.zt.plat.module.erp.api.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Pattern; +import jakarta.validation.constraints.Size; +import lombok.Data; + +@Data +@Schema(description = "管理后台 - 发票相关操作 Request VO") +public class ErpInvoiceticketSubmitReqDTO { + @Schema(description = "id,用作bskey", requiredMode = Schema.RequiredMode.REQUIRED) + private String id; + + @Schema(description = "发票类型;RE-采购发票,RV-销售发票", requiredMode = Schema.RequiredMode.REQUIRED) + @NotBlank(message = "发票类型不能为空") + @Size(min = 2, max = 2, message = "发票类型必须为2位字符") + @Pattern(regexp = "^(RE|RV)$", message = "发票类型仅支持RE(采购发票)、RV(销售发票)") + private String vouchertype; + + @Schema(description = "发票编号", requiredMode = Schema.RequiredMode.REQUIRED) + @NotBlank(message = "发票编号不能为空") + @Size(min = 1, max = 10, message = "发票编号长度不能超过10位") + private String voucherno; + + @Schema(description = "会计年度;发票类型为RE(采购发票)时必填,格式为4位数字(如2025)") + @Pattern(regexp = "^\\d{4}$", message = "会计年度必须为4位数字(如2025)") + private String voucheryear; +} diff --git a/zt-module-erp/zt-module-erp-api/src/main/java/com/zt/plat/module/erp/api/dto/ErpInvoiceticketSubmitRespDTO.java b/zt-module-erp/zt-module-erp-api/src/main/java/com/zt/plat/module/erp/api/dto/ErpInvoiceticketSubmitRespDTO.java new file mode 100644 index 0000000..c4d45f1 --- /dev/null +++ b/zt-module-erp/zt-module-erp-api/src/main/java/com/zt/plat/module/erp/api/dto/ErpInvoiceticketSubmitRespDTO.java @@ -0,0 +1,61 @@ +package com.zt.plat.module.erp.api.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; + +@Data +@Schema(description = "管理后台 - 发票相关操作 响应 VO") +public class ErpInvoiceticketSubmitRespDTO { + @Schema(description = "发票过账日期;格式为YYYYMMDD(如20251106)") + private String postDate; + + @Schema(description = "业务单据号;长度20位字符") + private String settlementsCode; + + @Schema(description = "状态码;详见《发票状态》表;长度1位字符") + private String state; + + @Schema(description = "消息文本;生单失败、驳回、过账失败等状态时返回共享端和SAP消息") + private String reason; + + @Schema(description = "会计凭证编号;已生成会计凭证的情况下返回;长度10位字符") + private String refDoc; + + @Schema(description = "冲销凭证号;状态为已冲销时返回;长度10位字符") + private String revDoc; + + @Schema(description = "冲销凭证会计年度;仅RE发票(采购发票)且状态为已冲销时返回;4位数字") + private String revYear; + + @Schema(description = "冲销凭证过账日期;状态为已冲销时返回;格式为YYYYMMDD(如20251106)") + private String revDate; + + @Schema(description = "采购发票过账差异明细;仅RE发票(采购发票)且状态为3时返回") + private List callBackSettlementDetails; + + /** + * 采购发票过账差异明细子项 + */ + @Schema(description = "采购发票过账差异明细子项") + @Data + public static class CallBackSettlementDetail { + + @Schema(description = "工厂编号") + private String factoryCode; + + @Schema(description = "物料编号") + private String materialCode; + + @Schema(description = "物料凭证号") + private String matDoc; + + @Schema(description = "物料描述") + private String materialDesc; + + @Schema(description = "差异金额") + private BigDecimal differenceAmount; + } +} diff --git a/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/api/InvoiceticketImpl.java b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/api/InvoiceticketImpl.java new file mode 100644 index 0000000..5c85f2f --- /dev/null +++ b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/api/InvoiceticketImpl.java @@ -0,0 +1,25 @@ +package com.zt.plat.module.erp.api; + +import com.zt.plat.framework.common.pojo.CommonResult; +import com.zt.plat.module.erp.api.dto.ErpInvoiceticketSubmitReqDTO; +import com.zt.plat.module.erp.api.dto.ErpInvoiceticketSubmitRespDTO; +import com.zt.plat.module.erp.service.erp.ErpInvoiceticketService; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RestController; + +import static com.zt.plat.framework.common.pojo.CommonResult.success; + +@RestController +@Validated +@Slf4j +public class InvoiceticketImpl implements InvoiceticketApi { + @Resource + private ErpInvoiceticketService erpInvoiceticketService; + + @Override + public CommonResult submitDataToErp(ErpInvoiceticketSubmitReqDTO reqDTO) { + return success(erpInvoiceticketService.sbumitToErp020(reqDTO)); + } +} diff --git a/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpInvoiceticketService.java b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpInvoiceticketService.java new file mode 100644 index 0000000..20a1bcb --- /dev/null +++ b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpInvoiceticketService.java @@ -0,0 +1,8 @@ +package com.zt.plat.module.erp.service.erp; + +import com.zt.plat.module.erp.api.dto.ErpInvoiceticketSubmitReqDTO; +import com.zt.plat.module.erp.api.dto.ErpInvoiceticketSubmitRespDTO; + +public interface ErpInvoiceticketService { + ErpInvoiceticketSubmitRespDTO sbumitToErp020(ErpInvoiceticketSubmitReqDTO reqDTO); +} diff --git a/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpInvoiceticketServiceImpl.java b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpInvoiceticketServiceImpl.java new file mode 100644 index 0000000..4e9f906 --- /dev/null +++ b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpInvoiceticketServiceImpl.java @@ -0,0 +1,126 @@ +package com.zt.plat.module.erp.service.erp; + +import com.zt.plat.framework.security.core.util.SecurityFrameworkUtils; +import com.zt.plat.module.erp.api.ErpExternalApi; +import com.zt.plat.module.erp.api.dto.ErpInvoiceticketSubmitReqDTO; +import com.zt.plat.module.erp.api.dto.ErpInvoiceticketSubmitRespDTO; +import com.zt.plat.module.erp.api.dto.ErpSubmitReqDTO; +import jakarta.annotation.Resource; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Service +@Validated +public class ErpInvoiceticketServiceImpl implements ErpInvoiceticketService { + + @Resource + public ErpExternalApi erpExternalApi; + + @Override + public ErpInvoiceticketSubmitRespDTO sbumitToErp020(ErpInvoiceticketSubmitReqDTO erpInvoiceticketSubmitReqDTO) { + ErpSubmitReqDTO reqDTO = new ErpSubmitReqDTO(); + reqDTO.setFuncnr("020"); + reqDTO.setBskey(erpInvoiceticketSubmitReqDTO.getId()); + reqDTO.setUsrid(String.valueOf(SecurityFrameworkUtils.getLoginUserId())); + reqDTO.setUsrnm((SecurityFrameworkUtils.getLoginUserNickname())); + + Map req = new HashMap<>(); + req.put("vouchertype", erpInvoiceticketSubmitReqDTO.getVouchertype()); + req.put("voucherno", erpInvoiceticketSubmitReqDTO.getVoucherno()); + req.put("voucheryear", erpInvoiceticketSubmitReqDTO.getVoucheryear()); + reqDTO.setReq(req); + // 1. 调用ERP接口获取HashMap结果 + + HashMap result = erpExternalApi.submitDataToErp(reqDTO); + + // 2. 初始化响应实体 + ErpInvoiceticketSubmitRespDTO respDTO = new ErpInvoiceticketSubmitRespDTO(); + + // 3. 基础字段映射(String类型直接赋值,兼容空值) + respDTO.setPostDate(getStringValue(result, "postDate")); + respDTO.setSettlementsCode(getStringValue(result, "settlementsCode")); + respDTO.setState(getStringValue(result, "state")); + respDTO.setReason(getStringValue(result, "reason")); + respDTO.setRefDoc(getStringValue(result, "refDoc")); + respDTO.setRevDoc(getStringValue(result, "revDoc")); + respDTO.setRevYear(getStringValue(result, "revYear")); + respDTO.setRevDate(getStringValue(result, "revDate")); + + // 4. 子列表 callBackSettlementDetails 映射 + respDTO.setCallBackSettlementDetails(convertSettlementDetails(result)); + + return respDTO; + } + + /** + * 转换采购发票过账差异明细列表 + * 假设HashMap中子列表字段格式为:callBackSettlementDetails[0].factoryCode、callBackSettlementDetails[0].materialCode... + */ + private List convertSettlementDetails(Map result) { + List detailList = new ArrayList<>(); + if (result == null) { + return detailList; + } + + // 按索引遍历子列表数据,直到无对应字段为止 + int index = 0; + while (true) { + // 拼接子字段的key(根据实际返回的key格式调整,此处为标准嵌套格式) + String factoryCodeKey = String.format("callBackSettlementDetails[%d].factoryCode", index); + String materialCodeKey = String.format("callBackSettlementDetails[%d].materialCode", index); + String matDocKey = String.format("callBackSettlementDetails[%d].matDoc", index); + String materialDescKey = String.format("callBackSettlementDetails[%d].materialDesc", index); + String differenceAmountKey = String.format("callBackSettlementDetails[%d].differenceAmount", index); + + // 若核心字段(如factoryCode)为空,说明无更多子项,退出循环 + if (StringUtils.isBlank(getStringValue(result, factoryCodeKey))) { + break; + } + + // 构建子明细实体 + ErpInvoiceticketSubmitRespDTO.CallBackSettlementDetail detail = new ErpInvoiceticketSubmitRespDTO.CallBackSettlementDetail(); + detail.setFactoryCode(getStringValue(result, factoryCodeKey)); + detail.setMaterialCode(getStringValue(result, materialCodeKey)); + detail.setMatDoc(getStringValue(result, matDocKey)); + detail.setMaterialDesc(getStringValue(result, materialDescKey)); + // 金额字段转换(兼容空值和非数字场景) + detail.setDifferenceAmount(getBigDecimalValue(result, differenceAmountKey)); + + detailList.add(detail); + index++; + } + + // 无数据时返回null,避免前端接收空列表 + return detailList.isEmpty() ? null : detailList; + } + + /** + * 安全获取String值,避免null指针 + */ + private String getStringValue(Map map, String key) { + return map.getOrDefault(key, StringUtils.EMPTY); + } + + /** + * 安全转换BigDecimal,处理空值和格式错误 + */ + private BigDecimal getBigDecimalValue(Map map, String key) { + String value = map.get(key); + if (StringUtils.isBlank(value)) { + return null; + } + try { + return new BigDecimal(value); + } catch (NumberFormatException e) { + // 若金额格式错误,可根据业务选择返回null或抛出异常 + return null; + } + } +}