Преглед изворни кода

1.箱管 箱池动态 去掉字段
2.基础资料 超期费标准 修改字段名称
3.海运出口 客户托书 预订舱 新加默认值
4.箱管 箱池动态详情页去掉多余的字段
5.海运出口 选择放箱号 对几个字段新加限制规则
6.客户托书 完善列表页字段
7.合约 画页面 联调接口 完善功能
8.用箱统计 完善列表页字段
9. 预定舱发送消息,需要跳转到明细
10.箱管 POD场站 空箱返场 列表页新加字段
11.海运出口 业务来源必填项

Qukatie пре 8 месеци
родитељ
комит
68f973d130
25 измењених фајлова са 1566 додато и 80 уклоњено
  1. 7 0
      src/api/system/dept.js
  2. 6 0
      src/enums/column-name.js
  3. 2 1
      src/main.js
  4. 31 3
      src/util/lock.js
  5. 0 6
      src/views/boxManagement/boxPoolDynamics/detailsPage.vue
  6. 6 6
      src/views/boxManagement/boxPoolDynamics/index.vue
  7. 0 1
      src/views/boxManagement/podComeback/index.vue
  8. 19 0
      src/views/iosBasicData/OceanFreightImport/bills/assembly/DistributionBox/containers.vue
  9. 1 1
      src/views/iosBasicData/OceanFreightImport/bills/assembly/formbottom.vue
  10. 9 10
      src/views/iosBasicData/OceanFreightImport/bills/billsDetails.vue
  11. 28 28
      src/views/iosBasicData/SeafreightExportF/bills/assembly/EntrustmentLnformation.vue
  12. 7 2
      src/views/iosBasicData/SeafreightExportF/bills/assembly/EntrustmentLnformation/precontainers.vue
  13. 4 3
      src/views/iosBasicData/SeafreightExportF/bills/assembly/formbottom.vue
  14. 6 3
      src/views/iosBasicData/SeafreightExportF/bills/billsDetails.vue
  15. 9 2
      src/views/iosBasicData/SeafreightExportF/bills/index.vue
  16. 3 3
      src/views/iosBasicData/boxPlan/boxPlan/detailsPage.vue
  17. 27 1
      src/views/iosBasicData/boxPlan/boxStatistics/index.vue
  18. 4 1
      src/views/iosBasicData/businessCenter/bookingCabin/detailsPage.vue
  19. 5 2
      src/views/iosBasicData/businessCenter/customerLetter/detailsPage.vue
  20. 0 4
      src/views/iosBasicData/businessCenter/customerLetter/index.vue
  21. 3 1
      src/views/iosBasicData/overdueFee/detailsPage.vue
  22. 1 1
      src/views/iosBasicData/overdueFee/index.vue
  23. 0 1
      src/views/iosBasicData/podStation/index.vue
  24. 960 0
      src/views/ow/contract/detailsPage.vue
  25. 428 0
      src/views/ow/contract/index.vue

+ 7 - 0
src/api/system/dept.js

@@ -84,6 +84,13 @@ export const getDeptLazyTree = (parentId) => {
     }
   })
 }
+export const getDeptLazyTree2 = (data) => {
+  return request({
+    url: '/api/blade-system/dept/lazy-tree',
+    method: 'get',
+    params:data
+  })
+}
 export const topList = (parentId) => {
   return request({
     url: '/api/blade-system/dept/top-list',

+ 6 - 0
src/enums/column-name.js

@@ -2174,6 +2174,12 @@ const columnName = [{
 }, {
   code: 507,
   name: '永发-用箱计划-用箱统计列表页'
+}, {
+  code: 508,
+  name: '永发-OW-合约列表页'
+}, {
+  code: 509,
+  name: '永发-OW-合约列详情页'
 }
 ]
 export const getColumnName = (key) => {

+ 2 - 1
src/main.js

@@ -92,7 +92,8 @@ import {
 } from "@/util/exchangeRate"
 //查看是否有锁
 import {
-  checkLocks
+  checkLocks,
+  inLocks
 } from "@/util/lock"
 import {
   inDetailsKey,

+ 31 - 3
src/util/lock.js

@@ -2,14 +2,42 @@ import { checkLock } from "@/api/lock/lock"
 
 export async function checkLocks(data) {
   let option
-   await checkLock(data).then(res => {
+  await checkLock(data).then(res => {
     //此单据未被锁定
-    if(res.data.code === 200){
+    if (res.data.code === 200) {
       option = false
-    }else{
+    } else {
       //此单据已被锁定
       option = true
     }
   })
   return option
 }
+export function inLocks(moduleName, tableName, id, no) {
+  const data = {
+    moduleName: moduleName,
+    tableName: tableName,
+    billId: id,
+    no: localStorage.getItem("browserID"),
+    billNo: no
+  };
+  console.log(this.$route.name)
+  this.inDetailsKey(this.$route.name, {
+    moduleName: moduleName,
+    tableName: tableName,
+    billId: id,
+    billNo: no
+  });
+  checkLock(data).then(res => {
+    if (res.data.code == 200) {
+      this.onLock(data).then(res => {
+        if (res.data.code == 200) {
+          this.showLock = false
+          return false
+        } else {
+          return true
+        }
+      });
+    }
+  });
+}

+ 0 - 6
src/views/boxManagement/boxPoolDynamics/detailsPage.vue

@@ -198,12 +198,6 @@ export default {
             width: 120,
           },
           {
-            label: '箱动态',
-            prop: 'boxDynamics',
-            overHidden: true,
-            width: 100,
-          },
-          {
             label: '状态',
             prop: 'status',
             overHidden: true,

+ 6 - 6
src/views/boxManagement/boxPoolDynamics/index.vue

@@ -265,12 +265,12 @@ export default {
                         width: 100,
                         overHidden: true,
                     },
-                    {
-                        label: '操作占用',
-                        prop: 'occupyNum',
-                        width: 100,
-                        overHidden: true,
-                    },
+                    // {
+                    //     label: '操作占用',
+                    //     prop: 'occupyNum',
+                    //     width: 100,
+                    //     overHidden: true,
+                    // },
                     {
                         label: '可用箱量',
                         prop: 'remainingTotal',

+ 0 - 1
src/views/boxManagement/podComeback/index.vue

@@ -150,7 +150,6 @@ export default {
             label: 'ETA',
             prop: 'eta',
             width: 120,
-            hide: true,
             search: true,
             searchProp: 'actualEtaList',
             overHidden: true,

+ 19 - 0
src/views/iosBasicData/OceanFreightImport/bills/assembly/DistributionBox/containers.vue

@@ -254,26 +254,43 @@ export default {
             label: "件数",
             prop: "quantity",
             width: "100",
+            overHidden: true,
           },
           {
             label: "毛重(KGM)",
             prop: "grossWeight",
             width: "120",
+            overHidden: true,
           },
           {
             label: "净重(KGM)",
             prop: "netWeight",
             width: "120",
+            overHidden: true,
           },
           {
             label: "尺码/体积(CBM)",
             prop: "measurement",
             width: "140",
+            overHidden: true,
+          },
+          {
+            label: "POD堆场",
+            prop: "podStationCname",
+            width: "140",
+            overHidden: true,
+          },
+          {
+            label: "还箱日期",
+            prop: "podEmptyContainerReturnDate",
+            width: "140",
+            overHidden: true,
           },
           {
             label: "备注",
             prop: "remarks",
             type: 'textarea',
+            overHidden: true,
             width: 180,
             slot: true,
             minRows: 3,
@@ -282,11 +299,13 @@ export default {
           {
             label: "MARKS",
             prop: "marks",
+            overHidden: true,
           },
           {
             label: "VGM总重(KGM)",
             prop: "vgmWeight",
             width: "140",
+            overHidden: true,
           },
         ]
       },

+ 1 - 1
src/views/iosBasicData/OceanFreightImport/bills/assembly/formbottom.vue

@@ -112,7 +112,7 @@
                     </el-form-item>
                 </el-col>
                 <el-col :span="6">
-                    <el-form-item label="业务来源" prop="srcType">
+                    <el-form-item label="业务来源" prop="srcType" :rules="[{ required: true, message: '', trigger: 'blur' }]">
                         <el-row :gutter="10">
                             <el-col :span="10">
                                 <search-query :datalist="sourceTypeData" :selectValue="assemblyForm.srcType"

+ 9 - 10
src/views/iosBasicData/OceanFreightImport/bills/billsDetails.vue

@@ -599,11 +599,9 @@ export default {
                 issueType: "ORI", // 签单方式 默认 正本提单
                 mpaymode: "PP", // 主单付费方式 默认PP
                 hpaymode: "PP", // 分单付费方式 默认 PP
-                loadType:
-                    JSON.parse(localStorage.getItem("saber-tenantId"))
-                        .content == "409341"
-                        ? "FCL"
-                        : "整箱", // 装箱方式默认整箱
+                polFreeBoxUseDays: 7,
+                podFreeBoxUseDays: 14,
+                loadType: "整箱", // 装箱方式默认整箱
                 srcType: "OWN", // 业务来源默认公司   来源 内容 默认登录人所属公司
                 numberOfObl: "THREE", // 正本份数 默认 THREE
                 numberOfCopy: "THREE", // 副本份数 默认 THREE
@@ -650,11 +648,9 @@ export default {
                 issueType: "ORI", // 签单方式 默认 正本提单
                 mpaymode: "PP", // 主单付费方式 默认PP
                 hpaymode: "PP", // 分单付费方式 默认 PP
-                loadType:
-                    JSON.parse(localStorage.getItem("saber-tenantId"))
-                        .content == "409341"
-                        ? "FCL"
-                        : "整箱", // 装箱方式默认整箱
+                polFreeBoxUseDays: 7,
+                podFreeBoxUseDays: 14,
+                loadType: "整箱", // 装箱方式默认整箱
                 srcType: "OWN", // 业务来源默认公司   来源 内容 默认登录人所属公司
                 numberOfObl: "THREE", // 正本份数 默认 THREE
                 numberOfCopy: "THREE", // 副本份数 默认 THREE
@@ -2406,6 +2402,9 @@ export default {
                     if (!this.form.measurement) {
                         msgs.push("尺码");
                     }
+                    if (!this.form.srcType || !this.form.srcCnName) {
+                        msgs.push('业务来源')
+                    }
                     // if (!this.form.etd) {
                     //     msgs.push('ETD')
                     // }

+ 28 - 28
src/views/iosBasicData/SeafreightExportF/bills/assembly/EntrustmentLnformation.vue

@@ -173,7 +173,7 @@
                                 <el-col :span="10">
                                     <search-query :datalist="polData" :selectValue="assemblyForm.polEnName"
                                         :filterable="true" :clearable="true" :remote="true" :joinData="true"
-                                        :disabled="detailData.seeDisabled || generateBillsfalse || (assemblyForm.billType == 'MH' && assemblyForm.masterBillNo > 0)"
+                                        :disabled="detailData.seeDisabled || generateBillsfalse || (assemblyForm.billType == 'MH' && assemblyForm.masterBillNo > 0)||assemblyForm.preContainersList.filter(item=>item.containerNumberStatus == '已选择').length>0"
                                         :buttonIf="false" placeholder="请选择装货港"
                                         :forParameter="{ key: 'id', short: 'enName', label: 'code', value: 'enName' }"
                                         @remoteMethod="remoteMethod($event, 'pol')"
@@ -185,7 +185,7 @@
                                     <span style="padding-left: 20px"></span>
                                     <el-input type="age" style="width: 100%;" v-model="assemblyForm.polNamePrint"
                                         size="small" autocomplete="off"
-                                        :disabled="detailData.seeDisabled || generateBillsfalse || (assemblyForm.billType == 'MH' && assemblyForm.masterBillNo > 0)"
+                                        :disabled="detailData.seeDisabled || generateBillsfalse || (assemblyForm.billType == 'MH' && assemblyForm.masterBillNo > 0)||assemblyForm.preContainersList.filter(item=>item.containerNumberStatus == '已选择').length>0"
                                         clearable placeholder="装货港" @change="textareaBlur('polNamePrint')"></el-input>
                                 </el-col>
                             </el-row>
@@ -205,7 +205,7 @@
                                 <el-col :span="10">
                                     <search-query :datalist="podData" :selectValue="assemblyForm.podEnName"
                                         :filterable="true" :clearable="true" :remote="true" :joinData="true"
-                                        :disabled="detailData.seeDisabled || (assemblyForm.billType == 'MH' && assemblyForm.masterBillNo > 0)"
+                                        :disabled="detailData.seeDisabled || (assemblyForm.billType == 'MH' && assemblyForm.masterBillNo > 0)||assemblyForm.preContainersList.filter(item=>item.containerNumberStatus == '已选择').length>0"
                                         :buttonIf="false" placeholder="请选择卸货港"
                                         :forParameter="{ key: 'id', short: 'enName', label: 'code', value: 'enName' }"
                                         @remoteMethod="remoteMethod($event, 'pod')"
@@ -217,7 +217,7 @@
                                     <span style="padding-left: 20px"></span>
                                     <el-input type="age" style="width: 100%;" v-model="assemblyForm.podNamePrint"
                                         size="small" autocomplete="off"
-                                        :disabled="detailData.seeDisabled || (assemblyForm.billType == 'MH' && assemblyForm.masterBillNo > 0)"
+                                        :disabled="detailData.seeDisabled || (assemblyForm.billType == 'MH' && assemblyForm.masterBillNo > 0)||assemblyForm.preContainersList.filter(item=>item.containerNumberStatus == '已选择').length>0"
                                         clearable placeholder="卸货港" @change="textareaBlur('podNamePrint')"></el-input>
                                 </el-col>
                             </el-row>
@@ -548,8 +548,7 @@
                                         <span style="color: #1e9fff">件数</span>
                                     </span>
                                     <el-input ref="quantityRef" style="width: 100%;" v-model="assemblyForm.quantity"
-                                        size="small" autocomplete="off" min="1"
-                                        :disabled="detailData.seeDisabled"
+                                        size="small" autocomplete="off" min="1" :disabled="detailData.seeDisabled"
                                         @input="quantityInput" @focus="quantityFocus" clearable
                                         placeholder="请输入件数"></el-input>
                                 </el-form-item>
@@ -589,9 +588,8 @@
                                     </span>
                                     <el-input ref="grossWeightRef" step="0.01" style="width: 100%;"
                                         v-model="assemblyForm.grossWeight" size="small" autocomplete="off"
-                                        :disabled="detailData.seeDisabled"
-                                        @input="floatingInput($event, 'grossWeight')" @focus="quantityFocus" clearable
-                                        placeholder="请输入毛重"></el-input>
+                                        :disabled="detailData.seeDisabled" @input="floatingInput($event, 'grossWeight')"
+                                        @focus="quantityFocus" clearable placeholder="请输入毛重"></el-input>
                                 </el-form-item>
                             </el-col>
                             <el-col :span="12">
@@ -602,9 +600,8 @@
                                     </span>
                                     <el-input ref="measurementRef" step="0.01" style="width: 106%;"
                                         v-model="assemblyForm.measurement" size="small" autocomplete="off"
-                                        :disabled="detailData.seeDisabled"
-                                        @input="floatingInput($event, 'measurement')" @focus="quantityFocus" clearable
-                                        placeholder="请输入尺码/体积"></el-input>
+                                        :disabled="detailData.seeDisabled" @input="floatingInput($event, 'measurement')"
+                                        @focus="quantityFocus" clearable placeholder="请输入尺码/体积"></el-input>
                                 </el-form-item>
                             </el-col>
                         </div>
@@ -1508,22 +1505,25 @@ export default {
         },
         // 件数聚焦
         quantityFocus() {
-            if (this.assemblyForm.containersList&&this.assemblyForm.containersList.length) {
-                let num=0
-                for(let item of this.assemblyForm.containersList){
-                    num+=Number(item.quantity)
-                }
-                if (Number(num) == 0) {
-                    this.$alert('当前数据已经均分箱量,请撤销之后再修改', '提示', {
-                        confirmButtonText: '确定',
-                    });
-                    this.$nextTick(() => {
-                        this.$refs.quantityRef.blur()
-                        this.$refs.grossWeightRef.blur()
-                        this.$refs.measurementRef.blur()
-                    })
-                    return
-                }
+            if (this.assemblyForm.containersList && this.assemblyForm.containersList.length) {
+                this.$alert('当前数据已经均分箱量,请撤销之后再修改', '提示', {
+                    confirmButtonText: '确定',
+                });
+                // let num=0
+                // for(let item of this.assemblyForm.containersList){
+                //     num+=Number(item.quantity)
+                // }
+                // if (Number(num) == 0) {
+                //     this.$alert('当前数据已经均分箱量,请撤销之后再修改', '提示', {
+                //         confirmButtonText: '确定',
+                //     });
+                //     this.$nextTick(() => {
+                //         this.$refs.quantityRef.blur()
+                //         this.$refs.grossWeightRef.blur()
+                //         this.$refs.measurementRef.blur()
+                //     })
+                //     return
+                // }
             }
         },
         // 件数监听

+ 7 - 2
src/views/iosBasicData/SeafreightExportF/bills/assembly/EntrustmentLnformation/precontainers.vue

@@ -7,9 +7,9 @@
             @resetColumn="resetColumnTwo('crud', 'option', 'optionBack', 487)"
             @saveColumn="saveColumnTwo('crud', 'option', 'optionBack', 487)">
             <template slot="menuLeft">
-                <el-button type="primary" size="small" :disabled="seeDisabled" @click.stop="addfun">新 增</el-button>
+                <el-button type="primary" size="small" :disabled="seeDisabled||assemblyForm.preContainersList.filter(item=>item.containerNumberStatus == '已选择').length>0" @click.stop="addfun">新 增</el-button>
                 <el-button type="danger" size="small" plain
-                    :disabled="seeDisabled || assemblyForm.preContainersList.length == 0"
+                    :disabled="seeDisabled || assemblyForm.preContainersList.length == 0||assemblyForm.preContainersList.filter(item=>item.containerNumberStatus == '已选择').length>0"
                     @click.stop="handleDelete">一键删除
                 </el-button>
                 <el-button type="primary" size="small"
@@ -513,8 +513,13 @@ export default {
         },
         onclickEdit() {
             for (let item of this.assemblyForm.preContainersList) {
+                if(item.containerNumberStatus == '已选择'){
+                    return this.$message.error('请撤销放箱号,再进行编辑!')
+                }else{
                 this.$delete(item, '$cellEdit')
                 this.$set(item, '$cellEdit', true)
+                }
+
             }
         },
         // 件数失焦事件

+ 4 - 3
src/views/iosBasicData/SeafreightExportF/bills/assembly/formbottom.vue

@@ -67,7 +67,8 @@
                     </el-form-item>
                 </el-col>
                 <el-col :span="6">
-                    <el-form-item label="业务来源" prop="srcType">
+                    <el-form-item label="业务来源" prop="srcType"
+                        :rules="[{ required: true, message: '', trigger: 'blur' }]">
                         <el-row :gutter="10">
                             <el-col :span="10">
                                 <search-query :datalist="sourceTypeData" :selectValue="assemblyForm.srcType"
@@ -247,8 +248,8 @@
                             <span style="color: #1e9fff">单据类型</span>
                         </span>
                         <search-query :datalist="billTypeData" :selectValue="assemblyForm.billType" :filterable="true"
-                            :clearable="true" :remote="true" :disabled="true" :buttonIf="false"
-                            placeholder="请选择单据类型" @corpChange="corpChange($event, 'billType')">
+                            :clearable="true" :remote="true" :disabled="true" :buttonIf="false" placeholder="请选择单据类型"
+                            @corpChange="corpChange($event, 'billType')">
                         </search-query>
                     </el-form-item>
                 </el-col>

+ 6 - 3
src/views/iosBasicData/SeafreightExportF/bills/billsDetails.vue

@@ -119,7 +119,7 @@
                                                                 }} {{ item[0].label }}
                                                             </span>
                                                             <span v-else style="color: #1e9fff">{{ item[0].label
-                                                            }}</span>
+                                                                }}</span>
                                                         </span>
                                                         <span v-if="item[0].type == 'button'"></span>
                                                         <!--<el-button v-if="item[0].type == 'button'" :disabled="detailData.seeDisabled || item[0].disabled"-->
@@ -546,7 +546,7 @@ export default {
                 serviceTerms: 'CY-CY', // 服务方式
                 polFreeBoxUseDays: '7',
                 podFreeBoxUseDays: '14',
-                boxBelongsTo:'SOC',
+                boxBelongsTo: 'SOC',
                 filesList: [], // 文件中心
                 feeCenterListD: [], // 收
                 feeCenterListC: [], // 付
@@ -592,7 +592,7 @@ export default {
                 serviceTerms: 'CY-CY', // 服务方式
                 polFreeBoxUseDays: '7',
                 podFreeBoxUseDays: '14',
-                boxBelongsTo:'SOC',
+                boxBelongsTo: 'SOC',
                 filesList: [], // 文件中心
                 feeCenterListD: [], // 收
                 feeCenterListC: [], // 付
@@ -2073,6 +2073,9 @@ export default {
                     if (!this.form.etd) {
                         msgs.push('ETD')
                     }
+                    if (!this.form.srcType || !this.form.srcCnName) {
+                        msgs.push('业务来源')
+                    }
                     // if (!this.form.teamName) {
                     //     msgs.push('所属团队')
                     // }

+ 9 - 2
src/views/iosBasicData/SeafreightExportF/bills/index.vue

@@ -49,7 +49,7 @@
                         v-if="isHq == 1 && (roleName.indexOf('admin') >= 0 || roleName.indexOf('应付修改') >= 0 || roleName.indexOf('应付查看') >= 0)"
                         type="primary" plain size="small" @click="costSubmit"
                         :disabled="!selectionList.length">提取成本</el-button>
-<!--                    <el-button type="success" plain size="small" @click="freightRateSubmit"
+                    <!--                    <el-button type="success" plain size="small" @click="freightRateSubmit"
                         :disabled="!selectionList.length">提取运价</el-button>-->
                     <el-button
                         v-if="roleName.indexOf('admin') >= 0 || roleName.indexOf('应收修改') >= 0 || roleName.indexOf('应收查看') >= 0"
@@ -169,7 +169,7 @@
                 <template slot="eta" slot-scope="scope">
                     <span>{{
                         scope.row.eta ? scope.row.eta.slice(0, 10) : ""
-                        }}</span>
+                    }}</span>
                 </template>
                 <template slot="updateTime" slot-scope="scope">
                     <span>{{
@@ -1679,6 +1679,13 @@ export default {
                 }, 200);
             }
         }
+        if (this.$route.query.params) {
+            if (!this.$store.getters.seaFEStatus) {
+                setTimeout(() => {
+                    this.rowCellfun(this.$route.query.params);
+                }, 200);
+            }
+        }
     },
     methods: {
         freightRateSubmit() {

+ 3 - 3
src/views/iosBasicData/boxPlan/boxPlan/detailsPage.vue

@@ -935,9 +935,9 @@ export default {
       }
     },
     addRow() {
-      if (!this.form.id) {
-        return this.$message.error("请保存数据");
-      }
+      // if (!this.form.id) {
+      //   return this.$message.error("请保存数据");
+      // }
       this.$refs.crud.dicInit();
       this.form.useBoxPlanItemList.push({
         pid: this.form.id,

+ 27 - 1
src/views/iosBasicData/boxPlan/boxStatistics/index.vue

@@ -23,12 +23,18 @@
 import { getList } from "@/api/iosBasicData/boxPlan/boxStatistics.js";
 import { defaultDate2 } from "@/util/date";
 import dicSelect from "@/components/dicSelect/main";
+import { getWeekNumber, getWeeksInYear, getYearDate, getWeekRange } from "@/util/date";
 import { getToken } from "@/util/auth";
 export default {
   data() {
     return {
       form: {},
-      query: {},
+      query: {
+        year: getYearDate().toString(),
+        week: getWeekNumber().weekNumber,
+        startDate: getWeekNumber().mondayDate,
+        endDate: getWeekNumber().sundayDate
+      },
       loading: false,
       page: {
         pageSize: 10,
@@ -94,6 +100,26 @@ export default {
             search: true,
           },
           {
+            label: '目的港',
+            prop: 'podCname',
+            overHidden: true,
+          },
+          {
+            label: '20GP',
+            prop: 'price20gp',
+            overHidden: true,
+          },
+          {
+            label: '40GP',
+            prop: 'price40gp',
+            overHidden: true,
+          },
+          {
+            label: '40HC',
+            prop: 'price40hc',
+            overHidden: true,
+          },
+          {
             label: "制单人",
             prop: "createUserName",
             overHidden: true,

+ 4 - 1
src/views/iosBasicData/businessCenter/bookingCabin/detailsPage.vue

@@ -256,6 +256,9 @@ export default {
         businessType: 'YDC',
         billNoFormat: 'YDC',
         businessTypeCode: 'YDC',
+        polFreeBoxUseDays: 7,
+        podFreeBoxUseDays: 14,
+        loadType: "整箱", // 装箱方式默认整箱
         polId: null,
         polCode: null,
         polEnName: null,
@@ -386,7 +389,7 @@ export default {
           {
             label: '总TEU',
             prop: "teu",
-            disabled: false,
+            disabled: true,
           },
           /*
                    {

+ 5 - 2
src/views/iosBasicData/businessCenter/customerLetter/detailsPage.vue

@@ -485,6 +485,9 @@ export default {
         polNamePrint: null,
         serviceTerms: 'CY-CY',
         mpaymode: 'PP',
+        polFreeBoxUseDays: 7,
+        podFreeBoxUseDays: 14,
+        loadType: "整箱", // 装箱方式默认整箱
         detail: {},
         preContainersList: [],
         feeCenterListC: [],
@@ -1315,8 +1318,8 @@ export default {
             }).finally(() => {
               loading.close();
             })
-          }).catch(()=>{
-             loading.close();
+          }).catch(() => {
+            loading.close();
           })
 
         });

+ 0 - 4
src/views/iosBasicData/businessCenter/customerLetter/index.vue

@@ -221,8 +221,6 @@ export default {
                         prop: "operatorName",
                         width: "80",
                         overHidden: true,
-                        hide: true,
-                        showColumn: false,
                         search: true,
                         type: 'select',
                         filterable: true,
@@ -237,8 +235,6 @@ export default {
                         prop: "customerServiceName",
                         width: "80",
                         overHidden: true,
-                        hide: true,
-                        showColumn: false,
                         search: true,
                         type: 'select',
                         filterable: true,

+ 3 - 1
src/views/iosBasicData/overdueFee/detailsPage.vue

@@ -76,6 +76,8 @@ export default {
       editButton: false,
       editDisabled: false,
       form: {
+        branchId: JSON.parse(localStorage.getItem('sysitemData')).deptId,
+        branchName: JSON.parse(localStorage.getItem('sysitemData')).deptName,
         status: 0,
         storageFeesItemsList: [],
       },
@@ -98,7 +100,7 @@ export default {
             }],
           },
           {
-            label: '仓储费类型',
+            label: '超期费类型',
             prop: 'type',
             disabled: false,
             type: 'select',

+ 1 - 1
src/views/iosBasicData/overdueFee/index.vue

@@ -85,7 +85,7 @@ export default {
             showColumn: false,
           },
           {
-            label: '仓储费类型',
+            label: '超期费类型',
             prop: 'type',
             overHidden: true,
             search: true,

+ 0 - 1
src/views/iosBasicData/podStation/index.vue

@@ -137,7 +137,6 @@ export default {
             label: 'ETD',
             prop: 'etd',
             width: 120,
-            hide: true,
             search: true,
             searchProp: 'actualEtdList',
             overHidden: true,

+ 960 - 0
src/views/ow/contract/detailsPage.vue

@@ -0,0 +1,960 @@
+<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="goBack()">返回列表
+        </el-button>
+      </div>
+      <div class="add-customer-btn">
+        <el-button size="small" style="margin-right: 8px" :disabled="!form.id" @click="$refs.print.openDialog()">预 览
+        </el-button>
+        <el-button v-if="roleName.indexOf('admin') != -1" size="small" style="margin-right: 8px" :disabled="!form.id"
+          @click="$refs.report.openDialog()">报表设计
+        </el-button>
+        <el-button class="el-button--small-yh" style="margin-left: 6px;" type="primary" size="small" v-if="editButton"
+          :disabled="showLock || !(roleName.indexOf('admin') != -1 || roleName.indexOf('允许修改他人业务') != -1 || saberUserInfo.user_id == form.createUser)"
+          @click="inEdit">编 辑
+        </el-button>
+        <el-button class="el-button--small-yh" v-else style="margin-left: 6px;" type="primary" size="small"
+          :disabled="isSaveBtn" @click="submit">保 存
+        </el-button>
+        <!-- <el-button v-if="form.status == '审核提交'" class="el-button--small-yh" style="margin-left: 6px;" type="danger"
+          size="small" @click="revokeApplication">撤销单据请核
+        </el-button> -->
+        <!-- <el-dropdown style="line-height: 0">
+          <el-button class="el-button--small-yh" style="margin-left: 6px;" type="warning" :disabled="!form.id"
+            size="small">
+            审 批<i class="el-icon-arrow-down el-icon--right"></i>
+          </el-button>
+          <el-dropdown-menu slot="dropdown">
+            <el-dropdown-item @click.native="checkScheduleDialog = true, checkId = form.id">审核进度
+            </el-dropdown-item>
+          </el-dropdown-menu>
+        </el-dropdown> -->
+      </div>
+    </div>
+    <div style="margin-top: 50px">
+      <trade-card title="基础信息">
+        <avue-form :option="optionForm" v-model="form" ref="form">
+          <tempalte slot="purchaseCompanyName">
+            <dic-select v-model="form.purchaseCompanyName" placeholder="USER" key="id" label="shortName" res="records"
+              @selectChange="dicChange('purchaseCompanyName', $event)" :disabled="form.whetherEnable == '是'"
+              url="/blade-los/bcorps/selectList?status=0&current=1&size=5&corpTypeName=箱东" :filterable="true"
+              :remote="true" dataName="shortName" :slotRight="true" rightLabel="code">
+            </dic-select>
+          </tempalte>
+          <template slot="boxTypeQuantityOne">
+            <dic-select v-model="form.boxTypeQuantityOne" key="id" label="cnName" res="records"
+              url="/blade-los/bcntrtypes/list?status=0&current=1&size=20" :filterable="true" :remote="true"
+              dataName="cnName" @selectChange="dicChange('boxTypeQuantityOne', $event)"
+              :disabled="editDisabled"></dic-select>
+          </template>
+          <template slot="perDiemAfterFreeDays">
+            <el-button type="primary" size="small" @click.stop="openRtDialog" :disabled="editDisabled">箱租金条款</el-button>
+            <!-- <el-link type="primary" :underline="false" @click.stop="openRtDialog">箱租金条款</el-link> -->
+          </template>
+          <template slot="boxNumber">
+            <el-input-number v-model="form.boxNumber" :disabled="editDisabled" :min="1" :controls="false"
+              placeholder="请输入 箱量" style="width: 100%;"></el-input-number>
+          </template>
+        </avue-form>
+      </trade-card>
+      <trade-card title="操作记录">
+        <avue-form :option="optionForm2" v-model="form" ref="form2">
+        </avue-form>
+      </trade-card>
+    </div>
+    <business-reports :id="form.id" :itemIds="itemIds" ref="print" businessValue="OW-HY"
+      :type="true"></business-reports>
+    <business-reports :id="form.id" :itemIds="itemCIds" ref="printC" businessValue="OW-HY" classifyCode="费用"
+      groupCode="应付" :selecList="selectionfeecList"></business-reports>
+    <reports :id="form.id" :assemblyForm="form" businessValue="OW-HY" ref="report"></reports>
+    <!--审核弹窗-->
+    <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>
+    <el-dialog title="箱租金条款" append-to-body :visible.sync="rtDialog" width="50%" :close-on-click-modal="false"
+      v-dialog-drag>
+      <avue-crud :option="rtOption" :data="form.rentTermList" id="out-table" ref="crud"
+        :header-cell-class-name="headerClassName" :row-style="{ height: '20px', padding: '0px' }"
+        :cell-style="{ height: '20px', padding: '0px' }">
+        <template slot="indexHeader" slot-scope="{row,index}">
+          <el-button type="primary" size="mini" icon="el-icon-plus"
+            :disabled="editDisabled || feeCenterListD.filter(item => item.feeCnName == '租箱费').length > 0" circle
+            @click="rtAddRow()">
+          </el-button>
+        </template>
+        <template slot="index" slot-scope="{row,index}">
+          <span>{{ index + 1 }}</span>
+        </template>
+        <template slot="menu" slot-scope="{ row, index }">
+          <el-button size="small" icon="el-icon-edit" type="text" @click="rowEdit(row, index)"
+            :disabled="feeCenterListD.filter(item => item.feeCnName == '租箱费').length > 0">{{ row.$cellEdit ? '保存' :
+              '编辑'
+            }}</el-button>
+          <el-button size="small" icon="el-icon-delete" type="text" @click="rowDel(row, index)"
+            :disabled="feeCenterListD.filter(item => item.feeCnName == '租箱费').length > 0">删除</el-button>
+        </template>
+      </avue-crud>
+      <span slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="rtSubmit" size="mini"
+          :disabled="feeCenterListD.filter(item => item.feeCnName == '租箱费').length > 0">保 存</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  detail,
+  submit,
+  pleaseCheck,
+  repealCancel,
+  tradingBoxItem,
+  tradingBoxFees,
+  submitItemList,
+  submitFeeList,
+  enable,
+  renttermRemove,
+  copyAgent,
+  countRent,
+  revokeCountRent,
+  submitRtList,
+  pleaseVerifyCost,
+  batchUpdatePodStation,
+  getAccurate
+} from "@/api/boxManagement/buyContainer";
+import dicSelect from "@/components/dicSelect/main";
+import checkSchedule from "@/components/checkH/checkSchedule.vue";
+import businessReports from "@/components/boxManagement/businessReports.vue";
+import reports from "@/components/boxManagement/reports.vue";
+import { bfeesList } from "@/api/iosBasicData/bfees";
+import {
+  dateFormat
+} from "@/util/date";
+import {
+  bcurrencyGetExrate
+} from "@/api/iosBasicData/rateManagement";
+import {
+  getToken
+} from "@/util/auth";
+import _ from "lodash";
+import {
+  Header
+} from "element-ui";
+export default {
+  name: "detailsPage",
+  data() {
+    return {
+      rtDialog: false,
+      itemCIds: null,
+      feeType: null,
+      selectionList: [],
+      selectionfeedList: [],
+      selectionfeecList: [],
+      checkId: '', // 审核需要的id
+      batchNo: '',
+      checkScheduleDialog: false, // 审核弹窗
+      editButton: false,
+      editDisabled: false,
+      form: {
+        type: "OW-HY",
+        dc: 'd',
+        pickupFee: 50,
+        boxCondition: '新',
+        conditions: 'CW',
+        freeDay: 30,
+        rentTermList: [{
+          curCode: 'USD',
+          $cellEdit: true
+        },
+        {
+          curCode: 'USD',
+          $cellEdit: true
+        },
+        {
+          curCode: 'USD',
+          $cellEdit: true
+        },
+        {
+          curCode: 'USD',
+          $cellEdit: true
+        }
+        ],
+      },
+      feeCenterListD: [],
+      feeCenterListC: [],
+      oldForm: {},
+      optionForm: {
+        menuBtn: false,
+        span: 6,
+        disabled: false,
+        labelWidth: 120,
+        column: [
+          {
+            label: 'USER',
+            prop: 'purchaseCompanyName',
+            disabled: false,
+            rules: [{
+              required: true,
+              message: "",
+              trigger: "blur"
+            }]
+          },
+          {
+            label: '地址',
+            prop: 'address',
+            disabled: false,
+          },
+          {
+            label: '电话',
+            prop: 'tel',
+            disabled: false,
+          },
+          {
+            label: '联系人',
+            prop: 'contacts',
+            disabled: false,
+          },
+          {
+            label: '箱型',
+            prop: 'boxTypeQuantityOne',
+            disabled: false,
+            rules: [{
+              required: true,
+              message: "",
+              trigger: "blur"
+            }]
+          },
+          {
+            label: '箱量',
+            prop: 'boxNumber',
+            disabled: false,
+            rules: [{
+              required: true,
+              message: "",
+              trigger: "blur"
+            }]
+          },
+          {
+            label: 'Pickup fee',
+            prop: 'dc',
+            disabled: false,
+            placeholder: '请选择 收付',
+            type: 'select',
+            dicData: [{
+              label: '收',
+              value: 'd',
+            }, {
+              label: '付',
+              value: 'c',
+            }],
+            span: 4
+          },
+          {
+            label: '',
+            labelWidth: 0,
+            placeholder: '请输入 Pickup fee',
+            prop: 'pickupFee',
+            disabled: false,
+            span: 2
+          },
+          {
+            label: 'Condition',
+            prop: 'conditions',
+            type: 'select',
+            dicUrl: "/api/blade-system/dict-biz/dictionary?code=conditions",
+            props: {
+              label: "dictValue",
+              value: "dictValue"
+            },
+            disabled: false
+          },
+          {
+            label: 'Free day',
+            prop: 'freeDay',
+            disabled: false
+          },
+          {
+            label: 'LOLO-POL',
+            prop: 'loloPol',
+            type: 'select',
+            dicUrl: "/api/blade-system/dict-biz/dictionary?code=lolo",
+            props: {
+              label: "dictValue",
+              value: "dictValue"
+            },
+            disabled: false,
+            rules: [{
+              required: true,
+              message: "",
+              trigger: "blur"
+            }]
+          },
+          {
+            label: 'LOLO-POD',
+            prop: 'loloPod',
+            type: 'select',
+            dicUrl: "/api/blade-system/dict-biz/dictionary?code=lolo",
+            props: {
+              label: "dictValue",
+              value: "dictValue"
+            },
+            disabled: false,
+            rules: [{
+              required: true,
+              message: "",
+              trigger: "blur"
+            }]
+          },
+          {
+            label: 'Per Diem after free days',
+            prop: 'perDiemAfterFreeDays',
+            disabled: false,
+            labelWidth: 150,
+          },
+          {
+            label: 'DRV',
+            prop: 'drv',
+            disabled: false
+          },
+          {
+            label: 'DPP',
+            prop: 'dpp',
+            disabled: false
+          },
+          {
+            label: 'The rest as per our agreement',
+            prop: 'agreement',
+            disabled: false,
+            labelWidth: 180,
+          },
+          {
+            label: '备注',
+            prop: 'remarks',
+            type: 'textarea',
+            disabled: false,
+            minRows: 2,
+            span: 6
+          }
+        ]
+      },
+      optionForm2: {
+        menuBtn: false,
+        span: 5,
+        disabled: true,
+        labelWidth: 100,
+        column: [{
+          label: '系统号',
+          prop: 'sysNo',
+          disabled: true
+        },
+        {
+          label: '制单人',
+          prop: "createUserName",
+          disabled: true,
+          span: 4,
+        },
+        {
+          label: '制单日期',
+          prop: "createTime",
+          disabled: true,
+        },
+        {
+          label: '修改人',
+          prop: "updateUserName",
+          disabled: true,
+          span: 4,
+        },
+        {
+          label: '修改日期',
+          prop: "updateTime",
+          disabled: true,
+        }
+        ]
+      },
+      sumData: [],
+      sumOption: {
+        border: true,
+        align: 'center',
+        menuAlign: 'center',
+        menu: false,
+        header: false,
+        addBtn: false,
+        // height: '100px',
+        column: [{
+          label: '客户',
+          prop: 'corpCnName',
+          overHidden: true,
+        },
+        {
+          label: '本币应收',
+          prop: 'rmbD',
+          overHidden: true,
+        },
+        {
+          label: '本币应付',
+          prop: 'rmbC',
+          overHidden: true,
+        },
+        {
+          label: '外币应收',
+          prop: 'usdD',
+          overHidden: true,
+        },
+        {
+          label: '外币应付',
+          prop: 'usdC',
+          overHidden: true,
+        },
+        {
+          label: '合计应收',
+          prop: 'sumD',
+          overHidden: true,
+        },
+        {
+          label: '合计应付',
+          prop: 'sumC',
+          overHidden: true,
+        }
+        ]
+      },
+      rtOption: {
+        border: true,
+        align: 'center',
+        menuWidth: 120,
+        // menu: false,
+        editBtn: false,
+        delBtn: false,
+        header: false,
+        addBtn: false,
+        height: '400px',
+        column: [{
+          label: "index",
+          prop: "index",
+          width: "55",
+          headerslot: true,
+        },
+        {
+          label: '起',
+          prop: 'riseDays',
+          cell: true,
+          type: 'number',
+          controls: false,
+          overHidden: true,
+        },
+        {
+          label: '止',
+          prop: 'stopDays',
+          cell: true,
+          type: 'number',
+          controls: false,
+          overHidden: true,
+        },
+        {
+          label: '费率',
+          prop: 'rate',
+          cell: true,
+          type: 'number',
+          controls: false,
+          overHidden: true,
+        },
+        {
+          label: '无货返空费率',
+          prop: 'emptyRate',
+          cell: true,
+          type: 'number',
+          controls: false,
+          overHidden: true,
+        },
+        {
+          label: '币别',
+          prop: 'curCode',
+          cell: true,
+          type: 'select',
+          dicData: [{
+            label: 'CNY',
+            value: 'CNY',
+          }, {
+            label: 'USD',
+            value: 'USD',
+          }],
+          overHidden: true,
+        },
+        ]
+      },
+      roleName: [],
+      deptId: JSON.parse(localStorage.getItem('sysitemData')).deptId
+    }
+  },
+  components: {
+    dicSelect,
+    checkSchedule,
+    businessReports,
+    reports
+  },
+  props: {
+    detailData: Object
+  },
+  async created() {
+    this.roleName = localStorage.getItem('roleName').split(',')
+    if (this.detailData && this.detailData.id) {
+      // this.editButton = true
+      // this.editDisabled = true
+      // this.optionForm.disabled = true
+      this.getDetail(this.detailData.id)
+    }
+    // if (this.$route.query.params) {
+    //   this.getDetail(this.$route.query.params)
+    // }
+    // if (this.detailData.copyId) {
+    //   this.getCopydate(this.detailData.copyId)
+    // }
+    // this.saveLocalCurrency(this.deptId)
+  },
+  methods: {
+    verifyChange(name, row) {
+      if (row[name]) {
+        getAccurate({ accurate: row[name] }).then(res => {
+          if (res.data.data.records.length == 0) {
+            const regex = /^([a-zA-Z]{4})([0-9]{7})$/;
+            if (regex.test(row[name])) {
+              if (this.calculateCheckDigit(row[name]) == row[name][10]) {
+                // this.$message.success('集装箱校验正确!')
+              } else {
+                this.$confirm(`箱号:${row[name]}是否强制加入系统?`, '提示', {
+                  confirmButtonText: '确定',
+                  cancelButtonText: '取消',
+                  type: 'warning'
+                }).then(() => {
+                  // this.$message({
+                  //   type: 'success',
+                  //   message: '删除成功!'
+                  // });
+                }).catch(() => {
+                  this.$set(row, [name], null)
+                });
+              }
+            } else {
+              this.$confirm(`箱号:${row[name]}是否强制加入系统?`, '提示', {
+                confirmButtonText: '确定',
+                cancelButtonText: '取消',
+                type: 'warning'
+              }).then(() => {
+                // this.$message({
+                //   type: 'success',
+                //   message: '删除成功!'
+                // });
+              }).catch(() => {
+                this.$set(row, [name], null)
+              });
+            }
+          }
+
+        })
+      }
+    },
+    calculateCheckDigit(containerNo) {
+      let charCode = "0123456789A?BCDEFGHIJK?LMNOPQRSTU?VWXYZ";
+      let num = 0;
+      for (let i = 0; i < 10; i++) {
+        let idx = charCode.indexOf(containerNo[i]);
+        idx = idx * Math.pow(2, i);
+        num += idx;
+      }
+      return num = (num % 11) % 10;
+    },
+    openRtDialog() {
+      if (!this.form.id) {
+        return this.$message.error("请保存数据");
+      }
+      this.rtDialog = true
+    },
+    getSum() {
+      let sumArr = []
+      let corpArr = []
+      let newArr = []
+      this.sumData = []
+      sumArr = this.feeCenterListD.concat(this.feeCenterListC)
+      sumArr.forEach(e => {
+        if (e.shortName) {
+          corpArr.push(e.shortName)
+        }
+      })
+      newArr = [... new Set(corpArr)]
+      newArr.forEach(e => {
+        let rmbD = 0
+        let rmbC = 0
+        let usdD = 0
+        let usdC = 0
+        let sumD = 0
+        let sumC = 0
+        sumArr.forEach(item => {
+          if (e == item.shortName) {
+            if (item.curCode == this.getLocalCurrency() && item.dc == 'D') {
+              rmbD += Number(item.amountCNY ? item.amountCNY : 0)
+              sumD += Number(item.amountCNY ? item.amountCNY : 0)
+            }
+            if (item.curCode == this.getLocalCurrency() && item.dc == 'C') {
+              rmbC += Number(item.amountCNY ? item.amountCNY : 0)
+              sumC += Number(item.amountCNY ? item.amountCNY : 0)
+            }
+            if (item.curCode != this.getLocalCurrency() && item.dc == 'D') {
+              usdD += Number(item.amountUSD ? item.amountUSD : 0)
+              sumD += Number(item.amountUSD ? item.amountUSD : 0) * Number(item.exrate ? item.exrate : 0)
+            }
+            if (item.curCode != this.getLocalCurrency() && item.dc == 'C') {
+              usdC += Number(item.amountUSD ? item.amountUSD : 0)
+              sumC += Number(item.amountUSD ? item.amountUSD : 0) * Number(item.exrate ? item.exrate : 0)
+            }
+          }
+        })
+        this.sumData.push({
+          corpCnName: e,
+          rmbD: _.round(rmbD, 2),
+          rmbC: _.round(rmbC, 2),
+          usdD: _.round(usdD, 2),
+          usdC: _.round(usdC, 2),
+          sumD: _.round(sumD, 2),
+          sumC: _.round(sumC, 2)
+        })
+      })
+    },
+    countChange(row) {
+      if (row.curCode == this.getLocalCurrency()) {
+        row.amountCNY = _.round(_.multiply(row.price, row.quantity), 2)
+        row.amountUSD = 0
+      } else {
+        row.amountCNY = 0
+        row.amountUSD = _.round(_.multiply(row.price, row.quantity), 2)
+      }
+    },
+    dicChange(name, row) {
+      if (name == 'purchaseCompanyName') {
+        if (row) {
+          this.form.purchaseCompanyId = row.id
+        } else {
+          this.form.purchaseCompanyId = null
+          this.form.purchaseCompanyName = null
+        }
+      }
+    },
+    rowEdit(row) {
+      if (row.$cellEdit == true) {
+        if (!row.riseDays || Number(row.riseDays) == 0) {
+          return this.$message.error("起必须大于0");
+        }
+        if (!row.stopDays || Number(row.stopDays) == 0) {
+          return this.$message.error("止必须大于0");
+        }
+        if (!row.curCode) {
+          return this.$message.error("请完善币别");
+        }
+        this.$set(row, "$cellEdit", false);
+      } else {
+        this.$set(row, "$cellEdit", true);
+      }
+    },
+    rtAddRow() {
+      this.form.rentTermList.push({
+        pid: this.form.id,
+        $cellEdit: true
+      })
+    },
+    rtSubmit() {
+      for (let row of this.form.rentTermList) {
+        if (Number(row.riseDays) == 0) {
+          return this.$message.error("起必须大于0");
+        }
+        if (Number(row.stopDays) == 0) {
+          return this.$message.error("止必须大于0");
+        }
+        if (!row.curCode) {
+          return this.$message.error("请完善币别");
+        }
+        if (this.form.rentTermList[0].curCode != row.curCode) {
+          return this.$message.error("币别要保持一致");
+        }
+      }
+      const loading = this.$loading({
+        lock: true,
+        text: '加载中',
+        spinner: 'el-icon-loading',
+        background: 'rgba(255,255,255,0.7)'
+      });
+      submitRtList(this.form.rentTermList).then(res => {
+        this.$message.success("保存成功");
+        this.form.rentTermList = res.data.data
+        this.rtDialog = false
+      }).finally(() => {
+        loading.close();
+      })
+    },
+    selectionChange(list) {
+      this.selectionList = list;
+    },
+    getDetail(id) {
+      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
+      }).finally(() => {
+        loading.close()
+      })
+    },
+    getCopydate(id) {
+      const loading = this.$loading({
+        lock: true,
+        text: '加载中',
+        spinner: 'el-icon-loading',
+        background: 'rgba(255,255,255,0.7)'
+      });
+      copyAgent({
+        id: id
+      }).then(res => {
+        this.form = res.data.data
+      }).finally(() => {
+        loading.close()
+      })
+    },
+    inEdit() {
+      this.editButton = false
+      if (this.form.status == '录入') {
+        this.editDisabled = false
+        this.optionForm.disabled = false
+      }
+    },
+    rowDel(row, index) {
+      this.$confirm("确定删除数据?", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        if (row.id) {
+          renttermRemove({
+            ids: row.id
+          }).then(res => {
+            this.form.rentTermList.splice(index, 1);
+            this.$message.success("成功删除");
+          })
+        } else {
+          this.form.rentTermList.splice(index, 1);
+        }
+      });
+    },
+    submit(type) {
+      this.$refs["form"].validate((valid, done) => {
+        done();
+        if (valid) {
+          const loading = this.$loading({
+            lock: true,
+            text: '加载中',
+            spinner: 'el-icon-loading',
+            background: 'rgba(255,255,255,0.7)'
+          });
+          submit(this.form).then(res => {
+            this.$message.success("保存成功");
+            this.getDetail(res.data.data.id)
+          }).finally(() => {
+            loading.close();
+          })
+
+        } else {
+          return false;
+        }
+      });
+    },
+    application() {
+      this.$confirm("确定请核数据?", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        let obj = {}
+        obj = {
+          id: this.form.id,
+          url: '/iosBasicData/costcenter/coc/index',
+          pageStatus: '',
+          pageLabel: '航线成本(COC)',
+        }
+        const loading = this.$loading({
+          lock: true,
+          text: '加载中',
+          spinner: 'el-icon-loading',
+          background: 'rgba(255,255,255,0.7)'
+        });
+        pleaseCheck(obj).then(res => {
+          this.$message.success("请核成功");
+          this.getDetail(res.data.data.id)
+        }).finally(() => {
+          loading.close();
+        })
+      });
+    },
+    revokeApplication() {
+      this.$confirm("确定撤销请核?", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        let obj = {}
+        obj = {
+          id: this.form.id,
+        }
+        const loading = this.$loading({
+          lock: true,
+          text: '加载中',
+          spinner: 'el-icon-loading',
+          background: 'rgba(255,255,255,0.7)'
+        });
+        repealCancel(obj).then(res => {
+          this.$message.success("撤销请核成功");
+          this.getDetail(res.data.data.id)
+          this.editDisabled = false
+          this.optionForm.disabled = false
+        }).finally(() => {
+          loading.close();
+        })
+      });
+    },
+    //请核关闭
+    choceScheduleFun() {
+      this.checkScheduleDialog = false
+    },
+    //自定义列保存
+    async saveColumn(ref, option, optionBack, code) {
+      const inSave = await this.saveColumnData(this.getColumnName(code), this[option]);
+      if (inSave) {
+        this.$message.success("保存成功");
+        //关闭窗口
+        this.$refs[ref].$refs.dialogColumn.columnBox = false;
+      }
+    },
+    //自定义列重置
+    async resetColumn(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;
+      }
+    },
+    // 更改表格颜色
+    headerClassName(tab) {
+      //颜色间隔
+      let back = ""
+      if (tab.columnIndex >= 0 && tab.column.level === 1) {
+        if (tab.columnIndex % 2 === 0) {
+          back = "back-one"
+        } else if (tab.columnIndex % 2 === 1) {
+          back = "back-two"
+        }
+      }
+      return back;
+    },
+    goBack(type) {
+      this.$emit("goBack");
+    },
+  },
+  watch: {
+    // 监听业务类型 如果不是分单 可以编辑分单号
+    'feeCenterListD': {
+      // 执行方法
+      handler(oldValue, newValue) {
+        this.getSum()
+      },
+      deep: true, // 深度监听
+      immediate: true // 第一次改变就执行
+    },
+    // 监听箱信息数据 箱信息中有温度 自动切换 冻货
+    'feeCenterListC': {
+      // 执行方法
+      handler(oldValue, newValue) {
+        this.getSum()
+      },
+      deep: true, // 深度监听
+      immediate: true // 第一次改变就执行,
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+::v-deep .el-form-item__error {
+  display: none !important;
+}
+
+::v-deep .el-form-item {
+  margin-bottom: 8px !important;
+}
+
+::v-deep .el-table .cell {
+  padding: 0 2px !important;
+
+  .el-form-item {
+    margin-bottom: 0px !important;
+  }
+
+}
+
+::v-deep .avue-crud .el-table .el-form-item__label {
+  left: -1px;
+}
+
+// ::v-deep#out-table .back-one {
+//     background: #ecf5ff !important;
+// }
+
+// ::v-deep#out-table .back-two {
+//     background: #ecf5ff !important;
+// }
+
+::v-deep #out-table .back-one {
+  background: #ecf5ff !important;
+  text-align: center;
+  padding: 4px 0;
+}
+
+::v-deep #out-table .back-two {
+  background: #ecf5ff !important;
+  text-align: center;
+  padding: 4px 0;
+}
+
+
+::v-deep .el-table--small td,
+.el-table--small th {
+  padding: 2px !important;
+}
+
+::v-deep .el-card__body {
+  padding: 3px 10px;
+}
+
+::v-deep .box-card .el-card__body {
+  padding: 4px !important;
+}
+
+.disabledBox {
+  display: flex;
+  align-items: center;
+}
+
+.fontSize {
+  font-size: 16px;
+  color: #81B337;
+}
+
+.meetSize {
+  font-size: 16px;
+  color: #54BCBD;
+}
+</style>

+ 428 - 0
src/views/ow/contract/index.vue

@@ -0,0 +1,428 @@
+<template>
+  <div>
+    <basic-container v-if="isShow">
+      <avue-crud :option="option" :table-loading="loading" :data="data" :page.sync="page" :search.sync="query"
+        v-model="form" id="out-table" :header-cell-class-name="headerClassName" ref="crud" @row-del="rowDel"
+        @search-change="searchChange" @search-reset="searchReset" @selection-change="selectionChange"
+        @current-change="currentChange" @size-change="sizeChange" @refresh-change="refreshChange"
+        @resetColumn="resetColumn('crud', 'option', 'optionBack', 508)"
+        @saveColumn="saveColumn('crud', 'option', 'optionBack', 508)" @on-load="onLoad">
+        <template slot="menuLeft">
+          <el-button type="primary" size="small" icon="el-icon-plus" @click="addButton">创建单据
+          </el-button>
+          <el-button type="success" size="small" :disabled="selectionList.length != 1" @click="copyButton">复制单据
+          </el-button>
+          <el-button type="warning" size="small" disabled @click="outExport">导 出
+          </el-button>
+        </template>
+        <template slot="menu" slot-scope="{ row, index }">
+          <el-button size="small" icon="el-icon-edit" type="text" @click="rowEdit(row)">编辑</el-button>
+          <el-button size="small" icon="el-icon-delete" type="text" @click="rowDel(row, index)"
+            :disabled="row.count > 0 || row.whetherEnable == '是'">删 除</el-button>
+        </template>
+        <template slot="sysNo" slot-scope="{ row }">
+          <span style="color: #1e9fff;cursor: pointer;" @click="rowEdit(row)">{{ row.sysNo }}</span>
+        </template>
+        <template slot="purchaseCompanyId" slot-scope="{ row }">
+          <span style="color: #1e9fff;cursor: pointer;" @click="rowEdit(row)">{{ row.purchaseCompanyName }}</span>
+        </template>
+        <template slot="containerNumber" slot-scope="{ row }">
+          <span style="color: #1e9fff;cursor: pointer;" @click="rowEdit(row)">{{ row.containerNumber }}</span>
+        </template>
+      </avue-crud>
+    </basic-container>
+    <detailsPage v-if="!isShow" :detailData="detailData" @goBack="goBack"></detailsPage>
+  </div>
+</template>
+
+<script>
+import { getList, remove } from "@/api/boxManagement/buyContainer/index.js";
+import { getWorkDicts } from "@/api/system/dictbiz";
+import detailsPage from "./detailsPage";
+import { getToken } from "@/util/auth";
+import _ from "lodash";
+export default {
+  data() {
+    return {
+      isShow: true,
+      form: {},
+      query: {
+        type: "OW-HY",
+      },
+      loading: false,
+      page: {
+        pageSize: 10,
+        currentPage: 1,
+        total: 0
+      },
+      selectionList: [],
+      option: {},
+      optionBack: {
+        height: 'auto',
+        calcHeight: 30,
+        menuWidth: 140,
+        tip: false,
+        searchShow: true,
+        searchMenuSpan: 6,
+        border: true,
+        index: true,
+        addBtn: false,
+        viewBtn: false,
+        editBtn: false,
+        delBtn: false,
+        selection: true,
+        searchIcon: true,
+        align: 'center',
+        searchIndex: 3,
+        column: [
+          {
+            label: 'USER',
+            prop: 'purchaseCompanyName',
+            width: 150,
+            overHidden: true,
+            search: true,
+            type: "select",
+            filterable: true,
+            remote: true,
+            dicUrl: "/api/blade-los/bcorps/selectList?status=0&corpTypeName=箱东&size=5&current=1&shortName={{key}}",
+            props: {
+              label: "shortName",
+              value: "shortName",
+              desc: 'code',
+              res: "data.records"
+            }
+          },
+          {
+            label: '系统号',
+            prop: 'sysNo',
+            width: 100,
+            overHidden: true,
+          },
+          {
+            label: '箱型',
+            prop: 'boxTypeQuantityOne',
+            width: 80,
+            overHidden: true,
+            search: true,
+            type: "select",
+            filterable: true,
+            remote: true,
+            dicUrl: "/api/blade-los/bcntrtypes/list?status=0&size=20&current=1&cnName={{key}}",
+            props: {
+              label: "cnName",
+              value: "cnName",
+              res: "data.records"
+            }
+          },
+          {
+            label: '箱量',
+            prop: 'boxNumber',
+            width: 80,
+            overHidden: true,
+          },
+
+          {
+            label: 'Pickup fee',
+            prop: 'pickupFee',
+            width: 80,
+            overHidden: true,
+          },
+          {
+            label: '收/付',
+            prop: 'dc',
+            width: 80,
+            overHidden: true,
+            type: 'select',
+            dicData: [{
+              label: '收',
+              value: 'd',
+            }, {
+              label: '付',
+              value: 'c',
+            }],
+          },
+          {
+            label: 'Condition',
+            prop: 'conditions',
+            width: 80,
+            overHidden: true,
+          },
+          {
+            label: 'Free day',
+            prop: 'freeDay',
+            width: 80,
+            overHidden: true,
+          },
+          {
+            label: 'LOLO-POL',
+            prop: 'loloPol',
+            width: 90,
+            overHidden: true,
+          },
+          {
+            label: 'LOLO-POD',
+            prop: 'loloPod',
+            width: 90,
+            overHidden: true,
+          },
+          {
+            label: 'DRV',
+            prop: 'drv',
+            width: 80,
+            overHidden: true,
+          },
+          {
+            label: 'DPP',
+            prop: 'dpp',
+            width: 80,
+            overHidden: true,
+          },
+          {
+            label: 'The rest as per our agreement',
+            prop: 'agreement',
+            width: 200,
+            overHidden: true,
+          },
+          {
+            label: "制单人",
+            prop: "createUserName",
+            overHidden: true,
+            width: 80,
+          }, {
+            label: "制单日期",
+            prop: "createTime",
+            type: "date",
+            overHidden: true,
+            width: 100,
+            format: "yyyy-MM-dd",
+            valueFormat: "yyyy-MM-dd HH:mm:ss"
+          }, {
+            label: "修改人",
+            prop: "updateUserName",
+            overHidden: true,
+            width: 80,
+          }, {
+            label: "修改日期",
+            prop: "updateTime",
+            type: "date",
+            overHidden: true,
+            width: 100,
+            format: "yyyy-MM-dd",
+            valueFormat: "yyyy-MM-dd HH:mm:ss"
+          },
+          {
+            label: "打印人",
+            prop: "printingPersonName",
+            overHidden: true,
+            width: 80,
+          }, {
+            label: "打印时间",
+            prop: "printingPersonDate",
+            type: "date",
+            overHidden: true,
+            width: 100,
+            format: "yyyy-MM-dd",
+            valueFormat: "yyyy-MM-dd HH:mm:ss",
+          }
+        ]
+      },
+      data: [],
+    };
+  },
+  components: {
+    detailsPage
+  },
+  async created() {
+    this.option = await this.getColumnData(this.getColumnName(508), this.optionBack);
+  },
+  activated() {
+    setTimeout(() => {
+      if (this.$route.query.id) {
+        this.detailData = {
+          id: this.$route.query.id
+        };
+        this.isShow = false
+      }
+      if (this.$route.query.home) {
+        this.addButton();
+      }
+    }, 100);
+  },
+  methods: {
+    addButton() {
+      this.isShow = false
+    },
+    copyButton() {
+      this.isShow = false
+      this.detailData = {
+        copyId: this.selectionList[0].id
+      };
+    },
+    rowEdit(row) {
+      this.detailData = {
+        id: row.id
+      };
+      this.isShow = false
+    },
+    // 删除
+    rowDel(row, index) {
+      if (row.item == 1) {
+        return this.$message.error("存在明细不允许删除");
+      }
+      this.$confirm("确定将选择数据删除?", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        remove({ ids: row.id }).then(res => {
+          this.onLoad(this.page, this.query);
+          this.$message.success("成功删除");
+        })
+      })
+
+    },
+    searchReset() {
+      this.query = this.$options.data().query;
+      this.onLoad(this.page);
+    },
+    // 搜索按钮点击
+    searchChange(params, done) {
+      this.page.currentPage = 1;
+      this.onLoad(this.page, this.query);
+      done();
+    },
+    selectionChange(list) {
+      this.selectionList = list;
+    },
+    currentChange(currentPage) {
+      this.page.currentPage = currentPage;
+    },
+    sizeChange(pageSize) {
+      this.page.pageSize = pageSize;
+    },
+    refreshChange() {
+      this.onLoad(this.page, this.query);
+    },
+    onLoad(page, params = {}) {
+      let obj = {}
+      obj = {
+        ...Object.assign(params, this.query),
+      }
+      if (obj.effectiveDateList && obj.effectiveDateList.length > 0) {
+        obj.effectiveDate = obj.effectiveDateList[0]
+        obj.expiryDate = obj.effectiveDateList[1]
+      }
+      this.loading = true;
+      getList(page.currentPage, page.pageSize, obj).then(res => {
+        this.data = res.data.data.records;
+        this.page.total = res.data.data.total;
+        this.$nextTick(() => {
+          this.$refs.crud.doLayout();
+          this.$refs.crud.dicInit();
+        });
+      }).finally(() => {
+        this.loading = false;
+      })
+    },
+    // 详情的返回列表
+    goBack() {
+      // 初始化数据
+      if (JSON.stringify(this.$route.query) != "{}") {
+        this.$router.$avueRouter.closeTag();
+        this.$router.push({
+          path: "/ow/contract/index"
+        });
+      }
+      this.detailData = {}
+      this.isShow = true;
+      this.onLoad(this.page, this.query);
+    },
+    outExport() {
+      let config = { params: { ...this.query } }
+      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-los/routecost/exportRouteCost',      //跳转目标窗口的地址
+        query: {
+          ...config.params,    //括号内是要传递给新窗口的参数
+          identification: this.url
+        }
+      })
+      window.open(routeData.href.slice(1, routeData.href.length) + '&' + `${this.website.tokenHeader}=${getToken()}`);
+    },
+    //自定义列保存
+    async saveColumn(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;
+        this.searchReset()
+      }
+    },
+    //自定义列重置
+    async resetColumn(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;
+        this.searchReset()
+      }
+    },
+    // 更改表格颜色
+    headerClassName(tab) {
+      //颜色间隔
+      let back = ""
+      if (tab.columnIndex >= 0 && tab.column.level === 1) {
+        if (tab.columnIndex % 2 === 0) {
+          back = "back-one"
+        } else if (tab.columnIndex % 2 === 1) {
+          back = "back-two"
+        }
+      }
+      return back;
+    },
+
+  }
+}
+
+</script>
+
+<style lang="scss" scoped>
+::v-deep #out-table .back-one {
+  background: #ecf5ff !important;
+  text-align: center;
+}
+
+::v-deep #out-table .back-two {
+  background: #ecf5ff !important;
+  text-align: center;
+}
+
+.pointerClick {
+  cursor: pointer;
+  color: #1e9fff;
+}
+
+::v-deep .el-col-md-8 {
+  width: 24.33333%;
+}
+</style>