Browse Source

oms订单发货

ymy 1 year ago
parent
commit
8188b72faf

+ 80 - 26
src/views/oms/order/components/batchbyOneModal.vue

@@ -3,6 +3,7 @@
     v-loading="load"
     :title="data.length <= 1 ? '订单发货' : '订单发货(批量逐一发货)'"
     :visible.sync="drawer"
+    @close="close"
     :direction="direction"
     size="50%">
     <div class="content">
@@ -10,6 +11,7 @@
         <el-pagination
           background
           :page-size="1"
+          :current-page="currentOrder + 1"
           layout="prev, pager, next"
           @current-change="currentChange"
           :total="data.length">
@@ -23,7 +25,8 @@
     <div class="deli-footer">
       <div class="d-left">
         <div class="estimate-total">
-          订单小计<span class="total">¥{{data[currentOrder] && currentPrice[data[currentOrder].omsOrderIds]?currentPrice[data[currentOrder].omsOrderIds].estimateFreight:'0.00'}}</span> <span class="detail">明细></span>
+          订单小计<span class="total">¥{{data[currentOrder] && currentPrice[data[currentOrder].omsOrderIds]?currentPrice[data[currentOrder].omsOrderIds].estimateFreight:'0.00'}}</span> 
+          <!-- <span class="detail">明细></span> -->
         </div>
         <!-- <div class="estimate-total">
           预计总价<span class="total">¥48.00</span>
@@ -32,7 +35,11 @@
           <el-checkbox v-model="checked">已读并同意《XXX电子运单协议》</el-checkbox>
         </div>
       </div>
-      <div class="send-btn" @click="btn" :class="{'stopBtn':stopHandle}">确认</div>
+      <div class="btn-box">
+        <div class="send-btn" @click="btn" :class="{'stopBtn':stopHandle}">一键发货</div>
+        <div class="send-btn" @click="nextBtn" :class="{'stopBtn':stopHandle}" v-if="data.length > 1">确认,下一单</div>
+      </div>
+      
     </div>
   </el-drawer>
 </template>
@@ -52,12 +59,21 @@ export default class BatchbyOneModal extends Vue {
   checked=false;
   data:Array<any>=[];
   currentOrder=0;
+  isSuccess=false;
   stopHandle=false;
   load = false;
   priceObj:any={};
   currentPrice:any={};
   setShow(v:boolean){
     this.drawer=v;
+    this.priceObj={};
+    this.currentPrice={};
+    this.isSuccess = false;
+  }
+  close(){
+    if(this.isSuccess){
+      this.$emit('handleSuccess');
+    }
   }
   editResult(v:any){
     this.data[this.currentOrder] = v;
@@ -72,9 +88,12 @@ export default class BatchbyOneModal extends Vue {
     this.currentOrder = v-1;
     this.$forceUpdate();
     this.$nextTick(()=>{
-      (this.$refs.info as any).setValue(this.data[this.currentOrder]);
+      this.setInfo();
     })
   }
+  setInfo(){
+    (this.$refs.info as any).setValue(this.data[this.currentOrder]);
+  }
   setValue(data:Array<any>){
     this.data = [];
     this.stopHandle = false;
@@ -135,7 +154,9 @@ export default class BatchbyOneModal extends Vue {
     return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
   }
   btn(){
+    this.currentOrder = 0;
     if(this.stopHandle){
+      this.$message('库存不足!')
       return
     }
     if(!this.checked){
@@ -151,7 +172,7 @@ export default class BatchbyOneModal extends Vue {
       return
     }
     if(this.data.length > 1){
-      this.currentOrder = 0;
+      
       let ids='';
       for(const item of this.data){
         if(!item.orderType || !item.tmsShipmentConsignor){
@@ -166,26 +187,34 @@ export default class BatchbyOneModal extends Vue {
         }).then(() => {
           this.setOnEditOrderInfo(ids);
           this.sendGoods(this.data[0]);
-          // let i = 0;
-          // for(const item of this.data){
-          //   if(i == 0){
-          //     this.sendGoods(item);
-          //   }else{
-          //     this.getStoreCount(item,this.getPriceInfo);
-          //   }
-          //   i++;
-          // }
+
         }).catch(() => {});
       }else{
         this.sendGoods(this.data[0]);
-        // for(const item of this.data){
-        //   this.sendGoods(item);
-        // }
       }
     }else{
       this.sendGoods(this.data[0]);
     }
   }
+  nextBtn(){
+    if(this.stopHandle){
+      this.$message('库存不足!')
+      return
+    }
+    if(!this.checked){
+      this.$message('请阅读并同意运单协议!')
+      return
+    }
+    if(!this.data[this.currentOrder].tmsShipmentAddress || !this.data[this.currentOrder].tmsShipmentConsignor){
+      this.$message("请编辑订单信息");
+      return
+    }
+    if(!this.currentPrice[this.data[this.currentOrder].omsOrderIds]){
+      this.$message('请选择价格!')
+      return
+    }
+    this.sendGoods(this.data[this.currentOrder],true);
+  }
   //查库存
   getStoreCount(item:any,callback?:Function){
     let params:any={};
@@ -193,7 +222,9 @@ export default class BatchbyOneModal extends Vue {
     params.skuIds=[]
     if(item.subItem){
       for(const i of item.subItem){
-        params.skuIds.push(i.omsOrderItemId)
+        if(params.skuIds.indexOf(i.omsOrderItemId) == -1){
+          params.skuIds.push(i.omsOrderItemId)
+        }
       }
     }
     this.load = true;
@@ -202,8 +233,11 @@ export default class BatchbyOneModal extends Vue {
       let m='';
       for(const i of item.subItem){
         for(const d of res.data){
-          if(i.omsOrderItemId == d.skuid && d.inventory <=0){
+          let s = Number(d.inventory) - Number(d.useInventory) - Number(i.tmsQuantity);
+          if(i.omsOrderItemId == d.skuid && s < 0){
             m = m ? m + ',' + i.name : i.name;          
+          }else{
+            d.inventory = subtract(d.inventory, i.tmsQuantity);
           }
         }
       }
@@ -221,7 +255,10 @@ export default class BatchbyOneModal extends Vue {
     })
   }
   //发货
-  sendGoods(item:any){
+  sendGoods(item:any,isNext?:boolean){
+    if(!item){
+      return
+    }
     let params:any=(this as any).$lodash.cloneDeep(item);
     if(this.priceObj[item.omsOrderIds]){
       try{
@@ -236,19 +273,29 @@ export default class BatchbyOneModal extends Vue {
     addmultiple(params).then((res:any) => {
       this.load = false;
       if(res.code == 200){
+        this.isSuccess = true;
+        this.$message({
+          message:'订单:'+item.omsOrderIds+'发货成功!',
+          type:'success'
+        })
         this.currentOrder ++;
+        
         if(this.currentOrder < this.data.length){
-          let item:any = this.data[this.currentOrder];
-          if(this.currentPrice[item.omsOrderIds]){
-            this.sendGoods(item);
-          }else{
-            this.getStoreCount(item,this.getPriceInfo);
+          if(!isNext){
+            let item:any = this.data[this.currentOrder];
+            if(this.currentPrice[item.omsOrderIds]){
+              this.sendGoods(item);
+            }else{
+              this.getStoreCount(item,this.getPriceInfo);
+            }
           }
+          this.setInfo();
+        }else{
+          this.drawer=false;
         }
         this.$forceUpdate();
       }
     }).catch(() => {
-     
       this.load = false;
     })
   }
@@ -351,7 +398,7 @@ export default class BatchbyOneModal extends Vue {
   bottom: 0;
   z-index: 10;
   .d-left{
-    width: 70%;
+    width: 50%;
     .estimate-total{
       font-size: 14px;
       padding-bottom: 4px;
@@ -370,6 +417,7 @@ export default class BatchbyOneModal extends Vue {
     width: 120px;
     height: 40px;
     line-height: 40px;
+    margin-left: 16px;
     border-radius: 8px;
     background: linear-gradient(129.2deg, rgba(22,132,252,1) 9.81%,rgba(93,167,249,1) 97.4%);
     color: rgba(255, 255, 255, 100);
@@ -381,6 +429,12 @@ export default class BatchbyOneModal extends Vue {
   .stopBtn{
     opacity: 0.7;
   }
+  .btn-box{
+    width: 50%;
+    display: flex;
+    justify-content: flex-end;
+    align-items: center;
+  }
 }
 .space{
   height: 80px;

+ 32 - 4
src/views/oms/order/components/carpoolModal.vue

@@ -23,7 +23,8 @@
     <div class="deli-footer">
       <div class="d-left">
         <div class="estimate-total">
-          预计总价<span class="total">¥{{currentPrice.estimateFreight?currentPrice.estimateFreight:'0.00'}}</span> <span class="detail">明细></span>
+          预计总价<span class="total">¥{{currentPrice.estimateFreight?currentPrice.estimateFreight:'0.00'}}</span> 
+          <!-- <span class="detail">明细></span> -->
         </div>
         <div class="agreement">
           <el-checkbox v-model="checked">已读并同意《XXX电子运单协议》</el-checkbox>
@@ -55,6 +56,9 @@ export default class carpoolModal extends Vue {
   value:any={};
   setShow(v:boolean){
     this.drawer=v;
+    this.stopHandle = false;
+    this.priceData=[];
+    this.currentPrice={}
   }
   setValue(data:Array<any>){
     this.data =data;
@@ -77,7 +81,7 @@ export default class carpoolModal extends Vue {
             tmsGoodsModel:i.styleId,
             tmsGoodsCode:i.skuId,
             // omsOrderItemSkuId:i.itemId,
-            tmsQuantity:i.qty,
+            tmsQuantity:Number(i.qty)?Number(i.qty):0,
             tmsGoodsTotalPrice:total,
             name:i.name,
             price:i.price,
@@ -125,12 +129,17 @@ export default class carpoolModal extends Vue {
   }
   btn(){
     if(this.stopHandle){
+      this.$message('库存不足!')
       return
     }
     if(!this.checked){
       this.$message('请阅读并同意运单协议!')
       return
     }
+    if(!this.value.tmsShipmentAddress || !this.value.tmsShipmentConsignor){
+      this.$message("请编辑订单信息");
+      return
+    }
     let params:any=(this as any).$lodash.cloneDeep(this.value);
     if(this.priceData){
       try{
@@ -147,6 +156,14 @@ export default class carpoolModal extends Vue {
     this.load = true;
     addMultipleToOne(params).then((res:any) => {
       this.load = false;
+      if(res.code == 200){
+        this.$message({
+          message:'订单发货成功!',
+          type:'success'
+        })
+        this.$emit('handleSuccess');
+        this.drawer=false;
+      }
     }).catch(()=>{  
       this.load = false;
     })
@@ -158,7 +175,9 @@ export default class carpoolModal extends Vue {
     params.skuIds=[]
     if(item.subItem){
       for(const i of item.subItem){
-        params.skuIds.push(i.omsOrderItemId)
+        if(params.skuIds.indexOf(i.omsOrderItemId) == -1){
+          params.skuIds.push(i.omsOrderItemId)
+        }
       }
     }
     this.load = true;
@@ -167,8 +186,11 @@ export default class carpoolModal extends Vue {
       let m='';
       for(const i of item.subItem){
         for(const d of res.data){
-          if(i.omsOrderItemId == d.skuid && d.inventory <=0){
+          let s = Number(d.inventory) - Number(d.useInventory) - Number(i.tmsQuantity);
+          if(i.omsOrderItemId == d.skuid && s < 0){
             m = m ? m + ',' + i.name : i.name;          
+          }else{
+            d.inventory = subtract(d.inventory, i.tmsQuantity);
           }
         }
       }
@@ -227,9 +249,15 @@ export default class carpoolModal extends Vue {
         font-size: 14px;
         .receive-name{
           width: 150px;
+          overflow: hidden;
+          text-overflow: ellipsis;
+          white-space: nowrap;
         }
         .address{
           width: calc(100% - 150px);
+          overflow: hidden;
+          text-overflow: ellipsis;
+          white-space: nowrap;
           span{
             color: #F00;
           }

+ 33 - 32
src/views/oms/order/components/deliveryGoodsInfo.vue

@@ -10,12 +10,12 @@
           <span :title="value.omsOrderIds">{{ value.omsOrderIds }}</span>
         </div>
       </div>
-      <div class="info-row">
+      <!-- <div class="info-row">
         <div class="info-col col-width">
           <span class="label">订单类型:</span>
           <span :title="value.orderType">{{ value.orderType }}</span>
         </div>
-      </div>
+      </div> -->
       <div class="info-row">
         <div class="info-col col-width">
           <span class="label">业务员:</span>
@@ -177,9 +177,9 @@ export default class DeliveryGoodsInfo extends Vue {
       size:'small',
       labelWidth:'120px',
       rules:{
-        orderType:[{
-          required: true, message: '请选择订单类型!', trigger: 'change'
-        }],
+        // orderType:[{
+        //   required: true, message: '请选择订单类型!', trigger: 'change'
+        // }],
         tmsBusinessMan:[{
           required: true, message: '业务员不能为空!', trigger: 'blur'
         }],
@@ -224,32 +224,25 @@ export default class DeliveryGoodsInfo extends Vue {
       }
     },
     columns:[
-      [{
-        label:'订单类型',
-        prop:'orderType',
-        component:'by-select',
-        compConfig:{
-          attr:{
-            data: [{
-              label:'B2C',
-              value:'B2C'
-            },{
-              label:'B2B',
-              value:'B2B'
-            }],
-            clearable:true
-          }
-        }
-      },{
-        label:'运输方式',
-        prop:'tmsTransportMethod',
-        component:'by-input',
-        compConfig:{
-          attr:{
-            clearable:true
-          }
-        }
-      }],
+      // [
+      //   {
+      //   label:'订单类型',
+      //   prop:'orderType',
+      //   component:'by-select',
+      //   compConfig:{
+      //     attr:{
+      //       data: [{
+      //         label:'B2C',
+      //         value:'B2C'
+      //       },{
+      //         label:'B2B',
+      //         value:'B2B'
+      //       }],
+      //       clearable:true
+      //     }
+      //   }
+      // }
+      // ],
       [{
         label:'业务员',
         prop:'tmsBusinessMan',
@@ -396,7 +389,6 @@ export default class DeliveryGoodsInfo extends Vue {
       }],
       [{
         label:'仓库',
-        span:12,
         prop:'storeHouse',
         component:'warehouse',
         compConfig:{
@@ -405,6 +397,15 @@ export default class DeliveryGoodsInfo extends Vue {
             clearable:true
           }
         }
+      },{
+        label:'运输方式',
+        prop:'tmsTransportMethod',
+        component:'by-input',
+        compConfig:{
+          attr:{
+            clearable:true
+          }
+        }
       }]
     ]
   }

+ 63 - 13
src/views/oms/order/components/deliveryPrice.vue

@@ -2,20 +2,43 @@
   <div class="send-box">
     <div class="title-label">预计配送和预计费用</div>
     <div class="send-type">
-      <!-- <div class="send-item onSend">
-        <div class="label-name">整车配送</div>
-        <div class="send-info">
-          <div class="s-time">7月23 12:23前</div>
-          <div class="send-price">¥16.00起</div>
+      <el-popover
+        v-for="(item,index) of data" :key="index"
+        placement="top-start"
+        width="200"
+        trigger="hover">
+        <div class="price-info">
+          <div class="price-title">预估费用明细:</div>
+          <div class="price-row freight">
+            <span class="p-label">运费:</span>
+            <span class="p-value">¥{{item.estimateFreight}}</span>
+          </div>
+          <div class="price-row">
+            <span class="p-label">单价:</span>
+            <span class="p-value">¥{{item.unitprice}}</span>
+          </div>
+          <div class="price-row">
+            <span class="p-label">重量:</span>
+            <span class="p-value">{{item.weight}}</span>
+          </div>
+          <div class="price-row">
+            <span class="p-label">体积:</span>
+            <span class="p-value">{{item.volume}}</span>
+          </div>
+          <div class="price-row">
+            <span class="p-label">单位:</span>
+            <span class="p-value">{{item.unit}}</span>
+          </div>
         </div>
-      </div> -->
-      <div class="send-item" v-for="(item,index) of data" :key="index" :title="item.ruleName" :class="{'onSend':currentValue.id == item.id}" @click="priceHandle(index)" >
-        <div class="label-name">{{item.ruleName}}</div>
-        <div class="send-info">
-          <div class="s-time">{{item.endTime}}前</div>
-          <div class="send-price">¥{{item.estimateFreight}}</div>
+        <div slot="reference" class="send-item" :title="item.ruleName" :class="{'onSend':currentValue.id == item.id}" @click="priceHandle(index)" >
+          <div class="label-name">{{item.ruleName}}</div>
+          <div class="send-info">
+            <div class="s-time">{{item.endTime}}前</div>
+            <div class="send-price">¥{{item.estimateFreight}}</div>
+          </div>
         </div>
-      </div>
+      </el-popover>
+      
     </div>
   </div>
 </template>
@@ -45,6 +68,7 @@ export default class DeliveryPrice extends Vue {
   width: 100%;
   box-sizing: border-box;
   padding: 16px;
+  padding-bottom: 0;
   background-color: rgba(255, 226, 160, 0.3);
   .title-label{
     font-size: 14px;
@@ -54,14 +78,16 @@ export default class DeliveryPrice extends Vue {
     width: 100%;
     display: flex;
     align-items: center;
+    flex-wrap:wrap;
     .send-item{
-      width: 156px;
+      width: 165px;
       box-sizing: border-box;
       border:solid 3px #999;
       border-radius: 6px;
       overflow: hidden;
       margin-right: 32px;
       cursor: pointer;
+      margin-bottom: 16px;
       .label-name{
         background-color: #999;
         color: #FFF;
@@ -97,4 +123,28 @@ export default class DeliveryPrice extends Vue {
     }
   }
 }
+</style>
+
+<style lang="scss">
+.price-info{
+  width: 100%;
+  color: #000;
+  .price-title{
+    font-size: 16px;
+    font-weight: 700;
+    padding-bottom: 4px;
+  }
+  .price-row{
+    width: 100%;
+    display: flex;
+    font-size: 12px;
+    padding: 3px;
+    // display: flex;
+    // justify-content: space-between;
+  }
+  .freight{
+    font-size: 14px;
+    font-weight: 700;
+  }
+}
 </style>

+ 3 - 6
src/views/oms/order/index.vue

@@ -179,14 +179,12 @@
       <freight-modal ref="freightModal" @handleSuccess="handleSuccess" />
       <!-- 标签 -->
       <labels-modal ref="labelsModal" @onChange="onChangeLabel" />
-      <!-- 发货 -->
-      <delivery-modal ref="deliveryModal" />
       <!-- 发货模式 -->
       <send-mode-modal ref="sendModeModal" @modeChange="modeChange" />
       <!-- 批量逐一发货 -->
-      <batchbyOneModal ref="batchbyOneModal" />
+      <batchbyOneModal ref="batchbyOneModal" @handleSuccess="handleSuccess" />
       <!-- 整车/拼单发货 -->
-      <carpoolModal ref="carpoolModal" />
+      <carpoolModal ref="carpoolModal" @handleSuccess="handleSuccess" />
 
     </div>
   </div>
@@ -216,7 +214,6 @@ import TabModal from "./components/tabModal.vue";
 import AddProductModal from "./components/addProductModal.vue";
 import FreightModal from "./components/freightModal.vue";
 import LabelsModal from "./components/labelsModal.vue";
-import DeliveryModal from "./components/deliveryModal.vue";
 import SendModeModal from "./components/sendModeModal.vue";
 import batchbyOneModal from './components/batchbyOneModal.vue'
 import carpoolModal from './components/carpoolModal.vue'
@@ -224,7 +221,7 @@ import { query,getProvince,smt,unSmt,purchaseQty,unCancel,resetQuestion,archive
 import { queryAll } from '@/api/question'
 @Component({components:{filterInput,OrderCheckbox,OrderRadio,filterDate,OrderTool,OrderTable,AddOrder,InputSelect,OrderProduct,
   filterMinMax,loadOrderModal,PurchaseModel,MergeModel,SplitModel,CancelOrderModel,QuestModel,SetQuesModal,UpdateRmkModal,UpdateSalerModal,
-  TabModal,AddProductModal,FreightModal,LabelsModal,DeliveryModal,SendModeModal,batchbyOneModal,carpoolModal}})
+  TabModal,AddProductModal,FreightModal,LabelsModal,SendModeModal,batchbyOneModal,carpoolModal}})
 export default class Order extends Vue {
   activeNames:Array<any>=['1','statusList']
   radio=''