diff --git a/order-management-base-service/src/main/java/com/dxhy/order/baseservice/constant/RedisConstant.java b/order-management-base-service/src/main/java/com/dxhy/order/baseservice/constant/RedisConstant.java index c64df11..26eb110 100644 --- a/order-management-base-service/src/main/java/com/dxhy/order/baseservice/constant/RedisConstant.java +++ b/order-management-base-service/src/main/java/com/dxhy/order/baseservice/constant/RedisConstant.java @@ -47,6 +47,16 @@ public class RedisConstant { */ public static final String REDIS_INTERFACE_RECEIVE = "xxfp:order:receive:%s"; + /** + * 用友生成预制发票 + */ + public static final String REDIS_YY_ORDER_EXTRACT = "xxfp:order:yy:extract:%s"; + + /** + * 时空生成预制发票 + */ + public static final String REDIS_SK_ORDER_EXTRACT = "xxfp:order:sk:extract:%s"; + /** * 订单接收数据,验证是否超过限制次数 */ diff --git a/order-management-order/src/main/java/com/dxhy/order/consumer/modules/bespoke/service/impl/SkOrderServiceImpl.java b/order-management-order/src/main/java/com/dxhy/order/consumer/modules/bespoke/service/impl/SkOrderServiceImpl.java index d7ce77d..a202226 100644 --- a/order-management-order/src/main/java/com/dxhy/order/consumer/modules/bespoke/service/impl/SkOrderServiceImpl.java +++ b/order-management-order/src/main/java/com/dxhy/order/consumer/modules/bespoke/service/impl/SkOrderServiceImpl.java @@ -14,9 +14,11 @@ import com.dxhy.base.service.module.thirdservice.user.model.DeptEntity; import com.dxhy.base.service.module.thirdservice.user.service.UserInfoService; import com.dxhy.base.service.openapi.protocol.qd.PageGfxxReq; import com.dxhy.base.thirdservice.module.base.service.BaseService; +import com.dxhy.base.thirdservice.module.thirdservice.redis.service.RedissonService; import com.dxhy.management.common.constant.ConfigureConstant; import com.dxhy.order.baseservice.constant.ConfigurerInfo; import com.dxhy.order.baseservice.constant.OrderValidateEnum; +import com.dxhy.order.baseservice.constant.RedisConstant; import com.dxhy.order.baseservice.model.OrderInvoiceInfo; import com.dxhy.order.baseservice.model.OrderOriginExtendInfo; import com.dxhy.order.consumer.dao.SkOrderInfoMapper; @@ -32,6 +34,7 @@ import com.dxhy.order.consumer.modules.bespoke.model.sk.BackProduct; import com.dxhy.order.consumer.modules.bespoke.model.sk.SkOrderInfo; import com.dxhy.order.consumer.modules.bespoke.model.sk.SkOrderItemInfo; import com.dxhy.order.consumer.modules.bespoke.model.yy.NewTable; +import com.dxhy.order.consumer.modules.bespoke.model.yy.YyOrderItemInfo; import com.dxhy.order.consumer.modules.bespoke.service.OrderService; import com.dxhy.order.consumer.openapi.protocol.v4.order.*; import com.dxhy.order.consumer.openapi.protocol.v6.order.QdTxxBO; @@ -42,6 +45,7 @@ import com.github.pagehelper.page.PageMethod; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; +import org.redisson.api.RLock; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -88,6 +92,9 @@ public class SkOrderServiceImpl implements OrderService { @Resource private TInvoiceInvmapMapper tInvoiceInvmapMapper; + @Resource + private RedissonService redissonService; + // 订单读入 @Override public R orderRead(ReqParam reqParam) { @@ -167,28 +174,40 @@ public class SkOrderServiceImpl implements OrderService { for (SkOrderInfo skOrderInfo : skOrderInfoList) { + String cdlCodeKey = String.format(RedisConstant.REDIS_SK_ORDER_EXTRACT, skOrderInfo.getXsddm()); + RLock lock = redissonService.getLock(cdlCodeKey); + boolean locked = lock.tryLock(); try { - List skOrderItemInfoList = skOrderItemInfoMapper.queryOrderItemInfo(skOrderInfo.getId()); - if (CollectionUtils.isNotEmpty(skOrderItemInfoList)) { - DdpcxxReqBO ddpcxxReqBO = transitionReadData(skOrderInfo, skOrderItemInfoList, deptEntity); - DdpcxxRspBO ddpcxxRspBO = allocateInvoiceInterfaceServiceImplV3.allocateInvoicesV3(ddpcxxReqBO, "", null, ConfigurerInfo.INTERFACE_VERSION_V6); - log.debug("V3生成预制返回信息:{}", JSON.toJSONString(ddpcxxRspBO)); - String format = String.format(message, skOrderInfo.getXsddm(), ddpcxxRspBO.getZTXX()); - if (ddpcxxRspBO.getZTDM().equals(OrderValidateEnum.INVOICE_ERROR_CODE_010000_V3.getKey())) { - //添加状态修改 - skOrderInfoMapper.updateStatus(skOrderInfo.getXsddm(), ConfigureConstant.STRING_1); - backMessage.add(com.dxhy.base.common.constant.ConfigureConstant.INT_0, format); + if (locked){ + List skOrderItemInfoList = skOrderItemInfoMapper.queryOrderItemInfo(skOrderInfo.getId()); + if (CollectionUtils.isNotEmpty(skOrderItemInfoList)) { + DdpcxxReqBO ddpcxxReqBO = transitionReadData(skOrderInfo, skOrderItemInfoList, deptEntity); + DdpcxxRspBO ddpcxxRspBO = allocateInvoiceInterfaceServiceImplV3.allocateInvoicesV3(ddpcxxReqBO, "", null, ConfigurerInfo.INTERFACE_VERSION_V6); + log.debug("V3生成预制返回信息:{}", JSON.toJSONString(ddpcxxRspBO)); + String format = String.format(message, skOrderInfo.getXsddm(), ddpcxxRspBO.getZTXX()); + if (ddpcxxRspBO.getZTDM().equals(OrderValidateEnum.INVOICE_ERROR_CODE_010000_V3.getKey())) { + //添加状态修改 + skOrderInfoMapper.updateStatus(skOrderInfo.getXsddm(), ConfigureConstant.STRING_1); + backMessage.add(com.dxhy.base.common.constant.ConfigureConstant.INT_0, format); + } else { + backMessage.add(format); + } } else { - backMessage.add(format); + backMessage.add(String.format(message, skOrderInfo.getXsddm(), "订单明细信息丢失请删除重新读入")); } - } else { - backMessage.add(String.format(message, skOrderInfo.getXsddm(), "订单明细信息丢失请删除重新读入")); + }else { + backMessage.add(String.format(message, skOrderInfo.getXsddm(), "订单正在生成发票,请稍后再试")); + log.info("订单正在生成发票,请稍后再试"); } } catch (Exception e) { log.error("保存发票异常{}", e); String format = String.format(message, skOrderInfo.getXsddm(), "生成发票异常请联系管理员"); backMessage.add(format); + }finally { + if (locked){ + lock.unlock(); + } } } @@ -368,22 +387,27 @@ public class SkOrderServiceImpl implements OrderService { String invoiceAmount = ConfigureConstant.STRING_0; String taxAmount = ConfigureConstant.STRING_0; + boolean isZk = skOrderItemInfoList.size()>ConfigureConstant.INT_1; + String xmmc = skOrderItemInfoList.get(ConfigureConstant.INT_0).getCpmc(); + if (isZk){ + List collect = skOrderItemInfoList.stream().filter(item -> DecimalCalculateUtil.stringCompare(item.getHsje(), ConfigureConstant.STRING_0) > ConfigureConstant.INT_0).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(collect)){ + xmmc = collect.get(ConfigureConstant.INT_0).getCpmc(); + } + } //发票明细信息 List ddmxxxBOList = new ArrayList<>(); int index = ConfigureConstant.INT_0; - boolean isZk = !skOrderItemInfoList.stream().filter(item->item.getXgdjbh().startsWith("XSB")).collect(Collectors.toList()).isEmpty(); + for (SkOrderItemInfo orderItemInfo : skOrderItemInfoList) { DdmxxxBO ddmxxxBO = new DdmxxxBO(); ddmxxxBO.setXH(String.valueOf(++index)); ddmxxxBO.setXMMC(orderItemInfo.getCpmc()); ddmxxxBO.setGGXH(orderItemInfo.getXh()); ddmxxxBO.setDW(orderItemInfo.getCpdw()); - String sl = DecimalCalculateUtil.dynamicDecimalFormatToStringWithoutZero(orderItemInfo.getCpsl(), skOrderInfo.getFplx(), taxEquipmentInfo.getQdfwlx()); - ddmxxxBO.setSPSL(sl); ddmxxxBO.setJE(new BigDecimal(orderItemInfo.getHsje()).setScale(ConfigureConstant.INT_2, RoundingMode.HALF_UP).toPlainString()); ddmxxxBO.setSL(new BigDecimal(orderItemInfo.getSl()).divide(new BigDecimal(ConfigureConstant.STRING_100)).toPlainString()); ddmxxxBO.setSE(new BigDecimal(orderItemInfo.getSe()).setScale(ConfigureConstant.INT_2, RoundingMode.HALF_UP).toPlainString()); - ddmxxxBO.setDJ(getDynamicLengthDecimal(ddmxxxBO.getJE(), ddmxxxBO.getSPSL())); ddmxxxBO.setFPHXZ(ConfigureConstant.STRING_0); ddmxxxBO.setBZ(orderItemInfo.getBeizhu()); ddmxxxBO.setHSBZ(ConfigureConstant.STRING_1); @@ -400,10 +424,20 @@ public class SkOrderServiceImpl implements OrderService { if (orderItemInfo.getXgdjbh().startsWith("XSB")){ ddmxxxBO.setXH(ConfigureConstant.STRING_2); ddmxxxBO.setFPHXZ(ConfigureConstant.STRING_1); + ddmxxxBO.setXMMC(xmmc); } } + //非折扣行计算单价和数量 + if(StringUtils.isNotBlank(orderItemInfo.getHsje()) && DecimalCalculateUtil.stringCompare(orderItemInfo.getHsje(), ConfigureConstant.STRING_0) > ConfigureConstant.INT_0){ + String sl = DecimalCalculateUtil.dynamicDecimalFormatToStringWithoutZero(orderItemInfo.getCpsl(), skOrderInfo.getFplx(), taxEquipmentInfo.getQdfwlx()); + ddmxxxBO.setSPSL(sl); + ddmxxxBO.setDJ(getDynamicLengthDecimal(ddmxxxBO.getJE(), ddmxxxBO.getSPSL())); + } ddmxxxBOList.add(ddmxxxBO); } + if (isZk){ + ddmxxxBOList.sort(Comparator.comparing(DdmxxxBO::getXH)); + } //金额、税额、价税合计 ddtxxBO.setHJSE(taxAmount); ddtxxBO.setHJJE(DecimalCalculateUtil.bigDecimalSub(invoiceAmount, taxAmount, ConfigureConstant.INT_2)); diff --git a/order-management-order/src/main/java/com/dxhy/order/consumer/modules/bespoke/service/impl/YyOrderServiceImpl.java b/order-management-order/src/main/java/com/dxhy/order/consumer/modules/bespoke/service/impl/YyOrderServiceImpl.java index c9df751..7f7ca5c 100644 --- a/order-management-order/src/main/java/com/dxhy/order/consumer/modules/bespoke/service/impl/YyOrderServiceImpl.java +++ b/order-management-order/src/main/java/com/dxhy/order/consumer/modules/bespoke/service/impl/YyOrderServiceImpl.java @@ -14,9 +14,11 @@ import com.dxhy.base.service.module.thirdservice.user.model.DeptEntity; import com.dxhy.base.service.module.thirdservice.user.service.UserInfoService; import com.dxhy.base.service.openapi.protocol.qd.PageGfxxReq; import com.dxhy.base.thirdservice.module.base.service.BaseService; +import com.dxhy.base.thirdservice.module.thirdservice.redis.service.RedissonService; import com.dxhy.management.common.constant.ConfigureConstant; import com.dxhy.order.baseservice.constant.ConfigurerInfo; import com.dxhy.order.baseservice.constant.OrderValidateEnum; +import com.dxhy.order.baseservice.constant.RedisConstant; import com.dxhy.order.baseservice.model.OrderInvoiceInfo; import com.dxhy.order.baseservice.model.OrderOriginExtendInfo; import com.dxhy.order.consumer.dao.TInvoiceInvmapMapper; @@ -43,6 +45,7 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; +import org.redisson.api.RLock; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -50,6 +53,7 @@ import javax.annotation.Resource; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.*; +import java.util.stream.Collectors; @Slf4j @Service("yyOrderService") @@ -94,6 +98,9 @@ public class YyOrderServiceImpl implements OrderService { @Resource private OrderInvoiceInfoServiceImpl orderInvoiceInfoService; + @Resource + private RedissonService redissonService; + //订单读入 @Override public R orderRead(ReqParam reqParam) { @@ -171,28 +178,40 @@ public class YyOrderServiceImpl implements OrderService { for (YyOrderInfo yyOrderInfo : yyOrderInfoList) { + String cdlCodeKey = String.format(RedisConstant.REDIS_YY_ORDER_EXTRACT, yyOrderInfo.getCdlcode()); + RLock lock = redissonService.getLock(cdlCodeKey); + boolean locked = lock.tryLock(); try { - List yyOrderItemInfoList = yyOrderItemInfoMapper.queryOrderItemInfo(yyOrderInfo.getId()); - if (CollectionUtils.isNotEmpty(yyOrderItemInfoList)) { - DdpcxxReqBO ddpcxxReqBO = transitionReadData(yyOrderInfo, yyOrderItemInfoList, deptEntity); - DdpcxxRspBO ddpcxxRspBO = allocateInvoiceInterfaceServiceImplV3.allocateInvoicesV3(ddpcxxReqBO, "", null, ConfigurerInfo.INTERFACE_VERSION_V6); - log.debug("V3生成预制返回信息:{}", JSON.toJSONString(ddpcxxRspBO)); - String format = String.format(message, yyOrderInfo.getCdlcode(), ddpcxxRspBO.getZTXX()); - if (ddpcxxRspBO.getZTDM().equals(OrderValidateEnum.INVOICE_ERROR_CODE_010000_V3.getKey())) { - //添加状态修改 - yyOrderInfoMapper.updateStatus(yyOrderInfo.getCdlcode(), ConfigureConstant.STRING_1); - backMessage.add(ConfigureConstant.INT_0, format); + if (locked){ + List yyOrderItemInfoList = yyOrderItemInfoMapper.queryOrderItemInfo(yyOrderInfo.getId()); + if (CollectionUtils.isNotEmpty(yyOrderItemInfoList)) { + DdpcxxReqBO ddpcxxReqBO = transitionReadData(yyOrderInfo, yyOrderItemInfoList, deptEntity); + DdpcxxRspBO ddpcxxRspBO = allocateInvoiceInterfaceServiceImplV3.allocateInvoicesV3(ddpcxxReqBO, "", null, ConfigurerInfo.INTERFACE_VERSION_V6); + log.debug("V3生成预制返回信息:{}", JSON.toJSONString(ddpcxxRspBO)); + String format = String.format(message, yyOrderInfo.getCdlcode(), ddpcxxRspBO.getZTXX()); + if (ddpcxxRspBO.getZTDM().equals(OrderValidateEnum.INVOICE_ERROR_CODE_010000_V3.getKey())) { + //添加状态修改 + yyOrderInfoMapper.updateStatus(yyOrderInfo.getCdlcode(), ConfigureConstant.STRING_1); + backMessage.add(ConfigureConstant.INT_0, format); + } else { + backMessage.add(format); + } } else { - backMessage.add(format); + backMessage.add(String.format(message, yyOrderInfo.getCdlcode(), "订单明细信息丢失请删除重新读入")); } - } else { - backMessage.add(String.format(message, yyOrderInfo.getCdlcode(), "订单明细信息丢失请删除重新读入")); + }else { + backMessage.add(String.format(message, yyOrderInfo.getCdlcode(), "订单正在生成发票,请稍后再试")); + log.info("订单正在生成发票,请稍后再试"); } } catch (Exception e) { log.error("保存发票异常{}", e); String format = String.format(message, yyOrderInfo.getCdlcode(), "生成发票异常请联系管理员"); backMessage.add(format); + }finally { + if (locked) { + lock.unlock(); + } } } @@ -392,6 +411,14 @@ public class YyOrderServiceImpl implements OrderService { String invoiceAmount = ConfigureConstant.STRING_0; String taxAmount = ConfigureConstant.STRING_0; + boolean isZk = yyOrderItemInfoList.size()>ConfigureConstant.INT_1; + String xmmc = yyOrderItemInfoList.get(ConfigureConstant.INT_0).getCinvname(); + if (isZk){ + List collect = yyOrderItemInfoList.stream().filter(item -> DecimalCalculateUtil.stringCompare(item.getIsum(), ConfigureConstant.STRING_0) > ConfigureConstant.INT_0).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(collect)){ + xmmc = collect.get(ConfigureConstant.INT_0).getCinvname(); + } + } //发票明细信息 List ddmxxxBOList = new ArrayList<>(); int index = ConfigureConstant.INT_0; @@ -401,12 +428,9 @@ public class YyOrderServiceImpl implements OrderService { ddmxxxBO.setXMMC(yyOrderItemInfo.getCinvname()); ddmxxxBO.setGGXH(yyOrderItemInfo.getCinvstd()); ddmxxxBO.setDW(yyOrderItemInfo.getCcomunitname()); - String sl = DecimalCalculateUtil.dynamicDecimalFormatToStringWithoutZero(yyOrderItemInfo.getIquantity(), yyOrderInfo.getCvouchtype(), taxEquipmentInfo.getQdfwlx()); - ddmxxxBO.setSPSL(sl); ddmxxxBO.setJE(new BigDecimal(yyOrderItemInfo.getIsum()).setScale(ConfigureConstant.INT_2, RoundingMode.HALF_UP).toPlainString()); ddmxxxBO.setSL(new BigDecimal(yyOrderItemInfo.getItaxrate()).divide(new BigDecimal(ConfigureConstant.STRING_100)).toPlainString()); ddmxxxBO.setSE(new BigDecimal(yyOrderItemInfo.getItax()).setScale(ConfigureConstant.INT_2, RoundingMode.HALF_UP).toPlainString()); - ddmxxxBO.setDJ(getDynamicLengthDecimal(ddmxxxBO.getJE(), ddmxxxBO.getSPSL())); ddmxxxBO.setFPHXZ(ConfigureConstant.STRING_0); ddmxxxBO.setHSBZ(ConfigureConstant.STRING_1); ddmxxxBO.setBYZD1(yyOrderItemInfo.getIunitprice()); @@ -415,8 +439,28 @@ public class YyOrderServiceImpl implements OrderService { invoiceAmount = DecimalCalculateUtil.bigDecimalAdd(invoiceAmount, yyOrderItemInfo.getIsum(), ConfigureConstant.INT_2); taxAmount = DecimalCalculateUtil.bigDecimalAdd(taxAmount, yyOrderItemInfo.getItax(), ConfigureConstant.INT_2); + //添加则扣行判断 + if (isZk){ + ddmxxxBO.setXH(ConfigureConstant.STRING_1); + ddmxxxBO.setFPHXZ(ConfigureConstant.STRING_2); + if (StringUtils.isNotBlank(ddmxxxBO.getJE()) && DecimalCalculateUtil.stringCompare(ddmxxxBO.getJE(), ConfigureConstant.STRING_0) < ConfigureConstant.INT_0){ + ddmxxxBO.setXH(ConfigureConstant.STRING_2); + ddmxxxBO.setFPHXZ(ConfigureConstant.STRING_1); + ddmxxxBO.setXMMC(xmmc); + } + } + //非折扣行计算单价和数量 + if(StringUtils.isNotBlank(ddmxxxBO.getJE()) && DecimalCalculateUtil.stringCompare(ddmxxxBO.getJE(), ConfigureConstant.STRING_0) > ConfigureConstant.INT_0){ + String sl = DecimalCalculateUtil.dynamicDecimalFormatToStringWithoutZero(yyOrderItemInfo.getIquantity(), yyOrderInfo.getCvouchtype(), taxEquipmentInfo.getQdfwlx()); + ddmxxxBO.setSPSL(sl); + ddmxxxBO.setDJ(getDynamicLengthDecimal(ddmxxxBO.getJE(), ddmxxxBO.getSPSL())); + } + ddmxxxBOList.add(ddmxxxBO); } + if (isZk){ + ddmxxxBOList.sort(Comparator.comparing(DdmxxxBO::getXH)); + } //金额、税额、价税合计 ddtxxBO.setHJSE(taxAmount); ddtxxBO.setHJJE(DecimalCalculateUtil.bigDecimalSub(invoiceAmount, taxAmount, ConfigureConstant.INT_2));