Эх сурвалжийг харах

1、新增B2C订单导入
2、sku新增商品监控
3、其他优化

ymy 1 жил өмнө
parent
commit
4c324f3bc1

+ 1 - 1
.env.development

@@ -1,5 +1,5 @@
 # 页面标题
-VUE_APP_TITLE = SaaS协同平台
+VUE_APP_TITLE = OMS系统平台
 
 # 开发环境配置
 ENV = 'development'

+ 1 - 1
.env.production

@@ -1,5 +1,5 @@
 # 页面标题
-VUE_APP_TITLE = SaaS协同平台
+VUE_APP_TITLE = OMS系统平台
 
 # 生产环境配置
 ENV = 'production'

+ 17 - 0
.env.test

@@ -0,0 +1,17 @@
+# 页面标题
+VUE_APP_TITLE = OMS系统平台
+
+NODE_ENV = test
+
+# 生产环境配置
+ENV = 'test'
+
+# SaaS协同平台/生产环境
+VUE_APP_BASE_API = '/prod-api'
+
+# 登录地址 正式
+# VUE_APP_LOGIN_URL = 'https://sso.lzlxylsf.com/#/'
+# 开发
+# VUE_APP_LOGIN_URL = 'https://sso.benyuntech.com/#/'
+# 测试
+VUE_APP_LOGIN_URL = 'https://ssotest.benyuntech.com/#/sso/auth'

+ 3 - 1
package.json

@@ -5,7 +5,9 @@
   "scripts": {
     "serve": "vue-cli-service serve",
     "build:prod": "vue-cli-service build",
-    "build:stage": "vue-cli-service build --mode staging"
+    "build:dev": "vue-cli-service build --mode development",
+    "build:stage": "vue-cli-service build --mode staging",
+    "build:test": "vue-cli-service build --mode test"
   },
   "dependencies": {
     "@antv/data-set": "^0.11.8",

+ 12 - 0
src/api/omsOrder.ts

@@ -272,4 +272,16 @@ export function loadDownModule() {
 		method:'get',
 		responseType: 'blob'
 	})
+}
+
+//Excel导入B2C
+export function importB2cOrder(data:any) {
+	return request({
+		url:'/omsOrder/omsOrder/importB2cOrder',
+		method:'post',
+		data:data,
+		headers:{
+      'Content-Type':'application/x-www-form-urlencoded'
+    }
+	})
 }

+ 0 - 1
src/benyun/components/byInput/byInput.vue

@@ -98,7 +98,6 @@ export default class ByInput extends VueViews {
   }
 
   onChange(){
-    console.log(this.value)
     this.$emit('onChange',this.value);
     
   }

+ 18 - 6
src/views/audit/depots/components/ruleForm.vue

@@ -109,13 +109,25 @@
 			}],
 			shipperPhone: [{
 				required: true, message: '请输入发货人电话', trigger: 'blur'
+			},{
+				validator:(rule:any, value:any, callback:any) => {
+					if (value) {
+						if(!/^1[3|4|5|6|7|8|9][0-9]\d{8}$/.test(value)) {
+							callback(new Error('手机号格式不正确!'));
+						}else{
+							callback();
+						}
+					} else {
+						callback();
+					}
+				}, trigger: 'blur' 
 			}],
-			financeStorehouseName: [{
-				required: true, message: '请输入金蝶仓库名称', trigger: 'blur'
-			}],
-			financeStorehouseNo: [{
-				required: true, message: '请输入金蝶仓库编号', trigger: 'blur'
-			}],
+			// financeStorehouseName: [{
+			// 	required: true, message: '请输入金蝶仓库名称', trigger: 'blur'
+			// }],
+			// financeStorehouseNo: [{
+			// 	required: true, message: '请输入金蝶仓库编号', trigger: 'blur'
+			// }],
 			isThird: [{
 				required: true, message: '请选择是否绑定', trigger: 'change'
 			}],

+ 0 - 131
src/views/audit/productManagement/components/storeRecord.vue

@@ -1,131 +0,0 @@
-<template>
-  <el-drawer class="storeRecord" :size="600" append-to-body title="入库记录" :visible.sync="drawer" direction="rtl">
-    <div class="record-main">
-        <div class="re-box">
-          <div class="record-row" v-for="(item,index) of data" :key="index">
-            <div class="log-time"><i class="el-icon-time"></i> {{item.createTime}}</div>
-            <div class="log-user"><i class="el-icon-user"></i> {{item.optUser}}</div>
-            <div class="log-act"><i class="el-icon-setting"></i> {{item.optName}}</div>
-            <div class="log-desc" v-html="item.optDesc"></div>
-          </div>
-        </div>
-        <div class="page">
-          <el-pagination
-            background
-            layout="prev, pager, next"
-            @current-change="handleCurrentChange"
-            :current-page="page.pageNo"
-            :page-size="page.pageSize"
-            :total="page.total">
-          </el-pagination>
-        </div>
-    </div>
-  </el-drawer>
-</template>
-
-<script lang="ts">
-import { Component, Prop, Vue, Watch } from "vue-property-decorator";
-import api from '@/api/currency'
-@Component({components:{}})
-export default class StoreRecord extends Vue {
-  drawer=false
-  data:Array<any>=[]
-  value:any={}
-  load:boolean = false;
-  page = {
-    pageNo: 1, //当前页
-    pageSize: 20, //每页条数
-    total: 0 //总条数
-  }
-  handleCurrentChange(v:number){
-    this.page.pageNo = v
-  }
-  setShow(v:boolean){
-    this.drawer = v
-  }
-  setData(data:any){
-    this.value = data
-    this.loadList()
-  }
-
-  loadList(){
-    if(this.value && this.value.id){
-      let data:any = {};
-      data.itemId = this.value.id
-      data.pageNo = this.page.pageNo
-      data.pageSize = this.page.pageSize
-      this.load = true;
-      api.queryByProductId(data).then(res => {
-        this.load = false
-      }).catch(() => {
-        this.load = false
-      })
-    }
-    
-  }
-}
-</script>
-
-<style scoped lang="scss">
-  .record-main{
-    width: 100%;
-    height: 100%;
-    box-sizing: border-box;
-    padding: 0 16px;
-    .re-box{
-      height: calc(100% - 50px);
-      overflow-y: auto;
-      .record-row{
-        width: 100%;
-          display: flex;
-          flex-flow: wrap;
-          font-size: 14px;
-          padding: 16px 0;
-          border-bottom: dotted 1px #CCC;
-          .log-time{
-            width: 170px;
-            color: #666;
-          }
-          .log-user{
-            width: 120px;
-            padding-right: 8px;
-            overflow: hidden;
-            white-space: nowrap;
-            text-overflow: ellipsis;
-            color: #666;
-          }
-          .log-act{
-            width: 130px;
-            padding-right: 8px;
-            overflow: hidden;
-            white-space: nowrap;
-            color: #666;
-            text-overflow: ellipsis;
-          }
-          .log-desc{
-            // min-width: 150px;
-            width: 100%;
-            font-size: 12px;
-            padding-top: 8px;
-            // display: flex;
-            // flex-wrap: wrap;
-            
-          }
-      }
-    }
-    .page{
-      height:50px;
-      display: flex;
-      align-items: flex-end;
-      flex-direction: column;
-      justify-content: center;
-    }
-  }
-</style>
-<style lang="scss">
-.storeRecord {
-		.el-drawer__body {
-			height: calc(100% - 63px);
-		}
-	}
-</style>

+ 0 - 112
src/views/audit/sku/components/inStoreRecord.vue

@@ -1,112 +0,0 @@
-<template>
-  <el-drawer class="storeRecord" :size="600" append-to-body title="入库记录" :visible.sync="drawer" direction="rtl">
-    <div class="record-main">
-        <div class="re-box">
-          <div class="record-row" v-for="(item,index) of data" :key="index">
-            <div class="log-time"><i class="el-icon-time"></i> {{item.createTime}}</div>
-            <div class="log-user"><i class="el-icon-user"></i> {{item.optUser}}</div>
-            <div class="log-act"><i class="el-icon-setting"></i> {{item.optName}}</div>
-            <div class="log-desc" v-html="item.optDesc"></div>
-          </div>
-        </div>
-        <div class="page">
-          <el-pagination
-            background
-            layout="prev, pager, next"
-            @current-change="handleCurrentChange"
-            :current-page="page.pageNo"
-            :page-size="page.pageSize"
-            :total="page.total">
-          </el-pagination>
-        </div>
-    </div>
-  </el-drawer>
-</template>
-
-<script lang="ts">
-import { Component, Prop, Vue, Watch } from "vue-property-decorator";
-@Component({components:{}})
-export default class InStoreRecord extends Vue {
-  drawer=false
-  data:Array<any>=[]
-  value:any={}
-  page = {
-    pageNo: 1, //当前页
-    pageSize: 20, //每页条数
-    total: 0 //总条数
-  }
-  handleCurrentChange(v:number){
-    this.page.pageNo = v
-  }
-  setShow(v:boolean){
-    this.drawer = v
-  }
-  setData(data:any){
-    this.value = data
-  }
-}
-</script>
-
-<style scoped lang="scss">
-  .record-main{
-    width: 100%;
-    height: 100%;
-    box-sizing: border-box;
-    padding: 0 16px;
-    .re-box{
-      height: calc(100% - 50px);
-      overflow-y: auto;
-      .record-row{
-        width: 100%;
-          display: flex;
-          flex-flow: wrap;
-          font-size: 14px;
-          padding: 16px 0;
-          border-bottom: dotted 1px #CCC;
-          .log-time{
-            width: 170px;
-            color: #666;
-          }
-          .log-user{
-            width: 120px;
-            padding-right: 8px;
-            overflow: hidden;
-            white-space: nowrap;
-            text-overflow: ellipsis;
-            color: #666;
-          }
-          .log-act{
-            width: 130px;
-            padding-right: 8px;
-            overflow: hidden;
-            white-space: nowrap;
-            color: #666;
-            text-overflow: ellipsis;
-          }
-          .log-desc{
-            // min-width: 150px;
-            width: 100%;
-            font-size: 12px;
-            padding-top: 8px;
-            // display: flex;
-            // flex-wrap: wrap;
-            
-          }
-      }
-    }
-    .page{
-      height:50px;
-      display: flex;
-      align-items: flex-end;
-      flex-direction: column;
-      justify-content: center;
-    }
-  }
-</style>
-<style lang="scss">
-.storeRecord {
-		.el-drawer__body {
-			height: calc(100% - 63px);
-		}
-	}
-</style>

+ 0 - 113
src/views/audit/sku/components/outStoreRecord.vue

@@ -1,113 +0,0 @@
-<template>
-  <el-drawer class="storeRecord" :size="600" append-to-body title="出库记录" :visible.sync="drawer" direction="rtl">
-    <div class="record-main">
-        <div class="re-box">
-          <div class="record-row" v-for="(item,index) of data" :key="index">
-            <div class="log-time"><i class="el-icon-time"></i> {{item.createTime}}</div>
-            <div class="log-user"><i class="el-icon-user"></i> {{item.optUser}}</div>
-            <div class="log-act"><i class="el-icon-setting"></i> {{item.optName}}</div>
-            <div class="log-desc" v-html="item.optDesc"></div>
-          </div>
-        </div>
-        <div class="page">
-          <el-pagination
-            background
-            layout="prev, pager, next"
-            @current-change="handleCurrentChange"
-            :current-page="page.pageNo"
-            :page-size="page.pageSize"
-            :total="page.total">
-          </el-pagination>
-        </div>
-    </div>
-  </el-drawer>
-</template>
-
-<script lang="ts">
-import { Component, Prop, Vue, Watch } from "vue-property-decorator";
-@Component({components:{}})
-export default class OutStoreRecord extends Vue {
-  drawer=false
-  data:Array<any>=[]
-  value:any={}
-  page = {
-    pageNo: 1, //当前页
-    pageSize: 20, //每页条数
-    total: 0 //总条数
-  }
-  handleCurrentChange(v:number){
-    this.page.pageNo = v
-  }
-  setShow(v:boolean){
-    this.drawer = v
-  }
-  setData(data:any){
-    this.value = data
-  }
-
-}
-</script>
-
-<style scoped lang="scss">
-  .record-main{
-    width: 100%;
-    height: 100%;
-    box-sizing: border-box;
-    padding: 0 16px;
-    .re-box{
-      height: calc(100% - 50px);
-      overflow-y: auto;
-      .record-row{
-        width: 100%;
-          display: flex;
-          flex-flow: wrap;
-          font-size: 14px;
-          padding: 16px 0;
-          border-bottom: dotted 1px #CCC;
-          .log-time{
-            width: 170px;
-            color: #666;
-          }
-          .log-user{
-            width: 120px;
-            padding-right: 8px;
-            overflow: hidden;
-            white-space: nowrap;
-            text-overflow: ellipsis;
-            color: #666;
-          }
-          .log-act{
-            width: 130px;
-            padding-right: 8px;
-            overflow: hidden;
-            white-space: nowrap;
-            color: #666;
-            text-overflow: ellipsis;
-          }
-          .log-desc{
-            // min-width: 150px;
-            width: 100%;
-            font-size: 12px;
-            padding-top: 8px;
-            // display: flex;
-            // flex-wrap: wrap;
-            
-          }
-      }
-    }
-    .page{
-      height:50px;
-      display: flex;
-      align-items: flex-end;
-      flex-direction: column;
-      justify-content: center;
-    }
-  }
-</style>
-<style lang="scss">
-.storeRecord {
-		.el-drawer__body {
-			height: calc(100% - 63px);
-		}
-	}
-</style>

+ 69 - 55
src/views/audit/sku/components/storeRecord.vue

@@ -1,9 +1,9 @@
 <template>
-  <el-drawer class="storeRecord" :size="700" append-to-body title="商品监控" :visible.sync="drawer" direction="rtl">
+  <el-drawer class="storeRecord" :size="750" append-to-body title="商品监控" :visible.sync="drawer" direction="rtl">
     <div class="record-main">
-      <el-tabs v-model="activeName" @tab-click="handleClick">
+      <el-tabs v-model="activeName" @tab-click="handleClick" v-loading="load">
         <el-tab-pane label="订单记录" name="first">
-          <by-table :propConfig="orderConfig" ref="orderTable" @pagination="paginationOrder">
+          <by-table :propConfig="orderConfig" ref="orderTable" class="tableComp" @pagination="paginationOrder">
             <template v-slot:state='{ row }'>
               <span v-if="row.status == 'WaitPay'">待付款</span>
               <span v-if="row.status == 'Delivering'">发货中</span>
@@ -17,57 +17,23 @@
               <span v-if="row.status == 'Cancelled'">取消</span>
             </template>
             <template v-slot:tmsOrderStatus='{ row }'>
-              {{ getTMSStatus(row.tmsOrderStatus) }}
+              {{ row.omsShippingOrder?getTMSStatus(row.omsShippingOrder.tmsOrderStatus):'' }}
+            </template>
+            <template v-slot:tmsOrderNo='{ row }'>
+              {{ row.omsShippingOrder?row.omsShippingOrder.tmsOrderNo:'' }}
+            </template>
+            <template v-slot:num='{ row }'>
+              {{ row.omsShippingOrder?row.omsShippingOrder.tmsTotalQuantity:'' }}
             </template>
           </by-table>
         </el-tab-pane>
         <el-tab-pane label="入库记录" name="second">
-          <by-table :propConfig="inStoreConfig" ref="inStoreTable" @pagination="paginationInStore"></by-table>
+          <by-table :propConfig="inStoreConfig" ref="inStoreTable" class="tableComp" @pagination="paginationInStore"></by-table>
         </el-tab-pane>
         <el-tab-pane label="出库记录" name="third">
-          <by-table :propConfig="outStoreConfig" ref="outStoreTable" @pagination="paginationOutnStore"></by-table>
+          <by-table :propConfig="outStoreConfig" ref="outStoreTable" class="tableComp" @pagination="paginationOutnStore"></by-table>
         </el-tab-pane>
       </el-tabs>
-        <!-- <div class="re-box">
-          <div class="re-list" v-for="(item,index) of data" :key="index">
-            <div class="record-row">
-              <div class="log-time"><span>时间:</span> {{item.createTime}}</div>
-              <div class="log-user"><span>订单号:</span> {{item.id}}</div>
-              <div class="state"><span>状态:</span> 
-                <span v-if="item.status == 'WaitPay'" title="待付款">待付款</span>
-                <span v-if="item.status == 'Delivering'" title="发货中">发货中</span>
-                <span v-if="item.status == 'Merged'" title="被合并">被合并</span>
-                <span v-if="item.status == 'Question'" title="异常">异常</span>
-                <span v-if="item.status == 'Split'" title="被拆分">被拆分</span>
-                <span v-if="item.status == 'WaitOuterSent'" title="等供销商|外仓发货">等供销商|外仓发货</span>
-                <span v-if="item.status == 'WaitConfirm'" title="已付款待审核">已付款待审核</span>
-                <span v-if="item.status == 'WaitFConfirm'" title="已客审待财审">已客审待财审</span>
-                <span v-if="item.status == 'Sent'" title="已发货">已发货</span>
-                <span v-if="item.status == 'Cancelled'" title="取消">取消</span>  
-              </div>
-            </div>
-            <div class="record-row">
-              <div class="d-code">
-                <span>运输号:</span>
-                {{ item.tmsOrderNo }}
-              </div>
-              <div class="d-state">
-                <span>运输状态:</span>
-                {{ getTMSStatus(item.tmsOrderStatus) }}
-              </div>
-            </div>
-          </div>
-        </div>
-        <div class="page">
-          <el-pagination
-            background
-            layout="prev, pager, next"
-            @current-change="handleCurrentChange"
-            :current-page="page.pageNo"
-            :page-size="page.pageSize"
-            :total="page.total">
-          </el-pagination>
-        </div> -->
     </div>
   </el-drawer>
 </template>
@@ -94,16 +60,21 @@ export default class StoreRecord extends Vue {
       title:'状态',
       field:'state',
       slot:true,
-      // width:120
+      width:120
     },{
-      title:'运输号',
+      title:'TMS运输号',
       field:'tmsOrderNo',
-      width:70
+      slot:true,
+      width:165
     },{
-      title:'运输状态',
+      title:'TMS运输状态',
       field:'tmsOrderStatus',
       slot:true,
       // width:120
+    },{
+      title:'数量',
+      field:'num',
+      slot:true
     },{
       title:'创建时间',
       field:'createTime',
@@ -190,15 +161,18 @@ export default class StoreRecord extends Vue {
     return n;
   }
   paginationOrder(p:any){
-    this.pageOrder.pageNo = p.pageNum
-    this.loadOrderList()
+    this.pageOrder.pageNo = p.pageNum;
+    this.pageOrder.pageSize = p.pageSize;
+    this.loadOrderList();
   }
   paginationInStore(p:any){
-    this.inStorePage.pageNo = p.pageNum
+    this.inStorePage.pageNo = p.pageNum;
+    this.inStorePage.pageSize = p.pageSize;
     this.loadInstoreList()
   }
   paginationOutnStore(p:any){
-    this.outStorePage.pageNo = p.pageNum
+    this.outStorePage.pageNo = p.pageNum;
+    this.outStorePage.pageSize = p.pageSize;
     this.loadOutstoreList()
   }
   // handleCurrentChange(v:number){
@@ -206,6 +180,23 @@ export default class StoreRecord extends Vue {
   // }
   setShow(v:boolean){
     this.drawer = v
+    this.pageOrder.pageNo=1;
+    this.pageOrder.total=0;
+    this.inStorePage.pageNo=1;
+    this.inStorePage.total=0;
+    this.outStorePage.pageNo=1;
+    this.outStorePage.total=0;
+    this.activeName='first'
+    this.$nextTick(() => {
+      let height = (document.getElementsByClassName('tableComp')[0] as any).offsetHeight;
+      this.orderConfig.attr.height = height - 48;
+      this.inStoreConfig.attr.height = height - 48;
+      this.outStoreConfig.attr.height = height - 48;
+      if(this.$refs.orderTable){
+        (this.$refs.orderTable as any).setValue([]);
+        (this.$refs.orderTable as any).setPage(this.pageOrder);
+      }
+    })
   }
   setData(data:any){
     this.value = data
@@ -345,14 +336,32 @@ export default class StoreRecord extends Vue {
       justify-content: center;
     }
   }
+  .tableComp{
+    height: 100%;
+    overflow: hidden;
+  }
 </style>
 <style lang="scss">
 .storeRecord {
+  .el-drawer__header{
+    height: 50px;
+    box-sizing: border-box;
+    padding: 0 16px !important;
+    width: 100%;
+    margin: 0 !important;
+    display: flex;
+    align-items: center;
+  }
   .el-drawer__body {
-    height: calc(100% - 63px);
+    height: calc(100% - 50px);
+    flex:none;
   }
 }
 .record-main{
+  .el-tabs{
+    width: 100%;
+    height: 100%;
+  }
   .el-tabs__header{
     margin: 0 !important;
   }
@@ -360,6 +369,11 @@ export default class StoreRecord extends Vue {
     height: calc(100% - 40px);
     padding-top: 8px;
     box-sizing: border-box;
+    overflow: hidden;
+    .el-tab-pane{
+      width: 100%;
+      height: 100%;
+    }
   }
 }
 </style>

+ 8 - 12
src/views/oms/B2BOrder/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_desc='{ value }'>
+            <template v-slot:operationFlag_desc='{ value }'>
               {{ getFromText(value.operationFlag) }}
             </template>
             <template v-slot:sellType_desc='{ value }'>
@@ -232,13 +232,13 @@ export default class AddOrder extends Vue {
   stepCon=['WaitPay','WaitConfirm','WaitFConfirm','WaitOuterSent','Sent','Delivering']
   activeNames:Array<any> =['1','2','3','4','5','save'];
   operationFlag:any={
-    'ERP':'手工下单',
+    'OMS':'手工下单',
     'COPY':'复制',
     'MERGE':'合并',
     'SPLIT':'拆分;拆分还原',
     'MOBILE':'导入',
-    'drp-s':'供销推送',
-    'drp-d':'分销推送',
+    'DRP-S':'供销推送',
+    'DRP-D':'分销推送',
     'KWAISHOP':'快手;微商城',
     'PINDUODUO':'拼多多',
     'TOUTIAOFXG':'头条放心购',
@@ -534,7 +534,7 @@ export default class AddOrder extends Vue {
         }
       },{
         span:8,
-        colspan: 2,
+        colspan: 1,
         label:'邮编',
         prop:'receiverZip',
         component:'by-input',
@@ -979,7 +979,7 @@ export default class AddOrder extends Vue {
         }
       }
     }
-    return t;
+    return t?t:'--';
   }
   stepTypeName(n:string){
     let t = '';
@@ -1309,7 +1309,7 @@ export default class AddOrder extends Vue {
       }else{
         for(let col of this.baseConfig.columns){
           for(let item of col){
-            let disField:Array<string>=['freight','buyerMessage','remark','sellType'] 
+            let disField:Array<string>=['freight','note','remark','sellType'] 
             if(!item.slot && disField.indexOf(item.prop) == -1){
               if(!item.compConfig.attr) item.compConfig.attr = {};
               item.compConfig.attr.disabled = true;
@@ -1643,8 +1643,6 @@ export default class AddOrder extends Vue {
           }else{
             resolve();
           }
-
-          
         }).catch(()=>{
           if(r){
             (this as any).$message({
@@ -1699,8 +1697,6 @@ export default class AddOrder extends Vue {
         this.$emit('handleSuccess');
       }).catch((err:any) => {
         this.load = false;
-      }).catch(()=>{
-        this.load = false
       })
     }).catch((err:any) => {})
   }
@@ -1721,7 +1717,7 @@ export default class AddOrder extends Vue {
       }).catch((err:any) => {
         this.load = false;
       })
-    })
+    }).catch(()=>{})
     
   }
 }

+ 30 - 27
src/views/oms/B2BOrder/components/deliveryDetail.vue

@@ -190,37 +190,40 @@ export default class DeliveryDetail extends Vue {
     queryOrderByOrderId({
       omsOrderId:v
     }).then((res:any) => {
+      this.load = false;
       this.value = res.data;
-      if(res.data.subItemList){
-        this.value.subItem=[];
-        for(const item of this.value.subItemList){
-          this.value.subItem.push({
-            tmsGoodsCode:item.tmsGoodsCode,
-            name:item.tmsGoodsName,
-            tmsGoodsTotalPrice:item.tmsGoodsTotalPrice,
-            price:item.tmsGoodsPrice,
-            weight:item.tmsWeight,
-            tmsQuantity:item.tmsQuantity
-          })
+      if(this.value) {
+        if(res.data.subItemList){
+          this.value.subItem=[];
+          for(const item of this.value.subItemList){
+            this.value.subItem.push({
+              tmsGoodsCode:item.tmsGoodsCode,
+              name:item.tmsGoodsName,
+              tmsGoodsTotalPrice:item.tmsGoodsTotalPrice,
+              price:item.tmsGoodsPrice,
+              weight:item.tmsWeight,
+              tmsQuantity:item.tmsQuantity
+            })
+          }
         }
-      }
-      this.value.weight = Number(this.value.tmsTotalWeight)
-      this.load = false;
-      if(res.data.pricePlan){
-        try{
-          this.priceData = JSON.parse(res.data.pricePlan);
-        }catch(e){
-          this.priceData = [];
-          console.error('价格列表数据转换错误!')
+        this.value.weight = Number(this.value.tmsTotalWeight)
+        if(res.data.pricePlan){
+          try{
+            this.priceData = JSON.parse(res.data.pricePlan);
+          }catch(e){
+            this.priceData = [];
+            console.error('价格列表数据转换错误!')
+          }
+          
         }
-        
+        setTimeout(()=>{
+          if(this.$refs.info){
+            (this.$refs.info as any).setValue(this.value)
+          }
+        },1000)
+      }else{
+        this.$message('未找到发货明细数据!')
       }
-      setTimeout(()=>{
-        if(this.$refs.info){
-          (this.$refs.info as any).setValue(this.value)
-        }
-      },1000)
-      
     }).catch(() => {
       this.load = false;
     })

+ 8 - 8
src/views/oms/B2BOrder/components/deliveryGoodsInfo.vue

@@ -108,24 +108,24 @@
         </div>
       </div>
       <div class="info-row">
-        <div class="info-col col-width">
-          <span class="label">发货人:</span>
-          <span :title="value.tmsShipmentConsignor">{{ value.tmsShipmentConsignor }}</span>
-        </div>
         <div class="info-col col-width">
           <span class="label">收货人:</span>
           <span :title="value.tmsUnloadingConsignor">{{ value.tmsUnloadingConsignor }}</span>
         </div>
-      </div>
-      <div class="info-row">
         <div class="info-col col-width">
-          <span class="label">发货人联系电话:</span>
-          <span :title="value.tmsShipmentContacts">{{ value.tmsShipmentContacts }}</span>
+          <span class="label">发货人:</span>
+          <span :title="value.tmsShipmentConsignor">{{ value.tmsShipmentConsignor }}</span>
         </div>
+      </div>
+      <div class="info-row">
         <div class="info-col col-width">
           <span class="label">收货人联系电话:</span>
           <span :title="value.tmsUnloadingContacts">{{ value.tmsUnloadingContacts }}</span>
         </div>
+        <div class="info-col col-width">
+          <span class="label">发货人联系电话:</span>
+          <span :title="value.tmsShipmentContacts">{{ value.tmsShipmentContacts }}</span>
+        </div>
       </div>
       <div class="info-row">
         <div class="info-col col-width">

+ 24 - 12
src/views/oms/B2BOrder/components/expressDeliveryModal.vue

@@ -32,6 +32,10 @@
               <span class="label">仓库:</span>
               <span :title="value.storeHouseName">{{ value.storeHouseName }}</span>
             </div>
+            <div class="info-col">
+              <span class="label">物流:</span>
+              <span :title="value.wmsLogisticsName">{{ value.wmsLogisticsName }}</span>
+            </div>
           </div>
           <div class="info-row">
             <div class="info-col">
@@ -160,7 +164,11 @@ export default class ExpressDeliveryModal extends Vue {
           attr:{
             defaultIndex:0,
             placeholder:'请选择仓库',
-            clearable:true
+            clearable:true,
+            retConfig:{
+              storeHouseId: 'id',
+              storeHouseName: 'name'
+            }
           }
         }
       }],
@@ -171,6 +179,10 @@ export default class ExpressDeliveryModal extends Vue {
         compConfig:{
           attr:{
             clearable:true,
+            retConfig:{
+              value: 'wmsLogisticsCode',
+              label: 'wmsLogisticsName'
+            },
             data: [{
               value:'EMS',
               label:'EMS'
@@ -308,17 +320,17 @@ export default class ExpressDeliveryModal extends Vue {
     }, 'maindataStorehouse').then((res: any) => {
       let warehouseData = res.data.records;
       if(warehouseData.length > 0){
-        this.value.tmsShipmentConsignor=warehouseData[0].shipper;
-        this.value.tmsShipmentContacts=warehouseData[0].shipperPhone;
-        this.value.tmsShipmentProvince= warehouseData[0].province;
-        this.value.tmsShipmentProvinceNo=warehouseData[0].provinceCode;
-        this.value.tmsShipmentCity= warehouseData[0].city;
-        this.value.tmsShipmentCityNo= warehouseData[0].cityCode;
-        this.value.tmsShipmentRegion= warehouseData[0].region;
-        this.value.tmsShipmentRegionNo= warehouseData[0].regionCode;
-        this.value.tmsShipmentStreetNo= warehouseData[0].streetCode;
-        this.value.tmsShipmentStreet= warehouseData[0].street;
-        this.value.tmsShipmentAddress=warehouseData[0].address;
+        // this.value.tmsShipmentConsignor=warehouseData[0].shipper;
+        // this.value.tmsShipmentContacts=warehouseData[0].shipperPhone;
+        // this.value.tmsShipmentProvince= warehouseData[0].province;
+        // this.value.tmsShipmentProvinceNo=warehouseData[0].provinceCode;
+        // this.value.tmsShipmentCity= warehouseData[0].city;
+        // this.value.tmsShipmentCityNo= warehouseData[0].cityCode;
+        // this.value.tmsShipmentRegion= warehouseData[0].region;
+        // this.value.tmsShipmentRegionNo= warehouseData[0].regionCode;
+        // this.value.tmsShipmentStreetNo= warehouseData[0].streetCode;
+        // this.value.tmsShipmentStreet= warehouseData[0].street;
+        // this.value.tmsShipmentAddress=warehouseData[0].address;
         this.value.storeHouseId= warehouseData[0].id;
         this.value.storeHouseName= warehouseData[0].name;
         this.$forceUpdate()

+ 1 - 1
src/views/oms/B2BOrder/components/importExcelModal.vue

@@ -134,7 +134,7 @@ export default class ImportExcelFailModel extends Vue {
       this.show = false;
     }
     excelHelper.toExcel({
-      fileName: '(异常)'+this.value.name,
+      fileName: 'B2B异常数据(仅供参考,请误上传).xlsx',
       data: data,
       otherData: {ExcelHead}
     })

+ 17 - 0
src/views/oms/B2BOrder/index.vue

@@ -70,6 +70,7 @@
           </order-radio>
           <order-radio title="操作标记" keyName="operationFlag" ref="searchCom11" :options="sourceFromOptions" noLimit @radioChange="onChange($event,'operationFlag')" />
           <order-checkbox title="订单类型" keyName="typeList" ref="searchCom12" :options="typeOption" noLimit @checkboxChange="onChange($event,'typeList')" />
+          <order-radio title="售卖类型" keyName="sellType" ref="searchCom15" :options="sellTypeOptions" noLimit @radioChange="onChange($event,'sellType')" />
           <el-collapse-item title="付款方式 & 是否付款" name="codAndPay">
             <div class="box01">
               <el-radio-group v-model="radio" @input="colChange">
@@ -400,6 +401,22 @@ export default class Order extends Vue {
     label:'聚水潭',
     value:'JUSHUITAN'
   }]
+  sellTypeOptions:Array<any>=[{
+    value: '1',
+    label: '自营'
+  }, {
+    value: '2',
+    label: '代发'
+  }, {
+    value: '3',
+    label: '代销'
+  }, {
+    value: '4',
+    label: '经销'
+  }, {
+    value: '5',
+    label: '线下'
+  }]
 
   //审批状态
   submitOption:Array<any>=[{

+ 21 - 13
src/views/oms/B2COrder/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_desc='{ value }'>
+            <template v-slot:operationFlag_desc='{ value }'>
               {{ getFromText(value.operationFlag) }}
             </template>
             <template v-slot:shopName="{value}">
@@ -220,13 +220,13 @@ export default class AddOrder extends Vue {
   stepCon=['WaitPay','WaitConfirm','WaitFConfirm','WaitOuterSent','Sent','Delivering']
   activeNames:Array<any> =['1','2','3','4','5','save'];
   operationFlag:any={
-    'ERP':'手工下单',
+    'OMS':'手工下单',
     'COPY':'复制',
     'MERGE':'合并',
     'SPLIT':'拆分;拆分还原',
     'MOBILE':'导入',
-    'drp-s':'供销推送',
-    'drp-d':'分销推送',
+    'DRP-S':'供销推送',
+    'DRP-D':'分销推送',
     'KWAISHOP':'快手;微商城',
     'PINDUODUO':'拼多多',
     'TOUTIAOFXG':'头条放心购',
@@ -470,7 +470,7 @@ export default class AddOrder extends Vue {
       [{
         span:6,
         label:'手机',
-        colspan: 1,
+        colspan: 2,
         prop:'receiverMobile',
         component:'by-input',
         compConfig:{
@@ -495,7 +495,7 @@ export default class AddOrder extends Vue {
         span:6,
         label:'邮编',
         prop:'receiverZip',
-        colspan: 2,
+        colspan: 1,
         component:'by-input',
         compConfig:{
           attr:{
@@ -892,7 +892,7 @@ export default class AddOrder extends Vue {
         }
       }
     }
-    return t;
+    return t?t:'--';
   }
   stepTypeName(n:string){
     let t = '';
@@ -1216,10 +1216,11 @@ export default class AddOrder extends Vue {
           label:'快递单号',
           prop:'logisticsId'
         })
-      }else{
+      }
+      else{
         for(let col of this.baseConfig.columns){
           for(let item of col){
-            let disField:Array<string>=['freight','buyerMessage','remark'] 
+            let disField:Array<string>=['freight','note','remark'] 
             if(!item.slot && disField.indexOf(item.prop) == -1){
               if(!item.compConfig.attr) item.compConfig.attr = {};
               item.compConfig.attr.disabled = true;
@@ -1554,7 +1555,16 @@ export default class AddOrder extends Vue {
           }
           r = false;
           reject();
-        });
+        }).catch(()=>{
+          if(r){
+            (this as any).$message({
+              message: '验证未通过,请检查!',
+              type: 'warning',
+            })
+          }
+          r = false;
+          reject();
+        })
       }).catch(()=>{
         if(r){
           (this as any).$message({
@@ -1599,8 +1609,6 @@ export default class AddOrder extends Vue {
         this.$emit('handleSuccess');
       }).catch((err:any) => {
         this.load = false;
-      }).catch(()=>{
-        this.load = false
       })
     }).catch((err:any) => {})
   }
@@ -1621,7 +1629,7 @@ export default class AddOrder extends Vue {
       }).catch((err:any) => {
         this.load = false;
       })
-    })
+    }).catch(() => {})
     
   }
 }

+ 24 - 12
src/views/oms/B2COrder/components/expressDeliveryModal.vue

@@ -32,6 +32,10 @@
               <span class="label">仓库:</span>
               <span :title="value.storeHouseName">{{ value.storeHouseName }}</span>
             </div>
+            <div class="info-col">
+              <span class="label">物流:</span>
+              <span :title="value.wmsLogisticsName">{{ value.wmsLogisticsName }}</span>
+            </div>
           </div>
           <div class="info-row">
             <div class="info-col">
@@ -160,7 +164,11 @@ export default class ExpressDeliveryModal extends Vue {
           attr:{
             defaultIndex:0,
             placeholder:'请选择仓库',
-            clearable:true
+            clearable:true,
+            retConfig:{
+              storeHouseId: 'id',
+              storeHouseName: 'name'
+            }
           }
         }
       }],
@@ -171,6 +179,10 @@ export default class ExpressDeliveryModal extends Vue {
         compConfig:{
           attr:{
             clearable:true,
+            retConfig:{
+              value: 'wmsLogisticsCode',
+              label: 'wmsLogisticsName'
+            },
             data: [{
               value:'EMS',
               label:'EMS'
@@ -308,17 +320,17 @@ export default class ExpressDeliveryModal extends Vue {
     }, 'maindataStorehouse').then((res: any) => {
       let warehouseData = res.data.records;
       if(warehouseData.length > 0){
-        this.value.tmsShipmentConsignor=warehouseData[0].shipper;
-        this.value.tmsShipmentContacts=warehouseData[0].shipperPhone;
-        this.value.tmsShipmentProvince= warehouseData[0].province;
-        this.value.tmsShipmentProvinceNo=warehouseData[0].provinceCode;
-        this.value.tmsShipmentCity= warehouseData[0].city;
-        this.value.tmsShipmentCityNo= warehouseData[0].cityCode;
-        this.value.tmsShipmentRegion= warehouseData[0].region;
-        this.value.tmsShipmentRegionNo= warehouseData[0].regionCode;
-        this.value.tmsShipmentStreetNo= warehouseData[0].streetCode;
-        this.value.tmsShipmentStreet= warehouseData[0].street;
-        this.value.tmsShipmentAddress=warehouseData[0].address;
+        // this.value.tmsShipmentConsignor=warehouseData[0].shipper;
+        // this.value.tmsShipmentContacts=warehouseData[0].shipperPhone;
+        // this.value.tmsShipmentProvince= warehouseData[0].province;
+        // this.value.tmsShipmentProvinceNo=warehouseData[0].provinceCode;
+        // this.value.tmsShipmentCity= warehouseData[0].city;
+        // this.value.tmsShipmentCityNo= warehouseData[0].cityCode;
+        // this.value.tmsShipmentRegion= warehouseData[0].region;
+        // this.value.tmsShipmentRegionNo= warehouseData[0].regionCode;
+        // this.value.tmsShipmentStreetNo= warehouseData[0].streetCode;
+        // this.value.tmsShipmentStreet= warehouseData[0].street;
+        // this.value.tmsShipmentAddress=warehouseData[0].address;
         this.value.storeHouseId= warehouseData[0].id;
         this.value.storeHouseName= warehouseData[0].name;
         this.$forceUpdate()

+ 204 - 0
src/views/oms/B2COrder/components/importExcelModal.vue

@@ -0,0 +1,204 @@
+<template>
+  <vxe-modal v-model="show" id="importExcelFailModel" width="600" height="300" title="B2C订单导入" @hide="hide" resize transfer show-footer v-loading="load">
+    <div class="upload" v-if="!uploadRes">
+      <div class="upload-name">{{ value.name }}</div>
+      <div class="upload-btn" @click="importOrder">{{value.name?'重新上传':'上传'}}</div>
+    </div>
+    <div class="upload-module" v-if="!uploadRes" @click="loadDownExcel">下载excel模版</div>
+    <div class="shop-result" v-if="uploadRes">
+      <div class="success">成功:{{uploadRes.successCount}}</div>
+      <div class="err">异常:{{ uploadRes.failureCount }}</div>
+    </div>
+    <template #footer>
+      <div class="btn">
+        <el-button type="primary" size="small" @click="uploadErr" v-if="uploadRes && uploadRes.failureCount > 0">下载异常数据</el-button>
+        <el-button type="primary" size="small" @click="btn" v-if="!uploadRes">完成上传</el-button>
+        <el-button plain size="small" @click="show = false">关闭</el-button>
+      </div>
+    </template>
+  </vxe-modal>
+</template>
+
+<script lang="ts">
+import { Component, Prop, Vue, Watch } from "vue-property-decorator";
+import { importB2cOrder,loadDownModule } from '@/api/omsOrder'
+import ExcelHelper from '@/benyun/utils/excelHelper'
+@Component({components:{}})
+export default class ImportExcelFailModel extends Vue {
+  show:boolean = false;
+  value:any = {}
+  load:boolean = false;
+  uploadRes:any = null
+  setShow(v:boolean){
+    this.show = v;
+  }
+  hide(){
+    if(this.uploadRes && this.uploadRes.successCount > 0){
+      this.$emit('handleSuccess')
+    }
+    this.value = {};
+    this.uploadRes = null;
+  }
+  //下载模版
+  loadDownExcel(){
+    loadDownModule().then((res:any) => {
+      let url = window.URL.createObjectURL(new Blob([res]));
+      let link = document.createElement("a");
+      link.style.display = "none";
+      link.href = url;
+      link.setAttribute("download", '订单导入模版.xlsx');
+      document.body.appendChild(link);
+      link.click();
+      document.body.removeChild(link);
+      
+      this.$message({
+        message: '下载成功!',
+        type: 'success'
+      })
+    }).catch(() => { })
+  }
+  //导入
+  importOrder() {
+    const accept = '.xlsx'
+    let input = document.createElement('input')
+    input.style.display = 'none'
+    input.type = 'file'
+    input.accept = accept
+    document.body.appendChild(input);
+    const that = this;
+    input.addEventListener('change', function (e:any) {
+      let txt = e.target.files[0];
+      let s = txt.name.split('.');
+      let suffix = '.' + s[s.length - 1];
+      if(accept.indexOf(suffix) == -1){
+        that.$message({message:'不支持该类型文件上传!'})
+        return
+      }
+      that.value = txt;
+    })
+    input.click();
+    document.body.removeChild(input);
+  }
+  btn(){
+    if(!this.value.name){
+      this.$message('请选择文件!');
+      return
+    }
+    let data = new FormData();
+    data.append('file' , this.value);
+    this.load = true;
+    importB2cOrder(data).then(res => {
+      this.uploadRes = res.data;
+      this.load = false;
+    }).catch(err => {
+      this.load = false;
+      if(err && err.msg) {
+        this.$message({
+          showClose: true,
+          message:err.msg,
+          type:'error'
+        })
+      }
+    })
+  }
+  uploadErr(){
+    let ExcelHead:Array<any> = [];
+    let data:Array<any>=[]
+    // let arr=['orderCode','plantTime','sProvince','sCity','sCounty','address','sName','sTel','orderDate','buyId','orderRmk','lineRmk','productCode','productType','mProductCode','mProductName','mTypeCode','isGift','num','basePrice','price','rmk','isSuccess','info']
+
+    this.uploadRes.failureList.forEach((item:any,index:any) => {
+      let obj:any={}
+      item.forEach((ele:any,dex:any) => {
+        if(index === 0) {
+          let excelHeadConfig = {
+            text: ele,
+            value: 'a' + dex,
+            width: '200'
+          }
+          ExcelHead.push(excelHeadConfig)
+        }else{
+          obj['a' + dex] = ele;
+        }
+      });
+      if(index !== 0){
+        data.push(obj)
+      }
+    });
+
+    const excelHelper = new ExcelHelper()
+    excelHelper.success = () => {
+      this.$message({
+        message: '下载成功!',
+        type: 'success'
+      });
+      this.show = false;
+    }
+    excelHelper.toExcel({
+      fileName: 'B2C异常数据(仅供参考,请误上传).xlsx',
+      data: data,
+      otherData: {ExcelHead}
+    })
+    
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.upload{
+  width: 100%;
+  display: flex;
+  height: 40px;
+  box-sizing: border-box;
+  align-items: center;
+  justify-content: center;
+  margin-top: 32px;
+  margin-bottom: 8px;
+  .upload-name{
+    height: 32px;
+    width: 400px;
+    border-radius: 5px;
+    background-color: #F7F8FA;
+    box-sizing: border-box;
+    padding: 0 16px;
+    font-size: 14px;
+    color: #333;
+    line-height: 32px;
+  }
+  .upload-btn{
+    height: 32px;
+    width: 70px;
+    background-color: #0581FF;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    color: #FFF;
+    font-size: 14px;
+    border-radius: 5px;
+    margin-left: 8px;
+    cursor: pointer;
+  }
+}
+.upload-module{
+  color: #0581FF;
+  font-size: 14px;
+  text-align: center;
+  width: 100%;
+  cursor: pointer;
+}
+.shop-result{
+  width: 100%;
+  padding-top: 40px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  font-size: 28px;
+  .success{
+    color: #0581FF;
+    padding-right: 24px;
+  }
+  .err{
+    color: #F00;
+    padding-left: 24px;
+  }
+}
+</style>

+ 1 - 0
src/views/oms/B2COrder/components/orderTool.vue

@@ -1,6 +1,7 @@
 <template>
   <div class="order-tool">
     <el-button type="text" @click="handle('loadOrder')">手工下载</el-button>
+    <el-button type="text" @click="handle('importOrder')">导入订单</el-button>
     <!-- <el-dropdown split-button type="text" @click="handle('addOrder')" @command="handleCommand">
       新增订单
       <el-dropdown-menu slot="dropdown">

+ 11 - 2
src/views/oms/B2COrder/index.vue

@@ -100,7 +100,7 @@
       <div class="tool">
         <order-tool @addOrder="addOrder" @smt="smtOrder" @reSmt="reSmt" @loadOrder="loadOrder" @producePurchase="producePurchase" @cancelOrder="cancelOrder" 
         @reCancelOrder="reCancelOrder" @updateRmk="updateRmk" @changeQues="changeQues" @changeNormal="changeNormal" @updateSalesman="updateSalesman" 
-        @updateTag="updateTag" @addGift="addGift" @addProduct="addProduct" @updateFreight="updateFreight" @orderFile="orderFile" @batchSendGoods="batchSendGoods" />
+        @updateTag="updateTag" @addGift="addGift" @addProduct="addProduct" @updateFreight="updateFreight" @orderFile="orderFile" @batchSendGoods="batchSendGoods" @importOrder="importOrder"/>
       </div>
       <div class="table">
         <order-table :data="data" ref="orderTable" class="order-table" @detail="detail" @mergeHandle="mergeHandle" @splitHandle="splitHandle" @sendGoods="sendGoods" 
@@ -151,6 +151,8 @@
       <logisticsInfo ref="logisticsInfo" />
       <!-- 快递发货 -->
       <express-delivery-modal ref="expressDeliveryModal" @handleSuccess="handleSuccess" />
+      <!-- 上传excel -->
+      <ImportExcelModel ref="ImportExcelModel" @handleSuccess="handleSuccess" />
     </div>
   </div>
 </template>
@@ -185,11 +187,12 @@ import carpoolModal from './components/carpoolModal.vue'
 import DeliveryDetail from "./components/deliveryDetail.vue";
 import LogisticsInfo from "./components/logisticsInfo.vue";
 import ExpressDeliveryModal from "./components/expressDeliveryModal.vue";
+import ImportExcelModel from "./components/importExcelModal.vue";
 import { query,getProvince,smt,unSmt,purchaseQty,unCancel,resetQuestion,archive } from '@/api/omsOrder'
 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,SendModeModal,batchbyOneModal,carpoolModal,DeliveryDetail,LogisticsInfo,ExpressDeliveryModal}})
+  TabModal,AddProductModal,FreightModal,LabelsModal,SendModeModal,batchbyOneModal,carpoolModal,DeliveryDetail,LogisticsInfo,ExpressDeliveryModal,ImportExcelModel}})
 export default class Order extends Vue {
   activeNames:Array<any>=['1','statusList']
   radio=''
@@ -468,6 +471,12 @@ export default class Order extends Vue {
     this.getProvince();
     this.getQuestionList();
   }
+  //上传excel
+  importOrder(){
+    if(this.$refs.ImportExcelModel) {
+      (this.$refs.ImportExcelModel as any).setShow(true)
+    }
+  }
   //查看物流
   showLogistics(code:string){
     if(this.$refs.logisticsInfo){

+ 1 - 1
src/views/oms/cargoOwner/index.vue

@@ -39,7 +39,7 @@ export default class CargoOwner extends Vue {
         title:'货主名称',
         field:'wmsMemberName',
         isDetail:true,
-        // width:150
+        width:170
       },{
         title:'WMS系统',
         field:'wmsSys',