From 6e18397dd467f6a9f43bfa02d587b30b4c7d1447 Mon Sep 17 00:00:00 2001 From: gaorl Date: Thu, 29 Jun 2023 19:09:51 +0800 Subject: [PATCH] =?UTF-8?q?feature=EF=BC=9A=E6=98=8E=E7=BB=86=E5=90=88?= =?UTF-8?q?=E5=B9=B6=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../order/service/OrderCommonService.java | 4 + .../order/service/OrderMergeService.java | 6 + .../service/impl/OrderCommonServiceImpl.java | 15 +++ .../service/impl/OrderInfoServiceImpl.java | 110 +++-------------- .../service/impl/OrderMergeServiceImpl.java | 114 +++++++++++++++++- 5 files changed, 154 insertions(+), 95 deletions(-) diff --git a/order-management-consumer/src/main/java/com/dxhy/order/consumer/modules/order/service/OrderCommonService.java b/order-management-consumer/src/main/java/com/dxhy/order/consumer/modules/order/service/OrderCommonService.java index 4ea06b0d..1ef49d5f 100644 --- a/order-management-consumer/src/main/java/com/dxhy/order/consumer/modules/order/service/OrderCommonService.java +++ b/order-management-consumer/src/main/java/com/dxhy/order/consumer/modules/order/service/OrderCommonService.java @@ -3,6 +3,7 @@ package com.dxhy.order.consumer.modules.order.service; import com.dxhy.order.exception.OrderReceiveException; import com.dxhy.order.model.*; import com.dxhy.order.model.qd.OrderInfoQd; +import org.springframework.transaction.annotation.Transactional; import java.util.List; @@ -181,5 +182,8 @@ public interface OrderCommonService { void savePageData(List insertOrderInfoList, List> insertOrderItemList, List insertOrderProcessInfoList, List orderOriginList, List insertOrderEsc, List insertOrderJdc, List shList); + + @Transactional + void saveItemMergeOrderInfo(CommonOrderInfo commonOrderInfo); } diff --git a/order-management-consumer/src/main/java/com/dxhy/order/consumer/modules/order/service/OrderMergeService.java b/order-management-consumer/src/main/java/com/dxhy/order/consumer/modules/order/service/OrderMergeService.java index c0aa813c..b9bd05e0 100644 --- a/order-management-consumer/src/main/java/com/dxhy/order/consumer/modules/order/service/OrderMergeService.java +++ b/order-management-consumer/src/main/java/com/dxhy/order/consumer/modules/order/service/OrderMergeService.java @@ -1,5 +1,7 @@ package com.dxhy.order.consumer.modules.order.service; +import com.dxhy.order.model.CommonOrderInfo; +import com.dxhy.order.model.OrderItemInfo; import com.dxhy.order.model.R; import com.dxhy.order.consumer.modules.order.model.PageInvoiceItem; import com.dxhy.order.consumer.modules.order.model.PageMergeReq; @@ -32,5 +34,9 @@ public interface OrderMergeService { * @return */ R orderMergeCheck(List orderIdList); + + String queryMergeCommodityRuleType(String nsrsbh); + + R orderItemMerge(CommonOrderInfo commonOrderInfo, List itemInfos); } diff --git a/order-management-consumer/src/main/java/com/dxhy/order/consumer/modules/order/service/impl/OrderCommonServiceImpl.java b/order-management-consumer/src/main/java/com/dxhy/order/consumer/modules/order/service/impl/OrderCommonServiceImpl.java index 327833f1..ea69f8c5 100644 --- a/order-management-consumer/src/main/java/com/dxhy/order/consumer/modules/order/service/impl/OrderCommonServiceImpl.java +++ b/order-management-consumer/src/main/java/com/dxhy/order/consumer/modules/order/service/impl/OrderCommonServiceImpl.java @@ -33,6 +33,7 @@ import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.io.UnsupportedEncodingException; import java.util.*; +import java.util.stream.Collectors; /** * 订单发票通用服务接口 @@ -1556,4 +1557,18 @@ public class OrderCommonServiceImpl implements OrderCommonService { } } + @Override + public void saveItemMergeOrderInfo(CommonOrderInfo commonOrderInfo){ + List orderItemInfoList = commonOrderInfo.getOrderItemInfo(); + OrderInfo orderInfo = commonOrderInfo.getOrderInfo(); + OrderProcessInfo processInfo = commonOrderInfo.getProcessInfo(); + if(!orderItemInfoList.isEmpty()){ + orderItemInfoMapper.deleteItemByItemId(orderItemInfoList.stream().map(t->t.getId()).collect(Collectors.toList())); + orderItemInfoMapper.insertOrderItemByList(orderItemInfoList); + } + + orderInfoMapper.updateOrderInfoByOrderId(orderInfo,Arrays.asList(orderInfo.getNsrsbh())); + orderProcessInfoMapper.updateOrderProcessInfoByProcessId(processInfo,Arrays.asList(orderInfo.getNsrsbh())); + } + } diff --git a/order-management-consumer/src/main/java/com/dxhy/order/consumer/modules/order/service/impl/OrderInfoServiceImpl.java b/order-management-consumer/src/main/java/com/dxhy/order/consumer/modules/order/service/impl/OrderInfoServiceImpl.java index a570a239..18129d8b 100644 --- a/order-management-consumer/src/main/java/com/dxhy/order/consumer/modules/order/service/impl/OrderInfoServiceImpl.java +++ b/order-management-consumer/src/main/java/com/dxhy/order/consumer/modules/order/service/impl/OrderInfoServiceImpl.java @@ -186,6 +186,9 @@ public class OrderInfoServiceImpl implements OrderInfoService { @Resource private CommodityMapper commodityMapper; + @Resource + private OrderMergeService orderMergeService; + DecimalFormat format = new DecimalFormat("#.###"); @Override @@ -2030,107 +2033,26 @@ public class OrderInfoServiceImpl implements OrderInfoService { List collect ; if(itemList != null){ collect = orderItemInfos.stream().filter(t -> itemList.contains(t.getId()) && StringUtils.isNotBlank(t.getSpbm())).collect(Collectors.toList()); - if(ObjectUtil.isNull(collect)){ - return R.error("税收编码为空的不允许合并,请先更新税收编码"); - } }else{ - collect = orderItemInfos; + collect = orderItemInfos.stream().filter(t -> StringUtils.isNotBlank(t.getSpbm())).collect(Collectors.toList()); + } + //税编为空的不允许合并 + if(orderItemInfos.size() != collect.size()){ + return R.error("税收编码为空的不允许合并,请先更新税收编码"); } - List mergeOutItem = orderItemInfos.stream().filter(t -> !collect.contains(t)).collect(Collectors.toList()); TaxEquipmentInfo taxEquipmentInfo = simsBackService.queryTaxEquipment(orderInfo.getNsrsbh(), entId); if(taxEquipmentInfo == null ||StringUtils.isBlank(taxEquipmentInfo.getSksbCode())){ return R.error("税控设备查询为空"); } - String sksbCode = taxEquipmentInfo.getSksbCode(); - boolean termType = OrderInfoEnum.TAX_EQUIPMENT_FGBW.equals(sksbCode) || OrderInfoEnum.TAX_EQUIPMENT_FGUKEY.equals(sksbCode); - Map> collect1 = collect.stream().map(t->{ - t.setXmmc(StringUtils.isBlank(t.getXmmc())?"":t.getXmmc()); - t.setXmdw(StringUtils.isBlank(t.getXmdw())?"":t.getXmdw()); - t.setGgxh(StringUtils.isBlank(t.getGgxh())?"":t.getGgxh()); - t.setZxbm(StringUtils.isBlank(t.getZxbm())?"":t.getZxbm()); - return t; - }).collect(Collectors.groupingBy(t -> t.getFphxz() + t.getXmmc() + t.getXmdw() + t.getGgxh() + t.getSl() + t.getSpbm() + t.getZxbm())); - List orderItemInfoList = new ArrayList<>(); - List deleteItem = new ArrayList<>(); - BigDecimal diffJe = new BigDecimal("0"); - BigDecimal diffSe = new BigDecimal("0"); - for (List value : collect1.values()) { - if(value.size() == 1){continue;} - BigDecimal xmsl = new BigDecimal("0"); - BigDecimal xmje = new BigDecimal("0"); - BigDecimal se = new BigDecimal("0"); - for (OrderItemInfo orderItemInfo : value) { - xmsl = xmsl.add(new BigDecimal(orderItemInfo.getXmsl())); - xmje = xmje.add(new BigDecimal(orderItemInfo.getXmje())); - se = se.add(new BigDecimal(orderItemInfo.getSe())); - } - OrderItemInfo orderItemInfo = value.get(0); - orderItemInfo.setXmsl(xmsl.toString()); - orderItemInfo.setXmje(xmje.toString()); - //重算单价 - orderItemInfo.setXmdj(xmje.divide(xmsl,8,RoundingMode.HALF_UP).toString()); - //重算税额 - String hsbz = orderItemInfo.getHsbz(); - BigDecimal taxRate = new BigDecimal(orderItemInfo.getSl()); - BigDecimal taxAmount = new BigDecimal(orderItemInfo.getSe()); - if (OrderInfoEnum.HSBZ_1.getKey().equals(hsbz)) { - taxAmount = xmje.divide(new BigDecimal("1").add(taxRate),0).multiply(taxRate).setScale(2,RoundingMode.HALF_UP); - } else if (OrderInfoEnum.HSBZ_0.getKey().equals(hsbz)) { - taxAmount = xmje.multiply(taxRate).setScale(2,RoundingMode.HALF_UP); - } - orderItemInfo.setCreateTime(new Date()); - orderItemInfo.setSe(se.toString()); - if((termType && se.subtract(taxAmount).abs().doubleValue() > 0.01) || (!termType &&se.subtract(taxAmount).abs().doubleValue() > 0.06)){ - log.info("订单id:{}合并明细误差超过额度",orderInfoId); - BigDecimal taxAndAmount = xmje.add(se); - BigDecimal taxAmountNew = taxAndAmount.divide(new BigDecimal("1").add(taxRate),0).multiply(taxRate).setScale(2,RoundingMode.HALF_UP); - BigDecimal xmjeNew = taxAndAmount.subtract(taxAmountNew); - orderItemInfo.setXmje(xmjeNew.toString()); - orderItemInfo.setSe(taxAmountNew.toString()); - if(StringUtils.isNotBlank(orderItemInfo.getXmsl())){ - BigDecimal xmdj = xmjeNew.divide(xmsl, 8, RoundingMode.HALF_UP); - if(xmdj.multiply(xmsl).subtract(xmjeNew).doubleValue() > 0.01){ - orderItemInfo.setXmsl(xmjeNew.divide(xmdj,8,RoundingMode.HALF_UP).toString()); - } - orderItemInfo.setXmdj(xmdj.toString()); - } -// return R.error("明细行号{}合并错误,合并明细超过0.06暂时不合并",orderItemInfo.getSphxh()); -// diffJe = diffJe.add(xmjeNew.subtract(xmje)); -// diffSe = diffSe.add(taxAmountNew.subtract(se)); - } - orderItemInfoList.add(orderItemInfo); - deleteItem.addAll(value.stream().map(t->t.getId()).collect(Collectors.toList())); - } - log.debug("合并明细{}",JSONObject.toJSONString(orderItemInfoList)); - if((termType && diffSe.abs().doubleValue() > 0.06) || (!termType && diffSe.abs().doubleValue() > 1.27)){ - return R.error("合并失败,合并明细后价税合计超过总的误差范围"); + orderInfo.setSksbCode(taxEquipmentInfo.getSksbCode()); + BigDecimal hjse = orderItemInfos.stream().map(t -> new BigDecimal(t.getSe())).reduce(BigDecimal::add).get(); + if(StringUtils.isBlank(orderInfo.getHjse())){ + orderInfo.setHjse(hjse.toString()); } - if(!orderItemInfoList.isEmpty()){ - orderItemInfoMapper.deleteItemByItemId(deleteItem); - orderItemInfoMapper.insertOrderItemByList(orderItemInfoList); - mergeOutItem.addAll(orderItemInfoList); - } - BigDecimal se = mergeOutItem.stream().map(t -> new BigDecimal(t.getSe())).reduce(BigDecimal::add).get(); - //更新清单标志 重新设置金额 - OrderInfo orderInfoNew = new OrderInfo(); - orderInfoNew.setId(orderInfoId); - orderInfoNew.setUpdateTime(new Date()); - //OrderProcessInfo orderProcessInfo = orderProcessInfoMapper.selectByOrderId(orderInfoId, null); - OrderProcessInfo orderProcessInfoNew = new OrderProcessInfo(); - orderProcessInfoNew.setOrderInfoId(orderInfoId); - orderProcessInfoNew.setUpdateTime(new Date()); - if("1".equals(orderInfo.getQdBz())&&orderItemInfos.size() - deleteItem.size() < 8 ){ - orderInfoNew.setQdBz("0"); - } - String bhsje = new BigDecimal(orderInfo.getKphjje()).subtract(se).toString(); - orderInfoNew.setHjbhsje(bhsje); - orderInfoNew.setHjse(se.toString()); - orderProcessInfoNew.setHjbhsje(bhsje); - orderProcessInfoNew.setKpse(se.toString()); - orderMapper.updateOrderInfoByOrderId(orderInfoNew,Arrays.asList(orderInfo.getNsrsbh())); - orderProcessInfoMapper.updateOrderProcessInfoByProcessId(orderProcessInfoNew,Arrays.asList(orderInfo.getNsrsbh())); - - return R.ok(); + CommonOrderInfo commonOrderInfo = new CommonOrderInfo(); + commonOrderInfo.setOrderItemInfo(collect); + commonOrderInfo.setOrderInfo(orderInfo); + return orderMergeService.orderItemMerge(commonOrderInfo,collect); } @Override diff --git a/order-management-consumer/src/main/java/com/dxhy/order/consumer/modules/order/service/impl/OrderMergeServiceImpl.java b/order-management-consumer/src/main/java/com/dxhy/order/consumer/modules/order/service/impl/OrderMergeServiceImpl.java index ccd81d08..1b00778b 100644 --- a/order-management-consumer/src/main/java/com/dxhy/order/consumer/modules/order/service/impl/OrderMergeServiceImpl.java +++ b/order-management-consumer/src/main/java/com/dxhy/order/consumer/modules/order/service/impl/OrderMergeServiceImpl.java @@ -3,6 +3,7 @@ package com.dxhy.order.consumer.modules.order.service.impl; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; import com.dxhy.base.constant.*; import com.dxhy.base.utils.OrderMergeUtil; import com.dxhy.base.utils.PriceTaxSeparationUtilNew; @@ -36,6 +37,7 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.io.UnsupportedEncodingException; import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.*; import java.util.stream.Collectors; @@ -902,7 +904,8 @@ public class OrderMergeServiceImpl implements OrderMergeService { * @param nsrsbh 税号 * @return java.lang.String */ - private String queryMergeCommodityRuleType(String nsrsbh){ + @Override + public String queryMergeCommodityRuleType(String nsrsbh){ //查询合并同类商品规则 BaseInfoQueryBO baseInfoQueryBO = new BaseInfoQueryBO(); baseInfoQueryBO.setTaxpayerCode(nsrsbh); @@ -920,4 +923,113 @@ public class OrderMergeServiceImpl implements OrderMergeService { return mergeCommodityRuleType; } + /** + * + * @param commonOrderInfo + * @param mergeInItem 参与合并的订单 + * @return + */ + @Override + public R orderItemMerge(CommonOrderInfo commonOrderInfo, List mergeInItem){ + List orderItemInfos = commonOrderInfo.getOrderItemInfo(); + OrderInfo orderInfo = commonOrderInfo.getOrderInfo(); + //集合求差集,不参与合并的明细 + List mergeOutItem = orderItemInfos.stream().filter(t -> !mergeInItem.contains(t)).collect(Collectors.toList()); + String sksbCode = orderInfo.getSksbCode(); + boolean termType = OrderInfoEnum.TAX_EQUIPMENT_FGBW.equals(sksbCode) || OrderInfoEnum.TAX_EQUIPMENT_FGUKEY.equals(sksbCode); + //根据配置去判断合并规则 + Map> collect1 = orderItemInfos.stream().map(t->{ + t.setXmmc(StringUtils.isBlank(t.getXmmc())?"":t.getXmmc()); + t.setXmdw(StringUtils.isBlank(t.getXmdw())?"":t.getXmdw()); + t.setGgxh(StringUtils.isBlank(t.getGgxh())?"":t.getGgxh()); + t.setZxbm(StringUtils.isBlank(t.getZxbm())?"":t.getZxbm()); + return t; + }).collect(Collectors.groupingBy(t -> t.getFphxz() + t.getXmmc() + t.getXmdw() + t.getGgxh() + t.getSl() + t.getSpbm() + t.getZxbm())); + List orderItemInfoList = new ArrayList<>(); + List deleteItem = new ArrayList<>(); + log.debug("明细合并前明细数据,{}",JSONObject.toJSONString(orderItemInfos)); + for (List value : collect1.values()) { + if(value.size() == 1){continue;} + BigDecimal xmsl = new BigDecimal("0"); + BigDecimal xmje = new BigDecimal("0"); + BigDecimal se = new BigDecimal("0"); + for (OrderItemInfo orderItemInfo : value) { + xmsl = xmsl.add(new BigDecimal(orderItemInfo.getXmsl())); + xmje = xmje.add(new BigDecimal(orderItemInfo.getXmje())); + se = se.add(new BigDecimal(orderItemInfo.getSe())); + } + OrderItemInfo orderItemInfo = value.get(0); + orderItemInfo.setXmsl(xmsl.toString()); + orderItemInfo.setXmje(xmje.toString()); + //重算单价 + orderItemInfo.setXmdj(xmje.divide(xmsl,8, RoundingMode.HALF_UP).toString()); + //重算税额 + String hsbz = orderItemInfo.getHsbz(); + BigDecimal taxRate = new BigDecimal(orderItemInfo.getSl()); + BigDecimal taxAmount = new BigDecimal(orderItemInfo.getSe()); + if (OrderInfoEnum.HSBZ_1.getKey().equals(hsbz)) { + taxAmount = xmje.divide(new BigDecimal("1").add(taxRate),0).multiply(taxRate).setScale(2,RoundingMode.HALF_UP); + } else if (OrderInfoEnum.HSBZ_0.getKey().equals(hsbz)) { + taxAmount = xmje.multiply(taxRate).setScale(2,RoundingMode.HALF_UP); + } + orderItemInfo.setCreateTime(new Date()); + orderItemInfo.setSe(se.toString()); + if((termType && se.subtract(taxAmount).abs().doubleValue() > 0.01) || (!termType &&se.subtract(taxAmount).abs().doubleValue() > 0.06)){ + log.info("订单id:{}合并明细误差超过额度",orderInfo.getId()); + BigDecimal taxAndAmount = xmje.add(se); + BigDecimal taxAmountNew = taxAndAmount.divide(new BigDecimal("1").add(taxRate),0).multiply(taxRate).setScale(2,RoundingMode.HALF_UP); + BigDecimal xmjeNew = taxAndAmount.subtract(taxAmountNew); + orderItemInfo.setXmje(xmjeNew.toString()); + orderItemInfo.setSe(taxAmountNew.toString()); + if(StringUtils.isNotBlank(orderItemInfo.getXmsl())){ + BigDecimal xmdj = xmjeNew.divide(xmsl, 8, RoundingMode.HALF_UP); + if(xmdj.multiply(xmsl).subtract(xmjeNew).doubleValue() > 0.01){ + orderItemInfo.setXmsl(xmjeNew.divide(xmdj,8,RoundingMode.HALF_UP).toString()); + } + orderItemInfo.setXmdj(xmdj.toString()); + } + } + orderItemInfoList.add(orderItemInfo); + deleteItem.addAll(value.stream().map(t->t.getId()).collect(Collectors.toList())); + } + + if(!orderItemInfoList.isEmpty()){ + mergeOutItem.addAll(orderItemInfoList); + } + log.debug("明细合并合并后{}", JSONObject.toJSONString(mergeOutItem)); + + //对比合计税额的误差,此处将不参与和与参与合并合并对比 + BigDecimal hjse = mergeOutItem.stream().map(t -> new BigDecimal(t.getSe())).reduce(BigDecimal::add).get(); + BigDecimal oldhjse = orderItemInfos.stream().map(t -> new BigDecimal(t.getSe())).reduce(BigDecimal::add).get(); + if((termType && hjse.subtract(oldhjse).abs().doubleValue() > 0.06) || (!termType && hjse.subtract(oldhjse).abs().doubleValue() > 1.27)){ + return R.error("合并失败,合并明细后价税合计超过总的误差范围"); + } + //更新清单标志 重新设置金额 + OrderInfo orderInfoNew = new OrderInfo(); + orderInfoNew.setId(orderInfo.getId()); + orderInfoNew.setUpdateTime(new Date()); + //OrderProcessInfo orderProcessInfo = orderProcessInfoMapper.selectByOrderId(orderInfoId, null); + OrderProcessInfo orderProcessInfoNew = new OrderProcessInfo(); + orderProcessInfoNew.setOrderInfoId(orderInfo.getId()); + orderProcessInfoNew.setUpdateTime(new Date()); + if("1".equals(orderInfo.getQdBz())&&orderItemInfos.size() - deleteItem.size() < 8 ){ + orderInfoNew.setQdBz("0"); + } + String bhsje = new BigDecimal(orderInfo.getKphjje()).subtract(hjse).toString(); + orderInfoNew.setHjbhsje(bhsje); + orderInfoNew.setHjse(hjse.toString()); + orderProcessInfoNew.setHjbhsje(bhsje); + orderProcessInfoNew.setKpse(hjse.toString()); + commonOrderInfo.setOrderItemInfo(orderItemInfoList); + commonOrderInfo.setOrderInfo(orderInfoNew); + commonOrderInfo.setProcessInfo(orderProcessInfoNew); + try { + apiInvoiceCommonService.saveItemMergeOrderInfo(commonOrderInfo); + } catch (Exception e) { + log.error("明细合并更新数据库出错{}",e); + return R.error(); + } + return R.ok(); + } + }