Browse Source

订单导入

ymy 1 year ago
parent
commit
ff6af2acdc

+ 2 - 1
.env.development

@@ -11,4 +11,5 @@ VUE_APP_BASE_API = '/prod-api'
 VUE_CLI_BABEL_TRANSPILE_MODULES = true
 
 # 登录地址
-VUE_APP_LOGIN_URL = 'https://sso.benyuntech.com/#/'
+VUE_APP_LOGIN_URL = 'https://sso.benyuntech.com/#/'
+# VUE_APP_LOGIN_URL = 'https://ssotest.benyuntech.com/#/sso/auth'

+ 6 - 3
.env.production

@@ -7,6 +7,9 @@ ENV = 'production'
 # 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://sso.lzlxylsf.com/#/'
+# 开发
+# VUE_APP_LOGIN_URL = 'https://sso.benyuntech.com/#/'
+# 测试
+# VUE_APP_LOGIN_URL = 'https://ssotest.benyuntech.com/#/sso/auth'

File diff suppressed because it is too large
+ 1 - 0
public/static/js/xlsx.full.min.js


+ 10 - 1
src/api/delivery.ts

@@ -67,7 +67,7 @@ export function queryOrderByOrderId(data?:any){
 //取消订单
 export function cancleSendOrder(data?:any){
 	return request({
-		url: '/omsOrder/omsShippingOrder/cancleSendOrder',
+		url: '/omsOrder/omsShippingOrder/cancelSendOrder',
 		method: 'POST',
 		data: data
 	})
@@ -140,4 +140,13 @@ export function WMSAddEntryOrder(data?:any) {
 		method: 'Post',
 		data: data
 	})
+}
+
+//B2C取消发货
+export function cancleWmsTradeOrder(data:any) {
+	return request({
+		url: '/omsOrder/omsShippingOrder/cancelWmsTradeOrder',
+		data:data,
+		method: 'POST'
+	})
 }

+ 21 - 0
src/api/omsOrder.ts

@@ -252,3 +252,24 @@ export function pullRecord(params:any){
 		method: 'GET'
 	})
 }
+
+//Excel导入
+export function importExc(data:any) {
+	return request({
+		url:'/omsOrder/omsOrder/import',
+		method:'post',
+		data:data,
+		headers:{
+      'Content-Type':'application/x-www-form-urlencoded'
+    }
+	})
+}
+
+//下单模版
+export function loadDownModule() {
+	return request({
+		url:'/omsOrder/omsOrder/downTemplate',
+		method:'get',
+		responseType: 'blob'
+	})
+}

+ 531 - 0
src/benyun/utils/excelHelper.js

@@ -0,0 +1,531 @@
+function ExcelHelper () {
+  var WS = {}
+  var titleHeader = []
+  // 初始化数据格式
+  var iniData = (option) => {
+    const data = []
+    if (option && option.otherData && option.otherData.ExcelHead && option.data) {
+      for (var rowIndex = 0; rowIndex < option.data.length; rowIndex++) {
+        const dataItem = {}
+        // option.data[rowIndex]
+        for (var colIndex = 0; colIndex < option.otherData.ExcelHead.length; colIndex++) {
+          dataItem[option.otherData.ExcelHead[colIndex].text] = option.data[rowIndex][option.otherData.ExcelHead[colIndex].value]
+          // dataItem.push(option.data[rowIndex][option.otherData.ExcelHead[colIndex].value])
+        }
+        data.push(dataItem)
+      }
+    }
+    return data
+  }
+
+  /**
+   * 构建excel表头
+   * @param revealList 列表页面展示的表头
+   * @returns {[]} excel表格展示的表头
+   */
+  var buildHeader = (revealList) => {
+    let excelHeader = [];
+    // 构建生成excel表头需要的数据结构
+    getHeader(revealList, excelHeader, 0, 0);
+    // 多行表头长短不一,短的向长的看齐,不够的补上行合并占位符
+    let max = Math.max(...(excelHeader.map(a => a.length)))
+    excelHeader.filter(e => e.length < max).forEach(
+      e => pushRowSpanPlaceHolder(e, max - e.length))
+    return excelHeader;
+  }
+
+  /**
+   * 生成头部 
+   * @param headers 展示的头部
+   * @param excelHeader excel头部
+   * @param deep 深度
+   * @param perOffset 前置偏移量
+   * @returns {number}  后置偏移量
+   */
+  var getHeader = (headers, excelHeader, deep, perOffset) => {
+    let offset = 0
+    let cur = excelHeader[deep]
+    if (!cur) {
+      cur = excelHeader[deep] = []
+    }
+    // 填充行合并占位符
+    pushRowSpanPlaceHolder(cur, perOffset - cur.length)
+    for (let i = 0; i < headers.length; i++) {
+      let head = headers[i]
+      cur.push(head.text)
+      if (head.hasOwnProperty('childHead') && Array.isArray(head.childHead)
+        && head.childHead.length > 0) {
+        let childOffset = getHeader(head.childHead, excelHeader, deep + 1,
+          cur.length - 1)
+        // 填充列合并占位符
+        pushColSpanPlaceHolder(cur, childOffset - 1)
+        offset += childOffset
+      } else {
+        offset++
+      }
+    }
+    return offset;
+
+  }
+
+  /**
+   * 填充行合并占位符
+   * */
+  var pushRowSpanPlaceHolder = (arr, count) => {
+    for (let i = 0; i < count; i++) {
+      arr.push('!$ROW_SPAN_PLACEHOLDER')
+    }
+  }
+
+  // 填充列合并占位符
+  var pushColSpanPlaceHolder = (arr, count) => {
+    for (let i = 0; i < count; i++) {
+      arr.push('!$COL_SPAN_PLACEHOLDER')
+    }
+  }
+
+  /**
+   * 合并头部单元格
+   **/
+  var doMerges = (arr) => {
+    // 要么横向合并 要么纵向合并
+    let deep = arr.length;
+    let merges = [];
+    for (let y = 0; y < deep; y++) {
+      // 先处理横向合并
+      let row = arr[y];
+      let colSpan = 0
+      for (let x = 0; x < row.length; x++) {
+        if (row[x] === '!$COL_SPAN_PLACEHOLDER') {
+          row[x] = undefined;
+          if (x + 1 === row.length) {
+            merges.push({ s: { r: y, c: x - colSpan - 1 }, e: { r: y, c: x } })
+          }
+          colSpan++
+        } else if (colSpan > 0 && x > colSpan) {
+          merges.push({ s: { r: y, c: x - colSpan - 1 }, e: { r: y, c: x - 1 } })
+          colSpan = 0
+        } else {
+          colSpan = 0
+        }
+      }
+    }
+    // 再处理纵向合并
+    let colLength = arr[0].length
+    for (let x = 0; x < colLength; x++) {
+      let rowSpan = 0
+      for (let y = 0; y < deep; y++) {
+        if (arr[y][x] === '!$ROW_SPAN_PLACEHOLDER') {
+          arr[y][x] = undefined;
+          if (y + 1 === deep) {
+            merges.push({ s: { r: y - rowSpan, c: x }, e: { r: y, c: x } })
+          }
+          rowSpan++;
+        } else if (rowSpan > 0 && y > rowSpan) {
+          merges.push({ s: { r: y - rowSpan - 1, c: x }, e: { r: y - 1, c: x } })
+          rowSpan = 0;
+        } else {
+          rowSpan = 0;
+        }
+      }
+    }
+    return merges;
+  }
+
+  /**
+   * 组织数据装载到sheet中
+   */
+  var aoa_to_sheet = (data, headerRows) => {
+    // const ws = {};
+    const range = { s: { c: 10000000, r: 10000000 }, e: { c: 0, r: 0 } };
+    for (let R = 0; R !== data.length; ++R) {
+      for (let C = 0; C !== data[R].length; ++C) {
+        if (range.s.r > R) {
+          range.s.r = R;
+        }
+        if (range.s.c > C) {
+          range.s.c = C;
+        }
+        if (range.e.r < R) {
+          range.e.r = R;
+        }
+        if (range.e.c < C) {
+          range.e.c = C;
+        }
+        /// 这里生成cell的时候,使用上面定义的默认样式
+
+        const cell = {
+          v: data[R][C] || '',
+          s: {
+            font: { name: "宋体", sz: 11, color: { auto: 1 } },
+            alignment: {
+              /// 自动换行
+              wrapText: 1,
+              // 居中
+              horizontal: "left",
+              vertical: "center",
+              indent: 0
+            }
+          }
+        }
+        if (typeof cell.v === 'number') {
+          cell.t = 'n';
+          cell.s.alignment.horizontal = 'right'
+        } else if (typeof cell.v === 'boolean') {
+          cell.t = 'b';
+        } else {
+          cell.t = 's';
+          cell.s.alignment.horizontal = 'left'
+        }
+
+
+        if(titleHeader.length > 0){
+          if (R === 0 ) {
+            // 生成主标题
+            cell.s.font.sz = 24
+            cell.s.font.bold = true
+            cell.s.alignment.horizontal = 'center'
+          } else if (R <= titleHeader.length - 1) {
+            // 生成副标题
+            cell.s.font.sz = 11
+            cell.s.font.bold = true
+            cell.s.alignment.horizontal = 'center'
+          }
+        }else if(R < headerRows){
+          cell.s.alignment.horizontal = 'center'
+          cell.s.font.color = { rgb: '606266' }
+          cell.s.font.bold = true
+          cell.s.border = {
+            top: { style: 'thin', color: { rgb: "000000" } },
+            left: { style: 'thin', color: { rgb: "000000" } },
+            bottom: { style: 'thin', color: { rgb: "000000" } },
+            right: { style: 'thin', color: { rgb: "000000" } },
+          };
+          cell.s.fill = {
+            patternType: 'solid',
+            fgColor: { tint: 0.3999755851924192, rgb: 'ebeef5' },
+            bgColor: { tint: 0.3999755851924192, rgb: 'D9D9D9' }
+          }
+        }
+        
+
+        // 头部列表加边框
+        if (R < titleHeader.length + headerRows - 1 && R >= titleHeader.length) {
+          cell.s.alignment.horizontal = 'center'
+          cell.s.font.color = { rgb: '606266' }
+          cell.s.font.bold = true
+          cell.s.border = {
+            top: { style: 'thin', color: { rgb: "000000" } },
+            left: { style: 'thin', color: { rgb: "000000" } },
+            bottom: { style: 'thin', color: { rgb: "000000" } },
+            right: { style: 'thin', color: { rgb: "000000" } },
+          };
+          cell.s.fill = {
+            patternType: 'solid',
+            fgColor: { tint: 0.3999755851924192, rgb: 'ebeef5' },
+            bgColor: { tint: 0.3999755851924192, rgb: 'D9D9D9' }
+          }
+        } 
+        const cell_ref = XLSX.utils.encode_cell({ c: C, r: R });
+
+        WS[cell_ref] = cell
+      }
+    }
+    if (range.s.c < 10000000) {
+      WS['!ref'] = XLSX.utils.encode_range(range)
+    }
+    return WS
+  }
+
+  var s2ab = (s) => {
+    let buf = new ArrayBuffer(s.length);
+    let view = new Uint8Array(buf);
+    for (let i = 0; i !== s.length; ++i) {
+      view[i] = s.charCodeAt(i) & 0xFF;
+    }
+    return buf;
+  }
+
+  var openDownloadXLSXDialog = (url, saveName) => {
+    if (typeof url == 'object' && url instanceof Blob) {
+      url = URL.createObjectURL(url); // 创建blob地址
+    }
+    var aLink = document.createElement('a');
+    aLink.href = url;
+    aLink.download = saveName || ''; // HTML5新增的属性,指定保存文件名,可以不要后缀,注意,file:///模式下不会生效
+    var event;
+    if (window.MouseEvent) {
+      event = new MouseEvent('click');
+    } else {
+      event = document.createEvent('MouseEvents');
+      event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false,
+        false, false, false, 0, null);
+    }
+    aLink.dispatchEvent(event);
+    this.success()
+  }
+
+  var extractData = (selectionData, revealList) => {
+    // 列
+    let headerList = flat(revealList);
+    // 导出的结果集
+    let excelRows = [];
+    if (!selectionData || selectionData.length < 1) {
+      return excelRows
+    }
+    // 如果有child集合的话会用到
+    let dataKeys = new Set(Object.keys(selectionData[0]));
+    selectionData.some(e => {
+      if (e.childHead && e.childHead.length > 0) {
+        let childKeys = Object.keys(e.childHead[0]);
+        for (let i = 0; i < childKeys.length; i++) {
+          dataKeys.delete(childKeys[i]);
+        }
+        return true;
+      }
+    })
+    flatData(selectionData, (list) => {
+      excelRows.push(...buildExcelRow(dataKeys, headerList, list));
+    })
+    return excelRows;
+  }
+  var flatData = (list, eachDataCallBack) => {
+    let resultList = [];
+    for (let i = 0; i < list.length; i++) {
+      let data = list[i];
+      let rawDataList = [];
+      // 每个子元素都父元素合并成一条数据
+      if (data.childHead && data.childHead.length > 0) {
+        for (let j = 0; j < data.childHead.length; j++) {
+          delete data.childHead[j].bsm
+          let copy = Object.assign({}, data, data.childHead[j]);
+          rawDataList.push(copy);
+          copy['rowSpan'] = (j > 0 ? 0 : data.childHead.length);
+        }
+      } else {
+        data['rowSpan'] = 1;
+        rawDataList.push(data);
+      }
+      resultList.push(...rawDataList);
+      if (typeof eachDataCallBack === 'function') {
+        eachDataCallBack(rawDataList)
+      }
+    }
+    return resultList;
+  }
+
+  var buildExcelRow = (mainKeys, headers, rawDataList) => {
+    // 合计行
+    let sumCols = [];
+    // 数据行
+    let rows = [];
+    for (let i = 0; i < rawDataList.length; i++) {
+      let cols = []
+      let rawData = rawDataList[i];
+      // 提取数据
+      for (let j = 0; j < headers.length; j++) {
+        let header = headers[j];
+        // 父元素键需要行合并
+        if (rawData['rowSpan'] === 0 && mainKeys.has(header.value)) {
+          cols.push('!$ROW_SPAN_PLACEHOLDER')
+        } else {
+          let value;
+          if (typeof header.exeFun === 'function') {
+            value = header.exeFun(rawData);
+          } else {
+            value = rawData[header.value];
+          }
+          cols.push(value)
+          // 如果该列需要合计,并且是数字类型
+          if (header['summable'] && typeof value === 'number') {
+            sumCols[j] = (sumCols[j] ? sumCols[j] : 0) + value;
+          }
+        }
+      }
+      rows.push(cols);
+    }
+    // 如果有合计行
+    if (sumCols.length > 0) {
+      rows.push(...sumRowHandle(sumCols));
+    }
+    return rows;
+  }
+
+  // 合计行
+  var sumRowHandle = (sumCols) => {
+    //TODO
+    return [];
+  }
+
+  // 扁平头部
+  var flat = (revealList) => {
+    let result = []
+    revealList.forEach(e => {
+      if (e.hasOwnProperty('childHead') && e.childHead.length > 0) {
+        result.push(...flat(e.childHead))
+      } else if (e.hasOwnProperty('exeFun')) {
+        result.push(e)
+      } else if (e.hasOwnProperty('text')) {
+        result.push(e)
+      }
+    })
+    return result;
+  }
+
+  // 初始化标题栏
+  var iniTitle = (option, headers) => {
+    var maxColumnSize = headers.length
+    titleHeader = []
+    // 主标题
+    if (option.otherData && option.otherData.ExcelTitle && option.otherData.ExcelTitle.t) {
+      var title = []
+      title.push(option.otherData.ExcelTitle.t)
+      for (var i = 1; i < maxColumnSize; i++) {
+        title.push('!$COL_SPAN_PLACEHOLDER')
+      }
+      titleHeader.push(title)
+    }
+
+    // 副标题
+    if (option.otherData && option.otherData.ExcelTitle && option.otherData.ExcelTitle.multiT) {
+      var t = option.otherData.ExcelTitle.multiT
+      var size = Math.floor(maxColumnSize / 3)
+      for (var i = 0; i < option.otherData.ExcelTitle.multiT.t0.length; i++) {
+        var t = []
+        var e = size
+        if (option.otherData.ExcelTitle.multiT.t0) {
+          t.push(option.otherData.ExcelTitle.multiT.t0[i])
+          for (let i = 1; i < e; i++) {
+            t.push('!$COL_SPAN_PLACEHOLDER')
+          }
+        }
+
+        if (option.otherData.ExcelTitle.multiT.t1) {
+          t.push(option.otherData.ExcelTitle.multiT.t1[i])
+          for (let i = 1; i < e; i++) {
+            t.push('!$COL_SPAN_PLACEHOLDER')
+          }
+        }
+
+        if (option.otherData.ExcelTitle.multiT.t2) {
+          t.push(option.otherData.ExcelTitle.multiT.t2[i])
+          e = maxColumnSize - t.length
+          for (let i = 0; i < e; i++) {
+            t.push('!$COL_SPAN_PLACEHOLDER')
+          }
+        }
+        titleHeader.push(t)
+      }
+    }
+    return titleHeader
+  }
+
+  // 初始化页脚
+  var iniFoot = (option, headers) =>{
+    var maxColumnSize = headers.length
+    var foot = []
+    if (option.otherData && option.otherData.ExcelFoot && option.otherData.ExcelFoot) {
+      var size = Math.floor(maxColumnSize / 3)
+
+      var t = []
+      var e = size
+      if (option.otherData.ExcelFoot.left) {
+        t.push(option.otherData.ExcelFoot.left)
+        for (let i = 1; i < e; i++) {
+          t.push('!$COL_SPAN_PLACEHOLDER')
+        }
+      }
+
+      if (option.otherData.ExcelFoot.center) {
+        t.push(option.otherData.ExcelFoot.center)
+        for (let i = 1; i < e; i++) {
+          t.push('!$COL_SPAN_PLACEHOLDER')
+        }
+      }
+
+      if (option.otherData.ExcelFoot.right) {
+        t.push(option.otherData.ExcelFoot.right)
+        e = maxColumnSize - t.length
+        for (let i = 0; i < e; i++) {
+          t.push('!$COL_SPAN_PLACEHOLDER')
+        }
+      }
+      foot.push(t)
+    }
+    return foot
+  }
+
+  this.toExcel = function (option) {
+    if (!option.sheetName) {
+      option.sheetName = 'Sheet1'
+    }
+
+    iniData(option)
+
+    // excel表头
+    var excelHeader = buildHeader(option.otherData.ExcelHead)
+    var headers = flat(option.otherData.ExcelHead)
+    var foots = iniFoot(option, headers)
+    iniTitle(option, headers)
+    // 头部行数,用来固定表头
+    var headerRows = excelHeader.length
+    if (titleHeader.length > 0) {
+      headerRows++
+    }
+
+    // 提取数据
+    var dataList = extractData(option.data, option.otherData.ExcelHead)
+    // excelHeader.unshift(titleHeader)
+    excelHeader = titleHeader.concat(excelHeader)
+    if (dataList.length > 0) {
+      excelHeader.push(...dataList, [])
+    }
+    if (foots && foots.length>0){
+      excelHeader.push(foots[0])
+    }
+
+    // 计算合并
+    var merges = doMerges(excelHeader)
+    // 生成sheet
+    var ws = aoa_to_sheet(excelHeader, headerRows)
+    // 单元格合并
+    ws['!merges'] = merges
+    // 头部冻结
+    ws["!freeze"] = {
+      xSplit: "1",
+      ySplit: "" + headerRows,
+      topLeftCell: "B" + (headerRows + 1),
+      activePane: "bottomRight",
+      state: "frozen",
+    }
+    // 列宽
+    var columns = []
+    for (var i = 0; i < headers.length; i++) {
+      var n = (headers[i].width ? Number(headers[i].width) : 100)
+
+      columns.push({
+        wpx: Math.ceil(n)
+      })
+    }
+    ws['!cols'] = columns
+    var workbook = {
+      SheetNames: [option.sheetName],
+      Sheets: {}
+    }
+    workbook.Sheets[option.sheetName] = ws
+    // excel样式
+    var wopts = {
+      bookType: 'xlsx',
+      bookSST: false,
+      type: 'binary',
+      cellStyles: true
+    }
+    var wbout = XLSX.write(workbook, wopts)
+    var blob = new Blob([s2ab(wbout)], { type: "application/octet-stream" })
+    openDownloadXLSXDialog(blob, option.fileName)
+  }
+
+  this.success = function(){}
+}
+
+export default ExcelHelper

+ 33 - 8
src/main.ts

@@ -101,11 +101,36 @@ Vue.prototype.selectDictLabels = selectDictLabels
 Vue.prototype.download = download
 Vue.prototype.handleTree = handleTree
 
-new Vue({
-  router,
-  store,
-  render: h => h(App),
-  data: {
-    eventHub: new Vue()
-  }
-}).$mount('#app')
+function importJS() { // 引入 "天地图"
+  return new Promise((resolve) => {
+    const importHandle = (url:String) => {
+      const head = document.getElementsByTagName('head')[0]
+      const script:any = document.createElement('script')
+      script.type = 'text/javascript'
+      script.src = url
+      script.onload = function() {
+        resolve(true)
+      }
+      script.onerror = () => {
+        resolve(false)
+      }
+      head.appendChild(script)
+    }
+
+    // importHandle('http://api.tianditu.gov.cn/api?v=4.0&tk=873e4a15f0f80945cd0ba56f069c19bc')
+    importHandle('/static/js/xlsx.full.min.js')
+
+  })
+}
+
+Promise.all([importJS()]).then(result => {
+  new Vue({
+    router,
+    store,
+    render: h => h(App),
+    data: {
+      eventHub: new Vue()
+    }
+  }).$mount('#app')
+})
+

+ 4 - 4
src/views/audit/store/components/batchbyOneModal.vue

@@ -24,9 +24,9 @@
     <div class="space"></div>
     <div class="deli-footer">
       <div class="d-left">
-        <div class="estimate-total">
+        <!-- <div class="estimate-total">
           订单小计<span class="total">¥{{data[currentOrder] && currentPrice[data[currentOrder].omsOrderIds]?currentPrice[data[currentOrder].omsOrderIds].estimateFreight:'0.00'}}</span> 
-        </div>
+        </div> -->
         <!-- <div class="agreement">
           <el-checkbox v-model="checked">已读并同意《XXX电子运单协议》</el-checkbox>
         </div> -->
@@ -96,8 +96,8 @@ export default class BatchbyOneModal extends Vue {
     this.data = [];
     const requestId =  new Date().getTime() + this.getUuid()
     let obj:any={
-      tmsBusinessMan: (this as any).$store.getters.userInfo.userName,
-      tmsBusinessPhone: (this as any).$store.getters.userInfo.phonenumber,
+      // tmsBusinessMan: (this as any).$store.getters.userInfo.userName,
+      // tmsBusinessPhone: (this as any).$store.getters.userInfo.phonenumber,
       requestId:requestId
     };
     obj.subItem=[];

+ 2 - 2
src/views/audit/store/components/deliveryGoodsInfo.vue

@@ -497,8 +497,8 @@ export default class DeliveryGoodsInfo extends Vue {
     this.$emit('editState',true)
   }
   show(){
-    this.value.tmsBusinessMan = (this as any).$store.getters.userInfo.userName;
-    this.value.tmsBusinessPhone = (this as any).$store.getters.userInfo.phonenumber;
+    // this.value.tmsBusinessMan = (this as any).$store.getters.userInfo.userName;
+    // this.value.tmsBusinessPhone = (this as any).$store.getters.userInfo.phonenumber;
     this.$nextTick(()=>{
       if(this.$refs.form){
         let value = (this.$refs.form as any).getValue();

+ 2 - 1
src/views/oms/B2BOrder/components/addOrder.vue

@@ -1573,7 +1573,8 @@ export default class AddOrder extends Vue {
       this.orderValue.receiverCountryCode = '0';
       this.orderValue.receiverCountry="中国";
       this.load = true;
-      this.orderValue.isCod = this.orderValue.isCod ? 1 : 0
+      this.orderValue.isCod = this.orderValue.isCod ? 1 : 0;
+      this.orderValue.businessType = 'B2B';
       this.orderValue.freeAmount = this.orderValue.freeAmount ? this.orderValue.freeAmount : 0;
       addOrder(this.orderValue).then((res:any) => {
         if(n != 'continue'){

+ 15 - 19
src/views/oms/B2BOrder/components/batchbyOneModal.vue

@@ -24,16 +24,12 @@
     <div class="space"></div>
     <div class="deli-footer">
       <div class="d-left">
-        <div class="estimate-total">
+        <!-- <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> -->
         </div>
-        <!-- <div class="estimate-total">
-          预计总价<span class="total">¥48.00</span>
-        </div> -->
         <div class="agreement">
           <el-checkbox v-model="checked">已读并同意《XXX电子运单协议》</el-checkbox>
-        </div>
+        </div> -->
       </div>
       <div class="btn-box">
         <div class="send-btn" @click="nextBtn" :class="{'stopBtn':stopHandle}" v-if="data.length > 1">确认,下一单</div>
@@ -169,10 +165,10 @@ export default class BatchbyOneModal extends Vue {
     //   this.$message('库存不足!')
     //   return
     // }
-    if(!this.checked){
-      this.$message('请阅读并同意运单协议!')
-      return
-    }
+    // if(!this.checked){
+    //   this.$message('请阅读并同意运单协议!')
+    //   return
+    // }
     if(!this.data[this.currentOrder].tmsShipmentConsignor || !this.data[this.currentOrder].tmsUnloadingAddress || !this.data[this.currentOrder].tmsUnloadingConsignor){
       this.$message("订单信息不完善,请前往编辑!");
       return
@@ -214,14 +210,14 @@ export default class BatchbyOneModal extends Vue {
       this.$message('已经是最后一单!')
       return
     }
-    if(this.stopHandle){
-      this.$message('库存不足!')
-      return
-    }
-    if(!this.checked){
-      this.$message('请阅读并同意运单协议!')
-      return
-    }
+    // if(this.stopHandle){
+    //   this.$message('库存不足!')
+    //   return
+    // }
+    // if(!this.checked){
+    //   this.$message('请阅读并同意运单协议!')
+    //   return
+    // }
     const _value = this.data[this.currentOrder];
     if(!_value.tmsBusinessMan || !_value.tmsBusinessPhone || !_value.tmsShipmentConsignor || !_value.tmsShipmentContacts || !_value.tmsUnloadingConsignor || !_value.tmsUnloadingContacts || !_value.tmsUnloadingProvince || !_value.tmsUnloadingAddress || !_value.storeHouseId){
       this.$message("请编辑订单信息");
@@ -454,7 +450,7 @@ export default class BatchbyOneModal extends Vue {
   padding: 0 16px 8px;
   box-sizing: border-box;
   display: flex;
-  justify-content: space-between;
+  justify-content:space-between;
   align-items:flex-end;
   position: absolute;
   background-color: #FFF;

+ 6 - 7
src/views/oms/B2BOrder/components/carpoolModal.vue

@@ -23,13 +23,12 @@
     <div class="space"></div>
     <div class="deli-footer">
       <div class="d-left">
-        <div class="estimate-total">
+        <!-- <div class="estimate-total">
           预计总价<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>
-        </div>
+        </div> -->
       </div>
       <div class="send-btn" @click="btn">确认发货</div>
     </div>
@@ -152,10 +151,10 @@ export default class CarpoolModal extends Vue {
     //   this.$message('库存不足!')
     //   return
     // }
-    if(!this.checked){
-      this.$message('请阅读并同意运单协议!')
-      return
-    }
+    // if(!this.checked){
+    //   this.$message('请阅读并同意运单协议!')
+    //   return
+    // }
     if(!this.value.tmsBusinessMan || !this.value.tmsBusinessPhone || !this.value.tmsShipmentConsignor || !this.value.tmsShipmentContacts || !this.value.tmsUnloadingConsignor || !this.value.tmsUnloadingContacts || !this.value.tmsUnloadingProvince || !this.value.tmsUnloadingAddress || !this.value.storeHouseId){
       this.$message("请编辑订单信息");
       return

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

@@ -0,0 +1,204 @@
+<template>
+  <vxe-modal v-model="show" id="importExcelFailModel" width="600" height="300" title="B2B发货单导入" @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 { importExc,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;
+    importExc(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','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: arr[dex],
+            width: '200'
+          }
+          ExcelHead.push(excelHeadConfig)
+        }else{
+          obj[arr[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: '(异常)'+this.value.name,
+      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/B2BOrder/components/orderTool.vue

@@ -7,6 +7,7 @@
       </el-dropdown-menu>
     </el-dropdown> -->
     <el-button type="text" @click="handle('addOrder')">新增订单</el-button>
+    <el-button type="text" @click="handle('importOrder')">导入订单</el-button>
     <div class="split"></div>
     <el-dropdown split-button type="text" @click="handle('smt')" @command="handleCommand">
         提交

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

@@ -21,7 +21,7 @@
           <img src="../../../../assets/images/img3.png" />
         </div>
         <div class="moda-title">
-          整车发货
+         合并发货
           <div class="check">
             <i class="el-icon-check"></i>
           </div>

+ 12 - 2
src/views/oms/B2BOrder/index.vue

@@ -100,7 +100,8 @@
       <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 +152,8 @@
       <logisticsInfo ref="logisticsInfo" />
       <!-- 快递发货 -->
       <!-- <express-delivery-modal ref="expressDeliveryModal" @handleSuccess="handleSuccess" /> -->
+      <!-- 上传excel -->
+      <ImportExcelModel ref="ImportExcelModel" @handleSuccess="handleSuccess" />
     </div>
   </div>
 </template>
@@ -185,11 +188,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}})
+  TabModal,AddProductModal,FreightModal,LabelsModal,SendModeModal,batchbyOneModal,carpoolModal,DeliveryDetail,LogisticsInfo,ImportExcelModel}})
 export default class Order extends Vue {
   activeNames:Array<any>=['1','statusList']
   radio=''
@@ -464,6 +468,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){

+ 2 - 1
src/views/oms/B2COrder/components/addOrder.vue

@@ -1573,7 +1573,8 @@ export default class AddOrder extends Vue {
       this.orderValue.receiverCountryCode = '0';
       this.orderValue.receiverCountry="中国";
       this.load = true;
-      this.orderValue.isCod = this.orderValue.isCod ? 1 : 0
+      this.orderValue.isCod = this.orderValue.isCod ? 1 : 0;
+      this.orderValue.businessType = 'B2C';
       this.orderValue.freeAmount = this.orderValue.freeAmount ? this.orderValue.freeAmount : 0;
       addOrder(this.orderValue).then((res:any) => {
         if(n != 'continue'){

+ 24 - 1
src/views/oms/B2COrder/components/deliveryDetail.vue

@@ -91,6 +91,9 @@
           <div class="s-col">WMS取消订单的备注:{{ value.wmsRemark }}</div>
         </div>
       </div>
+      <div class="deli-footer">
+        <div class="send-btn" @click="cancelB2CDelivery">取消发货</div>
+      </div>
     </div>
   </el-drawer>
 </template>
@@ -98,7 +101,7 @@
 <script lang="ts">
 import { Component, Prop, Vue, Watch } from "vue-property-decorator";
 import DeliveryGoodsInfo from "./deliveryGoodsInfo.vue";
-import { queryOrderByOrderId,cancleSendOrder } from  '@/api/delivery'
+import { queryOrderByOrderId,cancleSendOrder,cancleWmsTradeOrder } from  '@/api/delivery'
 @Component({components:{DeliveryGoodsInfo}})
 export default class DeliveryDetail extends Vue {
   drawer=false;
@@ -179,6 +182,26 @@ export default class DeliveryDetail extends Vue {
       this.load = false;
     })
   }
+  cancelB2CDelivery() {
+    this.$confirm('此操作将导致该订单的发货被取消,是否继续?', '提示', {
+      confirmButtonText: '继续',
+      cancelButtonText: '取消',
+      type: 'warning'
+    }).then(() => {
+      this.load = true;
+      cancleWmsTradeOrder({saleOrderCode:this.value.wmsSaleorderCode}).then((res:any) => {
+        this.drawer = false;
+        this.load =false;
+        this.$message({
+          message:'该订单的发货已被取消!',
+          type:'success'
+        })
+        this.$emit('handleSuccess');
+      }).catch(() => {
+        this.load = false;
+      })
+    }).catch(() => {});
+  }
   cancelDelivery(){
     let msg = '';
     if(this.value.shippingType == 'MORE'){

+ 6 - 6
src/views/oms/B2COrder/components/expressDeliveryModal.vue

@@ -77,9 +77,9 @@
         <!-- <div class="estimate-total">
           预计总价<span class="total">¥{{currentPrice.estimateFreight?currentPrice.estimateFreight:'0.00'}}</span> 
         </div> -->
-        <div class="agreement">
+        <!-- <div class="agreement">
           <el-checkbox v-model="checked">已读并同意《XXX电子运单协议》</el-checkbox>
-        </div>
+        </div> -->
       </div>
       <div class="send-btn" @click="btn">确认发货</div>
     </div>
@@ -356,10 +356,10 @@ export default class ExpressDeliveryModal extends Vue {
     //   this.$message('库存不足!')
     //   return
     // }
-    if(!this.checked){
-      this.$message('请阅读并同意运单协议!')
-      return
-    }
+    // if(!this.checked){
+    //   this.$message('请阅读并同意运单协议!')
+    //   return
+    // }
     let params:any=(this as any).$lodash.cloneDeep(this.value);
     params.omsOrderIds=[]
     for(const item of this.data){

+ 2 - 1
vue.config.js

@@ -39,7 +39,8 @@ module.exports = defineConfig({
       // '/prod-api':{
         ws:false,
         target: `http://192.168.2.32`,
-        // target: `http://192.168.2.202:8080`,
+        // target: `http://192.168.2.202`,
+        // target:`https://omstest.benyuntech.com`,
         // target: `http://192.168.1.134:8080`,
         changeOrigin: true,
         // pathRewrite: {

Some files were not shown because too many files changed in this diff