ymy 1 سال پیش
والد
کامیت
0fa0a5c94f

+ 424 - 0
src/views/audit/store/components/batchbyOneModal.vue

@@ -0,0 +1,424 @@
+<template>
+  <el-drawer
+    v-loading="load"
+    title="短驳生成单"
+    :visible.sync="drawer"
+    @close="close"
+    :direction="direction"
+    size="50%">
+    <div class="content">
+      <div class="order-top" v-if="data.length > 1">
+        <el-pagination
+          background
+          :page-size="1"
+          :current-page="currentOrder + 1"
+          layout="prev, pager, next"
+          @current-change="currentChange"
+          :total="data.length">
+        </el-pagination>
+      </div>
+      <deliveryGoodsInfo :hideOrderCode="true" @editState="editState" @editResult="editResult" ref="info" />
+      <deliveryPrice :data="priceObj[data[currentOrder].omsOrderIds]" ref="price" v-if="data[currentOrder] && priceObj[data[currentOrder].omsOrderIds]" 
+      @prichChange="prichChange" :currentValue="currentPrice[data[currentOrder].omsOrderIds]" />
+    </div>
+    <div class="space"></div>
+    <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> 
+        </div>
+        <!-- <div class="agreement">
+          <el-checkbox v-model="checked">已读并同意《XXX电子运单协议》</el-checkbox>
+        </div> -->
+      </div>
+      <div class="btn-box">
+        <div class="send-btn" @click="btn">提交</div>
+      </div>
+      
+    </div>
+  </el-drawer>
+</template>
+
+<script lang="ts">
+import { Component, Prop, Vue, Watch } from "vue-property-decorator";
+import DeliveryGoodsInfo from "./deliveryGoodsInfo.vue";
+import DeliveryPrice from "./deliveryPrice.vue";
+import { add,multiply,subtract,divide } from '@/benyun/utils/accuracy'
+import { queryPricePackage,insertShortBarge,getInventoryByStoreHouseIdAndSkuids } from  '@/api/delivery'
+import Format from '@/benyun/utils/dateFormat'
+
+@Component({components:{DeliveryGoodsInfo,DeliveryPrice}})
+export default class BatchbyOneModal extends Vue {
+  drawer=false;
+  direction='rtl'
+  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;
+    this.stopHandle = false;
+    this.currentOrder = 0;
+    this.checked = false;
+  }
+  close(){
+    if(this.isSuccess){
+      this.$emit('handleSuccess');
+    }
+  }
+  editResult(v:any){
+    this.data[this.currentOrder] = v;
+    this.getStoreCount(v);
+    this.getPriceInfo(v);
+  }
+  prichChange(index:number){
+    this.currentPrice[this.data[this.currentOrder].omsOrderIds] = this.priceObj[this.data[this.currentOrder].omsOrderIds][index];
+    this.$forceUpdate();
+  }
+  currentChange(v:number){
+    this.currentOrder = v-1;
+    this.$forceUpdate();
+    this.$nextTick(()=>{
+      this.setInfo();
+    })
+  }
+  setInfo(){
+    (this.$refs.info as any).setValue(this.data[this.currentOrder]);
+  }
+  setValue(data:Array<any>){
+    this.data = [];
+    const requestId =  new Date().getTime() + this.getUuid()
+    let obj:any={
+      requestId:requestId
+    };
+    obj.subItem=[];
+    for(const item of data){
+      obj.subItem.push({
+        requestId:requestId,
+        omsOrderItemId: item.id,
+        tmsGoodsModel:item.itemNumber,
+        tmsGoodsCode:item.skuCode,
+        tmsQuantity:1,
+        tmsGoodsTotalPrice:item.price,
+        name:item.skuTitle,
+        price:item.price,
+        weight:item.weight
+      })
+    }
+   
+    this.data.push(obj)
+
+    
+    this.$nextTick(()=>{
+      (this.$refs.info as any).setValue(this.data[this.currentOrder])
+    })
+  }
+  getUuid(){
+    return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
+  }
+  btn(){
+    // this.noSentOrder();
+    if(!this.data[this.currentOrder]){
+      this.$message('没有需要发货的订单!')
+      return
+    }
+    if(this.stopHandle){
+      this.$message('库存不足!')
+      return
+    }
+    // if(!this.checked){
+    //   this.$message('请阅读并同意运单协议!')
+    //   return
+    // }
+    if(!this.data[this.currentOrder].tmsShipmentAddress || !this.data[this.currentOrder].tmsShipmentConsignor || !this.data[this.currentOrder].tmsUnloadingAddress || !this.data[this.currentOrder].tmsUnloadingConsignor){
+      this.$message("请编辑订单信息");
+      return
+    }
+    if(!this.currentPrice[this.data[this.currentOrder].omsOrderIds]){
+      this.$message("请选择价格!");
+      return
+    }
+    this.sendGoods(this.data[0]);
+  }
+  nextBtn(){
+    if(this.stopHandle){
+      this.$message('库存不足!')
+      return
+    }
+    // if(!this.checked){
+    //   this.$message('请阅读并同意运单协议!')
+    //   return
+    // }
+    const _value = this.data[this.currentOrder];
+    if(!_value.tmsShipmentAddress || !_value.tmsShipmentConsignor || !_value.tmsUnloadingAddress || !_value.tmsUnloadingConsignor){
+      this.$message("请编辑订单信息");
+      return
+    }
+    if(!this.currentPrice[_value.omsOrderIds]){
+      this.$message('请选择价格!')
+      return
+    }
+    if(_value.isSuccess){
+      this.$message('订单:'+_value.omsOrderIds+'已执行过发货操作!');
+      return
+    }
+    this.sendGoods(_value,true);
+  }
+  //查库存
+  getStoreCount(item:any,callback?:Function){
+    if(!item){
+      return
+    }
+    let params:any={};
+    params.storeHouseId = item.storeHouseId;
+    params.skuIds=[];
+    if(item.subItem){
+      for(const i of item.subItem){
+        if(params.skuIds.indexOf(i.omsOrderItemId) == -1){
+          params.skuIds.push(i.omsOrderItemId);
+        }
+      }
+    }
+    this.load = true;
+    getInventoryByStoreHouseIdAndSkuids(params).then((res:any) => {
+      this.load = false;
+      let m='';
+      for(const i of item.subItem){
+        for(const d of res.data){
+          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);
+          }
+        }
+      }
+      if(m){
+        this.$message({
+          message:'商品“'+m+'”库存不足!',
+          type:'error'
+        })
+        this.stopHandle = true;
+        return
+      }
+      if(callback) callback(item,this.sendGoods)
+    }).catch(()=>{
+      this.load = false;
+    })
+  }
+  //发货
+  sendGoods(item:any,isNext?:boolean){
+    if(!item){
+      this.$message('信息不存在!')
+      return
+    }
+    
+    let params:any=(this as any).$lodash.cloneDeep(item);
+    if(this.priceObj[item.omsOrderIds]){
+      try{
+        params.pricePlan = JSON.stringify(this.priceObj[item.omsOrderIds])
+      }catch(e){}
+    }
+    if(this.currentPrice[item.omsOrderIds]){
+      params.priceId = this.currentPrice[item.omsOrderIds].id;
+    }
+    // params.omsOrderIds = [item.omsOrderIds];
+    params.tmsMaterials=[];
+    if(item.subItem){
+      let skuIds:Array<any>=[];
+      for(const i of item.subItem){
+        if(skuIds.indexOf(item.omsOrderItemId) == -1){
+          skuIds.push(item.omsOrderItemId);
+          params.tmsMaterials.push({
+            qty:item.tmsQuantity,
+            storeHouseId:item.storeHouseId,
+            materialSkuId:i.omsOrderItemId
+          })
+        }
+        
+      }
+    }
+    delete params.subItem;
+    // console.log(params)
+    this.load = true;
+    insertShortBarge(params).then((res:any) => {
+      this.load = false;
+      if(res.code == 200){
+        this.isSuccess = true;
+        this.$message({
+          message:'操作成功!',
+          type:'success'
+        })
+        this.drawer = false;
+        
+        this.$forceUpdate();
+      }
+    }).catch(() => {
+      this.load = false;
+    })
+  }
+  //寻找未发货订单
+  noSentOrder(){
+    this.currentOrder = this.data.length;
+    for(let i = 0; i < this.data.length; i++){
+      if(!this.data[i].isSuccess){
+        this.currentOrder = i;
+        break
+      }
+    }
+    // if(this.data[this.currentOrder]){
+      this.setInfo();
+    // } 
+  }
+  setOnEditOrderInfo(ids:string){
+    let _value = this.data[0]
+    for(const item of this.data){
+      if(ids.indexOf(item.omsOrderIds) > -1 && !item.isSuccess){
+        item.orderType = _value.orderType;
+        item.storeHouseId = _value.storeHouseId;
+        item.tmsArrivalDate = _value.tmsArrivalDate;
+        item.tmsDeliveryDate =_value.tmsDeliveryDate;
+        item.tmsTransportMethod = _value.tmsTransportMethod;
+        item.tmsBusinessMan = _value.tmsBusinessMan;
+        item.tmsBusinessPhone = _value.tmsBusinessPhone;
+        item.tmsShipmentConsignor = _value.tmsShipmentConsignor;
+        item.tmsShipmentContacts = _value.tmsShipmentContacts;
+        item.tmsShipmentProvince = _value.tmsShipmentProvince;
+        item.tmsShipmentProvinceNo = _value.tmsShipmentProvinceNo;
+        item.tmsShipmentCity = _value.tmsShipmentCity;
+        item.tmsShipmentCityNo = _value.tmsShipmentCityNo;
+        item.tmsShipmentRegion = _value.tmsShipmentRegion;
+        item.tmsShipmentRegionNo = _value.tmsShipmentRegionNo;
+        item.tmsShipmentStreetNo = _value.tmsShipmentStreetNo;
+        item.tmsShipmentStreet = _value.tmsShipmentStreet;
+        item.tmsShipmentAddress = _value.tmsShipmentAddress;
+        item.tmsUnloadingConsignor = _value.tmsUnloadingConsignor;
+        item.tmsUnloadingContacts = _value.tmsUnloadingContacts;
+        item.tmsUnloadingProvince = _value.tmsUnloadingProvince;
+        item.tmsUnloadingProvinceNo = _value.tmsUnloadingProvinceNo;
+        item.tmsUnloadingCity = _value.tmsUnloadingCity;
+        item.tmsUnloadingCityNo = _value.tmsUnloadingCityNo;
+        item.tmsUnloadingRegion = _value.tmsUnloadingRegion;
+        item.tmsUnloadingRegionNo = _value.tmsUnloadingRegionNo;
+        item.tmsUnloadingStreetNo = _value.tmsUnloadingStreetNo;
+        item.tmsUnloadingStreet = _value.tmsUnloadingStreet;
+        item.tmsUnloadingAddress = _value.tmsUnloadingAddress;
+      }
+    }
+  }
+  //获取价格
+  getPriceInfo(data:any,callback?:Function){
+    let params:any={};
+    params.startAddressCode = data.tmsShipmentCityNo + '000';
+    params.endAddressCode = data.tmsUnloadingCityNo + '000';
+    params.omsIds=[this.data[0].omsOrderIds];
+    params.planType = data.tmsTransportMethod;
+    this.load = true;
+    queryPricePackage(params).then((res:any) => {
+      // if(this.currentPrice && this.currentPrice[data.omsOrderIds]){
+      //   delete this.currentPrice[data.omsOrderIds]
+      // }
+      
+      this.load=false;
+      let current=null;
+      for(let item of res.data[0].data){
+        let d = new Date().getTime() + item.duration*60*60*1000;
+        item.endTime=Format(new Date(d),'MM月dd日 HH:mm');
+        if(!current) current = item;
+        if(Number(current.estimateFreight) > Number(item.estimateFreight)){
+          current = item
+        }
+      }
+      this.priceObj[data.omsOrderIds] = res.data[0].data;
+      this.currentPrice[data.omsOrderIds] = current;
+      this.$forceUpdate();
+      if(callback){
+        callback(data)
+      }
+    }).catch((err:any)=>{
+      this.load = false;
+    })
+  }
+  editState(v:boolean){
+    this.drawer = v
+  }
+}
+</script>
+<style lang="scss" scoped>
+.content{
+  width: 100%;
+  box-sizing: border-box;
+  padding: 0 16px;
+  background-color: #FFF;
+  .order-top{
+    padding-bottom: 16px;
+    display: flex;
+    justify-content: center;
+  }
+}
+.deli-footer{
+  height: 80px;
+  width: 100%;
+  box-shadow: 0 -5px 10px #EEE;
+  padding: 0 16px 8px;
+  box-sizing: border-box;
+  display: flex;
+  justify-content: space-between;
+  align-items:flex-end;
+  position: absolute;
+  background-color: #FFF;
+  left: 0;
+  bottom: 0;
+  z-index: 10;
+  .d-left{
+    width: 50%;
+    .estimate-total{
+      font-size: 14px;
+      padding-bottom: 4px;
+      .total{
+        font-size: 16px;
+        color: #F00;
+      }
+      .detail{
+        color: #1684FC;
+        padding-left: 16px;
+        cursor: pointer;
+      }
+    }
+  }
+  .send-btn{
+    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);
+    font-size: 14px;
+    text-align: center;
+    box-shadow: 0px 2px 6px 0px rgba(93, 167, 249, 100);
+    cursor: pointer;
+  }
+  .stopBtn{
+    opacity: 0.7;
+  }
+  .btn-box{
+    width: 50%;
+    display: flex;
+    justify-content: flex-end;
+    align-items: center;
+  }
+}
+.space{
+  height: 80px;
+  width: 100%;
+  margin-top: 16px;
+}
+</style>

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 459 - 0
src/views/audit/store/components/deliveryGoodsInfo.vue


+ 150 - 0
src/views/audit/store/components/deliveryPrice.vue

@@ -0,0 +1,150 @@
+<template>
+  <div class="send-box">
+    <div class="title-label">预计配送和预计费用</div>
+    <div class="send-type">
+      <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 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>
+      </el-popover>
+      
+    </div>
+  </div>
+</template>
+<script lang="ts">
+import { Component, Prop, Vue, Watch } from "vue-property-decorator";
+@Component({components:{}})
+export default class DeliveryPrice extends Vue {
+  @Prop()
+  data?:Array<any>;
+
+  @Prop()
+  currentValue?:any;
+
+  onIndex:any=null;
+  mounted(){
+   
+  }
+  priceHandle(index:number){
+    // this.onIndex = item.id;
+    this.$emit('prichChange',index)
+  }
+
+}
+</script>
+<style lang="scss" scoped>
+.send-box{
+  width: 100%;
+  box-sizing: border-box;
+  padding: 16px;
+  padding-bottom: 0;
+  background-color: rgba(255, 226, 160, 0.3);
+  .title-label{
+    font-size: 14px;
+    padding-bottom: 8px;
+  }
+  .send-type{
+    width: 100%;
+    display: flex;
+    align-items: center;
+    flex-wrap:wrap;
+    .send-item{
+      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;
+        font-size: 16px;
+        font-weight: 700;
+        padding: 2px 0 4px;
+        text-align: center;
+        width: 100%;
+        overflow: hidden;
+        text-overflow: ellipsis;
+        white-space: nowrap;
+      }
+      .send-info{
+        padding: 8px 0;
+        text-align: center;
+        background-color: #FFF;
+        .s-time{
+          font-size: 14px;
+          color: #1684FC;
+          font-weight: 700;
+        }
+        .send-price{
+          font-size: 20px;
+          padding-top: 4px;
+        }
+      }
+    }
+    .send-item:hover,.onSend{
+      border:solid 3px #1684FC;
+      .label-name{
+        background-color: #1684FC;
+      }
+    }
+  }
+}
+</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>

+ 26 - 3
src/views/audit/store/index.vue

@@ -5,12 +5,14 @@
 				@detail="shortBarge" @onRefresh="onRefresh">
 			</module-view>
 		</div>
+		<batchbyOneModal ref="batchbyOneModal" />
 	</div>
 </template>
 <script lang="ts">
 	import { Component, Prop, Vue, Watch } from "vue-property-decorator";
 	import api from "@/api/currency";
-	@Component
+	import batchbyOneModal from './components/batchbyOneModal.vue'
+	@Component({components:{batchbyOneModal}})
 	export default class Store extends Vue {
 		timeNum = 0;
 		skuInfo : any = ''
@@ -60,13 +62,22 @@
 				tools: {
 					refresh: true,
 					search: true,
-				}
+				},
+				customTools:[{
+					name:'短驳',
+					icon:'el-icon-discount',
+					event:{
+						click: () => {
+							this.shortBargeHandel()
+						}
+					}
+				}]
 			},
 			table: {
 				attr: {
 					size: 'mini',
 					align: 'left',
-					// checkbox: true,
+					checkbox: true,
 				},
 				columns: [
 					{
@@ -95,6 +106,18 @@
 				this.getDataList()
 			}, 300)
 		}
+		//短驳处理
+		shortBargeHandel(){
+			let data = (this.$refs.moduleView as any).getSelectData();
+			if(!data || data.length == 0) {
+				this.$message('请选择数据');
+				return
+			}
+			if(this.$refs.batchbyOneModal){
+				(this.$refs.batchbyOneModal as any).setShow(true);
+				(this.$refs.batchbyOneModal as any).setValue(data)
+			}
+		}
 		// 获取列表数据
 		getDataList() {
 			if (!this.$refs.moduleView) {

برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است