ymy il y a 2 ans
Parent
commit
677866a0c7

+ 18 - 10
src/api/omsOrder.ts

@@ -1,5 +1,6 @@
 import request from '@/benyun/utils/request'
 
+//查询数据
 export function query(params:any,data?:any) {
 	return request({
 		url: '/omsOrder/omsOrder/query',
@@ -8,7 +9,7 @@ export function query(params:any,data?:any) {
 		data: data
 	})
 }
-
+//获取地址
 export function getProvince(data:any){
 	return request({
 		url:'/omsOrder/omsArea/getByParentCode',
@@ -16,7 +17,7 @@ export function getProvince(data:any){
 		params:data
 	})
 }
-
+//手工添加订单
 export function addOrder(data:any){
 	return request({
 		url: '/omsOrder/omsOrder/manual',
@@ -24,7 +25,7 @@ export function addOrder(data:any){
 		data: data
 	})
 }
-
+//保存订单基本信息
 export function saveBaseOrder(data:any){
 	return request({
 		url: '/omsOrder/omsOrder/updateInfo',
@@ -32,7 +33,7 @@ export function saveBaseOrder(data:any){
 		data: data
 	})
 }
-
+//提交
 export function smt(data:any){
 	return request({
 		url: '/omsOrder/omsOrder/submit',
@@ -40,7 +41,7 @@ export function smt(data:any){
 		params: data
 	})
 }
-
+//反提交
 export function unSmt(data:any){
 	return request({
 		url: '/omsOrder/omsOrder/unSubmit',
@@ -48,7 +49,7 @@ export function unSmt(data:any){
 		params: data
 	})
 }
-
+//获取单条订单
 export function getSingleData(params:any){
 	return request({
     url: '/omsOrder/omsOrder/single/',
@@ -56,7 +57,7 @@ export function getSingleData(params:any){
     method: 'GET'
   })
 }
-
+//下载订单
 export function pullOrder(data:any){
 	return request({
 		url: '/omsOrder/omsOrder/pullOrder',
@@ -64,8 +65,7 @@ export function pullOrder(data:any){
 		data: data
 	})
 }
-
-
+//生成采购单之前获取可采购数量
 export function purchaseQty(params:any){
 	return request({
 		url:'/omsOrder/omsOrder/purchaseQty',
@@ -73,11 +73,19 @@ export function purchaseQty(params:any){
 		params:params
 	})
 }
-
+//生成采购单
 export function toPurchaseOrder(data:any){
 	return request({
 		url:'/omsOrder/omsOrder/toPurchaseOrder',
 		method:'POST',
 		data:data
 	})
+}
+//合并订单
+export function merge(params:any){
+	return request({
+		url:'/omsOrder/omsOrder/merge',
+		method:'POST',
+		params:params
+	})
 }

+ 14 - 3
src/benyun/components/byForm/byForm.vue

@@ -3,8 +3,8 @@
     <el-descriptions v-if="attrs.showType=='desc'" :title="attrs.title" :column="attrs.itemCount" :border="attrs.border" :direction="attrs.direction" 
     :size="attrs.size?attrs.size:'medium'" :colon="attrs.colon">
       <template v-for="(itemChild,index) of columns">
-        <el-descriptions-item :label="item.label"  v-for="(item,_ind) of itemChild" :span="item.colspan" :key="index+'-'+_ind">
-          <slot v-if="item.descSlot" :name='item.prop' :value='value'></slot>
+        <el-descriptions-item :label="item.label" v-for="(item,_ind) of itemChild" :span="item.colspan" :key="index+'-'+_ind">
+          <slot v-if="item.descSlot" :name='item.prop+"_desc"' :value='value'></slot>
           <template v-else>{{value[item.prop]?value[item.prop]:'--'}}</template>
         </el-descriptions-item>
       </template>
@@ -58,6 +58,12 @@
   基础配置
   config:{
     attr:{
+      showType: ''  //展示形式
+      title:''  //标题(desc的时候用)
+      itemCount:''  //每行展示几列(desc的时候用)
+      border:true/false  //是否有边框(desc的时候用)
+      direction: vertical / horizontal  排列的方向(desc的时候用)
+      colon:true/false  //是否显示冒号 (desc的时候用)
       disabled:true/false //表单禁用
       readonly:true/false //表单只读
       size:medium / small / mini, //表单域下组件的尺寸,
@@ -75,6 +81,9 @@
         size:medium / small / mini  //表单域下组件的尺寸,
         component:''   //组件
         compConfig:{}  //组件配置
+        slot:true/false  //插槽
+        colspan:‘’  //在itemCount的基础上 列的数量(desc的时候用)
+        descSlot:true/false  //插槽(desc的时候用)
     }]]
     request:{
       url:'',
@@ -242,7 +251,9 @@ export default class ByForm extends VueViews {
   }
   //清除过滤提示
   clearValidate(){
-    (this.$refs.byForm as any).clearValidate();
+    if(this.$refs.byForm){
+      (this.$refs.byForm as any).clearValidate();
+    }
   }
 }
 </script>

+ 4 - 1
src/benyun/components/byTable/byTable.vue

@@ -13,6 +13,7 @@
       :tree-config="{transform: attrs.transform, rowField: attrs.rowField, parentField: attrs.parentField}"
       :row-config="{isHover: true}"
       :tooltip-config="{showAll: true}"
+      :checkbox-config="{ checkMethod: attrs.checkMethod, visibleMethod: attrs.visibleMethod}">
       style="width: 100%">
       <vxe-column v-if="attrs.checkbox" type="checkbox" width="50" fixed="left" />
       <vxe-column v-if="attrs.radio" type="radio" width="50" fixed="left" />
@@ -61,7 +62,7 @@
             
           </template>
         </vxe-column>
-    </template>
+      </template>
     </vxe-table>
     <div class="page" v-if="page.total > 0">
       <el-pagination
@@ -97,6 +98,8 @@
       pageSize:''  //分页条数
       pageSizes:[]  //每页显示个数选择器的选项设置
       layoutPage:''  //分页组件布局
+      checkMethod:()=>{}  //禁用复选框方法
+      visibleMethod:()=>{} //显示复选框方法
     },
     columns:[{
       ellipsis:true/false //超出省略号表示

+ 5 - 4
src/views/oms/order/components/addOrder.vue

@@ -18,7 +18,7 @@
       <el-collapse v-model="activeNames">
         <el-collapse-item title="基本信息" name="1" class="add-order-item">
           <by-form :propConfig="baseConfig" ref="baseform" @formChange="formChangeBase">
-            <template v-slot:sourceFrom='{ value }'>
+            <template v-slot:sourceFrom_desc='{ value }'>
               <span v-if="value.sourceFrom == 'ERP'">手工下单</span>
               <span v-if="value.sourceFrom == 'COPY'">复制</span>
               <span v-if="value.sourceFrom == 'MERGE'">合并</span>
@@ -36,7 +36,7 @@
         </el-collapse-item>
         <el-collapse-item title="买家信息" name="2" class="add-order-item">
           <by-form :propConfig="buyerInfoConfig" ref="infoform">
-            <template v-slot:receiverDistrictCode='{ value }'>
+            <template v-slot:receiverDistrictCode_desc='{ value }'>
               {{ value.receiverProvince + '-' + value.receiverCity + '-' + value.receiverDistrict + (value.receiverTown?'-'+value.receiverTown:'') }}
             </template>
           </by-form>
@@ -171,7 +171,7 @@ export default class AddOrder extends Vue {
   productTotal:any=0;
   userInfo:any='';//用户信息
   orderValue:any={}; //新增订单值
-  radioPay=0;
+  radioPay=1;
   stepActive:number=0;
   stepCon=['WaitPay','WaitConfirm','WaitFConfirm','WaitOuterSent','Sent']
   activeNames:Array<any> =['1','2','3','4','5','save'];
@@ -526,6 +526,7 @@ export default class AddOrder extends Vue {
   invoicesConfig:any={
     attr:{
       size:'mini',
+      itemCount:4,
     },
     columns:[
       [{
@@ -1107,7 +1108,7 @@ export default class AddOrder extends Vue {
 
     this.num = 0;
     this.productTotal = 0;
-    this.radioPay = 0;
+    this.radioPay = 1;
     this.freeAmount = '';
   }
   getOrderValue(n?:string){

+ 12 - 4
src/views/oms/order/components/loadOrderModal.vue

@@ -230,11 +230,19 @@ export default class LoadOrderModal extends Vue {
     this.load = true;
     pullOrder(value).then((res:any) => {
       this.load = false;
-      (this as any).$message({
-        message: '操作成功!',
-        type: 'success',
-      });
       this.value = false;
+      if(res.data && res.data.length > 0){
+        (this as any).$message({
+          message: '成功更新' + res.data + '条数据!',
+          type: 'success',
+        });
+        this.$emit('handleSuccess');
+      }else{
+        (this as any).$message({
+          message: '未更新数据!',
+          type: 'warning',
+        });
+      }
       this.$emit('handleSuccess');
     }).catch((err:any) => {
       this.load = false;

+ 171 - 0
src/views/oms/order/components/mergeMedal.vue

@@ -0,0 +1,171 @@
+<template>
+  <vxe-modal v-model="value" id="mergeModel" title="合并订单" @show="show" width="70%" height="80%" min-width="460" min-height="320" 
+    show-zoom resize transfer show-footer @hide="hide" v-loading="load">
+    <by-table :propConfig="config" ref="table">
+      <template v-slot:sourceId="{row}">
+        <span>{{ row.sourceId }}</span>
+        <div class="tag-main" v-if="row.isMain == 1">
+          <el-tag size="mini">主</el-tag>
+        </div>
+      </template>
+      <template v-slot:shopName="{row}">
+        <div style="color:#1890ff">{{ row.shopName }}</div>
+        <div>{{ row.buyerId }}</div>
+      </template>
+      <template v-slot:address="{row}">
+        <div class="addr">{{ row.receiverProvince + '-' + row.receiverCity + '-' + row.receiverDistrict + (row.receiverTown?'-'+row.receiverTown:'') }}</div>
+        <div>{{ row.receiverAddress }}</div>
+      </template>
+      <template v-slot:pay="{row}">
+        <div><el-tag type="success">已付款</el-tag></div>
+        <div>{{ row.payDate}}</div>
+      </template>
+      <template v-slot:product="{row}">
+        <el-badge :value="item.qty" class="item-pro" type="primary" :max="99" v-for="(item,index) of row.items" :key="index">
+          <el-image  style="width: 28px; height: 28px">
+            <div slot="error" class="image-slot">
+              <i class="el-icon-picture-outline"></i>
+            </div>
+          </el-image>
+        </el-badge>
+      </template>
+      <template v-slot:status="{row}">
+        <span v-if="row.status == 'WaitPay'">待付款</span>
+        <span v-if="row.status == 'Delivering'">发货中</span>
+        <span v-if="row.status == 'Merged'">被合并</span>
+        <span v-if="row.status == 'Question'" style="color:red">异常</span>
+        <span v-if="row.status == 'Split'">被拆分</span>
+        <span v-if="row.status == 'WaitOuterSent'">等供销商|外仓发货</span>
+        <span v-if="row.status == 'WaitConfirm'">已付款待审核</span>
+        <span v-if="row.status == 'WaitFConfirm'">已客审待财审</span>
+        <span v-if="row.status == 'Sent'">已发货</span>
+        <span v-if="row.status == 'Cancelled'">取消</span>
+      </template>
+      <template v-slot:msg="{row}">
+        <div class="buyer-msg">{{ row.buyerMessage }}</div>
+        <div>{{ row.remark }}</div>
+      </template>
+    </by-table>
+    <template #footer>
+      <div class="btn">
+        <el-button type="primary" size="small" @click="btn">确定</el-button>
+      </div>
+    </template>
+  </vxe-modal>
+</template>
+
+<script lang="ts">
+import { Component, Prop, Vue, Watch } from "vue-property-decorator";
+import { merge } from '@/api/omsOrder'
+@Component({components:{}})
+export default class MergeModel extends Vue {
+  value = false;
+  load = false;
+  config={
+    attr:{
+      size:'small',
+      checkbox:true,
+      seq:true,
+      visibleMethod:({row}:any) =>{
+        return row.isMain != 1
+      }
+    },
+    columns:[{
+      title:'订单号',
+      field:'sourceId',
+      fixed:'left',
+      slot:true,
+      width:140
+    },{
+      title:'店铺+买家',
+      field:'shopName',
+      slot:true,
+      width:150
+    },{
+      title:'收货人',
+      field:'receiverName',
+      width:120
+    },{
+      title:'买家地址',
+      field:'address',
+      width:200,
+      slot:true
+    },{
+      title:'付款方式+时间',
+      field:'pay',
+      slot:true,
+      width:150
+    },{
+      title:'商品',
+      field:'product',
+      slot:true,
+      width:150
+    },{
+      title:'状态',
+      field:'status',
+      slot:true,
+      width:120
+    },{
+      title:'重量',
+      field:'freight',
+      width:80
+    },{
+      title:'买家留言+卖家备注',
+      field:'msg',
+      width:160
+    }]
+  }
+  show(){}
+  hide(){}
+  setShow(v:boolean){
+    this.value = v
+  }
+  setData(data:Array<any>){
+    this.$nextTick(()=>{
+      if(this.$refs.table){
+        (this.$refs.table as any).setValue(data);
+      }
+    })
+  }
+  btn(){
+    let va = (this.$refs.table as any).getValue();
+    let data = (this.$refs.table as any).getSelectData();
+    if(data.length == 0){
+      this.$message('请选择需要合并的数据!')
+      return
+    }
+    let params:any={};
+    params.idList=[]
+    for(const item of va){
+      if(item.isMain == 1){
+        params.id = item.id;
+        break;
+      }
+    }
+    for(const item of data){
+      params.idList.push(item.id);
+    }
+    this.load = true;
+    merge(params).then((res:any)=>{
+      this.load = false;
+      this.$message({
+        message:'数据合并成功!',
+        type:'success'
+      })
+    }).catch((err:any) => {
+      this.load = false;
+    })
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.tag-main{
+  width: 100%;
+  display: flex;
+  // justify-content: flex-end;
+}
+.buyer-msg,.addr{
+  color: dodgerblue;
+}
+</style>

+ 54 - 0
src/views/oms/order/components/orderTable.vue

@@ -2,6 +2,7 @@
   <vxe-table
     size="mini"
     border
+    stripe
     ref="table"
     :height="height"
     :row-config="{isCurrent: true,isHover: true}"
@@ -27,6 +28,17 @@
 
       </template>
     </vxe-column>
+    <vxe-column field="product" title="商品" width="140">
+      <template #default="{ row }">
+        <el-badge :value="item.qty" class="item-pro" type="primary" :max="99" v-for="(item,index) of row.items" :key="index">
+          <el-image  style="width: 28px; height: 28px">
+            <div slot="error" class="image-slot">
+              <i class="el-icon-picture-outline"></i>
+            </div>
+          </el-image>
+        </el-badge>
+      </template>
+    </vxe-column>
     <vxe-column field="type" title="订单类型" width="120">
       <template #default="{ row }">
         <span v-if="row.type == 'Common'">普通订单</span>
@@ -118,6 +130,11 @@
     </vxe-column>
     <vxe-column field="remark" title="订单备注" width="120"></vxe-column>
     <vxe-column field="note" title="线下备注" width="120"></vxe-column>
+    <vxe-column title="操作" width="120" fixed="right">
+      <template #default="{ row }">
+        <el-button type="text" v-if="showMerge(row)" @click="mergeHandle(row)">合并</el-button>
+      </template>
+    </vxe-column>
   </vxe-table>
 </template>
 
@@ -129,6 +146,17 @@ export default class OrderTable extends Vue {
   @Prop()
   data!:Array<any>
   height=null
+  
+  //合并按钮是否显示
+  showMerge(item:any){
+    let r = false;
+    if(item.isSubmitted == 1 && item.pays && item.pays.length > 0){
+      if(item.status == 'WaitConfirm' || item.status == 'Question'){
+        r = true;
+      }
+    }
+    return r;
+  }
 
   formatDate(v:string){
     return Format(v,'yyyy-MM-dd');
@@ -146,6 +174,21 @@ export default class OrderTable extends Vue {
     let data = (this as any).$lodash.cloneDeep((this.$refs.table as any).getCheckboxRecords());
     return data;
   }
+  mergeHandle(row:any){
+    let v = (this as any).$lodash.cloneDeep(row);
+    v.isMain = 1;
+    let data:Array<any> = [];
+    data.push(v);
+    for(const item of this.data){
+      if(row.id != item.id && item.isSubmitted == 1 && row.shopId == item.shopId && row.shopName == item.shopName && row.buyerId == item.buyerId && 
+      row.receiverMobile == item.receiverMobile && row.receiverProvince == item.receiverProvince && row.receiverCity == item.receiverCity 
+      && row.receiverDistrict == item.receiverDistrict && row.receiverTown == item.receiverTown && row.receiverAddress == item.receiverAddress 
+      && item.pays && item.pays.length > 0){
+        data.push(item);
+      }
+    }
+    this.$emit('mergeHandle',data);
+  }
 }
 </script>
 
@@ -196,4 +239,15 @@ export default class OrderTable extends Vue {
     visibility:visible !important;
   }
 }
+.image-slot{
+  .el-icon-picture-outline{
+    font-size: 28px;
+    color: #999;
+  }
+}
+.item-pro{
+  .el-badge__content{
+    z-index: 10;
+  }
+}
 </style>

+ 2 - 2
src/views/oms/order/components/orderTool.vue

@@ -34,8 +34,8 @@
         <el-dropdown-item>改标签</el-dropdown-item>
         <el-dropdown-item>改备注</el-dropdown-item>
         <el-dropdown-item>设定业务员</el-dropdown-item>
-        <el-dropdown-item>拆分</el-dropdown-item>
-        <el-dropdown-item>合并</el-dropdown-item>
+        <!-- <el-dropdown-item>拆分</el-dropdown-item>
+        <el-dropdown-item command="mergeOrder">合并</el-dropdown-item> -->
       </el-dropdown-menu>
     </el-dropdown>
     <el-button type="text" @click="handle('producePurchase')" title="选取已提交数据">生成采购单</el-button>

+ 49 - 26
src/views/oms/order/index.vue

@@ -147,7 +147,7 @@
         <order-tool @addOrder="addOrder" @smt="smtOrder" @reSmt="reSmt" @loadOrder="loadOrder" @producePurchase="producePurchase"/>
       </div>
       <div class="table">
-        <order-table :data="data" ref="orderTable" class="order-table" @detail="detail"/>
+        <order-table :data="data" ref="orderTable" class="order-table" @detail="detail" @mergeHandle="mergeHandle"/>
         <div class="page">
           <el-pagination v-if="page.total > 0" @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="page.pageNo" :page-size="page.pageSize"
             :layout="'total, sizes, prev, pager, next, jumper'" :total="page.total"></el-pagination>
@@ -156,6 +156,7 @@
       <add-order ref="addOrder" @handleSuccess="handleSuccess" />
       <load-order-modal ref="loadOrder" @handleSuccess="handleSuccess" />
       <purchase-model ref="purchaseModel" @handleSuccess="handleSuccess" />
+      <merge-model ref="mergeModel" />
     </div>
   </div>
 </template>
@@ -167,15 +168,16 @@ import OrderRadio from './components/orderRadio.vue'
 import filterDate from './components/filterDate.vue'
 import OrderTool from "./components/orderTool.vue";
 import OrderTable from "./components/orderTable.vue";
-import AddOrder from "./components/addOrder.vue";
+import AddOrder from "./components/addOrder.vue"; //新增订单
 import InputSelect from "./components/inputSelect.vue";
-import OrderProduct from "./components/orderProduct.vue";
+import OrderProduct from "./components/orderProduct.vue"; 
 import filterMinMax from './components/filterMinMax.vue'
-import loadOrderModal from './components/loadOrderModal.vue'
-import PurchaseModel from "./components/purchaseModel.vue";
-import { query,getProvince,smt,unSmt,purchaseQty } from '@/api/omsOrder'
+import loadOrderModal from './components/loadOrderModal.vue' //手工下载
+import PurchaseModel from "./components/purchaseModel.vue"; //生成采购单
+import MergeModel from "./components/mergeMedal.vue";
+import { query,getProvince,smt,unSmt,purchaseQty,merge } from '@/api/omsOrder'
 @Component({components:{filterInput,OrderCheckbox,OrderRadio,filterDate,OrderTool,OrderTable,AddOrder,InputSelect,OrderProduct,
-  filterMinMax,loadOrderModal,PurchaseModel}})
+  filterMinMax,loadOrderModal,PurchaseModel,MergeModel}})
 export default class Order extends Vue {
   activeNames:Array<any>=['1','status']
   radio=''
@@ -518,7 +520,13 @@ export default class Order extends Vue {
     this.page.pageNo = 1;
     this.getList();
   }
-
+  //合并操作
+  mergeHandle(data:Array<any>){
+    if(this.$refs.mergeModel){
+      (this.$refs.mergeModel as any).setShow(true);
+      (this.$refs.mergeModel as any).setData(data);
+    }
+  }
   addOrder(){
     (this.$refs.addOrder as any).setShow(true)
   }
@@ -534,7 +542,7 @@ export default class Order extends Vue {
     for(const item of data){
       if(item.isSubmitted == 1){
         if(smtMst){
-          smtMst = msg + ',' + item.sourceId
+          smtMst = smtMst + ',' + item.sourceId
         }else{
           smtMst = item.sourceId
         }
@@ -560,20 +568,22 @@ export default class Order extends Vue {
       })
       return
     }
+    this.load = true;
     smt({
       ids:ids
     }).then((res:any) => {
-      if(res.data == data.length){
+      this.load = false;
+      // if(res.data == data.length){
         (this as any).$message({
           message: '订单提交成功!',
           type: 'success'
         });
-      }else{
-        (this as any).$message({
-          message: (data.length - res.data)+'条订单提交失败!',
-          type: 'warning'
-        });
-      }
+      // }else{
+      //   (this as any).$message({
+      //     message: (data.length - res.data)+'条订单提交失败!',
+      //     type: 'warning'
+      //   });
+      // }
       this.getList();
     })
   }
@@ -584,26 +594,39 @@ export default class Order extends Vue {
       return
     }
     let ids:Array<any>=[];
-    
+    let smtMst:string='';
     for(const item of data){
-      
+      if(item.isSubmitted == 0){
+        if(smtMst){
+          smtMst = smtMst + ',' + item.sourceId
+        }else{
+          smtMst = item.sourceId
+        }
+      }
       ids.push(item.id)
     }
-    
+    if(smtMst){
+      this.$message({
+        message:'订单“'+smtMst + '”未提交,不能进行此操作!'
+      })
+      return
+    }
+    this.load = true;
     unSmt({
       ids:ids
     }).then((res:any) => {
-      if(res.data == data.length){
+      this.load = false;
+      // if(res.data == data.length){
         (this as any).$message({
           message: '订单反提交成功!',
           type: 'success'
         });
-      }else{
-        (this as any).$message({
-          message: (data.length - res.data)+'条订单反提交失败!',
-          type: 'warning'
-        });
-      }
+      // }else{
+      //   (this as any).$message({
+      //     message: (data.length - res.data)+'条订单反提交失败!',
+      //     type: 'warning'
+      //   });
+      // }
       this.getList();
     })
   }