|
@@ -3,9 +3,13 @@ package com.iamberry.rst.service.order;
|
|
|
import com.iamberry.app.tool.util.MD5;
|
|
|
import com.iamberry.rst.core.cm.SalesOrder;
|
|
|
import com.iamberry.rst.core.cm.SalesOrderItem;
|
|
|
+import com.iamberry.rst.core.dm.DealerChannel;
|
|
|
+import com.iamberry.rst.core.dm.DealerProduct;
|
|
|
import com.iamberry.rst.core.order.*;
|
|
|
import com.iamberry.rst.core.tools.LogisticsInfo;
|
|
|
import com.iamberry.rst.faces.cm.SalesOrderService;
|
|
|
+import com.iamberry.rst.faces.dm.DealerChannelService;
|
|
|
+import com.iamberry.rst.faces.dm.DealerProductService;
|
|
|
import com.iamberry.rst.faces.order.LogisticsInfoService;
|
|
|
import com.iamberry.rst.faces.order.OrderBatchService;
|
|
|
import com.iamberry.rst.faces.order.OrderSyncLogService;
|
|
@@ -57,6 +61,10 @@ public class OrderSyncLogServiceImpl implements OrderSyncLogService {
|
|
|
private GenerateKeyUtil generateKeyUtil ;
|
|
|
@Autowired
|
|
|
private SalesOrderMapper salesOrderMapper ;
|
|
|
+ @Autowired
|
|
|
+ private DealerChannelService dealerChannelService;
|
|
|
+ @Autowired
|
|
|
+ private DealerProductService dealerProductService;
|
|
|
|
|
|
//Map最大容量
|
|
|
static int maxSize = 20;
|
|
@@ -867,6 +875,156 @@ public class OrderSyncLogServiceImpl implements OrderSyncLogService {
|
|
|
salesOrder.setSalesBatchId(batchId);
|
|
|
|
|
|
salesOrder.setSalesOrderItemList(salesOrderItemList);
|
|
|
+
|
|
|
+ //处理客户信息-开始
|
|
|
+ //因为 在一次导单中 下面循环里面会多次使用相同的条件查询产品供应价格list(smallDpList),所以使用list将他临时存储起来,
|
|
|
+ List<Map<String,Object>> list = new ArrayList<>();
|
|
|
+
|
|
|
+ DealerChannel dealerChannel = new DealerChannel();
|
|
|
+ dealerChannel.setStoreId(salesOrder.getSalesStoreId());
|
|
|
+ List<DealerChannel> dealerChannelList = dealerChannelService.getDealerChannelList(dealerChannel);
|
|
|
+ if(dealerChannelList!= null && dealerChannelList.size() > 0){
|
|
|
+ dealerChannel = dealerChannelList.get(0);
|
|
|
+ }else{
|
|
|
+ throw new Exception("订单导入失败-查询店铺对应客户信息失败,店铺ID:"+salesOrder.getSalesStoreId()+"。");
|
|
|
+ }
|
|
|
+
|
|
|
+ List<DealerProduct> smallDpList = null;
|
|
|
+ if(list.size() > 0){
|
|
|
+ for (Map<String,Object> smap:list) {
|
|
|
+ if(Objects.equals(dealerChannel.getDealerId(),smap.get("dealerId"))
|
|
|
+ && Objects.equals(dealerChannel.getDealChannelId(),smap.get("dealChannelId"))){
|
|
|
+ smallDpList = (List<DealerProduct>) smap.get("dpList");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(smallDpList == null){
|
|
|
+ DealerProduct smallDp = new DealerProduct();
|
|
|
+ smallDp.setDealerId(dealerChannel.getDealerId());
|
|
|
+ smallDp.setDealChannelId(dealerChannel.getDealChannelId());
|
|
|
+ smallDpList = dealerProductService.getProductByChannelList(smallDp);
|
|
|
+
|
|
|
+ Map<String,Object> smap = new HashMap<>();
|
|
|
+ smap.put("dealerId",dealerChannel.getDealerId());
|
|
|
+ smap.put("dealChannelId",dealerChannel.getDealChannelId());
|
|
|
+ smap.put("dpList",smallDpList);
|
|
|
+ list.add(smap);
|
|
|
+ }
|
|
|
+
|
|
|
+ //取出订单项价格不为零的订单项 -- 自营需要
|
|
|
+ List<SalesOrderItem> noZeroSalesOrderItemList = new ArrayList<>();
|
|
|
+
|
|
|
+ //查询店铺价格赋值在订单项中
|
|
|
+ for (int p =0 ;p<salesOrder.getSalesOrderItemList().size(); p++ ){
|
|
|
+ SalesOrderItem salesOrderItem = salesOrder.getSalesOrderItemList().get(p);
|
|
|
+ //获取当前该产品对应客户的价格
|
|
|
+ Integer newPrice=0;
|
|
|
+ if(smallDpList != null && smallDpList.size() > 0){
|
|
|
+ boolean isHaveColorId = false;
|
|
|
+ for (DealerProduct dp:smallDpList) {
|
|
|
+ if(Objects.equals(dp.getColorId(), salesOrderItem.getItemColorId())){
|
|
|
+ if(1 == dp.getDealProdStoreArea()){
|
|
|
+ // 1:全部店铺
|
|
|
+ newPrice = dp.getDealProdPrice();
|
|
|
+ }else{
|
|
|
+ newPrice = dp.getDealProdPrice();
|
|
|
+ }
|
|
|
+ isHaveColorId = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(!isHaveColorId){
|
|
|
+ throw new Exception("订单导入-未能从该客户中获取到对应产品的信息,客户名称:"+dealerChannel.getDealerName()+",---产品:"+ salesOrderItem.getItemProductName()+"("+ salesOrderItem.getItemProductColor() +")。");
|
|
|
+ }
|
|
|
+ salesOrderItem.setItemProductPrice(newPrice);
|
|
|
+ salesOrderItem.setItemProductDiscount(newPrice);
|
|
|
+ if(newPrice > 0){
|
|
|
+ noZeroSalesOrderItemList.add(salesOrderItem);
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ throw new Exception("订单导入-未能从该客户中获取到对应产品的信息,客户名称:"+dealerChannel.getDealerName()+",---产品:"+ salesOrderItem.getItemProductName()+"("+ salesOrderItem.getItemProductColor() +")。");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(1 == dealerChannel.getDealerSelfOperated()) {
|
|
|
+ //按照购买数量进行降序排序
|
|
|
+ Collections.sort(noZeroSalesOrderItemList, new Comparator<SalesOrderItem>() {
|
|
|
+ @Override
|
|
|
+ public int compare(SalesOrderItem s1, SalesOrderItem s2) {
|
|
|
+ return s2.getItemNum().compareTo(s1.getItemNum());
|
|
|
+ }
|
|
|
+
|
|
|
+ });
|
|
|
+
|
|
|
+ //计算订单总价(*数量) - 填写的客户价格计算的总价格
|
|
|
+ Integer allPrice = 0;
|
|
|
+ for (SalesOrderItem sdi : noZeroSalesOrderItemList) {
|
|
|
+ for (DealerProduct dp : smallDpList) {
|
|
|
+ if (Objects.equals(dp.getColorId(), sdi.getItemColorId())) {
|
|
|
+ allPrice += sdi.getItemNum() * dp.getDealProdPrice();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //1:自营
|
|
|
+ Integer lastTotal = salesOrder.getSalesAmount();//自营使用 - 表示分配剩余总金额
|
|
|
+ Integer total = salesOrder.getSalesAmount();//自营使用
|
|
|
+
|
|
|
+ for (int f =0 ;f<noZeroSalesOrderItemList.size(); f++ ) {
|
|
|
+ SalesOrderItem salesOrderItem = noZeroSalesOrderItemList.get(f);
|
|
|
+ if ((f + 1) >= noZeroSalesOrderItemList.size()) {
|
|
|
+ //最后一个赋值剩余值,防止出现少一分的情况
|
|
|
+ salesOrderItem.setItemTotal(lastTotal);
|
|
|
+
|
|
|
+ Double itemLastTotal = lastTotal.doubleValue();
|
|
|
+ Double itemPrice = itemLastTotal/salesOrderItem.getItemNum();
|
|
|
+ salesOrderItem.setItemProductDiscount(itemPrice.intValue());
|
|
|
+ salesOrderItem.setItemProductPrice(itemPrice.intValue());
|
|
|
+ } else {
|
|
|
+ //当前产品总价
|
|
|
+ Integer aoncePrice = salesOrderItem.getItemProductDiscount() * salesOrderItem.getItemNum();
|
|
|
+
|
|
|
+ //计算比例
|
|
|
+ Double priceRate = Double.valueOf(aoncePrice) / Double.valueOf(allPrice);
|
|
|
+
|
|
|
+ //当前订单项按照比例得出的实际总价
|
|
|
+ Double itemTotalByDouble = total * priceRate;
|
|
|
+ itemTotalByDouble = Math.floor(itemTotalByDouble);//去掉小数
|
|
|
+
|
|
|
+ //尽量保证订单项能够除尽
|
|
|
+ Integer itemNum = salesOrderItem.getItemNum();
|
|
|
+ while (salesOrderItem.getItemNum()>1 && itemTotalByDouble%salesOrderItem.getItemNum() > 0
|
|
|
+ && itemNum >=0){
|
|
|
+ itemTotalByDouble ++;
|
|
|
+ itemNum--;
|
|
|
+ }
|
|
|
+
|
|
|
+ Integer itemTotal = itemTotalByDouble.intValue();
|
|
|
+ salesOrderItem.setItemTotal(itemTotal);
|
|
|
+
|
|
|
+ Double itemPrice = itemTotalByDouble/salesOrderItem.getItemNum();
|
|
|
+ salesOrderItem.setItemProductDiscount(itemPrice.intValue());
|
|
|
+ salesOrderItem.setItemProductPrice(itemPrice.intValue());
|
|
|
+
|
|
|
+ //减去当前订单项的金额
|
|
|
+ lastTotal -= itemTotal;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ //2:非自营
|
|
|
+ Integer nonSelfEmployedAmount = 0; //非自营,需要加所有的订单项金额,最后赋值到订单价格
|
|
|
+ for (int f =0 ;f<salesOrder.getSalesOrderItemList().size(); f++ ){
|
|
|
+ SalesOrderItem salesOrderItem = salesOrder.getSalesOrderItemList().get(f);
|
|
|
+ salesOrderItem.setItemTotal(salesOrderItem.getItemProductDiscount()*salesOrderItem.getItemNum());
|
|
|
+ nonSelfEmployedAmount+=salesOrderItem.getItemTotal();
|
|
|
+ if(f == salesOrder.getSalesOrderItemList().size()-1){
|
|
|
+ //非自营必须强行赋值
|
|
|
+ salesOrder.setSalesAmount(nonSelfEmployedAmount);
|
|
|
+ salesOrder.setSalesPayMoney(nonSelfEmployedAmount);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //处理客户信息-结束
|
|
|
+
|
|
|
String[] detectIds = {};
|
|
|
salesOrderService.addRstOrderinfo(salesOrder,new ArrayList<SalesOrder>(),detectIds);
|
|
|
|