|
|
@ -3,6 +3,7 @@ package com.dxhy.order.consumer.modules.order.service.impl; |
|
|
|
import cn.hutool.core.collection.CollectionUtil; |
|
|
|
import cn.hutool.core.collection.CollectionUtil; |
|
|
|
import cn.hutool.core.date.DateUtil; |
|
|
|
import cn.hutool.core.date.DateUtil; |
|
|
|
import cn.hutool.core.util.ObjectUtil; |
|
|
|
import cn.hutool.core.util.ObjectUtil; |
|
|
|
|
|
|
|
import com.alibaba.fastjson.JSONObject; |
|
|
|
import com.dxhy.base.constant.*; |
|
|
|
import com.dxhy.base.constant.*; |
|
|
|
import com.dxhy.base.utils.OrderMergeUtil; |
|
|
|
import com.dxhy.base.utils.OrderMergeUtil; |
|
|
|
import com.dxhy.base.utils.PriceTaxSeparationUtilNew; |
|
|
|
import com.dxhy.base.utils.PriceTaxSeparationUtilNew; |
|
|
@ -36,6 +37,7 @@ import org.springframework.stereotype.Service; |
|
|
|
import javax.annotation.Resource; |
|
|
|
import javax.annotation.Resource; |
|
|
|
import java.io.UnsupportedEncodingException; |
|
|
|
import java.io.UnsupportedEncodingException; |
|
|
|
import java.math.BigDecimal; |
|
|
|
import java.math.BigDecimal; |
|
|
|
|
|
|
|
import java.math.RoundingMode; |
|
|
|
import java.util.*; |
|
|
|
import java.util.*; |
|
|
|
import java.util.stream.Collectors; |
|
|
|
import java.util.stream.Collectors; |
|
|
|
|
|
|
|
|
|
|
@ -902,7 +904,8 @@ public class OrderMergeServiceImpl implements OrderMergeService { |
|
|
|
* @param nsrsbh 税号 |
|
|
|
* @param nsrsbh 税号 |
|
|
|
* @return java.lang.String |
|
|
|
* @return java.lang.String |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
private String queryMergeCommodityRuleType(String nsrsbh){ |
|
|
|
@Override |
|
|
|
|
|
|
|
public String queryMergeCommodityRuleType(String nsrsbh){ |
|
|
|
//查询合并同类商品规则
|
|
|
|
//查询合并同类商品规则
|
|
|
|
BaseInfoQueryBO baseInfoQueryBO = new BaseInfoQueryBO(); |
|
|
|
BaseInfoQueryBO baseInfoQueryBO = new BaseInfoQueryBO(); |
|
|
|
baseInfoQueryBO.setTaxpayerCode(nsrsbh); |
|
|
|
baseInfoQueryBO.setTaxpayerCode(nsrsbh); |
|
|
@ -920,4 +923,113 @@ public class OrderMergeServiceImpl implements OrderMergeService { |
|
|
|
return mergeCommodityRuleType; |
|
|
|
return mergeCommodityRuleType; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* |
|
|
|
|
|
|
|
* @param commonOrderInfo |
|
|
|
|
|
|
|
* @param mergeInItem 参与合并的订单 |
|
|
|
|
|
|
|
* @return |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
@Override |
|
|
|
|
|
|
|
public R orderItemMerge(CommonOrderInfo commonOrderInfo, List<OrderItemInfo> mergeInItem){ |
|
|
|
|
|
|
|
List<OrderItemInfo> orderItemInfos = commonOrderInfo.getOrderItemInfo(); |
|
|
|
|
|
|
|
OrderInfo orderInfo = commonOrderInfo.getOrderInfo(); |
|
|
|
|
|
|
|
//集合求差集,不参与合并的明细
|
|
|
|
|
|
|
|
List<OrderItemInfo> 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<String, List<OrderItemInfo>> 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<OrderItemInfo> orderItemInfoList = new ArrayList<>(); |
|
|
|
|
|
|
|
List<String> deleteItem = new ArrayList<>(); |
|
|
|
|
|
|
|
log.debug("明细合并前明细数据,{}",JSONObject.toJSONString(orderItemInfos)); |
|
|
|
|
|
|
|
for (List<OrderItemInfo> 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(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|