diff --git a/order-management-base-service/src/main/java/com/dxhy/order/baseservice/config/BaseServiceConfig.java b/order-management-base-service/src/main/java/com/dxhy/order/baseservice/config/BaseServiceConfig.java index 9c8e7fed..c2a6acce 100644 --- a/order-management-base-service/src/main/java/com/dxhy/order/baseservice/config/BaseServiceConfig.java +++ b/order-management-base-service/src/main/java/com/dxhy/order/baseservice/config/BaseServiceConfig.java @@ -300,6 +300,9 @@ public class BaseServiceConfig{ @Value("${order.push.po.userName:}") private String poUserName; + @Value("${order.push.po.bzdStatus:}") + private String bzdStatus; + /** * 调用山能PO password */ diff --git a/order-management-base-service/src/main/java/com/dxhy/order/baseservice/module/thirdservice/redis/service/RedisService.java b/order-management-base-service/src/main/java/com/dxhy/order/baseservice/module/thirdservice/redis/service/RedisService.java index 0850d462..3d8d3d50 100644 --- a/order-management-base-service/src/main/java/com/dxhy/order/baseservice/module/thirdservice/redis/service/RedisService.java +++ b/order-management-base-service/src/main/java/com/dxhy/order/baseservice/module/thirdservice/redis/service/RedisService.java @@ -1,6 +1,7 @@ package com.dxhy.order.baseservice.module.thirdservice.redis.service; import java.util.List; +import java.util.Map; import java.util.Set; /** @@ -166,4 +167,14 @@ public interface RedisService { * @return */ Long getExpire(String key); + + void putHashMap(String key,String field,String value); + + String pullHashMap(String key,String field); + + Map pullAllHashMap(String key); + + Long delHashMap(String key); + + Long delHashMap(String key,String field); } diff --git a/order-management-base-service/src/main/java/com/dxhy/order/baseservice/module/thirdservice/redis/service/impl/RedisServiceImpl.java b/order-management-base-service/src/main/java/com/dxhy/order/baseservice/module/thirdservice/redis/service/impl/RedisServiceImpl.java index 7b951dda..64326be5 100644 --- a/order-management-base-service/src/main/java/com/dxhy/order/baseservice/module/thirdservice/redis/service/impl/RedisServiceImpl.java +++ b/order-management-base-service/src/main/java/com/dxhy/order/baseservice/module/thirdservice/redis/service/impl/RedisServiceImpl.java @@ -4,11 +4,13 @@ import com.dxhy.order.utils.JsonUtils; import com.dxhy.order.baseservice.module.thirdservice.redis.service.RedisService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.springframework.data.redis.core.HashOperations; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; @@ -198,4 +200,32 @@ public class RedisServiceImpl implements RedisService { public Long getExpire(String key) { return redisTemplate.getExpire(key); } + + @Override + public void putHashMap(String key,String field,String value){ + redisTemplate.opsForHash().put(key, field, value); + } + + @Override + public String pullHashMap(String key,String field){ + HashOperations stringHashOperations = redisTemplate.opsForHash(); + return stringHashOperations.get(key, field); + } + + @Override + public Map pullAllHashMap(String key){ + HashOperations stringHashOperations = redisTemplate.opsForHash(); + return stringHashOperations.entries(key); + } + + @Override + public Long delHashMap(String key) { + HashOperations stringHashOperations = redisTemplate.opsForHash(); + return stringHashOperations.delete(key); + } + + public Long delHashMap(String key,String field) { + HashOperations stringHashOperations = redisTemplate.opsForHash(); + return stringHashOperations.delete(key,field); + } } diff --git a/order-management-common/pom.xml b/order-management-common/pom.xml index 36af9bc2..c5395271 100644 --- a/order-management-common/pom.xml +++ b/order-management-common/pom.xml @@ -13,7 +13,11 @@ - + + org.hibernate.validator + hibernate-validator + ${hibernate.validator.version} + org.apache.commons diff --git a/order-management-common/src/main/java/com/dxhy/order/constant/OrderInfoEnum.java b/order-management-common/src/main/java/com/dxhy/order/constant/OrderInfoEnum.java index 224b0233..0c33e991 100644 --- a/order-management-common/src/main/java/com/dxhy/order/constant/OrderInfoEnum.java +++ b/order-management-common/src/main/java/com/dxhy/order/constant/OrderInfoEnum.java @@ -1290,6 +1290,7 @@ public enum OrderInfoEnum { INTERFACE_BUSINESS_ID_ZYKSSFFM("FI005","同步会计信息"), INTERFACE_BUSINESS_ID_DEPT("FI871","组织信息变更"), + INTERFACE_BUSINESS_ID_BZDSTATUS("FI890","获取报账单状态"), /** * 发票备注配置项枚举 */ diff --git a/order-management-common/src/main/java/com/dxhy/order/model/OrderItemInfo.java b/order-management-common/src/main/java/com/dxhy/order/model/OrderItemInfo.java index acac46e4..d9d0d8bf 100644 --- a/order-management-common/src/main/java/com/dxhy/order/model/OrderItemInfo.java +++ b/order-management-common/src/main/java/com/dxhy/order/model/OrderItemInfo.java @@ -189,5 +189,7 @@ public class OrderItemInfo implements Serializable { * 价税合计 */ private String jshj; + private String gxbz; + private String sykchje; } diff --git a/order-management-common/src/main/java/com/dxhy/order/model/page/OrderInvoiceInfoVo.java b/order-management-common/src/main/java/com/dxhy/order/model/page/OrderInvoiceInfoVo.java new file mode 100644 index 00000000..c3c65dc8 --- /dev/null +++ b/order-management-common/src/main/java/com/dxhy/order/model/page/OrderInvoiceInfoVo.java @@ -0,0 +1,120 @@ +package com.dxhy.order.model.page; + +import lombok.Getter; +import lombok.Setter; + +import java.util.Date; + +@Getter +@Setter +public class OrderInvoiceInfoVo { + + /** + * 订单表id + */ + private String orderInfoId; + /** + * 发票请求流水号 + */ + private String fpqqlsh; + /** + * 订单号 + */ + private String ddh; + + /** + * 发票代码 + */ + private String fpdm; + + /** + * 发票号码 + */ + private String fphm; + /** + * 开票合计金额 + */ + private String kphjje; + + /** + * 合计不含税金额 + */ + private String hjbhsje; + /** + * 开票税额 + */ + private String kpse; + /** + * 可冲红金额 + * 2019-04-01添加 + */ + private String sykchje; + + /** + * 剩余可充红不含税金额 + * 用于校验 + */ + private String sykchbhsje; + + /** + * 剩余可充红税额 + * 用于校验 + */ + private String sykchse; + /** + * 作废标志 + */ + private String zfBz; + /** + * 冲红标志 + */ + private String chBz; + //==================process============================= + + /** + * 发票种类代码 + */ + private String fpzlDm; + + /** + * 购货方名称 + */ + private String ghfMc; + + /** + * 购货方纳税人识别号 + */ + private String ghfNsrsbh; + /** + * 订单状态 + */ + private String ddzt; + + /** + * 销货方纳税人识别号 + */ + private String xhfNsrsbh; + + /** + * 销货方名称 + */ + private String xhfMc; + /** + * 报账单号 + */ + private String bzdh; + /** + * 系统来源 + */ + private String xtly; + private String fjh; + /** + * 数据权限ID + */ + private String entId; + + private Boolean selected; + + private Date kprq; + +} diff --git a/order-management-common/src/main/java/com/dxhy/order/model/page/RedInvoiceCheckReqPo.java b/order-management-common/src/main/java/com/dxhy/order/model/page/RedInvoiceCheckReqPo.java new file mode 100644 index 00000000..814d7b18 --- /dev/null +++ b/order-management-common/src/main/java/com/dxhy/order/model/page/RedInvoiceCheckReqPo.java @@ -0,0 +1,20 @@ +package com.dxhy.order.model.page; + +import lombok.Data; + +import javax.validation.constraints.NotNull; + +@Data +public class RedInvoiceCheckReqPo { + + @NotNull + private String lzbzdh; + + @NotNull + private String orderInfoId; + + @NotNull + private String xhfNsrsbh; + + private String sfhb; +} diff --git a/order-management-common/src/main/java/com/dxhy/order/model/page/RedInvoicePreReqPo.java b/order-management-common/src/main/java/com/dxhy/order/model/page/RedInvoicePreReqPo.java new file mode 100644 index 00000000..8902dfe4 --- /dev/null +++ b/order-management-common/src/main/java/com/dxhy/order/model/page/RedInvoicePreReqPo.java @@ -0,0 +1,23 @@ +package com.dxhy.order.model.page; + +import lombok.Data; + +@Data +public class RedInvoicePreReqPo { + + + /** + * 原发票发票种类 + */ + private String yfpFpzl; + + /** + * 原发票发票开票日期 + */ + private String yfpKprq; + + /** + * 冲红原因 + */ + private String chyy; +} diff --git a/order-management-common/src/main/java/com/dxhy/order/model/page/RedInvoiceRespPo.java b/order-management-common/src/main/java/com/dxhy/order/model/page/RedInvoiceRespPo.java new file mode 100644 index 00000000..af362252 --- /dev/null +++ b/order-management-common/src/main/java/com/dxhy/order/model/page/RedInvoiceRespPo.java @@ -0,0 +1,18 @@ +package com.dxhy.order.model.page; + +import com.dxhy.order.model.OrderItemInfo; +import lombok.Data; + +import java.util.List; + +@Data +public class RedInvoiceRespPo { + + private List redItemInfoList; + + private List orderInvoiceInfos; + private String redFpqqlsh; + private String redBzdh; + private String xhfNsrsbh; + private String gsdm; +} diff --git a/order-management-common/src/main/java/com/dxhy/order/model/page/RedInvoiceStageReqPo.java b/order-management-common/src/main/java/com/dxhy/order/model/page/RedInvoiceStageReqPo.java new file mode 100644 index 00000000..2d7a843c --- /dev/null +++ b/order-management-common/src/main/java/com/dxhy/order/model/page/RedInvoiceStageReqPo.java @@ -0,0 +1,19 @@ +package com.dxhy.order.model.page; + +import com.dxhy.order.model.OrderInvoiceInfo; +import com.dxhy.order.model.OrderItemInfo; +import lombok.Data; + +import java.util.List; + +@Data +public class RedInvoiceStageReqPo { + //红字勾选明细数据 + private List redItemList; + //蓝字勾选明细数据 + private List blueItemList; + //蓝字勾选发票数据 + private OrderInvoiceInfo blueInvoiceInfo; + //红字订单的发票请求流水号 + private String fpqqlsh; +} diff --git a/order-management-consumer/pom.xml b/order-management-consumer/pom.xml index d62ea91f..39f1ab77 100644 --- a/order-management-consumer/pom.xml +++ b/order-management-consumer/pom.xml @@ -16,8 +16,6 @@ - - diff --git a/order-management-consumer/src/main/java/com/dxhy/order/consumer/modules/manager/service/InvoiceService.java b/order-management-consumer/src/main/java/com/dxhy/order/consumer/modules/manager/service/InvoiceService.java index b979b46f..2b0e3040 100644 --- a/order-management-consumer/src/main/java/com/dxhy/order/consumer/modules/manager/service/InvoiceService.java +++ b/order-management-consumer/src/main/java/com/dxhy/order/consumer/modules/manager/service/InvoiceService.java @@ -116,4 +116,6 @@ public interface InvoiceService { */ void checkBuyerCheckBankFlag(List orderInfoIdList); + R saveRedInvoiceData(String redFpqqlsh, String xhfNsrsbh); + } diff --git a/order-management-consumer/src/main/java/com/dxhy/order/consumer/modules/manager/service/impl/InvoiceServiceImpl.java b/order-management-consumer/src/main/java/com/dxhy/order/consumer/modules/manager/service/impl/InvoiceServiceImpl.java index fa9ae393..88cb5a23 100644 --- a/order-management-consumer/src/main/java/com/dxhy/order/consumer/modules/manager/service/impl/InvoiceServiceImpl.java +++ b/order-management-consumer/src/main/java/com/dxhy/order/consumer/modules/manager/service/impl/InvoiceServiceImpl.java @@ -4,13 +4,13 @@ import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; import com.dxhy.base.constant.OrderSeparationException; import com.dxhy.base.constant.OrderSplitException; import com.dxhy.base.constant.TaxSeparateConfig; import com.dxhy.base.utils.PriceTaxSeparationUtilNew; import com.dxhy.order.baseservice.config.BaseServiceConfig; import com.dxhy.order.baseservice.module.base.model.DrawerInfoEntity; -import com.dxhy.order.baseservice.module.base.model.RuleSplitEntity; import com.dxhy.order.baseservice.module.base.service.BaseService; import com.dxhy.order.baseservice.module.base.service.DrawerInfoService; import com.dxhy.order.baseservice.module.base.service.RuleSplitService; @@ -31,26 +31,38 @@ import com.dxhy.order.consumer.modules.order.model.PageInvoiceItem; import com.dxhy.order.consumer.modules.order.model.PageInvoiceReq; import com.dxhy.order.consumer.modules.order.model.PageReInvoice; import com.dxhy.order.consumer.modules.order.service.*; +import com.dxhy.order.consumer.openapi.protocol.v4.order.*; +import com.dxhy.order.consumer.openapi.protocol.v6.hzqrd.QdCommonRspV6; +import com.dxhy.order.consumer.openapi.service.AllocateInvoiceInterfaceServiceV3; +import com.dxhy.order.consumer.openapi.service.InterfaceServiceV6; import com.dxhy.order.consumer.utils.BeanTransitionUtils; import com.dxhy.order.consumer.utils.TaxSpecialPolicyUtil; import com.dxhy.order.exception.OrderReceiveException; import com.dxhy.order.invoice.config.InvoiceConfig; import com.dxhy.order.invoice.module.fangge.service.FangGeService; import com.dxhy.order.invoice.module.invoice.dao.OrderInfoMapper; +import com.dxhy.order.invoice.module.invoice.model.Hzqrdxxmxqd; +import com.dxhy.order.invoice.module.invoice.model.Hzqrdxxqd; import com.dxhy.order.invoice.module.invoice.model.PageSld; +import com.dxhy.order.invoice.module.invoice.model.SpecialInvoiceReversalPlus; import com.dxhy.order.invoice.module.invoice.service.InvalidInvoiceService; import com.dxhy.order.invoice.module.invoice.service.OrderInvoiceInfoService; import com.dxhy.order.invoice.module.invoice.service.UnifyService; +import com.dxhy.order.invoice.module.invoicespecial.controller.SpecialInvoiceReversalController; import com.dxhy.order.invoice.utils.HttpInvoiceRequestUtil; import com.dxhy.order.model.*; +import com.dxhy.order.model.page.RedInvoiceStageReqPo; import com.dxhy.order.model.queue.FpkjMqData; import com.dxhy.order.model.sk.kp.CommonInvoiceStatus; import com.dxhy.order.model.sk.kp.InvoiceQuery; import com.dxhy.order.utils.CommonUtils; +import com.dxhy.order.utils.DistributedKeyMaker; import com.dxhy.order.utils.JsonUtils; import com.dxhy.order.utils.NsrsbhUtils; +import com.google.common.collect.Lists; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.joda.time.DateTime; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -60,7 +72,6 @@ import org.springframework.util.CollectionUtils; import javax.annotation.Resource; import java.math.BigDecimal; import java.util.*; -import java.util.stream.Collectors; /** * @author 杨士勇 @@ -148,6 +159,14 @@ public class InvoiceServiceImpl implements InvoiceService { @Resource private OrderSplitService orderSplitService; + private static final String KEY_PREFIX = "order:red:"; + private static final String KEY_RED_SYJE = "order:red:syje"; + @Resource + private SpecialInvoiceReversalController reversalController; + @Resource + private AllocateInvoiceInterfaceServiceV3 allocateInvoiceInterfaceServiceV3; + @Resource + private InterfaceServiceV6 interfaceServiceV6; @Override @@ -1622,4 +1641,212 @@ public class InvoiceServiceImpl implements InvoiceService { } + @Override + public R saveRedInvoiceData(String redFpqqlsh, String xhfNsrsbh) { + String key = KEY_PREFIX + redFpqqlsh; + Map allHashMap = redisService.pullAllHashMap(key); + OrderProcessInfo processInfo = orderProcessService.queryOrderProcessInfoByFpqqlsh(redFpqqlsh, Lists.newArrayList(xhfNsrsbh)); + if(processInfo == null || allHashMap == null){ + return R.error("参数有误!"); + } + if(processInfo.getPzgzrq() == null){ + return R.ok("缺少凭证过账日期数据"); + } + for (Map.Entry stringEntry : allHashMap.entrySet()) { + String entryValue = stringEntry.getValue(); + RedInvoiceStageReqPo invoiceStageReqPo = JSONObject.parseObject(entryValue, RedInvoiceStageReqPo.class); + List blueItemList = invoiceStageReqPo.getBlueItemList(); + OrderInvoiceInfo blueInvoiceInfo = invoiceStageReqPo.getBlueInvoiceInfo(); + BigDecimal blueMxje = blueItemList.stream().map(blueItem -> new BigDecimal(blueItem.getXmje())).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal blueSe = blueItemList.stream().map(blueItem -> new BigDecimal(blueItem.getSe())).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal hjzje = blueMxje.add(blueSe); + if(OrderInfoEnum.ORDER_INVOICE_TYPE_0.getKey().equals(blueInvoiceInfo.getFpzlDm())){ + + SpecialInvoiceReversalPlus specialInvoiceReversal = new SpecialInvoiceReversalPlus(); + BeanUtils.copyProperties(blueInvoiceInfo,specialInvoiceReversal); + specialInvoiceReversal.setFjh(blueInvoiceInfo.getFjh()); + specialInvoiceReversal.setYfpHm(blueInvoiceInfo.getFphm()); + specialInvoiceReversal.setYfpDm(blueInvoiceInfo.getFpdm()); + specialInvoiceReversal.setYfpKprq(blueInvoiceInfo.getKprq()); + specialInvoiceReversal.setChyy(OrderInfoEnum.ORDER_CHYY_2.getKey()); + specialInvoiceReversal.setHjbhsje("-"+blueMxje.toPlainString()); + specialInvoiceReversal.setHjse("-"+blueSe.toPlainString()); + specialInvoiceReversal.setKphjje("-"+hjzje.toPlainString()); + specialInvoiceReversal.setSqsm(OrderInfoEnum.SPECIAL_INVOICE_REASON_0000000100.getKey()); + specialInvoiceReversal.setAgentName(userInfoService.getUser().getName()); + specialInvoiceReversal.setType(OrderInfoEnum.SPECIAL_INVOICE_TYPE_0.getKey()); + if(OrderInfoEnum.QDBZ_CODE_4.getKey().equals(blueInvoiceInfo.getQdbz())){ + specialInvoiceReversal.setType(OrderInfoEnum.SPECIAL_INVOICE_TYPE_1.getKey()); + }else if(OrderInfoEnum.QDBZ_CODE_5.getKey().equals(blueInvoiceInfo.getQdbz()) || OrderInfoEnum.QDBZ_CODE_6.getKey().equals(blueInvoiceInfo.getQdbz())) { + specialInvoiceReversal.setType(OrderInfoEnum.SPECIAL_INVOICE_TYPE_3.getKey()); + } + List list = Lists.newArrayList(); + for (OrderItemInfo orderItemInfo : blueItemList) { + SpecialInvoiceReversalItem invoiceReversalItem = new SpecialInvoiceReversalItem(); + BeanUtils.copyProperties(orderItemInfo,invoiceReversalItem); + invoiceReversalItem.setXmje("-"+orderItemInfo.getXmje()); + invoiceReversalItem.setSe("-"+orderItemInfo.getSe()); + invoiceReversalItem.setXmsl("-"+orderItemInfo.getXmsl()); + list.add(invoiceReversalItem); + } + specialInvoiceReversal.setItems(list); + log.info("生成红字信息表,请求数据:{}",JSONObject.toJSONString(specialInvoiceReversal)); + R r = reversalController.addSpecialInvoiceReversal(JSONObject.toJSONString(specialInvoiceReversal)); + log.info("生成红字信息表,返回数据:{}",r); + } else if(OrderInfoEnum.ORDER_INVOICE_TYPE_01.getKey().equals(blueInvoiceInfo.getFpzlDm()) || OrderInfoEnum.ORDER_INVOICE_TYPE_02.getKey().equals(blueInvoiceInfo.getFpzlDm())) { + Hzqrdxxqd hzqrdxxqd = new Hzqrdxxqd(); + hzqrdxxqd.setUUID(DistributedKeyMaker.generateShotKey()); + BeanUtils.copyProperties(blueInvoiceInfo,hzqrdxxqd); + hzqrdxxqd.setXSFNSRSBH(blueInvoiceInfo.getXhfNsrsbh()); + hzqrdxxqd.setXSFMC(blueInvoiceInfo.getXhfMc()); + hzqrdxxqd.setGMFNSRSBH(blueInvoiceInfo.getGhfNsrsbh()); + hzqrdxxqd.setGMFMC(blueInvoiceInfo.getGhfMc()); + hzqrdxxqd.setLZFPDM(blueInvoiceInfo.getFpdm()); + hzqrdxxqd.setLZFPHM(blueInvoiceInfo.getFphm()); + hzqrdxxqd.setSFZZFPBZ("N"); + hzqrdxxqd.setLZKPRQ(DateUtil.format(blueInvoiceInfo.getKprq(), "yyyy-MM-dd")); + hzqrdxxqd.setLZHJJE(blueInvoiceInfo.getHjbhsje()); + hzqrdxxqd.setLZHJSE(blueInvoiceInfo.getKpse()); + hzqrdxxqd.setLZFPPZDM(blueInvoiceInfo.getFpzlDm()); + hzqrdxxqd.setHZCXJE("-"+blueMxje.toPlainString()); + hzqrdxxqd.setHZCXSE("-"+blueSe.toPlainString()); + hzqrdxxqd.setCHYYDM("01"); + List list = Lists.newArrayList(); + Integer index = 1; + for (OrderItemInfo orderItemInfo : blueItemList) { + Hzqrdxxmxqd hzqrdxxmxqd = new Hzqrdxxmxqd(); + BeanUtils.copyProperties(orderItemInfo,hzqrdxxmxqd); + hzqrdxxmxqd.setXH(String.valueOf(index)); + hzqrdxxmxqd.setLZMXXH(orderItemInfo.getSphxh()); + hzqrdxxmxqd.setSPHFWSSFLHBBM(orderItemInfo.getSpbm()); + hzqrdxxmxqd.setXMMC(orderItemInfo.getXmmc()); + hzqrdxxmxqd.setGGXH(orderItemInfo.getGgxh()); + hzqrdxxmxqd.setDW(orderItemInfo.getXmdw()); + hzqrdxxmxqd.setFPSPDJ(orderItemInfo.getXmdj()); + hzqrdxxmxqd.setFPSPSL("-"+orderItemInfo.getXmsl()); + hzqrdxxmxqd.setJE("-"+orderItemInfo.getXmje()); + hzqrdxxmxqd.setSLV(orderItemInfo.getSl()); + hzqrdxxmxqd.setSE("-"+orderItemInfo.getSe()); + list.add(hzqrdxxmxqd); + index++; + } + hzqrdxxqd.setHZQRXXMXLIST(list); + log.info("生成红字确认单信息:请求税控数据{}",JSONObject.toJSONString(hzqrdxxqd)); + QdCommonRspV6 qdCommonRspV6 = interfaceServiceV6.processProxyForQd(ConfigurerInfo.RED_CONFIRMATION_APPLY, JSONObject.toJSONString(hzqrdxxqd)); + log.info("生成红字确认单信息:税控数据返回信息{}",JSONObject.toJSONString(qdCommonRspV6)); + } else if(OrderInfoEnum.ORDER_INVOICE_TYPE_2.getKey().equals(blueInvoiceInfo.getFpzlDm()) || OrderInfoEnum.ORDER_INVOICE_TYPE_51.getKey().equals(blueInvoiceInfo.getFpzlDm())) { + List shList = Lists.newArrayList(); + shList.add(blueInvoiceInfo.getXhfNsrsbh()); + OrderInfo orderInfo = orderInfoService.queryOrderInfoByFpqqlsh(blueInvoiceInfo.getFpqqlsh(), shList); + DdpcxxReqBO ddpcxxReq = new DdpcxxReqBO(); + DdpcxxBO ddpcxxBO = new DdpcxxBO(); + ddpcxxBO.setDDQQPCH(DistributedKeyMaker.generateShotKey()); + ddpcxxBO.setNSRSBH(blueInvoiceInfo.getXhfNsrsbh()); + ddpcxxBO.setENTID(blueInvoiceInfo.getEntId()); + ddpcxxBO.setFPLXDM(OrderInfoEnum.ORDER_INVOICE_TYPE_51.getKey().equals(blueInvoiceInfo.getFpzlDm())?"026":"007"); + ddpcxxBO.setKPFS("1"); + + ddpcxxReq.setDDPCXX(ddpcxxBO); + List ddzxxBOList = Lists.newArrayList(); + DdzxxBO ddzxxBO = new DdzxxBO(); + DdtxxBO ddtxxBO = new DdtxxBO(); + ddtxxBO.setDDQQLSH(DistributedKeyMaker.generateShotKey()); + ddtxxBO.setENTID(blueInvoiceInfo.getEntId()); + ddtxxBO.setNSRSBH(blueInvoiceInfo.getXhfNsrsbh()); + ddtxxBO.setNSRMC(blueInvoiceInfo.getXhfMc()); + ddtxxBO.setKPLX("1"); + ddtxxBO.setXHFSBH(blueInvoiceInfo.getXhfNsrsbh()); + ddtxxBO.setXHFMC(blueInvoiceInfo.getXhfMc()); + ddtxxBO.setXHFDZ(orderInfo.getXhfDz()); + ddtxxBO.setXHFDH(orderInfo.getXhfDh()); + ddtxxBO.setXHFYH(orderInfo.getXhfYh()); + ddtxxBO.setXHFZH(orderInfo.getXhfZh()); + ddtxxBO.setGMFBM(orderInfo.getGhfId()); + ddtxxBO.setGMFSBH(orderInfo.getGhfNsrsbh()); + ddtxxBO.setGMFMC(orderInfo.getGhfMc()); + ddtxxBO.setGMFDZ(orderInfo.getGhfDz()); + ddtxxBO.setGMFDH(orderInfo.getGhfDh()); + ddtxxBO.setGMFYH(orderInfo.getGhfYh()); + ddtxxBO.setGMFZH(orderInfo.getGhfZh()); + ddtxxBO.setGMFLX(orderInfo.getGhfQylx()); + ddtxxBO.setGMFSF(orderInfo.getGhfSf()); + ddtxxBO.setGMFSJH(orderInfo.getGhfSf()); + ddtxxBO.setGMFDZYX(orderInfo.getGhfEmail()); + ddtxxBO.setKPR(orderInfo.getKpr()); + ddtxxBO.setSKR(orderInfo.getSkr()); + ddtxxBO.setFHR(orderInfo.getFhr()); + ddtxxBO.setYFPDM(blueInvoiceInfo.getFpdm()); + ddtxxBO.setYFPHM(blueInvoiceInfo.getFphm()); + ddtxxBO.setYFPLX(ddpcxxBO.getFPLXDM()); + ddtxxBO.setYFPKPRQ(DateUtil.format(blueInvoiceInfo.getKprq(), "yyyy-MM-dd")); + ddtxxBO.setJSHJ("-"+hjzje); + ddtxxBO.setHJJE("-"+blueMxje); + ddtxxBO.setHJSE("-"+blueSe); + ddtxxBO.setBZ(orderInfo.getBz()); + ddtxxBO.setCHYY(OrderInfoEnum.ORDER_CHYY_2.getKey()); + ddtxxBO.setDDH(DistributedKeyMaker.generateShotKey()); + ddtxxBO.setDDSJ(DateTime.now().toString("yyyy-MM-dd")); + ddtxxBO.setKPFS("1"); + ddtxxBO.setDDLY(OrderInfoEnum.ORDER_SOURCE_2.getKey()); + ddtxxBO.setXTLY(OrderInfoEnum.SYS_SOURCE_FPPAGE.getKey()); + ddtxxBO.setBHZT(ConfigureConstant.STRING_0); + ddtxxBO.setTSCHBZ(ConfigureConstant.STRING_0); + ddtxxBO.setQDBZ(blueItemList.size()> ConfigureConstant.INT_8?OrderInfoEnum.QDBZ_CODE_1.getKey():OrderInfoEnum.QDBZ_CODE_0.getKey()); + if(OrderInfoEnum.QDBZ_CODE_5.getKey().equals(blueInvoiceInfo.getQdbz()) || OrderInfoEnum.QDBZ_CODE_6.getKey().equals(blueInvoiceInfo.getQdbz())){ + ddtxxBO.setQDBZ(blueItemList.size()> ConfigureConstant.INT_8?OrderInfoEnum.QDBZ_CODE_6.getKey():OrderInfoEnum.QDBZ_CODE_5.getKey()); + } else if (OrderInfoEnum.QDBZ_CODE_2.getKey().equals(blueInvoiceInfo.getQdbz()) || OrderInfoEnum.QDBZ_CODE_3.getKey().equals(blueInvoiceInfo.getQdbz())){ + ddtxxBO.setQDBZ(blueItemList.size()> ConfigureConstant.INT_8?OrderInfoEnum.QDBZ_CODE_3.getKey():OrderInfoEnum.QDBZ_CODE_2.getKey()); + } else if (OrderInfoEnum.QDBZ_CODE_7.getKey().equals(blueInvoiceInfo.getQdbz()) || OrderInfoEnum.QDBZ_CODE_8.getKey().equals(blueInvoiceInfo.getQdbz())) { + ddtxxBO.setQDBZ(blueItemList.size() > ConfigureConstant.INT_8 ? OrderInfoEnum.QDBZ_CODE_8.getKey() : OrderInfoEnum.QDBZ_CODE_7.getKey()); + }else if (OrderInfoEnum.QDBZ_CODE_4.getKey().equals(blueInvoiceInfo.getQdbz())) { + ddtxxBO.setQDBZ(OrderInfoEnum.QDBZ_CODE_4.getKey()); + } +// ddtxxBO.setYGXM(); +// ddtxxBO.setKPPZH(); + ddtxxBO.setPZGZRQ(DateUtil.format(processInfo.getPzgzrq(), "yyyy-MM-dd")); + ddtxxBO.setYZFP(ConfigureConstant.STRING_0); +// ddtxxBO.setKB(); +// ddtxxBO.setXHFBM(); + ddzxxBO.setDDTXX(ddtxxBO); + List ddmxxxBOList = Lists.newArrayList(); + Integer index = 1; + for (OrderItemInfo orderItemInfo : blueItemList) { + DdmxxxBO ddmxxxBO = new DdmxxxBO(); + ddmxxxBO.setXH(String.valueOf(index)); + ddmxxxBO.setDYLZFPMXXH(orderItemInfo.getSphxh()); + ddmxxxBO.setFPHXZ(orderItemInfo.getFphxz()); + ddmxxxBO.setSPBM(orderItemInfo.getSpbm()); + ddmxxxBO.setZXBM(orderItemInfo.getZxbm()); + ddmxxxBO.setYHZCBS(orderItemInfo.getYhzcbs()); + ddmxxxBO.setLSLBS(orderItemInfo.getLslbs()); + ddmxxxBO.setZZSTSGL(orderItemInfo.getZzstsgl()); + ddmxxxBO.setXMMC(orderItemInfo.getXmmc()); + ddmxxxBO.setGGXH(orderItemInfo.getGgxh()); + ddmxxxBO.setDW(orderItemInfo.getXmdw()); + ddmxxxBO.setSPSL("-"+orderItemInfo.getXmsl()); + ddmxxxBO.setDJ(orderItemInfo.getXmdj()); + ddmxxxBO.setJE("-"+orderItemInfo.getXmje()); + ddmxxxBO.setHSBZ(orderItemInfo.getHsbz()); + ddmxxxBO.setSL(orderItemInfo.getSl()); + ddmxxxBO.setSE("-"+orderItemInfo.getSe()); + ddmxxxBO.setKCE(orderItemInfo.getKce()); + ddmxxxBO.setBYZD1(orderItemInfo.getByzd1()); + ddmxxxBO.setBYZD2(orderItemInfo.getByzd2()); + ddmxxxBO.setBYZD3(orderItemInfo.getByzd3()); + ddmxxxBO.setPH(orderItemInfo.getPh()); + ddmxxxBO.setKB(orderItemInfo.getKb()); + ddmxxxBOList.add(ddmxxxBO); + } + ddzxxBO.setDDMXXX(ddmxxxBOList); + ddzxxBOList.add(ddzxxBO); + ddpcxxReq.setDDZXX(ddzxxBOList); + log.info("生成负数单据,请求接口数据{}",JSONObject.toJSONString(ddpcxxReq)); + DdpcxxRspBO ddpcxxRspBO = allocateInvoiceInterfaceServiceV3.allocateInvoicesV3(ddpcxxReq, "", null, ConfigurerInfo.INTERFACE_VERSION_V6); + log.info("生成负数单据,返回数据:{}",JSONObject.toJSONString(ddpcxxRspBO)); + } + } + + return R.ok(); + } + } diff --git a/order-management-consumer/src/main/java/com/dxhy/order/consumer/modules/order/controller/OrderInvoiceController.java b/order-management-consumer/src/main/java/com/dxhy/order/consumer/modules/order/controller/OrderInvoiceController.java index 4ae21f23..044b57d5 100644 --- a/order-management-consumer/src/main/java/com/dxhy/order/consumer/modules/order/controller/OrderInvoiceController.java +++ b/order-management-consumer/src/main/java/com/dxhy/order/consumer/modules/order/controller/OrderInvoiceController.java @@ -1,16 +1,25 @@ package com.dxhy.order.consumer.modules.order.controller; +import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONException; +import com.alibaba.fastjson.JSONObject; import com.dxhy.order.baseservice.module.base.service.BaseService; +import com.dxhy.order.baseservice.module.thirdservice.redis.service.RedisService; import com.dxhy.order.constant.ConfigureConstant; import com.dxhy.order.constant.OrderInfoContentEnum; import com.dxhy.order.constant.OrderInfoEnum; import com.dxhy.order.constant.OrderManagementConstant; import com.dxhy.order.consumer.modules.order.model.dto.RewriteBzdhDTO; import com.dxhy.order.consumer.modules.order.service.OrderBzdhService; +import com.dxhy.order.consumer.modules.order.service.OrderItemInfoService; +import com.dxhy.order.exception.OrderReceiveException; import com.dxhy.order.model.*; +import com.dxhy.order.model.page.RedInvoiceCheckReqPo; +import com.dxhy.order.model.page.RedInvoicePreReqPo; +import com.dxhy.order.model.page.RedInvoiceRespPo; +import com.dxhy.order.model.page.RedInvoiceStageReqPo; import com.dxhy.order.model.sk.kp.CommonInvoiceStatus; import com.dxhy.order.utils.CommonUtils; import com.dxhy.order.utils.JsonUtils; @@ -28,17 +37,18 @@ import com.dxhy.order.invoice.module.invoice.service.OrderInvoiceInfoService; import com.dxhy.order.invoice.module.invoice.service.UnifyService; import com.dxhy.order.invoice.module.invoicespecial.model.SpecialInvoiceReversalEntity; import com.dxhy.order.invoice.module.invoicespecial.service.SpecialInvoiceReversalService; -import com.dxhy.order.utils.StringUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.math.BigDecimal; import java.util.*; +import java.util.stream.Collectors; /** * @author :杨士勇 @@ -82,6 +92,12 @@ public class OrderInvoiceController { @Resource private BaseService baseService; + @Resource + private OrderItemInfoService itemInfoService; + @Resource + private RedisService redisService; + private static final String KEY_PREFIX = "order:red:"; + /** * 异常订单直接开票接口 @@ -138,6 +154,153 @@ public class OrderInvoiceController { return R.error().put(OrderManagementConstant.MESSAGE, "未知异常,请联系管理员!"); } } + /** + * 山能定制冲红流程,普票负数开具、专票的红字申请、数电红字确认单 + * + * @param + * @return + */ + @ApiOperation(value = "冲红流程", notes = "订单开票-冲红流程校验的接口") + @PostMapping("/checkRedInvoice") + @SysLog(operation = "冲红流程", operationDesc = "订单开具冲红流程校验", key = "冲红流程") + public R checkRedInvoice(@RequestBody @Validated RedInvoiceCheckReqPo redInvoiceReqPo) { + try { + return orderInvoiceInfoService.checkRedInvoice(redInvoiceReqPo); + } catch (OrderReceiveException e){ + return R.error(e.getMessage()); + } catch (Exception e) { + log.error("{}待开订单开具接口,参数转换异常e:{}", LOGGER_MSG, e); + return R.error().put(OrderManagementConstant.MESSAGE, "未知异常,请联系管理员!"); + } + } + + /** + * 山能定制冲红流程,普票负数开具、专票的红字申请、数电红字确认单 + * + * @param + * @return + */ + @ApiOperation(value = "冲红流程", notes = "订单开票-冲红流程获取数据的接口") + @PostMapping("/getOrderInvoiceData") + @SysLog(operation = "冲红流程", operationDesc = "订单开具冲红流程校验", key = "冲红流程") + public R getOrderInvoiceData(@RequestBody @Validated RedInvoiceCheckReqPo redInvoiceReqPo) { + try { + RedInvoiceRespPo orderInvoiceData = orderInvoiceInfoService.getOrderInvoiceData(redInvoiceReqPo); + return R.ok().put(OrderManagementConstant.DATA,orderInvoiceData); + } catch (Exception e) { + log.error("{}待开订单开具接口,参数转换异常e:{}", LOGGER_MSG, e); + return R.error().put(OrderManagementConstant.MESSAGE, "未知异常,请联系管理员!"); + } + } + + @ApiOperation(value = "冲红流程", notes = "订单开票-冲红流程获取数据的接口") + @PostMapping("/saveRedInvoiceData") + @SysLog(operation = "冲红流程", operationDesc = "订单开具冲红流程数据保存", key = "冲红流程") + public R saveRedInvoiceData(@RequestBody RedInvoiceRespPo redInvoiceRespPo) { + try { + return invoiceService.saveRedInvoiceData(redInvoiceRespPo.getRedFpqqlsh(),redInvoiceRespPo.getXhfNsrsbh()); + } catch (Exception e) { + log.error("{}待开订单开具接口,参数转换异常e:{}", LOGGER_MSG, e); + return R.error().put(OrderManagementConstant.MESSAGE, "未知异常,请联系管理员!"); + } + } + + /** + * 获取蓝字发票明细订单 + * @param param + * @return + */ + @ApiOperation(value = "冲红流程", notes = "订单开票-冲红流程获取发票明细数据的接口") + @PostMapping("/getOrderItemData") + @SysLog(operation = "冲红流程", operationDesc = "冲红流程获取发票明细数据的接口", key = "冲红流程") + public R getOrderItemData(@RequestBody String param) { + try { + JSONObject jsonObject = JSONObject.parseObject(param); + List orderItemInfos = itemInfoService.selectOrderItemInfoByOrderId(jsonObject.getString("orderInfoId"), Arrays.asList(jsonObject.getString("xhfNsrsbh"))); + + if(CollectionUtil.isNotEmpty(orderItemInfos)){ + OrderInvoiceInfo invoiceInfo = new OrderInvoiceInfo(); + invoiceInfo.setOrderInfoId(jsonObject.getString("orderInfoId")); + OrderInvoiceInfo orderInvoiceInfo = orderInvoiceInfoService.selectOrderInvoiceInfo(invoiceInfo, Arrays.asList(jsonObject.getString("xhfNsrsbh"))); + String key = KEY_PREFIX + jsonObject.getString("redFpqqlsh"); + String innerKey = StringUtils.isBlank(orderInvoiceInfo.getFpdm())?"":orderInvoiceInfo.getFpdm() + orderInvoiceInfo.getFphm(); + String value = redisService.pullHashMap(key, innerKey); + if(StringUtils.isNotBlank(value)){ + RedInvoiceStageReqPo invoiceStageReqPo = JSONObject.parseObject(value, RedInvoiceStageReqPo.class); + List blueItemList = invoiceStageReqPo.getBlueItemList(); + Map selectMap = blueItemList.stream().distinct().collect(Collectors.toMap(OrderItemInfo::getId, OrderItemInfo::getId)); + for (OrderItemInfo orderItemInfo : orderItemInfos) { + if(StringUtils.isNotBlank(selectMap.get(orderItemInfo.getId()))){ + orderItemInfo.setGxbz("1"); + } + } + } + } + return R.ok().put(OrderManagementConstant.DATA,orderItemInfos); + } catch (Exception e) { + log.error("{}待开订单开具接口,参数转换异常e:{}", LOGGER_MSG, e); + return R.error().put(OrderManagementConstant.MESSAGE, "未知异常,请联系管理员!"); + } + } + + /** + * 保存红字明细与蓝字发票的关联关系 + * @param + * @return + */ + @ApiOperation(value = "冲红流程", notes = "订单开票-冲红流程数据暂存接口") + @PostMapping("/stageRedInvoiceData") + @SysLog(operation = "冲红流程", operationDesc = "冲红流程数据暂存接口", key = "冲红流程") + public R stageRedInvoiceData(@RequestBody RedInvoiceStageReqPo redInvoiceSaveReqPo) { + try { + //红字 + return orderInvoiceInfoService.stageRedInvoiceData(redInvoiceSaveReqPo); + } catch (Exception e) { + log.error("{}待开订单开具接口,参数转换异常e:{}", LOGGER_MSG, e); + return R.error().put(OrderManagementConstant.MESSAGE, "未知异常,请联系管理员!"); + } + } + + /** + * 生成预制 + * @param + * @return + */ + @ApiOperation(value = "冲红流程", notes = "订单开票-冲红流程生成预览数据接口") + @PostMapping("/generatePreInvoice") + @SysLog(operation = "冲红流程", operationDesc = "冲红流程生成预览数据接口", key = "冲红流程") + public R generatePreInvoice(@RequestBody RedInvoicePreReqPo redInvoicePreReqPo) { + try { + + + return R.ok(); + } catch (Exception e) { + log.error("{}待开订单开具接口,参数转换异常e:{}", LOGGER_MSG, e); + return R.error().put(OrderManagementConstant.MESSAGE, "未知异常,请联系管理员!"); + } + } + + /** + * 发票开具、专票冲红申请红字、数电申请红字确认单 + * @param + * @return + */ + @ApiOperation(value = "冲红流程", notes = "订单开票-冲红流程保存并开具发票") + @PostMapping("/saveInvoiceData") + @SysLog(operation = "冲红流程", operationDesc = "冲红流程保存并开具发票", key = "冲红流程") + public R saveInvoiceData(@RequestBody RedInvoicePreReqPo redInvoicePreReqPo) { + try { + + //如果是普通 + return R.ok(); + } catch (Exception e) { + log.error("{}待开订单开具接口,参数转换异常e:{}", LOGGER_MSG, e); + return R.error().put(OrderManagementConstant.MESSAGE, "未知异常,请联系管理员!"); + } + } + + + /** * 生成预制发票(非拆分场景) diff --git a/order-management-consumer/src/main/resources/bootstrap-dev.yaml b/order-management-consumer/src/main/resources/bootstrap-dev.yaml index 2b96069f..ff28b374 100644 --- a/order-management-consumer/src/main/resources/bootstrap-dev.yaml +++ b/order-management-consumer/src/main/resources/bootstrap-dev.yaml @@ -4,15 +4,15 @@ spring: nacos: config: # Nacos config 地址 - server-addr: 172.31.36.147:33000 + server-addr: 10.1.1.72:8848 # Nacos config 命名空间,对应配置中的名称(sims_order_namespace) - namespace: a049b41c-b0a8-4a66-91b1-f3f3cab0e524 + namespace: sdenergy-order # Nacos config 分组 group: sims-order-config # Nacos config 登录用户名 username: nacos # Nacos config 登录密码 - password: Invoice.nacos.!1 + password: nacos # Nacos config 配置文件前缀 prefix: sims-order-api # Nacos config 配置文件后缀,拼接完URL需要对应NacosServer中的dataId对应配置,${prefix}-${spring.profiles.active}.${file-extension} @@ -53,9 +53,7 @@ spring: # Nacos discovery 配置 discovery: # Nacos discovery 服务地址 - server-addr: ${spring.cloud.nacos.config.server-addr} - username: ${spring.cloud.nacos.config.username} - password: ${spring.cloud.nacos.config.password} + server-addr: 10.1.1.72:8848 #sentinel配置相关 sentinel: #sentinel是否开启控制 diff --git a/order-management-invoice/pom.xml b/order-management-invoice/pom.xml index c86bd38b..f05356d5 100644 --- a/order-management-invoice/pom.xml +++ b/order-management-invoice/pom.xml @@ -17,8 +17,11 @@ - - + + org.redisson + redisson-spring-boot-starter + 3.12.5 + diff --git a/order-management-invoice/src/main/java/com/dxhy/order/invoice/config/RedissonConfig.java b/order-management-invoice/src/main/java/com/dxhy/order/invoice/config/RedissonConfig.java new file mode 100644 index 00000000..d0252f2e --- /dev/null +++ b/order-management-invoice/src/main/java/com/dxhy/order/invoice/config/RedissonConfig.java @@ -0,0 +1,40 @@ +//package com.dxhy.order.invoice.config; +// +//import org.apache.commons.lang3.StringUtils; +//import org.redisson.Redisson; +//import org.redisson.api.RedissonClient; +//import org.redisson.config.Config; +//import org.redisson.config.ReadMode; +//import org.redisson.config.SentinelServersConfig; +//import org.springframework.boot.autoconfigure.data.redis.RedisProperties; +//import org.springframework.context.annotation.Bean; +// +//import javax.annotation.Resource; +//import java.util.List; +// +//public class RedissonConfig { +// +// @Resource +// private RedisProperties redisProperties; +// +// //哨兵模式配置 +// @Bean +// RedissonClient redissonSentinel() { +// Config config = new Config(); +// RedisProperties.Sentinel sentinel = redisProperties.getSentinel(); +// List newNodes = sentinel.getNodes(); +// newNodes.stream().forEach((index) -> newNodes.add( +// index.startsWith("redis://") ? index : "redis://" + index)); +// +// SentinelServersConfig serverConfig = config.useSentinelServers() +// .addSentinelAddress(newNodes.toArray(new String[0])) +// .setMasterName(sentinel.getMaster()) +// .setReadMode(ReadMode.SLAVE); +// +// if (StringUtils.isNotBlank(redisProperties.getPassword())) { +// serverConfig.setPassword(redisProperties.getPassword()); +// } +// return Redisson.create(config); +// } +// +//} diff --git a/order-management-invoice/src/main/java/com/dxhy/order/invoice/module/invoice/controller/InvoiceDetailsController.java b/order-management-invoice/src/main/java/com/dxhy/order/invoice/module/invoice/controller/InvoiceDetailsController.java index 03d9e3ec..c3fca2a1 100644 --- a/order-management-invoice/src/main/java/com/dxhy/order/invoice/module/invoice/controller/InvoiceDetailsController.java +++ b/order-management-invoice/src/main/java/com/dxhy/order/invoice/module/invoice/controller/InvoiceDetailsController.java @@ -93,7 +93,7 @@ public class InvoiceDetailsController { @Autowired private OfdToPngSDEnergyService ofdToPngSDEnergyService; - @Value("${yx.isuse}") + @Value("${yx.isuse:}") private String yxisuse; @GetMapping("priviewOfd") diff --git a/order-management-invoice/src/main/java/com/dxhy/order/invoice/module/invoice/dao/GsClientFindMapper.java b/order-management-invoice/src/main/java/com/dxhy/order/invoice/module/invoice/dao/GsClientFindMapper.java new file mode 100644 index 00000000..0d4952bd --- /dev/null +++ b/order-management-invoice/src/main/java/com/dxhy/order/invoice/module/invoice/dao/GsClientFindMapper.java @@ -0,0 +1,9 @@ +package com.dxhy.order.invoice.module.invoice.dao; + +import com.dxhy.order.invoice.module.invoice.model.GsClient; +import java.util.List; + +public interface GsClientFindMapper { ; + List selectByGsdm(String gsdm); + +} \ No newline at end of file diff --git a/order-management-invoice/src/main/java/com/dxhy/order/invoice/module/invoice/dao/OrderInvoiceInfoMapper.java b/order-management-invoice/src/main/java/com/dxhy/order/invoice/module/invoice/dao/OrderInvoiceInfoMapper.java index 907da478..e994bd6b 100644 --- a/order-management-invoice/src/main/java/com/dxhy/order/invoice/module/invoice/dao/OrderInvoiceInfoMapper.java +++ b/order-management-invoice/src/main/java/com/dxhy/order/invoice/module/invoice/dao/OrderInvoiceInfoMapper.java @@ -6,6 +6,7 @@ import com.dxhy.order.model.OrderInvoiceInfo; import com.dxhy.order.invoice.module.invoice.model.bo.CountInvoiceByMonthBO; import com.dxhy.order.invoice.module.invoice.model.bo.QueryCountInvoiceBO; import com.dxhy.order.invoice.module.invoice.model.vo.*; +import com.dxhy.order.model.page.OrderInvoiceInfoVo; import org.apache.ibatis.annotations.Param; import java.util.Date; @@ -248,4 +249,9 @@ public interface OrderInvoiceInfoMapper { List countInoviceInfo(@Param("orderInfoIds")List orderInfoIds); List selectInvoiceInfoByFpqqlshs(@Param("fpqqlshs") List fpqqlshs); + + /** + * 根据报账单查询蓝字发票信息 + */ + List selectInvoiceInfoByBzdh(@Param("bzdh") String bzdh, @Param("shList") List shList); } diff --git a/order-management-invoice/src/main/java/com/dxhy/order/invoice/module/invoice/model/GsClient.java b/order-management-invoice/src/main/java/com/dxhy/order/invoice/module/invoice/model/GsClient.java new file mode 100644 index 00000000..56836904 --- /dev/null +++ b/order-management-invoice/src/main/java/com/dxhy/order/invoice/module/invoice/model/GsClient.java @@ -0,0 +1,19 @@ +package com.dxhy.order.invoice.module.invoice.model; + +import lombok.Data; + +import java.util.Date; + +@Data +public class GsClient { + private Integer id; + + private String gsdm; + + private String gsmc; + + private String client; + + private Date createTime; + +} \ No newline at end of file diff --git a/order-management-invoice/src/main/java/com/dxhy/order/invoice/module/invoice/model/Hzqrdxxmxqd.java b/order-management-invoice/src/main/java/com/dxhy/order/invoice/module/invoice/model/Hzqrdxxmxqd.java new file mode 100644 index 00000000..36529e16 --- /dev/null +++ b/order-management-invoice/src/main/java/com/dxhy/order/invoice/module/invoice/model/Hzqrdxxmxqd.java @@ -0,0 +1,41 @@ +package com.dxhy.order.invoice.module.invoice.model; + +import lombok.Getter; +import lombok.Setter; + +import java.io.Serializable; + +/** + * @author: yaoxuguang + * @createDate: Created in 2022-11-10 + */ +@Getter +@Setter +public class Hzqrdxxmxqd implements Serializable { + + /** + * XH : 序号 + * LZMXXH : 蓝字发票明细序号 + * SPHFWSSFLHBBM : 商品和服务税收分类合并编码 + * XMMC : 项目名称 + * GGXH : 规格型号 + * DW : 单位 + * FPSPDJ : 单价 + * FPSPSL : 数量 + * JE : 金额 + * SLV : 税率 + * SE : 税额 + */ + + private String XH; + private String LZMXXH; + private String SPHFWSSFLHBBM; + private String XMMC; + private String GGXH; + private String DW; + private String FPSPDJ; + private String FPSPSL; + private String JE; + private String SLV; + private String SE; +} diff --git a/order-management-invoice/src/main/java/com/dxhy/order/invoice/module/invoice/model/Hzqrdxxqd.java b/order-management-invoice/src/main/java/com/dxhy/order/invoice/module/invoice/model/Hzqrdxxqd.java new file mode 100644 index 00000000..743d91a6 --- /dev/null +++ b/order-management-invoice/src/main/java/com/dxhy/order/invoice/module/invoice/model/Hzqrdxxqd.java @@ -0,0 +1,70 @@ +package com.dxhy.order.invoice.module.invoice.model; + +import lombok.Getter; +import lombok.Setter; + +import java.io.Serializable; +import java.util.List; + +/** + * @author: yaoxuguang + * @createDate: Created in 2022-11-10 + */ +@Getter +@Setter +public class Hzqrdxxqd implements Serializable { + + /** + * UUID : 红字确认单UUID + * HZFPXXQRDBH : 红字发票信息确认单编号 + * LRFSF : 录入方身份 + * XSFNSRSBH : (销售方)统一社会信用代码/纳税人识别号/身份证件号码 + * XSFMC : 销售方名称 + * GMFNSRSBH : (购买方)统一社会信用代码/纳税人识别号/身份证件号码 + * GMFMC : 购买方名称 + * LZFPDM : 蓝字发票代码 + * LZFPHM : 蓝字发票号码 + * SFZZFPBZ : 是否纸质发票标志 + * LZKPRQ : 蓝字发票开票日期 + * LZHJJE : 蓝字发票合计金额 + * LZHJSE : 蓝字发票合计税额 + * LZFPPZDM : 蓝字发票票种代码 + * LZFPTDYSLXDM : 蓝字发票特定要素类型代码 + * HZCXJE : 红字冲销金额 + * HZCXSE : 红字冲销税额 + * CHYYDM : 红字发票冲红原因代码 + * HZQRXXZTDM : 红字确认信息状态代码 + * QRRQ : 确认日期 + * YKJHZFPBZ : 已开具红字发票标志 + * HZFPHM : 红字发票号码 + * HZKPRQ : 红字开票日期 + * YXBZ : 有效标志 + * HZQRXXMXLIST: 红字确认单明细信息 + */ + + private String UUID; + private String HZFPXXQRDBH; + private String LRFSF; + private String XSFNSRSBH; + private String XSFMC; + private String GMFNSRSBH; + private String GMFMC; + private String LZFPDM; + private String LZFPHM; + private String SFZZFPBZ; + private String LZKPRQ; + private String LZHJJE; + private String LZHJSE; + private String LZFPPZDM; + private String LZFPTDYSLXDM; + private String HZCXJE; + private String HZCXSE; + private String CHYYDM; + private String HZQRXXZTDM; + private String QRRQ; + private String YKJHZFPBZ; + private String HZFPHM; + private String HZKPRQ; + private String YXBZ; + private List HZQRXXMXLIST; +} diff --git a/order-management-invoice/src/main/java/com/dxhy/order/invoice/module/invoice/model/SpecialInvoiceReversalPlus.java b/order-management-invoice/src/main/java/com/dxhy/order/invoice/module/invoice/model/SpecialInvoiceReversalPlus.java new file mode 100644 index 00000000..6e0e30cd --- /dev/null +++ b/order-management-invoice/src/main/java/com/dxhy/order/invoice/module/invoice/model/SpecialInvoiceReversalPlus.java @@ -0,0 +1,13 @@ +package com.dxhy.order.invoice.module.invoice.model; + +import com.dxhy.order.invoice.module.invoicespecial.model.SpecialInvoiceReversalEntity; +import com.dxhy.order.model.SpecialInvoiceReversalItem; +import lombok.Data; + +import java.util.List; + +@Data +public class SpecialInvoiceReversalPlus extends SpecialInvoiceReversalEntity { + + private List items; +} diff --git a/order-management-invoice/src/main/java/com/dxhy/order/invoice/module/invoice/model/po/EsOutput.java b/order-management-invoice/src/main/java/com/dxhy/order/invoice/module/invoice/model/po/EsOutput.java new file mode 100644 index 00000000..1d4c7375 --- /dev/null +++ b/order-management-invoice/src/main/java/com/dxhy/order/invoice/module/invoice/model/po/EsOutput.java @@ -0,0 +1,32 @@ +package com.dxhy.order.invoice.module.invoice.model.po; + +import lombok.Data; + +/** + * @Description: PO输出参数 + * @Author liufeilong + * @Date 2023-02-06 + **/ +@Data +public class EsOutput { + /** + * 外围系统数据唯一标识 + */ + private String BSKEY; + /** + * SAP数据唯一标识 + */ + private String SAPKEY; + /** + * 数据处理标识(S:成功,E:失败) + */ + private String ZTYPE; + /** + * 数据处理描述 + */ + private String ZMESSAGE; + /** + * 业务报文 + */ + private String ZDATA; +} diff --git a/order-management-invoice/src/main/java/com/dxhy/order/invoice/module/invoice/model/po/IsInput.java b/order-management-invoice/src/main/java/com/dxhy/order/invoice/module/invoice/model/po/IsInput.java new file mode 100644 index 00000000..96cacd46 --- /dev/null +++ b/order-management-invoice/src/main/java/com/dxhy/order/invoice/module/invoice/model/po/IsInput.java @@ -0,0 +1,59 @@ +package com.dxhy.order.invoice.module.invoice.model.po; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @Description: PO输入参数 + * @Author liufeilong + * @Date 2023-02-06 + **/ +@Data +public class IsInput implements Serializable { + /** + * 外围系统 + */ + private String SYSID; + /** + * 接口业务ID + */ + private String IFYWID; + /** + * 外围系统数据唯一标识 + */ + private String BSKEY; + /** + * SAP数据唯一标识 + */ + private String SAPKEY; + /** + * 组织机构代码 + */ + private String ZORG; + /** + * SAP模块编码(OA用) + */ + private String ZFILED1; + /** + * 预留字段 + */ + private String ZFILED2; + /** + * 预留字段 + */ + private String ZFILED3; + /** + * 预留字段 + */ + private String ZFILED4; + /** + * SAP Client + */ + private String ZFILED5; + /** + * 业务参数 + */ + private String ZDATA; + +} diff --git a/order-management-invoice/src/main/java/com/dxhy/order/invoice/module/invoice/model/po/PoCommonRequestParam.java b/order-management-invoice/src/main/java/com/dxhy/order/invoice/module/invoice/model/po/PoCommonRequestParam.java new file mode 100644 index 00000000..2760afca --- /dev/null +++ b/order-management-invoice/src/main/java/com/dxhy/order/invoice/module/invoice/model/po/PoCommonRequestParam.java @@ -0,0 +1,20 @@ +package com.dxhy.order.invoice.module.invoice.model.po; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; + +import java.io.Serializable; + +/** + * @Description: PO接口公共请求参数 + * @Author liufeilong + * @Date 2023-02-06 + **/ +@Data +public class PoCommonRequestParam implements Serializable { + /** + * IsInput + */ + @JSONField(name = "IS_INPUT") + private IsInput IS_INPUT; +} diff --git a/order-management-invoice/src/main/java/com/dxhy/order/invoice/module/invoice/model/po/PoCommonResponseParam.java b/order-management-invoice/src/main/java/com/dxhy/order/invoice/module/invoice/model/po/PoCommonResponseParam.java new file mode 100644 index 00000000..331c4a38 --- /dev/null +++ b/order-management-invoice/src/main/java/com/dxhy/order/invoice/module/invoice/model/po/PoCommonResponseParam.java @@ -0,0 +1,16 @@ +package com.dxhy.order.invoice.module.invoice.model.po; + +import lombok.Data; + +/** + * @Description: PO接口公共响应参数 + * @Author liufeilong + * @Date 2023-02-06 + **/ +@Data +public class PoCommonResponseParam { + /** + * ES_OUTPUT + */ + private EsOutput ES_OUTPUT; +} diff --git a/order-management-invoice/src/main/java/com/dxhy/order/invoice/module/invoice/service/OrderInvoiceInfoService.java b/order-management-invoice/src/main/java/com/dxhy/order/invoice/module/invoice/service/OrderInvoiceInfoService.java index 68c1d53d..19bebc75 100644 --- a/order-management-invoice/src/main/java/com/dxhy/order/invoice/module/invoice/service/OrderInvoiceInfoService.java +++ b/order-management-invoice/src/main/java/com/dxhy/order/invoice/module/invoice/service/OrderInvoiceInfoService.java @@ -1,17 +1,17 @@ package com.dxhy.order.invoice.module.invoice.service; -import com.dxhy.order.model.CommonOrderInvoiceAndOrderMxInfo; -import com.dxhy.order.model.InvoiceCount; -import com.dxhy.order.model.OrderInvoiceInfo; -import com.dxhy.order.model.PageUtils; import com.dxhy.order.baseservice.module.thirdservice.rabbitmq.model.RabbitMqCommonInvoice; +import com.dxhy.order.exception.OrderReceiveException; import com.dxhy.order.invoice.module.invoice.model.FileDownLoad; import com.dxhy.order.invoice.module.invoice.model.bo.QueryCountInvoiceBO; import com.dxhy.order.invoice.module.invoice.model.vo.*; +import com.dxhy.order.model.*; +import com.dxhy.order.model.page.RedInvoiceCheckReqPo; +import com.dxhy.order.model.page.RedInvoiceRespPo; +import com.dxhy.order.model.page.RedInvoiceStageReqPo; import org.apache.ibatis.annotations.Param; -import java.io.File; import java.io.OutputStream; import java.util.Date; import java.util.List; @@ -284,5 +284,13 @@ public interface OrderInvoiceInfoService { String signInvoicePrint(String excelFile, List ids) throws Exception; List countInoviceInfo(@Param("orderInfoIds")List orderInfoIds); + + R checkRedInvoice(RedInvoiceCheckReqPo redInvoiceReqPo) throws OrderReceiveException; + + RedInvoiceRespPo getOrderInvoiceData(RedInvoiceCheckReqPo redInvoiceReqPo); + + R stageRedInvoiceData(RedInvoiceStageReqPo redInvoiceSaveReqPo); + + } diff --git a/order-management-invoice/src/main/java/com/dxhy/order/invoice/module/invoice/service/impl/OfdToPngSDEnergyServiceImpl.java b/order-management-invoice/src/main/java/com/dxhy/order/invoice/module/invoice/service/impl/OfdToPngSDEnergyServiceImpl.java index b4f5ae44..5497b301 100644 --- a/order-management-invoice/src/main/java/com/dxhy/order/invoice/module/invoice/service/impl/OfdToPngSDEnergyServiceImpl.java +++ b/order-management-invoice/src/main/java/com/dxhy/order/invoice/module/invoice/service/impl/OfdToPngSDEnergyServiceImpl.java @@ -19,10 +19,10 @@ import java.util.List; @Slf4j public class OfdToPngSDEnergyServiceImpl implements OfdToPngSDEnergyService { - @Value("${yx.url}") + @Value("${yx.url:}") private String yxurl; - @Value("${yx.simsSalt}") + @Value("${yx.simsSalt:}") private String simsSalt; diff --git a/order-management-invoice/src/main/java/com/dxhy/order/invoice/module/invoice/service/impl/OrderInvoiceInfoServiceImpl.java b/order-management-invoice/src/main/java/com/dxhy/order/invoice/module/invoice/service/impl/OrderInvoiceInfoServiceImpl.java index c0fb8174..5a69e88d 100644 --- a/order-management-invoice/src/main/java/com/dxhy/order/invoice/module/invoice/service/impl/OrderInvoiceInfoServiceImpl.java +++ b/order-management-invoice/src/main/java/com/dxhy/order/invoice/module/invoice/service/impl/OrderInvoiceInfoServiceImpl.java @@ -6,6 +6,7 @@ import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.RandomUtil; import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson.JSONObject; import com.dxhy.base.file.common.ExcelReadContext; import com.dxhy.base.file.handle.ExcelExportHandle; import com.dxhy.order.baseservice.config.BaseServiceConfig; @@ -20,11 +21,16 @@ import com.dxhy.order.baseservice.module.thirdservice.simsback.service.SimsBackS import com.dxhy.order.baseservice.module.thirdservice.user.model.DeptEntity; import com.dxhy.order.baseservice.module.thirdservice.user.service.UserInfoService; import com.dxhy.order.constant.*; +import com.dxhy.order.exception.OrderReceiveException; import com.dxhy.order.invoice.config.InvoiceConfig; import com.dxhy.order.invoice.module.invoice.dao.*; import com.dxhy.order.invoice.module.invoice.model.FileDownLoad; +import com.dxhy.order.invoice.module.invoice.model.GsClient; import com.dxhy.order.invoice.module.invoice.model.bo.QueryCountInvoiceBO; import com.dxhy.order.invoice.module.invoice.model.excel.*; +import com.dxhy.order.invoice.module.invoice.model.po.IsInput; +import com.dxhy.order.invoice.module.invoice.model.po.PoCommonRequestParam; +import com.dxhy.order.invoice.module.invoice.model.po.PoCommonResponseParam; import com.dxhy.order.invoice.module.invoice.model.vo.*; import com.dxhy.order.invoice.module.invoice.service.EmailService; import com.dxhy.order.invoice.module.invoice.service.HistoryDataPdfService; @@ -38,6 +44,10 @@ import com.dxhy.order.invoice.utils.HttpInvoiceRequestUtilQd; import com.dxhy.order.invoice.utils.PDFExportUtil; import com.dxhy.order.invoice.utils.generateinvoice.PdfProducer; import com.dxhy.order.model.*; +import com.dxhy.order.model.page.OrderInvoiceInfoVo; +import com.dxhy.order.model.page.RedInvoiceCheckReqPo; +import com.dxhy.order.model.page.RedInvoiceRespPo; +import com.dxhy.order.model.page.RedInvoiceStageReqPo; import com.dxhy.order.model.qd.QdFileDownloadRequest; import com.dxhy.order.model.qd.QdFileDownloadResponse; import com.dxhy.order.model.queue.CommonTsMqData; @@ -49,12 +59,17 @@ import com.dxhy.order.model.sk.pdf.InvoicePdf; import com.dxhy.order.utils.*; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; +import com.google.common.collect.Maps; +import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.apache.ibatis.annotations.Param; import org.apache.poi.xssf.streaming.SXSSFWorkbook; import org.joda.time.DateTime; import org.joda.time.Duration; +import org.redisson.api.RLock; +import org.redisson.api.RedissonClient; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; @@ -65,6 +80,7 @@ import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.OutputStream; +import java.math.BigDecimal; import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.concurrent.Executor; @@ -95,6 +111,9 @@ public class OrderInvoiceInfoServiceImpl implements OrderInvoiceInfoService { private OrderInfoJdcMapper orderInfoJdcMapper; @Resource private OrderInfoEscMapper orderInfoEscMapper; + + @Resource + private GsClientFindMapper gsClientFindMapper; @Resource private HistoryDataPdfService historyDataPdfService; @Resource @@ -129,6 +148,9 @@ public class OrderInvoiceInfoServiceImpl implements OrderInvoiceInfoService { @Qualifier("asyncExecutor") private Executor voucherTaskExecutor; + private static final String KEY_PREFIX = "order:red:"; + private static final String KEY_RED_SYJE = "order:red:syje"; + /** * 作用: @@ -1493,5 +1515,287 @@ public class OrderInvoiceInfoServiceImpl implements OrderInvoiceInfoService { return orderInvoiceInfoMapper.countInoviceInfo(orderInfoIds); } + @Override + public R checkRedInvoice(RedInvoiceCheckReqPo redInvoiceReqPo) throws OrderReceiveException{ + //根据报账单查询蓝字数据 + RedInvoiceRespPo orderInvoiceData = this.getOrderInvoiceData(redInvoiceReqPo); + List orderInvoiceInfos = orderInvoiceData.getOrderInvoiceInfos(); + + //查询报账单是否存在 + if(orderInvoiceInfos.size() == 0){ + return R.error("根据报账单号未查询到订单");//改为常量 + } + + //todo 根据蓝字报账单调用SAP接口查询SAP状态,是否允许冲红 明慧开发 + //查询公司client + List gsClients = gsClientFindMapper.selectByGsdm(orderInvoiceData.getGsdm()); + if (ObjectUtils.isEmpty(gsClients)){ + return R.error("未查询到公司client"); + } + + try { + boolean bzhStatus = getBzhStatus(orderInvoiceData.getRedBzdh(), gsClients.get(0).getClient()); + + if (bzhStatus) { + return R.error("蓝字报账单状态不允许冲红"); + } + }catch (Exception e){ + log.error("{}获取蓝字报账单状态异常", LOGGER_MSG,e); + return R.error("未查询到订单"); + } + List redItemInfoList = orderInvoiceData.getRedItemInfoList(); + if(CollectionUtil.isNotEmpty(redItemInfoList)){ + boolean b = redItemInfoList.stream().allMatch(redItemInfo -> StringUtils.isNotBlank(redItemInfo.getSpbm()) && ConfigureConstant.STRING_0.equals(redItemInfo.getZnfm())); + if(!b){ + return R.error("负数订单存在智能赋码及局端税编的明细行");//改为常量 + } + } + + //根据orderinfoId,查询红字订单信息 + OrderInfo orderInfo = orderInfoMapper.selectOrderInfoByOrderId(redInvoiceReqPo.getOrderInfoId(), Arrays.asList(redInvoiceReqPo.getXhfNsrsbh())); + if(orderInfo == null){ + return R.error("当前红冲订单查询为空"); + } + + String xhfXx = (StringUtils.isNotBlank(orderInfo.getXhfNsrsbh()) ? orderInfo.getXhfNsrsbh() : "") + + (StringUtils.isNotBlank(orderInfo.getXhfMc()) ? orderInfo.getXhfMc() : ""); + String lzXhfXx = (StringUtils.isNotBlank(orderInvoiceInfos.get(0).getXhfNsrsbh()) ? orderInvoiceInfos.get(0).getXhfNsrsbh() : "") + + (StringUtils.isNotBlank(orderInvoiceInfos.get(0).getXhfMc()) ? orderInvoiceInfos.get(0).getXhfMc() : ""); + String ghfXx = (StringUtils.isNotBlank(orderInfo.getGhfNsrsbh()) ? orderInfo.getGhfNsrsbh() : "") + + (StringUtils.isNotBlank(orderInfo.getGhfMc()) ? orderInfo.getGhfMc() : ""); + String lzGhfXx = (StringUtils.isNotBlank(orderInvoiceInfos.get(0).getGhfNsrsbh()) ? orderInvoiceInfos.get(0).getGhfNsrsbh() : "") + + (StringUtils.isNotBlank(orderInvoiceInfos.get(0).getGhfMc()) ? orderInvoiceInfos.get(0).getGhfMc() : ""); + + //购销方是否一致 + if(!xhfXx.equals(lzXhfXx) ){ + return R.error("负数订单的销方信息与对应蓝字报账单号不一致");//改为常量 + } + if(!ghfXx.equals(lzGhfXx)){ + return R.error("负数订单的购方信息与对应蓝字报账单号不一致");//改为常量 + } + //校验发票种类是否一致 + if(!orderInfo.getFpzlDm().equals(orderInvoiceInfos.get(0).getFpzlDm())){ + return R.error("负数订单的发票种类与对应蓝字报账单号不一致");//改为常量 + } + + //比较金额(发票剩余金额、如果是专票的话需要加上红字申请的金额、如果是数电票的话需要调用接口查询红字查询) + BigDecimal sykchbhsje = new BigDecimal("0.00"); + BigDecimal sykchse = new BigDecimal("0.00"); + for (OrderInvoiceInfoVo orderInvoiceInfo : orderInvoiceInfos) { + if(StringUtils.isNotBlank(orderInvoiceInfo.getSykchbhsje()) && StringUtils.isNotBlank(orderInvoiceInfo.getSykchje()) + && StringUtils.isNotBlank(orderInvoiceInfo.getSykchse()) && new BigDecimal(orderInvoiceInfo.getSykchse()).compareTo(BigDecimal.ZERO) > ConfigureConstant.INT_0){ + sykchbhsje = sykchbhsje.add(new BigDecimal(orderInvoiceInfo.getSykchbhsje())); + sykchse = sykchse.add(new BigDecimal(orderInvoiceInfo.getSykchse())); + } else { + List orderInfos = orderInfoMapper.selectOrderInfoByYfpdmhm(orderInvoiceInfo.getFpdm(), orderInvoiceInfo.getFphm(), Arrays.asList(redInvoiceReqPo.getXhfNsrsbh())); + if(CollectionUtil.isNotEmpty(orderInfos)){ + BigDecimal chbhsje = orderInfos.stream().map(order -> new BigDecimal(order.getHjbhsje())).reduce(BigDecimal.ZERO, BigDecimal::add).abs(); + BigDecimal chse = orderInfos.stream().map(order -> new BigDecimal(order.getHjse())).reduce(BigDecimal.ZERO, BigDecimal::add).abs(); + sykchbhsje = sykchbhsje.add(new BigDecimal(orderInvoiceInfo.getHjbhsje()).subtract(chbhsje)); + sykchse = sykchse.add(new BigDecimal(orderInvoiceInfo.getKpse()).subtract(chse)); + } else { + sykchbhsje = sykchbhsje.add(new BigDecimal(orderInvoiceInfo.getHjbhsje())); + sykchse = sykchse.add(new BigDecimal(orderInvoiceInfo.getKpse())); + } + } + } + if(sykchbhsje.compareTo(BigDecimal.ZERO) > ConfigureConstant.INT_0 && sykchse.compareTo(BigDecimal.ZERO) > ConfigureConstant.INT_0){ + BigDecimal hzddHjbhsje = new BigDecimal(orderInfo.getHjbhsje()).abs(); + BigDecimal hzddHjse = new BigDecimal(orderInfo.getHjse()).abs(); + if (hzddHjbhsje.subtract(sykchbhsje).compareTo(BigDecimal.ZERO) <= ConfigureConstant.INT_0 + && hzddHjse.subtract(sykchse).compareTo(BigDecimal.ZERO) <= ConfigureConstant.INT_0){ + return R.ok().put(OrderManagementConstant.DATA,orderInvoiceData); + } else { + return R.error("蓝字剩余可冲红不含税金额小于负数订单不含税金额或税额");//改为常量 + } + }else { + return R.error("蓝字剩余可冲红不含税金额或者税额小于0");//改为常量 + } + } + + /** + * 根据报账单查询蓝字数据 + * 根据请求流水号查询红字明细 + * @return + */ + @Override + public RedInvoiceRespPo getOrderInvoiceData(RedInvoiceCheckReqPo redInvoiceReqPo) { + RedInvoiceRespPo redInvoiceRespPo = new RedInvoiceRespPo(); + List orderInvoiceInfoVos = orderInvoiceInfoMapper.selectInvoiceInfoByBzdh(redInvoiceReqPo.getLzbzdh(), Arrays.asList(redInvoiceReqPo.getXhfNsrsbh())); + List orderItemInfos = orderItemInfoMapper.selectOrderItemInfoByOrderId(redInvoiceReqPo.getOrderInfoId(), Arrays.asList(redInvoiceReqPo.getXhfNsrsbh())); +// OrderInvoiceInfo invoiceInfo = new OrderInvoiceInfo(); +// invoiceInfo.setOrderInfoId(redInvoiceReqPo.getOrderInfoId()); + OrderInfo orderInfo = orderInfoMapper.selectOrderInfoByOrderId(redInvoiceReqPo.getOrderInfoId(), Arrays.asList(redInvoiceReqPo.getXhfNsrsbh())); + OrderProcessInfo orderProcessInfo = orderInfoMapper.selectProcessByFpqqlsh(orderInfo.getFpqqlsh(), Arrays.asList(redInvoiceReqPo.getXhfNsrsbh())); + //是否允许勾选,发票状态 + orderInvoiceInfoVos.stream().map(t->{ + Boolean selected = true; + t.setDdzt("开具成功");//枚举 + if(OrderInfoEnum.ORDER_STATUS_0.getKey().equals(t.getDdzt()) + ||OrderInfoEnum.ORDER_STATUS_1.getKey().equals(t.getDdzt()) + ||OrderInfoEnum.ORDER_STATUS_2.getKey().equals(t.getDdzt()) + ||OrderInfoEnum.ORDER_STATUS_3.getKey().equals(t.getDdzt()) + ){ + t.setDdzt("未开具");//枚举 + selected = false; + } + if(OrderInfoEnum.ORDER_STATUS_4.getKey().equals(t.getDdzt())){ + t.setDdzt("开具中");//枚举 + selected = false; + } + + if(OrderInfoEnum.ORDER_STATUS_5.getKey().equals(t.getDdzt()) && + (ConfigureConstant.STRING_1.equals(t.getZfBz()) + || ConfigureConstant.STRING_2.equals(t.getZfBz())) + ){ + t.setDdzt("已作废");//枚举 + selected = false; + } + if(OrderInfoEnum.ORDER_STATUS_5.getKey().equals(t.getDdzt()) && + (ConfigureConstant.STRING_1.equals(t.getChBz()) + || ConfigureConstant.STRING_2.equals(t.getChBz()) + || ConfigureConstant.STRING_3.equals(t.getChBz())) + ){ + t.setDdzt("已冲红");//枚举 + selected = false; + } + // + if(OrderInfoEnum.ORDER_STATUS_5.getKey().equals(t.getDdzt()) && + (ConfigureConstant.STRING_4.equals(t.getChBz()) + || ConfigureConstant.STRING_5.equals(t.getChBz()) + || ConfigureConstant.STRING_6.equals(t.getChBz())) + ){ + t.setDdzt("部分冲红");//枚举 + } + t.setSelected(selected); + + return t; + }).collect(Collectors.toList()); + redInvoiceRespPo.setOrderInvoiceInfos(orderInvoiceInfoVos); + redInvoiceRespPo.setRedItemInfoList(orderItemInfos); + //明细合并 + if(StringUtils.isNotBlank(redInvoiceReqPo.getSfhb()) && ConfigureConstant.STRING_1.equals(redInvoiceReqPo.getSfhb())){ + Map comparisonMap = Maps.newHashMap(); + for (OrderItemInfo orderItemInfo : orderItemInfos) { + String comparisonKey = orderItemInfo.getZxbm()+orderItemInfo.getXmmc(); + OrderItemInfo itemInfo = comparisonMap.get(comparisonKey); + if(itemInfo == null){ + comparisonMap.put(comparisonKey,orderItemInfo); + }else { + String xmje = new BigDecimal(itemInfo.getXmje()).abs().add(new BigDecimal(orderItemInfo.getXmje()).abs()).toPlainString(); + String se = new BigDecimal(itemInfo.getSe()).abs().add(new BigDecimal(orderItemInfo.getSe()).abs()).toPlainString(); + orderItemInfo.setXmje(xmje); + orderItemInfo.setSe(se); + String redSyjeKey = KEY_RED_SYJE + orderItemInfo.getId(); + String value = redisService.get(redSyjeKey); + if(StringUtils.isNotBlank(value)){ + orderItemInfo.setSykchje(value); + } else { + orderItemInfo.setSykchje(xmje); + } + comparisonMap.put(comparisonKey,orderItemInfo); + } + } + List itemInfos = comparisonMap.entrySet().stream().map(Map.Entry::getValue).collect(Collectors.toList()); + redInvoiceRespPo.setRedItemInfoList(itemInfos); + } + redInvoiceRespPo.setRedFpqqlsh(orderInfo.getFpqqlsh()); + redInvoiceRespPo.setRedBzdh(orderProcessInfo.getBzdh()); + redInvoiceRespPo.setGsdm(orderProcessInfo.getGsdm()); + return redInvoiceRespPo; + } + + @Resource + private RedissonClient redisson; + + @SneakyThrows + @Override + public R stageRedInvoiceData(RedInvoiceStageReqPo redInvoiceSaveReqPo){ + //存储redis map结构,map外层key是红字fpqqlsh,内层是发票号码+发票代码,将整体发票报文存储在value里 + OrderInvoiceInfo blueInvoiceInfo = redInvoiceSaveReqPo.getBlueInvoiceInfo(); + String key = KEY_PREFIX + redInvoiceSaveReqPo.getFpqqlsh(); + String innerKey = StringUtils.isBlank(blueInvoiceInfo.getFpdm())?"":blueInvoiceInfo.getFpdm() + blueInvoiceInfo.getFphm(); + //组装发票报文 + //金额、数量、税额跟跟换为负数,折扣行要与被折扣行合并 + //校验重复提交数据覆盖问题 + RLock lock = redisson.getLock(redInvoiceSaveReqPo.getFpqqlsh()); +// boolean redRedisLock = redisService.setNx(redInvoiceSaveReqPo.getFpqqlsh(), key, RedisConstant.REDIS_EXPIRE_TIME_2HOUR); + for (int i = 0; i < 3; i++) { + try { + if(!lock.isLocked()){ + lock.lock(); + Map paramMap = redisService.pullAllHashMap(key); + if(paramMap != null){ + String value = redisService.pullHashMap(key, innerKey); + if(StringUtils.isNotBlank(value)){ + redisService.delHashMap(key,innerKey); + } + } + redisService.putHashMap(key,innerKey, JSONObject.toJSONString(redInvoiceSaveReqPo)); + Map hashMap = Maps.newHashMap(); + if(paramMap != null){ + BigDecimal blueMxje = new BigDecimal("0.00"); + BigDecimal redMxje = new BigDecimal("0.00"); + List redItemList = null; + for (Map.Entry stringEntry : paramMap.entrySet()) { + String entryValue = stringEntry.getValue(); + RedInvoiceStageReqPo invoiceStageReqPo = JSONObject.parseObject(entryValue, RedInvoiceStageReqPo.class); + List blueItemList = invoiceStageReqPo.getBlueItemList(); + blueMxje = blueMxje.add(blueItemList.stream().map(blueItem -> new BigDecimal(blueItem.getXmje())).reduce(BigDecimal.ZERO, BigDecimal::add)); + redItemList = invoiceStageReqPo.getRedItemList(); + } + if(redItemList != null){ + redMxje = redItemList.stream().map(redItem -> new BigDecimal(redItem.getXmje())).reduce(BigDecimal.ZERO, BigDecimal::add).abs(); + String syfpje = redMxje.subtract(blueMxje).toPlainString(); + String redSyjeKey = KEY_RED_SYJE + redItemList.get(0).getId(); + redisService.set(redSyjeKey,syfpje); + hashMap.put(redItemList.get(0).getId(),syfpje); + } + } + lock.unlock(); + return R.ok().put(OrderManagementConstant.DATA,hashMap); + } else { + Thread.sleep(2000); + log.info("获取redis锁请等待,三次之后还是获取锁失败则返回。。。"); + } + } catch (InterruptedException e) { + lock.unlock(); + throw new RuntimeException(e); + } + } + return R.ok(); + } + + public boolean getBzhStatus(String bzdh,String clint){ + //拼凑报文 + IsInput isInput = new IsInput(); + isInput.setSYSID(OrderInfoEnum.SYS_SIGN_FP.getKey()); + isInput.setIFYWID(OrderInfoEnum.INTERFACE_BUSINESS_ID_BZDSTATUS.getKey()); + isInput.setBSKEY(UUID.randomUUID().toString().replace("-", "")); + isInput.setZORG(""); + isInput.setZFILED5(clint); + Map data = new HashMap<>(); + data.put("ZBZDH",bzdh); + isInput.setZDATA(JsonUtils.getInstance().toJsonString(data)); + PoCommonRequestParam poCommonRequestParam = new PoCommonRequestParam(); + poCommonRequestParam.setIS_INPUT(isInput); + String param = JsonUtils.getInstance().toJsonString(poCommonRequestParam); + log.info("{}获取报账单号状态入参:{}",LOGGER_MSG,param); + String result = HttpUtils.sendPo(baseServiceConfig.getPoUrl(), param,baseServiceConfig.getPoUserName(),baseServiceConfig.getPoPassword()); + log.info("{}获取报账单号状态出参:{}",LOGGER_MSG,result); + PoCommonResponseParam poCommonResponseParam = JSONObject.parseObject(result, PoCommonResponseParam.class); + String zdata = poCommonResponseParam.getES_OUTPUT().getZDATA(); + JSONObject response = JSONObject.parseObject(zdata); + String bzdzt = response.getString("BZDZT"); + //校验状态 + String bzdStatus = baseServiceConfig.getBzdStatus(); + String[] split = bzdStatus.split(","); + if (StringUtils.isNotBlank(bzdh)||Arrays.asList(split).contains(bzdzt)){ + return false; + } + return true; + } + + } diff --git a/order-management-invoice/src/main/resources/mybatis/mapper/GsClientFindMapper.xml b/order-management-invoice/src/main/resources/mybatis/mapper/GsClientFindMapper.xml new file mode 100644 index 00000000..5e86d1fd --- /dev/null +++ b/order-management-invoice/src/main/resources/mybatis/mapper/GsClientFindMapper.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + id, gsdm, gsmc, client, create_time + + + + + \ No newline at end of file diff --git a/order-management-invoice/src/main/resources/mybatis/mapper/OrderInfoMapper.xml b/order-management-invoice/src/main/resources/mybatis/mapper/OrderInfoMapper.xml index 2524f90e..b110ef4a 100644 --- a/order-management-invoice/src/main/resources/mybatis/mapper/OrderInfoMapper.xml +++ b/order-management-invoice/src/main/resources/mybatis/mapper/OrderInfoMapper.xml @@ -558,8 +558,11 @@ select from order_info - where yfp_dm = #{fpdm,jdbcType=VARCHAR} and yfp_hm = - #{fphm,jdbcType=VARCHAR} + where + yfp_hm = #{fphm,jdbcType=VARCHAR} + + and yfp_dm = #{fpdm,jdbcType=VARCHAR} + and xhf_nsrsbh = '' diff --git a/order-management-invoice/src/main/resources/mybatis/mapper/OrderInvoiceInfoMapper.xml b/order-management-invoice/src/main/resources/mybatis/mapper/OrderInvoiceInfoMapper.xml index 000e5374..84baff76 100644 --- a/order-management-invoice/src/main/resources/mybatis/mapper/OrderInvoiceInfoMapper.xml +++ b/order-management-invoice/src/main/resources/mybatis/mapper/OrderInvoiceInfoMapper.xml @@ -222,6 +222,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2264,4 +2291,55 @@ AND ( oii.zf_bz = '0' OR oii.ch_bz = '0' ) + + +