<template> <div class="app-container"> <!-- 搜索工作栏 --> <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px" > <el-form-item :label="$t('服务网点')" prop="node"> <el-select v-model="queryParams.nodeId" :placeholder="$t('所属网点')" :disabled="nodeId ? true : false" clearable > <el-option v-for="node in nodeList" :key="node.id" :label="node.titleZh" :value="node.id" /> </el-select> </el-form-item> <el-form-item :label="$t('关键字')" prop="keywords"> <el-input v-model="queryParams.keywords" :placeholder="$t('请输入仓库编号/名称')" clearable @keyup.enter.native="handleQuery" /> </el-form-item> <el-form-item> <el-button type="primary" icon="el-icon-search" @click="handleQuery">{{ $t("搜索") }}</el-button> <el-button icon="el-icon-refresh" @click="resetQuery">{{ $t("重置") }}</el-button> </el-form-item> </el-form> <!-- 操作工具栏 --> <el-row :gutter="10" class="mb8"> <el-col :span="1.5"> <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd" v-hasPermi="['ecw:warehouse:create']" >{{ $t("新增") }}</el-button > </el-col> <el-col :span="1.5"> <el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport" :loading="exportLoading" v-hasPermi="['ecw:warehouse:export']" >{{ $t("导出") }}</el-button > </el-col> <el-col :span="1.5"> <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="templateClick('')" v-hasPermi="['ecw:warehouse:create']" >{{ $t("批量设置提单模板") }}</el-button > </el-col> <right-toolbar :showSearch.sync="showSearch" @queryTable="getList" ></right-toolbar> </el-row> <!-- 列表 --> <el-table v-loading="loading" :data="list"> <el-table-column :label="$t('仓库编号')" align="center" prop="number" /> <el-table-column :label="$t('仓库名称')" align="center" prop="titleZh" /> <el-table-column :label="$t('英文名称')" align="center" prop="titleEn" /> <el-table-column :label="$t('贸易属性')" align="center" prop="tradeType"> <template slot-scope="scope"> <div>{{ tradeTypeName(scope.row.tradeType) }}</div> </template> </el-table-column> <el-table-column :label="$t('运输方式')" align="center" prop="freight"> <template slot-scope="scope"> <div>{{ transportNames(scope.row.freight) }}</div> </template> </el-table-column> <el-table-column :label="$t('仓库容量') + '(m)³'" align="center" prop="volume" /> <el-table-column :label="$t('仓库地址')" align="center" :prop="$l('address')" /> <!--lanbm 2024-06-04 add--> <el-table-column :label="$t('仓库免租期')" align="center" prop="rentFreeDays" /> <el-table-column :label="$t('锁定收货人天数')" align="center" prop="lockRecipientDays" /> <!--end lanbm 2024-06-04 add--> <el-table-column prop="head" :label="$t('负责人')" align="center"> <template slot-scope="scope"> <div> <span>{{ scope.row.head }}</span> <br /> <span>{{ scope.row.tell }}</span> </div> </template> </el-table-column> <el-table-column prop="status" :label="$t('状态')" width="100"> <template slot-scope="scope"> <el-switch v-model="scope.row.status" :active-value="CommonStatusEnum.ENABLE" :inactive-value="CommonStatusEnum.DISABLE" @change="handleStatusChange(scope.row)" /> </template> </el-table-column> <el-table-column :label="$t('操作')" align="center" class-name="small-padding fixed-width" > <template slot-scope="scope"> <el-button size="mini" type="text" @click="toRouteList(scope.row, '2')" :disabled="scope.row.tradeType == '2'" v-hasPermi="['ecw:warehouse:routerQuery']" >{{ $t("相关始发港") }}</el-button > <el-button size="mini" type="text" @click="toRouteList(scope.row, '1')" :disabled="scope.row.tradeType == '1'" v-hasPermi="['ecw:warehouse:routerQuery']" >{{ $t("相关目的港") }}</el-button > <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)" v-hasPermi="['ecw:warehouse:update']" >{{ $t("修改") }}</el-button > <el-button size="mini" type="text" @click="bindDept(scope.row)" v-hasPermi="['system:dept:query']" >{{ $t("绑定部门") }}</el-button > </template> </el-table-column> </el-table> <!-- 分页组件 --> <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize" @pagination="getList" /> <el-dialog :visible.sync="showRouteList" width="900px" append-to-body> <el-table v-loading="routeLoadig" :data="routeList"> <el-table-column :label="$t('序号')" type="index" width="50" /> <el-table-column prop="tansportType" :label="$t('运输方式')" align="center" > <template slot-scope="scope"> <div> {{ transportName(scope.row.transportType) }} </div> </template> </el-table-column> <el-table-column :label="$t('仓库编号')" align="center" prop="number" /> <el-table-column :label="$t('仓库名称')" align="center" :prop="$l('title')" /> <el-table-column :label="$t('仓库容量') + '(m)³'" align="center" prop="volume" /> <el-table-column :label="$t('仓库地址')" align="center" :prop="$l('address')" /> <el-table-column prop="head" :label="$t('负责人')" align="center"> <template slot-scope="scope"> <div> <span>{{ scope.row.head }}</span> <br /> <span>{{ scope.row.tell }}</span> </div> </template> </el-table-column> <el-table-column :label="$t('路线服务')" align="center" prop="otherService" > <template slot-scope="scope"> <div>{{ serviceNames(scope.row.otherService) }}</div> </template> </el-table-column> <el-table-column :label="$t('操作')" align="center" class-name="small-padding fixed-width" > <template slot-scope="scope"> <el-button size="mini" type="text" @click="routeStatusClick(scope.row)" v-hasPermi="['ecw:warehouse:routerQuery']" >{{ scope.row.lineId ? "关闭线路" : "开通线路" }}</el-button > <el-button size="mini" type="primary" @click="templateClick(scope.row)" v-if="scope.row.lineId != null" v-hasPermi="['ecw:warehouse:routerQuery']" >{{ $t("设置路线提单模板") }}</el-button > <el-button size="mini" type="primary" @click="serviceClick(scope.row)" v-if="scope.row.lineId != null" v-hasPermi="['ecw:warehouse:routerQuery']" >{{ $t("开通服务") }}</el-button > <!-- <el-button size="mini" type="danger" @click="$router.push('/offer/channel-route?lineId='+scope.row.lineId)" v-if="scope.row.lineId != null && scope.row.transportType == 3" >{{$t('渠道包装清关费')}}</el-button>--> </template> </el-table-column> </el-table> <!-- 分页组件 --> <pagination v-show="routeCount > 0" :total="routeCount" :page.sync="routeQueryParam.pageNo" :limit.sync="routeQueryParam.pageSize" @pagination="getRouteList" /> </el-dialog> <el-dialog :title="$t('绑定部门')" :visible.sync="deptOpen" width="500px" append-to-body > <el-header> <el-button type="primary" @click="commitBind">{{ $t("提交") }}</el-button> </el-header> <el-table ref="multipleTable" v-if="refreshTable" :data="deptList" row-key="id" :default-expand-all="isExpandAll" :tree-props="{ children: 'children', hasChildren: 'hasChildren' }" @select="select" @select-all="selectAll" @selection-change="handleSelectionChange" > <el-table-column type="selection" width="55"></el-table-column> <el-table-column prop="name" :label="$t('部门名称')"></el-table-column> <!-- <el-table-column prop="leader" :label="$t('负责人')" :formatter="userNicknameFormat" width="120"/> --> </el-table> </el-dialog> <!-- 对话框(添加 / 修改) --> <el-dialog :title="title" :visible.sync="open" width="900px" append-to-body> <el-form ref="form" :model="form" :rules="rules" label-width="120px"> <el-form-item :label="$t('所属网点')" prop="nodeId"> <el-select v-model="form.nodeId" :placeholder="$t('请选择所属网点')" :disabled="nodeId || isUpdate ? true : false" clearable > <el-option v-for="node in nodeList" :key="node.id" :label="$l(node, 'title')" :value="node.id" /> </el-select> </el-form-item> <el-form-item :label="$t('所在地区')" prop="area"> <el-select v-model="form.zhou" :placeholder="$t('请选择大洲')" @change="changeContinents" > <el-option v-for="item in continentsList" :key="item.id" :label="$l(item, 'title')" :value="item.id" > </el-option> </el-select> <el-select v-model="form.guojia" :placeholder="$t('请选择国家')" @change="changeCountry" v-if="form.zhou" > <el-option v-for="item in countryList" :key="item.id" :label="$l(item, 'title')" :value="item.id" > </el-option> </el-select> <el-select v-model="form.sheng" :placeholder="$t('请选择省')" @change="changeProvince" v-if="form.guojia" > <el-option v-for="item in provinceList" :key="item.id" :label="$l(item, 'title')" :value="item.id" > </el-option> </el-select> <el-select v-model="form.shi" :placeholder="$t('请选择城市')" @change="changeCity" v-if="form.sheng" > <el-option v-for="item in cityList" :key="item.id" :label="$l(item, 'title')" :value="item.id" > </el-option> </el-select> </el-form-item> <el-form-item :label="$t('排序')" prop="sort"> <el-input v-model="form.sort" type="number" :placeholder="$t('请输入排序')" /> </el-form-item> <el-form-item :label="$t('仓库编号')" prop="number"> <el-input v-model="form.number" :placeholder="$t('请输入仓库编号')" /> </el-form-item> <el-form-item :label="$t('仓库简码')" prop="qianzhui"> <el-input v-model="form.qianzhui" :placeholder="$t('请输入仓库简码')" /> </el-form-item> <el-form-item :label="$t('仓库名称')" prop="titleZh"> <el-input v-model="form.titleZh" :placeholder="$t('请输入仓库名称')" /> </el-form-item> <el-form-item :label="$t('英文名称')" prop="titleEn"> <el-input v-model="form.titleEn" :placeholder="$t('请输入英文名称')" /> </el-form-item> <el-form-item :label="$t('负责人')" prop="head"> <el-input v-model="form.head" :placeholder="$t('请输入负责人')" /> </el-form-item> <el-form-item :label="$t('联系电话')" prop="tell"> <el-input v-model="form.tell" :placeholder="$t('请输入联系电话')" /> </el-form-item> <el-form-item :label="$t('容量')" prop="volume"> <el-input v-model="form.volume" :placeholder="$t('请输入容量')"> <template slot="append">m³</template> </el-input> </el-form-item> <el-form-item :label="$t('仓库地址')" prop="addressZh"> <el-input v-model="form.addressZh" :placeholder="$t('请输入仓库地址')" /> </el-form-item> <el-form-item :label="$t('英文地址')" prop="addressEn"> <el-input v-model="form.addressEn" :placeholder="$t('请输入英文地址')" /> </el-form-item> <el-form-item :label="$t('贸易属性')" prop="tradeType"> <el-select v-model="form.tradeType" :placeholder="$t('请选择')"> <!-- :disabled="(nodeId || isUpdate) ? true : false"--> <el-option v-for="dict in regionTypeDatas" :key="dict.value" :label="$l(dict, 'label')" :value="dict.value" /> </el-select> </el-form-item> <el-form-item :label="$t('运输方式')" prop="checkList"> <el-checkbox-group v-model="form.checkList"> <el-checkbox v-for="dict in transportDatas" :label="dict.value" :key="dict.value" name="freight" > {{ $l(dict, "label") }}</el-checkbox > </el-checkbox-group> </el-form-item> <el-form-item label="img" prop="img"> <el-col :span="8"> <el-input v-model="form.img" :placeholder="$t('请上传图片')" disabled /> </el-col> <el-upload action="#" :http-request="requestUpload" :show-file-list="false" :before-upload="beforeUpload" > <el-button size="small"> {{ $t("上传图片") }} <i class="el-icon-upload el-icon--right"></i> </el-button> </el-upload> </el-form-item> <el-form-item :label="$t('备注')" prop="remark"> <el-input v-model="form.remark" :placeholder="$t('请输入备注')" /> </el-form-item> <el-form-item :label="$t('会员控货下单要求')" prop="kycStatus"> <el-radio-group v-model="form.kycStatus"> <el-radio v-for="dict in kycDatas" :key="dict.value" :label="dict.value" >{{ $l(dict, "label") }}</el-radio > </el-radio-group> </el-form-item> <!--lanbm 2024-06-04 添加控货需要的逻辑字段--> <el-form-item :label="$t('仓库免租期')" prop="rentFreeDays"> <el-input-number v-model="form.rentFreeDays" controls-position="right" :min="0" /> </el-form-item> <el-form-item :label="$t('锁定收货人天数')" prop="lockRecipientDays"> <el-input-number v-model="form.lockRecipientDays" controls-position="right" :min="0" /> </el-form-item> </el-form> <!--end lanbm 2024-06-04 添加控货需要的逻辑字段--> <div slot="footer" class="dialog-footer"> <el-button type="primary" @click="submitForm">{{ $t("确定") }}</el-button> <el-button @click="cancel">{{ $t("取消") }}</el-button> </div> </el-dialog> <!--设置服务--> <el-dialog :title="$t('设置服务')" :visible.sync="serviceOpen" width="1000px" append-to-body > <div style="font-size: large"> {{ $t("线路") }}:{{ $t("{startName}到{destName}", { startName: this.startName, destName: this.destName, }) }} <span style="margin-left: 20px" >{{ $t("运输方式") }}:{{ transportName(this.lineform.transportType) }}</span > </div> <br /> <el-form ref="form" :model="lineform" :rules="rules" label-width="160px"> <el-form-item :label="$t('始发港服务')"> <el-checkbox-group v-model="lineform.otherService"> <el-checkbox v-for="item in serviceGroup" :label="item.id" :key="item.id" :value="item.id" > {{ item.text }}</el-checkbox > </el-checkbox-group> </el-form-item> <el-form-item :label="$t('目的港服务')"> <el-checkbox-group v-model="lineform.otherService"> <template v-for="item in endServiceGroup"> <el-checkbox @change=" () => { changeOtherService(item.id); } " :label="item.id" :key="item.id" :value="item.id" v-if="isShowError(item)" > {{ item.text }}</el-checkbox > </template> </el-checkbox-group> </el-form-item> <el-form-item v-if="['3', '4'].includes(lineform.transportType)" label="空运提单制作节点" > <el-select v-model="lineform.makeBillNode"> <el-option v-show="item.value !== '1'" v-for="(item, index) in getDictDatas( DICT_TYPE.AIR_SHIPMENT_PROCESS )" :label="$l(item, 'label')" :value="item.value" ></el-option> </el-select> </el-form-item> <el-form-item label="线路是否在客户端显示"> <el-radio-group v-model="lineform.isClientShow"> <el-radio :label="1">可见</el-radio> <el-radio :label="0">不可见</el-radio> </el-radio-group> </el-form-item> <el-form-item :label="$t('保费币种')"> <el-select @change="modifyAmountUnit" v-model="lineform.currencyUnit"> <el-option v-for="item in currencyList" :disabled="item.status === 1" :label="$l(item, 'title')" :value="item.id" ></el-option> </el-select> </el-form-item> <el-form-item :label="$t('最小保价费金额')"> <el-input-number :controls="false" v-model="lineform.minPrice"> </el-input-number> </el-form-item> <el-form-item :label="$t('是否支持控货')"> <el-radio-group v-model="lineform.controlStatus"> <el-radio :label="0">支持</el-radio> <el-radio :label="1">不支持</el-radio> </el-radio-group> </el-form-item> <!--lanbm 2024-05-25 把海运的相关配置信息也显示出来了,把空运文字提示出掉了--> <template v-if="['3', '4', '1'].includes(lineform.transportType)"> <el-form-item :label="$t('模板中文标题')"> <el-input v-model="lineform.tempTitleZh" style="width: 400px" ></el-input> </el-form-item> <el-form-item :label="$t('模板英文标题')"> <el-input v-model="lineform.tempTitleEn" style="width: 400px" ></el-input> </el-form-item> <el-form-item :label="$t('发件人')"> <el-input v-model="lineform.senderInfo.name" style="width: 400px" ></el-input> </el-form-item> <el-form-item :label="$t('发件人英文')"> <el-input v-model="lineform.senderInfo.nameEn" style="width: 400px" ></el-input> </el-form-item> <el-form-item :label="$t('发件公司地址')"> <el-input v-model="lineform.senderInfo.companyAddress" style="width: 400px" ></el-input> </el-form-item> <el-form-item :label="$t('发件公司地址英文')"> <el-input v-model="lineform.senderInfo.companyAddressEn" style="width: 400px" ></el-input> </el-form-item> <el-form-item :label="$t('收货人')"> <el-input v-model="lineform.recipientInfo.name" style="width: 400px" ></el-input> </el-form-item> <el-form-item :label="$t('收货人英文')"> <el-input v-model="lineform.recipientInfo.nameEn" style="width: 400px" ></el-input> </el-form-item> <el-form-item :label="$t('收货地址')"> <el-input v-model="lineform.recipientInfo.companyAddress" style="width: 400px" ></el-input> </el-form-item> <el-form-item :label="$t('收货地址英文')"> <el-input v-model="lineform.recipientInfo.companyAddressEn" style="width: 400px" ></el-input> </el-form-item> <!--lanbm 2024-06-10 添加的落款信息配置信息 --> <el-form-item :label="$t('落款左边信息')"> <textarea v-model="lineform.lkLeft" style="width: 400px" rows="8"> </textarea> </el-form-item> <el-form-item :label="$t('落款右边信息')"> <textarea v-model="lineform.lkRight" style="width: 400px" rows="8"> </textarea> </el-form-item> <el-form-item :label="$t('落款盖章名称')"> <el-input v-model="lineform.tzName" style="width: 400px"></el-input> </el-form-item> <!-- end lanbm 2024-06-10 添加的落款信息配置信息 --> </template> </el-form> <div slot="footer" class="dialog-footer"> <el-button type="primary" @click="submitLineForm">{{ $t("保存") }}</el-button> </div> </el-dialog> <!-- 对话框(添加 / 修改) --> <el-dialog :title="$t('设置路线提单模板')" :visible.sync="templateOpen" width="1100px" @close="ladingFormClose()" append-to-body > <el-form ref="form" :model="ladingform" :rules="rules" label-width="80px"> <el-form-item :label="$t('货柜前缀')" prop="prefixCounter"> <el-input v-model="ladingform.prefixCounter" :placeholder="$t('请输入货柜前缀')" /> </el-form-item> <el-form-item :label="$t('抬头')" prop="titleZh"> <el-link type="primary" @click.native="setTpl('sea')">{{ $t("海运模板") }}</el-link> | <el-link type="primary" @click.native="setTpl('air')">{{ $t("空运模板") }}</el-link> <ueditor v-if="templateOpen" v-model="ladingform.titleZh" :min-height="192" style="width: 960px" /> </el-form-item> <el-card class="box-card"> <div slot="header" class="clearfix"> <span>{{ $t("账户详情") }}</span> <el-button style="float: right" size="small" type="primary" @click="handleAddAccount" >{{ $t("添加账户") }}+</el-button > </div> <el-table :data="arr" style="width: 100%"> <el-table-column prop="detail" label="" width=""> <template v-slot="{ row, column, $index }"> <el-input v-model="row.detail" placeholder="Account detail" size="mini" /> </template> </el-table-column> <el-table-column prop="name" label="" width=""> <template v-slot="{ row }"> <el-input v-model="row.name" placeholder="Account.NAME" size="mini" /> </template> </el-table-column> <el-table-column prop="company" label=""> <template v-slot="{ row }"> <el-input v-model="row.company" placeholder="DE-BESTDEZHI ENTERPRISE" size="mini" /> </template> </el-table-column> <el-table-column prop="operate" label=""> <template slot-scope="scope"> <el-button type="danger" @click="delRow(scope.$index)">{{ $t("删除") }}</el-button> </template> </el-table-column> </el-table> </el-card> <el-form-item :label="$t('条款')" prop="contentZh"> <el-link type="primary" @click.native="setAgreementTpl('agreementSea')" >{{ $t("海运模板") }}</el-link > | <el-link type="primary" @click.native="setAgreementTpl('agreementAir')" >{{ $t("空运模板") }}</el-link > <ueditor v-if="templateOpen" v-model="ladingform.contentZh" :min-height="192" style="width: 960px" /> </el-form-item> <el-form-item v-if="showFlag"> <routers-selector-without-channel v-model="ladingform.lineIds" /> </el-form-item> </el-form> <div slot="footer" class="dialog-footer"> <el-button type="primary" @click="submitTemplateForm">{{ $t("保存") }}</el-button> <el-button @click="resetTemplate()">{{ $t("重置") }}</el-button> </div> </el-dialog> </div> </template> <script> import { createWarehouse, updateWarehouse, deleteWarehouse, getWarehouse, getWarehousePage, createTemplate, getLadingTemplate, exportWarehouseExcel, routerList, changeRouteStatus, deptBind, deptList, serviceConfig, } from "@/api/ecw/warehouse"; import { getNodePage } from "@/api/ecw/node"; import { getListTree } from "@/api/ecw/region"; import { getDictDatas, DICT_TYPE, getDictDataL, getDictDataLabel, } from "@/utils/dict"; import { CommonStatusEnum } from "@/utils/constants"; import { uploadFile } from "@/api/infra/file"; import { listDept } from "@/api/system/dept"; import Ueditor from "@/components/Ueditor"; import { getDictData } from "@/utils/dict"; import RoutersSelectorWithoutChannel from "@/components/RoutersSelectorWithoutChannel"; import { has } from "min-dash"; import Template from "../../cms/template/index"; // 海运和空运的抬头模板 import tpl from "./tpl"; import { getCurrencyPage } from "@/api/ecw/currency"; export default { name: "Warehouse", components: { Template, Ueditor, RoutersSelectorWithoutChannel, }, data() { var areaCheck = (rule, value, callback) => { if (!this.form.zhou) { callback(new Error(this.$t("请选择大洲"))); } else if (!this.form.guojia) { callback(new Error(this.$t("请选择国家/地区"))); } else if (!this.form.sheng) { callback(new Error(this.$t("请选择省市"))); } else { callback(); } }; return { currencyList: [], // 遮罩层 loading: true, // 导出遮罩层 exportLoading: false, // 显示搜索条件 showSearch: true, //显示绑定部门 deptOpen: false, //部门列表 deptList: [], // 是否展开,默认全部展开 isExpandAll: true, // 重新渲染表格状态 refreshTable: true, //选中的部门 selectDeptList: [], //需要绑定部门的仓库id deptWarhouse: null, //洲际列表 continentsList: [], //国家列表 countryList: [], //省信息列表 provinceList: [], //市信息列表 cityList: [], serviceGroup: [ { id: "1", text: this.$t("集运服务") }, { id: "6", text: this.$t("数量(个)是否必填") }, ], endServiceGroup: [ { id: "3", text: this.$t("非控货订单代收货款") }, { id: "4", text: this.$t("海外仓") }, { id: "2", text: this.$t("送货上门") }, { id: "5", text: this.$t("提货异常") }, { id: "10", text: this.$t("默认送货上门") }, ], // 总条数 total: 0, // 仓库列表 list: [], // 弹出层标题 title: "", // 是否显示弹出层 open: false, templateOpen: false, dateRangeCreateTime: [], serviceOpen: false, isUpdate: false, nodeList: [], routeLoadig: false, showRouteList: false, routeList: [], routeCount: 0, routeQueryParam: { pageNo: 1, pageSize: 10, id: null, tradeType: null, }, showFlag: false, arr: [], cols: [ { prop: "detail", label: this.$t("详情") }, { prop: "name", label: this.$t("名称") }, { prop: "company", label: this.$t("公司") }, { prop: "operate", label: this.$t("操作") }, ], // 查询参数 queryParams: { pageNo: 1, pageSize: 10, number: null, titleZh: null, titleEn: null, volume: null, addressZh: null, addressEn: null, zhou: null, guojia: null, sheng: null, shi: null, head: null, tell: null, tradeType: null, freight: null, remark: null, sort: null, status: null, }, // 表单参数 form: { checkList: [] }, ladingform: { prefixCounter: null, titleZh: null, contentZh: null, account: null, acctArr: [], }, lineform: { otherService: [], isClientShow: 1, makeBillNode: "6", controlStatus: "0", currencyUnit: 1, minPrice: 0, tempTitleZh: "", tempTitleEn: "", lkLeft: "", lkRight: "", //lanbm 2024-06-10 添加的落款配置信息 tzName: "", //落款盖章 lanbm 2024-06-12 add recipientInfo: { companyAddress: "", companyAddressEn: "", name: "", nameEn: "", }, senderInfo: { companyAddress: "", companyAddressEn: "", name: "", nameEn: "", }, }, startName: "", destName: "", // 表单校验 rules: { nodeId: [ { required: true, message: this.$t("服务网点不能为空"), trigger: "blur", }, ], area: [{ validator: areaCheck, required: true, trigger: "blur" }], sort: [ { required: true, message: this.$t("排序不能为空"), trigger: "blur" }, ], number: [ { required: true, message: this.$t("仓库编号不能为空"), trigger: "blur", }, ], titleZh: [ { required: true, message: this.$t("仓库名称不能为空"), trigger: "blur", }, ], titleEn: [ { required: true, message: this.$t("英文名称不能为空"), trigger: "blur", }, ], head: [ { required: true, message: this.$t("负责人不能为空"), trigger: "blur", }, ], tell: [ { required: true, message: this.$t("联系电话不能为空"), trigger: "blur", }, ], volume: [ { required: true, message: this.$t("容量不能为空"), trigger: "blur" }, ], addressZh: [ { required: true, message: this.$t("仓库地址不能为空"), trigger: "blur", }, ], addressEn: [ { required: true, message: this.$t("英文地址不能为空"), trigger: "blur", }, ], tradeType: [ { required: true, message: this.$t("请选择网点属性"), trigger: "change", }, ], checkList: [ { type: "array", required: true, message: this.$t("请至少选择一个服务内容"), trigger: "change", }, ], }, nodeId: this.$route.query.nodeId, // 枚举 CommonStatusEnum: CommonStatusEnum, // 数据字典 statusDictDatas: getDictDatas(DICT_TYPE.COMMON_STATUS), regionTypeDatas: getDictDatas(DICT_TYPE.ECW_REGION_TYPE), transportDatas: getDictDatas(DICT_TYPE.ECW_TRANSPORT_TYPE), kycDatas: getDictDatas(DICT_TYPE.ECW_KYC_DATA), }; }, computed: { checkedFn() { return (val) => { return ( Array.isArray(this.lineform.otherService) ? this.lineform.otherService : [] ).includes(val); }; }, DICT_TYPE() { return DICT_TYPE; }, getDictDataL() { return getDictDataL; }, isShowError() { return (item) => { if (item.id !== "5" && item.id !== "10") return true; const { otherService } = this.lineform; if ((Array.isArray(otherService) ? otherService : []).includes("2")) return true; return false; }; }, transportName() { return (transportType) => { for (let index in this.transportDatas) { let transportItem = this.transportDatas[index]; if (transportItem.value == transportType) { return this.$l(transportItem, "label"); } } }; }, transportNames() { return (freight) => { let transportTypes = freight.split(","); let names = []; for (let index in transportTypes) { let transportType = transportTypes[index]; let name = this.transportName(transportType); if (name) names.push(name); } return names.join(","); }; }, tradeTypeName() { return (tradeType) => { for (let index in this.regionTypeDatas) { let regionTypeItem = this.regionTypeDatas[index]; if (regionTypeItem.value == tradeType) { return this.$l(regionTypeItem, "label"); } } }; }, serviceNames() { return (otherService) => { if (!otherService) return ""; let serviceList = Array.isArray(otherService) ? otherService : otherService.split(","); let names = []; const serviceGroup = this.serviceGroup.concat(this.endServiceGroup); for (let index in serviceList) { let item = serviceList[index]; for (let dictIndex in serviceGroup) { let dictItem = serviceGroup[dictIndex]; if (dictItem.id == item) { names.push(dictItem.text); } } } return names.join(","); }; }, }, watch: { "form.zhou"(newV, oldV) { if (oldV && oldV != newV) { this.form.guojia = null; this.form.sheng = null; this.form.shi = null; } }, "form.guojia"(newV, oldV) { if (oldV && oldV != newV) { this.form.sheng = null; this.form.shi = null; } }, "form.sheng"(newV, oldV) { if (oldV && oldV != newV) { this.form.shi = null; } }, }, created() { getCurrencyPage(this.params).then( (res) => (this.currencyList = res.data.list) ); if (this.nodeId) { this.queryParams.nodeId = parseInt(this.nodeId); } this.getList(); this.getNodeList(); this.getContinentsList(); }, methods: { getDictDataLabel, modifyAmountUnit(val) { if (val === 6) { this.lineform.minPrice = 900; } else if (val === 3) { this.lineform.minPrice = 10; } else { this.lineform.minPrice = 2; } }, changeOtherService(val) { if ( val === "2" && !( Array.isArray(this.lineform.otherService) ? this.lineform.otherService : [] ).includes("10") ) { this.lineform.otherService.push("10"); } }, getDictDatas, setTpl(type) { this.ladingform.titleZh = tpl[type]; }, setAgreementTpl(type) { this.ladingform.contentZh = tpl[type]; }, /** 查询列表 */ getList() { this.loading = true; // 处理查询参数 let params = { ...this.queryParams }; this.addBeginAndEndTime(params, this.dateRangeCreateTime, "createTime"); // 执行查询 getWarehousePage(params).then((response) => { this.list = response.data.list; this.total = response.data.total; this.loading = false; }); }, delRow(index) { this.arr.splice(index, 1); }, ladingFormClose() { this.resetTemplate(); }, handleAddAccount() { const obj = { detail: "", name: "", company: "" }; this.arr.push(obj); }, /** 查询部门列表 */ getDeptList() { listDept(this.queryParams).then((response) => { this.deptList = this.handleTree(response.data, "id"); //回选已选择的部门 this.recoveryChecked(); }); }, recoveryChecked() { for (let index in this.deptList) { let dept = this.deptList[index]; this.deptChecked(dept); } }, deptChecked(dept) { let deptIdList = this.deptWarhouse.deptIdList; // console.log(deptIdList); const hasSelect = deptIdList.some((el) => { return dept.id === el; }); if (hasSelect) { this.toggleSelection(dept, true); } if (dept.children) { dept.children.map((j) => { this.deptChecked(j); }); } }, // 用户昵称展示 userNicknameFormat(row, column) { if (!row.leaderUserId) { return this.$t("未设置"); } for (let index in this.users) { let user = this.user[index]; if (row.leaderUserId === user.id) { return user.nickname; } } return this.$t("未知") + this.$t("【") + row.leaderUserId + this.$t("】"); }, /** 绑定部门 */ bindDept(row) { this.deptWarhouse = row; this.deptOpen = true; this.getDeptList(); }, /** 展开/折叠操作 */ toggleExpandAll() { this.refreshTable = false; this.isExpandAll = !this.isExpandAll; this.$nextTick(() => { this.refreshTable = true; }); }, getSelectNode(nodeId) { for (let index in this.nodeList) { let node = this.nodeList[index]; if (node.id == nodeId) return node; } }, // 覆盖默认的上传行为 requestUpload() {}, // 上传预处理 beforeUpload(file) { if (file.type.indexOf("image/") == -1) { this.$modal.msgError( this.$t("文件格式错误,请上传图片类型,如:JPG,PNG后缀的文件。") ); } else { //上传 let formData = new FormData(); formData.append("file", file); // formData.append("path", this.uuid()); uploadFile(formData).then((response) => { this.$set(this.form, "img", response.data); // this.form.img = response.data; }); } }, uuid() { var s = []; var hexDigits = "0123456789abcdef"; for (var i = 0; i < 36; i++) { s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1); } s[14] = "4"; // bits 12-15 of the time_hi_and_version field to 0010 s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1); // bits 6-7 of the clock_seq_hi_and_reserved to 01 s[8] = s[13] = s[18] = s[23] = "-"; var uuid = s.join(""); return uuid; }, getContinentsList() { this.queryParams.treeType = 0; getListTree(this.queryParams).then((response) => { this.continentsList = response.data; }); }, templateClick(row) { if (row != "") { getLadingTemplate(row.lineId).then((response) => { if (response.data != null) { this.ladingform = response.data; var jsonArr = JSON.parse(response.data.account); for (var i in jsonArr) { this.arr.push(jsonArr[i]); } } }); this.ladingform.lineId = row.lineId; } else { this.showFlag = true; } this.templateOpen = true; }, serviceClick(row) { if (this.routeQueryParam.tradeType == 1) { this.destName = this.$l(row, "title"); } else { this.startName = this.$l(row, "title"); } if (row.otherService) { this.lineform.otherService = Array.isArray(row.otherService) ? row.otherService : row.otherService?.split(",") ?? []; } else { this.lineform.otherService = []; } this.serviceOpen = true; this.lineform.lineId = row.lineId; this.lineform.transportType = row.transportType; this.lineform.isClientShow = row.isClientShow ? 1 : 0; this.lineform.makeBillNode = row.makeBillNode || "6"; this.lineform.currencyUnit = row.currencyUnit ? row.currencyUnit : 1; this.lineform.controlStatus = row.controlStatus ? row.controlStatus : 0; this.lineform.tempTitleZh = row.tempTitleZh; this.lineform.tempTitleEn = row.tempTitleEn; this.lineform.lkLeft=row.lkLeft; this.lineform.lkRight=row.lkRight; //lanbm 2024-06-10 add this.lineform.tzName=row.tzName; //图章配置参数 lanbm 2024-06-12 add // 先清空 发货人和收货人信息 this.lineform.senderInfo = { companyAddress: "", companyAddressEn: "", name: "", nameEn: "", }; this.lineform.recipientInfo = { companyAddress: "", companyAddressEn: "", name: "", nameEn: "", }; Object.assign(this.lineform.recipientInfo, row.recipientInfo); Object.assign(this.lineform.senderInfo, row.senderInfo); this.lineform.minPrice = row.minPrice ? row.minPrice : 0; if (row.minPrice) { this.lineform.minPrice = row.minPrice; } else { if (this.lineform.currencyUnit === 6) { this.lineform.minPrice = 900; } else if (this.lineform.currencyUnit === 3) { this.lineform.minPrice = 10; } else { this.lineform.minPrice = 2; } } console.log(row, "row"); }, submitLineForm() { //ecw_warehouse_line let otherService = this.lineform.otherService; // 如果不存在送货上门,则过滤提货异常 if (!otherService.includes("2")) { otherService = otherService.filter((id) => id !== "5"); } serviceConfig({ lineId: this.lineform.lineId, otherService: otherService.join(","), isClientShow: this.lineform.isClientShow, makeBillNode: this.lineform.makeBillNode, controlStatus: this.lineform.controlStatus, currencyUnit: this.lineform.currencyUnit, minPrice: this.lineform.minPrice, senderInfo: this.lineform.senderInfo, recipientInfo: this.lineform.recipientInfo, tempTitleZh: this.lineform.tempTitleZh, tempTitleEn: this.lineform.tempTitleEn, lkLeft: this.lineform.lkLeft, lkRight: this.lineform.lkRight, //lanbm 2024-06-10 add tzName: this.lineform.tzName, //图章配置参数 lanbm 2024-06-12 add }).then((res) => { this.$modal.msgSuccess(this.$t("操作成功")); this.getRouteList(); for (let index in this.routeList) { let routeItem = this.routeList[index]; if (routeItem.lineId && routeItem.lineId == this.lineform.lineId) { // routeItem.otherService = otherService; this.$set(routeItem, "otherService", otherService); } } this.serviceOpen = false; }); }, routeStatusClick(row) { this.routeQueryParam.transportType = row.transportType; this.routeQueryParam.warehouseId = row.id; this.routeQueryParam.lineId = row.lineId; changeRouteStatus(this.routeQueryParam).then((response) => { let lineId = response.data; this.$set(row, "lineId", lineId); row.lineId = lineId; this.$modal.msgSuccess("操作成功"); }); }, toRouteList(row, tradeType) { this.routeQueryParam.id = row.id; this.routeQueryParam.tradeType = tradeType; this.routeQueryParam.pageNo = 1; this.showRouteList = true; this.routeLoadig = true; if (tradeType == 1) { this.startName = row.titleZh; } else { this.destName = row.titleZh; } this.getRouteList(); }, getRouteList() { routerList(this.routeQueryParam).then((response) => { this.routeList = response.data.list; this.routeCount = response.data.total; this.routeLoadig = false; }); }, //获取网点列表 getNodeList() { let params = { pageNo: 1, pageSize: 100 }; getNodePage(params).then((response) => { this.nodeList = response.data.list; }); }, changeContinents(zhou) { for (let index in this.continentsList) { let continent = this.continentsList[index]; if (continent.id == zhou) { this.countryList = continent.children; return; } } }, changeCountry(countryId) { for (let index in this.countryList) { let country = this.countryList[index]; if (country.id == countryId) { this.provinceList = country.children; return; } } }, changeProvince(provinceId) { for (let index in this.provinceList) { let province = this.provinceList[index]; if (province.id == provinceId) { this.cityList = province.children; return; } } }, changeCity(cityId) { for (let index in this.cityList) { let city = this.cityList[index]; if (city.id == cityId) { return; } } }, handleStatusChange(row) { let text = row.status === CommonStatusEnum.ENABLE ? this.$t("启用") : this.$t("停用"); this.$modal .confirm( this.$t("确认要{action}编号为{id}的数据吗?", { action: text, id: row.id, }) ) .then(function () { return updateWarehouse(row); }) .then(() => { this.$modal.msgSuccess(text + " " + this.$t("成功")); }) .catch(function () { row.status = row.status === CommonStatusEnum.ENABLE ? CommonStatusEnum.DISABLE : CommonStatusEnum.ENABLE; }); }, /** 取消按钮 */ cancel() { this.open = false; this.reset(); }, resetTemplate() { this.arr = []; this.showFlag = false; this.ladingform = { prefixCounter: undefined, titleZh: undefined, account: undefined, contentZh: undefined, }; }, /** 表单重置 */ reset() { this.form = { id: undefined, pid: undefined, number: undefined, qianzhui: undefined, titleZh: undefined, titleEn: undefined, volume: undefined, addressZh: undefined, addressEn: undefined, zhou: undefined, guojia: undefined, sheng: undefined, shi: undefined, head: undefined, tell: undefined, tradeType: undefined, freight: undefined, remark: undefined, sort: undefined, status: undefined, img: undefined, checkList: [], }; this.resetForm("form"); }, /** 搜索按钮操作 */ handleQuery() { this.queryParams.pageNo = 1; this.getList(); }, /** 重置按钮操作 */ resetQuery() { this.dateRangeCreateTime = []; this.resetForm("queryForm"); this.handleQuery(); }, /** 新增按钮操作 */ handleAdd() { this.reset(); this.isUpdate = false; if (this.nodeId) { //把已现在的网点的一些属性赋值给仓库 this.form.nodeId = this.queryParams.nodeId; let node = this.getSelectNode(this.form.nodeId); this.form.zhou = node.zhou; this.form.guojia = node.guojia; this.form.sheng = node.sheng; this.form.shi = node.shi; this.form.tradeType = node.tradeType; this.form.checkList = node.freight.split(","); this.changeContinents(this.form.zhou); this.changeCountry(this.form.guojia); this.changeProvince(this.form.sheng); } this.open = true; this.title = this.$t("添加仓库"); }, /** 修改按钮操作 */ handleUpdate(row) { this.reset(); const id = row.id; getWarehouse(id).then((response) => { this.form = response.data; let ckList = response.data.freight.split(","); this.$set(this.form, "checkList", ckList); this.changeContinents(response.data.zhou); this.changeCountry(response.data.guojia); this.changeProvince(response.data.sheng); this.isUpdate = true; this.open = true; this.title = this.$t("修改仓库"); }); }, /** 提交按钮 */ submitForm() { this.$refs["form"].validate((valid) => { if (!valid) { return; } //逗号拼接运输方式 var freight = ""; for (let i = 0; i < this.form.checkList.length; i++) { freight += this.form.checkList[i] + ","; } freight = freight.substring(0, freight.length - 1); this.form.freight = freight; // 修改的提交 if (this.form.id != null) { updateWarehouse(this.form).then((response) => { this.$modal.msgSuccess(this.$t("修改成功")); this.open = false; this.getList(); }); return; } // 添加的提交 createWarehouse(this.form).then((response) => { this.$modal.msgSuccess(this.$t("新增成功")); this.open = false; this.getList(); }); }); }, submitTemplateForm() { if (this.showFlag && this.ladingform.lineIds != null) { let lineId = ""; let lineArr = this.ladingform.lineIds; lineArr.forEach((elem, index) => { lineId = lineId + elem.lineId + ","; }); this.ladingform.lineId = lineId.substr(0, lineId.length - 1); } this.ladingform.account = JSON.stringify(this.arr); createTemplate(this.ladingform).then((response) => { this.$modal.msgSuccess(this.$t("设置路线提单模板成功")); this.templateOpen = false; this.resetTemplate(); }); }, /** 删除按钮操作 */ handleDelete(row) { const id = row.id; this.$modal .confirm(this.$t("是否确认删除仓库编号为{id}的数据项?", { id })) .then(function () { return deleteWarehouse(id); }) .then(() => { this.getList(); this.$modal.msgSuccess(this.$t("删除成功")); }) .catch(() => {}); }, /** 导出按钮操作 */ handleExport() { // 处理查询参数 let params = { ...this.queryParams }; params.pageNo = undefined; params.pageSize = undefined; this.addBeginAndEndTime(params, this.dateRangeCreateTime, "createTime"); // 执行导出 this.$modal .confirm(this.$t("是否确认导出所有仓库数据项?")) .then(() => { this.exportLoading = true; return exportWarehouseExcel(params); }) .then((response) => { this.$download.excel(response, "${table.classComment}.xls"); this.exportLoading = false; }) .catch(() => {}); }, /**提交绑定部门 */ commitBind() { if (!this.selectDeptList || this.selectDeptList.length == 0) { this.$message.error(this.$t("请先选择部门")); return; } //获取部门id列表 let deptIdList = []; this.selectDeptList.map((item) => { deptIdList.push(item.id); return item; }); let params = { deptIdList: deptIdList, warehouseId: this.deptWarhouse.id, }; deptBind(params).then((response) => { this.$message.success(this.$t("绑定成功")); let deptIdList = response.data; // console.log(deptIdList); for (let index in this.list) { let warehouse = this.list[index]; if (warehouse.id == this.deptWarhouse.id) { warehouse.deptIdList = deptIdList; } } // console.log(this.list); this.deptOpen = false; }); }, handleSelectionChange(value) { this.selectDeptList = value; // console.log(this.selectDeptList); }, setChildren(children, type) { // 编辑多个子层级 children.map((j) => { this.toggleSelection(j, type); if (j.children) { this.setChildren(j.children, type); } }); }, // 选中父节点时,子节点一起选中取消 select(selection, row) { const hasSelect = selection.some((el) => { return row.id === el.id; }); if (hasSelect) { if (row.children) { // 解决子组件没有被勾选到 this.setChildren(row.children, true); } //TODO 判断父节点的所有子节点是否都被选中 } else { //TODO 取消选择判断父节点的所有子节点是否都被取消 if (row.children) { this.setChildren(row.children, false); } } }, toggleSelection(row, select) { if (row) { this.$nextTick(() => { this.$refs.multipleTable && this.$refs.multipleTable.toggleRowSelection(row, select); }); } }, // 选择全部 selectAll(selection) { // console.log(selection); // tabledata第一层只要有在selection里面就是全选 const isSelect = selection.some((el) => { const tableDataIds = this.deptList.map((j) => j.id); return tableDataIds.includes(el.id); }); // tableDate第一层只要有不在selection里面就是全不选 const isCancel = !this.deptList.every((el) => { const selectIds = selection.map((j) => j.id); return selectIds.includes(el.id); }); if (isSelect) { selection.map((el) => { if (el.children) { // 解决子组件没有被勾选到 this.setChildren(el.children, true); } }); } if (isCancel) { this.deptList.map((el) => { if (el.children) { // 解决子组件没有被勾选到 this.setChildren(el.children, false); } }); } }, }, }; </script>