Browse Source

提交箱管

caojunjie 2 years ago
parent
commit
e705f45f3c

+ 26 - 1
src/api/boxManagement/leaseIn/index.js

@@ -66,7 +66,7 @@ export const tradingBoxFees = (ids) => {
 //新增删除
 export function submit(data){
   return request({
-    url:'/api/blade-box-tube/tradingBox/submit',
+    url:'/api/blade-box-tube/tradingBoxRent/submit',
     method:'post',
     data
   })
@@ -88,3 +88,28 @@ export function repealCancel(data) {
     data: data
   })
 }
+
+// 起租退租
+export function statusUpdate(data) {
+  return request({
+    url: '/api/blade-box-tube/tradingBoxRent/startingRent',
+    method: 'post',
+    data:data
+  })
+}
+// 计算
+export function calculateRent(data) {
+  return request({
+    url: '/api/blade-box-tube/tradingBoxRent/rentCalculation',
+    method: 'post',
+    data:data
+  })
+}
+// 撤销计算
+export function revokeRent(data) {
+  return request({
+    url: '/api/blade-box-tube/tradingBoxRent/revokeRentCalculation',
+    method: 'post',
+    data:data
+  })
+}

+ 137 - 30
src/components/boxCost/index.vue

@@ -43,38 +43,143 @@ export default {
     return {
       option: {},
       optionBack: {},
-      boxTube:{
-      align: 'center',
-          index: true,
-          addBtnText: "录入明细",
-          refreshBtn: false,
-          addBtn: true,
-          span: 6,
-          dialogTop: "25%",
-          addRowBtn: false,
-          cellBtn: false,
-          editBtn: false,
-          delBtn: false,
-          menuWidth: 140,
-          dialogDrag: true,
-          dialogWidth: "80%",
-          showSummary: true,
-          sumColumnList: [{
-        name: 'quantity',
-        type: 'sum',
-        decimals: 0
-      },{
-        name: 'amount',
-        type: 'sum',
-        decimals: 2
-      }],
-          column: [{
-        label: '收款对象',
-        prop: 'corpName',
+      leaseIn:{
+        align: 'center',
+        index: true,
+        addBtnText: "录入明细",
+        refreshBtn: false,
+        addBtn: true,
+        selection: true,
+        span: 6,
+        dialogTop: "25%",
+        addRowBtn: false,
+        cellBtn: false,
+        editBtn: false,
+        delBtn: false,
+        menuWidth: 140,
+        dialogDrag: true,
+        dialogWidth: "80%",
+        showSummary: true,
+        sumColumnList: [{
+          name: 'quantity',
+          type: 'sum',
+          decimals: 0
+        }, {
+          name: 'amount',
+          type: 'sum',
+          decimals: 2
+        }],
+        column: [{
+          label: '收款对象',
+          prop: 'corpName',
+          overHidden: true,
+          width: 160
+        }, {
+          label: '箱号',
+        prop: 'code',
+        width: 140,
+        overHidden: true,
+        filterable: true,
+        type: "select",
+        dicUrl: "/api/blade-box-tube/archives/selectArchivesList",
+        props: {
+          label: "code",
+          value: "code"
+        },
+      }, {
+        label: '费用名称',
+        prop: 'itemName',
+        overHidden: true,
+        width: 120
+      }, {
+        label: '币别',
+        prop: 'currency',
+        width: 100,
+        overHidden: true,
+        filterable: true,
+        type: "select",
+        dicUrl: "/api/blade-system/dict-biz/dictionary?code=currency",
+        props: {
+          label: "dictValue",
+          value: "dictKey"
+        },
+      }, {
+        label: '汇率',
+        prop: 'exchangeRate',
+        width: 100,
+        type: 'number',
+        disabled: true,
+        overHidden: true,
+        controls: false,
+        precision: 4
+      }, {
+        label: '单价',
+        prop: 'price',
+        type: 'number',
         overHidden: true,
-        width: 160
+        precision: 2,
+        controls: false,
+        width: 140
+      }, {
+        label: '数量',
+        prop: 'quantity',
+        type: 'number',
+        precision: 0,
+        value: 1,
+        controls: false,
+        overHidden: true,
+        width: 100
       }, {
-        label: '箱号',
+        label: '金额',
+        prop: 'amount',
+        type: 'number',
+        precision: 2,
+        disabled: true,
+        controls: false,
+        overHidden: true,
+        width: 140
+      }, {
+        label: '备注',
+        prop: 'remarks',
+        type: 'textarea',
+        overHidden: true,
+        minRows: 3,
+        span: 24,
+        width: 200
+      }]
+    },
+      boxTube:{
+        align: 'center',
+        index: true,
+        addBtnText: "录入明细",
+        refreshBtn: false,
+        addBtn: true,
+        span: 6,
+        dialogTop: "25%",
+        addRowBtn: false,
+        cellBtn: false,
+        editBtn: false,
+        delBtn: false,
+        menuWidth: 140,
+        dialogDrag: true,
+        dialogWidth: "80%",
+        showSummary: true,
+        sumColumnList: [{
+          name: 'quantity',
+          type: 'sum',
+          decimals: 0
+        }, {
+          name: 'amount',
+          type: 'sum',
+          decimals: 2
+        }],
+        column: [{
+          label: '收款对象',
+          prop: 'corpName',
+          overHidden: true,
+          width: 160
+        }, {
+          label: '箱号',
         prop: 'code',
         width: 140,
         overHidden: true,
@@ -311,6 +416,8 @@ export default {
   async created() {
     if (this.type === 'BG'){
       this.optionBack = this.customsList
+    }else if (this.type === 'ZR' || this.type === 'ZC'){
+      this.optionBack = this.leaseIn
     }else {
       this.optionBack = this.boxTube
     }

+ 46 - 25
src/enums/column-name.js

@@ -1039,31 +1039,52 @@ const columnName = [{
 },{
   code: 244,
   name: '应付分析'
-},{
-  code: 244.1,
-  name: '应付分析-应付明细'
-},{
-  code: 244.2,
-  name: '应付分析-平台明细'
-},{
-  code: 245,
-  name: '箱管理-租入'
-},{
-  code: 246,
-  name: '进口-进口报关'
-},{
-  code: 246.1,
-  name: '进口-进口报关-商品'
-},{
-  code: 246.2,
-  name: '进口-进口报关-集装箱'
-},{
-  code: 246.21,
-  name: '进口-进口报关-单证'
-},{
-  code: 246.3,
-  name: '进口-进口报关-附件'
-}
+}, {
+    code: 244.1,
+    name: '应付分析-应付明细'
+  }, {
+    code: 244.2,
+    name: '应付分析-平台明细'
+  }, {
+    code: 245,
+    name: '箱管理-租入'
+  }, {
+    code: 245.1,
+    name: '租入-明细'
+  }, {
+    code: 245.2,
+    name: '租入-费用'
+  }, {
+    code: 245.3,
+    name: '租入-附件'
+  }, {
+    code: 246,
+    name: '进口-进口报关'
+  }, {
+    code: 246.1,
+    name: '进口-进口报关-商品'
+  }, {
+    code: 246.2,
+    name: '进口-进口报关-集装箱'
+  }, {
+    code: 246.21,
+    name: '进口-进口报关-单证'
+  }, {
+    code: 246.3,
+    name: '进口-进口报关-附件'
+  }, {
+    code: 247,
+    name: '箱管理-租入'
+  }, {
+    code: 247.1,
+    name: '租入-明细'
+  }, {
+    code: 247.2,
+    name: '租入-费用'
+  }, {
+    code: 247.3,
+    name: '租入-附件'
+  }
 ]
 export const getColumnName = (key) => {
   for (let index = 0; index < columnName.length; index++) {

+ 26 - 2
src/views/boxManagement/boxRepair/index.vue

@@ -31,7 +31,7 @@
         <template slot-scope="{type,size,row,$index}" slot="menuLeft">
           <el-button icon="el-icon-plus" type="primary" :size="size" @click="detailsOpen = true">创建单据</el-button>
           <el-button class="el-icon-document-copy" type="success" size="small">复制单据</el-button>
-          <el-button class="el-icon-download" type="warning" size="small">导出</el-button>
+          <el-button class="el-icon-download" type="warning" size="small" @click="outExport">导出</el-button>
         </template>
       </avue-crud>
     </basic-container>
@@ -42,6 +42,7 @@
 <script>
 import {getList, remove} from "@/api/boxManagement/boxRepair/index.js";
 import detailsPage from "./detailsPage"
+import {getToken} from "@/util/auth";
 
 export default {
   name: "index",
@@ -207,7 +208,30 @@ export default {
         this.loading = false
       })
     },
-
+    outExport() {
+      let config = {params: {...this.search}}
+      if (config.params) {
+        for (const propName of Object.keys(config.params)) {
+          const value = config.params[propName];
+          if (value !== null && typeof (value) !== "undefined") {
+            if (value instanceof Array) {
+              for (const key of Object.keys(value)) {
+                let params = propName + '[' + key + ']';
+                config.params[params] = value[key]
+              }
+              delete config.params[propName]
+            }
+          }
+        }
+      }
+      const routeData = this.$router.resolve({
+        path: '/api/blade-box-tube/repair/exportRepairOut',      //跳转目标窗口的地址
+        query: {
+          ...config.params    //括号内是要传递给新窗口的参数
+        }
+      })
+      window.open(routeData.href.slice(1, routeData.href.length) + '&' + `${this.website.tokenHeader}=${getToken()}`);
+    },
 //自定义列保存
     async saveColumnTwo(ref, option, optionBack, code) {
       /**

+ 26 - 2
src/views/boxManagement/boxWashing/index.vue

@@ -31,7 +31,7 @@
         <template slot-scope="{type,size,row,$index}" slot="menuLeft">
           <el-button icon="el-icon-plus" type="primary" :size="size" @click="detailsOpen = true">创建单据</el-button>
           <el-button class="el-icon-document-copy" type="success" size="small">复制单据</el-button>
-          <el-button class="el-icon-download" type="warning" size="small">导出</el-button>
+          <el-button class="el-icon-download" type="warning" size="small" @click="outExport">导出</el-button>
         </template>
       </avue-crud>
     </basic-container>
@@ -42,6 +42,7 @@
 <script>
 import {getList, remove} from "@/api/boxManagement/boxRepair/index.js";
 import detailsPage from "./detailsPage"
+import {getToken} from "@/util/auth";
 
 export default {
   name: "index",
@@ -207,7 +208,30 @@ export default {
         this.loading = false
       })
     },
-
+    outExport() {
+      let config = {params: {...this.search}}
+      if (config.params) {
+        for (const propName of Object.keys(config.params)) {
+          const value = config.params[propName];
+          if (value !== null && typeof (value) !== "undefined") {
+            if (value instanceof Array) {
+              for (const key of Object.keys(value)) {
+                let params = propName + '[' + key + ']';
+                config.params[params] = value[key]
+              }
+              delete config.params[propName]
+            }
+          }
+        }
+      }
+      const routeData = this.$router.resolve({
+        path: '/api/blade-box-tube/repair/exportRepairOut',      //跳转目标窗口的地址
+        query: {
+          ...config.params    //括号内是要传递给新窗口的参数
+        }
+      })
+      window.open(routeData.href.slice(1, routeData.href.length) + '&' + `${this.website.tokenHeader}=${getToken()}`);
+    },
 //自定义列保存
     async saveColumnTwo(ref, option, optionBack, code) {
       /**

+ 82 - 5
src/views/boxManagement/buyContainer/detailsPage.vue

@@ -62,10 +62,15 @@
         <template slot="addressForm" slot-scope="scope">
           <port-info v-model="formTwo.addressId" type="id" :disabled="scope.disabled" @balabalaTow="balabala"/>
         </template>
-<!--        <template slot="boxMakingCompanyForm" slot-scope="scope">-->
-<!--          <crop-select v-model="formTwo.boxMakingCompanyId" :disabled="scope.disabled" :refresh="false"-->
-<!--                       @getCorpData="(row)=>{getGSData(row,['formTwo','boxMakingCompany'])}" corpType="GS"/>-->
-<!--        </template>-->
+        <!--        <template slot="boxMakingCompanyForm" slot-scope="scope">-->
+        <!--          <crop-select v-model="formTwo.boxMakingCompanyId" :disabled="scope.disabled" :refresh="false"-->
+        <!--                       @getCorpData="(row)=>{getGSData(row,['formTwo','boxMakingCompany'])}" corpType="GS"/>-->
+        <!--        </template>-->
+        <template slot="menuLeft" slot-scope="scope">
+          <el-button :disabled="option.disabled" type="success" size="small" icon="el-icon-bottom" @click="importBox">
+            导入
+          </el-button>
+        </template>
       </avue-crud>
     </trade-card>
 <!--    费用信息组件-->
@@ -80,6 +85,20 @@
           display
       />
     </trade-card>
+    <el-dialog title="导入箱档案" append-to-body :visible.sync="excelBox" width="555px" :close-on-click-modal="false"
+               v-dialog-drag>
+      <avue-form :option="excelOption" v-model="excelForm" table-loading="excelLoading"
+                 :upload-before="uploadBefore" :upload-after="uploadAfter">
+        <template slot="excelTemplate">
+          <el-button type="primary" @click="derivation">
+            点击下载<i class="el-icon-download el-icon--right"></i>
+          </el-button>
+        </template>
+      </avue-form>
+      <p style="text-align: center;color: #DC0505">
+        温馨提示 第一次导入时请先下载模板
+      </p>
+    </el-dialog>
     <el-dialog
         append-to-body
         title="审批进度"
@@ -114,6 +133,7 @@ import {
 
 import checkSchedule from "@/components/check/checkSchedule";
 import {selectByName} from "@/api/boxManagement";
+import {getToken} from "@/util/auth";
 export default {
   name: "detailsPage",
   props: {
@@ -124,6 +144,33 @@ export default {
   data() {
     return {
       key: 0,
+      excelBox: false,
+      excelOption: {
+        submitBtn: false,
+        emptyBtn: false,
+        column: [
+          {
+            label: "模板下载",
+            prop: "excelTemplate",
+            formslot: true,
+            span: 24
+          },
+          {
+            label: "模板上传",
+            prop: "excelFile",
+            type: "upload",
+            drag: true,
+            loadText: "模板上传中,请稍等",
+            span: 24,
+            propsHttp: {
+              res: "data"
+            },
+            tip: "请上传 .xls,.xlsx 标准格式文件",
+            action: "/api/blade-box-tube/tradingBoxRent/import-tradingBox-info"
+          }
+        ]
+      },
+      excelForm: {},
       checkScheduleDialog: false,
       checkId: '',
       batchNo: '',
@@ -508,6 +555,36 @@ export default {
     }
   },
   methods: {
+    importBox() {
+      this.findObject(this.excelOption.column, "excelFile").data = {
+        corpId: this.form.purchaseCompanyId,
+        corpName: this.form.purchaseCompanyName,
+        billType: "BUY"
+      }
+      this.excelBox = true
+    },
+    uploadBefore(file, done, loading) {
+      loading = true;
+      done();
+    },
+    uploadAfter(res, done, loading, column) {
+      this.excelBox = false;
+      for (let item of this.dataList) {
+        for (let li of res.tradingBoxItemList) {
+          if (item.code === li.code) {
+            return this.$message.error(`箱号:${item.code}重复!`);
+          }
+        }
+      }
+      this.dataList = this.dataList.concat(res.tradingBoxItemList)
+      this.dataListTwo = this.dataListTwo.concat(res.tradingBoxFeesList)
+      this.$message.success("导入成功!");
+      loading = false;
+      done();
+    },
+    derivation() {
+      window.open(`/api/blade-box-tube/tradingBoxRent/export-tradingBox-info?${this.website.tokenHeader}=${getToken()}`);
+    },
     confirmEdit() {
       if (this.form.status > 0) {
         //基础资料
@@ -517,7 +594,7 @@ export default {
         this.$set(this.option, "addBtn", false)
         this.$set(this.option, "menu", false)
         //费用信息
-        this.$set(this.$refs.boxCost.option,"disabled",true)
+        this.$set(this.$refs.boxCost.option, "disabled", true)
         this.$set(this.$refs.boxCost.option,"addBtn",false)
         this.$set(this.$refs.boxCost.option,"menu",false)
         //附件和顶部按钮

+ 26 - 2
src/views/boxManagement/buyContainer/index.vue

@@ -30,7 +30,7 @@
         <template slot-scope="{type,size,row,$index}" slot="menuLeft">
           <el-button icon="el-icon-plus" type="primary" :size="size" @click="detailsOpen = true">创建单据</el-button>
           <el-button class="el-icon-document-copy" type="success" size="small">复制单据</el-button>
-          <el-button class="el-icon-download" type="warning" size="small">导出</el-button>
+          <el-button class="el-icon-download" type="warning" size="small" @click="outExport">导出</el-button>
         </template>
       </avue-crud>
     </basic-container>
@@ -41,6 +41,7 @@
 <script>
 import {getList, remove} from "@/api/boxManagement/buyContainer/index.js";
 import detailsPage from "./detailsPage"
+import {getToken} from "@/util/auth";
 
 export default {
   name: "index",
@@ -209,7 +210,30 @@ export default {
         this.loading = false
       })
     },
-
+    outExport() {
+      let config = {params: {...this.search}}
+      if (config.params) {
+        for (const propName of Object.keys(config.params)) {
+          const value = config.params[propName];
+          if (value !== null && typeof (value) !== "undefined") {
+            if (value instanceof Array) {
+              for (const key of Object.keys(value)) {
+                let params = propName + '[' + key + ']';
+                config.params[params] = value[key]
+              }
+              delete config.params[propName]
+            }
+          }
+        }
+      }
+      const routeData = this.$router.resolve({
+        path: '/api/blade-box-tube/tradingBox/exportTradingBoxOut',      //跳转目标窗口的地址
+        query: {
+          ...config.params    //括号内是要传递给新窗口的参数
+        }
+      })
+      window.open(routeData.href.slice(1, routeData.href.length) + '&' + `${this.website.tokenHeader}=${getToken()}`);
+    },
 //自定义列保存
     async saveColumnTwo(ref, option, optionBack, code) {
       /**

+ 74 - 2
src/views/boxManagement/exportShipment/detailsPage.vue

@@ -77,8 +77,8 @@
           </el-button>
         </template>
         <template slot="menuLeft" slot-scope="scope">
-
-          <el-button type="success" size="small" :disabled="option.disabled" @click="importBox">导入</el-button>
+          <el-button type="success" size="small" :disabled="option.disabled" @click="importBox">提取</el-button>
+          <el-button :disabled="option.disabled" type="success" size="small" icon="el-icon-bottom" @click="importBoxTwo">导入</el-button>
           <el-dropdown>
             <el-button type="primary" size="small" :disabled="selectionList.length === 0 || option.disabled">
               起运港<i class="el-icon-arrow-down el-icon--right"></i>
@@ -140,6 +140,20 @@
           @choceScheduleFun="choceScheduleFun"
       ></check-schedule>
     </el-dialog>
+    <el-dialog title="导入箱档案" append-to-body :visible.sync="excelBox" width="555px" :close-on-click-modal="false"
+               v-dialog-drag>
+      <avue-form :option="excelOption" v-model="excelForm" table-loading="excelLoading"
+                 :upload-before="uploadBefore" :upload-after="uploadAfter">
+        <template slot="excelTemplate">
+          <el-button type="primary" @click="derivation">
+            点击下载<i class="el-icon-download el-icon--right"></i>
+          </el-button>
+        </template>
+      </avue-form>
+      <p style="text-align: center;color: #DC0505">
+        温馨提示 第一次导入时请先下载模板
+      </p>
+    </el-dialog>
     <el-dialog
         title="导入箱信息"
         :visible.sync="importOpen"
@@ -224,6 +238,7 @@ import checkSchedule from "@/components/check/checkSchedule";
 import {selectByName} from "@/api/boxManagement";
 import {selectArchivesList} from "@/api/boxManagement/buyContainer";
 import {dateFormat} from "@/util/date";
+import {getToken} from "@/util/auth";
 
 export default {
   name: "detailsPage",
@@ -234,6 +249,33 @@ export default {
   components: {checkSchedule},
   data() {
     return {
+      excelBox: false,
+      excelOption: {
+        submitBtn: false,
+        emptyBtn: false,
+        column: [
+          {
+            label: "模板下载",
+            prop: "excelTemplate",
+            formslot: true,
+            span: 24
+          },
+          {
+            label: "模板上传",
+            prop: "excelFile",
+            type: "upload",
+            drag: true,
+            loadText: "模板上传中,请稍等",
+            span: 24,
+            propsHttp: {
+              res: "data"
+            },
+            tip: "请上传 .xls,.xlsx 标准格式文件",
+            action: "/api/blade-box-tube/transport/import-transport-info"
+          }
+        ]
+      },
+      excelForm: {},
       key: 0,
       importList: [],
       title: '',
@@ -755,6 +797,36 @@ export default {
     importBox() {
       this.importOpen = true
     },
+    derivation() {
+      window.open(`/api/blade-box-tube/transport/export-transport-info?${this.website.tokenHeader}=${getToken()}`);
+    },
+    importBoxTwo() {
+      this.findObject(this.excelOption.column, "excelFile").data = {
+        corpId: this.form.corpId,
+        corpName: this.form.corpName,
+        billType: "CKZY"
+      }
+      this.excelBox = true
+    },
+    uploadBefore(file, done, loading) {
+      loading = true;
+      done();
+    },
+    uploadAfter(res, done, loading, column) {
+      this.excelBox = false;
+      for (let item of this.dataList) {
+        for (let li of res.transportItemList) {
+          if (item.code === li.code) {
+            return this.$message.error(`箱号:${item.code}重复!`);
+          }
+        }
+      }
+      this.dataList = this.dataList.concat(res.transportItemList)
+      this.dataListTwo = this.dataListTwo.concat(res.transportItemFeesList)
+      this.$message.success("导入成功!");
+      loading = false;
+      done();
+    },
     //确认导入箱信息
     confirmImport() {
       this.importOpen = false

+ 26 - 2
src/views/boxManagement/exportShipment/index.vue

@@ -42,7 +42,7 @@
         <template slot-scope="{type,size,row,$index}" slot="menuLeft">
           <el-button icon="el-icon-plus" type="primary" :size="size" @click="detailsOpen = true">创建单据</el-button>
           <el-button class="el-icon-document-copy" type="success" size="small">复制单据</el-button>
-          <el-button class="el-icon-download" type="warning" size="small">导出</el-button>
+          <el-button class="el-icon-download" type="warning" size="small" @click="outExport">导出</el-button>
         </template>
       </avue-crud>
     </basic-container>
@@ -53,6 +53,7 @@
 <script>
 import {getList, remove} from "@/api/boxManagement/exportShipment/index.js";
 import detailsPage from "./detailsPage"
+import {getToken} from "@/util/auth";
 
 export default {
   name: "index",
@@ -305,7 +306,30 @@ export default {
         this.loading = false
       })
     },
-
+    outExport() {
+      let config = {params: {...this.search}}
+      if (config.params) {
+        for (const propName of Object.keys(config.params)) {
+          const value = config.params[propName];
+          if (value !== null && typeof (value) !== "undefined") {
+            if (value instanceof Array) {
+              for (const key of Object.keys(value)) {
+                let params = propName + '[' + key + ']';
+                config.params[params] = value[key]
+              }
+              delete config.params[propName]
+            }
+          }
+        }
+      }
+      const routeData = this.$router.resolve({
+        path: '/api/blade-box-tube/transport/exportTransportOut',      //跳转目标窗口的地址
+        query: {
+          ...config.params    //括号内是要传递给新窗口的参数
+        }
+      })
+      window.open(routeData.href.slice(1, routeData.href.length) + '&' + `${this.website.tokenHeader}=${getToken()}`);
+    },
 //自定义列保存
     async saveColumnTwo(ref, option, optionBack, code) {
       /**

+ 74 - 2
src/views/boxManagement/importReturnTrip/detailsPage.vue

@@ -76,8 +76,8 @@
           </el-button>
         </template>
         <template slot="menuLeft" slot-scope="scope">
-
-          <el-button type="success" size="small" :disabled="option.disabled" @click="importBox">导入</el-button>
+          <el-button type="success" size="small" :disabled="option.disabled" @click="importBox">提取</el-button>
+          <el-button :disabled="option.disabled" type="success" size="small" icon="el-icon-bottom" @click="importBoxTwo">导入</el-button>
           <el-dropdown>
             <el-button type="primary" size="small" :disabled="selectionList.length === 0 || option.disabled">
               起运港<i class="el-icon-arrow-down el-icon--right"></i>
@@ -139,6 +139,20 @@
           @choceScheduleFun="choceScheduleFun"
       ></check-schedule>
     </el-dialog>
+    <el-dialog title="导入箱档案" append-to-body :visible.sync="excelBox" width="555px" :close-on-click-modal="false"
+               v-dialog-drag>
+      <avue-form :option="excelOption" v-model="excelForm" table-loading="excelLoading"
+                 :upload-before="uploadBefore" :upload-after="uploadAfter">
+        <template slot="excelTemplate">
+          <el-button type="primary" @click="derivation">
+            点击下载<i class="el-icon-download el-icon--right"></i>
+          </el-button>
+        </template>
+      </avue-form>
+      <p style="text-align: center;color: #DC0505">
+        温馨提示 第一次导入时请先下载模板
+      </p>
+    </el-dialog>
     <el-dialog
         title="导入箱信息"
         :visible.sync="importOpen"
@@ -223,6 +237,7 @@ import checkSchedule from "@/components/check/checkSchedule";
 import {selectByName} from "@/api/boxManagement";
 import {selectArchivesList} from "@/api/boxManagement/buyContainer";
 import {dateFormat} from "@/util/date";
+import {getToken} from "@/util/auth";
 
 export default {
   name: "detailsPage",
@@ -233,6 +248,33 @@ export default {
   components: {checkSchedule},
   data() {
     return {
+      excelBox: false,
+      excelOption: {
+        submitBtn: false,
+        emptyBtn: false,
+        column: [
+          {
+            label: "模板下载",
+            prop: "excelTemplate",
+            formslot: true,
+            span: 24
+          },
+          {
+            label: "模板上传",
+            prop: "excelFile",
+            type: "upload",
+            drag: true,
+            loadText: "模板上传中,请稍等",
+            span: 24,
+            propsHttp: {
+              res: "data"
+            },
+            tip: "请上传 .xls,.xlsx 标准格式文件",
+            action: "/api/blade-box-tube/transport/import-transport-info"
+          }
+        ]
+      },
+      excelForm: {},
       key: 0,
       importList: [],
       title: '',
@@ -759,6 +801,36 @@ export default {
     importBox() {
       this.importOpen = true
     },
+    derivation() {
+      window.open(`/api/blade-box-tube/transport/export-transport-info?${this.website.tokenHeader}=${getToken()}`);
+    },
+    importBoxTwo() {
+      this.findObject(this.excelOption.column, "excelFile").data = {
+        corpId: this.form.corpId,
+        corpName: this.form.corpName,
+        billType: "JKFC"
+      }
+      this.excelBox = true
+    },
+    uploadBefore(file, done, loading) {
+      loading = true;
+      done();
+    },
+    uploadAfter(res, done, loading, column) {
+      this.excelBox = false;
+      for (let item of this.dataList) {
+        for (let li of res.transportItemList) {
+          if (item.code === li.code) {
+            return this.$message.error(`箱号:${item.code}重复!`);
+          }
+        }
+      }
+      this.dataList = this.dataList.concat(res.transportItemList)
+      this.dataListTwo = this.dataListTwo.concat(res.transportItemFeesList)
+      this.$message.success("导入成功!");
+      loading = false;
+      done();
+    },
     //确认导入箱信息
     confirmImport() {
       this.importOpen = false

+ 26 - 2
src/views/boxManagement/importReturnTrip/index.vue

@@ -42,7 +42,7 @@
         <template slot-scope="{type,size,row,$index}" slot="menuLeft">
           <el-button icon="el-icon-plus" type="primary" :size="size" @click="detailsOpen = true">创建单据</el-button>
           <el-button class="el-icon-document-copy" type="success" size="small">复制单据</el-button>
-          <el-button class="el-icon-download" type="warning" size="small">导出</el-button>
+          <el-button class="el-icon-download" type="warning" size="small" @click="outExport">导出</el-button>
         </template>
       </avue-crud>
     </basic-container>
@@ -53,6 +53,7 @@
 <script>
 import {getList, remove} from "@/api/boxManagement/exportShipment/index.js";
 import detailsPage from "./detailsPage"
+import {getToken} from "@/util/auth";
 
 export default {
   name: "index",
@@ -305,7 +306,30 @@ export default {
         this.loading = false
       })
     },
-
+    outExport() {
+      let config = {params: {...this.search}}
+      if (config.params) {
+        for (const propName of Object.keys(config.params)) {
+          const value = config.params[propName];
+          if (value !== null && typeof (value) !== "undefined") {
+            if (value instanceof Array) {
+              for (const key of Object.keys(value)) {
+                let params = propName + '[' + key + ']';
+                config.params[params] = value[key]
+              }
+              delete config.params[propName]
+            }
+          }
+        }
+      }
+      const routeData = this.$router.resolve({
+        path: '/api/blade-box-tube/transport/exportTransportOut',      //跳转目标窗口的地址
+        query: {
+          ...config.params    //括号内是要传递给新窗口的参数
+        }
+      })
+      window.open(routeData.href.slice(1, routeData.href.length) + '&' + `${this.website.tokenHeader}=${getToken()}`);
+    },
 //自定义列保存
     async saveColumnTwo(ref, option, optionBack, code) {
       /**

+ 314 - 76
src/views/boxManagement/leaseIn/detailsPage.vue

@@ -49,38 +49,90 @@
           :upload-delete="uploadDelete"
           @row-save="rowSave"
           @row-update="rowUpdate"
-          @resetColumn="resetColumnTwo('crud','option','optionBack',235.1)"
-          @saveColumn="saveColumnTwo('crud','option','optionBack',235.1)">
+          @selection-change="selectionChange"
+          @resetColumn="resetColumnTwo('crud','option','optionBack',245.1)"
+          @saveColumn="saveColumnTwo('crud','option','optionBack',245.1)">
         <template slot-scope="{type,size,row,index,disabled}" slot="menu">
           <el-button icon="el-icon-edit" :size="size" :disabled="disabled" :type="type"
                      @click="$refs.crud.rowEdit(row,index)">编辑
           </el-button>
-          <el-button icon="el-icon-delete" :size="size" :disabled="disabled" :type="type"
+          <el-button icon="el-icon-delete" :size="size" :disabled="disabled || row.count > 0" :type="type"
                      @click="rowDel(row,index,'MX')">删除
           </el-button>
         </template>
         <template slot="addressForm" slot-scope="scope">
           <port-info v-model="formTwo.addressId" type="id" :disabled="scope.disabled" @balabalaTow="balabala"/>
         </template>
-<!--        <template slot="boxMakingCompanyForm" slot-scope="scope">-->
-<!--          <crop-select v-model="formTwo.boxMakingCompanyId" :disabled="scope.disabled" :refresh="false"-->
-<!--                       @getCorpData="(row)=>{getGSData(row,['formTwo','boxMakingCompany'])}" corpType="GS"/>-->
-<!--        </template>-->
+        <!--        <template slot="boxMakingCompanyForm" slot-scope="scope">-->
+        <!--          <crop-select v-model="formTwo.boxMakingCompanyId" :disabled="scope.disabled" :refresh="false"-->
+        <!--                       @getCorpData="(row)=>{getGSData(row,['formTwo','boxMakingCompany'])}" corpType="GS"/>-->
+        <!--        </template>-->
+        <template slot="menuLeft" slot-scope="scope">
+          <el-button :disabled="selectionList.length === 0 || option.disabled || (selectionList.findIndex(function(item){return item.status == '待使用'}) == -1?false:true)" type="primary" size="small"
+                     @click="statusUpdate('0','起租')">起租
+          </el-button>
+          <el-button :disabled="selectionList.length === 0 || option.disabled || (selectionList.findIndex(function(item){return item.status == '退租'}) == -1?false:true)" type="primary" size="small"
+                     @click="statusUpdate('1','退租')">退租
+          </el-button>
+          <el-button :disabled="selectionList.length === 0 || option.disabled || (selectionList.findIndex(function(item){return item.status == '退租'}) == -1?false:true)" type="primary" size="small"
+                     @click="statusUpdate('2','计算租金')">计算租金
+          </el-button>
+          <el-button :disabled="selectionList.length === 0 || option.disabled || (selectionList.findIndex(function(item){return item.status == '退租'}) == -1?false:true)" type="primary" size="small"
+                     @click="statusUpdate('3','撤销租金')">撤销租金
+          </el-button>
+          <el-button :disabled="option.disabled" type="success" size="small" icon="el-icon-bottom" @click="excelBox = true">导入</el-button>
+        </template>
       </avue-crud>
     </trade-card>
 <!--    费用信息组件-->
-    <box-cost v-model="dataListTwo" activeName="second" ref="boxCost" @resetTrigger="resetTrigger"></box-cost>
+    <box-cost v-model="dataListTwo" activeName="second" :codeValue="245.2" ref="boxCost"
+              @resetTrigger="resetTrigger"></box-cost>
     <trade-card title="附件明细">
       <c-upload
           basic
           :data="tradingBoxFilesList"
           :disabled="disabled"
           deleteUrl="/api/blade-box-tube/tradingBoxFiles/remove"
-          :enumerationValue="235.3"
+          :enumerationValue="245.3"
           display
       />
     </trade-card>
     <el-dialog
+        :title="title"
+        :visible.sync="dialogVisible"
+        :append-to-body="true"
+        :destroy-on-close="true"
+        :close-on-click-modal="false"
+        v-if="dialogVisible"
+        width="60%">
+            <span>
+              <avue-form :option="optionState" v-model="formState" ref="formState">
+                <template slot="addressId" slot-scope="scope">
+                  <port-info v-model="formState.addressId" type="id" :disabled="scope.disabled"
+                             @balabalaTow="(val)=>{balabala(val,['formState','address'])}"/>
+                </template>
+              </avue-form>
+            </span>
+      <span slot="footer" class="dialog-footer">
+              <el-button @click="dialogVisible = false">取 消</el-button>
+              <el-button type="primary" :disabled="disabledVisible" @click="confirmChange">确 定</el-button>
+            </span>
+    </el-dialog>
+    <el-dialog title="导入箱档案" append-to-body :visible.sync="excelBox" width="555px" :close-on-click-modal="false"
+               v-dialog-drag>
+      <avue-form :option="excelOption" v-model="excelForm" table-loading="excelLoading"
+                 :upload-before="uploadBefore" :upload-after="uploadAfter">
+        <template slot="excelTemplate">
+          <el-button type="primary" @click="derivation">
+            点击下载<i class="el-icon-download el-icon--right"></i>
+          </el-button>
+        </template>
+      </avue-form>
+      <p style="text-align: center;color: #DC0505">
+        温馨提示 第一次导入时请先下载模板
+      </p>
+    </el-dialog>
+    <el-dialog
         append-to-body
         title="审批进度"
         class="el-dialogDeep"
@@ -109,11 +161,13 @@ import {
   tradingBoxItem,
   tradingBoxFees,
   pleaseCheck,
-  repealCancel
+  repealCancel,
+  statusUpdate, calculateRent, revokeRent
 } from "@/api/boxManagement/leaseIn/index.js";
 
 import checkSchedule from "@/components/check/checkSchedule";
 import {selectByName} from "@/api/boxManagement";
+import {getToken} from "@/util/auth";
 export default {
   name: "detailsPage",
   props: {
@@ -123,6 +177,105 @@ export default {
   components:{checkSchedule},
   data() {
     return {
+      excelOption: {
+        submitBtn: false,
+        emptyBtn: false,
+        column: [
+          {
+            label: "模板下载",
+            prop: "excelTemplate",
+            formslot: true,
+            span: 24
+          },
+          {
+            label: "模板上传",
+            prop: "excelFile",
+            type: "upload",
+            drag: true,
+            loadText: "模板上传中,请稍等",
+            span: 24,
+            propsHttp: {
+              res: "data"
+            },
+            tip: "请上传 .xls,.xlsx 标准格式文件",
+            action: "/api/blade-box-tube/tradingBoxRent/import-tradingBox-info"
+          }
+        ]
+      },
+      excelForm:{},
+      title: '',
+      dialogVisible: false,
+      excelBox: false,
+      formSearch: {},
+      optionState: {},
+      formState: {},
+      selectionList: [],
+      optionStateTwo: {
+        menuBtn: false,
+        span: 24,
+        column: [{
+          label: '起租日期',
+          prop: 'rentDate',
+          width: 100,
+          search: true,
+          overHidden: true,
+          type: "date",
+          format: "yyyy-MM-dd",
+          valueFormat: "yyyy-MM-dd HH:mm:ss",
+          rules: [{
+            required: true,
+            message: " ",
+            trigger: "blur"
+          }]
+        }]
+      },
+      optionStateFour: {
+        menuBtn: false,
+        span: 24,
+        column: [{
+          label: '日期',
+          prop: 'rentCalculationDateList',
+          width: 100,
+          search: true,
+          overHidden: true,
+          type: "daterange",
+          format: "yyyy-MM-dd",
+          valueFormat: "yyyy-MM-dd HH:mm:ss",
+          defaultTime: ["00:00:00", "23:59:59"],
+          rules: [{
+            required: true,
+            message: " ",
+            trigger: "blur"
+          }]
+        }]
+      },
+      optionStateThree: {
+        menuBtn: false,
+        span: 12,
+        column: [{
+          label: '地点',
+          prop: 'addressId',
+          rules: [{
+            required: true,
+            message: " ",
+            trigger: "blur"
+          }]
+        }, {
+          label: '退租日期',
+          prop: 'rentDate',
+          width: 100,
+          search: true,
+          overHidden: true,
+          type: "date",
+          format: "yyyy-MM-dd",
+          valueFormat: "yyyy-MM-dd HH:mm:ss",
+          rules: [{
+            required: true,
+            message: " ",
+            trigger: "blur"
+          }]
+        }]
+      },
       key: 0,
       checkScheduleDialog: false,
       checkId: '',
@@ -211,6 +364,7 @@ export default {
         refreshBtn: false,
         addBtn: true,
         span: 8,
+        selection: true,
         addRowBtn: false,
         cellBtn: false,
         editBtn: false,
@@ -249,15 +403,15 @@ export default {
           prop: 'code',
           width: 100,
           overHidden: true,
-          filterable: true,
-          remote: true,
-          allowCreate: true,
-          type: "select",
-          dicUrl: "/api/blade-box-tube/archives/selectArchivesList?size=10&current=1&code={{key}}",
-          props: {
-            label: "code",
-            value: "code"
-          },
+          // filterable: true,
+          // remote: true,
+          // allowCreate: true,
+          // type: "select",
+          // dicUrl: "/api/blade-box-tube/archives/selectArchivesList?size=10&current=1&code={{key}}",
+          // props: {
+          //   label: "code",
+          //   value: "code"
+          // },
           rules: [{
             required: true,
             message: " ",
@@ -293,6 +447,36 @@ export default {
             trigger: "blur"
           }]
         }, {
+          label: '租金/天',
+          prop: 'price',
+          type: 'number',
+          controls: false,
+          overHidden: true,
+          width: 100,
+          rules: [{
+            required: true,
+            message: " ",
+            trigger: "blur"
+          }]
+        }, {
+          label: '起租日期',
+          prop: 'leaseCommencementDate',
+          overHidden: true,
+          display: false,
+          type: "date",
+          format: "yyyy-MM-dd",
+          valueFormat: "yyyy-MM-dd HH:mm:ss",
+          width: 100,
+        }, {
+          label: '租金计算截止日期',
+          prop: 'rentEndDate',
+          overHidden: true,
+          display: false,
+          type: "date",
+          format: "yyyy-MM-dd",
+          valueFormat: "yyyy-MM-dd HH:mm:ss",
+          width: 160,
+        }, {
           label: '箱类型',
           prop: 'boxTypeId',
           width: 100,
@@ -334,6 +518,7 @@ export default {
           width: 100,
           overHidden: true,
           filterable: true,
+          disabled: true,
           type: 'select',
           dicUrl: "/api/blade-system/dict-biz/dictionary?code=box_source",
           props: {
@@ -413,6 +598,7 @@ export default {
           width: 100,
           overHidden: true,
           filterable: true,
+          disabled: true,
           type: 'select',
           dicUrl: "/api/blade-system/dict-biz/dictionary?code=box_archives_status",
           props: {
@@ -496,11 +682,12 @@ export default {
       dataListTwo:[],
       tradingBoxFilesList: [],
       disabled: false,
+      disabledVisible: false,
       costData:{}
     }
   },
   async created() {
-    this.option = await this.getColumnData(this.getColumnName(235.1), this.optionBack);
+    this.option = await this.getColumnData(this.getColumnName(245.1), this.optionBack);
     selectByName("买箱费").then(res => {
       this.costData = res.data.data
     })
@@ -530,6 +717,106 @@ export default {
     }
   },
   methods: {
+    derivation() {
+      window.open(`/api/blade-box-tube/tradingBoxRent/export-tradingBox-info?${this.website.tokenHeader}=${getToken()}`);
+    },
+    uploadBefore(file, done, loading) {
+      loading = true;
+      done();
+    },
+    uploadAfter(res, done, loading, column) {
+      this.excelBox = false;
+      for (let item of this.dataList){
+        for (let li of res){
+         if (item.code === li.code){
+           return this.$message.error(`箱号:${item.code}重复!`);
+         }
+        }
+      }
+      this.dataList = this.dataList.concat(res)
+      this.$message.success("导入成功!");
+      loading = false;
+      done();
+    },
+    statusUpdate(status, type) {
+      if (this.form.id) {
+        this.title = type
+        if (type === '起租') {
+          this.optionState = this.optionStateTwo
+        } else if (type === '计算租金'){
+          this.optionState = this.optionStateFour
+        }else if(type === '撤销租金'){
+          return this.$confirm('此操作将撤销租金并删除费用, 是否继续?', '提示', {
+            confirmButtonText: '确定',
+            cancelButtonText: '取消',
+            type: 'warning'
+          }).then(() => {
+            revokeRent({
+              ...this.form,
+              tradingBoxItemsList:this.selectionList
+            }).then(res => {
+              this.$message.success("操作成功")
+              this.formState = {}
+              this.refresh(this.form.id)
+            })
+          }).catch(() => {
+            this.$message({
+              type: 'info',
+              message: '已取消删除'
+            });
+          });
+        }else {
+          this.optionState = this.optionStateThree
+        }
+        this.dialogVisible = true
+      } else {
+        this.$message.error('请保存后操作')
+      }
+    },
+    confirmChange() {
+      this.$refs["formState"].validate((valid, done) => {
+        done()
+        if (valid) {
+          if (this.title === "起租" || this.title === "退租"){
+            this.disabledVisible = true
+            statusUpdate({
+              ...this.formState,
+              ...this.form,
+              tradingBoxItemsList:this.selectionList,
+              rentType:this.title === "起租"?1:2
+            }).then(res => {
+              this.$message.success("操作成功")
+              this.dialogVisible = false
+              this.disabledVisible = false
+              this.formState = {}
+              this.refresh(this.form.id)
+            }).catch(() => {
+              this.disabledVisible = false
+            })
+          }else {
+            if (this.title === "计算租金"){
+              this.disabledVisible = true
+              calculateRent({
+                ...this.form,
+                ...this.formState,
+                tradingBoxItemsList:this.selectionList
+              }).then(res => {
+                this.$message.success("操作成功")
+                this.dialogVisible = false
+                this.disabledVisible = false
+                this.formState = {}
+                this.refresh(this.form.id)
+              }).catch(() => {
+                this.disabledVisible = false
+              })
+            }
+          }
+        }
+      })
+    },
+    selectionChange(list) {
+      this.selectionList = list
+    },
     confirmEdit() {
       if (this.form.status > 0) {
         //基础资料
@@ -539,7 +826,7 @@ export default {
         this.$set(this.option, "addBtn", false)
         this.$set(this.option, "menu", false)
         //费用信息
-        this.$set(this.$refs.boxCost.option,"disabled",true)
+        this.$set(this.$refs.boxCost.option, "disabled", true)
         this.$set(this.$refs.boxCost.option,"addBtn",false)
         this.$set(this.$refs.boxCost.option,"menu",false)
         //附件和顶部按钮
@@ -614,10 +901,6 @@ export default {
         this.formTwo.address = val.name
       }
     },
-    //选择费用名称
-    selectValue(value) {
-      this.formThree.itemName = value.cname
-    },
     //撤销
     repealCancel(){
       this.$confirm("您确定撤回此次申请吗?", {
@@ -812,64 +1095,19 @@ export default {
         return loading();
       }
       done(form)
-
-      this.getWorkDicts("currency").then(res => {
-        for (let item of res.data.data){
-          if (item.dictValue == form.currency){
-            form.exchangeRate = item.remark
-          }
-        }
-        this.dataListTwo.push({
-          corpId: this.form.purchaseCompanyId,
-          corpName: this.form.purchaseCompanyName,
-          code: form.code,
-          itemId: this.costData.id,
-          itemName: this.costData.cname,
-          currency: form.currency,
-          price: form.amount,
-          quantity: 1,
-          autoGenerate: 1,
-          exchangeRate:form.exchangeRate || 1,
-          feesType:2,
-          amount: form.amount,
-        })
-      });
     },
     rowUpdate(form, index, done, loading) {
       form.boxType = form.$boxTypeId
       done(form)
-      this.getWorkDicts("currency").then(res => {
-        for (let item of res.data.data){
-          if (item.dictValue == form.currency){
-            form.exchangeRate = item.remark
-          }
-        }
-        if (this.dataListTwo.length > 0) {
-          for (let item in this.dataListTwo) {
-            if (this.dataListTwo[item].code == form.code) {
-              if (this.dataListTwo[item].autoGenerate == 1) {
-                this.dataListTwo.splice(Number(item), 1, {
-                  ...this.dataListTwo[item],
-                  corpId: this.form.purchaseCompanyId,
-                  corpName: this.form.purchaseCompanyName,
-                  code: form.code,
-                  currency: form.currency,
-                  price: form.amount,
-                  exchangeRate:form.exchangeRate || 1,
-                  amount: form.amount
-                })
-                this.key++
-              }
-            }
-          }
-        }
-      });
     },
     //打开表单前
     beforeOpen(done,type){
-      if (type === "add"){
-        this.formTwo.boxSource = this.$refs.crud.DIC.boxSource.length === 0?"":this.$refs.crud.DIC.boxSource[0].dictKey
-        this.formTwo.status = this.$refs.crud.DIC.status.length === 0?"":this.$refs.crud.DIC.status[0].dictKey
+      if (this.formTwo.count > 0){
+        this.findObject(this.option.column, "price").disabled = true
+        this.findObject(this.option.column, "amount").disabled = true
+      }else {
+        this.findObject(this.option.column, "price").disabled = false
+        this.findObject(this.option.column, "amount").disabled = false
       }
       done();
     },

+ 26 - 2
src/views/boxManagement/leaseIn/index.vue

@@ -30,7 +30,7 @@
         <template slot-scope="{type,size,row,$index}" slot="menuLeft">
           <el-button icon="el-icon-plus" type="primary" :size="size" @click="detailsOpen = true">创建单据</el-button>
           <el-button class="el-icon-document-copy" type="success" size="small">复制单据</el-button>
-          <el-button class="el-icon-download" type="warning" size="small">导出</el-button>
+          <el-button class="el-icon-download" type="warning" size="small" @click="outExport">导出</el-button>
         </template>
       </avue-crud>
     </basic-container>
@@ -41,6 +41,7 @@
 <script>
 import {getList, remove} from "@/api/boxManagement/leaseIn/index.js";
 import detailsPage from "./detailsPage"
+import {getToken} from "@/util/auth";
 
 export default {
   name: "index",
@@ -233,7 +234,30 @@ export default {
         this.loading = false
       })
     },
-
+    outExport() {
+      let config = {params: {...this.search}}
+      if (config.params) {
+        for (const propName of Object.keys(config.params)) {
+          const value = config.params[propName];
+          if (value !== null && typeof (value) !== "undefined") {
+            if (value instanceof Array) {
+              for (const key of Object.keys(value)) {
+                let params = propName + '[' + key + ']';
+                config.params[params] = value[key]
+              }
+              delete config.params[propName]
+            }
+          }
+        }
+      }
+      const routeData = this.$router.resolve({
+        path: '/api/blade-box-tube/tradingBox/exportTradingBoxOut',      //跳转目标窗口的地址
+        query: {
+          ...config.params    //括号内是要传递给新窗口的参数
+        }
+      })
+      window.open(routeData.href.slice(1, routeData.href.length) + '&' + `${this.website.tokenHeader}=${getToken()}`);
+    },
 //自定义列保存
     async saveColumnTwo(ref, option, optionBack, code) {
       /**

+ 1242 - 0
src/views/boxManagement/leaseOut/detailsPage.vue

@@ -0,0 +1,1242 @@
+<template>
+  <div>
+    <div class="customer-head">
+      <div class="customer-back">
+        <el-button type="danger" style="border: none;background: none;color: red" icon="el-icon-arrow-left"
+                   @click="backToList(0)">返回列表
+        </el-button>
+        <el-button v-if="detailData.id" type="danger" style="border: none;background: none;color: red" icon="el-icon-arrow-left"
+                   @click="backToList(1)">返回审核列表
+        </el-button>
+      </div>
+      <div class="add-customer-btn">
+        <el-button class="el-button--small-yh" style="margin-right: 10px" type="primary" size="small" :disabled="form.status>0"
+                   @click="confirmEdit" v-if="optionForm.disabled === true">编辑
+        </el-button>
+        <el-dropdown style="margin-right: 10px" v-if="false">
+          <el-button type="primary" size="small">
+            审核处理<i class="el-icon-arrow-down el-icon--right"></i>
+          </el-button>
+          <el-dropdown-menu slot="dropdown">
+            <el-dropdown-item @click.native="pleaseCheck" :disabled="form.status>0">请核数据</el-dropdown-item>
+            <el-dropdown-item @click.native="checkScheduleDialog = true,checkId = form.id">审核进度</el-dropdown-item>
+            <el-dropdown-item @click.native="repealCancel" :disabled="form.status === 0 || !form.status" v-if="!detailData.id">撤销请核</el-dropdown-item>
+            <!--            <el-dropdown-item @click.native="changeApproveOpen">特殊审批</el-dropdown-item>-->
+          </el-dropdown-menu>
+        </el-dropdown>
+        <el-button class="el-button--small-yh" type="primary" size="small" :disabled="form.status>0"
+                   @click="editCustomer">
+          保存数据
+        </el-button>
+      </div>
+    </div>
+    <trade-card title="基础资料" style="margin-top: 50px">
+      <avue-form :option="optionForm" v-model="form" ref="form">
+        <template slot="purchaseCompanyId" slot-scope="scope">
+          <crop-select v-model="form.purchaseCompanyId" @getCorpData="(row)=>{getGSData(row,['form','purchaseCompanyName'])}" :disabled="scope.disabled"
+                       corpType="KH"/>
+        </template>
+      </avue-form>
+    </trade-card>
+    <trade-card title="箱信息">
+      <avue-crud
+          :option="option"
+          :data="dataList"
+          v-model="formTwo"
+          ref="crud"
+          :key="key"
+          :before-open="beforeOpen"
+          :upload-delete="uploadDelete"
+          @row-save="rowSave"
+          @row-update="rowUpdate"
+          @selection-change="selectionChange"
+          @resetColumn="resetColumnTwo('crud','option','optionBack',247.1)"
+          @saveColumn="saveColumnTwo('crud','option','optionBack',247.1)">
+        <template slot-scope="{type,size,row,index,disabled}" slot="menu">
+          <el-button icon="el-icon-edit" :size="size" :disabled="disabled" :type="type"
+                     @click="$refs.crud.rowEdit(row,index)">编辑
+          </el-button>
+          <el-button icon="el-icon-delete" :size="size" :disabled="disabled || row.count > 0" :type="type"
+                     @click="rowDel(row,index,'MX')">删除
+          </el-button>
+        </template>
+        <template slot="addressForm" slot-scope="scope">
+          <port-info v-model="formTwo.addressId" type="id" :disabled="scope.disabled" @balabalaTow="balabala"/>
+        </template>
+        <!--        <template slot="boxMakingCompanyForm" slot-scope="scope">-->
+        <!--          <crop-select v-model="formTwo.boxMakingCompanyId" :disabled="scope.disabled" :refresh="false"-->
+        <!--                       @getCorpData="(row)=>{getGSData(row,['formTwo','boxMakingCompany'])}" corpType="GS"/>-->
+        <!--        </template>-->
+        <template slot="menuLeft" slot-scope="scope">
+          <el-button :disabled="selectionList.length === 0 || option.disabled || (selectionList.findIndex(function(item){return item.status == '待使用'}) == -1?false:true)" type="primary" size="small"
+                     @click="statusUpdate('0','起租')">起租
+          </el-button>
+          <el-button :disabled="selectionList.length === 0 || option.disabled || (selectionList.findIndex(function(item){return item.status == '退租'}) == -1?false:true)" type="primary" size="small"
+                     @click="statusUpdate('1','退租')">退租
+          </el-button>
+          <el-button :disabled="selectionList.length === 0 || option.disabled || (selectionList.findIndex(function(item){return item.status == '退租'}) == -1?false:true)" type="primary" size="small"
+                     @click="statusUpdate('2','计算租金')">计算租金
+          </el-button>
+          <el-button :disabled="selectionList.length === 0 || option.disabled || (selectionList.findIndex(function(item){return item.status == '退租'}) == -1?false:true)" type="primary" size="small"
+                     @click="statusUpdate('3','撤销租金')">撤销租金
+          </el-button>
+          <el-button :disabled="option.disabled" type="success" size="small" icon="el-icon-bottom" @click="importBox">导入</el-button>
+        </template>
+      </avue-crud>
+    </trade-card>
+<!--    费用信息组件-->
+    <box-cost v-model="dataListTwo" activeName="second" :codeValue="247.2" ref="boxCost"
+              @resetTrigger="resetTrigger"></box-cost>
+    <trade-card title="附件明细">
+      <c-upload
+          basic
+          :data="tradingBoxFilesList"
+          :disabled="disabled"
+          deleteUrl="/api/blade-box-tube/tradingBoxFiles/remove"
+          :enumerationValue="247.3"
+          display
+      />
+    </trade-card>
+    <el-dialog
+        :title="title"
+        :visible.sync="dialogVisible"
+        :append-to-body="true"
+        :destroy-on-close="true"
+        :close-on-click-modal="false"
+        v-if="dialogVisible"
+        width="60%">
+            <span>
+              <avue-form :option="optionState" v-model="formState" ref="formState">
+                <template slot="addressId" slot-scope="scope">
+                  <port-info v-model="formState.addressId" type="id" :disabled="scope.disabled"
+                             @balabalaTow="(val)=>{balabala(val,['formState','address'])}"/>
+                </template>
+              </avue-form>
+            </span>
+      <span slot="footer" class="dialog-footer">
+              <el-button @click="dialogVisible = false">取 消</el-button>
+              <el-button type="primary" :disabled="disabledVisible" @click="confirmChange">确 定</el-button>
+            </span>
+    </el-dialog>
+    <el-dialog title="导入箱档案" append-to-body :visible.sync="excelBox" width="555px" :close-on-click-modal="false"
+               v-dialog-drag>
+      <avue-form :option="excelOption" v-model="excelForm" table-loading="excelLoading"
+                 :upload-before="uploadBefore" :upload-after="uploadAfter">
+        <template slot="excelTemplate">
+          <el-button type="primary" @click="derivation">
+            点击下载<i class="el-icon-download el-icon--right"></i>
+          </el-button>
+        </template>
+      </avue-form>
+      <p style="text-align: center;color: #DC0505">
+        温馨提示 第一次导入时请先下载模板
+      </p>
+    </el-dialog>
+    <el-dialog
+        append-to-body
+        title="审批进度"
+        class="el-dialogDeep"
+        :visible.sync="checkScheduleDialog"
+        width="40%"
+        :close-on-click-modal="false"
+        :destroy-on-close="true"
+        :close-on-press-escape="false"
+        v-dialog-drag
+    >
+      <check-schedule
+          :checkId="checkId"
+          :batchNo="batchNo"
+          @choceScheduleFun="choceScheduleFun"
+      ></check-schedule>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  detail,
+  submit,
+  tradingBoxFiles,
+  selectArchivesList,
+  tradingBoxItem,
+  tradingBoxFees,
+  pleaseCheck,
+  repealCancel,
+  statusUpdate, calculateRent, revokeRent
+} from "@/api/boxManagement/leaseIn/index.js";
+
+import checkSchedule from "@/components/check/checkSchedule";
+import {selectByName} from "@/api/boxManagement";
+import {getToken} from "@/util/auth";
+export default {
+  name: "detailsPage",
+  props: {
+    onLoad: Object,
+    detailData: Object
+  },
+  components:{checkSchedule},
+  data() {
+    return {
+      excelOption: {
+        submitBtn: false,
+        emptyBtn: false,
+        column: [
+          {
+            label: "模板下载",
+            prop: "excelTemplate",
+            formslot: true,
+            span: 24
+          },
+          {
+            label: "模板上传",
+            prop: "excelFile",
+            type: "upload",
+            drag: true,
+            loadText: "模板上传中,请稍等",
+            span: 24,
+            propsHttp: {
+              res: "data"
+            },
+            tip: "请上传 .xls,.xlsx 标准格式文件",
+            action: "/api/blade-box-tube/tradingBoxRent/import-tradingBox-info"
+          }
+        ]
+      },
+      excelForm:{},
+      title: '',
+      dialogVisible: false,
+      excelBox: false,
+      formSearch: {},
+      optionState: {},
+      formState: {},
+      selectionList: [],
+      optionStateTwo: {
+        menuBtn: false,
+        span: 24,
+        column: [{
+          label: '起租日期',
+          prop: 'rentDate',
+          width: 100,
+          search: true,
+          overHidden: true,
+          type: "date",
+          format: "yyyy-MM-dd",
+          valueFormat: "yyyy-MM-dd HH:mm:ss",
+          rules: [{
+            required: true,
+            message: " ",
+            trigger: "blur"
+          }]
+        }]
+      },
+      optionStateFour: {
+        menuBtn: false,
+        span: 24,
+        column: [{
+          label: '日期',
+          prop: 'rentCalculationDateList',
+          width: 100,
+          search: true,
+          overHidden: true,
+          type: "daterange",
+          format: "yyyy-MM-dd",
+          valueFormat: "yyyy-MM-dd HH:mm:ss",
+          defaultTime: ["00:00:00", "23:59:59"],
+          rules: [{
+            required: true,
+            message: " ",
+            trigger: "blur"
+          }]
+        }]
+      },
+      optionStateThree: {
+        menuBtn: false,
+        span: 12,
+        column: [{
+          label: '地点',
+          prop: 'addressId',
+          rules: [{
+            required: true,
+            message: " ",
+            trigger: "blur"
+          }]
+        }, {
+          label: '退租日期',
+          prop: 'rentDate',
+          width: 100,
+          search: true,
+          overHidden: true,
+          type: "date",
+          format: "yyyy-MM-dd",
+          valueFormat: "yyyy-MM-dd HH:mm:ss",
+          rules: [{
+            required: true,
+            message: " ",
+            trigger: "blur"
+          }]
+        }]
+      },
+      key: 0,
+      checkScheduleDialog: false,
+      checkId: '',
+      batchNo: '',
+      breakConfiguration: {
+        multipleChoices: false,
+        multiple: false,
+        disabled: false,
+        searchShow: true,
+        collapseTags: false,
+        clearable: true,
+        placeholder: "请点击右边按钮选择",
+        dicData: []
+      },
+      form: {},
+      formTwo: {},
+      optionForm: {
+        menuBtn: false,
+        span: 6,
+        column: [{
+          label: '系统号',
+          prop: 'sysNo',
+          disabled: true
+        }, {
+          label: '合同号',
+          prop: 'contractNo',
+          rules: [{
+            required: true,
+            message: " ",
+            trigger: "blur"
+          }]
+        }, {
+          label: '箱数',
+          prop: 'boxNumber',
+          width: 170,
+          rules: [{
+            required: true,
+            message: " ",
+            trigger: "blur"
+          }]
+        }, {
+          label: '客户',
+          prop: 'purchaseCompanyId',
+          rules: [{
+            required: true,
+            message: " ",
+            trigger: "blur"
+          }]
+        }, {
+          label: '合同生效日期',
+          prop: 'effectiveDate',
+          type: "date",
+          format: "yyyy-MM-dd",
+          labelWidth:100,
+          valueFormat: "yyyy-MM-dd HH:mm:ss",
+          rules: [{
+            required: true,
+            message: " ",
+            trigger: "blur"
+          }]
+        }, {
+          label: '合同失效日期',
+          prop: 'expiryDate',
+          type: "date",
+          format: "yyyy-MM-dd",
+          labelWidth:100,
+          valueFormat: "yyyy-MM-dd HH:mm:ss",
+          rules: [{
+            required: true,
+            message: " ",
+            trigger: "blur"
+          }]
+        }, {
+          label: '备注',
+          prop: 'remarks',
+          type: 'textarea',
+          minRows: 1,
+          span: 12
+        }]
+      },
+      option: {},
+      optionBack: {
+        align: 'center',
+        index: true,
+        addBtnText: "录入明细",
+        refreshBtn: false,
+        addBtn: true,
+        span: 8,
+        selection: true,
+        addRowBtn: false,
+        cellBtn: false,
+        editBtn: false,
+        delBtn: false,
+        menuWidth: 140,
+        dialogTop: 25,
+        dialogWidth: "80%",
+        showSummary: true,
+        sumColumnList: [{
+          name: 'amount',
+          type: 'sum',
+          decimals: 2
+        },{
+          name: 'emptyWeight',
+          type: 'sum',
+          decimals: 2
+        },{
+          name: 'grossWeight',
+          type: 'sum',
+          decimals: 2
+        },{
+          name: 'tare',
+          type: 'sum',
+          decimals: 2
+        },{
+          name: 'loadingWeight',
+          type: 'sum',
+          decimals: 2
+        },{
+          name: 'volume',
+          type: 'sum',
+          decimals: 2
+        }],
+        column: [{
+          label: '箱号',
+          prop: 'code',
+          width: 100,
+          overHidden: true,
+          // filterable: true,
+          // remote: true,
+          // allowCreate: true,
+          // type: "select",
+          // dicUrl: "/api/blade-box-tube/archives/selectArchivesList?size=10&current=1&code={{key}}",
+          // props: {
+          //   label: "code",
+          //   value: "code"
+          // },
+          rules: [{
+            required: true,
+            message: " ",
+            trigger: "blur"
+          }]
+        }, {
+          label: '币别',
+          prop: 'currency',
+          width: 100,
+          overHidden: true,
+          filterable: true,
+          type: "select",
+          dicUrl: "/api/blade-system/dict-biz/dictionary?code=currency",
+          props: {
+            label: "dictValue",
+            value: "dictKey"
+          },
+          rules: [{
+            required: true,
+            message: " ",
+            trigger: "blur"
+          }]
+        }, {
+          label: '金额',
+          prop: 'amount',
+          type: 'number',
+          controls: false,
+          overHidden: true,
+          width: 100,
+          rules: [{
+            required: true,
+            message: " ",
+            trigger: "blur"
+          }]
+        }, {
+          label: '租金/天',
+          prop: 'price',
+          type: 'number',
+          controls: false,
+          overHidden: true,
+          width: 100,
+          rules: [{
+            required: true,
+            message: " ",
+            trigger: "blur"
+          }]
+        }, {
+          label: '起租日期',
+          prop: 'leaseCommencementDate',
+          overHidden: true,
+          display: false,
+          type: "date",
+          format: "yyyy-MM-dd",
+          valueFormat: "yyyy-MM-dd HH:mm:ss",
+          width: 100,
+        }, {
+          label: '租金计算截止日期',
+          prop: 'rentEndDate',
+          overHidden: true,
+          display: false,
+          type: "date",
+          format: "yyyy-MM-dd",
+          valueFormat: "yyyy-MM-dd HH:mm:ss",
+          width: 160,
+        }, {
+          label: '箱类型',
+          prop: 'boxTypeId',
+          width: 100,
+          overHidden: true,
+          filterable: true,
+          type: 'select',
+          props: {
+            label: 'name',
+            value: 'id'
+          },
+          dicUrl: '/api/blade-client/container/listMessage'
+        }, {
+          label: '最新地点',
+          prop: 'address',
+          overHidden: true,
+          formProp: 'addressId',
+          width: 100,
+          rules: [{
+            required: true,
+            message: " ",
+            trigger: "blur"
+          }]
+        }, {
+          label: '最新日期',
+          prop: 'newDate',
+          overHidden: true,
+          width: 100,
+          type: "date",
+          format: "yyyy-MM-dd",
+          valueFormat: "yyyy-MM-dd HH:mm:ss",
+          rules: [{
+            required: true,
+            message: " ",
+            trigger: "blur"
+          }]
+        }, {
+          label: '箱来源',
+          prop: 'boxSource',
+          width: 100,
+          overHidden: true,
+          filterable: true,
+          disabled: true,
+          type: 'select',
+          dicUrl: "/api/blade-system/dict-biz/dictionary?code=box_source",
+          props: {
+            label: "dictValue",
+            value: "dictKey"
+          },
+          rules: [{
+            required: true,
+            message: " ",
+            trigger: "blur"
+          }]
+        }, {
+          label: '箱状态',
+          prop: 'boxStatus',
+          width: 100,
+          overHidden: true,
+          filterable: true,
+          type: 'select',
+          dicUrl: "/api/blade-system/dict-biz/dictionary?code=box_status",
+          props: {
+            label: "dictValue",
+            value: "dictKey"
+          },
+          rules: [{
+            required: true,
+            message: " ",
+            trigger: "blur"
+          }]
+        }, {
+          label: '空重(kg)',
+          prop: 'emptyWeight',
+          type: 'number',
+          overHidden: true,
+          controls: false,
+          width: 100,
+          rules: [{
+            required: true,
+            message: " ",
+            trigger: "blur"
+          }]
+        }, {
+          label: '毛重(kg)',
+          prop: 'grossWeight',
+          type: 'number',
+          overHidden: true,
+          controls: false,
+          width: 100,
+          rules: [{
+            required: true,
+            message: " ",
+            trigger: "blur"
+          }]
+        }, {
+          label: '皮重(kg)',
+          prop: 'tare',
+          overHidden: true,
+          type: 'number',
+          controls: false,
+          width: 100
+        }, {
+          label: '装载重量(kg)',
+          prop: 'loadingWeight',
+          type: 'number',
+          overHidden: true,
+          controls: false,
+          width: 100
+        }, {
+          label: '容积(m³)',
+          prop: 'volume',
+          type: 'number',
+          overHidden: true,
+          controls: false,
+          width: 100
+        }, {
+          label: '状态',
+          prop: 'status',
+          width: 100,
+          overHidden: true,
+          filterable: true,
+          disabled: true,
+          type: 'select',
+          dicUrl: "/api/blade-system/dict-biz/dictionary?code=box_archives_status",
+          props: {
+            label: "dictValue",
+            value: "dictKey"
+          }
+        }, {
+          label: '造箱公司',
+          prop: 'boxMakingCompany',
+          overHidden: true,
+          width: 100,
+          rules: [{
+            required: true,
+            message: " ",
+            trigger: "blur"
+          }]
+        }, {
+          label: '造箱日期',
+          prop: 'boxMakingDate',
+          width: 100,
+          overHidden: true,
+          type: "date",
+          format: "yyyy-MM-dd",
+          valueFormat: "yyyy-MM-dd HH:mm:ss",
+          rules: [{
+            required: true,
+            message: " ",
+            trigger: "blur"
+          }]
+        }, {
+          label: '箱来源日期',
+          prop: 'leaseCommencementDate',
+          width: 100,
+          overHidden: true,
+          type: "date",
+          format: "yyyy-MM-dd",
+          valueFormat: "yyyy-MM-dd HH:mm:ss",
+          rules: [{
+            required: true,
+            message: " ",
+            trigger: "blur"
+          }]
+        }, {
+          label: '箱龄',
+          prop: 'boxAge',
+          type: 'number',
+          controls: false,
+          overHidden: true,
+          width: 100,
+          rules: [{
+            required: true,
+            message: " ",
+            trigger: "blur"
+          }]
+        }, {
+          label: '照片',
+          prop: 'tradingBoxFilesList',
+          width: 200,
+          overHidden: true,
+          type: 'upload',
+          span: 24,
+          listType: 'picture-card',
+          tip: '只能上传jpg/png文件,且不超过500kb',
+          propsHttp: {
+            url: 'link',
+            name: 'originalName',
+            res: 'data'
+          },
+          action: '/api/blade-resource/oss/endpoint/put-file'
+        }, {
+          label: '备注',
+          prop: 'remarks',
+          overHidden: true,
+          type: 'textarea',
+          minRows: 3,
+          span: 24,
+          width: 200
+        }]
+      },
+      dataList: [],
+      dataListTwo:[],
+      tradingBoxFilesList: [],
+      disabled: false,
+      disabledVisible: false,
+      costData:{}
+    }
+  },
+  async created() {
+    this.option = await this.getColumnData(this.getColumnName(247.1), this.optionBack);
+    selectByName("买箱费").then(res => {
+      this.costData = res.data.data
+    })
+    //下拉箱号带出对应信息
+    // this.findObject(this.option.column, "code").change = ({value, column}) => {
+    //   selectArchivesList({code: value}).then(res => {
+    //     for (let item of res.data.data) {
+    //       if (value == item.code) {
+    //         this.formTwo = {
+    //           boxSource: item.boxSource,
+    //           boxStatus: item.boxStatus,
+    //           emptyWeight: item.emptyWeight,
+    //           grossWeight: item.gorssWeight,
+    //           tare: item.tare,
+    //           loadingWeight: item.loadingWeight,
+    //           volume: item.volume,
+    //         }
+    //       }
+    //     }
+    //   })
+    // }
+    this.key++
+    if (this.onLoad.id && this.detailData.id) {
+      this.refresh(this.onLoad.id,true)
+    }else if (this.onLoad.id){
+      this.refresh(this.onLoad.id,true)
+    }
+  },
+  methods: {
+    importBox() {
+      this.findObject(this.excelOption.column, "excelFile").data = {
+        billType: "ZC"
+      }
+      this.excelBox = true
+    },
+    derivation() {
+      window.open(`/api/blade-box-tube/tradingBoxRent/export-tradingBox-info?${this.website.tokenHeader}=${getToken()}`);
+    },
+    uploadBefore(file, done, loading) {
+      loading = true;
+      done();
+    },
+    uploadAfter(res, done, loading, column) {
+      this.excelBox = false;
+      for (let item of this.dataList){
+        for (let li of res){
+         if (item.code === li.code){
+           return this.$message.error(`箱号:${item.code}重复!`);
+         }
+        }
+      }
+      this.dataList = this.dataList.concat(res)
+      this.$message.success("导入成功!");
+      loading = false;
+      done();
+    },
+    statusUpdate(status, type) {
+      if (this.form.id) {
+        this.title = type
+        if (type === '起租') {
+          this.optionState = this.optionStateTwo
+        } else if (type === '计算租金'){
+          this.optionState = this.optionStateFour
+        }else if(type === '撤销租金'){
+          return this.$confirm('此操作将撤销租金并删除费用, 是否继续?', '提示', {
+            confirmButtonText: '确定',
+            cancelButtonText: '取消',
+            type: 'warning'
+          }).then(() => {
+            revokeRent({
+              ...this.form,
+              tradingBoxItemsList:this.selectionList
+            }).then(res => {
+              this.$message.success("操作成功")
+              this.formState = {}
+              this.refresh(this.form.id)
+            })
+          }).catch(() => {
+            this.$message({
+              type: 'info',
+              message: '已取消删除'
+            });
+          });
+        }else {
+          this.optionState = this.optionStateThree
+        }
+        this.dialogVisible = true
+      } else {
+        this.$message.error('请保存后操作')
+      }
+    },
+    confirmChange() {
+      this.$refs["formState"].validate((valid, done) => {
+        done()
+        if (valid) {
+          if (this.title === "起租" || this.title === "退租"){
+            this.disabledVisible = true
+            statusUpdate({
+              ...this.formState,
+              ...this.form,
+              tradingBoxItemsList:this.selectionList,
+              rentType:this.title === "起租"?1:2
+            }).then(res => {
+              this.$message.success("操作成功")
+              this.dialogVisible = false
+              this.disabledVisible = false
+              this.formState = {}
+              this.refresh(this.form.id)
+            }).catch(() => {
+              this.disabledVisible = false
+            })
+          }else {
+            if (this.title === "计算租金"){
+              this.disabledVisible = true
+              calculateRent({
+                ...this.form,
+                ...this.formState,
+                tradingBoxItemsList:this.selectionList
+              }).then(res => {
+                this.$message.success("操作成功")
+                this.dialogVisible = false
+                this.disabledVisible = false
+                this.formState = {}
+                this.refresh(this.form.id)
+              }).catch(() => {
+                this.disabledVisible = false
+              })
+            }
+          }
+        }
+      })
+    },
+    selectionChange(list) {
+      this.selectionList = list
+    },
+    confirmEdit() {
+      if (this.form.status > 0) {
+        //基础资料
+        this.$set(this.optionForm, "disabled", true)
+        //箱信息
+        this.$set(this.option, "disabled", true)
+        this.$set(this.option, "addBtn", false)
+        this.$set(this.option, "menu", false)
+        //费用信息
+        this.$set(this.$refs.boxCost.option, "disabled", true)
+        this.$set(this.$refs.boxCost.option,"addBtn",false)
+        this.$set(this.$refs.boxCost.option,"menu",false)
+        //附件和顶部按钮
+        this.disabled = true
+      } else {
+        //基础资料
+        this.$set(this.optionForm, "disabled", false)
+        //箱信息
+        this.$set(this.option, "disabled", false)
+        this.$set(this.option, "addBtn", true)
+        this.$set(this.option, "menu", true)
+        //费用信息
+        this.$set(this.$refs.boxCost.option,"disabled",false)
+        this.$set(this.$refs.boxCost.option,"addBtn",true)
+        this.$set(this.$refs.boxCost.option,"menu",true)
+        //附件和顶部按钮
+        this.disabled = false
+      }
+    },
+    // 明细删除
+    rowDel(row, index, type) {
+      this.$confirm("确定将选择数据删除?", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+            if (row.id) {
+              tradingBoxItem(row.id).then(res => {
+                if (res.data.success) {
+                  this.$message.success("操作成功!");
+                  this.dataList.splice(index, 1);
+                  if (this.dataListTwo.length > 0) {
+                    for (let item in this.dataListTwo) {
+                      if (this.dataListTwo[item].code == row.code) {
+                        if (this.dataListTwo[item].autoGenerate == 1) {
+                          if (this.dataListTwo[item].id) {
+                            tradingBoxFees(this.dataListTwo[item].id).then(res => {
+                              if (res.data.success) {
+                                this.dataListTwo.splice(index, 1);
+                              }
+                            });
+                          } else {
+                            this.dataListTwo.splice(Number(item), 1);
+                          }
+                        }
+                      }
+                    }
+                  }
+                }
+              });
+            } else {
+              this.dataList.splice(index, 1);
+              this.$message.success("操作成功!");
+              if (this.dataListTwo.length > 0) {
+                for (let item in this.dataListTwo) {
+                  if (this.dataListTwo[item].code == row.code) {
+                    if (this.dataListTwo[item].autoGenerate == 1) {
+                      this.dataListTwo.splice(Number(item), 1);
+                    }
+                  }
+                }
+              }
+            }
+          }
+      )
+      ;
+    },
+    balabala(val) {
+      if (val === null) {
+        this.formTwo.address = ''
+      } else {
+        this.formTwo.address = val.name
+      }
+    },
+    //撤销
+    repealCancel(){
+      this.$confirm("您确定撤回此次申请吗?", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        const data = {
+          id : this.form.id,
+          pageLabel:"买箱",
+          checkFlag: 1,
+        }
+        const loading = this.$loading({
+          lock: true,
+          text: '加载中',
+          spinner: 'el-icon-loading',
+          background: 'rgba(255,255,255,0.7)'
+        });
+        repealCancel(data).then(res => {
+          loading.close();
+          this.$message.success('撤回成功')
+          this.refresh(this.form.id)
+        }).catch(()=>{
+          loading.close();
+        })
+      })
+    },
+    // 请核
+    pleaseCheck() {
+      this.$confirm("您确定提交请核申请吗?", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        this.$refs["form"].validate((valid,done) => {
+          done()
+          if (valid) {
+            if (this.dataList.length === 0) {
+              return this.$message.error("箱信息不能为空")
+            }
+            if (this.$refs.boxCost.dataList.length === 0) {
+              return this.$message.error("费用信息不能为空")
+            }else {
+              for (let item of this.$refs.boxCost.dataList){
+                if (!item.id){
+                  return this.$message.error("费用信息未保存")
+                }
+              }
+            }
+            let data = {
+              ...this.form,
+              tradingBoxItemsList: this.dataList,
+              tradingBoxFeesList: this.dataListTwo,
+              tradingBoxFilesList: this.tradingBoxFilesList,
+              type: "ZC"
+            }
+            const loading = this.$loading({
+              lock: true,
+              text: '加载中',
+              spinner: 'el-icon-loading',
+              background: 'rgba(255,255,255,0.7)'
+            });
+            submit(data).then(res => {
+              const data = {
+                id: res.data.data.id,
+                url: '/boxManagement/buyContainer/index',
+                pageStatus: "this.$store.getters.domSaleStatus",
+                pageLabel: "买箱",
+                checkFlag: 1,
+              }
+              pleaseCheck({
+                ...data,
+                type: "ZC"
+              }).then(rest => {
+                loading.close();
+                this.$message.success('请核成功')
+                this.refresh(res.data.data.id)
+              }).catch(()=>{
+                loading.close();
+              })
+            }).catch(()=>{
+              loading.close();
+            })
+          }
+        });
+      })
+    },
+    //审核关闭
+    choceScheduleFun(){
+      this.checkScheduleDialog = false
+    },
+    refresh(id,type) {
+      const loading = this.$loading({
+        lock: true,
+        text: '加载中',
+        spinner: 'el-icon-loading',
+        background: 'rgba(255,255,255,0.7)'
+      });
+      detail({id: id}).then(res => {
+        this.form = res.data.data
+        this.dataList = res.data.data.tradingBoxItemsList
+        this.dataListTwo = res.data.data.tradingBoxFeesList
+        this.tradingBoxFilesList = res.data.data.tradingBoxFilesList
+        delete this.form.tradingBoxItemsList
+        delete this.form.tradingBoxFeesList
+        delete this.form.tradingBoxFilesList
+        loading.close();
+        if (type) {
+          //基础资料
+          this.$set(this.optionForm, "disabled", true)
+          //箱信息
+          this.$set(this.option, "disabled", true)
+          this.$set(this.option, "addBtn", false)
+          this.$set(this.option, "menu", false)
+          //费用信息
+          this.$set(this.$refs.boxCost.option, "disabled", true)
+          this.$set(this.$refs.boxCost.option, "addBtn", false)
+          this.$set(this.$refs.boxCost.option, "menu", false)
+          //附件和顶部按钮
+          this.disabled = true
+        }else {
+          if (this.form.status > 0) {
+            //基础资料
+            this.$set(this.optionForm, "disabled", true)
+            //箱信息
+            this.$set(this.option, "disabled", true)
+            this.$set(this.option, "addBtn", false)
+            this.$set(this.option, "menu", false)
+            //费用信息
+            this.$set(this.$refs.boxCost.option, "disabled", true)
+            this.$set(this.$refs.boxCost.option, "addBtn", false)
+            this.$set(this.$refs.boxCost.option,"menu",false)
+            //附件和顶部按钮
+            this.disabled = true
+          } else {
+            //基础资料
+            this.$set(this.optionForm, "disabled", false)
+            //箱信息
+            this.$set(this.option, "disabled", false)
+            this.$set(this.option, "addBtn", true)
+            this.$set(this.option, "menu", true)
+            //费用信息
+            this.$set(this.$refs.boxCost.option, "disabled", false)
+            this.$set(this.$refs.boxCost.option, "addBtn", true)
+            this.$set(this.$refs.boxCost.option, "menu", true)
+            //附件和顶部按钮
+            this.disabled = false
+          }
+        }
+      })
+    },
+    //新增修改
+    editCustomer() {
+      this.$refs["form"].validate((valid,done) => {
+        done()
+        if (valid) {
+          let data = {
+            ...this.form,
+            tradingBoxItemsList: this.dataList,
+            tradingBoxFeesList: this.dataListTwo,
+            tradingBoxFilesList: this.tradingBoxFilesList,
+            type: "ZC"
+          }
+          const loading = this.$loading({
+            lock: true,
+            text: '加载中',
+            spinner: 'el-icon-loading',
+            background: 'rgba(255,255,255,0.7)'
+          });
+          submit(data).then(res => {
+            if (this.form.id) {
+              this.$message.success("修改成功")
+            } else {
+              this.$message.success("新增成功")
+            }
+            loading.close();
+            this.refresh(res.data.data.id)
+          }).catch(()=>{
+            loading.close();
+          })
+        }
+      });
+    },
+    rowSave(form,done,loading) {
+      let result = this.dataList.some((item) => {
+        if (item.code == form.code) {
+          return true
+        }
+      })
+      if (result === true) {
+        this.$message.error("已存在此箱号");
+        return loading();
+      }
+      done(form)
+    },
+    rowUpdate(form, index, done, loading) {
+      form.boxType = form.$boxTypeId
+      done(form)
+    },
+    //打开表单前
+    beforeOpen(done,type){
+      if (this.formTwo.count > 0){
+        this.findObject(this.option.column, "price").disabled = true
+        this.findObject(this.option.column, "amount").disabled = true
+      }else {
+        this.findObject(this.option.column, "price").disabled = false
+        this.findObject(this.option.column, "amount").disabled = false
+      }
+      done();
+    },
+    //删除图片
+    uploadDelete(file, column) {
+      return new Promise((resolve, reject) => {
+        this.$confirm('此操作将永久删除该文件, 是否继续?', '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          if (this.formTwo.tradingBoxFilesList[file.uid].id) {
+            tradingBoxFiles(this.formTwo.tradingBoxFilesList[file.uid].id).then(res => {
+              this.$message({
+                type: 'success',
+                message: '删除成功!'
+              });
+              resolve();
+            })
+          } else {
+            resolve();
+          }
+        }).catch(()=>{
+          reject();
+          this.$message({
+            type: "info",
+            message: "已取消删除"
+          });
+        })
+      })
+    },
+    getGSData(row,type) {
+      this[type[0]][type[1]] = row.cname
+    },
+    backToList(type) {
+      if (type == 0){
+        if (this.detailData.id){
+          this.$router.push({
+            path: '/boxManagement/buyContainer/index'
+          });
+        }
+        this.$emit("backToList",type);
+      }else if (type == 1){
+        this.$router.push({
+          path: '/approveData/index'
+        });
+        this.$emit("backToList",type);
+      }
+    },
+    //自定义列保存
+    async saveColumnTwo(ref, option, optionBack, code) {
+      /**
+       * 已定义全局方法,直接使用,saveColumnData保存列数据方法,参数传值(表格名称,当前表格的option数据)
+       * 已定义全局方法,直接使用,getColumnName方法用来获取枚举值,参数根据自己定义的code值获取中文名
+       * 一定要执行异步操作,要等接口成功返回,才能执行下一行代码
+       */
+      const inSave = await this.saveColumnData(this.getColumnName(code), this[option]);
+      if (inSave) {
+        this.$message.success("保存成功");
+        //关闭窗口
+        this.$refs[ref].$refs.dialogColumn.columnBox = false;
+      }
+    },
+    resetTrigger(){
+      if (this.optionForm.disabled == true) {
+        if (this.form.status > 0) {
+          //基础资料
+          this.$set(this.optionForm, "disabled", true)
+          //箱信息
+          this.$set(this.option, "disabled", true)
+          this.$set(this.option, "addBtn", false)
+          this.$set(this.option, "menu", false)
+          //费用信息
+          this.$set(this.$refs.boxCost.option, "disabled", true)
+          this.$set(this.$refs.boxCost.option, "addBtn", false)
+          this.$set(this.$refs.boxCost.option,"menu",false)
+          //附件和顶部按钮
+          this.disabled = true
+        } else {
+          //基础资料
+          this.$set(this.optionForm, "disabled", false)
+          //箱信息
+          this.$set(this.option, "disabled", false)
+          this.$set(this.option, "addBtn", true)
+          this.$set(this.option, "menu", true)
+          //费用信息
+          this.$set(this.$refs.boxCost.option, "disabled", false)
+          this.$set(this.$refs.boxCost.option, "addBtn", true)
+          this.$set(this.$refs.boxCost.option, "menu", true)
+          //附件和顶部按钮
+          this.disabled = false
+        }
+      }else {
+        //基础资料
+        this.$set(this.optionForm, "disabled", false)
+        //箱信息
+        this.$set(this.option, "disabled", false)
+        this.$set(this.option, "addBtn", true)
+        this.$set(this.option, "menu", true)
+        //费用信息
+        this.$set(this.$refs.boxCost.option, "disabled", false)
+        this.$set(this.$refs.boxCost.option, "addBtn", true)
+        this.$set(this.$refs.boxCost.option, "menu", true)
+        //附件和顶部按钮
+        this.disabled = false
+      }
+    },
+    //自定义列重置
+    async resetColumnTwo(ref, option, optionBack, code) {
+      this[option] = this[optionBack];
+      const inSave = await this.delColumnData(this.getColumnName(code), this[optionBack]);
+      if (inSave) {
+        this.resetTrigger()
+        this.$message.success("重置成功");
+        this.$refs[ref].$refs.dialogColumn.columnBox = false;
+      }
+    }
+  }
+}
+</script>
+
+<style scoped>
+::v-deep .el-form-item {
+  margin-bottom: 8px;
+}
+</style>

+ 290 - 0
src/views/boxManagement/leaseOut/index.vue

@@ -0,0 +1,290 @@
+<template>
+  <div>
+    <basic-container v-show="!detailsOpen">
+      <avue-crud
+          :option="option"
+          :search.sync="search"
+          v-model="form"
+          :table-loading="loading"
+          :data="dataList"
+          ref="crud"
+          :key="key"
+          @on-load="onLoad"
+          @search-change="searchChange"
+          @row-del="rowDel"
+          @refresh-change="refreshChange"
+          @resetColumn="resetColumnTwo('crud','option','optionList',247)"
+          @saveColumn="saveColumnTwo('crud','option','optionList',247)"
+          :page.sync="page">
+        <template slot="purchaseCompanyIdSearch">
+          <crop-select v-model="search.purchaseCompanyId" corpType="GS"/>
+        </template>
+        <template slot="purchaseCompanyId" slot-scope="{row}">
+          {{ row.purchaseCompanyName }}
+        </template>
+        <template slot-scope="{type,size,row,$index}" slot="menu">
+          <el-button icon="el-icon-view" :size="size" :type="type" @click="check(row)">查看</el-button>
+          <el-button icon="el-icon-delete" :size="size" v-if="row.status == 0" :type="type" @click="$refs.crud.rowDel(row,$index)">删除
+          </el-button>
+        </template>
+        <template slot-scope="{type,size,row,$index}" slot="menuLeft">
+          <el-button icon="el-icon-plus" type="primary" :size="size" @click="detailsOpen = true">创建单据</el-button>
+          <el-button class="el-icon-document-copy" type="success" size="small">复制单据</el-button>
+          <el-button class="el-icon-download" type="warning" size="small" @click="outExport">导出</el-button>
+        </template>
+      </avue-crud>
+    </basic-container>
+    <detailsPage v-if="detailsOpen" :onLoad="form" :detailData="detailData" @backToList="backToList"></detailsPage>
+  </div>
+</template>
+
+<script>
+import {getList, remove} from "@/api/boxManagement/leaseIn/index.js";
+import detailsPage from "./detailsPage"
+import {getToken} from "@/util/auth";
+
+export default {
+  name: "index",
+  components: {
+    detailsPage
+  },
+  data() {
+    return {
+      detailsOpen: false,
+      loading: false,
+      search: {},
+      form: {},
+      dataList: [],
+      detailData: {},
+      page: {
+        pageSize: 20,
+        currentPage: 1,
+        total: 0,
+        pageSizes: [10, 20, 30, 40, 50, 100, 200, 300, 400, 500]
+      },
+      key:0,
+      option: {},
+      optionList: {
+        viewBtn: false,
+        editBtn: false,
+        delBtn: false,
+        addBtn: false,
+        index: true,
+        span: 8,
+        border: true,
+        height:"auto",
+        searchMenuPosition: "right",
+        align: "center",
+        menuWidth:140,
+        searchSpan: 8,
+        searchIcon: true,
+        searchIndex: 2,
+        highlightCurrentRow: true,
+        dialogWidth: "70%",
+        column: [{
+          label: '系统号',
+          prop: 'sysNo',
+          width: 220,
+          search: true,
+        }, {
+          label: '合同号',
+          prop: 'contractNo',
+          width: 170,
+          search: true,
+        }, {
+          label: '箱数',
+          prop: 'boxNumber',
+          width: 170
+        }, {
+          label: '客户',
+          prop: 'purchaseCompanyId',
+          width: 200,
+          search: true,
+        }, {
+          label: '合同生效日期',
+          prop: 'effectiveDate',
+          width: 100,
+          overHidden: true,
+          type: "date",
+          searchRange: true,
+          searchDefaultTime: ["00:00:00", "23:59:59"],
+          format: "yyyy-MM-dd",
+          valueFormat: "yyyy-MM-dd HH:mm:ss"
+        }, {
+          label: '合同失效日期',
+          prop: 'expiryDate',
+          width: 100,
+          overHidden: true,
+          type: "date",
+          searchRange: true,
+          searchDefaultTime: ["00:00:00", "23:59:59"],
+          format: "yyyy-MM-dd",
+          valueFormat: "yyyy-MM-dd HH:mm:ss"
+        }, {
+          label: '状态',
+          prop: 'status',
+          width: 140,
+          overHidden: true,
+          filterable: true,
+          type: 'select',
+          dataType: 'number',
+          dicUrl: "/api/blade-system/dict-biz/dictionary?code=approval_status",
+          props: {
+            label: "dictValue",
+            value: "dictKey"
+          }
+        }, {
+          label: '备注',
+          prop: 'remarks',
+          width: 500
+        }, {
+          label: '合同日期',
+          prop: 'effectiveDateList',
+          width: 100,
+          search: true,
+          hide:true,
+          showColumn:false,
+          overHidden: true,
+          type: "date",
+          searchRange: true,
+          searchDefaultTime: ["00:00:00", "23:59:59"],
+          format: "yyyy-MM-dd",
+          valueFormat: "yyyy-MM-dd HH:mm:ss"
+        }]
+      }
+    }
+  },
+  activated() {
+    if (this.$route.query.check) {
+      this.detailsOpen = false
+      this.detailData = {
+        id: this.$route.query.check.billId,
+        check: this.$route.query.check,
+      };
+      this.form = {
+        id:this.$route.query.check.billId
+      }
+      this.detailsOpen = true
+      this.$router.$avueRouter.closeTag(window.location.hash.slice(1))
+    }
+  },
+  async created() {
+    this.option = await this.getColumnData(this.getColumnName(247), this.optionList);
+    this.key++
+    let i = 0;
+    this.option.column.forEach(item => {
+      if (item.search) i++
+    })
+    if (i % 3 !== 0) {
+      const num = 3 - Number(i % 3)
+      this.option.searchMenuSpan = num * 8;
+      this.option.searchMenuPosition = "right";
+    }
+  },
+  methods: {
+    check(row){
+      this.form = row
+      this.detailsOpen = true
+    },
+    backToList(type) {
+      this.form = {}
+      this.detailsOpen = false
+      if (type === 0){
+        this.detailData = {}
+      }
+      this.onLoad(this.page,this.search)
+    },
+    //刷新
+    refreshChange() {
+      this.onLoad(this.page, this.search)
+    },
+    rowDel(form, index) {
+      this.$confirm('此操作将永久删除该行, 是否继续?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        remove(form.id).then(res => {
+          this.$message({
+            type: 'success',
+            message: '删除成功!'
+          });
+        })
+      }).catch(() => {
+      });
+    },
+    searchChange(params, done) {
+      done();
+      this.onLoad(this.page, params)
+    },
+    onLoad(page, params = {}) {
+      params = {
+        ...params,
+        current: page.currentPage,
+        size: page.pageSize,
+        type: "ZC",
+        ...Object.assign(params, this.search)
+      }
+      this.loading = true
+      getList(params).then(res => {
+        this.dataList = res.data.data.records
+        this.page.total = res.data.data.total
+        this.loading = false
+      }).finally(() => {
+        this.loading = false
+      })
+    },
+    outExport() {
+      let config = {params: {...this.search}}
+      if (config.params) {
+        for (const propName of Object.keys(config.params)) {
+          const value = config.params[propName];
+          if (value !== null && typeof (value) !== "undefined") {
+            if (value instanceof Array) {
+              for (const key of Object.keys(value)) {
+                let params = propName + '[' + key + ']';
+                config.params[params] = value[key]
+              }
+              delete config.params[propName]
+            }
+          }
+        }
+      }
+      const routeData = this.$router.resolve({
+        path: '/api/blade-box-tube/tradingBox/exportTradingBoxOut',      //跳转目标窗口的地址
+        query: {
+          ...config.params    //括号内是要传递给新窗口的参数
+        }
+      })
+      window.open(routeData.href.slice(1, routeData.href.length) + '&' + `${this.website.tokenHeader}=${getToken()}`);
+    },
+//自定义列保存
+    async saveColumnTwo(ref, option, optionBack, code) {
+      /**
+       * 已定义全局方法,直接使用,saveColumnData保存列数据方法,参数传值(表格名称,当前表格的option数据)
+       * 已定义全局方法,直接使用,getColumnName方法用来获取枚举值,参数根据自己定义的code值获取中文名
+       * 一定要执行异步操作,要等接口成功返回,才能执行下一行代码
+       */
+      const inSave = await this.saveColumnData(this.getColumnName(code), this[option]);
+      if (inSave) {
+        this.$message.success("保存成功");
+        //关闭窗口
+        this.$refs[ref].$refs.dialogColumn.columnBox = false;
+      }
+    },
+//自定义列重置
+    async resetColumnTwo(ref, option, optionBack, code) {
+      this[option] = this[optionBack];
+      const inSave = await this.delColumnData(this.getColumnName(code), this[optionBack]);
+      if (inSave) {
+        this.$message.success("重置成功");
+        this.$refs[ref].$refs.dialogColumn.columnBox = false;
+      }
+    }
+  }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 73 - 0
src/views/boxManagement/sellingContainers/detailsPage.vue

@@ -65,6 +65,11 @@
 <!--          <crop-select v-model="formTwo.boxMakingCompanyId" :disabled="scope.disabled" :refresh="false"-->
 <!--                       @getCorpData="(row)=>{getGSData(row,['formTwo','boxMakingCompany'])}" corpType="GS"/>-->
 <!--        </template>-->
+        <template slot="menuLeft" slot-scope="scope">
+          <el-button :disabled="option.disabled" type="success" size="small" icon="el-icon-bottom" @click="importBox">
+            导入
+          </el-button>
+        </template>
       </avue-crud>
     </trade-card>
     <!--    费用信息组件-->
@@ -79,6 +84,20 @@
           display
       />
     </trade-card>
+    <el-dialog title="导入箱档案" append-to-body :visible.sync="excelBox" width="555px" :close-on-click-modal="false"
+               v-dialog-drag>
+      <avue-form :option="excelOption" v-model="excelForm" table-loading="excelLoading"
+                 :upload-before="uploadBefore" :upload-after="uploadAfter">
+        <template slot="excelTemplate">
+          <el-button type="primary" @click="derivation">
+            点击下载<i class="el-icon-download el-icon--right"></i>
+          </el-button>
+        </template>
+      </avue-form>
+      <p style="text-align: center;color: #DC0505">
+        温馨提示 第一次导入时请先下载模板
+      </p>
+    </el-dialog>
     <el-dialog
         append-to-body
         title="审批进度"
@@ -122,6 +141,33 @@ export default {
   components:{checkSchedule},
   data() {
     return {
+      excelBox: false,
+      excelOption: {
+        submitBtn: false,
+        emptyBtn: false,
+        column: [
+          {
+            label: "模板下载",
+            prop: "excelTemplate",
+            formslot: true,
+            span: 24
+          },
+          {
+            label: "模板上传",
+            prop: "excelFile",
+            type: "upload",
+            drag: true,
+            loadText: "模板上传中,请稍等",
+            span: 24,
+            propsHttp: {
+              res: "data"
+            },
+            tip: "请上传 .xls,.xlsx 标准格式文件",
+            action: "/api/blade-box-tube/tradingBoxRent/import-tradingBox-info"
+          }
+        ]
+      },
+      excelForm: {},
       key: 0,
       checkScheduleDialog: false,
       checkId: '',
@@ -515,6 +561,33 @@ export default {
     }
   },
   methods: {
+    uploadBefore(file, done, loading) {
+      loading = true;
+      done();
+    },
+    uploadAfter(res, done, loading, column) {
+      this.excelBox = false;
+      for (let item of this.dataList) {
+        for (let li of res.tradingBoxItemList) {
+          if (item.code === li.code) {
+            return this.$message.error(`箱号:${item.code}重复!`);
+          }
+        }
+      }
+      this.dataList = this.dataList.concat(res.tradingBoxItemList)
+      this.dataListTwo = this.dataListTwo.concat(res.tradingBoxFeesList)
+      this.$message.success("导入成功!");
+      loading = false;
+      done();
+    },
+    importBox() {
+      this.findObject(this.excelOption.column, "excelFile").data = {
+        corpId: this.form.purchaseCompanyId,
+        corpName: this.form.purchaseCompanyName,
+        billType: "SELL"
+      }
+      this.excelBox = true
+    },
     confirmEdit() {
       if (this.form.status > 0) {
         //基础资料

+ 26 - 2
src/views/boxManagement/sellingContainers/index.vue

@@ -30,7 +30,7 @@
         <template slot-scope="{type,size,row,$index}" slot="menuLeft">
           <el-button icon="el-icon-plus" type="primary" :size="size" @click="detailsOpen = true">创建单据</el-button>
           <el-button class="el-icon-document-copy" type="success" size="small">复制单据</el-button>
-          <el-button class="el-icon-download" type="warning" size="small">导出</el-button>
+          <el-button class="el-icon-download" type="warning" size="small" @click="outExport">导出</el-button>
         </template>
       </avue-crud>
     </basic-container>
@@ -41,6 +41,7 @@
 <script>
 import {getList, remove} from "@/api/boxManagement/buyContainer/index.js";
 import detailsPage from "./detailsPage"
+import {getToken} from "@/util/auth";
 
 export default {
   name: "index",
@@ -209,7 +210,30 @@ export default {
         this.loading = false
       })
     },
-
+    outExport() {
+      let config = {params: {...this.search}}
+      if (config.params) {
+        for (const propName of Object.keys(config.params)) {
+          const value = config.params[propName];
+          if (value !== null && typeof (value) !== "undefined") {
+            if (value instanceof Array) {
+              for (const key of Object.keys(value)) {
+                let params = propName + '[' + key + ']';
+                config.params[params] = value[key]
+              }
+              delete config.params[propName]
+            }
+          }
+        }
+      }
+      const routeData = this.$router.resolve({
+        path: '/api/blade-box-tube/tradingBox/exportTradingBoxOut',      //跳转目标窗口的地址
+        query: {
+          ...config.params    //括号内是要传递给新窗口的参数
+        }
+      })
+      window.open(routeData.href.slice(1, routeData.href.length) + '&' + `${this.website.tokenHeader}=${getToken()}`);
+    },
 //自定义列保存
     async saveColumnTwo(ref, option, optionBack, code) {
       /**