新增通过消费订单明细id获取明细
This commit is contained in:
@@ -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<Map<String, Integer>> handleCallback(@RequestBody OnlyOfficeCallback callback, @PathVariable String id,@RequestParam("fileName") String fileName) {
|
||||
public ResponseEntity<Map<String, Object>> handleCallback(@RequestBody OnlyOfficeCallback callback, @PathVariable String id,@RequestParam("fileName") String fileName) {
|
||||
// 处理回调逻辑
|
||||
callbackService.processCallback(callback,id,fileName);
|
||||
log.info("回调参数:【{}】",callback.toString());
|
||||
// 返回必须的响应,否则OnlyOffice会显示错误
|
||||
Map<String, Integer> response = new HashMap<>();
|
||||
Map<String, Object> 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<Map<String, Integer>> handleContractCallback(@RequestBody OnlyOfficeCallback callback, @PathVariable String id,@RequestParam("fileName") String fileName) {
|
||||
@@ -52,6 +56,7 @@ public class OnlyOfficeCallbackController {
|
||||
// 返回必须的响应,否则OnlyOffice会显示错误
|
||||
Map<String, Integer> response = new HashMap<>();
|
||||
response.put("error", 0);
|
||||
// response.put("version", 0);
|
||||
return new ResponseEntity<>(response, HttpStatus.OK);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
// 创建文件失败,处理错误
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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.*;
|
||||
|
||||
|
||||
@@ -44,4 +44,8 @@ public class TemplateInstanceDataDO extends BusinessBaseDO {
|
||||
@TableField("FLD_VAL")
|
||||
private String fldVal;
|
||||
|
||||
|
||||
@TableField(exist = false)
|
||||
private String fldName;
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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<TemplateInstanceDataRespVO> setTemplateInstanceDataRespVOS(Long id) {
|
||||
return BeanUtils.toBean(templateInstanceDataMapper.selectList(new LambdaQueryWrapper<TemplateInstanceDataDO>()
|
||||
List<TemplateInstanceDataRespVO> templateInstanceDataRespVOS = BeanUtils.toBean(templateInstanceDataMapper.selectList(new LambdaQueryWrapper<TemplateInstanceDataDO>()
|
||||
.eq(TemplateInstanceDataDO::getInscId, id)
|
||||
.eq(TemplateInstanceDataDO::getCompanyId, CompanyContextHolder.getCompanyId())), TemplateInstanceDataRespVO.class);
|
||||
List<TmplTpFldDO> 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<Long> ids) {
|
||||
@@ -470,11 +479,11 @@ public class TemplateInstanceServiceImpl implements TemplateInstanceService {
|
||||
List<String> itmIds = templateInstanceItemMapper.selectList(new LambdaQueryWrapper<TemplateInstanceItemDO>().eq(TemplateInstanceItemDO::getInscId, id)).stream().map(TemplateInstanceItemDO::getItmId).toList();
|
||||
|
||||
// 例模版条款去条款库查询条款信息
|
||||
if (!itmIds.isEmpty()){
|
||||
if (!itmIds.isEmpty()) {
|
||||
List<TmplItmRespVO> tmplItmRespVOS = BeanUtils.toBean(tmplItmService.listTmplItmByIds(itmIds), TmplItmRespVO.class);
|
||||
fieldAndClauseRespVO.setTmplItmRespVOS(BeanUtils.toBean(tmplItmRespVOS, TmplItmRespVO.class));
|
||||
}
|
||||
if (!valKeys.isEmpty()){
|
||||
if (!valKeys.isEmpty()) {
|
||||
//例模版字段去字段库查询字段信息
|
||||
List<TmplTpFldDO> tmplTpListByValKeys = tmplTpFldService.getTmplTpListByValKeys(valKeys);
|
||||
fieldAndClauseRespVO.setTmplFldRespVOS(BeanUtils.toBean(tmplTpListByValKeys, TmplFldRespVO.class));
|
||||
|
||||
@@ -96,6 +96,9 @@ public class TmplTpFldServiceImpl extends ServiceImpl<TmplTpFldMapper, TmplTpFld
|
||||
|
||||
@Override
|
||||
public List<TmplTpFldDO> getTmplTpListByValKeys(List<String> valNames) {
|
||||
if (CollUtil.isEmpty(valNames)){
|
||||
return new ArrayList<>();
|
||||
}
|
||||
return baseMapper.selectList(new LambdaQueryWrapper<TmplTpFldDO>().in(TmplTpFldDO::getFldKy, valNames));
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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<ErpInvoiceticketSubmitRespDTO> submitDataToErp(@Valid @RequestBody ErpInvoiceticketSubmitReqDTO reqDTO);
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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<CallBackSettlementDetail> 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;
|
||||
}
|
||||
}
|
||||
@@ -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<ErpInvoiceticketSubmitRespDTO> submitDataToErp(ErpInvoiceticketSubmitReqDTO reqDTO) {
|
||||
return success(erpInvoiceticketService.sbumitToErp020(reqDTO));
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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<String, Object> 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<String, String> 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<ErpInvoiceticketSubmitRespDTO.CallBackSettlementDetail> convertSettlementDetails(Map<String, String> result) {
|
||||
List<ErpInvoiceticketSubmitRespDTO.CallBackSettlementDetail> 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<String, String> map, String key) {
|
||||
return map.getOrDefault(key, StringUtils.EMPTY);
|
||||
}
|
||||
|
||||
/**
|
||||
* 安全转换BigDecimal,处理空值和格式错误
|
||||
*/
|
||||
private BigDecimal getBigDecimalValue(Map<String, String> 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user