Commit 6cd3037c authored by lanbaoming's avatar lanbaoming

Merge branch 'dev'

parents b0072e23 ac6219d7
import request from '@/utils/request'
// 创建跟进
export function createCustomerFollow(data) {
return request({
url: '/ecw/customer-follow/create',
method: 'post',
data: data
})
}
// 更新跟进
export function updateCustomerFollow(data) {
return request({
url: '/ecw/customer-follow/update',
method: 'put',
data: data
})
}
// 删除跟进
export function deleteCustomerFollow(id) {
return request({
url: '/ecw/customer-follow/delete?id=' + id,
method: 'delete'
})
}
// 获得跟进
export function getCustomerFollow(id) {
return request({
url: '/ecw/customer-follow/get?id=' + id,
method: 'get'
})
}
// 获得跟进分页
export function getCustomerFollowPage(query) {
return request({
url: '/ecw/customer-follow/page',
method: 'get',
params: query
})
}
// 导出跟进 Excel
export function exportCustomerFollowExcel(query) {
return request({
url: '/ecw/customer-follow/export-excel',
method: 'get',
params: query,
responseType: 'blob'
})
}
//
export function getFollowPage(query) {
return request({
url: '/ecw/customer-follow/followPage',
method: 'get',
params: query
})
}
\ No newline at end of file
<template> <template>
<div class="app-container"> <div class="app-container">
<doc-alert :title="$t('工作流')" url="https://doc.iocoder.cn/bpm" />
<!-- 搜索工作栏 --> <!-- 搜索工作栏 -->
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px"> <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item :label="$t('组名')" prop="name"> <el-form-item :label="$t('组名')" prop="name">
......
<template> <template>
<div class="app-container"> <div class="app-container">
<doc-alert :title="$t('工作流')" url="https://doc.iocoder.cn/bpm" />
<!-- 搜索工作栏 --> <!-- 搜索工作栏 -->
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px"> <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item :label="$t('流程标识')" prop="key"> <el-form-item :label="$t('流程标识')" prop="key">
......
...@@ -29,7 +29,6 @@ ...@@ -29,7 +29,6 @@
<el-form-item :label="$t('客户等级')" prop="level"> <el-form-item :label="$t('客户等级')" prop="level">
<el-select <el-select
multiple multiple
clearable
v-model="queryParams.level" v-model="queryParams.level"
:placeholder="$t('请选择客户等级')" :placeholder="$t('请选择客户等级')"
clearable clearable
...@@ -66,7 +65,6 @@ ...@@ -66,7 +65,6 @@
clearable clearable
v-model="queryParams.customerService" v-model="queryParams.customerService"
:placeholder="$t('请选择客户经理')" :placeholder="$t('请选择客户经理')"
clearable
size="small" size="small"
@change="handleQuery" @change="handleQuery"
> >
...@@ -117,7 +115,6 @@ ...@@ -117,7 +115,6 @@
clearable clearable
v-model="queryParams.status" v-model="queryParams.status"
:placeholder="$t('请选择客户状态')" :placeholder="$t('请选择客户状态')"
clearable
size="small" size="small"
@change="handleQuery" @change="handleQuery"
> >
......
<template>
<div class="app-container">
<el-card>
<div slot="header" class="card-title">{{$t('报表跟进')}}</div>
<el-form ref="form" :model="form" :rules="rules" label-width="120px" label-position="left">
<el-form-item :label="$t('编号')" prop="followNo">
<el-input type="text" v-model="form.followNo" :placeholder="$t('请输入编号')" />
</el-form-item>
<el-form-item :label="$t('类型')" prop="type" style="width: 46%;display: inline-block;margin-left:8%">
<!-- <el-radio v-model="form.type" label="2">{{$t('商务洽谈')}}</el-radio> -->
<dict-selector ref='dictMethod' v-model="form.followMethod" :type="DICT_TYPE.CUSTOMER_FOLLOW_METHOD"></dict-selector>
</el-form-item>
<el-form-item :label="$t('客户编号')" prop="followNo">
<el-input type="text" v-model="form.followNo" />
</el-form-item>
<el-form-item :label="$t('报价单号')" prop="number" style="width: 46%;display: inline-block;">
<label>{{form.number}}</label>
</el-form-item>
<el-form-item :label="$t('跟进时间')" prop="followUpTime" style="width: 46%;display: inline-block">
<el-date-picker clearable v-model="form.followUpTime" value-format="yyyy-MM-dd HH:mm:ss" format="yyyy-MM-dd HH:mm:ss" type="datetime" :placeholder="$t('选择跟进时间')" />
</el-form-item>
<el-form-item :label="$t('客户经理')" prop="followUpSalesmanId" style="width: 46%;display: inline-block;;margin-left:8%">
<el-select v-model="form.followUpSalesmanId" :placeholder="$t('请选择跟进业务员')" clearable>
<el-option v-for="item in creatorData"
:key="item.id" :label="item.nickname" :value="item.id"/>
</el-select>
</el-form-item>
<el-form-item :label="$t('联系人')" prop="contacts" style="width: 46%;display: inline-block">
<el-select v-model="form.contacts" :placeholder="$t('请选择联系人')" clearable>
<el-option v-for="item in contactsData" :key="item.id" :label="item.name" :value="item.id"/>
</el-select>
</el-form-item>
<el-form-item :label="$t('跟进方式')" prop="followUpMethod" style="width: 46%;display: inline-block;margin-left:8%">
<dict-selector
:type="DICT_TYPE.CUSTOMER_FOLLOW_METHOD"
:placeholder="$t('请选择跟进方式')"
v-model="form.followUpMethod"
form-type="select"
:clearable="true"
/>
</el-form-item>
<el-form-item :label="$t('目的')" prop="customerFeedback">
<el-input type="textarea" :rows="3" v-model="form.customerFeedback" maxlength="500" :placeholder="$t('请输入客户反馈')" />
</el-form-item>
<el-form-item :label="$t('情况')" prop="processingResults">
<el-input type="textarea" :rows="3" v-model="form.processingResults" maxlength="500" :placeholder="$t('请输入处理结果')" />
</el-form-item>
</el-form>
</el-card>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm">{{$t('确定')}}</el-button>
</div>
</div>
</template>
<script>
import { createOfferLog } from "@/api/ecw/offerLog"
import { userList } from "@/api/system/user"
import { getCustomerContactsListByCustomer } from "@/api/ecw/customerContacts"
import {DICT_TYPE} from '@/utils/dict'
import {getOffer} from '@/api/ecw/offer'
import {getCustomerContactsSelect} from '@/api/ecw/customerContacts'
export default {
name: "OfferLog",
components: {
},
data() {
return {
// 遮罩层
loading: true,
open: false,
contactsData:[],
creatorData:[],
// 表单参数
form: {
type:'2',
offerId:0,
number:0,
},
relationId:0,
// 表单校验
rules: {
type: [{ required: true, message: this.$t("请选择跟进类型"), trigger: "change" }],
followUpTime: [{ required: true, message: this.$t("跟进时间不能为空"), trigger: "blur" }],
followUpSalesmanId: [{ required: true, message: this.$t("客户经理不能为空"), trigger: "change" }],
contacts: [{ required: true, message: this.$t("联系人不能为空"), trigger: "blur" }],
followUpMethod: [{ required: true, message: this.$t("请选择跟进方式"), trigger: "change" }],
customerFeedback: [{ required: true, message: this.$t("客户反馈不能为空"), trigger: "blur" }],
processingResults: [{ required: true, message: this.$t("处理结果不能为空"), trigger: "blur" }],
},
list:[]
};
},
created() {
if(this.$route.query.offerId){
this.form.offerId = this.$route.query.offerId
this.getList();
}
if(this.$route.query.number){
this.form.number = this.$route.query.number
}
userList('customer service').then(res =>this.creatorData = res.data)
},
methods: {
getList() {
let that = this
// 执行查询
getOffer(that.form.offerId).then(response => {
that.list = response.data;
that.getContactsData()
})
},
getContactsData(){
getCustomerContactsSelect({ids: [this.list.consigneeId, this.list.consignorId].join(',')}).then((res) => {
if(res.data.list.length>0){
this.contactsData.push({name:res.data.list[0].contactsName+'('+this.$t('发货人')+')',id:res.data.list[0].customerContactsId})
this.contactsData.push({name:res.data.list[1].contactsName+'('+this.$t('收货人')+')',id:res.data.list[1].customerContactsId})
}
})
// getCustomerContactsListByCustomer({customerId:this.relationId}).then(response => {
// this.contactsData = response.data
// })
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (!valid) {
return;
}
// 添加的提交
this.form.type = parseInt(this.form.type)
this.form.followUpMethod = parseInt(this.form.followUpMethod)
createOfferLog(this.form).then(response => {
this.$modal.msgSuccess(this.$t("新增成功"));
this.$store.dispatch('tagsView/delCurrentView')
});
});
},
}
};
</script>
<style scoped>
.dialog-footer{
padding: 40px;
}
</style>
<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="编号" prop="followNo">
<el-input
v-model="queryParams.followNo"
placeholder="请输入编号"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="跟进类型" prop="followType">
<!-- <el-select v-model="queryParams.followType" :type="DICT_TYPE.CUSTOMER_FOLLOW_TYPE" placeholder="请选择跟进类型" clearable size="small">
<el-option label="请选择字典生成" value="" />
</el-select> -->
<dict-selector
clearable
:type="DICT_TYPE.CUSTOMER_FOLLOW_TYPE"
v-model="queryParams.followType"
@change="handleQuery"
></dict-selector>
</el-form-item>
<el-form-item label="跟进时间">
<el-date-picker
v-model="dateRangeFollowTime"
style="width: 240px"
value-format="yyyy-MM-dd"
type="daterange"
range-separator="-"
start-placeholder="开始日期"
end-placeholder="结束日期"
/>
</el-form-item>
<el-form-item label="联系人" prop="contactName">
<el-input
v-model="queryParams.contactName"
placeholder="请输入联系人"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="跟进方式" prop="followMethod">
<!-- <el-input v-model="queryParams.followMethod" placeholder="请输入跟进方式" clearable @keyup.enter.native="handleQuery"/> -->
<dict-selector
clearable
:type="DICT_TYPE.CUSTOMER_FOLLOW_METHOD"
v-model="queryParams.followMethod"
@change="handleQuery"
></dict-selector>
</el-form-item>
<el-form-item label="客户经理" prop="followUserId">
<!-- <el-input v-model="queryParams.followUserId" placeholder="请输入跟进业务员" clearable @keyup.enter.native="handleQuery"/> -->
<el-select
v-model="queryParams.followUserId"
:placeholder="$t('请选择客户经理')"
clearable
size="small"
@change="handleQuery"
>
<el-option
v-for="dict in customerServiceList"
:key="dict.id"
:label="dict.nickname"
:value="dict.id"
/>
</el-select>
</el-form-item>
<!-- <el-form-item label="客户反馈" prop="feedback">
<el-input v-model="queryParams.feedback" placeholder="请输入客户反馈" clearable @keyup.enter.native="handleQuery"/>
</el-form-item>
<el-form-item label="处理结果" prop="result">
<el-input v-model="queryParams.result" placeholder="请输入处理结果" clearable @keyup.enter.native="handleQuery"/>
</el-form-item> -->
<!-- <el-form-item label="管理员id" prop="adminId">
<el-input v-model="queryParams.adminId" placeholder="请输入管理员id" clearable @keyup.enter.native="handleQuery"/>
</el-form-item> -->
<el-form-item label="创建时间">
<el-date-picker
v-model="dateRangeCreateTime"
style="width: 240px"
value-format="yyyy-MM-dd"
type="daterange"
range-separator="-"
start-placeholder="开始日期"
end-placeholder="结束日期"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" @click="handleQuery"
>搜索</el-button
>
<el-button icon="el-icon-refresh" @click="resetQuery">重置</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:customer-follow:create']"
>新增</el-button
>
</el-col>
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="updateStatus"
v-hasPermi="['ecw:customer-follow:updateStatus']"
>修改状态</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:customer-follow:export']"
>导出</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="" align="center" prop="id" /> -->
<el-table-column label="编号" align="center" prop="followNo" />
<el-table-column
prop="followType"
:label="$t('跟进类型')"
:formatter="
(row, column, cellValue) =>
getDictDataLabel(DICT_TYPE.CUSTOMER_FOLLOW_TYPE, cellValue)
"
>
</el-table-column>
<el-table-column label="报价单" align="center" prop="bizNo" />
<el-table-column
label="时间"
align="center"
prop="followTime"
width="180"
>
<template slot-scope="scope">
<span>{{ parseTime(scope.row.followTime) }}</span>
</template>
</el-table-column>
<el-table-column label="客户编号" align="center" prop="number" />
<el-table-column label="联系人" align="center" prop="contactName" />
<el-table-column label="联系方式" align="center" prop="phone" />
<el-table-column label="客户经理" align="center" prop="followUserName" />
<el-table-column
prop="followMethod"
:label="$t('方式')"
:formatter="
(row, column, cellValue) =>
getDictDataLabel(DICT_TYPE.CUSTOMER_FOLLOW_METHOD, cellValue)
"
>
</el-table-column>
<el-table-column label="目的" align="center" prop="customerFeedback" />
<el-table-column label="结果" align="center" prop="followResult" />
<el-table-column label="跟进情况" align="center" prop="result" />
<el-table-column
label="下次跟进时间"
align="center"
prop="nextFollowTime"
>
<template slot-scope="scope">
<span>{{ parseTime(scope.row.nextFollowTime) }}</span>
</template>
</el-table-column>
<el-table-column label="跟进计划" align="center" prop="nextPlan" />
<el-table-column label="创建人" align="center" prop="creatorName" />
<el-table-column
label="创建时间"
align="center"
prop="createTime"
width="180"
>
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createTime) }}</span>
</template>
</el-table-column>
<el-table-column label="最后更新人" align="center" prop="updaterName" />
<el-table-column
label="最后更新时间"
align="center"
prop="updateTime"
width="180"
>
<template slot-scope="scope">
<span>{{ parseTime(scope.row.updateTime) }}</span>
</template>
</el-table-column>
<el-table-column
label="操作"
align="center"
class-name="small-padding fixed-width"
>
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['ecw:customer-follow:update']"
>修改</el-button
>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['ecw:customer-follow:delete']"
>删除</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 :title="title" :visible.sync="open" width="500px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="业务ID" prop="bizId">
<el-input v-model="form.bizId" placeholder="请输入业务ID" />
</el-form-item>
<el-form-item label="跟进类型" prop="followType">
<!-- <el-select v-model="form.followType" placeholder="请选择跟进类型">
<el-option label="请选择字典生成" value="" />
</el-select> -->
<dict-selector
ref="dictMethod"
v-model="form.followMethod"
:type="DICT_TYPE.CUSTOMER_FOLLOW_METHOD"
></dict-selector>
</el-form-item>
<el-form-item label="跟进时间" prop="followTime">
<el-date-picker
clearable
v-model="form.followTime"
type="date"
value-format="yyyy-MM-dd"
placeholder="选择跟进时间"
/>
</el-form-item>
<el-form-item label="联系人" prop="contactName">
<el-input v-model="form.contactName" placeholder="请输入联系人" />
</el-form-item>
<el-form-item label="跟进方式" prop="followMethod">
<el-input v-model="form.followMethod" placeholder="请输入跟进方式" />
</el-form-item>
<el-form-item label="跟进业务员" prop="followUserId">
<el-input
v-model="form.followUserId"
placeholder="请输入跟进业务员"
/>
</el-form-item>
<el-form-item label="客户反馈" prop="feedback">
<el-input v-model="form.feedback" placeholder="请输入客户反馈" />
</el-form-item>
<el-form-item label="处理结果" prop="result">
<el-input v-model="form.result" placeholder="请输入处理结果" />
</el-form-item>
<el-form-item label="管理员id" prop="adminId">
<el-input v-model="form.adminId" placeholder="请输入管理员id" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm">确 定</el-button>
<el-button @click="cancel">取 消</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import {
createCustomerFollow,
updateCustomerFollow,
deleteCustomerFollow,
getCustomerFollow,
getCustomerFollowPage,
exportCustomerFollowExcel,
getFollowPage,
} from "@/api/ecw/follow";
import { listServiceUser } from "@/api/system/user";
export default {
name: "CustomerFollow",
components: {},
data() {
return {
// 遮罩层
loading: true,
// 导出遮罩层
exportLoading: false,
// 显示搜索条件
showSearch: true,
// 总条数
total: 0,
// 跟进列表
list: [],
// 弹出层标题
title: "",
// 是否显示弹出层
open: false,
dateRangeFollowTime: [],
dateRangeCreateTime: [],
customerServiceList: [],
// 查询参数
queryParams: {
pageNo: 1,
pageSize: 10,
bizId: null,
followType: null,
contactName: null,
followMethod: null,
followUserId: null,
feedback: null,
result: null,
adminId: null,
},
// 表单参数
form: {},
// 表单校验
rules: {
bizId: [{ required: true, message: "业务ID不能为空", trigger: "blur" }],
},
};
},
created() {
this.getList();
listServiceUser().then((r) => {
this.customerServiceList = r.data;
});
},
methods: {
/** 查询列表 */
getList() {
this.loading = true;
// 处理查询参数
let params = { ...this.queryParams };
this.addBeginAndEndTime(params, this.dateRangeFollowTime, "followTime");
this.addBeginAndEndTime(params, this.dateRangeCreateTime, "createTime");
// 执行查询
getFollowPage(params).then((response) => {
this.list = response.data.list;
this.total = response.data.total;
this.loading = false;
});
},
/** 取消按钮 */
cancel() {
this.open = false;
this.reset();
},
/** 表单重置 */
reset() {
this.form = {
id: undefined,
bizId: undefined,
followType: undefined,
followTime: undefined,
contactName: undefined,
followMethod: undefined,
followUserId: undefined,
feedback: undefined,
result: undefined,
adminId: undefined,
};
this.resetForm("form");
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNo = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.dateRangeFollowTime = [];
this.dateRangeCreateTime = [];
this.resetForm("queryForm");
this.handleQuery();
},
/** 新增按钮操作 */
handleAdd() {
this.reset();
this.open = true;
this.title = "添加跟进";
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset();
const id = row.id;
getCustomerFollow(id).then((response) => {
this.form = response.data;
this.open = true;
this.title = "修改跟进";
});
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate((valid) => {
if (!valid) {
return;
}
// 修改的提交
if (this.form.id != null) {
updateCustomerFollow(this.form).then((response) => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
});
return;
}
// 添加的提交
createCustomerFollow(this.form).then((response) => {
this.$modal.msgSuccess("新增成功");
this.open = false;
this.getList();
});
});
},
/** 删除按钮操作 */
handleDelete(row) {
const id = row.id;
this.$modal
.confirm('是否确认删除跟进编号为"' + id + '"的数据项?')
.then(function () {
return deleteCustomerFollow(id);
})
.then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
})
.catch(() => {});
},
/** 导出按钮操作 */
handleExport() {
// 处理查询参数
let params = { ...this.queryParams };
params.pageNo = undefined;
params.pageSize = undefined;
this.addBeginAndEndTime(params, this.dateRangeFollowTime, "followTime");
this.addBeginAndEndTime(params, this.dateRangeCreateTime, "createTime");
// 执行导出
this.$modal
.confirm("是否确认导出所有跟进数据项?")
.then(() => {
this.exportLoading = true;
return exportCustomerFollowExcel(params);
})
.then((response) => {
this.$download.excel(response, "${table.classComment}.xls");
this.exportLoading = false;
})
.catch(() => {});
},
},
};
</script>
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -5,168 +5,208 @@ ...@@ -5,168 +5,208 @@
append-to-body append-to-body
width="90vw" width="90vw"
> >
<el-table ref="multipleTable" :data="flatList" @selection-change="handleSelectionChange" :span-method="objectSpanMethod" class="table"> <el-table
ref="multipleTable"
:data="flatList"
@selection-change="handleSelectionChange"
:span-method="objectSpanMethod"
class="table"
>
<el-table-column type="selection" width="55"></el-table-column> <el-table-column type="selection" width="55"></el-table-column>
<el-table-column :label="$t('品名')" prop="name"> <el-table-column :label="$t('品名')" prop="name">
<template #default="{row}">{{$l(row, "prodName")}}</template> <template #default="{ row }">{{ $l(row, "prodName") }}</template>
</el-table-column> </el-table-column>
<el-table-column :label="$t('品牌')" prop="brand"> <el-table-column :label="$t('品牌')" prop="brand">
<template #default="{row}">{{$l(row, "brandName")}}</template> <template #default="{ row }">{{ $l(row, "brandName") }}</template>
</el-table-column> </el-table-column>
<el-table-column :label="$t('材质')" prop="material"> <el-table-column :label="$t('材质')" prop="material">
<template #default="{row}">{{$l(row, "materialLabel")}}</template> <template #default="{ row }">{{ $l(row, "materialLabel") }}</template>
</el-table-column> </el-table-column>
<el-table-column :label="$t('商品特性')" prop="attr"> <el-table-column :label="$t('商品特性')" prop="attr">
<template #default="{row}">{{$l(row, "prodAttrNames")}}</template> <template #default="{ row }">{{ $l(row, "prodAttrNames") }}</template>
</el-table-column> </el-table-column>
<el-table-column :label="$t('用途')" prop="unit"> <el-table-column :label="$t('用途')" prop="unit">
<template #default="{row}">{{$l(row, "usageNames")}}</template> <template #default="{ row }">{{ $l(row, "usageNames") }}</template>
</el-table-column> </el-table-column>
<el-table-column :label="$t('总数量')" prop="quantityAll"></el-table-column> <el-table-column
<el-table-column :label="$t('总箱数')" prop="cartonsNum"></el-table-column> :label="$t('总数量')"
prop="quantityAll"
></el-table-column>
<el-table-column
:label="$t('总箱数')"
prop="cartonsNum"
></el-table-column>
<el-table-column :label="$t('包装类型')" prop="specificationType"> <el-table-column :label="$t('包装类型')" prop="specificationType">
<template #default="{row}"> <template #default="{ row }">
<dict-tag :type="DICT_TYPE.WAREHOUSING_SPECIFICATION_TYPE" :value="row.specificationType"></dict-tag> <dict-tag
:type="DICT_TYPE.WAREHOUSING_SPECIFICATION_TYPE"
:value="row.specificationType"
></dict-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column :label="$t('规格')" prop="boxGauge"></el-table-column> <el-table-column :label="$t('规格')" prop="boxGauge"></el-table-column>
<el-table-column :label="$t('总重量')" prop="weight"></el-table-column> <el-table-column :label="$t('总重量')" prop="weight"></el-table-column>
<el-table-column :label="$t('快递单号')" prop="expressNo"></el-table-column> <el-table-column
:label="$t('快递单号')"
prop="expressNo"
></el-table-column>
<el-table-column :label="$t('影像')" prop="quantityAll"> <el-table-column :label="$t('影像')" prop="quantityAll">
<template #default="{row}"> <template #default="{ row }">
<el-button type="text" @click="curPictrues = row.pictureUrls">{{$t('查看影像')}}</el-button> <el-button type="text" @click="curPictrues = row.pictureUrls">{{
$t("查看影像")
}}</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<div slot="footer" class="dialog-footer"> <div slot="footer" class="dialog-footer">
<el-button type="primary" @click="handleSubmit">{{$t('确定')}}</el-button> <el-button type="primary" @click="handleSubmit">{{
<el-button @click="handleClose">{{$t('取消')}}</el-button> $t("确定")
}}</el-button>
<el-button @click="handleClose">{{ $t("取消") }}</el-button>
</div> </div>
<media-dialog v-if="curPictrues" :value="curPictrues" @close="curPictrues=null"></media-dialog> <media-dialog
v-if="curPictrues"
:value="curPictrues"
@close="curPictrues = null"
></media-dialog>
</el-dialog> </el-dialog>
</template> </template>
<script> <script>
import {getOrderItemCommonAttr} from "@/api/ecw/order" import { getOrderItemCommonAttr } from "@/api/ecw/order";
import MediaDialog from "@/views/ecw/order/stocking/components/MediaDialog.vue"; import MediaDialog from "@/views/ecw/order/stocking/components/MediaDialog.vue";
export default { export default {
components: {MediaDialog}, components: { MediaDialog },
props: { props: {
orderId: { orderId: {
type: Number, type: Number,
default: undefined default: undefined,
}, },
warehouseInId:Number warehouseInId: Number,
}, },
data(){ data() {
return { return {
visible: true, visible: true,
// 备选的商品明细 // 备选的商品明细
orderItemDetails: [], orderItemDetails: [],
multipleSelection:[], multipleSelection: [],
curPictrues: null curPictrues: null,
} };
}, },
watch:{ watch: {
visible(val){ visible(val) {
if (!val) { if (!val) {
this.$emit('close') this.$emit("close");
} }
}, },
}, },
computed:{ computed: {
flatList(){ flatList() {
let arr = [] let arr = [];
this.orderItemDetails.forEach(item => { this.orderItemDetails.forEach((item) => {
item.orderWarehouseInCommonAttrVOList?.forEach((vo, index) => { item.orderWarehouseInCommonAttrVOList?.forEach((vo, index) => {
arr.push({ arr.push({
...item, ...item,
...vo, ...vo,
index, index,
span: index === 0 ? item.orderWarehouseInCommonAttrVOList?.length : 0, span:
warehouseInId: item.id index === 0 ? item.orderWarehouseInCommonAttrVOList?.length : 0,
}) warehouseInId: item.id,
}) });
}) });
return arr });
} return arr;
},
}, },
async created() { async created() {
getOrderItemCommonAttr(this.orderId, this.warehouseInId || 0).then(res => { getOrderItemCommonAttr(this.orderId, this.warehouseInId || 0).then(
this.orderItemDetails = res.data (res) => {
}) this.orderItemDetails = res.data;
}
);
}, },
methods: { methods: {
handleSelectionChange(e){ handleSelectionChange(e) {
console.log("handleSelectionChange", e) console.log("handleSelectionChange", e);
this.multipleSelection = e this.multipleSelection = e;
}, },
handleSubmit(){ handleSubmit() {
// 品名+品牌+材质+商品特性+用途一致的会合并,数量累加 // 品名+品牌+材质+商品特性+用途一致的会合并,数量累加
// https://zentao.test.jdshangmen.com/task-view-3423.html // https://zentao.test.jdshangmen.com/task-view-3423.html
let arr = [] let arr = [];
this.multipleSelection.forEach(item => { this.multipleSelection.forEach((item) => {
let index = arr.findIndex(i => { let index = arr.findIndex((i) => {
return i.prodId == item.prodId && i.brand == item.brand && i.material == item.material && i.prodAttrIds == item.prodAttrIds && i.usageIds == item.usageIds return (
}) i.prodId == item.prodId &&
i.brand == item.brand &&
i.material == item.material &&
i.prodAttrIds == item.prodAttrIds &&
i.usageIds == item.usageIds
);
});
if (index == -1) { if (index == -1) {
arr.push({...item}) arr.push({ ...item });
} else { } else {
arr[index].quantityAll += item.quantityAll arr[index].quantityAll += item.quantityAll;
} }
}) });
// 如果某条入仓记录下的箱明细被全部选中了,则需要将他的快递单号和影像带过去 // 如果某条入仓记录下的箱明细被全部选中了,则需要将他的快递单号和影像带过去
const expressNos = [] const expressNos = [];
const pictureUrls = [] const pictureUrls = [];
this.orderItemDetails.forEach((warehouseIn, index) => { this.orderItemDetails.forEach((warehouseIn, index) => {
// 本条入仓记录被选中的明细数 // 本条入仓记录被选中的明细数
const selectedCount = this.multipleSelection.filter(item => item.warehouseInId == warehouseIn.id).length const selectedCount = this.multipleSelection.filter(
if(selectedCount == warehouseIn.orderWarehouseInCommonAttrVOList?.length){ (item) => item.warehouseInId == warehouseIn.id
if(warehouseIn.expressNo){ ).length;
expressNos.push(warehouseIn.expressNo) if (
selectedCount == warehouseIn.orderWarehouseInCommonAttrVOList?.length
) {
if (warehouseIn.expressNo) {
expressNos.push(warehouseIn.expressNo);
} }
if(warehouseIn.pictureUrls?.length){ if (warehouseIn.pictureUrls?.length) {
pictureUrls.push(...warehouseIn.pictureUrls) pictureUrls.push(...warehouseIn.pictureUrls);
} }
} }
}) });
// 根据warehouseInId 给对应的入仓记录追加快递单号和影像 // 根据warehouseInId 给对应的入仓记录追加快递单号和影像
// 存到全局变量,在调用对应finishPack接口的时候判断追加 // 存到全局变量,在调用对应finishPack接口的时候判断追加
window.ChooseOrderProductsExpressNos = expressNos window.ChooseOrderProductsExpressNos = expressNos;
window.ChooseOrderProductsPictureUrls = pictureUrls window.ChooseOrderProductsPictureUrls = pictureUrls;
this.$emit("success", arr) this.$emit("success", arr);
}, },
handleClose() { handleClose() {
this.visible = false this.visible = false;
}, },
objectSpanMethod({ row, column, rowIndex, columnIndex }){ objectSpanMethod({ row, column, rowIndex, columnIndex }) {
if(columnIndex > 6){ if (columnIndex > 6) {
return { return {
rowspan: row.span, rowspan: row.span,
colspan: 1 colspan: 1,
} };
} }
return { return {
rowspan: 1, rowspan: 1,
colspan: 1 colspan: 1,
} };
} },
} },
} };
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.table{ .table {
::v-deep{ ::v-deep {
th.el-table__cell.is-leaf, td.el-table__cell{ th.el-table__cell.is-leaf,
td.el-table__cell {
border-bottom: 1px solid #9b9b9b; border-bottom: 1px solid #9b9b9b;
} }
.el-checkbox__inner{ .el-checkbox__inner {
border:2px solid #9b9b9b; border: 2px solid #9b9b9b;
} }
} }
} }
......
...@@ -2,71 +2,123 @@ ...@@ -2,71 +2,123 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<h2>{{ title }}-{{ order.orderNo }}</h2> <h2>{{ title }}-{{ order.orderNo }}</h2>
<order-base-info :order="order" stocking></order-base-info> <order-base-info :order="order" stocking></order-base-info>
<div class="flex items-center"> <div class="flex items-center">
<div class="flex-1 page-title">{{$t('货物信息')}}</div> <div class="flex-1 page-title">{{ $t("货物信息") }}</div>
<el-button type="primary" @click="showNewProductDialog=true">{{$t('添加新品名')}}</el-button> <el-button type="primary" @click="showNewProductDialog = true">{{
$t("添加新品名")
}}</el-button>
</div> </div>
<!-- <!--
未入仓的不显示 https://zentao.test.jdshangmen.com/bug-view-5292.html 未入仓的不显示 https://zentao.test.jdshangmen.com/bug-view-5292.html
--> -->
<el-table <el-table
v-if="order.orderItemVOList && order.orderItemVOList.length > 0 && orderItemList && orderItemList.length > 0" v-if="
order.orderItemVOList &&
order.orderItemVOList.length > 0 &&
orderItemList &&
orderItemList.length > 0
"
:data="order.orderItemVOList || []" :data="order.orderItemVOList || []"
default-expand-all default-expand-all
style="width: 100%"> style="width: 100%"
>
<!--入仓记录--> <!--入仓记录-->
<el-table-column type="expand"> <el-table-column type="expand">
<template slot-scope="props"> <template slot-scope="props">
<div style="padding-left: 80px" v-if="orderWarehouseInList(props.row.orderItemId).length"> <div
style="padding-left: 80px"
v-if="orderWarehouseInList(props.row.orderItemId).length"
>
<el-table :data="orderWarehouseInList(props.row.orderItemId)"> <el-table :data="orderWarehouseInList(props.row.orderItemId)">
<el-table-column :label="$t('序号')" width="80px"> <el-table-column :label="$t('序号')" width="80px">
<template slot-scope="{row, column, $index}"> <template slot-scope="{ row, column, $index }">
{{$index + 1}} {{ $index + 1 }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="cartonsNum" :label="$t('箱数')" width="60px"></el-table-column> <el-table-column
prop="cartonsNum"
:label="$t('箱数')"
width="60px"
></el-table-column>
<el-table-column prop="areaName" :label="$t('入仓类型')"> <el-table-column prop="areaName" :label="$t('入仓类型')">
<template v-slot="{row}"> <template v-slot="{ row }">
<dict-tag :type="DICT_TYPE.WAREHOUSING_SPECIFICATION_TYPE" :value="row.specificationType"></dict-tag> <dict-tag
:type="DICT_TYPE.WAREHOUSING_SPECIFICATION_TYPE"
:value="row.specificationType"
></dict-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="areaName" :label="$t('包装类型')"> <el-table-column prop="areaName" :label="$t('包装类型')">
<template v-slot="{row}"> <template v-slot="{ row }">
<dict-tag :type="DICT_TYPE.ECW_PACKAGING_TYPE" :value="row.unit"></dict-tag> <dict-tag
:type="DICT_TYPE.ECW_PACKAGING_TYPE"
:value="row.unit"
></dict-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="areaName" :label="$t('长') + '(cm)'" width="70px"> <el-table-column
<template v-slot="{row}">{{row.boxGauge.split('*')[0]}}</template> prop="areaName"
:label="$t('长') + '(cm)'"
width="70px"
>
<template v-slot="{ row }">{{
row.boxGauge.split("*")[0]
}}</template>
</el-table-column> </el-table-column>
<el-table-column prop="areaName" :label="$t('宽') + '(cm)'" width="70px"> <el-table-column
<template v-slot="{row}">{{row.boxGauge.split('*')[1]}}</template> prop="areaName"
:label="$t('宽') + '(cm)'"
width="70px"
>
<template v-slot="{ row }">{{
row.boxGauge.split("*")[1]
}}</template>
</el-table-column> </el-table-column>
<el-table-column prop="areaName" :label="$t('高') + '(cm)'" width="70px"> <el-table-column
<template v-slot="{row}">{{row.boxGauge.split('*')[2]}}</template> prop="areaName"
:label="$t('高') + '(cm)'"
width="70px"
>
<template v-slot="{ row }">{{
row.boxGauge.split("*")[2]
}}</template>
</el-table-column> </el-table-column>
<el-table-column prop="volume" :label="$t('体积')+'(m³)'"></el-table-column> <el-table-column
<el-table-column prop="weight" :label="$t('重量')+'(kg)'"></el-table-column> prop="volume"
<el-table-column prop="quantityAll" :label="$t('数量') + '(个)'"></el-table-column> :label="$t('体积') + '(m³)'"
<el-table-column prop="expressNo" :label="$t('快递单号')"></el-table-column> ></el-table-column>
<el-table-column
prop="weight"
:label="$t('重量') + '(kg)'"
></el-table-column>
<el-table-column
prop="quantityAll"
:label="$t('数量') + '(个)'"
></el-table-column>
<el-table-column
prop="expressNo"
:label="$t('快递单号')"
></el-table-column>
<el-table-column prop="createTime" :label="$t('首次入仓时间')"> <el-table-column prop="createTime" :label="$t('首次入仓时间')">
<template v-slot="{row}">{{parseTime(row.inTime)}}</template> <template v-slot="{ row }">{{
parseTime(row.inTime)
}}</template>
</el-table-column> </el-table-column>
<el-table-column prop="areaName" :label="$t('储位')"> <el-table-column prop="areaName" :label="$t('储位')">
<template v-slot="{row}"> <template v-slot="{ row }">
{{row.orderLocationStr4Merge}} {{ row.orderLocationStr4Merge }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="areaName" :label="$t('影像')"> <el-table-column prop="areaName" :label="$t('影像')">
<template v-slot="{row}"> <template v-slot="{ row }">
<el-button type="text" @click="showMedia(props.row)">{{$t('查看')}}</el-button> <el-button type="text" @click="showMedia(props.row)">{{
$t("查看")
}}</el-button>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="areaName" width="220px"> <el-table-column prop="areaName" width="220px">
<template v-slot="{row}"> <template v-slot="{ row }">
<WarehouseRecordDetail <WarehouseRecordDetail
v-model="row.orderWarehouseInDetailsVOList" v-model="row.orderWarehouseInDetailsVOList"
@input="saveDetail(props.row, row.id)" @input="saveDetail(props.row, row.id)"
...@@ -75,8 +127,20 @@ ...@@ -75,8 +127,20 @@
:warehouse-in-id="row.id" :warehouse-in-id="row.id"
@close="clearAppendExpressNoAndPictures" @close="clearAppendExpressNoAndPictures"
/> />
<el-button class="pl-5 pr-5" size="mini" type="primary" @click="package(props.row, $t('修改打包'))">{{$t('修改')}}</el-button> <el-button
<el-button class="pl-5 pr-5" size="mini" type="danger" @click="package(props.row, $t('修改打包'))">{{$t('删除')}}</el-button> class="pl-5 pr-5"
size="mini"
type="primary"
@click="package(props.row, $t('修改打包'))"
>{{ $t("修改") }}</el-button
>
<el-button
class="pl-5 pr-5"
size="mini"
type="danger"
@click="package(props.row, $t('修改打包'))"
>{{ $t("删除") }}</el-button
>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
...@@ -84,101 +148,128 @@ ...@@ -84,101 +148,128 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column type="index" width="50" :label="$t('序号')">
type="index"
width="50"
:label="$t('序号')">
</el-table-column> </el-table-column>
<el-table-column <el-table-column prop="prodTitleZh" :label="$t('品名')">
prop="prodTitleZh" <template v-slot="{ row }">
:label="$t('品名')"> {{ row.prodTitleZh }}<br />
<template v-slot="{row}">
{{ row.prodTitleZh }}<br>
{{ row.prodTitleEn }} {{ row.prodTitleEn }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column :label="$t('填单货物属性')">
:label="$t('填单货物属性')"> <template v-slot="{ row }">
<template v-slot="{row}"> <span v-if="row.isWarehouseInAdd">{{ $t("非填单货物信息") }}</span>
<span v-if="row.isWarehouseInAdd">{{$t('非填单货物信息')}}</span>
<template v-else> <template v-else>
{{$t('品牌')}}{{ [$t('无牌'), $t('有牌'), $t('中性')][row.brandType] }}<br> {{ $t("品牌") }}{{
{{$t('箱数')}}{{ row.num }}<br> [$t("无牌"), $t("有牌"), $t("中性")][row.brandType]
{{$t('体积')}}{{ row.volume }}<br> }}<br />
{{$t('重量')}}{{ row.weight }}Kg {{ $t("箱数") }}{{ row.num }}<br />
{{ $t("体积") }}{{ row.volume }}<br />
{{ $t("重量") }}{{ row.weight }}Kg
</template> </template>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column :label="$t('入库货物属性')">
:label="$t('入库货物属性')"> <template v-slot="{ row }">
<template v-slot="{row}">
<template v-if="row.warehouseInInfoVO"> <template v-if="row.warehouseInInfoVO">
{{$t('品牌')}}{{ row.brandName }}<br> {{ $t("品牌") }}{{ row.brandName }}<br />
{{$t('箱数')}}{{ row.warehouseInInfoVO.cartonsNum }}<br> {{ $t("箱数") }}{{ row.warehouseInInfoVO.cartonsNum }}<br />
{{$t('体积')}}{{ row.warehouseInInfoVO.volume }}<br> {{ $t("体积") }}{{ row.warehouseInInfoVO.volume }}<br />
{{$t('重量')}}{{ row.warehouseInInfoVO.weight }}Kg {{ $t("重量") }}{{ row.warehouseInInfoVO.weight }}Kg
</template> </template>
<span v-else>{{$t('暂无入仓信息')}}</span> <span v-else>{{ $t("暂无入仓信息") }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column
prop="expressNo" prop="expressNo"
v-slot="{row}" v-slot="{ row }"
:label="$t('快递单号')"> :label="$t('快递单号')"
{{ row.expressNo || (row.warehouseInInfoVO ? row.warehouseInInfoVO.expressNo : '') }} >
{{
row.expressNo ||
(row.warehouseInInfoVO ? row.warehouseInInfoVO.expressNo : "")
}}
</el-table-column> </el-table-column>
<el-table-column <el-table-column v-slot="{ row }" :label="$t('商品特性')">
v-slot="{row}"
:label="$t('商品特性')">
<template v-if="row.prodAttrIds"> <template v-if="row.prodAttrIds">
{{showAttr(row.prodAttrIds)}} {{ showAttr(row.prodAttrIds) }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column prop="createTime" :label="$t('最后操作时间')">
prop="createTime" <template v-slot="{ row }">
:label="$t('最后操作时间')">
<template v-slot="{row}">
{{ parseTime(row.updateTime) }} {{ parseTime(row.updateTime) }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column prop="diffType" v-slot="{ row }" :label="$t('状态')">
prop="diffType"
v-slot="{row}"
:label="$t('状态')">
<dict-tag <dict-tag
v-if="row.warehouseInInfoVO && row.warehouseInInfoVO.diffType" v-if="row.warehouseInInfoVO && row.warehouseInInfoVO.diffType"
:type="DICT_TYPE.ORDER_WAREHOUSE_IN_STATUS" :type="DICT_TYPE.ORDER_WAREHOUSE_IN_STATUS"
:value="row.warehouseInInfoVO.diffType" :value="row.warehouseInInfoVO.diffType"
class="red" class="red"
:class="{green: row.warehouseInInfoVO.diffType === 4}" :class="{ green: row.warehouseInInfoVO.diffType === 4 }"
/> />
<span :class="{red: row.itemStatus === 3}" v-else>{{ row.itemStatus === 3 ? ($t('少了') + row.num + $t('箱')) : $t('待入仓') }}</span> <span :class="{ red: row.itemStatus === 3 }" v-else>{{
<span class="red" v-if="row.warehouseInInfoVO && row.warehouseInInfoVO.cartonsNumDiff">{{ row.warehouseInInfoVO.cartonsNumDiff }}{{$t('箱')}}</span> row.itemStatus === 3 ? $t("少了") + row.num + $t("箱") : $t("待入仓")
}}</span>
<span
class="red"
v-if="row.warehouseInInfoVO && row.warehouseInInfoVO.cartonsNumDiff"
>{{ row.warehouseInInfoVO.cartonsNumDiff }}{{ $t("箱") }}</span
>
</el-table-column> </el-table-column>
<el-table-column <el-table-column prop="createTime" :label="$t('打包状态')" width="100">
prop="createTime" <template v-slot="{ row }">
:label="$t('打包状态')" width="100"> <dict-tag
<template v-slot="{row}"> :type="DICT_TYPE.ORDER_ITEM_PACK_STATUS"
<dict-tag :type="DICT_TYPE.ORDER_ITEM_PACK_STATUS" :value="wareItemPackStatus(row.orderItemId)" /> :value="wareItemPackStatus(row.orderItemId)"
/>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column prop="address" :label="$t('操作')" width="250">
prop="address"
:label="$t('操作')" width="250">
<template v-slot="{ row, column, $index }"> <template v-slot="{ row, column, $index }">
<!--没有入仓记录的不显示打包按钮 https://zentao.test.jdshangmen.com/bug-view-5389.html--> <!--没有入仓记录的不显示打包按钮 https://zentao.test.jdshangmen.com/bug-view-5389.html-->
<el-button-group v-if="orderWarehouseInList(row.orderItemId).length"> <el-button-group v-if="orderWarehouseInList(row.orderItemId).length">
<template v-if="wareItemPackStatus(row.orderItemId) == 1"> <template v-if="wareItemPackStatus(row.orderItemId) == 1">
<el-button class="pl-5 pr-5" size="mini" type="warning" @click="noNeedPack(row)">{{$t('无需打包')}}</el-button> <el-button
<el-button size="mini" type="primary" @click="package(row, $t('打包'))">{{$t('打包')}}</el-button> class="pl-5 pr-5"
size="mini"
type="warning"
@click="noNeedPack(row)"
>{{ $t("无需打包") }}</el-button
>
<el-button
size="mini"
type="primary"
@click="package(row, $t('打包'))"
>{{ $t("打包") }}</el-button
>
</template> </template>
<el-button class="pl-5 pr-5" v-else size="mini" type="primary" @click="package(row, $t('修改打包'))">{{$t('修改打包')}}</el-button> <el-button
<el-tooltip :content="$t('请确认货物打包完成再并箱')" :value="true" manual> class="pl-5 pr-5"
<el-button size="mini" type="danger" @click="rollback(row)">{{$t('并箱')}}</el-button> v-else
size="mini"
type="primary"
@click="package(row, $t('修改打包'))"
>{{ $t("修改打包") }}</el-button
>
<el-tooltip
:content="$t('请确认货物打包完成再并箱')"
:value="true"
manual
>
<el-button size="mini" type="danger" @click="rollback(row)">{{
$t("并箱")
}}</el-button>
</el-tooltip> </el-tooltip>
<el-button class="pl-5 pr-5" size="mini" type="info" @click="printTag">{{$t('打印标签')}}</el-button> <el-button
class="pl-5 pr-5"
size="mini"
type="info"
@click="printTag"
>{{ $t("打印标签") }}</el-button
>
</el-button-group> </el-button-group>
</template> </template>
</el-table-column> </el-table-column>
...@@ -199,76 +290,119 @@ ...@@ -199,76 +290,119 @@
</el-input> </el-input>
</el-form-item>--> </el-form-item>-->
<h2>{{$t('订单数据')}}</h2> <h2>{{ $t("订单数据") }}</h2>
<el-form-item :label="$t('下单统计')" class="mb-0"> <el-form-item :label="$t('下单统计')" class="mb-0">
{{ $t(`{num}箱 {weight}Kg {volume}m³ {quantity}个`, { {{
$t(`{num}箱 {weight}Kg {volume}m³ {quantity}个`, {
num: statistics.sumNumInput, num: statistics.sumNumInput,
weight: statistics.sumWeightInput, weight: statistics.sumWeightInput,
volume: statistics.sumVolumeInput, volume: statistics.sumVolumeInput,
quantity: statistics.sumQuantityInput quantity: statistics.sumQuantityInput,
}) }} })
}}
</el-form-item> </el-form-item>
<el-form-item :label="$t('入仓统计')" class="mb-0"> <el-form-item :label="$t('入仓统计')" class="mb-0">
{{ $t(`{num}箱 {weight}Kg {volume}m³ {quantity}个`, { {{
$t(`{num}箱 {weight}Kg {volume}m³ {quantity}个`, {
num: statistics.sumCartonsNumFinishedWarehouseIn, num: statistics.sumCartonsNumFinishedWarehouseIn,
weight: statistics.sumWeightFinishedWarehouseIn, weight: statistics.sumWeightFinishedWarehouseIn,
volume: statistics.sumVolumeFinishedWarehouseIn, volume: statistics.sumVolumeFinishedWarehouseIn,
quantity: statistics.sumQuantityAllFinishedWarehouseIn quantity: statistics.sumQuantityAllFinishedWarehouseIn,
}) }} })
}}
</el-form-item> </el-form-item>
<el-form-item :label="$t('打包前统计')" class="mb-0"> <el-form-item :label="$t('打包前统计')" class="mb-0">
{{ $t(`{num}箱 {weight}Kg {volume}m³ {quantity}个`, { {{
$t(`{num}箱 {weight}Kg {volume}m³ {quantity}个`, {
num: statistics.sumCartonsNumPrevPacked, num: statistics.sumCartonsNumPrevPacked,
weight: statistics.sumWeightPrevPacked, weight: statistics.sumWeightPrevPacked,
volume: statistics.sumVolumePrevPacked, volume: statistics.sumVolumePrevPacked,
quantity: statistics.sumQuantityAllPrevPacked quantity: statistics.sumQuantityAllPrevPacked,
}) }} })
}}
</el-form-item> </el-form-item>
<el-form-item :label="$t('打包后统计')" class="mb-0"> <el-form-item :label="$t('打包后统计')" class="mb-0">
{{ $t(`{num}箱 {weight}Kg {volume}m³ {quantity}个`, { {{
$t(`{num}箱 {weight}Kg {volume}m³ {quantity}个`, {
num: statistics.sumNum, num: statistics.sumNum,
weight: statistics.sumWeight, weight: statistics.sumWeight,
volume: statistics.sumVolume, volume: statistics.sumVolume,
quantity: statistics.sumQuantity quantity: statistics.sumQuantity,
}) }} })
}}
</el-form-item> </el-form-item>
<el-card style="margin-top: 15px;"> <el-card style="margin-top: 15px">
<div slot="header" class="clearfix"> <div slot="header" class="clearfix">
<span style="font-size: 18px">{{$t('入仓影像')}}</span> <span style="font-size: 18px">{{ $t("入仓影像") }}</span>
</div> </div>
<div> <div>
<image-and-video-upload :fileSize="50" :isShowTip="true" v-model="pictureUrls" readonly ></image-and-video-upload> <image-and-video-upload
:fileSize="50"
:isShowTip="true"
v-model="pictureUrls"
readonly
></image-and-video-upload>
</div> </div>
</el-card> </el-card>
<div style="text-align: center;margin-top: 15px"> <div style="text-align: center; margin-top: 15px">
<el-button @click="escapeBol = true;" type="primary">{{$t('转异')}}</el-button> <el-button @click="escapeBol = true" type="primary">{{
<el-button type="primary" @click="handleSubmit">{{$t('完成备货')}}</el-button> $t("转异")
<el-button type="info" @click="printTag">{{$t('打印标签')}}</el-button> }}</el-button>
<el-button type="primary" @click="handleSubmit">{{
$t("完成备货")
}}</el-button>
<el-button type="info" @click="printTag">{{
$t("打印标签")
}}</el-button>
</div> </div>
</el-form> </el-form>
<el-dialog :title="order.orderNo + $t('订单转异')" center :visible.sync="escapeBol"> <el-dialog
<el-form label-position="top" label-width="200" ref="exceptionForm" :model="form" :rules="exceptionRules"> :title="order.orderNo + $t('订单转异')"
center
:visible.sync="escapeBol"
>
<el-form
label-position="top"
label-width="200"
ref="exceptionForm"
:model="form"
:rules="exceptionRules"
>
<el-form-item :label="$t('异常类型')" prop="manualExceptionType"> <el-form-item :label="$t('异常类型')" prop="manualExceptionType">
<dict-selector v-model="form.manualExceptionType" form-type="checkbox" :type="DICT_TYPE.STOCK_UP_EXCEPTION_TYPE" multiple ></dict-selector> <dict-selector
v-model="form.manualExceptionType"
form-type="checkbox"
:type="DICT_TYPE.STOCK_UP_EXCEPTION_TYPE"
multiple
></dict-selector>
</el-form-item> </el-form-item>
<el-form-item :label="$t('附件')"> <el-form-item :label="$t('附件')">
<!--<image-upload v-model="form.exceptionUrls"></image-upload>--> <!--<image-upload v-model="form.exceptionUrls"></image-upload>-->
<image-and-video-upload :fileSize="50" :isShowTip="true" v-model="form.exceptionUrls" ></image-and-video-upload> <image-and-video-upload
:fileSize="50"
:isShowTip="true"
v-model="form.exceptionUrls"
></image-and-video-upload>
</el-form-item> </el-form-item>
<el-form-item :label="$t('详细信息')"> <el-form-item :label="$t('详细信息')">
<el-input v-model="form.descZh" type="textarea"></el-input> <el-input v-model="form.descZh" type="textarea"></el-input>
</el-form-item> </el-form-item>
</el-form> </el-form>
<span slot="footer" class="dialog-footer"> <span slot="footer" class="dialog-footer">
<el-button type="primary" @click="handleException">{{$t('确认并完成打包')}}</el-button> <el-button type="primary" @click="handleException">{{
<el-button @click="escapeBol = false">{{$t('取消')}}</el-button> $t("确认并完成打包")
}}</el-button>
<el-button @click="escapeBol = false">{{ $t("取消") }}</el-button>
</span> </span>
</el-dialog> </el-dialog>
<print-tag v-if="isShowPrintTag" :order-id="orderId" @close="isShowPrintTag = false"></print-tag> <print-tag
v-if="isShowPrintTag"
:order-id="orderId"
@close="isShowPrintTag = false"
></print-tag>
<package <package
:order="order" :order="order"
:order-item-a="packageOrderItem" :order-item-a="packageOrderItem"
...@@ -277,46 +411,56 @@ ...@@ -277,46 +411,56 @@
v-if="!!packageOrderItem" v-if="!!packageOrderItem"
@close="onPackageClose" @close="onPackageClose"
></package> ></package>
<new-product <new-product
:order="order" :order="order"
v-if="showNewProductDialog" v-if="showNewProductDialog"
@close="onPackageClose" @close="onPackageClose"
></new-product> ></new-product>
<media-dialog v-if="curPictrues" :value="curPictrues" @close="curPictrues=null"></media-dialog> <media-dialog
<print-tag v-if="showPrintTagDialog" :order-id="orderId" @close="showPrintTagDialog=false" :warehouse-in-num="order.sumNum" /> v-if="curPictrues"
:value="curPictrues"
@close="curPictrues = null"
></media-dialog>
<print-tag
v-if="showPrintTagDialog"
:order-id="orderId"
@close="showPrintTagDialog = false"
:warehouse-in-num="order.sumNum"
/>
</div> </div>
</template> </template>
<script> <script>
import {getCurrencyList} from "@/api/ecw/currency" import { getCurrencyList } from "@/api/ecw/currency";
import { import {
finishPacked, finishPacked,
finishStock, finishStock,
getOrder, getOrder,
getOrderWarehouseIn, getOrderWarehouseIn,
getSpecialListByOrderId, getSpecialListByOrderId,
noNeedPack, rollbackDelete, noNeedPack,
rollbackDelete,
warehousePictureList, warehousePictureList,
getPackStatistics getPackStatistics,
} from '@/api/ecw/order' } from "@/api/ecw/order";
import orderBaseInfo from "@/components/OrderBaseInfo" import orderBaseInfo from "@/components/OrderBaseInfo";
import WarehouseAreaDialog from '@/components/WarehouseAreaDialog' import WarehouseAreaDialog from "@/components/WarehouseAreaDialog";
import {DICT_TYPE} from "@/utils/dict" import { DICT_TYPE } from "@/utils/dict";
import PrintTag from "@/views/ecw/order/components/PrintTag" import PrintTag from "@/views/ecw/order/components/PrintTag";
import PrintWarehouseReceipt from "@/views/ecw/order/components/PrintWarehouseReceipt" import PrintWarehouseReceipt from "@/views/ecw/order/components/PrintWarehouseReceipt";
import imageUpload from "@/components/ImageUpload"; import imageUpload from "@/components/ImageUpload";
import {parseTime} from "@/utils/ruoyi" import { parseTime } from "@/utils/ruoyi";
import ImageAndVideoUpload from '@/components/ImageAndVideoUpload' import ImageAndVideoUpload from "@/components/ImageAndVideoUpload";
import Package from './components/Package' import Package from "./components/Package";
import Template from "@/views/cms/template/index.vue"; import Template from "@/views/cms/template/index.vue";
import {getProductAttrList} from "@/api/ecw/productAttr"; import { getProductAttrList } from "@/api/ecw/productAttr";
import MediaDialog from "@/views/ecw/order/stocking/components/MediaDialog.vue"; import MediaDialog from "@/views/ecw/order/stocking/components/MediaDialog.vue";
import WarehouseRecordDetail from "@/views/ecw/order/warehousing/components/WarehouseRecordDetail.vue"; import WarehouseRecordDetail from "@/views/ecw/order/warehousing/components/WarehouseRecordDetail.vue";
import {formatTime} from "../../../../utils"; import { formatTime } from "../../../../utils";
export default { export default {
name: "Stocking", name: "Stocking",
components: { components: {
WarehouseRecordDetail, WarehouseRecordDetail,
MediaDialog, MediaDialog,
...@@ -328,18 +472,21 @@ export default { ...@@ -328,18 +472,21 @@ export default {
imageUpload, imageUpload,
ImageAndVideoUpload, ImageAndVideoUpload,
Package, Package,
NewProduct: () => import('@/views/ecw/order/stocking/components/NewProduct.vue') NewProduct: () =>
import("@/views/ecw/order/stocking/components/NewProduct.vue"),
}, },
mounted() { mounted() {
if(this.$route.query.id){ if (this.$route.query.id) {
this.orderId = parseInt(this.$route.query.id || undefined) this.orderId = parseInt(this.$route.query.id || undefined);
getSpecialListByOrderId(this.orderId).then(r => this.specialList = r.data) getSpecialListByOrderId(this.orderId).then(
this.getList() (r) => (this.specialList = r.data)
);
this.getList();
} }
getCurrencyList().then(res => this.currencyList = res.data) getCurrencyList().then((res) => (this.currencyList = res.data));
getProductAttrList().then(res => this.productAttrList = res.data) getProductAttrList().then((res) => (this.productAttrList = res.data));
}, },
data() { data() {
...@@ -350,13 +497,13 @@ export default { ...@@ -350,13 +497,13 @@ export default {
finishVisible: false, finishVisible: false,
warehousingVisible: false, warehousingVisible: false,
form: { form: {
exceptionUrls:[], exceptionUrls: [],
descZh:'', descZh: "",
manualExceptionType:[], manualExceptionType: [],
sumVolume: '', sumVolume: "",
sumWeight: '', sumWeight: "",
}, },
currencyList:[], currencyList: [],
order: {}, order: {},
orderId: undefined, orderId: undefined,
orderItemList: [], orderItemList: [],
...@@ -364,29 +511,30 @@ export default { ...@@ -364,29 +511,30 @@ export default {
warehousing: undefined, warehousing: undefined,
isShowPrintTag: false, isShowPrintTag: false,
isShowPrint: false, isShowPrint: false,
escapeBol:false, escapeBol: false,
label: { label: {
"orderId": 0, orderId: 0,
"orderLabelDtoList": [ orderLabelDtoList: [
{ {
"end": 0, end: 0,
"start": 0 start: 0,
} },
] ],
}, },
exceptionRules: { exceptionRules: {
manualExceptionType: [ manualExceptionType: [
{ required: true, message: '请勾选原因类型', trigger: 'change' }, { required: true, message: "请勾选原因类型", trigger: "change" },
{ {
validator: (rule, value, callback) => { validator: (rule, value, callback) => {
if (value.length <= 0) { if (value.length <= 0) {
callback(new Error('请勾选原因类型')) callback(new Error("请勾选原因类型"));
}
callback()
}, trigger: 'change'
} }
] callback();
},
trigger: "change",
},
],
}, },
// 打包弹层的标题 // 打包弹层的标题
packageTitle: null, packageTitle: null,
...@@ -402,176 +550,204 @@ export default { ...@@ -402,176 +550,204 @@ export default {
// 是否显示打印标签弹层 // 是否显示打印标签弹层
showPrintTagDialog: false, showPrintTagDialog: false,
// 统计数据 // 统计数据
statistics:{} statistics: {},
} };
}, },
methods: { methods: {
formatTime, formatTime,
getStatistics() { getStatistics() {
console.log('获取统计数据') console.log("获取统计数据");
getPackStatistics(this.orderId).then(res => { getPackStatistics(this.orderId).then((res) => {
this.statistics = res.data this.statistics = res.data;
}) });
}, },
getOrderItemList(){ getOrderItemList() {
this.orderItemList = [] this.orderItemList = [];
return getOrderWarehouseIn(this.orderId).then(r => this.orderItemList = r.data) return getOrderWarehouseIn(this.orderId).then(
}, (r) => (this.orderItemList = r.data)
getList(){ );
this.getOrder() },
this.getOrderItemList() getList() {
this.getStatistics() this.getOrder();
}, this.getOrderItemList();
getWarehousePictureList(){ this.getStatistics();
},
getWarehousePictureList() {
return warehousePictureList({ return warehousePictureList({
bizId: this.order.orderId, bizId: this.order.orderId,
type: 1 type: 1,
}).then(r =>{ }).then((r) => {
this.form.urls = r.data.map(i =>i.url) this.form.urls = r.data.map((i) => i.url);
}) });
}, },
include(){ include() {
return (state, arr) => { return (state, arr) => {
return arr.indexOf(state) > -1 return arr.indexOf(state) > -1;
} };
}, },
exclude(){ exclude() {
return (state, arr) => { return (state, arr) => {
return arr.indexOf(state) == -1 return arr.indexOf(state) == -1;
} };
}, },
getOrder(){ getOrder() {
return getOrder(this.orderId).then(r => { return getOrder(this.orderId)
.then((r) => {
// 获取渠道可出特性文案用户订单基础信息显示 // 获取渠道可出特性文案用户订单基础信息显示
r.data.channelAttrName = this.showAttr(r.data.channelAttrId) r.data.channelAttrName = this.showAttr(r.data.channelAttrId);
this.order = r.data this.order = r.data;
this.form.sumVolume = this.order.sumVolume this.form.sumVolume = this.order.sumVolume;
this.form.sumWeight = this.order.sumWeight this.form.sumWeight = this.order.sumWeight;
}).then(() => {
// this.getLabelByOrder()
this.getWarehousePictureList()
}) })
.then(() => {
// this.getLabelByOrder()
this.getWarehousePictureList();
});
}, },
// 提交转异 // 提交转异
handleException() { handleException() {
this.$refs.exceptionForm.validate((valid) => { this.$refs.exceptionForm.validate((valid) => {
if (valid) { if (valid) {
this.handleSubmit() this.handleSubmit();
} else { } else {
this.$message.warning('请勾选原因类型') this.$message.warning("请勾选原因类型");
} }
}) });
}, },
// 完成备货 // 完成备货
async handleSubmit() { async handleSubmit() {
let unpackProds = [] let unpackProds = [];
this.orderItemList.forEach(item => { this.orderItemList.forEach((item) => {
// 有入仓记录且未打包 // 有入仓记录且未打包
if(item.orderWarehouseInBackItemDoList.length && item.packStatus == 1){ if (
unpackProds.push(this.$l(item, 'prodTitle')) item.orderWarehouseInBackItemDoList.length &&
item.packStatus == 1
) {
unpackProds.push(this.$l(item, "prodTitle"));
} }
}) });
if(unpackProds.length){ if (unpackProds.length) {
return this.$alert(`商品${unpackProds.join(',')}未完成打包,无法完成备货`, this.$t('提示')) return this.$alert(
`商品${unpackProds.join(",")}未完成打包,无法完成备货`,
this.$t("提示")
);
} }
let form = {...this.form} let form = { ...this.form };
form.orderId = this.orderId form.orderId = this.orderId;
form.manualExceptionType = form.manualExceptionType.join(',') form.manualExceptionType = form.manualExceptionType.join(",");
finishStock(form).then(res => { finishStock(form)
.then((res) => {
return this.$confirm("备货成功,是否需要打印标签").catch(() => { return this.$confirm("备货成功,是否需要打印标签").catch(() => {
this.$tab.closePage() this.$tab.closePage();
}) });
}).then(() => {
this.printTag()
}) })
.then(() => {
this.printTag();
});
}, },
// 显示打包弹层 // 显示打包弹层
package(row, title = null){ package(row, title = null) {
this.packageOrderItem = row this.packageOrderItem = row;
this.packageWarehouseItem = this.orderItemList.find(item => item.orderItemId === row.orderItemId) this.packageWarehouseItem = this.orderItemList.find(
this.packageTitle = title || this.$t('打包') (item) => item.orderItemId === row.orderItemId
);
this.packageTitle = title || this.$t("打包");
}, },
// 无需打包 // 无需打包
noNeedPack(row){ noNeedPack(row) {
noNeedPack(row.orderItemId).then(res => { noNeedPack(row.orderItemId).then((res) => {
this.$message.success(this.$t('操作成功')) this.$message.success(this.$t("操作成功"));
this.getList() this.getList();
}) });
}, },
onPackageClose(){ onPackageClose() {
this.packageOrderItem=null; this.packageOrderItem = null;
this.packageOrderItem=null; this.packageOrderItem = null;
this.showNewProductDialog = false this.showNewProductDialog = false;
this.getList() this.getList();
}, },
showMedia(orderItem){ showMedia(orderItem) {
console.log('查看影像', orderItem) console.log("查看影像", orderItem);
const wareItem = this.wareItem(orderItem.orderItemId) const wareItem = this.wareItem(orderItem.orderItemId);
if(!wareItem.pictureUrls){ if (!wareItem.pictureUrls) {
return this.$message.info(this.$t('暂无影像')) return this.$message.info(this.$t("暂无影像"));
} }
this.curPictrues = wareItem.pictureUrls || [] this.curPictrues = wareItem.pictureUrls || [];
}, },
// 保存箱明细 // 保存箱明细
saveDetail(row, warehouseInId){ saveDetail(row, warehouseInId) {
const wareItem = this.wareItem(row.orderItemId) //lanbm 2024-06-15 添加注释
const orderWarehouseInItemDtoList = wareItem.orderWarehouseInBackItemDoList //alert(warehouseInId);
orderWarehouseInItemDtoList.map(item =>{ const wareItem = this.wareItem(row.orderItemId);
item.orderLocationCreateReqVOList = item.orderLocationBackVOList || [] const orderWarehouseInItemDtoList =
return item wareItem.orderWarehouseInBackItemDoList;
}) orderWarehouseInItemDtoList.map((item) => {
let pictures = wareItem.pictureUrls || [] item.orderLocationCreateReqVOList = item.orderLocationBackVOList || [];
if(window.ChooseOrderProductsPictureUrls?.length){ return item;
pictures.push(...window.ChooseOrderProductsPictureUrls) });
let pictures = wareItem.pictureUrls || [];
if (window.ChooseOrderProductsPictureUrls?.length) {
pictures.push(...window.ChooseOrderProductsPictureUrls);
// 去重 // 去重
pictures = Array.from(new Set(pictures)) pictures = Array.from(new Set(pictures));
} }
if(window.ChooseOrderProductsExpressNos?.length){ if (window.ChooseOrderProductsExpressNos?.length) {
const warehouseInItem = orderWarehouseInItemDtoList.find(item => item.id === warehouseInId) const warehouseInItem = orderWarehouseInItemDtoList.find(
if(!warehouseInItem.expressNo)warehouseInItem.expressNo = "" (item) => item.id === warehouseInId
window.ChooseOrderProductsExpressNos?.forEach(item => { );
if(warehouseInItem.expressNo.indexOf(item) === -1){ if (!warehouseInItem.expressNo) warehouseInItem.expressNo = "";
if(warehouseInItem.expressNo?.length) warehouseInItem.expressNo += "," window.ChooseOrderProductsExpressNos?.forEach((item) => {
warehouseInItem.expressNo += item if (warehouseInItem.expressNo.indexOf(item) === -1) {
if (warehouseInItem.expressNo?.length)
warehouseInItem.expressNo += ",";
warehouseInItem.expressNo += item;
} }
}) });
} }
const data = { const data = {
orderId: row.orderId, orderId: row.orderId,
orderItemId: row.orderItemId, orderItemId: row.orderItemId,
orderWarehouseInItemDtoList: orderWarehouseInItemDtoList, orderWarehouseInItemDtoList: orderWarehouseInItemDtoList,
pictureUrls: pictures pictureUrls: pictures,
} };
finishPacked(data).then(res => { finishPacked(data).then((res) => {
this.$message.success(this.$t('操作成功')) //lanbm 2024-06-15 调用列表加载函数
}) this.getList();
this.$message.success(this.$t("操作成功"));
});
}, },
// 并箱 // 并箱
async rollback(orderItem){ async rollback(orderItem) {
this.$confirm(this.$l(orderItem, 'prodTitle') + this.$t("并箱后不可恢复,是否确认并箱?"), this.$t('提示')).then(() => { this.$confirm(
this.$l(orderItem, "prodTitle") +
this.$t("并箱后不可恢复,是否确认并箱?"),
this.$t("提示")
)
.then(() => {
return rollbackDelete({ return rollbackDelete({
orderId: this.orderId, orderId: this.orderId,
orderItemId: orderItem.orderItemId, orderItemId: orderItem.orderItemId,
isPackagingRollback: true isPackagingRollback: true,
}) });
}).then(res =>{
this.$message.success(this.$t('操作成功'))
this.getList()
}) })
.then((res) => {
this.$message.success(this.$t("操作成功"));
this.getList();
});
}, },
printTag(){ printTag() {
this.showPrintTagDialog = true this.showPrintTagDialog = true;
}, },
// 箱明细关闭后清理快递单号和影像临时数据 // 箱明细关闭后清理快递单号和影像临时数据
clearAppendExpressNoAndPictures(){ clearAppendExpressNoAndPictures() {
setTimeout(() => { setTimeout(() => {
window.ChooseOrderProductsExpressNos = null window.ChooseOrderProductsExpressNos = null;
window.ChooseOrderProductsPictureUrls = null window.ChooseOrderProductsPictureUrls = null;
}, 100) }, 100);
} },
}, },
watch: { watch: {
/*orderSpecialNeeds(val){ /*orderSpecialNeeds(val){
...@@ -587,73 +763,80 @@ export default { ...@@ -587,73 +763,80 @@ export default {
computed: { computed: {
// 根据orderItemId获取入仓item // 根据orderItemId获取入仓item
wareItem(){ wareItem() {
return orderItemId => { return (orderItemId) => {
return this.orderItemList.find(item => item.orderItemId == orderItemId) return this.orderItemList.find(
} (item) => item.orderItemId == orderItemId
);
};
}, },
// 根据orderItemId获取入仓记录 // 根据orderItemId获取入仓记录
orderWarehouseInList(){ orderWarehouseInList() {
return (orderItemId) => { return (orderItemId) => {
return this.wareItem(orderItemId)?.orderWarehouseInBackItemDoList || [] return this.wareItem(orderItemId)?.orderWarehouseInBackItemDoList || [];
} };
}, },
// 获取打包状态 // 获取打包状态
wareItemPackStatus(){ wareItemPackStatus() {
return orderItemId => { return (orderItemId) => {
return this.wareItem(orderItemId)?.packStatus return this.wareItem(orderItemId)?.packStatus;
} };
}, },
title() { title() {
return this.$i18n.locale === 'en_US' ? this.$route.meta.titleEn : this.$route.name return this.$i18n.locale === "en_US"
? this.$route.meta.titleEn
: this.$route.name;
}, },
orderSpecialNeedsDict() { orderSpecialNeedsDict() {
return this.$store.state.dict.dictDatas.order_special_needs return this.$store.state.dict.dictDatas.order_special_needs;
}, },
orderSpecialNeeds(){ orderSpecialNeeds() {
const result = [] const result = [];
this.specialList.forEach(e => { this.specialList.forEach((e) => {
const t = this.orderSpecialNeedsDict.find(f => f.value === e.advanceType) const t = this.orderSpecialNeedsDict.find(
if(t) { (f) => f.value === e.advanceType
result.push({...e, label: t.label, labelEn: t.labelEn}) );
if (t) {
result.push({ ...e, label: t.label, labelEn: t.labelEn });
} }
}) });
return result return result;
}, },
warehouseId(){ warehouseId() {
return this.order?.logisticsInfoDto?.startWarehouseId return this.order?.logisticsInfoDto?.startWarehouseId;
}, },
// 显示特性 // 显示特性
showAttr(){ showAttr() {
return attrIds => { return (attrIds) => {
if(!attrIds) return '' if (!attrIds) return "";
let attrArr = attrIds.split(",").map(item => +item) let attrArr = attrIds.split(",").map((item) => +item);
let arr = [] let arr = [];
this.productAttrList.forEach(item => { this.productAttrList.forEach((item) => {
if(attrArr.indexOf(item.id) > -1) arr.push(this.$l(item, 'attrName')) if (attrArr.indexOf(item.id) > -1)
}) arr.push(this.$l(item, "attrName"));
return arr.join(",") });
} return arr.join(",");
};
}, },
// 全部入仓记录的入仓影像 // 全部入仓记录的入仓影像
pictureUrls(){ pictureUrls() {
let urls = [] let urls = [];
this.orderItemList.forEach(item => { this.orderItemList.forEach((item) => {
console.log('pictureUrls', item.pictureUrls) console.log("pictureUrls", item.pictureUrls);
urls = urls.concat(item.pictureUrls || []) urls = urls.concat(item.pictureUrls || []);
}) });
return urls return urls;
} },
} },
} };
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
@import "src/assets/styles/element-variables"; @import "src/assets/styles/element-variables";
.red{ .red {
color: $--color-danger; color: $--color-danger;
} }
.green{ .green {
color: $--color-success; color: $--color-success;
} }
</style> </style>
<!--空运备货列表--> <!--空运备货列表-->
<template> <template>
<div class="app-container"> <div class="app-container">
<!-- 搜索工作栏 --> <!-- 搜索工作栏 -->
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true"> <el-form :model="queryParams" ref="queryForm" size="small" :inline="true">
<el-form-item :label="$t('编号')" prop="orderNo"> <el-form-item :label="$t('编号')" prop="orderNo">
<el-input v-model="queryParams.numberKey" :placeholder="$t('请输入订单号、唛头、提单号')" clearable @keyup.enter.native="handleQuery" /> <el-input
v-model="queryParams.numberKey"
:placeholder="$t('请输入订单号、唛头、提单号')"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item> </el-form-item>
<el-form-item :label="$t('发货人')" prop="consignorKey"> <el-form-item :label="$t('发货人')" prop="consignorKey">
<el-input v-model="queryParams.consignorKey" :placeholder="$t('发货人')" clearable @keyup.enter.native="handleQuery" /> <el-input
v-model="queryParams.consignorKey"
:placeholder="$t('发货人')"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item> </el-form-item>
<el-form-item :label="$t('收货人')" prop="consigneeKey"> <el-form-item :label="$t('收货人')" prop="consigneeKey">
<el-input v-model="queryParams.consigneeKey" :placeholder="$t('收货人')" clearable @keyup.enter.native="handleQuery" /> <el-input
v-model="queryParams.consigneeKey"
:placeholder="$t('收货人')"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item> </el-form-item>
<el-form-item label=""> <el-form-item label="">
<dict-selector :type="DICT_TYPE.ECW_BEGINTIME_TYPE_ENDTIME" :filter="(item) => item.value != 'PickTime'" v-model="dateFilterType" defaultable style="width: 150px; margin-right: 5px" /> <dict-selector
<el-date-picker v-model="dateFilter" type="datetimerange" range-separator="-" :type="DICT_TYPE.ECW_BEGINTIME_TYPE_ENDTIME"
:filter="(item) => item.value != 'PickTime'"
v-model="dateFilterType"
defaultable
style="width: 150px; margin-right: 5px"
/>
<el-date-picker
v-model="dateFilter"
type="datetimerange"
range-separator="-"
:start-placeholder="$t('开始日期')" :start-placeholder="$t('开始日期')"
:end-placeholder="$t('结束日期')" :end-placeholder="$t('结束日期')"
value-format="yyyy-MM-dd HH:mm:ss" value-format="yyyy-MM-dd HH:mm:ss"
...@@ -25,13 +48,33 @@ ...@@ -25,13 +48,33 @@
</el-date-picker> </el-date-picker>
</el-form-item> </el-form-item>
<el-form-item :label="$t('始发仓')" prop="startWarehouseId"> <el-form-item :label="$t('始发仓')" prop="startWarehouseId">
<el-select v-model="queryParams.startWarehouseId" :placeholder="$t('请选择始发仓')" clearable @change="handleQuery"> <el-select
<el-option v-for="item in exportWarehouseList" :label="$l(item, 'title')" :value="item.id" :key="item.id"></el-option> v-model="queryParams.startWarehouseId"
:placeholder="$t('请选择始发仓')"
clearable
@change="handleQuery"
>
<el-option
v-for="item in exportWarehouseList"
:label="$l(item, 'title')"
:value="item.id"
:key="item.id"
></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item :label="$t('目的仓')" prop="destWarehouseId"> <el-form-item :label="$t('目的仓')" prop="destWarehouseId">
<el-select v-model="queryParams.destWarehouseId" :placeholder="$t('请选择目的仓')" clearable @change="handleQuery"> <el-select
<el-option v-for="item in importWarehouseList" :label="$l(item, 'title')" :value="item.id" :key="item.id"></el-option> v-model="queryParams.destWarehouseId"
:placeholder="$t('请选择目的仓')"
clearable
@change="handleQuery"
>
<el-option
v-for="item in importWarehouseList"
:label="$l(item, 'title')"
:value="item.id"
:key="item.id"
></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
...@@ -40,188 +83,378 @@ ...@@ -40,188 +83,378 @@
</el-form-item>--> </el-form-item>-->
<el-form-item :label="$t('商品')" prop="tidanNo"> <el-form-item :label="$t('商品')" prop="tidanNo">
<el-input v-model="queryParams.prodKey" :placeholder="$t('请输入商品类型、品名或品牌')" clearable @keyup.enter.native="handleQuery" /> <el-input
v-model="queryParams.prodKey"
:placeholder="$t('请输入商品类型、品名或品牌')"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item> </el-form-item>
<el-form-item :label="$t('控货')" prop="isCargoControl"> <el-form-item :label="$t('控货')" prop="isCargoControl">
<dict-selector v-model="queryParams.isCargoControl" :type="DICT_TYPE.INFRA_BOOLEAN_STRING" fomatter="bool" clearable /> <dict-selector
v-model="queryParams.isCargoControl"
:type="DICT_TYPE.INFRA_BOOLEAN_STRING"
fomatter="bool"
clearable
/>
</el-form-item> </el-form-item>
<el-form-item :label="$t('入仓类型')" prop="warehouseType"> <el-form-item :label="$t('入仓类型')" prop="warehouseType">
<dict-selector :type="DICT_TYPE.ECW_WAREHOUSING_TYPE" v-model="queryParams.warehouseType" clearable/> <dict-selector
:type="DICT_TYPE.ECW_WAREHOUSING_TYPE"
v-model="queryParams.warehouseType"
clearable
/>
</el-form-item> </el-form-item>
<el-form-item :label="$t('客户经理')" > <el-form-item :label="$t('客户经理')">
<user-selector manage v-model="queryParams.salesmanId" clearable @change="handleQuery" <user-selector
:prepend="{ id: 0, nickname: $t('未分配客户经理')}"/> manage
v-model="queryParams.salesmanId"
clearable
@change="handleQuery"
:prepend="{ id: 0, nickname: $t('未分配客户经理') }"
/>
</el-form-item> </el-form-item>
<el-form-item :label="$t('订单状态')" prop="status"> <el-form-item :label="$t('订单状态')" prop="status">
<dict-selector :type="DICT_TYPE.ORDER_STATUS" v-model="queryParams.status" <dict-selector
@keyup.enter.native="handleQuery" clearable /> :type="DICT_TYPE.ORDER_STATUS"
v-model="queryParams.status"
@keyup.enter.native="handleQuery"
clearable
/>
</el-form-item> </el-form-item>
<el-form-item :label="$t('报关方式')" prop="customsType"> <el-form-item :label="$t('报关方式')" prop="customsType">
<dict-selector :type="DICT_TYPE.ECW_CUSTOMS_TYPE" v-model="queryParams.customsType" clearable @change="handleQuery" /> <dict-selector
:type="DICT_TYPE.ECW_CUSTOMS_TYPE"
v-model="queryParams.customsType"
clearable
@change="handleQuery"
/>
</el-form-item> </el-form-item>
<el-form-item :label="$t('是否齐货')" > <el-form-item :label="$t('是否齐货')">
<!--// 字段存疑--> <!--// 字段存疑-->
<dict-selector v-model="queryParams.isNeat" :type="DICT_TYPE.INFRA_BOOLEAN_STRING" fomatter="bool" clearable @change="handleQuery"/> <dict-selector
v-model="queryParams.isNeat"
:type="DICT_TYPE.INFRA_BOOLEAN_STRING"
fomatter="bool"
clearable
@change="handleQuery"
/>
</el-form-item> </el-form-item>
<el-form-item :label="$t('备案属性')" prop="productRecord"> <el-form-item :label="$t('备案属性')" prop="productRecord">
<dict-selector :type="DICT_TYPE.PRODUCT_RECORD_ATTRIBUTE" v-model="queryParams.productRecord" clearable @change="handleQuery" /> <dict-selector
:type="DICT_TYPE.PRODUCT_RECORD_ATTRIBUTE"
v-model="queryParams.productRecord"
clearable
@change="handleQuery"
/>
</el-form-item> </el-form-item>
<el-form-item :label="$t('快递单号')" prop="number"> <el-form-item :label="$t('快递单号')" prop="number">
<el-input v-model="queryParams.number" :placeholder="$t('快递单号')" clearable @keyup.enter.native="handleQuery" /> <el-input
v-model="queryParams.number"
:placeholder="$t('快递单号')"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item> </el-form-item>
<el-form-item :label="$t('外部仓')" prop="number"> <el-form-item :label="$t('外部仓')" prop="number">
<el-select v-model="queryParams.isExternalWarehouse" :placeholder="$t('请选择')" clearable @change="handleQuery"> <el-select
v-model="queryParams.isExternalWarehouse"
:placeholder="$t('请选择')"
clearable
@change="handleQuery"
>
<el-option :label="$t('外部仓')" :value="1"></el-option> <el-option :label="$t('外部仓')" :value="1"></el-option>
<el-option :label="$t('自有仓')" :value="0"></el-option> <el-option :label="$t('自有仓')" :value="0"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item :label="$t('异常状态')" prop="status"> <el-form-item :label="$t('异常状态')" prop="status">
<dict-selector :type="DICT_TYPE.ORDER_ABNORMAL_STATE" v-model="queryParams.abnormalState" <dict-selector
@keyup.enter.native="handleQuery" clearable /> :type="DICT_TYPE.ORDER_ABNORMAL_STATE"
v-model="queryParams.abnormalState"
@keyup.enter.native="handleQuery"
clearable
/>
</el-form-item> </el-form-item>
<el-form-item :label="$t('审核状态')" prop="status"> <el-form-item :label="$t('审核状态')" prop="status">
<dict-selector :type="DICT_TYPE.ECW_ORDER_APPROVAL_TYPE" v-model="queryParams.auditType" <dict-selector
@keyup.enter.native="handleQuery" clearable /> :type="DICT_TYPE.ECW_ORDER_APPROVAL_TYPE"
v-model="queryParams.auditType"
@keyup.enter.native="handleQuery"
clearable
/>
</el-form-item> </el-form-item>
<el-form-item :label="$t('订单类型')" prop="number"> <el-form-item :label="$t('订单类型')" prop="number">
<el-select v-model="queryParams.type" :placeholder="$t('请选择')" clearable > <el-select
v-model="queryParams.type"
:placeholder="$t('请选择')"
clearable
>
<el-option :label="$t('普通订单')" :value="0"></el-option> <el-option :label="$t('普通订单')" :value="0"></el-option>
<el-option :label="$t('集运服务')" :value="1"></el-option> <el-option :label="$t('集运服务')" :value="1"></el-option>
<el-option :label="$t('海外仓')" :value="2"></el-option> <el-option :label="$t('海外仓')" :value="2"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item :label="$t('出货渠道')" prop="number"> <el-form-item :label="$t('出货渠道')" prop="number">
<selector :options="channelList" :label-field="$l('name')" value-field="channelId" v-model="queryParams.channelId"></selector> <selector
:options="channelList"
:label-field="$l('name')"
value-field="channelId"
v-model="queryParams.channelId"
></selector>
</el-form-item> </el-form-item>
<el-form-item :label="$t('特需')" prop="packageType"> <el-form-item :label="$t('特需')" prop="packageType">
<el-select v-model="queryParams.packageTypeArr" multiple :placeholder="$t('请选择')" clearable > <el-select
v-model="queryParams.packageTypeArr"
multiple
:placeholder="$t('请选择')"
clearable
>
<template v-for="item in getDictDatas(DICT_TYPE.ORDER_SPECIAL_NEEDS)"> <template v-for="item in getDictDatas(DICT_TYPE.ORDER_SPECIAL_NEEDS)">
<el-option :label="$l(item, 'label')" :value="item.value"></el-option> <el-option
:label="$l(item, 'label')"
:value="item.value"
></el-option>
</template> </template>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" icon="el-icon-search" @click="handleQuery">{{$t('搜索')}}</el-button> <el-button type="primary" icon="el-icon-search" @click="handleQuery">{{
<el-button icon="el-icon-refresh" @click="resetQuery">{{$t('重置')}}</el-button> $t("搜索")
}}</el-button>
<el-button icon="el-icon-refresh" @click="resetQuery">{{
$t("重置")
}}</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
<!-- 操作工具栏 --> <!-- 操作工具栏 -->
<el-row :gutter="10" class="mb8"> <el-row :gutter="10" class="mb8">
<el-col :span="1.5"> <el-col :span="1.5">
<el-button :disabled="!multipleSelection.length" type="primary" :loading="exporting" plain size="mini" @click="exportXls(ids)" v-hasPermi="['ecw:order:stockingList:export_selected']">{{$t('导出所选')}}</el-button> <el-button
<el-button type="primary" :loading="exporting" plain size="mini" @click="exportXls(queryParams)" v-hasPermi="['ecw:order:stockingList:export_search']">{{$t('导出搜索')}}</el-button> :disabled="!multipleSelection.length"
type="primary"
:loading="exporting"
plain
size="mini"
@click="exportXls(ids)"
v-hasPermi="['ecw:order:stockingList:export_selected']"
>{{ $t("导出所选") }}</el-button
>
<el-button
type="primary"
:loading="exporting"
plain
size="mini"
@click="exportXls(queryParams)"
v-hasPermi="['ecw:order:stockingList:export_search']"
>{{ $t("导出搜索") }}</el-button
>
</el-col> </el-col>
</el-row> </el-row>
<!-- 列表 --> <!-- 列表 -->
<el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange"> <el-table
v-loading="loading"
:data="list"
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" width="55" align="center" /> <el-table-column type="selection" width="55" align="center" />
<el-table-column :label="$t('订单编号')" width="120px" align="center" prop="orderNo" > <el-table-column
:label="$t('订单编号')"
width="120px"
align="center"
prop="orderNo"
>
<template slot-scope="scope"> <template slot-scope="scope">
<router-link :to="{path: '/order/detail',query: {orderId: scope.row.orderId}}" class="link-type"> <router-link
:to="{
path: '/order/detail',
query: { orderId: scope.row.orderId },
}"
class="link-type"
>
<span>{{ scope.row.orderNo }}</span> <span>{{ scope.row.orderNo }}</span>
</router-link> </router-link>
<div style="display: flex;flex-wrap: wrap;" v-if="scope.row.advanceType"> <div
<el-button @click="deleteSpecial(item.value,scope.row.orderId)" size="mini" style="margin-left: 20px" type="danger" circle v-for="(item,index) in specialRendering(scope.row.advanceType)" :key="index">{{item.label[0]}}</el-button> style="display: flex; flex-wrap: wrap"
v-if="scope.row.advanceType"
>
<el-button
@click="deleteSpecial(item.value, scope.row.orderId)"
size="mini"
style="margin-left: 20px"
type="danger"
circle
v-for="(item, index) in specialRendering(scope.row.advanceType)"
:key="index"
>{{ item.label[0] }}</el-button
>
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column :label="$t('唛头')" align="center" prop="marks" /> <el-table-column :label="$t('唛头')" align="center" prop="marks" />
<el-table-column :label="$t('总箱数/入仓箱数')" align="center" prop="sumNum"> <el-table-column
<template slot-scope="{row}"> :label="$t('总箱数/入仓箱数')"
<div :style="{color:row.customsType != 1 ? 'red' : null}">{{row.totalNum}}{{$t('')}}/{{row.sumNum}}{{$t('')}}</div> align="center"
<dict-tag v-if="row.customsType != 1" style="color:red" :type="DICT_TYPE.ECW_CUSTOMS_TYPE" :value="row.customsType"></dict-tag> prop="sumNum"
>
<template slot-scope="{ row }">
<div :style="{ color: row.customsType != 1 ? 'red' : null }">
{{ row.totalNum }}{{ $t("") }}/{{ row.sumNum }}{{ $t("") }}
</div>
<dict-tag
v-if="row.customsType != 1"
style="color: red"
:type="DICT_TYPE.ECW_CUSTOMS_TYPE"
:value="row.customsType"
></dict-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column :label="$t('体积/重量')" align="center" prop="sumWeight"> <el-table-column :label="$t('体积/重量')" align="center" prop="sumWeight">
<template slot-scope="{row}"> <template slot-scope="{ row }">
<!--入仓前是填单数据,入仓后是入仓数据,装柜审核通过等状态inwarehouseState会变成0,所以只能通过sumNum来判断--> <!--入仓前是填单数据,入仓后是入仓数据,装柜审核通过等状态inwarehouseState会变成0,所以只能通过sumNum来判断-->
<component <component
:is="row.orderType > 1 ? 'el-tooltip' : 'div'" :is="row.orderType > 1 ? 'el-tooltip' : 'div'"
class="item" class="item"
:style="{ :style="{
color: row.orderType > 1 ? 'red' : null color: row.orderType > 1 ? 'red' : null,
}" }"
effect="dark" effect="dark"
:content="row.orderType===2 ? (row.wvolume||0)+'m³' : (row.vweight || 0) + 'kg'" :content="
placement="bottom"> row.orderType === 2
<div v-if="row.sumNum > 0">{{row.sumVolume}}m³ /{{row.sumWeight}}Kg</div> ? (row.wvolume || 0) + 'm³'
<div v-else>{{row.costVO.totalVolume}}m³ /{{row.costVO.totalWeight}}Kg</div> : (row.vweight || 0) + 'kg'
"
placement="bottom"
>
<div v-if="row.sumNum > 0">
{{ row.sumVolume }}m³ /{{ row.sumWeight }}Kg
</div>
<div v-else>
{{ row.costVO.totalVolume }}m³ /{{ row.costVO.totalWeight }}Kg
</div>
</component> </component>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column :label="$t('始发仓')" align="center" prop="startWarehouseName"> <el-table-column
<template slot-scope="{row}"> :label="$t('始发仓')"
{{row.startWarehouseName}} align="center"
<span style="color:red" v-if="row.isExternalWarehouse">({{$t('外部仓')}})</span> prop="startWarehouseName"
>
<template slot-scope="{ row }">
{{ row.startWarehouseName }}
<span style="color: red" v-if="row.isExternalWarehouse"
>({{ $t("外部仓") }})</span
>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column :label="$t('运输方式/目的地')" align="center" prop="transportId"> <el-table-column
<template slot-scope="{row}"> :label="$t('运输方式/目的地')"
<dict-tag :type="DICT_TYPE.ECW_TRANSPORT_TYPE" :value="row.transportId" /> / {{row.dstWarehouseName}} align="center"
prop="transportId"
>
<template slot-scope="{ row }">
<dict-tag
:type="DICT_TYPE.ECW_TRANSPORT_TYPE"
:value="row.transportId"
/>
/ {{ row.dstWarehouseName }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column :label="$t('控货')" align="center" prop="isCargoControl"> <el-table-column :label="$t('控货')" align="center" prop="isCargoControl">
<template slot-scope="{row}"> <template slot-scope="{ row }">
<dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="row.isCargoControl" /> <dict-tag
:type="DICT_TYPE.INFRA_BOOLEAN_STRING"
:value="row.isCargoControl"
/>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column :label="$t('订单状态')" align="center" prop="status"> <el-table-column :label="$t('订单状态')" align="center" prop="status">
<template slot-scope="scope"> <template slot-scope="scope">
<!-- <dict-tag :type="DICT_TYPE.ORDER_STATUS" :value="scope.row.status" /> --> <!-- <dict-tag :type="DICT_TYPE.ORDER_STATUS" :value="scope.row.status" /> -->
{{scope.row.statusMsg}} {{ scope.row.statusMsg }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column :label="$t('操作')" align="center" class-name="small-padding fixed-width actions" width="150px"> <el-table-column
:label="$t('操作')"
align="center"
class-name="small-padding fixed-width actions"
width="150px"
>
<template slot-scope="scope"> <template slot-scope="scope">
<el-button type="text" @click="setCanNotShipment(scope.row)" v-hasPermi="['ecw:order:setCanNotShipment']">{{$t('不可出')}}</el-button> <el-button
<el-button type="text" @click="$router.push('stocking?id=' + scope.row.orderId)" v-hasPermi="['ecw:order:stockingList:stocking']">{{$t('备货')}}</el-button> type="text"
<el-button type="text" @click="printTagOrderId=scope.row.orderId" v-hasPermi="['ecw:order:stockingList:print_tag']">{{$t('打印标签')}}</el-button> @click="setCanNotShipment(scope.row)"
v-hasPermi="['ecw:order:setCanNotShipment']"
>{{ $t("不可出") }}</el-button
>
<el-button
type="text"
@click="$router.push('stocking?id=' + scope.row.orderId)"
v-hasPermi="['ecw:order:stockingList:stocking']"
>{{ $t("备货") }}</el-button
>
<el-button
type="text"
@click="printTagOrderId = scope.row.orderId"
v-hasPermi="['ecw:order:stockingList:print_tag']"
>{{ $t("打印标签") }}</el-button
>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<!-- 分页组件 --> <!-- 分页组件 -->
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.page" :limit.sync="queryParams.rows" <pagination
@pagination="getList" /> v-show="total > 0"
:total="total"
:page.sync="queryParams.page"
:limit.sync="queryParams.rows"
@pagination="getList"
/>
<print-tag v-if="printTagOrderId !== null" :order-id="printTagOrderId" @close="printTagOrderId=null" /> <print-tag
v-if="printTagOrderId !== null"
:order-id="printTagOrderId"
@close="printTagOrderId = null"
/>
</div> </div>
</template> </template>
<script> <script>
import Selector from '@/components/Selector' import Selector from "@/components/Selector";
import ProductSelector from '@/components/ProductSelector' import ProductSelector from "@/components/ProductSelector";
import { getProductAttrList } from '@/api/ecw/productAttr' import { getProductAttrList } from "@/api/ecw/productAttr";
import CustomerSelector from '@/components/CustomerSelector' import CustomerSelector from "@/components/CustomerSelector";
import specialNeeds from '@/views/ecw/order/components/specialNeeds'; import specialNeeds from "@/views/ecw/order/components/specialNeeds";
import { import {
canReadyStockShipmentPage, canReadyStockShipmentPage,
exportReadyStock, exportReadyStock,
canShipmentPage, canShipmentPage,
orderSpecialNeed, orderSpecialNeed,
exportCanShipment, setNotCanShipment, setCanNotShipment exportCanShipment,
setNotCanShipment,
setCanNotShipment,
} from "@/api/ecw/order"; } from "@/api/ecw/order";
import PrintTag from './components/PrintTag' import PrintTag from "./components/PrintTag";
import PrintWarehouseReceipt from './components/PrintWarehouseReceipt' import PrintWarehouseReceipt from "./components/PrintWarehouseReceipt";
import PrintLadingBill from './components/PrintLadingBill' import PrintLadingBill from "./components/PrintLadingBill";
import BatchPickup from './components/BatchPickup' import BatchPickup from "./components/BatchPickup";
import withdrawal from "@/views/ecw/order/withdrawal"; import withdrawal from "@/views/ecw/order/withdrawal";
import UserSelector from '@/components/UserSelector' import UserSelector from "@/components/UserSelector";
import BatchSingleApplication from "@/views/ecw/order/batchSingleApplication"; import BatchSingleApplication from "@/views/ecw/order/batchSingleApplication";
import FeeApplication from "@/views/ecw/order/feeApplication"; import FeeApplication from "@/views/ecw/order/feeApplication";
import MergeLog from '@/views/ecw/order/components/MergeLog' import MergeLog from "@/views/ecw/order/components/MergeLog";
import PickupLog from './components/PickupLog' import PickupLog from "./components/PickupLog";
import {getWarehouseList} from '@/api/ecw/warehouse' import { getWarehouseList } from "@/api/ecw/warehouse";
import { getCurrencyPage } from "@/api/ecw/currency"; import { getCurrencyPage } from "@/api/ecw/currency";
import SplitRevoke from "@/views/ecw/order/components/SplitRevoke"; import SplitRevoke from "@/views/ecw/order/components/SplitRevoke";
import {getChannelList} from "@/api/ecw/channel"; import { getChannelList } from "@/api/ecw/channel";
import Template from "@/views/cms/template/index.vue"; import Template from "@/views/cms/template/index.vue";
export default { export default {
name: "EcwOrderStockinglist", name: "EcwOrderStockinglist",
...@@ -233,7 +466,15 @@ export default { ...@@ -233,7 +466,15 @@ export default {
MergeLog, MergeLog,
PickupLog, PickupLog,
SplitRevoke, SplitRevoke,
CustomerSelector, ProductSelector, Selector,specialNeeds,PrintTag, PrintWarehouseReceipt, PrintLadingBill, BatchPickup,withdrawal CustomerSelector,
ProductSelector,
Selector,
specialNeeds,
PrintTag,
PrintWarehouseReceipt,
PrintLadingBill,
BatchPickup,
withdrawal,
}, },
data() { data() {
return { return {
...@@ -255,78 +496,84 @@ export default { ...@@ -255,78 +496,84 @@ export default {
// 查询参数 // 查询参数
queryParams: { queryParams: {
page: 1, page: 1,
rows: 10 rows: 10,
}, },
warehouseList:[], warehouseList: [],
productAttrList: [], // 商品属性 productAttrList: [], // 商品属性
molecule: '', //重货比分子 molecule: "", //重货比分子
denominator: '', //重货比分母 denominator: "", //重货比分母
dateFilterType: '', //日期筛选类别 dateFilterType: "", //日期筛选类别
dateFilter: [], //筛选日期 dateFilter: [], //筛选日期
printTagOrderId: null, // 显示打印标签的订单ID printTagOrderId: null, // 显示打印标签的订单ID
isShow:false,//特殊显示 isShow: false, //特殊显示
multipleSelection:[], multipleSelection: [],
params: { params: {
page: 1, page: 1,
rows: 20, rows: 20,
}, },
currencyList:[], currencyList: [],
channelList:[] channelList: [],
}; };
}, },
watch:{ watch: {
isChinese(){ isChinese() {
this.getList() this.getList();
} },
}, },
computed: { computed: {
isChinese(){ isChinese() {
return this.$i18n.locale === 'zh_CN' return this.$i18n.locale === "zh_CN";
}, },
exportWarehouseList(){ exportWarehouseList() {
/* tradeType 1 进口,2出口,3进出口 */ /* tradeType 1 进口,2出口,3进出口 */
return this.warehouseList.filter(item => item.tradeType == 2 || item.tradeType == 3) return this.warehouseList.filter(
(item) => item.tradeType == 2 || item.tradeType == 3
);
}, },
importWarehouseList(){ importWarehouseList() {
return this.warehouseList.filter(item => item.tradeType == 1 || item.tradeType == 3) return this.warehouseList.filter(
(item) => item.tradeType == 1 || item.tradeType == 3
);
}, },
combinedQueryParams(){ combinedQueryParams() {
let timeParams = {} let timeParams = {};
if(this.dateFilterType && this.dateFilter){ if (this.dateFilterType && this.dateFilter) {
timeParams['begin' + this.dateFilterType] = this.dateFilter[0] timeParams["begin" + this.dateFilterType] = this.dateFilter[0];
timeParams['end' + this.dateFilterType] = this.dateFilter[1] timeParams["end" + this.dateFilterType] = this.dateFilter[1];
} }
let queryParams = Object.assign({}, this.queryParams, timeParams) let queryParams = Object.assign({}, this.queryParams, timeParams);
return queryParams return queryParams;
}, },
}, },
activated(){ activated() {
this.getList() this.getList();
}, },
created() { created() {
this.getList(); this.getList();
getProductAttrList().then(res => this.productAttrList = res.data) getProductAttrList().then((res) => (this.productAttrList = res.data));
getWarehouseList().then(res => this.warehouseList = res.data) getWarehouseList().then((res) => (this.warehouseList = res.data));
getCurrencyPage(this.params).then(res => this.currencyList = res.data.list) getCurrencyPage(this.params).then(
getChannelList().then(res => this.channelList = res.data) (res) => (this.currencyList = res.data.list)
);
getChannelList().then((res) => (this.channelList = res.data));
}, },
methods: { methods: {
/** 查询列表 */ /** 查询列表 */
getList() { getList() {
this.loading = true; this.loading = true;
const query = {...this.combinedQueryParams} const query = { ...this.combinedQueryParams };
if(query.packageTypeArr && query.packageTypeArr.length){ if (query.packageTypeArr && query.packageTypeArr.length) {
query.packageType = query.packageTypeArr.join(',') query.packageType = query.packageTypeArr.join(",");
} }
// 执行查询 // 执行查询
canShipmentPage(query).then(response => { canShipmentPage(query).then((response) => {
// 部分情况下,订单后面的操作下拉菜单会显示按钮,但是下来没有选项,在elTable组件更新的时候会导致渲染错误,所以要在更新渲染前清空一次list让table彻底重新渲染,避免部分更新导致异常 // 部分情况下,订单后面的操作下拉菜单会显示按钮,但是下来没有选项,在elTable组件更新的时候会导致渲染错误,所以要在更新渲染前清空一次list让table彻底重新渲染,避免部分更新导致异常
this.list = [] this.list = [];
this.$nextTick(() => { this.$nextTick(() => {
this.list = response.data.list this.list = response.data.list;
}) });
this.total = response.data.total; this.total = response.data.total;
this.loading = false; this.loading = false;
}); });
...@@ -334,79 +581,94 @@ export default { ...@@ -334,79 +581,94 @@ export default {
/** 搜索按钮操作 */ /** 搜索按钮操作 */
handleQuery() { handleQuery() {
this.queryParams.page = 1; this.queryParams.page = 1;
this.$nextTick(this.getList) this.$nextTick(this.getList);
}, },
/** 重置按钮操作 */ /** 重置按钮操作 */
resetQuery() { resetQuery() {
this.queryParams = { this.queryParams = {
page: 1, page: 1,
rows: 10 rows: 10,
} };
this.dateFilter = [] this.dateFilter = [];
this.handleQuery(); this.handleQuery();
}, },
/** 新增按钮操作 */ /** 新增按钮操作 */
handleAdd() { handleAdd() {
this.$router.push('create') this.$router.push("create");
}, },
/** 修改按钮操作 */ /** 修改按钮操作 */
handleUpdate(row) { handleUpdate(row) {
this.$router.push('edit?id=' + row.orderId) this.$router.push("edit?id=" + row.orderId);
}, },
// 表格多选 // 表格多选
handleSelectionChange(selection) { handleSelectionChange(selection) {
this.multipleSelection = selection this.multipleSelection = selection;
this.ids = selection.map(item => item.orderId) this.ids = selection.map((item) => item.orderId);
this.single = selection.length !== 1 this.single = selection.length !== 1;
this.multiple = !selection.length this.multiple = !selection.length;
}, },
// 导出 // 导出
exportXls(params){ exportXls(params) {
this.exporting = true this.exporting = true;
const exportParams = Array.isArray(params) ? {orderIdList: params} : {...params} const exportParams = Array.isArray(params)
exportCanShipment(exportParams).then(res => { ? { orderIdList: params }
: { ...params };
exportCanShipment(exportParams)
.then((res) => {
// this.$download.excel(res, this.$t('备货订单') + '.xls'); // this.$download.excel(res, this.$t('备货订单') + '.xls');
this.$message.success(this.$t('已加入导出队列,请稍后在下载日志中下载')) this.$message.success(
}).finally(() => { this.$t("已加入导出队列,请稍后在下载日志中下载")
this.exporting = false );
}) })
.finally(() => {
this.exporting = false;
});
}, },
// 特需标识处理 // 特需标识处理
specialRendering(val){ specialRendering(val) {
console.log('val', val) console.log("val", val);
if(val !== undefined){ if (val !== undefined) {
let i = val.split(',') let i = val.split(",");
return this.getDictDatas(this.DICT_TYPE.ORDER_SPECIAL_NEEDS).filter(e => { return this.getDictDatas(this.DICT_TYPE.ORDER_SPECIAL_NEEDS)
return i.indexOf(e.value) > -1 .filter((e) => {
}).map(item => { return i.indexOf(e.value) > -1;
// 打字开头的用最后一个字,否则取第一个字
item.symbol = item.label[0] == '' ? item.label[item.label.length-1]: item.label[0]
return item
}) })
.map((item) => {
// 打字开头的用最后一个字,否则取第一个字
item.symbol =
item.label[0] == ""
? item.label[item.label.length - 1]
: item.label[0];
return item;
});
} }
}, },
// 删除特需 // 删除特需
deleteSpecial(id,orderId){ deleteSpecial(id, orderId) {
this.$confirm(this.$t('确定删除此特需么?')).then(() => { this.$confirm(this.$t("确定删除此特需么?"))
return orderSpecialNeed({orderId:orderId,advanceType:id}) .then(() => {
}).then(() => { return orderSpecialNeed({ orderId: orderId, advanceType: id });
this.getList()
}) })
.then(() => {
this.getList();
});
}, },
// 设置空运订单不可出 // 设置空运订单不可出
async setCanNotShipment(order){ async setCanNotShipment(order) {
await this.$confirm(this.$t("确定设置订单{orderNo}不可出么?", {orderNo: order.orderNo})) await this.$confirm(
setCanNotShipment(order.orderId).then(res => { this.$t("确定设置订单{orderNo}不可出么?", { orderNo: order.orderNo })
this.$message(this.$t('操作成功')) );
this.getList() setCanNotShipment(order.orderId).then((res) => {
}) this.$message(this.$t("操作成功"));
} this.getList();
} });
},
},
}; };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
::v-deep .actions{ ::v-deep .actions {
.el-dropdown{ .el-dropdown {
margin-right: 10px; margin-right: 10px;
&:last-child { &:last-child {
margin-right: 0; margin-right: 0;
......
...@@ -293,6 +293,7 @@ ...@@ -293,6 +293,7 @@
}}</el-button> }}</el-button>
</div> </div>
</el-dialog> </el-dialog>
<!--转异对话框 lanbm 2024-06-19 添加注释-->
<el-dialog <el-dialog
:title="order.orderNo + $t('订单转异')" :title="order.orderNo + $t('订单转异')"
center center
......
<template> <template>
<div class="app-container"> <div class="app-container">
<!-- 搜索工作栏 --> <!-- 搜索工作栏 -->
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px"> <el-form
:model="queryParams"
ref="queryForm"
size="small"
:inline="true"
v-show="showSearch"
label-width="68px"
>
<el-form-item :label="$t('商品编码')" prop="productCode"> <el-form-item :label="$t('商品编码')" prop="productCode">
<el-input v-model.trim="queryParams.productCode" :placeholder="$t('请输入商品编码')" clearable @keyup.enter.native="handleQuery" onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')" /> <el-input
v-model.trim="queryParams.productCode"
:placeholder="$t('请输入商品编码')"
clearable
@keyup.enter.native="handleQuery"
onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="$t('海关编码')" prop="customsCode"> <el-form-item :label="$t('海关编码')" prop="customsCode">
<el-input v-model.trim="queryParams.customsCode" :placeholder="$t('请输入海关编码')" clearable @keyup.enter.native="handleQuery" onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')"/> <el-input
v-model.trim="queryParams.customsCode"
:placeholder="$t('请输入海关编码')"
clearable
@keyup.enter.native="handleQuery"
onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="$t('商品名称')" prop="titleZh"> <el-form-item :label="$t('商品名称')" prop="titleZh">
<el-input v-model="queryParams.titleZh" :placeholder="$t('请输入商品名称')" clearable @keyup.enter.native="handleQuery" /> <el-input
v-model="queryParams.titleZh"
:placeholder="$t('请输入商品名称')"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item> </el-form-item>
<el-form-item :label="$t('商品类型')" prop="attrId"> <el-form-item :label="$t('商品类型')" prop="attrId">
<el-select v-model="queryParams.typeId" multiple :placeholder="$t('选择商品类型')" clearable @change="handleQuery"> <el-select
<el-option v-for="types in typeList" :key="types.id" :label="$l(types, 'title')" :value="types.id" /> v-model="queryParams.typeId"
multiple
:placeholder="$t('选择商品类型')"
clearable
@change="handleQuery"
>
<el-option
v-for="types in typeList"
:key="types.id"
:label="$l(types, 'title')"
:value="types.id"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item :label="$t('商品特性')" prop="attrId"> <el-form-item :label="$t('商品特性')" prop="attrId">
<el-select v-model="queryParams.attrId" multiple :placeholder="$t('选择商品特性')" clearable @change="handleQuery"> <el-select
<el-option v-for="attr in attrList" :key="attr.id" :label="attr.attrName" :value="attr.id" /> v-model="queryParams.attrId"
multiple
:placeholder="$t('选择商品特性')"
clearable
@change="handleQuery"
>
<el-option
v-for="attr in attrList"
:key="attr.id"
:label="attr.attrName"
:value="attr.id"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
...@@ -39,29 +85,65 @@ ...@@ -39,29 +85,65 @@
</el-form-item> --> </el-form-item> -->
<el-form-item> <el-form-item>
<el-button type="primary" icon="el-icon-search" @click="handleQuery">{{$t('搜索')}}</el-button> <el-button type="primary" icon="el-icon-search" @click="handleQuery">{{
<el-button icon="el-icon-refresh" @click="resetQuery">{{$t('重置')}}</el-button> $t("搜索")
}}</el-button>
<el-button icon="el-icon-refresh" @click="resetQuery">{{
$t("重置")
}}</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
<!-- 操作工具栏 --> <!-- 操作工具栏 -->
<el-row :gutter="10" class="mb8"> <el-row :gutter="10" class="mb8">
<el-col :span="1.5"> <el-col :span="1.5">
<el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd" v-hasPermi="['ecw:product:create']">{{$t('新增')}}</el-button> <el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['ecw:product:create']"
>{{ $t("新增") }}</el-button
>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
<el-button type="primary" plain icon="el-icon-setting" size="mini" @click="handleEdit" v-hasPermi="['ecw:product:attr']">{{$t('批量设置商品属性')}}</el-button> <el-button
type="primary"
plain
icon="el-icon-setting"
size="mini"
@click="handleEdit"
v-hasPermi="['ecw:product:attr']"
>{{ $t("批量设置商品属性") }}</el-button
>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
<el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport" v-hasPermi="['ecw:product-price:export']" :loading="exportLoading" >{{$t('导出')}}</el-button> <el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['ecw:product-price:export']"
:loading="exportLoading"
>{{ $t("导出") }}</el-button
>
</el-col> </el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar> <right-toolbar
:showSearch.sync="showSearch"
@queryTable="getList"
></right-toolbar>
</el-row> </el-row>
<!-- 列表 --> <!-- 列表 -->
<el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange"> <el-table
v-loading="loading"
:data="list"
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" width="55" align="center"> <el-table-column type="selection" width="55" align="center">
</el-table-column> </el-table-column>
<el-table-column :label="$t('商品编号')" align="center" prop="id" /> <el-table-column :label="$t('商品编号')" align="center" prop="id" />
...@@ -70,7 +152,11 @@ ...@@ -70,7 +152,11 @@
<span>{{ getTypeName(scope.row.typeId) }}</span> <span>{{ getTypeName(scope.row.typeId) }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column :label="$t('海关编码')" align="center" prop="customsCode" /> <el-table-column
:label="$t('海关编码')"
align="center"
prop="customsCode"
/>
<el-table-column :label="$t('中文标题')" align="center" prop="titleZh" /> <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="titleEn" />
<el-table-column :label="$t('商品属性')" align="center" prop="attrId"> <el-table-column :label="$t('商品属性')" align="center" prop="attrId">
...@@ -81,31 +167,56 @@ ...@@ -81,31 +167,56 @@
<!--商品特性--> <!--商品特性-->
<el-table-column :label="$t('商品图片')" align="center" prop="attrId"> <el-table-column :label="$t('商品图片')" align="center" prop="attrId">
<template slot-scope="scope"> <template slot-scope="scope">
<el-image :src="firstImg(scope.row.imgs)" style="width:50px; height:50px">{{ $t('') }}</el-image> <el-image
:src="firstImg(scope.row.imgs)"
style="width: 50px; height: 50px"
>{{ $t("") }}</el-image
>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="auditStatus" align="center" :label="$t('是否审核')" width="120"> <el-table-column
prop="auditStatus"
align="center"
:label="$t('是否审核')"
width="120"
>
<template slot-scope="scope"> <template slot-scope="scope">
<el-select v-model="scope.row.auditStatus" @change="handleStatusChange(scope.row, 'auditStatus')"> <el-select
<el-option v-for="auditStatusItem in auditStatusDictDatas" :key="auditStatusItem.id" :label="$l(auditStatusItem, 'label')" :value="parseInt(auditStatusItem.value)" /> v-model="scope.row.auditStatus"
@change="handleStatusChange(scope.row, 'auditStatus')"
>
<el-option
v-for="auditStatusItem in auditStatusDictDatas"
:key="auditStatusItem.id"
:label="$l(auditStatusItem, 'label')"
:value="parseInt(auditStatusItem.value)"
/>
</el-select> </el-select>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column :label="$t('添加人')" align="center" prop="creatorName" /> <el-table-column
:label="$t('添加人')"
align="center"
prop="creatorName"
/>
<el-table-column :label="$t('添加时间')" align="center"> <el-table-column :label="$t('添加时间')" align="center">
<template slot-scope="scope"> <template slot-scope="scope">
<span>{{parseTime(scope.row.createTime)}}</span> <span>{{ parseTime(scope.row.createTime) }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column :label="$t('修改人')" align="center" prop="updaterName" /> <el-table-column
:label="$t('修改人')"
align="center"
prop="updaterName"
/>
<el-table-column :label="$t('修改时间')" align="center"> <el-table-column :label="$t('修改时间')" align="center">
<template slot-scope="scope"> <template slot-scope="scope">
<span>{{parseTime(scope.row.updateTime)}}</span> <span>{{ parseTime(scope.row.updateTime) }}</span>
</template> </template>
</el-table-column> </el-table-column>
...@@ -115,16 +226,46 @@ ...@@ -115,16 +226,46 @@
</template> </template>
</el-table-column> --> </el-table-column> -->
<el-table-column :label="$t('操作')" align="center" class-name="small-padding fixed-width"> <el-table-column
:label="$t('操作')"
align="center"
class-name="small-padding fixed-width"
>
<template slot-scope="scope"> <template slot-scope="scope">
<el-button
<el-button size="mini" type="text" @click="toPriceManager(scope.row)" v-hasPermi="['ecw:product-price:query']">{{$t('路线价格')}}</el-button> size="mini"
type="text"
<el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)" v-hasPermi="['ecw:product:update']">{{$t('修改')}}</el-button> @click="toPriceManager(scope.row)"
<el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)" v-hasPermi="['ecw:product:delete']">{{$t('删除')}}</el-button> v-hasPermi="['ecw:product-price:query']"
>{{ $t("路线价格") }}</el-button
<el-button v-if="scope.row.auditStatus===2" size="mini" type="text" icon="el-icon-edit" @click="copyPrice(scope.row)" v-hasPermi="['ecw:product:copyPrice']">{{$t('复制价格')}}</el-button> >
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['ecw:product:update']"
>{{ $t("修改") }}</el-button
>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['ecw:product:delete']"
>{{ $t("删除") }}</el-button
>
<!--要有价格复制权限 lanbm 2024-06-19 添加注释-->
<el-button
v-if="scope.row.auditStatus === 2"
size="mini"
type="text"
icon="el-icon-edit"
@click="copyPrice(scope.row)"
v-hasPermi="['ecw:product:copyPrice']"
>{{ $t("复制价格") }}</el-button
>
<!-- <div v-else> <!-- <div v-else>
<el-button size="mini" type="text" @click="toPriceManager(scope.row)" v-hasPermi="['ecw:product-price:query']">{{$t('路线价格')}}</el-button> <el-button size="mini" type="text" @click="toPriceManager(scope.row)" v-hasPermi="['ecw:product-price:query']">{{$t('路线价格')}}</el-button>
...@@ -133,7 +274,6 @@ ...@@ -133,7 +274,6 @@
<el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)" v-hasPermi="['ecw:product:delete']">{{$t('删除')}}</el-button> <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)" v-hasPermi="['ecw:product:delete']">{{$t('删除')}}</el-button>
</div> --> </div> -->
<!-- <el-button v-else size="mini" type="text" icon="el-icon-edit" @click="copyPrice(scope.row)" v-hasPermi="['ecw:product:copyPrice']">{{$t('复制价格')}}</el-button> --> <!-- <el-button v-else size="mini" type="text" icon="el-icon-edit" @click="copyPrice(scope.row)" v-hasPermi="['ecw:product:copyPrice']">{{$t('复制价格')}}</el-button> -->
</template> </template>
<!-- <template v-else> <!-- <template v-else>
<el-button size="mini" type="text" @click="toPriceManager(scope.row)" v-hasPermi="['ecw:product-price:query']">{{$t('路线价格')}}</el-button> <el-button size="mini" type="text" @click="toPriceManager(scope.row)" v-hasPermi="['ecw:product-price:query']">{{$t('路线价格')}}</el-button>
...@@ -146,23 +286,56 @@ ...@@ -146,23 +286,56 @@
</el-table-column> </el-table-column>
</el-table> </el-table>
<!-- 分页组件 --> <!-- 分页组件 -->
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize" @pagination="getList" /> <pagination
v-show="total > 0"
:total="total"
:page.sync="queryParams.pageNo"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 对话框(添加 / 修改) --> <!-- 对话框(添加 / 修改) -->
<el-dialog :modal="false" :modal-append-to-body="true" :title="title" :visible.sync="open" width="850px" > <el-dialog
<el-form v-if="open" ref="form" :model="form" :rules="rules" label-width="110px"> :modal="false"
:modal-append-to-body="true"
:title="title"
:visible.sync="open"
width="850px"
>
<el-form
v-if="open"
ref="form"
:model="form"
:rules="rules"
label-width="110px"
>
<el-form-item :label="$t('商品类型')" prop="typeId"> <el-form-item :label="$t('商品类型')" prop="typeId">
<el-select v-model="form.typeId" :placeholder="$t('选择商品类型')" clearable> <el-select
<el-option v-for="types in typeList" :key="types.id" :label="types.titleZh" :value="types.id" /> v-model="form.typeId"
:placeholder="$t('选择商品类型')"
clearable
>
<el-option
v-for="types in typeList"
:key="types.id"
:label="types.titleZh"
:value="types.id"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item :label="$t('中文标题')" prop="titleZh"> <el-form-item :label="$t('中文标题')" prop="titleZh">
<el-input v-model="form.titleZh" :placeholder="$t('请输入中文标题')" /> <el-input
v-model="form.titleZh"
:placeholder="$t('请输入中文标题')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="$t('英文标题')" prop="titleEn"> <el-form-item :label="$t('英文标题')" prop="titleEn">
<el-input v-model="form.titleEn" :placeholder="$t('请输入英文标题')" /> <el-input
v-model="form.titleEn"
:placeholder="$t('请输入英文标题')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="$t('商品图片')" prop="img"> <el-form-item :label="$t('商品图片')" prop="img">
...@@ -172,43 +345,97 @@ ...@@ -172,43 +345,97 @@
<el-form-item prop="auditStatus" :label="$t('是否审核')"> <el-form-item prop="auditStatus" :label="$t('是否审核')">
<template slot-scope="scope"> <template slot-scope="scope">
<el-select v-model="form.auditStatus"> <el-select v-model="form.auditStatus">
<el-option v-for="auditStatusItem in auditStatusDictDatas" :key="auditStatusItem.id" :label="$l(auditStatusItem, 'label')" :value="parseInt(auditStatusItem.value)" /> <el-option
v-for="auditStatusItem in auditStatusDictDatas"
:key="auditStatusItem.id"
:label="$l(auditStatusItem, 'label')"
:value="parseInt(auditStatusItem.value)"
/>
</el-select> </el-select>
</template> </template>
</el-form-item> </el-form-item>
<el-form-item :label="$t('商品编码')" prop="productCode"> <el-form-item :label="$t('商品编码')" prop="productCode">
<el-input v-model="form.productCode" :placeholder="$t('请输入商品编码')" /> <el-input
v-model="form.productCode"
:placeholder="$t('请输入商品编码')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="$t('海关编码')" prop="customsCode"> <el-form-item :label="$t('海关编码')" prop="customsCode">
<el-input v-model="form.customsCode" :placeholder="$t('请输入海关编码')" /> <el-input
v-model="form.customsCode"
:placeholder="$t('请输入海关编码')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="$t('商品特性')" prop="attrArray"> <el-form-item :label="$t('商品特性')" prop="attrArray">
<el-select v-model="form.attrArray" :placeholder="$t('选择商品特性')" clearable multiple> <el-select
<el-option v-for="attr in attrList" :key="attr.id" :label="attr.attrName" :value="attr.id" /> v-model="form.attrArray"
:placeholder="$t('选择商品特性')"
clearable
multiple
>
<el-option
v-for="attr in attrList"
:key="attr.id"
:label="attr.attrName"
:value="attr.id"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item :label="$t('商品材质')" prop="materialType"> <el-form-item :label="$t('商品材质')" prop="materialType">
<el-select v-model="form.materialType" :placeholder="$t('选择商品材质')" clearable> <el-select
<el-option v-for="materialItem in materialList" :key="materialItem.value" :label="materialItem.label" :value="materialItem.value" /> v-model="form.materialType"
:placeholder="$t('选择商品材质')"
clearable
>
<el-option
v-for="materialItem in materialList"
:key="materialItem.value"
:label="materialItem.label"
:value="materialItem.value"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item :label="$t('出运要求')" prop="requirements"> <el-form-item :label="$t('出运要求')" prop="requirements">
<el-checkbox v-model="form.requirements" :checked="form.requirements===1? true:false" :true-label="1" :false-label="0">{{$t('证书要求')}}({{$t('支持多证书')}})</el-checkbox> <el-checkbox
v-model="form.requirements"
:checked="form.requirements === 1 ? true : false"
:true-label="1"
:false-label="0"
>{{ $t("证书要求") }}({{ $t("支持多证书") }})</el-checkbox
>
</el-form-item> </el-form-item>
<el-form-item :label="$t('包装要求')" prop="packaging"> <el-form-item :label="$t('包装要求')" prop="packaging">
<el-select v-model="form.packaging" :placeholder="$t('选择包装要求')" clearable> <el-select
<el-option v-for="packageItem in packagingList" :key="packageItem.value" :label="packageItem.label" :value="packageItem.value" /> v-model="form.packaging"
:placeholder="$t('选择包装要求')"
clearable
>
<el-option
v-for="packageItem in packagingList"
:key="packageItem.value"
:label="packageItem.label"
:value="packageItem.value"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item :label="$t('默认货柜位置')" prop="containerLocation"> <el-form-item :label="$t('默认货柜位置')" prop="containerLocation">
<el-select v-model="form.containerLocation" :placeholder="$t('选择货柜位置')" clearable> <el-select
<el-option v-for="locationItem in locationList" :key="locationItem.value" :label="locationItem.label" :value="locationItem.value" /> v-model="form.containerLocation"
:placeholder="$t('选择货柜位置')"
clearable
>
<el-option
v-for="locationItem in locationList"
:key="locationItem.value"
:label="locationItem.label"
:value="locationItem.value"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
...@@ -218,54 +445,92 @@ ...@@ -218,54 +445,92 @@
</el-input> </el-input>
</el-form-item> </el-form-item>
<el-form-item :label="$t('是否预约入仓')" prop="needBook"> <el-form-item :label="$t('是否预约入仓')" prop="needBook">
<el-radio v-model.number="form.needBook" :label="1">{{$t('是')}}</el-radio> <el-radio v-model.number="form.needBook" :label="1">{{
<el-radio v-model.number="form.needBook" :label="0">{{$t('否')}}</el-radio> $t("是")
}}</el-radio>
<el-radio v-model.number="form.needBook" :label="0">{{
$t("否")
}}</el-radio>
</el-form-item> </el-form-item>
<!-- <el-form-item :label="$t('可参与优惠活动')" prop="you"> <!-- <el-form-item :label="$t('可参与优惠活动')" prop="you">
<el-select v-model="form.you" :placeholder="$t('可参与优惠活动')" clearable> <el-select v-model="form.you" :placeholder="$t('可参与优惠活动')" clearable>
<el-option v-for="packageItem in packagingList" :key="packageItem.value" :label="packageItem.label" :value="packageItem.value" /> <el-option v-for="packageItem in packagingList" :key="packageItem.value" :label="packageItem.label" :value="packageItem.value" />
</el-select> </el-select>
</el-form-item> --> </el-form-item> -->
<el-form-item :label="$t('每日入仓上限')" prop="dayLimit" v-if="form.needBook==1"> <el-form-item
:label="$t('每日入仓上限')"
prop="dayLimit"
v-if="form.needBook == 1"
>
<el-input v-model.number="form.dayLimit" type="number"> <el-input v-model.number="form.dayLimit" type="number">
<template slot="append">{{$t('立方米')}}</template> <template slot="append">{{ $t("立方米") }}</template>
</el-input> </el-input>
</el-form-item> </el-form-item>
<el-form-item :label="$t('可参与优惠')"> <el-form-item :label="$t('可参与优惠')">
<div style="width: 300px;height: 400px;border: 1px solid;overflow-y: auto"> <div
<div @click="selectMoveAbout(item)" style="display: flex;justify-content: space-between; align-items: center;" :style="{'cursor':item.mandatory ? 'no-drop' : 'pointer' }" v-for="item in preferentialList" :key="item.couponId" > style="
width: 300px;
height: 400px;
border: 1px solid;
overflow-y: auto;
"
>
<div
@click="selectMoveAbout(item)"
style="
display: flex;
justify-content: space-between;
align-items: center;
"
:style="{ cursor: item.mandatory ? 'no-drop' : 'pointer' }"
v-for="item in preferentialList"
:key="item.couponId"
>
<div> <div>
{{$l(item, 'title')}} {{ $l(item, "title") }}
</div> </div>
<i v-if="form.couponIds.includes(item.couponId)" style="margin-right: 20px;" class="el-icon-check"></i> <i
v-if="form.couponIds.includes(item.couponId)"
style="margin-right: 20px"
class="el-icon-check"
></i>
</div> </div>
</div> </div>
</el-form-item> </el-form-item>
<!-- <el-form-item label-width="150px" label="空运订单重量上限kg">--> <!-- <el-form-item label-width="150px" label="空运订单重量上限kg">-->
<!-- <el-input-number v-model="form.airWeightLimit" controls-position="right" ></el-input-number>--> <!-- <el-input-number v-model="form.airWeightLimit" controls-position="right" ></el-input-number>-->
<!-- </el-form-item>--> <!-- </el-form-item>-->
<!-- <packaging-type key-arr="priceStepClearanceList" v-model="form">--> <!-- <packaging-type key-arr="priceStepClearanceList" v-model="form">-->
<!-- <el-button @click="visible = true; open = false;" type="text">选择空运模板</el-button>--> <!-- <el-button @click="visible = true; open = false;" type="text">选择空运模板</el-button>-->
<!-- </packaging-type>--> <!-- </packaging-type>-->
<!-- <p v-if="lineNum">--> <!-- <p v-if="lineNum">-->
<!-- <span>--> <!-- <span>-->
<!-- 复制模板线路价格:{{lineNum}}个--> <!-- 复制模板线路价格:{{lineNum}}个-->
<!-- </span>--> <!-- </span>-->
<!-- <span @click="toPriceManager(formCopy, true)" style="color: #0a84ff;cursor: pointer;">--> <!-- <span @click="toPriceManager(formCopy, true)" style="color: #0a84ff;cursor: pointer;">-->
<!-- 查看《#{{$l(formCopy,'title')}}#》路线价格--> <!-- 查看《#{{$l(formCopy,'title')}}#》路线价格-->
<!-- </span>--> <!-- </span>-->
<!-- <el-button style="font-size: 12px;margin-left: 15px;color: red;" type="text" @click="form.priceStepClearanceList = [];lineNum = 0" >清除路线</el-button>--> <!-- <el-button style="font-size: 12px;margin-left: 15px;color: red;" type="text" @click="form.priceStepClearanceList = [];lineNum = 0" >清除路线</el-button>-->
<!-- </p>--> <!-- </p>-->
</el-form> </el-form>
<div slot="footer" class="dialog-footer"> <div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm">{{$t('确定')}}</el-button> <el-button type="primary" @click="submitForm">{{
<el-button @click="cancel">{{$t('取消')}}</el-button> $t("确定")
}}</el-button>
<el-button @click="cancel">{{ $t("取消") }}</el-button>
</div> </div>
</el-dialog> </el-dialog>
<el-dialog width="60%" :visible.sync="visible" @close="()=>{open = true}" > <el-dialog
width="60%"
:visible.sync="visible"
@close="
() => {
open = true;
}
"
>
<product-dialog @copyLine="copyLine"></product-dialog> <product-dialog @copyLine="copyLine"></product-dialog>
</el-dialog> </el-dialog>
</div> </div>
...@@ -279,14 +544,14 @@ import { ...@@ -279,14 +544,14 @@ import {
getProduct, getProduct,
getProductPage, getProductPage,
product_coupon_newProd, product_coupon_newProd,
updateProduct updateProduct,
} from "@/api/ecw/product"; } from "@/api/ecw/product";
import {getProductAttrList} from "@/api/ecw/productAttr"; import { getProductAttrList } from "@/api/ecw/productAttr";
import {getProductTypeList} from "@/api/ecw/productType"; import { getProductTypeList } from "@/api/ecw/productType";
import {DICT_TYPE, getDictDatas} from '@/utils/dict'; import { DICT_TYPE, getDictDatas } from "@/utils/dict";
import {AuditStatusEnum, CommonStatusEnum} from '@/utils/constants'; import { AuditStatusEnum, CommonStatusEnum } from "@/utils/constants";
import {uploadFile} from "@/api/infra/file"; import { uploadFile } from "@/api/infra/file";
import ImageUpload from '@/components/ImageUpload' import ImageUpload from "@/components/ImageUpload";
import PackagingType from "@/views/ecw/channel/componrnts/packaging-type.vue"; import PackagingType from "@/views/ecw/channel/componrnts/packaging-type.vue";
import ProductDialog from "@/views/ecw/product/product-dialog.vue"; import ProductDialog from "@/views/ecw/product/product-dialog.vue";
...@@ -295,11 +560,11 @@ export default { ...@@ -295,11 +560,11 @@ export default {
components: { components: {
ProductDialog, ProductDialog,
PackagingType, PackagingType,
ImageUpload ImageUpload,
}, },
data() { data() {
return { return {
visible:false, visible: false,
// 选中数组 // 选中数组
ids: [], ids: [],
// 非单个禁用 // 非单个禁用
...@@ -344,16 +609,38 @@ export default { ...@@ -344,16 +609,38 @@ export default {
status: null, status: null,
}, },
// 表单参数 // 表单参数
form: { form: {},
formCopy: {},
},
formCopy:{},
// 表单校验 // 表单校验
rules: { rules: {
typeId: [{ required: true, message: this.$t("商品类型不能为空"), trigger: "change" }], typeId: [
attrArray: [{ required: true, message: this.$t("商品特性不能为空"), trigger: "change" }], {
titleZh: [{ required: true, message: this.$t("中文标题不能为空"), trigger: "blur" }], required: true,
titleEn: [{ required: true, message: this.$t("英文标题不能为空"), trigger: "blur" }], message: this.$t("商品类型不能为空"),
trigger: "change",
},
],
attrArray: [
{
required: true,
message: this.$t("商品特性不能为空"),
trigger: "change",
},
],
titleZh: [
{
required: true,
message: this.$t("中文标题不能为空"),
trigger: "blur",
},
],
titleEn: [
{
required: true,
message: this.$t("英文标题不能为空"),
trigger: "blur",
},
],
// materialType: [{ required: true, message: this.$t("商品材质不能为空"), trigger: "blur" }], // materialType: [{ required: true, message: this.$t("商品材质不能为空"), trigger: "blur" }],
// packaging: [{ required: true, message: this.$t("包装要求不能为空"), trigger: "blur" }], // packaging: [{ required: true, message: this.$t("包装要求不能为空"), trigger: "blur" }],
// containerLocation: [{ required: true, message: this.$t("默认货柜位置不能为空"), trigger: "blur" }], // containerLocation: [{ required: true, message: this.$t("默认货柜位置不能为空"), trigger: "blur" }],
...@@ -368,65 +655,65 @@ export default { ...@@ -368,65 +655,65 @@ export default {
materialList: getDictDatas(DICT_TYPE.ECW_PRODUCT_MATERIAL), materialList: getDictDatas(DICT_TYPE.ECW_PRODUCT_MATERIAL),
packagingList: getDictDatas(DICT_TYPE.ECW_PACKAGING_TYPE), packagingList: getDictDatas(DICT_TYPE.ECW_PACKAGING_TYPE),
locationList: getDictDatas(DICT_TYPE.ECW_CONTAINER_LOCATION), locationList: getDictDatas(DICT_TYPE.ECW_CONTAINER_LOCATION),
preferentialList:[], preferentialList: [],
exceptionProductId:0,//新增商品异常传的id exceptionProductId: 0, //新增商品异常传的id
lineNum:0 lineNum: 0,
}; };
}, },
computed: { computed: {
getTypeName() { getTypeName() {
return typeId => { return (typeId) => {
for (let index in this.typeList) { for (let index in this.typeList) {
let typeItem = this.typeList[index]; let typeItem = this.typeList[index];
if (typeItem.id == typeId) { if (typeItem.id == typeId) {
return this.$l(typeItem, 'title'); return this.$l(typeItem, "title");
}
} }
} }
};
}, },
getAttrName() { getAttrName() {
return attrIds => { return (attrIds) => {
let productAttrArray = []; let productAttrArray = [];
let attrArray = attrIds.split(','); let attrArray = attrIds.split(",");
for (let attrIndex in attrArray) { for (let attrIndex in attrArray) {
let attrId = attrArray[attrIndex]; let attrId = attrArray[attrIndex];
for (let index in this.attrList) { for (let index in this.attrList) {
let attrItem = this.attrList[index]; let attrItem = this.attrList[index];
if (attrItem.id == attrId) { if (attrItem.id == attrId) {
productAttrArray.push(this.$l(attrItem, 'attrName')); productAttrArray.push(this.$l(attrItem, "attrName"));
}
} }
} }
return productAttrArray.join(',');
} }
return productAttrArray.join(",");
};
},
firstImg() {
return (imgString) => {
if (!imgString || imgString == "") return imgString;
let imgs = imgString.split(",");
return imgs.length ? imgs[0] : null;
};
}, },
firstImg(){
return imgString => {
if(!imgString || imgString == '') return imgString
let imgs = imgString.split(',')
return imgs.length ? imgs[0] : null
}
}
}, },
activated(){ activated() {
if(this.$route.query.typeId != this.queryParams.typeId){ if (this.$route.query.typeId != this.queryParams.typeId) {
this.queryParams.typeId = +this.$route.query.typeId || null this.queryParams.typeId = +this.$route.query.typeId || null;
} }
//新增商品异常跳转商品修改 //新增商品异常跳转商品修改
if(this.$route.query.prodId){ if (this.$route.query.prodId) {
this.exceptionProductId = this.$route.query.prodId this.exceptionProductId = this.$route.query.prodId;
this.handleUpdate({id:this.$route.query.prodId}) this.handleUpdate({ id: this.$route.query.prodId });
} }
this.getList() this.getList();
}, },
created() { created() {
//新增商品异常跳转商品修改 //新增商品异常跳转商品修改
if(this.$route.query.prodId){ if (this.$route.query.prodId) {
this.exceptionProductId = this.$route.query.prodId this.exceptionProductId = this.$route.query.prodId;
this.handleUpdate({id:this.$route.query.prodId}) this.handleUpdate({ id: this.$route.query.prodId });
} }
let typeId = this.$route.query.typeId; let typeId = this.$route.query.typeId;
if (typeId) { if (typeId) {
...@@ -435,7 +722,6 @@ export default { ...@@ -435,7 +722,6 @@ export default {
this.getAttrList(); this.getAttrList();
this.getTypeList(); this.getTypeList();
this.getList(); this.getList();
}, },
methods: { methods: {
// copyLine(val , bol){ // copyLine(val , bol){
...@@ -493,56 +779,66 @@ export default { ...@@ -493,56 +779,66 @@ export default {
// }, // },
/** 获取产品属性列表 */ /** 获取产品属性列表 */
getAttrList() { getAttrList() {
getProductAttrList().then(response => { getProductAttrList().then((response) => {
this.attrList = response.data; this.attrList = response.data;
}) });
}, },
/** 获取产品类型列表 */ /** 获取产品类型列表 */
getTypeList() { getTypeList() {
getProductTypeList().then(response => { getProductTypeList().then((response) => {
this.typeList = response.data; this.typeList = response.data;
}) });
}, },
/**跳转价格管理 */ /**跳转价格管理 */
toPriceManager(row, flag = false) { toPriceManager(row, flag = false) {
/* localStorage.setItem('product', JSON.stringify(row)); /* localStorage.setItem('product', JSON.stringify(row));
localStorage.setItem('typeList', JSON.stringify(this.typeList)); */ localStorage.setItem('typeList', JSON.stringify(this.typeList)); */
let p let p;
if (flag){ if (flag) {
p = { p = {
product_id: row.id, product_id: row.id,
product_type: row.typeId, product_type: row.typeId,
transportType:3, transportType: 3,
} };
}else { } else {
p = { p = {
product_id: row.id, product_id: row.id,
product_type: row.typeId, product_type: row.typeId,
} };
} }
this.$router.push({ this.$router.push({
name: 'ProductPrice', name: "ProductPrice",
query: p query: p,
}) });
}, },
handleStatusChange(row, statusType) { handleStatusChange(row, statusType) {
updateProduct(row).then(() => { updateProduct(row)
.then(() => {
this.$modal.msgSuccess(this.$t("修改成功")); this.$modal.msgSuccess(this.$t("修改成功"));
}).catch(function () { })
if (statusType == 'status') { .catch(function () {
row.status = row.status === CommonStatusEnum.ENABLE ? CommonStatusEnum.DISABLE : CommonStatusEnum.ENABLE; if (statusType == "status") {
row.status =
row.status === CommonStatusEnum.ENABLE
? CommonStatusEnum.DISABLE
: CommonStatusEnum.ENABLE;
} else { } else {
row.auditStatus = row.auditStatus === AuditStatusEnum.PASS ? AuditStatusEnum.NOT_PASS : AuditStatusEnum.PASS; row.auditStatus =
row.auditStatus === AuditStatusEnum.PASS
? AuditStatusEnum.NOT_PASS
: AuditStatusEnum.PASS;
} }
}); });
}, },
//复制价格 //复制价格
copyPrice(row){ copyPrice(row) {
this.$router.push({path:'/product/copyPrice',query:{titleZh:row.titleZh,id:row.id}}) this.$router.push({
path: "/product/copyPrice",
query: { titleZh: row.titleZh, id: row.id },
});
}, },
/** 查询列表 */ /** 查询列表 */
...@@ -550,11 +846,11 @@ export default { ...@@ -550,11 +846,11 @@ export default {
this.loading = true; this.loading = true;
// 处理查询参数 // 处理查询参数
let params = { ...this.queryParams }; let params = { ...this.queryParams };
params.filter=false; params.filter = false;
this.addBeginAndEndTime(params, this.dateRangeCreateTime, 'createTime'); this.addBeginAndEndTime(params, this.dateRangeCreateTime, "createTime");
// 执行查询 // 执行查询
params.status = 0; params.status = 0;
getProductPage(params).then(response => { getProductPage(params).then((response) => {
this.list = response.data.list; this.list = response.data.list;
this.total = response.data.total; this.total = response.data.total;
this.loading = false; this.loading = false;
...@@ -578,14 +874,13 @@ export default { ...@@ -578,14 +874,13 @@ export default {
status: undefined, status: undefined,
requirements: 0, requirements: 0,
needBook: 0, needBook: 0,
couponIds:[], couponIds: [],
airWeightLimit:undefined, airWeightLimit: undefined,
priceStepClearanceList:[], priceStepClearanceList: [],
isCopyProductPriceTemplate:false, isCopyProductPriceTemplate: false,
productTemplateId:undefined, productTemplateId: undefined,
}; };
this.lineNum = 0 this.lineNum = 0;
this.resetForm("form"); this.resetForm("form");
}, },
/** 搜索按钮操作 */ /** 搜索按钮操作 */
...@@ -604,10 +899,12 @@ export default { ...@@ -604,10 +899,12 @@ export default {
this.reset(); this.reset();
this.open = true; this.open = true;
this.title = this.$t("添加商品"); this.title = this.$t("添加商品");
product_coupon_newProd().then(r => { product_coupon_newProd().then((r) => {
this.preferentialList = r.data this.preferentialList = r.data;
this.form.couponIds = this.preferentialList.filter(i => i.isDefault).map(i => i.couponId) this.form.couponIds = this.preferentialList
}) .filter((i) => i.isDefault)
.map((i) => i.couponId);
});
if (this.queryParams.typeId) { if (this.queryParams.typeId) {
this.form.typeId = this.queryParams.typeId; this.form.typeId = this.queryParams.typeId;
} }
...@@ -617,33 +914,41 @@ export default { ...@@ -617,33 +914,41 @@ export default {
// this.reset(); // this.reset();
console.log(row); console.log(row);
const id = row.id; const id = row.id;
getProduct(id).then(response => { getProduct(id).then((response) => {
this.form = {...response.data,couponIds:[]}; this.form = { ...response.data, couponIds: [] };
this.form.channelPriceStepClearanceList = this.form.priceStepClearanceList; this.form.channelPriceStepClearanceList =
let attrArray = this.form.attrId?this.form.attrId.split(','):[]; this.form.priceStepClearanceList;
let attrArray = this.form.attrId ? this.form.attrId.split(",") : [];
for (let index in attrArray) { for (let index in attrArray) {
let value = attrArray[index]; let value = attrArray[index];
attrArray[index] = parseInt(value); attrArray[index] = parseInt(value);
} }
this.$nextTick(() =>{ this.$nextTick(() => {
this.$set(this.form, 'attrArray', attrArray) this.$set(this.form, "attrArray", attrArray);
}) });
this.open = true; this.open = true;
this.title = this.$t("修改商品"); this.title = this.$t("修改商品");
product_coupon_newProd({prodId:id}).then(r => { product_coupon_newProd({ prodId: id }).then((r) => {
this.preferentialList = r.data this.preferentialList = r.data;
this.form.couponIds = this.preferentialList.filter(i => i.isDefault).map(i => i.couponId) this.form.couponIds = this.preferentialList
.filter((i) => i.isDefault)
.map((i) => i.couponId);
// this.reset() // this.reset()
}) });
}); });
}, },
verify(row){ verify(row) {
return (row.startNum !== '' && row.endNum !== '' && row.clearancePrice !== '' && row.clearancePriceUnit !== '' && row.clearanceVolumeUnit !== '') return (
row.startNum !== "" &&
row.endNum !== "" &&
row.clearancePrice !== "" &&
row.clearancePriceUnit !== "" &&
row.clearanceVolumeUnit !== ""
);
}, },
/** 提交按钮 */ /** 提交按钮 */
submitForm() { submitForm() {
this.$refs["form"].validate(valid => { this.$refs["form"].validate((valid) => {
if (!valid) { if (!valid) {
return; return;
} }
...@@ -660,48 +965,52 @@ export default { ...@@ -660,48 +965,52 @@ export default {
// //
// } // }
//商品特性转字符串 //商品特性转字符串
this.form.attrId = this.form.attrArray.join(','); this.form.attrId = this.form.attrArray.join(",");
// 修改的提交 // 修改的提交
if (this.form.id != null) { if (this.form.id != null) {
this.form.priceStepClearanceList.forEach(i =>{ this.form.priceStepClearanceList.forEach((i) => {
i.productId = this.form.id i.productId = this.form.id;
}) });
if(this.exceptionProductId){ if (this.exceptionProductId) {
this.form.productId = this.exceptionProductId this.form.productId = this.exceptionProductId;
this.form.status = 0 this.form.status = 0;
}else { } else {
this.form.productId = this.form.id this.form.productId = this.form.id;
} }
updateProduct(this.form).then(response => { updateProduct(this.form).then((response) => {
this.$modal.msgSuccess(this.$t("修改成功")); this.$modal.msgSuccess(this.$t("修改成功"));
this.open = false; this.open = false;
if(this.exceptionProductId){ if (this.exceptionProductId) {
this.exceptionProductId = null this.exceptionProductId = null;
this.$router.replace({ path: '/product/product-list'}) this.$router.replace({ path: "/product/product-list" });
} }
this.getList(); this.getList();
this.lineNum = 0 this.lineNum = 0;
}); });
return; return;
} }
// 添加的提交 // 添加的提交
createProduct(this.form).then(response => { createProduct(this.form).then((response) => {
this.$modal.msgSuccess(this.$t("新增成功")); this.$modal.msgSuccess(this.$t("新增成功"));
this.open = false; this.open = false;
this.getList(); this.getList();
this.lineNum = 0 this.lineNum = 0;
}); });
}); });
}, },
/** 删除按钮操作 */ /** 删除按钮操作 */
handleDelete(row) { handleDelete(row) {
const id = row.id; const id = row.id;
this.$modal.confirm(this.$t('是否确认删除商品编号为{id}的数据项?', {id})).then(function () { this.$modal
.confirm(this.$t("是否确认删除商品编号为{id}的数据项?", { id }))
.then(function () {
return deleteProduct(id); return deleteProduct(id);
}).then(() => { })
.then(() => {
this.getList(); this.getList();
this.$modal.msgSuccess(this.$t("删除成功")); this.$modal.msgSuccess(this.$t("删除成功"));
}).catch(() => { }); })
.catch(() => {});
}, },
/** 导出按钮操作 */ /** 导出按钮操作 */
handleExport() { handleExport() {
...@@ -709,30 +1018,38 @@ export default { ...@@ -709,30 +1018,38 @@ export default {
let params = { ...this.queryParams }; let params = { ...this.queryParams };
params.pageNo = undefined; params.pageNo = undefined;
params.pageSize = undefined; params.pageSize = undefined;
this.addBeginAndEndTime(params, this.dateRangeCreateTime, 'createTime'); this.addBeginAndEndTime(params, this.dateRangeCreateTime, "createTime");
// 执行导出 // 执行导出
this.$modal.confirm(this.$t('是否确认导出所有商品数据项?')).then(() => { this.$modal
.confirm(this.$t("是否确认导出所有商品数据项?"))
.then(() => {
this.exportLoading = true; this.exportLoading = true;
return exportProductExcel(params); return exportProductExcel(params);
}).then(response => { })
.then((response) => {
// this.$download.excel(response, '商品.xlsx'); // this.$download.excel(response, '商品.xlsx');
this.$message.success(this.$t('已加入导出队列,请稍后在下载日志中下载')) this.$message.success(
this.$t("已加入导出队列,请稍后在下载日志中下载")
);
this.exportLoading = false; this.exportLoading = false;
}).catch(() => { }); })
.catch(() => {});
}, },
// 上传预处理 // 上传预处理
beforeUpload(file) { beforeUpload(file) {
if (file.type.indexOf("image/") == -1) { if (file.type.indexOf("image/") == -1) {
this.$modal.msgError(this.$t("文件格式错误,请上传图片类型,如:JPG,PNG后缀的文件。")); this.$modal.msgError(
this.$t("文件格式错误,请上传图片类型,如:JPG,PNG后缀的文件。")
);
} else { } else {
//上传 //上传
let formData = new FormData(); let formData = new FormData();
formData.append("file", file); formData.append("file", file);
// formData.append("path", this.uuid()); // formData.append("path", this.uuid());
uploadFile(formData).then(response => { uploadFile(formData).then((response) => {
this.$set(this.form, 'imgs', response.data); this.$set(this.form, "imgs", response.data);
// this.form.img = response.data; // this.form.img = response.data;
}) });
} }
}, },
...@@ -751,51 +1068,62 @@ export default { ...@@ -751,51 +1068,62 @@ export default {
}, },
// 表格多选 // 表格多选
handleSelectionChange(selection) { handleSelectionChange(selection) {
this.ids = selection.map(item => item.id) this.ids = selection.map((item) => item.id);
this.single = selection.length !== 1 this.single = selection.length !== 1;
this.multiple = !selection.length this.multiple = !selection.length;
}, },
// 批量设置商品属性 // 批量设置商品属性
handleEdit() { handleEdit() {
this.$router.push({ this.$router.push({
path: "product-attr/edit", path: "product-attr/edit",
query: { query: {
ids: this.ids ids: this.ids,
}
});
}, },
selectMoveAbout(val){
if(!val.mandatory){
let index = this.form.couponIds.findIndex(i => val.couponId == i)
if(index >= 0){
this.$confirm(this.$t(`您确定要将商品从优惠活动${this.$l(val,'title')}中移出吗?`), this.$t('提示'), {
confirmButtonText: this.$t('确定'),
cancelButtonText:this.$t('取消') ,
type: 'warning'
}).then(() => {
this.form.couponIds.splice(index,1)
this.$forceUpdate()
}).catch(() => {
});
}else {
this.$confirm(this.$t(`您确定要将商品加入到优惠活动${this.$l(val,'title')}中吗?`), this.$t('提示'), {
confirmButtonText: this.$t('确定'),
cancelButtonText:this.$t('取消') ,
type: 'warning'
}).then(() => {
this.form.couponIds.push(val.couponId)
this.$forceUpdate()
}).catch(() => {
}); });
},
selectMoveAbout(val) {
if (!val.mandatory) {
let index = this.form.couponIds.findIndex((i) => val.couponId == i);
if (index >= 0) {
this.$confirm(
this.$t(
`您确定要将商品从优惠活动${this.$l(val, "title")}中移出吗?`
),
this.$t("提示"),
{
confirmButtonText: this.$t("确定"),
cancelButtonText: this.$t("取消"),
type: "warning",
}
)
.then(() => {
this.form.couponIds.splice(index, 1);
this.$forceUpdate();
})
.catch(() => {});
} else {
this.$confirm(
this.$t(
`您确定要将商品加入到优惠活动${this.$l(val, "title")}中吗?`
),
this.$t("提示"),
{
confirmButtonText: this.$t("确定"),
cancelButtonText: this.$t("取消"),
type: "warning",
} }
)
.then(() => {
this.form.couponIds.push(val.couponId);
this.$forceUpdate();
})
.catch(() => {});
} }
} }
}, },
},
}; };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
</style> </style>
...@@ -353,6 +353,7 @@ ...@@ -353,6 +353,7 @@
</el-form-item> </el-form-item>
</template> </template>
<!--是否单询价,lanbm 2024-06-17 添加海运选中单询价不用设置价格信息逻辑 -->
<el-form-item :label="$t('是否单询')" prop="inquiry"> <el-form-item :label="$t('是否单询')" prop="inquiry">
<dict-selector <dict-selector
:type="DICT_TYPE.NEED_ORDER_INQUIRY" :type="DICT_TYPE.NEED_ORDER_INQUIRY"
...@@ -361,6 +362,7 @@ ...@@ -361,6 +362,7 @@
formatter="number" formatter="number"
></dict-selector> ></dict-selector>
</el-form-item> </el-form-item>
<!--end 是否单询价,lanbm 2024-06-17 添加海运选中单询价不用设置价格信息逻辑 -->
</el-card> </el-card>
</el-form> </el-form>
...@@ -931,12 +933,12 @@ export default { ...@@ -931,12 +933,12 @@ export default {
if (!valid) { if (!valid) {
return; return;
} }
// 只有修改单条路线的时候,不需要选择路线 // 只有修改单条路线的时候,不需要选择路线
/* if (this.$route.query.action !== 'update' && (!this.selectedRoutes || !this.selectedRoutes.length)) { /* if (this.$route.query.action !== 'update' && (!this.selectedRoutes || !this.selectedRoutes.length)) {
this.$message.error('请选择线路'); this.$message.error('请选择线路');
return; return;
} */ } */
if ( if (
!this.lineList.length && !this.lineList.length &&
(!this.selectedRoutes || !this.selectedRoutes.length) (!this.selectedRoutes || !this.selectedRoutes.length)
...@@ -949,6 +951,9 @@ export default { ...@@ -949,6 +951,9 @@ export default {
// specialList: this.specialProducts, // specialList: this.specialProducts,
isAllProduct: 0, isAllProduct: 0,
}); });
if (this.form.needOrderInquiry == 0) {
//不是单询价才校验价格参数 lanbm 2024-06-17
// 阶梯价 // 阶梯价
if (this.form.stepPrice) { if (this.form.stepPrice) {
let isValid = true; let isValid = true;
...@@ -1036,6 +1041,8 @@ export default { ...@@ -1036,6 +1041,8 @@ export default {
} }
} }
}
// 修改单条路线 // 修改单条路线
if (this.$route.query.action == "update") { if (this.$route.query.action == "update") {
this.loading = true; this.loading = true;
......
<template> <template>
<div class="app-container"> <div class="app-container">
<div class="page-title">{{$route.query.product_id ? productTitle + '-' + $t('路线价格列表') : routeName}}</div> <div class="page-title">
{{
$route.query.product_id
? productTitle + "-" + $t("路线价格列表")
: routeName
}}
</div>
<!-- 搜索工作栏 --> <!-- 搜索工作栏 -->
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px"> <el-form
<el-form-item :label="$t('商品名称')" prop="titleZh" v-if="!$route.query.product_id"> :model="queryParams"
<el-input v-model="queryParams.titleZh" :placeholder="$t('请输入中英文名称、商品编码、海关编码')" clearable @keyup.enter.native="handleQuery"> ref="queryForm"
size="small"
:inline="true"
v-show="showSearch"
label-width="68px"
>
<el-form-item
:label="$t('商品名称')"
prop="titleZh"
v-if="!$route.query.product_id"
>
<el-input
v-model="queryParams.titleZh"
:placeholder="$t('请输入中英文名称、商品编码、海关编码')"
clearable
@keyup.enter.native="handleQuery"
>
<template #prepend> <template #prepend>
<el-select v-model="queryParams.searchType" style="width: 100px"> <el-select v-model="queryParams.searchType" style="width: 100px">
<el-option :value="1" :label="$t('包含')"></el-option> <el-option :value="1" :label="$t('包含')"></el-option>
...@@ -15,67 +37,196 @@ ...@@ -15,67 +37,196 @@
</el-input> </el-input>
</el-form-item> </el-form-item>
<el-form-item :label="$t('商品类型')" prop="typeId" v-if="!$route.query.product_id"> <el-form-item
<el-select v-model="queryParams.typeId" :placeholder="$t('选择商品类型')" clearable @change="handleQuery"> :label="$t('商品类型')"
<el-option v-for="type in typeList" :key="type.id" :label="$l(type, 'titleZh')" :value="type.id"/> prop="typeId"
v-if="!$route.query.product_id"
>
<el-select
v-model="queryParams.typeId"
:placeholder="$t('选择商品类型')"
clearable
@change="handleQuery"
>
<el-option
v-for="type in typeList"
:key="type.id"
:label="$l(type, 'titleZh')"
:value="type.id"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item :label="$t('商品属性')" prop="typeId" v-if="!$route.query.product_id"> <el-form-item
<el-select v-model="queryParams.attrId" :placeholder="$t('选择商品类型')" clearable @change="handleQuery"> :label="$t('商品属性')"
<el-option v-for="attr in attrList" :key="attr.id" :label="$l(attr, 'attrName')" :value="attr.id"/> prop="typeId"
v-if="!$route.query.product_id"
>
<el-select
v-model="queryParams.attrId"
:placeholder="$t('选择商品类型')"
clearable
@change="handleQuery"
>
<el-option
v-for="attr in attrList"
:key="attr.id"
:label="$l(attr, 'attrName')"
:value="attr.id"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item :label="$t('运输方式')" prop="transportType" v-if="!transportType"> <el-form-item
<dict-selector :type="DICT_TYPE.ECW_TRANSPORT_TYPE" v-model="queryParams.transportType" formatter="number" clearable @change="handleQuery"/> :label="$t('运输方式')"
prop="transportType"
v-if="!transportType"
>
<dict-selector
:type="DICT_TYPE.ECW_TRANSPORT_TYPE"
v-model="queryParams.transportType"
formatter="number"
clearable
@change="handleQuery"
/>
</el-form-item> </el-form-item>
<!--海运不显示渠道--> <!--海运不显示渠道-->
<el-form-item :label="$t('出货渠道')" prop="shippingChannelId" v-if="type !== 'sea'"> <el-form-item
<el-select v-model="queryParams.shippingChannelId" clearable @change="handleQuery"> :label="$t('出货渠道')"
<el-option v-for="item in channelList" :key="item.id" :label="$l(item, 'name')" :value="item.channelId" /> prop="shippingChannelId"
v-if="type !== 'sea'"
>
<el-select
v-model="queryParams.shippingChannelId"
clearable
@change="handleQuery"
>
<el-option
v-for="item in channelList"
:key="item.id"
:label="$l(item, 'name')"
:value="item.channelId"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item :label="$t('始发地')" prop="startCityId"> <el-form-item :label="$t('始发地')" prop="startCityId">
<el-select v-model="queryParams.startCityId" clearable @change="handleQuery"> <el-select
<el-option v-for="city in startCityList" :key="city.id" :label="$l(city, 'title')" :value="city.id" /> v-model="queryParams.startCityId"
clearable
@change="handleQuery"
>
<el-option
v-for="city in startCityList"
:key="city.id"
:label="$l(city, 'title')"
:value="city.id"
/>
</el-select>
</el-form-item>
<!--lanbm 2024-06-15 add -->
<el-form-item :label="$t('目的国')" prop="countryId">
<el-select
v-model="queryParams.countryId"
clearable
@change="handleQuery"
>
<el-option
v-for="item in countryList"
:key="item.id"
:label="$l(item, 'title')"
:value="item.id"
>
</el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item :label="$t('目的地')" prop="destCityId"> <el-form-item :label="$t('目的地')" prop="destCityId">
<el-select v-model="queryParams.destCityId" clearable @change="handleQuery"> <el-select
<el-option v-for="city in destCityList" :key="city.id" :label="$l(city, 'title')" :value="city.id" /> v-model="queryParams.destCityId"
clearable
@change="handleQuery"
>
<el-option
v-for="city in destCityList"
:key="city.id"
:label="$l(city, 'title')"
:value="city.id"
/>
</el-select>
</el-form-item>
<!--lanbm 2024-06-15 add-->
<el-form-item :label="$t('目的仓')" prop="destCityId">
<el-select
v-model="queryParams.destCityId"
clearable
@change="handleQuery"
>
<el-option
v-for="city in destCityList"
:key="city.id"
:label="$l(city, 'title')"
:value="city.id"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item :label="$t('是否预付')" prop="needPay"> <el-form-item :label="$t('是否预付')" prop="needPay">
<el-select v-model="queryParams.needPay" :placeholder="$t('请选择')" clearable @change="handleQuery"> <el-select
v-model="queryParams.needPay"
:placeholder="$t('请选择')"
clearable
@change="handleQuery"
>
<el-option :label="$t('是')" value="1"></el-option> <el-option :label="$t('是')" value="1"></el-option>
<el-option :label="$t('否')" value="0"></el-option> <el-option :label="$t('否')" value="0"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item :label="$t('上架状态')" prop="auditStatus"> <el-form-item :label="$t('上架状态')" prop="auditStatus">
<dict-selector :type="DICT_TYPE.ECW_PRICE_AUDIT_STATUS" v-model="queryParams.auditStatus" clearable @change="handleQuery"/> <dict-selector
:type="DICT_TYPE.ECW_PRICE_AUDIT_STATUS"
v-model="queryParams.auditStatus"
clearable
@change="handleQuery"
/>
</el-form-item> </el-form-item>
<el-form-item :label="$t('状态')" prop="combStatus"> <el-form-item :label="$t('状态')" prop="combStatus">
<el-select v-model="queryParams.combStatus" :placeholder="$t('请选择状态')" clearable @change="handleQuery"> <el-select
v-model="queryParams.combStatus"
:placeholder="$t('请选择状态')"
clearable
@change="handleQuery"
>
<el-option :label="$t('未设置价格')" value="setPrice_1"></el-option> <el-option :label="$t('未设置价格')" value="setPrice_1"></el-option>
<el-option :label="$t('未过期')" value="setPrice_2"></el-option> <el-option :label="$t('未过期')" value="setPrice_2"></el-option>
<el-option :label="$t('黑名单')" value="blacklist_1"></el-option> <el-option :label="$t('黑名单')" value="blacklist_1"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item :label="$t('是否单询')" prop="needOrderInquiry"> <el-form-item :label="$t('是否单询')" prop="needOrderInquiry">
<el-select v-model="queryParams.needOrderInquiry" :placeholder="$t('请选择')" clearable @change="handleQuery"> <el-select
v-model="queryParams.needOrderInquiry"
:placeholder="$t('请选择')"
clearable
@change="handleQuery"
>
<el-option :label="$t('是')" value="1"></el-option> <el-option :label="$t('是')" value="1"></el-option>
<el-option :label="$t('否')" value="0"></el-option> <el-option :label="$t('否')" value="0"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item :label="$t('单价模式')" prop="priceType"> <el-form-item :label="$t('单价模式')" prop="priceType">
<el-select v-model="queryParams.priceType" :placeholder="$t('请选择')" clearable @change="handleQuery"> <el-select
v-model="queryParams.priceType"
:placeholder="$t('请选择')"
clearable
@change="handleQuery"
>
<el-option :label="$t('运费+清关费')" value="0"></el-option> <el-option :label="$t('运费+清关费')" value="0"></el-option>
<el-option :label="$t('全包价')" value="1"></el-option> <el-option :label="$t('全包价')" value="1"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" icon="el-icon-search" @click="handleQuery">{{$t('搜索')}}</el-button> <el-button type="primary" icon="el-icon-search" @click="handleQuery">{{
<el-button icon="el-icon-refresh" @click="resetQuery">{{$t('重置')}}</el-button> $t("搜索")
}}</el-button>
<el-button icon="el-icon-refresh" @click="resetQuery">{{
$t("重置")
}}</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
...@@ -83,80 +234,192 @@ ...@@ -83,80 +234,192 @@
<el-row :gutter="10" class="mb8"> <el-row :gutter="10" class="mb8">
<!--全部路线吗没有新增入口,指定商品的路线价格才有添加路线--> <!--全部路线吗没有新增入口,指定商品的路线价格才有添加路线-->
<el-col :span="1.5" v-if="$route.query.product_id"> <el-col :span="1.5" v-if="$route.query.product_id">
<el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd('air')" v-hasPermi="['ecw:product-price:create']">{{$t('新建空运价格')}}</el-button> <el-button
<el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd('sea')" v-hasPermi="['ecw:product-price:create']">{{$t('新建海运价格')}}</el-button> type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd('air')"
v-hasPermi="['ecw:product-price:create']"
>{{ $t("新建空运价格") }}</el-button
>
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd('sea')"
v-hasPermi="['ecw:product-price:create']"
>{{ $t("新建海运价格") }}</el-button
>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
<!--未指定商品--> <!--未指定商品-->
<template v-if="!$route.query.product_id"> <template v-if="!$route.query.product_id">
<!--<el-button type="primary" v-hasPermi="['ecw:product-price:batch_update']" size="mini" @click="handleBatchEdit">{{$t('批量设置价格')}}</el-button>--> <!--<el-button type="primary" v-hasPermi="['ecw:product-price:batch_update']" size="mini" @click="handleBatchEdit">{{$t('批量设置价格')}}</el-button>-->
<el-button type="primary" v-hasPermi="['ecw:product-price:bartch_black']" size="mini" @click="batchBlock" :disabled="multiple">{{$t('批量加入黑名单')}}</el-button> <el-button
<el-button type="primary" v-hasPermi="['ecw:product-price:batch_down']" size="mini" @click="batchOff" :disabled="multiple">{{$t('批量下架')}}</el-button> type="primary"
<el-button type="warning" v-hasPermi="['ecw:product-price:export']" size="mini" @click="handleExport" :loading="exportLoading" >{{$t('导出')}}</el-button> v-hasPermi="['ecw:product-price:bartch_black']"
<el-button type="primary" v-if="type != 'air'" v-hasPermi="['ecw:product-price:batch_update']" size="mini" @click="handleBatchEdit('sea')">{{$t('批量设置海运价格')}}</el-button> size="mini"
<el-button type="primary" v-if="type != 'sea'" v-hasPermi="['ecw:product-price:batch_update']" size="mini" @click="handleBatchEdit('air')">{{$t('批量设置空运价格')}}</el-button> @click="batchBlock"
:disabled="multiple"
>{{ $t("批量加入黑名单") }}</el-button
>
<el-button
type="primary"
v-hasPermi="['ecw:product-price:batch_down']"
size="mini"
@click="batchOff"
:disabled="multiple"
>{{ $t("批量下架") }}</el-button
>
<el-button
type="warning"
v-hasPermi="['ecw:product-price:export']"
size="mini"
@click="handleExport"
:loading="exportLoading"
>{{ $t("导出") }}</el-button
>
<el-button
type="primary"
v-if="type != 'air'"
v-hasPermi="['ecw:product-price:batch_update']"
size="mini"
@click="handleBatchEdit('sea')"
>{{ $t("批量设置海运价格") }}</el-button
>
<el-button
type="primary"
v-if="type != 'sea'"
v-hasPermi="['ecw:product-price:batch_update']"
size="mini"
@click="handleBatchEdit('air')"
>{{ $t("批量设置空运价格") }}</el-button
>
</template> </template>
<!--指定商品--> <!--指定商品-->
<template v-else> <template v-else>
<el-button type="primary" size="mini" v-hasPermi="['ecw:product-price:single_product']" @click="batchSetSingleProductPrice('sea')">{{$t('批量设置商品海运路线')}}</el-button> <el-button
<el-button type="primary" size="mini" v-hasPermi="['ecw:product-price:single_product']" @click="batchSetSingleProductPrice('air')">{{$t('批量设置商品空运路线')}}</el-button> type="primary"
size="mini"
v-hasPermi="['ecw:product-price:single_product']"
@click="batchSetSingleProductPrice('sea')"
>{{ $t("批量设置商品海运路线") }}</el-button
>
<el-button
type="primary"
size="mini"
v-hasPermi="['ecw:product-price:single_product']"
@click="batchSetSingleProductPrice('air')"
>{{ $t("批量设置商品空运路线") }}</el-button
>
</template> </template>
</el-col> </el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar> <right-toolbar
:showSearch.sync="showSearch"
@queryTable="getList"
></right-toolbar>
</el-row> </el-row>
<!-- 列表 --> <!-- 列表 -->
<el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange"> <el-table
<el-table-column type="selection" width="55" align="center"></el-table-column> v-loading="loading"
:data="list"
@selection-change="handleSelectionChange"
>
<el-table-column
type="selection"
width="55"
align="center"
></el-table-column>
<el-table-column :label="$t('序号')" prop="id" width="50" /> <el-table-column :label="$t('序号')" prop="id" width="50" />
<el-table-column :label="$t('商品编码')" align="center" prop="productCode" > <el-table-column
<template slot-scope="{row}"> :label="$t('商品编码')"
align="center"
prop="productCode"
>
<template slot-scope="{ row }">
<el-link type="primary" @click.native="handleUpdate(row)"> <el-link type="primary" @click.native="handleUpdate(row)">
{{ row.productDO ? row.productDO.productCode : $t('无productDO字段') }} {{
row.productDO ? row.productDO.productCode : $t("无productDO字段")
}}
</el-link> </el-link>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column :label="$t('海关编码')" align="center" prop="customsCode"> <el-table-column
<template slot-scope="{row}"> :label="$t('海关编码')"
align="center"
prop="customsCode"
>
<template slot-scope="{ row }">
<div> <div>
{{ row.productDO ? row.productDO.customsCode : $t('无productDO字段') }} {{
row.productDO ? row.productDO.customsCode : $t("无productDO字段")
}}
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column :label="$t('商品类型')" align="center" prop="typeId"> <el-table-column :label="$t('商品类型')" align="center" prop="typeId">
<template slot-scope="{row}"> <template slot-scope="{ row }">
<span>{{ row.productDO ? getTypeName(row.productDO.typeId) : $t('无productDO字段') }}</span> <span>{{
row.productDO
? getTypeName(row.productDO.typeId)
: $t("无productDO字段")
}}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column :label="$t('商品名称')" align="center" prop="productName"> <el-table-column
<template slot-scope="{row}"> :label="$t('商品名称')"
align="center"
prop="productName"
>
<template slot-scope="{ row }">
<el-link type="primary" @click.native="handleUpdate(row)"> <el-link type="primary" @click.native="handleUpdate(row)">
{{ row.productDO ? row.productDO.titleZh + '/' + row.productDO.titleEn : $t('无productDO字段') }} {{
row.productDO
? row.productDO.titleZh + "/" + row.productDO.titleEn
: $t("无productDO字段")
}}
</el-link> </el-link>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="tansportType" :label="$t('运输方式')" align="center" width="100"> <el-table-column
prop="tansportType"
:label="$t('运输方式')"
align="center"
width="100"
>
<template slot-scope="scope"> <template slot-scope="scope">
<div> <div>
{{ transportName(scope.row.warehouseLineDO.transportType) }} {{ transportName(scope.row.warehouseLineDO.transportType) }}
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="tansportType" :label="$t('出货渠道')" align="center" width="100"> <el-table-column
<template slot-scope="{row}"> prop="tansportType"
:label="$t('出货渠道')"
align="center"
width="100"
>
<template slot-scope="{ row }">
<div> <div>
{{ channelName(row.shippingChannelId) }} {{ channelName(row.shippingChannelId) }}
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="startDestTitle" :label="$t('始发地') + '/' + $t('目的地')" align="center"> <el-table-column
prop="startDestTitle"
:label="$t('始发地') + '/' + $t('目的地')"
align="center"
>
<template slot-scope="scope"> <template slot-scope="scope">
<div> <div>
{{ scope.row.warehouseLineDO.startTitleZh }} {{ scope.row.warehouseLineDO.startTitleZh }}
...@@ -168,55 +431,126 @@ ...@@ -168,55 +431,126 @@
<el-table-column prop="price" :label="$t('价格')" align="center"> <el-table-column prop="price" :label="$t('价格')" align="center">
<template slot-scope="scope"> <template slot-scope="scope">
<template v-if="scope.row.needOrderInquiry==1"> <template v-if="scope.row.needOrderInquiry == 1">
<div v-if="scope.row.needOrderInquiry==1">{{$t('单询无价格,请联系市场部')}}</div> <div v-if="scope.row.needOrderInquiry == 1">
{{ $t("单询无价格,请联系市场部") }}
</div>
</template> </template>
<template v-else> <template v-else>
<template v-if="scope.row.stepPrice == 1"> <template v-if="scope.row.stepPrice == 1">
<!--全包价--> <!--全包价-->
<div v-if="scope.row.priceType"> <div v-if="scope.row.priceType">
<div v-if="!scope.row.fullPriceStepList || !scope.row.fullPriceStepList.length">{{$t('未设置全包价阶梯价')}}</div> <div
v-if="
!scope.row.fullPriceStepList ||
!scope.row.fullPriceStepList.length
"
>
{{ $t("未设置全包价阶梯价") }}
</div>
<div v-else> <div v-else>
{{$t("第{no}阶梯({start}~{end}{weightUnit}", { {{
$t("第{no}阶梯({start}~{end}{weightUnit}", {
no: 1, no: 1,
start: scope.row.fullPriceStepList[0].startNum, start: scope.row.fullPriceStepList[0].startNum,
end: scope.row.fullPriceStepList[0].endNum, end: scope.row.fullPriceStepList[0].endNum,
weightUnit: getUnitTitle(scope.row.fullPriceStepList[0].weightUnit), weightUnit: getUnitTitle(
})}}<br/> scope.row.fullPriceStepList[0].weightUnit
{{$t('全包价')}}:{{ getCurrencySymbol(scope.row.fullPriceStepList[0].allPriceUnit) + scope.row.fullPriceStepList[0].allPrice}}&nbsp; ),
{{ getCurrencyTitle(scope.row.fullPriceStepList[0].allPriceUnit) + '/' + getUnitTitle(scope.row.fullPriceStepList[0].allVolumeUnit)}} })
}}<br />
{{ $t("全包价") }}:{{
getCurrencySymbol(
scope.row.fullPriceStepList[0].allPriceUnit
) + scope.row.fullPriceStepList[0].allPrice
}}&nbsp;
{{
getCurrencyTitle(
scope.row.fullPriceStepList[0].allPriceUnit
) +
"/" +
getUnitTitle(scope.row.fullPriceStepList[0].allVolumeUnit)
}}
</div> </div>
</div> </div>
<template v-else> <template v-else>
<div v-if="!scope.row.freightPriceStepList || !scope.row.freightPriceStepList.length">{{$t('未设置运费阶梯价')}}</div> <div
v-if="
!scope.row.freightPriceStepList ||
!scope.row.freightPriceStepList.length
"
>
{{ $t("未设置运费阶梯价") }}
</div>
<div v-else> <div v-else>
{{$t("第{no}阶梯({start}~{end}{weightUnit}", { {{
$t("第{no}阶梯({start}~{end}{weightUnit}", {
no: 1, no: 1,
start: scope.row.freightPriceStepList[0].startNum, start: scope.row.freightPriceStepList[0].startNum,
end: scope.row.freightPriceStepList[0].endNum, end: scope.row.freightPriceStepList[0].endNum,
weightUnit: getUnitTitle(scope.row.freightPriceStepList[0].weightUnit), weightUnit: getUnitTitle(
})}}<br/> scope.row.freightPriceStepList[0].weightUnit
),
})
}}<br />
<div> <div>
{{$t('运费')}}:{{ getCurrencySymbol(scope.row.freightPriceStepList[0].transportPriceUnit) + scope.row.freightPriceStepList[0].transportPrice}}&nbsp; {{ $t("运费") }}:{{
{{ getCurrencyTitle(scope.row.freightPriceStepList[0].transportPriceUnit) + '/' + getUnitTitle(scope.row.freightPriceStepList[0].transportVolumeUnit)}} getCurrencySymbol(
scope.row.freightPriceStepList[0].transportPriceUnit
) + scope.row.freightPriceStepList[0].transportPrice
}}&nbsp;
{{
getCurrencyTitle(
scope.row.freightPriceStepList[0].transportPriceUnit
) +
"/" +
getUnitTitle(
scope.row.freightPriceStepList[0].transportVolumeUnit
)
}}
</div> </div>
</div> </div>
</template> </template>
<el-button type="text" @click="showMoreStepPriceItem=scope.row">{{$t('查看更多')}}</el-button> <el-button
type="text"
@click="showMoreStepPriceItem = scope.row"
>{{ $t("查看更多") }}</el-button
>
</template> </template>
<template v-else> <template v-else>
<div v-if="scope.row.priceType == 0"> <div v-if="scope.row.priceType == 0">
{{$t('运费')}}:{{ getCurrencySymbol(scope.row.transportPriceUnit) + scope.row.transportPrice}}&nbsp; {{ $t("运费") }}:{{
{{ getCurrencyTitle(scope.row.transportPriceUnit) + '/' + getUnitTitle(scope.row.transportVolumeUnit)}} getCurrencySymbol(scope.row.transportPriceUnit) +
scope.row.transportPrice
}}&nbsp;
{{
getCurrencyTitle(scope.row.transportPriceUnit) +
"/" +
getUnitTitle(scope.row.transportVolumeUnit)
}}
<br /> <br />
{{$t('清关费')}}:{{ getCurrencySymbol(scope.row.clearancePriceUnit) + scope.row.clearancePrice}}&nbsp; {{ $t("清关费") }}:{{
{{ getCurrencyTitle(scope.row.clearancePriceUnit) + '/' + getUnitTitle(scope.row.clearanceVolumeUnit)}} getCurrencySymbol(scope.row.clearancePriceUnit) +
scope.row.clearancePrice
}}&nbsp;
{{
getCurrencyTitle(scope.row.clearancePriceUnit) +
"/" +
getUnitTitle(scope.row.clearanceVolumeUnit)
}}
</div> </div>
<div v-if="scope.row.priceType == 1"> <div v-if="scope.row.priceType == 1">
{{$t('全包价')}}:{{ getCurrencySymbol(scope.row.allPriceUnit) + scope.row.allPrice}}&nbsp; {{ $t("全包价") }}:{{
{{ getCurrencyTitle(scope.row.allPriceUnit) + '/' + getUnitTitle(scope.row.allVolumeUnit)}} getCurrencySymbol(scope.row.allPriceUnit) +
scope.row.allPrice
}}&nbsp;
{{
getCurrencyTitle(scope.row.allPriceUnit) +
"/" +
getUnitTitle(scope.row.allVolumeUnit)
}}
</div> </div>
</template> </template>
</template> </template>
...@@ -267,98 +601,203 @@ ...@@ -267,98 +601,203 @@
{{ getCurrencyTitle(scope.row.allPriceUnit) + '/' + getUnitTitle(scope.row.allVolumeUnit)}} {{ getCurrencyTitle(scope.row.allPriceUnit) + '/' + getUnitTitle(scope.row.allVolumeUnit)}}
</div> </div>
</template> --> </template> -->
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="auditStatus" align="center" :label="$t('状态')" width="120"> <el-table-column
prop="auditStatus"
align="center"
:label="$t('状态')"
width="120"
>
<template slot-scope="scope"> <template slot-scope="scope">
<div> <div>
{{ statusName(scope.row) }} {{ statusName(scope.row) }}
<span style="color:red" v-if="(scope.row.validateStartDate && scope.row.validateStartDate > Date.now()) || (scope.row.validateEndDate && scope.row.validateEndDate < Date.now())">(已过期)</span> <span
style="color: red"
v-if="
(scope.row.validateStartDate &&
scope.row.validateStartDate > Date.now()) ||
(scope.row.validateEndDate &&
scope.row.validateEndDate < Date.now())
"
>(已过期)</span
>
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="advanceStatus" :label="$t('单询')" align="center" width="80"> <el-table-column
prop="advanceStatus"
:label="$t('单询')"
align="center"
width="80"
>
<template slot-scope="scope"> <template slot-scope="scope">
<dict-tag :type="DICT_TYPE.NEED_ORDER_INQUIRY" :value="scope.row.needOrderInquiry"></dict-tag> <dict-tag
:type="DICT_TYPE.NEED_ORDER_INQUIRY"
:value="scope.row.needOrderInquiry"
></dict-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="advanceStatus" :label="$t('预付')" align="center" width="80"> <el-table-column
prop="advanceStatus"
:label="$t('预付')"
align="center"
width="80"
>
<template slot-scope="scope"> <template slot-scope="scope">
<div> <div>
<!-- {{ getAdvanceStatuTitle(scope.row.advanceStatus) }} --> <!-- {{ getAdvanceStatuTitle(scope.row.advanceStatus) }} -->
<dict-tag :type="DICT_TYPE.ECW_PAY_ADVANCE" :value="scope.row.needPay"></dict-tag> <dict-tag
:type="DICT_TYPE.ECW_PAY_ADVANCE"
:value="scope.row.needPay"
></dict-tag>
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column :label="$t('最后修改时间')"> <el-table-column :label="$t('最后修改时间')">
<template slot-scope="{row}"> <template slot-scope="{ row }">
<div> <div>
{{ row.updateTime|parseTime }} {{ row.updateTime | parseTime }}
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column :label="$t('操作')" align="center" class-name="small-padding fixed-width" width="140"> <el-table-column
:label="$t('操作')"
align="center"
class-name="small-padding fixed-width"
width="140"
>
<template slot-scope="scope"> <template slot-scope="scope">
<el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row, true)" <el-button
v-hasPermi="['ecw:product-price:show']">{{$t('查看')}}</el-button> size="mini"
<el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)" type="text"
v-hasPermi="['ecw:product-price:update']">{{$t('编辑')}}</el-button> icon="el-icon-edit"
@click="handleUpdate(scope.row, true)"
<el-button size="mini" type="text" icon="el-icon-edit" @click="updateStatus(scope.row, 'blacklist')" v-hasPermi="['ecw:product-price:show']"
v-hasPermi="['ecw:product-price:black']">{{ scope.row.blacklist == 0 ? $t('加入黑名单') : $t('移除黑名单') }}</el-button> >{{ $t("查看") }}</el-button
<el-button size="mini" type="text" icon="el-icon-edit" @click="updateStatus(scope.row, 'auditStatus')" >
v-hasPermi="['ecw:product-price:down']">{{scope.row.auditStatus == AuditStatusEnum.PASS ? $t('下架') : $t('上架')}}</el-button> <el-button
<el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)" size="mini"
v-hasPermi="['ecw:product-price:delete']">{{$t('删除')}}</el-button> type="text"
<el-button @click="copyTemplate(scope.row)" size="mini" type="text">{{$t('复制模板')}}</el-button> icon="el-icon-edit"
<el-button @click="setOrderInquiry(scope.row, 0)" v-if="scope.row.needOrderInquiry" size="mini" type="text">{{$t('取消单询')}}</el-button> @click="handleUpdate(scope.row)"
<el-button @click="setOrderInquiry(scope.row, 1)" v-else size="mini" type="text">{{$t('单询异常')}}</el-button> v-hasPermi="['ecw:product-price:update']"
>{{ $t("编辑") }}</el-button
>
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="updateStatus(scope.row, 'blacklist')"
v-hasPermi="['ecw:product-price:black']"
>{{
scope.row.blacklist == 0 ? $t("加入黑名单") : $t("移除黑名单")
}}</el-button
>
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="updateStatus(scope.row, 'auditStatus')"
v-hasPermi="['ecw:product-price:down']"
>{{
scope.row.auditStatus == AuditStatusEnum.PASS
? $t("下架")
: $t("上架")
}}</el-button
>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['ecw:product-price:delete']"
>{{ $t("删除") }}</el-button
>
<el-button @click="copyTemplate(scope.row)" size="mini" type="text">{{
$t("复制模板")
}}</el-button>
<el-button
@click="setOrderInquiry(scope.row, 0)"
v-if="scope.row.needOrderInquiry"
size="mini"
type="text"
>{{ $t("取消单询") }}</el-button
>
<el-button
@click="setOrderInquiry(scope.row, 1)"
v-else
size="mini"
type="text"
>{{ $t("单询异常") }}</el-button
>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<!-- 分页组件 --> <!-- 分页组件 -->
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize" <pagination
@pagination="getList"/> v-show="total > 0"
:total="total"
<el-dialog :visible="!!showMoreStepPriceItem" :before-close="closeMoreStepPrice" :title="$t('查看阶梯价')"> :page.sync="queryParams.pageNo"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<el-dialog
:visible="!!showMoreStepPriceItem"
:before-close="closeMoreStepPrice"
:title="$t('查看阶梯价')"
>
<el-row :gutter="20" v-if="showMoreStepPriceItem"> <el-row :gutter="20" v-if="showMoreStepPriceItem">
<el-col :span="12"> <el-col :span="12">
<!--全包价--> <!--全包价-->
<template v-if="showMoreStepPriceItem.priceType"> <template v-if="showMoreStepPriceItem.priceType">
<div v-for="(item, index) in showMoreStepPriceItem.fullPriceStepList"> <div
v-for="(item, index) in showMoreStepPriceItem.fullPriceStepList"
>
<show-step-price-item <show-step-price-item
:value="item" :value="item"
:unit-map="unitMap" :unit-map="unitMap"
:currency-map="currencyMap" :currency-map="currencyMap"
:index="index" :index="index"
field-prefix="all" field-prefix="all"
:price-name="$t('全包价')"></show-step-price-item> :price-name="$t('全包价')"
></show-step-price-item>
</div> </div>
</template> </template>
<template v-else> <template v-else>
<template v-if="showMoreStepPriceItem.freightPriceStepList"> <template v-if="showMoreStepPriceItem.freightPriceStepList">
<div v-for="(item, index) in showMoreStepPriceItem.freightPriceStepList"> <div
v-for="(
item, index
) in showMoreStepPriceItem.freightPriceStepList"
>
<show-step-price-item <show-step-price-item
:value="item" :value="item"
:unit-map="unitMap" :unit-map="unitMap"
:currency-map="currencyMap" :currency-map="currencyMap"
:index="index" :index="index"
field-prefix="transport" field-prefix="transport"
:price-name="$t('运费')"></show-step-price-item> :price-name="$t('运费')"
></show-step-price-item>
</div> </div>
</template> </template>
<template v-if="showMoreStepPriceItem.clearancePriceStepList"> <template v-if="showMoreStepPriceItem.clearancePriceStepList">
<div v-for="(item, index) in showMoreStepPriceItem.clearancePriceStepList"> <div
v-for="(
item, index
) in showMoreStepPriceItem.clearancePriceStepList"
>
<show-step-price-item <show-step-price-item
:value="item" :value="item"
:unit-map="unitMap" :unit-map="unitMap"
:currency-map="currencyMap" :currency-map="currencyMap"
:index="index" :index="index"
field-prefix="clearance" field-prefix="clearance"
:price-name="$t('清关费')"></show-step-price-item> :price-name="$t('清关费')"
></show-step-price-item>
</div> </div>
</template> </template>
</template> </template>
...@@ -367,7 +806,7 @@ ...@@ -367,7 +806,7 @@
<!-- <!--
甲方要求不显示清关费 https://zentao.test.jdshangmen.com/bug-view-5298.html 甲方要求不显示清关费 https://zentao.test.jdshangmen.com/bug-view-5298.html
--> -->
<!-- <el-col :span="12" v-if="[3,4].indexOf(+showMoreStepPriceItem.warehouseLineDO.transportType) > -1"> <!-- <el-col :span="12" v-if="[3,4].indexOf(+showMoreStepPriceItem.warehouseLineDO.transportType) > -1">
<template v-if="showMoreStepPriceItem.clearPriceStepList.length"> <template v-if="showMoreStepPriceItem.clearPriceStepList.length">
<div v-for="(item, index) in showMoreStepPriceItem.clearPriceStepList"> <div v-for="(item, index) in showMoreStepPriceItem.clearPriceStepList">
<div class="page-title"> <div class="page-title">
...@@ -386,7 +825,6 @@ ...@@ -386,7 +825,6 @@
</el-col>--> </el-col>-->
</el-row> </el-row>
</el-dialog> </el-dialog>
</div> </div>
</template> </template>
...@@ -400,31 +838,31 @@ import { ...@@ -400,31 +838,31 @@ import {
exportProductPriceExcel, exportProductPriceExcel,
batchBlock, batchBlock,
batchOff, batchOff,
updateOrderInquiry updateOrderInquiry,
} from "@/api/ecw/productPrice"; } from "@/api/ecw/productPrice";
import { openedRouterList } from "@/api/ecw/warehouse"; import { openedRouterList } from "@/api/ecw/warehouse";
import { getTradeCityList } from "@/api/ecw/region"; import { getTradeCityList, getListTree } from "@/api/ecw/region";
import { getProductTypeList } from "@/api/ecw/productType"; import { getProductTypeList } from "@/api/ecw/productType";
import { getProductAttrList } from "@/api/ecw/productAttr"; import { getProductAttrList } from "@/api/ecw/productAttr";
import { getDictDatas, DICT_TYPE } from '@/utils/dict' import { getDictDatas, DICT_TYPE } from "@/utils/dict";
import { getCurrencyList } from '@/api/ecw/currency'; import { getCurrencyList } from "@/api/ecw/currency";
import { getUnitList } from '@/api/ecw/unit'; import { getUnitList } from "@/api/ecw/unit";
import { AuditStatusEnum} from '@/utils/constants' import { AuditStatusEnum } from "@/utils/constants";
import { getAllChannelList, getChannelList } from '@/api/ecw/channel' import { getAllChannelList, getChannelList } from "@/api/ecw/channel";
import DictTag from '@/components/DictTag' import DictTag from "@/components/DictTag";
import {arrryToKeyedObjectBy} from '@/utils/index' import { arrryToKeyedObjectBy } from "@/utils/index";
import { getProduct } from '@/api/ecw/product'; import { getProduct } from "@/api/ecw/product";
import {parseTime} from '@/utils/ruoyi' import { parseTime } from "@/utils/ruoyi";
import Template from "@/views/cms/template"; import Template from "@/views/cms/template";
import {getStatusName} from "./util"; import { getStatusName } from "./util";
import ShowStepPriceItem from "@/views/ecw/productPrice/components/ShowStepPriceItem.vue"; import ShowStepPriceItem from "@/views/ecw/productPrice/components/ShowStepPriceItem.vue";
export default { export default {
name: "EcwProductpriceIndex", name: "EcwProductpriceIndex",
filters: {parseTime}, filters: { parseTime },
components: { components: {
ShowStepPriceItem, ShowStepPriceItem,
Template, Template,
DictTag DictTag,
}, },
data() { data() {
return { return {
...@@ -435,19 +873,20 @@ export default { ...@@ -435,19 +873,20 @@ export default {
// 非多个禁用 // 非多个禁用
multiple: true, multiple: true,
//特性列表 //特性列表
attrList:[], attrList: [],
typeList: [], typeList: [],
product: null, product: null,
countryList: [], //目的国
warehouseList: [], //目前仓
cityList: [], cityList: [],
/* startCityList: [], //始发地城市 /* startCityList: [], //始发地城市
destCityList: [], //目的地城市 */ destCityList: [], //目的地城市 */
routedList: [], //已开头路线列表 routedList: [], //已开头路线列表
currencyList: [], //货币列表 currencyList: [], //货币列表
unitList: [], //单位列表 unitList: [], //单位列表
channelList:[] , // 渠道 channelList: [], // 渠道
routeParams:{}, //路线搜索条件 routeParams: {}, //路线搜索条件
isUpdate: false, //更新操作 isUpdate: false, //更新操作
// 遮罩层 // 遮罩层
loading: true, loading: true,
// 导出遮罩层 // 导出遮罩层
...@@ -479,23 +918,74 @@ export default { ...@@ -479,23 +918,74 @@ export default {
clearanceVolumeUnit: null, clearanceVolumeUnit: null,
shippingChannelId: null, shippingChannelId: null,
status: null, status: null,
countryId:null,//国家
}, },
// 表单参数 // 表单参数
form: { form: {
typeId: null, typeId: null,
titleZh: null titleZh: null,
}, },
// 表单校验 // 表单校验
rules: { rules: {
typeId: [{ required: true, message: this.$t("产品类型不能为空"), trigger: "blur" }], typeId: [
titleZh: [{ required: true, message: this.$t("产品名称不能为空"), trigger: "blur" }], {
titleEn: [{ required: true, message: this.$t("英文名称不能为空"), trigger: "blur" }], required: true,
transportPrice: [{ required: true, message: this.$t("海运费不能为空"), trigger: "blur" }], message: this.$t("产品类型不能为空"),
clearancePrice: [{ required: true, message: this.$t("清关费不能为空"), trigger: "blur" }], trigger: "blur",
advanceStatus: [{ required: true, message: this.$t("是否预付不能为空"), trigger: "blur" }], },
containerLocation:[{ required: true, message: this.$t("货柜位置不能为空"), trigger: "blur" }], ],
square:[{ required: true, message: this.$t("方数不能为空"), trigger: "blur" }], titleZh: [
needBook:[{ required: true, message: this.$t("预约入仓不能为空"), trigger: "blur" }], {
required: true,
message: this.$t("产品名称不能为空"),
trigger: "blur",
},
],
titleEn: [
{
required: true,
message: this.$t("英文名称不能为空"),
trigger: "blur",
},
],
transportPrice: [
{
required: true,
message: this.$t("海运费不能为空"),
trigger: "blur",
},
],
clearancePrice: [
{
required: true,
message: this.$t("清关费不能为空"),
trigger: "blur",
},
],
advanceStatus: [
{
required: true,
message: this.$t("是否预付不能为空"),
trigger: "blur",
},
],
containerLocation: [
{
required: true,
message: this.$t("货柜位置不能为空"),
trigger: "blur",
},
],
square: [
{ required: true, message: this.$t("方数不能为空"), trigger: "blur" },
],
needBook: [
{
required: true,
message: this.$t("预约入仓不能为空"),
trigger: "blur",
},
],
}, },
lineList: [], lineList: [],
...@@ -505,7 +995,7 @@ export default { ...@@ -505,7 +995,7 @@ export default {
locationList: getDictDatas(DICT_TYPE.ECW_CONTAINER_LOCATION), locationList: getDictDatas(DICT_TYPE.ECW_CONTAINER_LOCATION),
// 查看更多阶梯价 // 查看更多阶梯价
showMoreStepPriceItem: null, showMoreStepPriceItem: null,
entryPath: null entryPath: null,
}; };
}, },
...@@ -513,112 +1003,117 @@ export default { ...@@ -513,112 +1003,117 @@ export default {
// 路径中的运输方式参数 // 路径中的运输方式参数
transportType() { transportType() {
// product-price-1_2的格式,如果没有三段则最后一段不是运输方式 // product-price-1_2的格式,如果没有三段则最后一段不是运输方式
return this.$route.path.split('-')[2] || ''; return this.$route.path.split("-")[2] || "";
}, },
// 路由中的标题 // 路由中的标题
routeName(){ routeName() {
return this.$route.name return this.$route.name;
}, },
// 类型,transportType是1和2(1_2用一个表示)表示海运,3和4表示空运 // 类型,transportType是1和2(1_2用一个表示)表示海运,3和4表示空运
type(){ type() {
// 如果没有则表示商品路线价格 // 如果没有则表示商品路线价格
if(!this.transportType){ if (!this.transportType) {
return null return null;
} }
return ['3','4'].indexOf(this.transportType) > -1 ? 'air' : 'sea' return ["3", "4"].indexOf(this.transportType) > -1 ? "air" : "sea";
}, },
// 商品名称 // 商品名称
productTitle(){ productTitle() {
if(!this.product){ if (!this.product) {
return '' return "";
} }
return this.product.titleZh return this.product.titleZh;
}, },
// 渠道用id做键值 // 渠道用id做键值
keyedChannel(){ keyedChannel() {
return arrryToKeyedObjectBy(this.channelList, 'channelId') return arrryToKeyedObjectBy(this.channelList, "channelId");
}, },
// 根据渠道id获取渠道名 // 根据渠道id获取渠道名
channelName(){ channelName() {
return id => { return (id) => {
return this.keyedChannel[id] ? this.keyedChannel[id].nameZh : null return this.keyedChannel[id] ? this.keyedChannel[id].nameZh : null;
} };
}, },
// 根据类型获取类型名称 // 根据类型获取类型名称
getTypeName() { getTypeName() {
return typeId => { return (typeId) => {
for(let index in this.typeList) { for (let index in this.typeList) {
let typeItem = this.typeList[index]; let typeItem = this.typeList[index];
if(typeItem.id == typeId) { if (typeItem.id == typeId) {
return this.$l(typeItem, 'title'); return this.$l(typeItem, "title");
}
} }
} }
};
}, },
// 根据状态获取状态名称 ,这个应该可以改成字典,目前接口缺少相关数据,待定 // 根据状态获取状态名称 ,这个应该可以改成字典,目前接口缺少相关数据,待定
statusName() { statusName() {
return getStatusName return getStatusName;
}, },
// 根据运输方式获取名称 // 根据运输方式获取名称
transportName() { transportName() {
return transportType => { return (transportType) => {
return this.getDictDataLabel(this.DICT_TYPE.ECW_TRANSPORT_TYPE, transportType) return this.getDictDataLabel(
} this.DICT_TYPE.ECW_TRANSPORT_TYPE,
transportType
);
};
}, },
// 显示币种符号 // 显示币种符号
getCurrencySymbol() { getCurrencySymbol() {
return currencyId => { return (currencyId) => {
for(let index in this.currencyList) { for (let index in this.currencyList) {
let currecyItem = this.currencyList[index]; let currecyItem = this.currencyList[index];
if(currecyItem.id == currencyId) { if (currecyItem.id == currencyId) {
return currecyItem.fuhao; return currecyItem.fuhao;
} }
} }
} };
}, },
// 显示币种名称 // 显示币种名称
getCurrencyTitle() { getCurrencyTitle() {
return currencyId => { return (currencyId) => {
for(let index in this.currencyList) { for (let index in this.currencyList) {
let currecyItem = this.currencyList[index]; let currecyItem = this.currencyList[index];
if(currecyItem.id == currencyId) { if (currecyItem.id == currencyId) {
return this.$l(currecyItem, 'title'); return this.$l(currecyItem, "title");
}
} }
} }
};
}, },
getUnitTitle() { getUnitTitle() {
return unitId => { return (unitId) => {
for(let index in this.unitList) { for (let index in this.unitList) {
let unitItem = this.unitList[index]; let unitItem = this.unitList[index];
if(unitItem.id == unitId) { if (unitItem.id == unitId) {
return this.$l(unitItem, 'title'); return this.$l(unitItem, "title");
}
} }
} }
};
}, },
startCityList(){ startCityList() {
return this.cityList.filter(item => item.type == 2 || item.type == 3) //字典:贸易类型字典region_trade_type,0非进出口,1进口,2出口,3进出口
return this.cityList.filter((item) => item.type == 2 || item.type == 3);
}, },
destCityList(){ destCityList() {
return this.cityList.filter(item => item.type == 1 || item.type == 3) //字典:贸易类型字典region_trade_type,0非进出口,1进口,2出口,3进出口
return this.cityList.filter((item) => item.type == 1 || item.type == 3);
}, },
currencyMap(){ currencyMap() {
let map = {} let map = {};
this.currencyList.forEach(item => { this.currencyList.forEach((item) => {
map[item.id] = this.$l(item, 'title') map[item.id] = this.$l(item, "title");
}) });
return map return map;
}, },
unitMap(){ unitMap() {
let map = {} let map = {};
this.unitList.forEach(item => { this.unitList.forEach((item) => {
map[item.id] = this.$l(item, 'title') map[item.id] = this.$l(item, "title");
}) });
return map return map;
}, },
}, },
activated() { activated() {
...@@ -635,84 +1130,91 @@ export default { ...@@ -635,84 +1130,91 @@ export default {
} }
this.handleQuery() this.handleQuery()
*/ */
if(this.$route.query.product_type){ if (this.$route.query.product_type) {
this.$set(this.queryParams, 'typeId', +this.$route.query.product_type); this.$set(this.queryParams, "typeId", +this.$route.query.product_type);
} }
if(this.$route.query.transportType){ if (this.$route.query.transportType) {
this.$set(this.queryParams, 'transportType', +this.$route.query.transportType); this.$set(
this.queryParams,
"transportType",
+this.$route.query.transportType
);
} }
// 指定产品获取产品信息 // 指定产品获取产品信息
if(this.$route.query.product_id){ if (this.$route.query.product_id) {
this.$set(this.queryParams, 'productId', +this.$route.query.product_id); this.$set(this.queryParams, "productId", +this.$route.query.product_id);
getProduct(this.$route.query.product_id).then(res => { getProduct(this.$route.query.product_id).then((res) => {
this.product = res.data this.product = res.data;
}) });
} else {
}else {
if (this.transportType) { if (this.transportType) {
// 如果指定了单个的运输方式则赋值 // 如果指定了单个的运输方式则赋值
if (this.transportType.split('_').length == 1) { if (this.transportType.split("_").length == 1) {
this.$set(this.queryParams, 'transportType', +this.transportType) this.$set(this.queryParams, "transportType", +this.transportType);
} }
} }
} }
}, },
watch:{ watch: {
'$route.query.product_id'(){ "$route.query.product_id"() {
// if(!this.$route.query.product_id){ // if(!this.$route.query.product_id){
// return this.product = null // return this.product = null
// } // }
// 价格列表 跟 商品的价格列表,有时候商品价格列表的路由变动会导致价格列表也执行此处代码,所以做一个判断排除 // 价格列表 跟 商品的价格列表,有时候商品价格列表的路由变动会导致价格列表也执行此处代码,所以做一个判断排除
// https://zentao.test.jdshangmen.com/bug-view-4928.html // https://zentao.test.jdshangmen.com/bug-view-4928.html
if(this.$route.path != this.entryPath) return if (this.$route.path != this.entryPath) return;
let productId = this.product?.id let productId = this.product?.id;
if(this.$route.name === 'ProductPrice'){ if (this.$route.name === "ProductPrice") {
if(this.$route.query.product_id != productId){ if (this.$route.query.product_id != productId) {
this.queryParams = { this.queryParams = {
pageNo: 1, pageNo: 1,
pageSize: 10, pageSize: 10,
productId: this.$route.query.product_id, productId: this.$route.query.product_id,
typeId: this.$route.query.product_type, typeId: this.$route.query.product_type,
transportType:this.$route.query.transportType transportType: this.$route.query.transportType,
};
}
} }
getProduct(this.$route.query.product_id).then(res => { getProduct(this.$route.query.product_id).then((res) => {
this.product = res.data this.product = res.data;
}) });
this.getList(); this.getList();
} }
} },
}, },
created() { created() {
this.entryPath = this.$route.path this.entryPath = this.$route.path;
if(this.$route.query.product_type){ if (this.$route.query.product_type) {
this.$set(this.queryParams, 'typeId', +this.$route.query.product_type); this.$set(this.queryParams, "typeId", +this.$route.query.product_type);
} }
if(this.$route.query.transportType){ if (this.$route.query.transportType) {
this.$set(this.queryParams, 'transportType', +this.$route.query.transportType); this.$set(
this.queryParams,
"transportType",
+this.$route.query.transportType
);
} }
// 指定产品获取产品信息 // 指定产品获取产品信息
if(this.$route.query.product_id){ if (this.$route.query.product_id) {
this.$set(this.queryParams, 'productId', +this.$route.query.product_id); this.$set(this.queryParams, "productId", +this.$route.query.product_id);
getProduct(this.$route.query.product_id).then(res => { getProduct(this.$route.query.product_id).then((res) => {
this.product = res.data this.product = res.data;
}) });
}else{ } else {
if(this.transportType) { if (this.transportType) {
// 如果指定了单个的运输方式则赋值 // 如果指定了单个的运输方式则赋值
if (this.transportType.split('_').length == 1) { if (this.transportType.split("_").length == 1) {
this.$set(this.queryParams, 'transportType', +this.transportType) this.$set(this.queryParams, "transportType", +this.transportType);
} }
} }
this.getAttrList(); this.getAttrList();
} }
//获取城市列表 //获取城市列表
this.getAllCityList() this.getCountryList();
this.getChannelList() this.getAllCityList();
this.getTypeList() this.getChannelList();
this.getTypeList();
this.getAttrList(); this.getAttrList();
...@@ -723,56 +1225,60 @@ export default { ...@@ -723,56 +1225,60 @@ export default {
this.$nextTick(() => { this.$nextTick(() => {
this.getList(); this.getList();
}) });
}, },
methods: { methods: {
getChannelList(){ /* 国家 */
getAllChannelList().then(res => this.channelList = res.data) getCountryList() {
getListTree({ treeType: 1 }).then((response) => {
this.countryList = response.data;
});
},
//渠道
getChannelList() {
getAllChannelList().then((res) => (this.channelList = res.data));
}, },
/** 获取产品属性列表 */ /** 获取产品属性列表 */
getAttrList() { getAttrList() {
getProductAttrList().then(response => { getProductAttrList().then((response) => {
this.attrList = response.data; this.attrList = response.data;
}) });
}, },
/** 获取产品类型列表 */ /** 获取产品类型列表 */
getTypeList() { getTypeList() {
getProductTypeList().then(response => { getProductTypeList().then((response) => {
this.typeList = response.data; this.typeList = response.data;
}) });
}, },
/**获取所有城市列表 */ /**获取所有城市列表 */
getAllCityList() { getAllCityList() {
getTradeCityList({}).then(response => { getTradeCityList({}).then((response) => {
this.cityList = response.data; this.cityList = response.data;
}) });
}, },
/**获取已开通路线列表 */ /**获取已开通路线列表 */
getOpenedRouterList() { getOpenedRouterList() {
openedRouterList(this.routeParams).then(response => { openedRouterList(this.routeParams).then((response) => {
this.routedList = response.data; this.routedList = response.data;
this.setDefaultSelect(); this.setDefaultSelect();
}) });
}, },
/**获取所有货币列表 */ /**获取所有货币列表 */
requestCurrencyList() { requestCurrencyList() {
getCurrencyList().then(response => { getCurrencyList().then((response) => {
this.currencyList = response.data; this.currencyList = response.data;
}) });
}, },
/**获取所有单位列表 */ /**获取所有单位列表 */
requestUnitList() { requestUnitList() {
getUnitList().then(response => { getUnitList().then((response) => {
this.unitList = response.data; this.unitList = response.data;
}) });
}, },
/*handleSelectionChange(val) { /*handleSelectionChange(val) {
...@@ -798,29 +1304,34 @@ export default { ...@@ -798,29 +1304,34 @@ export default {
}, },
handleStatusChange(row) { handleStatusChange(row) {
updateProductPrice(row).then(() => { updateProductPrice(row)
.then(() => {
this.$modal.msgSuccess(this.$t("修改成功")); this.$modal.msgSuccess(this.$t("修改成功"));
}).catch(function() { })
row.auditStatus = row.auditStatus === AuditStatusEnum.PASS ? AuditStatusEnum.NOT_PASS : AuditStatusEnum.PASS; .catch(function () {
row.auditStatus =
row.auditStatus === AuditStatusEnum.PASS
? AuditStatusEnum.NOT_PASS
: AuditStatusEnum.PASS;
}); });
}, },
/** 查询列表 */ /** 查询列表 */
getList() { getList() {
this.loading = true; this.loading = true;
console.log(this.queryParams,'this.queryParams') console.log(this.queryParams, "this.queryParams");
// 处理查询参数 // 处理查询参数
let params = {...this.queryParams}; let params = { ...this.queryParams };
if(this.type == 'sea'){ if (this.type == "sea") {
params.transportType = 1 params.transportType = 1;
} }
if(this.type == 'air'){ if (this.type == "air") {
params.transportType = 3 params.transportType = 3;
} }
this.addBeginAndEndTime(params, this.dateRangeCreateTime, 'createTime'); this.addBeginAndEndTime(params, this.dateRangeCreateTime, "createTime");
// 执行查询 // 执行查询
console.log(params,'params') console.log(params, "params");
getProductPricePage(params).then(response => { getProductPricePage(params).then((response) => {
this.list = response.data.list; this.list = response.data.list;
this.total = response.data.total; this.total = response.data.total;
this.loading = false; this.loading = false;
...@@ -850,11 +1361,11 @@ export default { ...@@ -850,11 +1361,11 @@ export default {
/** 搜索按钮操作 */ /** 搜索按钮操作 */
handleQuery() { handleQuery() {
this.queryParams.pageNo = 1; this.queryParams.pageNo = 1;
this.queryParams.setPrice = undefined this.queryParams.setPrice = undefined;
this.queryParams.blacklist = undefined this.queryParams.blacklist = undefined;
if(this.queryParams.combStatus){ if (this.queryParams.combStatus) {
let tmp = this.queryParams.combStatus.split('_') let tmp = this.queryParams.combStatus.split("_");
this.queryParams[tmp[0]] = tmp[1] this.queryParams[tmp[0]] = tmp[1];
} }
this.getList(); this.getList();
}, },
...@@ -866,55 +1377,64 @@ export default { ...@@ -866,55 +1377,64 @@ export default {
}, },
/** 新增按钮操作 */ /** 新增按钮操作 */
handleAdd(type) { handleAdd(type) {
return this.$router.push(`../../lineProject/product-price/edit-${type}?` + (new URLSearchParams(this.$route.query)).toString()) return this.$router.push(
`../../lineProject/product-price/edit-${type}?` +
new URLSearchParams(this.$route.query).toString()
);
}, },
// 批量修改单个商品的价格(一条或者多条,后者全部路线) // 批量修改单个商品的价格(一条或者多条,后者全部路线)
batchSetSingleProductPrice(type){ batchSetSingleProductPrice(type) {
this.$router.push(`../../lineProject/product-price/edit-${type}?action=batchUpdate&type=${type}&product_id=${this.$route.query.product_id}&ids=${this.ids}`) this.$router.push(
`../../lineProject/product-price/edit-${type}?action=batchUpdate&type=${type}&product_id=${this.$route.query.product_id}&ids=${this.ids}`
);
}, },
// 批量设置路线 // 批量设置路线
handleBatchEdit(type) { handleBatchEdit(type) {
this.$router.push('../../lineProject/batch-edit-' + type) this.$router.push("../../lineProject/batch-edit-" + type);
}, },
/** 修改按钮操作 */ /** 修改按钮操作 */
handleUpdate(row, readonly) { handleUpdate(row, readonly) {
let transportType = row.warehouseLineDO.transportType let transportType = row.warehouseLineDO.transportType;
let type = transportType == 3 || transportType == 4 ? 'air' : 'sea' let type = transportType == 3 || transportType == 4 ? "air" : "sea";
let url = `../../lineProject/product-price/edit-${type}?action=update&id=${row.id}` let url = `../../lineProject/product-price/edit-${type}?action=update&id=${row.id}`;
if(readonly)url += '&readonly=1' if (readonly) url += "&readonly=1";
return this.$router.push(url) return this.$router.push(url);
}, },
updateStatus(row, type) { updateStatus(row, type) {
if(type == 'blacklist') { if (type == "blacklist") {
row.blacklist=row.blacklist == 0 ? 1 : 0; row.blacklist = row.blacklist == 0 ? 1 : 0;
} else if(type == 'auditStatus') { } else if (type == "auditStatus") {
row.auditStatus=row.auditStatus === AuditStatusEnum.PASS ? AuditStatusEnum.NOT_PASS : AuditStatusEnum.PASS; row.auditStatus =
row.auditStatus === AuditStatusEnum.PASS
? AuditStatusEnum.NOT_PASS
: AuditStatusEnum.PASS;
} }
updateProductPrice(row).then(() => { updateProductPrice(row)
.then(() => {
this.$modal.msgSuccess(this.$t("修改成功")); this.$modal.msgSuccess(this.$t("修改成功"));
}).catch(function() { })
if(statusType == 'blacklist') { .catch(function () {
if (statusType == "blacklist") {
row.blacklist = row.blacklist === 1 ? 0 : 1; row.blacklist = row.blacklist === 1 ? 0 : 1;
} else { } else {
row.auditStatus = row.auditStatus === AuditStatusEnum.PASS ? AuditStatusEnum.NOT_PASS : AuditStatusEnum.PASS; row.auditStatus =
row.auditStatus === AuditStatusEnum.PASS
? AuditStatusEnum.NOT_PASS
: AuditStatusEnum.PASS;
} }
}); });
}, },
checkSelectable() { checkSelectable() {
return !this.isUpdate; return !this.isUpdate;
}, },
setDefaultSelect() { setDefaultSelect() {
let vm = this; let vm = this;
setTimeout(() => { setTimeout(() => {
// 修改线路价格,选中已经选择的 // 修改线路价格,选中已经选择的
if(vm.isUpdate && vm.routedList && vm.routedList.length) { if (vm.isUpdate && vm.routedList && vm.routedList.length) {
vm.$refs.routeTable.toggleRowSelection(vm.routedList[0]); vm.$refs.routeTable.toggleRowSelection(vm.routedList[0]);
} }
}, 300); }, 300);
...@@ -960,77 +1480,90 @@ export default { ...@@ -960,77 +1480,90 @@ export default {
/** 删除按钮操作 */ /** 删除按钮操作 */
handleDelete(row) { handleDelete(row) {
const id = row.id; const id = row.id;
this.$modal.confirm(this.$t('是否确认删除产品价格编号为{id}的数据项?', {id})).then(function() { this.$modal
.confirm(this.$t("是否确认删除产品价格编号为{id}的数据项?", { id }))
.then(function () {
return deleteProductPrice(id); return deleteProductPrice(id);
}).then(() => { })
.then(() => {
this.getList(); this.getList();
this.$modal.msgSuccess(this.$t("删除成功")); this.$modal.msgSuccess(this.$t("删除成功"));
}).catch(() => {}); })
.catch(() => {});
}, },
/** 导出按钮操作 */ /** 导出按钮操作 */
handleExport() { handleExport() {
// 处理查询参数 // 处理查询参数
let params = {...this.queryParams}; let params = { ...this.queryParams };
params.pageNo = undefined; params.pageNo = undefined;
params.pageSize = undefined; params.pageSize = undefined;
if(this.type == 'sea'){ if (this.type == "sea") {
params.transportType = 1 params.transportType = 1;
} }
if(this.type == 'air'){ if (this.type == "air") {
params.transportType = 3 params.transportType = 3;
} }
this.addBeginAndEndTime(params, this.dateRangeCreateTime, 'createTime'); this.addBeginAndEndTime(params, this.dateRangeCreateTime, "createTime");
this.$modal.confirm(this.$t('是否确认导出所有数据项?')).then(() => { this.$modal
.confirm(this.$t("是否确认导出所有数据项?"))
.then(() => {
this.exportLoading = true; this.exportLoading = true;
return exportProductPriceExcel(params); return exportProductPriceExcel(params);
}).then(response => { })
.then((response) => {
// this.$download.excel(response, '路线价格.xlsx'); // this.$download.excel(response, '路线价格.xlsx');
this.exportLoading = false; this.exportLoading = false;
this.$message.success(this.$t('已加入导出队列,请稍后在下载日志中下载')) this.$message.success(
}).catch(() => { this.$t("已加入导出队列,请稍后在下载日志中下载")
);
})
.catch(() => {
this.exportLoading = false; this.exportLoading = false;
}); });
}, },
// 表格多选 // 表格多选
handleSelectionChange(selection) { handleSelectionChange(selection) {
this.ids = selection.map(item => item.id) this.ids = selection.map((item) => item.id);
this.single = selection.length !== 1 this.single = selection.length !== 1;
this.multiple = !selection.length this.multiple = !selection.length;
},
batchBlock(){
batchBlock({ids: this.ids.join(',')}).then(res => {
this.$message.success(res.msg || this.$t('操作成功'))
this.getList()
})
}, },
batchOff(){ batchBlock() {
batchOff({ids: this.ids.join(',')}).then(res => { batchBlock({ ids: this.ids.join(",") }).then((res) => {
this.$message.success(res.msg || this.$t('操作成功')) this.$message.success(res.msg || this.$t("操作成功"));
this.getList() this.getList();
}) });
},
batchOff() {
batchOff({ ids: this.ids.join(",") }).then((res) => {
this.$message.success(res.msg || this.$t("操作成功"));
this.getList();
});
}, },
// 设置,取消単询 // 设置,取消単询
setOrderInquiry(row, needOrderInquiry){ setOrderInquiry(row, needOrderInquiry) {
row.needOrderInquiry = needOrderInquiry row.needOrderInquiry = needOrderInquiry;
updateOrderInquiry(row).then(res => { updateOrderInquiry(row).then((res) => {
this.$message.success(res.msg || this.$t('操作成功')) this.$message.success(res.msg || this.$t("操作成功"));
this.getList() this.getList();
}) });
}, },
// 复制模板 // 复制模板
copyTemplate(row){ copyTemplate(row) {
// 跳转到批量设置页面,并填充数据 // 跳转到批量设置页面,并填充数据
let transportType = row.warehouseLineDO.transportType let transportType = row.warehouseLineDO.transportType;
this.$router.push(`../../lineProject/batch-edit-${transportType == 3 || transportType == 4 ? 'air' : 'sea'}?templateId=${row.id}`) this.$router.push(
`../../lineProject/batch-edit-${
transportType == 3 || transportType == 4 ? "air" : "sea"
}?templateId=${row.id}`
);
}, },
// 关闭更多阶梯价格窗口 // 关闭更多阶梯价格窗口
closeMoreStepPrice(){ closeMoreStepPrice() {
this.showMoreStepPriceItem=null this.showMoreStepPriceItem = null;
} },
},
}
}; };
</script> </script>
<template> <template>
<div class="app-container"> <div class="app-container">
<doc-alert :title="$t('代码生成')" url="https://doc.iocoder.cn/new-feature/" />
<!-- 操作工作栏 --> <!-- 操作工作栏 -->
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px"> <el-form
:model="queryParams"
ref="queryForm"
size="small"
:inline="true"
v-show="showSearch"
label-width="68px"
>
<el-form-item :label="$t('表名称')" prop="tableName"> <el-form-item :label="$t('表名称')" prop="tableName">
<el-input v-model="queryParams.tableName" :placeholder="$t('请输入表名称')" clearable <el-input
@keyup.enter.native="handleQuery"/> v-model="queryParams.tableName"
:placeholder="$t('请输入表名称')"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item> </el-form-item>
<el-form-item :label="$t('表描述')" prop="tableComment"> <el-form-item :label="$t('表描述')" prop="tableComment">
<el-input v-model="queryParams.tableComment" :placeholder="$t('请输入表描述')" clearable <el-input
@keyup.enter.native="handleQuery"/> v-model="queryParams.tableComment"
:placeholder="$t('请输入表描述')"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item> </el-form-item>
<el-form-item :label="$t('创建时间')"> <el-form-item :label="$t('创建时间')">
<el-date-picker v-model="dateRange" style="width: 240px" value-format="yyyy-MM-dd" type="daterange" <el-date-picker
range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"/> v-model="dateRange"
style="width: 240px"
value-format="yyyy-MM-dd"
type="daterange"
range-separator="-"
start-placeholder="开始日期"
end-placeholder="结束日期"
/>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" icon="el-icon-search" @click="handleQuery">{{ $t('搜索') }}</el-button> <el-button type="primary" icon="el-icon-search" @click="handleQuery">{{
<el-button icon="el-icon-refresh" @click="resetQuery">{{ $t('重置') }}</el-button> $t("搜索")
}}</el-button>
<el-button icon="el-icon-refresh" @click="resetQuery">{{
$t("重置")
}}</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
<!-- 操作工作栏 --> <!-- 操作工作栏 -->
<el-row :gutter="10" class="mb8"> <el-row :gutter="10" class="mb8">
<el-col :span="1.5"> <el-col :span="1.5">
<el-button type="info" plain icon="el-icon-upload" size="mini" @click="openImportTable" <el-button
v-hasPermi="['infra:codegen:create']">基于 DB 导入</el-button> type="info"
<el-button type="info" plain icon="el-icon-upload" size="mini" @click="openImportSQL" plain
v-hasPermi="['infra:codegen:create']">基于 SQL 导入</el-button> icon="el-icon-upload"
size="mini"
@click="openImportTable"
v-hasPermi="['infra:codegen:create']"
>基于 DB 导入</el-button
>
<el-button
type="info"
plain
icon="el-icon-upload"
size="mini"
@click="openImportSQL"
v-hasPermi="['infra:codegen:create']"
>基于 SQL 导入</el-button
>
</el-col> </el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar> <right-toolbar
:showSearch.sync="showSearch"
@queryTable="getList"
></right-toolbar>
</el-row> </el-row>
<!-- 列表 --> <!-- 列表 -->
<el-table v-loading="loading" :data="tableList"> <el-table v-loading="loading" :data="tableList">
<el-table-column :label="$t('表名称')" align="center" prop="tableName" :show-overflow-tooltip="true" width="200"/> <el-table-column
<el-table-column :label="$t('表描述')" align="center" prop="tableComment" :show-overflow-tooltip="true" width="120"/> :label="$t('表名称')"
<el-table-column :label="$t('实体')" align="center" prop="className" :show-overflow-tooltip="true" width="200"/> align="center"
<el-table-column :label="$t('创建时间')" align="center" prop="createTime" width="160"> prop="tableName"
:show-overflow-tooltip="true"
width="200"
/>
<el-table-column
:label="$t('表描述')"
align="center"
prop="tableComment"
:show-overflow-tooltip="true"
width="120"
/>
<el-table-column
:label="$t('实体')"
align="center"
prop="className"
:show-overflow-tooltip="true"
width="200"
/>
<el-table-column
:label="$t('创建时间')"
align="center"
prop="createTime"
width="160"
>
<template slot-scope="scope"> <template slot-scope="scope">
<span>{{ parseTime(scope.row.createTime) }}</span> <span>{{ parseTime(scope.row.createTime) }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column :label="$t('更新时间')" align="center" prop="createTime" width="160"> <el-table-column
:label="$t('更新时间')"
align="center"
prop="createTime"
width="160"
>
<template slot-scope="scope"> <template slot-scope="scope">
<span>{{ parseTime(scope.row.updateTime) }}</span> <span>{{ parseTime(scope.row.updateTime) }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column :label="$t('操作')" align="center" class-name="small-padding fixed-width"> <el-table-column
:label="$t('操作')"
align="center"
class-name="small-padding fixed-width"
>
<template slot-scope="scope"> <template slot-scope="scope">
<el-button type="text" size="small" icon="el-icon-view" @click="handlePreview(scope.row)" v-hasPermi="['infra:codegen:preview']">{{ $t('预览') }}</el-button> <el-button
<el-button type="text" size="small" icon="el-icon-edit" @click="handleEditTable(scope.row)" v-hasPermi="['infra:codegen:update']">{{ $t('编辑') }}</el-button> type="text"
<el-button type="text" size="small" icon="el-icon-delete" @click="handleDelete(scope.row)" v-hasPermi="['infra:codegen:delete']">{{ $t('删除') }}</el-button> size="small"
<el-button type="text" size="small" icon="el-icon-refresh" @click="handleSynchDb(scope.row)" v-hasPermi="['infra:codegen:update']">{{ $t('同步') }}</el-button> icon="el-icon-view"
<el-button type="text" size="small" icon="el-icon-download" @click="handleGenTable(scope.row)" v-hasPermi="['infra:codegen:download']">{{ $t('生成代码') }}</el-button> @click="handlePreview(scope.row)"
<el-button type="text" size="small" icon="el-icon-download" @click="generateValidateCode(scope.row)">{{ $t('生成验证配置') }}</el-button> v-hasPermi="['infra:codegen:preview']"
>{{ $t("预览") }}</el-button
>
<el-button
type="text"
size="small"
icon="el-icon-edit"
@click="handleEditTable(scope.row)"
v-hasPermi="['infra:codegen:update']"
>{{ $t("编辑") }}</el-button
>
<el-button
type="text"
size="small"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['infra:codegen:delete']"
>{{ $t("删除") }}</el-button
>
<el-button
type="text"
size="small"
icon="el-icon-refresh"
@click="handleSynchDb(scope.row)"
v-hasPermi="['infra:codegen:update']"
>{{ $t("同步") }}</el-button
>
<el-button
type="text"
size="small"
icon="el-icon-download"
@click="handleGenTable(scope.row)"
v-hasPermi="['infra:codegen:download']"
>{{ $t("生成代码") }}</el-button
>
<el-button
type="text"
size="small"
icon="el-icon-download"
@click="generateValidateCode(scope.row)"
>{{ $t("生成验证配置") }}</el-button
>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize" @pagination="getList"/> <pagination
v-show="total > 0"
:total="total"
:page.sync="queryParams.pageNo"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 预览界面 --> <!-- 预览界面 -->
<el-dialog :title="preview.title" :visible.sync="preview.open" width="90%" top="5vh" append-to-body class="scrollbar"> <el-dialog
:title="preview.title"
:visible.sync="preview.open"
width="90%"
top="5vh"
append-to-body
class="scrollbar"
>
<el-row> <el-row>
<el-col :span="7"> <el-col :span="7">
<el-tree :data="preview.fileTree" :expand-on-click-node="false" default-expand-all highlight-current <el-tree
@node-click="handleNodeClick"/> :data="preview.fileTree"
:expand-on-click-node="false"
default-expand-all
highlight-current
@node-click="handleNodeClick"
/>
</el-col> </el-col>
<el-col :span="17"> <el-col :span="17">
<el-tabs v-model="preview.activeName"> <el-tabs v-model="preview.activeName">
<el-tab-pane v-for="item in preview.data" :label="item.filePath.substring(item.filePath.lastIndexOf('/') + 1)" <el-tab-pane
:name="item.filePath" :key="item.filePath"> v-for="item in preview.data"
<el-link :underline="false" icon="el-icon-document-copy" v-clipboard:copy="item.code" v-clipboard:success="clipboardSuccess" style="float:right">{{ $t('复制') }}</el-link> :label="
item.filePath.substring(item.filePath.lastIndexOf('/') + 1)
"
:name="item.filePath"
:key="item.filePath"
>
<el-link
:underline="false"
icon="el-icon-document-copy"
v-clipboard:copy="item.code"
v-clipboard:success="clipboardSuccess"
style="float: right"
>{{ $t("复制") }}</el-link
>
<pre><code class="hljs" v-html="highlightedCode(item)"></code></pre> <pre><code class="hljs" v-html="highlightedCode(item)"></code></pre>
</el-tab-pane> </el-tab-pane>
</el-tabs> </el-tabs>
...@@ -83,27 +229,53 @@ ...@@ -83,27 +229,53 @@
<import-table ref="import" @ok="handleQuery" /> <import-table ref="import" @ok="handleQuery" />
<!-- 基于 SQL 导入 --> <!-- 基于 SQL 导入 -->
<el-dialog :title="importSQL.title" :visible.sync="importSQL.open" width="800px" append-to-body> <el-dialog
<el-form ref="importSQLForm" :model="importSQL.form" :rules="importSQL.rules" label-width="120px"> :title="importSQL.title"
:visible.sync="importSQL.open"
width="800px"
append-to-body
>
<el-form
ref="importSQLForm"
:model="importSQL.form"
:rules="importSQL.rules"
label-width="120px"
>
<el-row> <el-row>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="建表 SQL 语句" prop="sql"> <el-form-item label="建表 SQL 语句" prop="sql">
<el-input v-model="importSQL.form.sql" type="textarea" rows="30" style="width: 650px;" placeholder="请输入建 SQL 语句" /> <el-input
v-model="importSQL.form.sql"
type="textarea"
rows="30"
style="width: 650px"
placeholder="请输入建 SQL 语句"
/>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
</el-form> </el-form>
<div slot="footer" class="dialog-footer"> <div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitImportSQLForm">{{ $t('确 定') }}</el-button> <el-button type="primary" @click="submitImportSQLForm">{{
<el-button @click="cancel">{{ $t('取 消') }}</el-button> $t("确 定")
}}</el-button>
<el-button @click="cancel">{{ $t("取 消") }}</el-button>
</div> </div>
</el-dialog> </el-dialog>
</div> </div>
</template> </template>
<script> <script>
import {getCodegenDetail, getCodegenTablePage, previewCodegen, downloadCodegen, deleteCodegen, import {
syncCodegenFromDB, syncCodegenFromSQL, createCodegenListFromSQL } from "@/api/infra/codegen"; getCodegenDetail,
getCodegenTablePage,
previewCodegen,
downloadCodegen,
deleteCodegen,
syncCodegenFromDB,
syncCodegenFromSQL,
createCodegenListFromSQL,
} from "@/api/infra/codegen";
import importTable from "./importTable"; import importTable from "./importTable";
// 代码高亮插件 // 代码高亮插件
...@@ -113,7 +285,10 @@ hljs.registerLanguage("java", require("highlight.js/lib/languages/java")); ...@@ -113,7 +285,10 @@ hljs.registerLanguage("java", require("highlight.js/lib/languages/java"));
hljs.registerLanguage("xml", require("highlight.js/lib/languages/xml")); hljs.registerLanguage("xml", require("highlight.js/lib/languages/xml"));
hljs.registerLanguage("html", require("highlight.js/lib/languages/xml")); hljs.registerLanguage("html", require("highlight.js/lib/languages/xml"));
hljs.registerLanguage("vue", require("highlight.js/lib/languages/xml")); hljs.registerLanguage("vue", require("highlight.js/lib/languages/xml"));
hljs.registerLanguage("javascript", require("highlight.js/lib/languages/javascript")); hljs.registerLanguage(
"javascript",
require("highlight.js/lib/languages/javascript")
);
hljs.registerLanguage("sql", require("highlight.js/lib/languages/sql")); hljs.registerLanguage("sql", require("highlight.js/lib/languages/sql"));
export default { export default {
...@@ -140,7 +315,7 @@ export default { ...@@ -140,7 +315,7 @@ export default {
pageNo: 1, pageNo: 1,
pageSize: 10, pageSize: 10,
tableName: undefined, tableName: undefined,
tableComment: undefined tableComment: undefined,
}, },
// 预览参数 // 预览参数
preview: { preview: {
...@@ -154,13 +329,11 @@ export default { ...@@ -154,13 +329,11 @@ export default {
importSQL: { importSQL: {
open: false, open: false,
title: "", title: "",
form: { form: {},
},
rules: { rules: {
sql: [{ required: true, message: "SQL 不能为空", trigger: "blur" }] sql: [{ required: true, message: "SQL 不能为空", trigger: "blur" }],
} },
} },
}; };
}, },
created() { created() {
...@@ -177,15 +350,20 @@ export default { ...@@ -177,15 +350,20 @@ export default {
/** 查询表集合 */ /** 查询表集合 */
getList() { getList() {
this.loading = true; this.loading = true;
getCodegenTablePage(this.addDateRange(this.queryParams, [ getCodegenTablePage(
this.dateRange[0] ? this.dateRange[0] + ' 00:00:00' : undefined, this.addDateRange(
this.dateRange[1] ? this.dateRange[1] + ' 23:59:59' : undefined, this.queryParams,
], 'CreateTime')).then(response => { [
this.dateRange[0] ? this.dateRange[0] + " 00:00:00" : undefined,
this.dateRange[1] ? this.dateRange[1] + " 23:59:59" : undefined,
],
"CreateTime"
)
).then((response) => {
this.tableList = response.data.list; this.tableList = response.data.list;
this.total = response.data.total; this.total = response.data.total;
this.loading = false; this.loading = false;
} });
);
}, },
/** 搜索按钮操作 */ /** 搜索按钮操作 */
handleQuery() { handleQuery() {
...@@ -194,9 +372,9 @@ export default { ...@@ -194,9 +372,9 @@ export default {
}, },
/** 生成代码操作 */ /** 生成代码操作 */
handleGenTable(row) { handleGenTable(row) {
downloadCodegen(row.id).then(response => { downloadCodegen(row.id).then((response) => {
this.$download.zip(response, 'codegen-' + row.tableName + '.zip'); this.$download.zip(response, "codegen-" + row.tableName + ".zip");
}) });
}, },
/** 同步数据库操作 */ /** 同步数据库操作 */
handleSynchDb(row) { handleSynchDb(row) {
...@@ -208,11 +386,15 @@ export default { ...@@ -208,11 +386,15 @@ export default {
} }
// 基于 DB 同步 // 基于 DB 同步
const tableName = row.tableName; const tableName = row.tableName;
this.$modal.confirm('确认要强制同步"' + tableName + '"表结构吗?').then(function() { this.$modal
.confirm('确认要强制同步"' + tableName + '"表结构吗?')
.then(function () {
return syncCodegenFromDB(row.id); return syncCodegenFromDB(row.id);
}).then(() => { })
.then(() => {
this.$modal.msgSuccess("同步成功"); this.$modal.msgSuccess("同步成功");
}).catch(() => {}); })
.catch(() => {});
}, },
/** 打开导入表弹窗 */ /** 打开导入表弹窗 */
openImportTable() { openImportTable() {
...@@ -230,11 +412,16 @@ export default { ...@@ -230,11 +412,16 @@ export default {
}, },
/** 预览按钮 */ /** 预览按钮 */
handlePreview(row) { handlePreview(row) {
previewCodegen(row.id).then(response => { previewCodegen(row.id).then((response) => {
this.preview.data = response.data; this.preview.data = response.data;
let files = this.handleFiles(response.data); let files = this.handleFiles(response.data);
this.preview.fileTree = this.handleTree(files, "id", "parentId", "children", this.preview.fileTree = this.handleTree(
"/"); // "/" 为根节点 files,
"id",
"parentId",
"children",
"/"
); // "/" 为根节点
// console.log(this.preview.fileTree) // console.log(this.preview.fileTree)
this.preview.activeName = response.data[0].filePath; this.preview.activeName = response.data[0].filePath;
this.preview.open = true; this.preview.open = true;
...@@ -244,12 +431,14 @@ export default { ...@@ -244,12 +431,14 @@ export default {
highlightedCode(item) { highlightedCode(item) {
// const vmName = key.substring(key.lastIndexOf("/") + 1, key.indexOf(".vm")); // const vmName = key.substring(key.lastIndexOf("/") + 1, key.indexOf(".vm"));
// var language = vmName.substring(vmName.indexOf(".") + 1, vmName.length); // var language = vmName.substring(vmName.indexOf(".") + 1, vmName.length);
var language = item.filePath.substring(item.filePath.lastIndexOf(".") + 1); var language = item.filePath.substring(
item.filePath.lastIndexOf(".") + 1
);
const result = hljs.highlight(language, item.code || "", true); const result = hljs.highlight(language, item.code || "", true);
return result.value || '&nbsp;'; return result.value || "&nbsp;";
}, },
/** 复制代码成功 */ /** 复制代码成功 */
clipboardSuccess(){ clipboardSuccess() {
this.$modal.msgSuccess("复制成功"); this.$modal.msgSuccess("复制成功");
}, },
/** 生成 files 目录 **/ /** 生成 files 目录 **/
...@@ -258,14 +447,14 @@ export default { ...@@ -258,14 +447,14 @@ export default {
let files = []; let files = [];
// 遍历每个元素 // 遍历每个元素
for (const data of datas) { for (const data of datas) {
let paths = data.filePath.split('/'); let paths = data.filePath.split("/");
let fullPath = ''; // 从头开始的路径,用于生成 id let fullPath = ""; // 从头开始的路径,用于生成 id
// 特殊处理 java 文件 // 特殊处理 java 文件
if (paths[paths.length - 1].indexOf('.java') >= 0) { if (paths[paths.length - 1].indexOf(".java") >= 0) {
let newPaths = []; let newPaths = [];
for (let i = 0; i < paths.length; i++) { for (let i = 0; i < paths.length; i++) {
let path = paths[i]; let path = paths[i];
if (path !== 'java') { if (path !== "java") {
newPaths.push(path); newPaths.push(path);
continue; continue;
} }
...@@ -274,17 +463,19 @@ export default { ...@@ -274,17 +463,19 @@ export default {
let tmp = undefined; let tmp = undefined;
while (i < paths.length) { while (i < paths.length) {
path = paths[i + 1]; path = paths[i + 1];
if (path === 'controller' if (
|| path === 'convert' path === "controller" ||
|| path === 'dal' path === "convert" ||
|| path === 'enums' path === "dal" ||
|| path === 'service' path === "enums" ||
|| path === 'vo' // 下面三个,主要是兜底。可能考虑到有人改了包结构 path === "service" ||
|| path === 'mysql' path === "vo" || // 下面三个,主要是兜底。可能考虑到有人改了包结构
|| path === 'dataobject') { path === "mysql" ||
path === "dataobject"
) {
break; break;
} }
tmp = tmp ? tmp + '.' + path : path; tmp = tmp ? tmp + "." + path : path;
i++; i++;
} }
if (tmp) { if (tmp) {
...@@ -298,7 +489,10 @@ export default { ...@@ -298,7 +489,10 @@ export default {
// 已经添加到 files 中,则跳过 // 已经添加到 files 中,则跳过
let oldFullPath = fullPath; let oldFullPath = fullPath;
// 下面的 replaceAll 的原因,是因为上面包处理了,导致和 tabs 不匹配,所以 replaceAll 下 // 下面的 replaceAll 的原因,是因为上面包处理了,导致和 tabs 不匹配,所以 replaceAll 下
fullPath = fullPath.length === 0 ? paths[i] : fullPath.replaceAll('.', '/') + '/' + paths[i]; fullPath =
fullPath.length === 0
? paths[i]
: fullPath.replaceAll(".", "/") + "/" + paths[i];
if (exists[fullPath]) { if (exists[fullPath]) {
continue; continue;
} }
...@@ -307,7 +501,7 @@ export default { ...@@ -307,7 +501,7 @@ export default {
files.push({ files.push({
id: fullPath, id: fullPath,
label: paths[i], label: paths[i],
parentId: oldFullPath || '/' // "/" 为根节点 parentId: oldFullPath || "/", // "/" 为根节点
}); });
} }
} }
...@@ -329,12 +523,16 @@ export default { ...@@ -329,12 +523,16 @@ export default {
/** 删除按钮操作 */ /** 删除按钮操作 */
handleDelete(row) { handleDelete(row) {
const tableIds = row.id; const tableIds = row.id;
this.$modal.confirm('是否确认删除表名称为"' + row.tableName + '"的数据项?').then(function() { this.$modal
.confirm('是否确认删除表名称为"' + row.tableName + '"的数据项?')
.then(function () {
return deleteCodegen(tableIds); return deleteCodegen(tableIds);
}).then(() => { })
.then(() => {
this.getList(); this.getList();
this.$modal.msgSuccess("删除成功"); this.$modal.msgSuccess("删除成功");
}).catch(() => {}); })
.catch(() => {});
}, },
// 取消按钮 // 取消按钮
cancel() { cancel() {
...@@ -351,14 +549,14 @@ export default { ...@@ -351,14 +549,14 @@ export default {
}, },
// 提交 import SQL 表单 // 提交 import SQL 表单
submitImportSQLForm() { submitImportSQLForm() {
this.$refs["importSQLForm"].validate(valid => { this.$refs["importSQLForm"].validate((valid) => {
if (!valid) { if (!valid) {
return; return;
} }
// 修改的提交 // 修改的提交
let form = this.importSQL.form; let form = this.importSQL.form;
if (form.tableId != null) { if (form.tableId != null) {
syncCodegenFromSQL(form.tableId, form.sql).then(response => { syncCodegenFromSQL(form.tableId, form.sql).then((response) => {
this.$modal.msgSuccess("同步成功"); this.$modal.msgSuccess("同步成功");
this.importSQL.open = false; this.importSQL.open = false;
this.getList(); this.getList();
...@@ -366,41 +564,45 @@ export default { ...@@ -366,41 +564,45 @@ export default {
return; return;
} }
// 添加的提交 // 添加的提交
createCodegenListFromSQL(form).then(response => { createCodegenListFromSQL(form).then((response) => {
this.$modal.msgSuccess("导入成功"); this.$modal.msgSuccess("导入成功");
this.importSQL.open = false; this.importSQL.open = false;
this.getList(); this.getList();
}); });
}); });
}, },
generateValidateCode(row){ generateValidateCode(row) {
let l = this.$loading() let l = this.$loading();
getCodegenDetail(row.id).then(res => { getCodegenDetail(row.id)
let rules = {} .then((res) => {
res.data.columns.forEach(item => { let rules = {};
let rule = {trigger: 'blur'} res.data.columns.forEach((item) => {
if(!item.nullable){ let rule = { trigger: "blur" };
rule.required = true if (!item.nullable) {
rule.message = this.$t('不能为空') rule.required = true;
rule.message = this.$t("不能为空");
} }
if(['int', 'tinyint', 'bigint'].indexOf(item.columnType)){ if (["int", "tinyint", "bigint"].indexOf(item.columnType)) {
rule.type = 'integer' rule.type = "integer";
} }
if(item.columnType.indexOf('decimal') === 0){ if (item.columnType.indexOf("decimal") === 0) {
rule.type = 'decimal' rule.type = "decimal";
} }
if(item.columnType == 'datetime'){ if (item.columnType == "datetime") {
rule.type = 'date' rule.type = "date";
} }
rules[item.javaField] = [rule] rules[item.javaField] = [rule];
}) });
console.log(row.tableComment + this.$t('校验规则'), JSON.stringify(rules)) console.log(
this.$message('规则已生成,打开控制台查看') row.tableComment + this.$t("校验规则"),
}) JSON.stringify(rules)
.finally(res => { );
l.close() this.$message("规则已生成,打开控制台查看");
}) })
.finally((res) => {
l.close();
});
},
}, },
}
}; };
</script> </script>
<template> <template>
<div class="app-container"> <div class="app-container">
<doc-alert :title="$t('上传下载')" url="https://doc.iocoder.cn/file/" />
<!-- 搜索工作栏 --> <!-- 搜索工作栏 -->
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px"> <el-form
:model="queryParams"
ref="queryForm"
size="small"
:inline="true"
v-show="showSearch"
label-width="68px"
>
<el-form-item :label="$t('文件路径')" prop="path"> <el-form-item :label="$t('文件路径')" prop="path">
<el-input v-model="queryParams.path" :placeholder="$t('请输入文件路径')" clearable @keyup.enter.native="handleQuery"/> <el-input
v-model="queryParams.path"
:placeholder="$t('请输入文件路径')"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item> </el-form-item>
<el-form-item :label="$t('创建时间')"> <el-form-item :label="$t('创建时间')">
<el-date-picker v-model="dateRangeCreateTime" style="width: 240px" value-format="yyyy-MM-dd" <el-date-picker
type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期" /> v-model="dateRangeCreateTime"
style="width: 240px"
value-format="yyyy-MM-dd"
type="daterange"
range-separator="-"
start-placeholder="开始日期"
end-placeholder="结束日期"
/>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" icon="el-icon-search" @click="handleQuery">{{ $t('搜索') }}</el-button> <el-button type="primary" icon="el-icon-search" @click="handleQuery">{{
<el-button icon="el-icon-refresh" @click="resetQuery">{{ $t('重置') }}</el-button> $t("搜索")
}}</el-button>
<el-button icon="el-icon-refresh" @click="resetQuery">{{
$t("重置")
}}</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
<!-- 操作工具栏 --> <!-- 操作工具栏 -->
<el-row :gutter="10" class="mb8"> <el-row :gutter="10" class="mb8">
<el-col :span="1.5"> <el-col :span="1.5">
<el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd">{{ $t('上传文件') }}</el-button> <el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
>{{ $t("上传文件") }}</el-button
>
</el-col> </el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar> <right-toolbar
:showSearch.sync="showSearch"
@queryTable="getList"
></right-toolbar>
</el-row> </el-row>
<!-- 列表 --> <!-- 列表 -->
<el-table v-loading="loading" :data="list"> <el-table v-loading="loading" :data="list">
<el-table-column :label="$t('文件名')" align="center" prop="path" /> <el-table-column :label="$t('文件名')" align="center" prop="path" />
<el-table-column label="URL" align="center" prop="url" /> <el-table-column label="URL" align="center" prop="url" />
<el-table-column :label="$t('文件大小')" align="center" prop="size" width="120" :formatter="sizeFormat" /> <el-table-column
<el-table-column :label="$t('文件类型')" align="center" prop="type" width="80" /> :label="$t('文件大小')"
<!-- <el-table-column :label="$t('文件内容')" align="center" prop="content">--> align="center"
<!-- <template slot-scope="scope">--> prop="size"
<!-- <img v-if="scope.row.type === 'jpg' || scope.row.type === 'png' || scope.row.type === 'gif'"--> width="120"
<!-- width="200px" :src="getFileUrl + scope.row.id">--> :formatter="sizeFormat"
<!-- <i v-else>{{ $t('非图片,无法预览') }}</i>--> />
<!-- </template>--> <el-table-column
<!-- </el-table-column>--> :label="$t('文件类型')"
<el-table-column :label="$t('上传时间')" align="center" prop="createTime" width="180"> align="center"
prop="type"
width="80"
/>
<!-- <el-table-column :label="$t('文件内容')" align="center" prop="content">-->
<!-- <template slot-scope="scope">-->
<!-- <img v-if="scope.row.type === 'jpg' || scope.row.type === 'png' || scope.row.type === 'gif'"-->
<!-- width="200px" :src="getFileUrl + scope.row.id">-->
<!-- <i v-else>{{ $t('非图片,无法预览') }}</i>-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column
:label="$t('上传时间')"
align="center"
prop="createTime"
width="180"
>
<template slot-scope="scope"> <template slot-scope="scope">
<span>{{ parseTime(scope.row.createTime) }}</span> <span>{{ parseTime(scope.row.createTime) }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column :label="$t('操作')" align="center" class-name="small-padding fixed-width" width="100"> <el-table-column
:label="$t('操作')"
align="center"
class-name="small-padding fixed-width"
width="100"
>
<template slot-scope="scope"> <template slot-scope="scope">
<el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)" <el-button
v-hasPermi="['infra:file:delete']">{{ $t('删除') }}</el-button> size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['infra:file:delete']"
>{{ $t("删除") }}</el-button
>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<!-- 分页组件 --> <!-- 分页组件 -->
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize" <pagination
@pagination="getList"/> v-show="total > 0"
:total="total"
:page.sync="queryParams.pageNo"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 对话框(添加 / 修改) --> <!-- 对话框(添加 / 修改) -->
<el-dialog :title="upload.title" :visible.sync="upload.open" width="400px" append-to-body> <el-dialog
<el-upload ref="upload" :limit="1" accept=".jpg, .png, .gif,.apk" :auto-upload="false" drag :title="upload.title"
:headers="upload.headers" :action="upload.url" :data="upload.data" :disabled="upload.isUploading" :visible.sync="upload.open"
width="400px"
append-to-body
>
<el-upload
ref="upload"
:limit="1"
accept=".jpg, .png, .gif,.apk"
:auto-upload="false"
drag
:headers="upload.headers"
:action="upload.url"
:data="upload.data"
:disabled="upload.isUploading"
:on-change="handleFileChange" :on-change="handleFileChange"
:on-progress="handleFileUploadProgress" :on-progress="handleFileUploadProgress"
:on-success="handleFileSuccess"> :on-success="handleFileSuccess"
>
<i class="el-icon-upload"></i> <i class="el-icon-upload"></i>
<div class="el-upload__text">{{ $t('将文件拖到此处,或') }}<em>{{ $t('点击上传') }}</em> <div class="el-upload__text">
{{ $t("将文件拖到此处,或") }}<em>{{ $t("点击上传") }}</em>
</div>
<div class="el-upload__tip" style="color: red" slot="tip">
提示:仅允许导入 jpg、png、gif 格式文件!
</div> </div>
<div class="el-upload__tip" style="color:red" slot="tip">提示:仅允许导入 jpg、png、gif 格式文件!</div>
</el-upload> </el-upload>
<div slot="footer" class="dialog-footer"> <div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitFileForm">{{ $t('确 定') }}</el-button> <el-button type="primary" @click="submitFileForm">{{
<el-button @click="upload.open = false">{{ $t('取 消') }}</el-button> $t("确 定")
}}</el-button>
<el-button @click="upload.open = false">{{ $t("取 消") }}</el-button>
</div> </div>
</el-dialog> </el-dialog>
</div> </div>
</template> </template>
<script> <script>
import { deleteFile, getFilePage } from "@/api/infra/file"; import { deleteFile, getFilePage } from "@/api/infra/file";
import {getToken} from "@/utils/auth"; import { getToken } from "@/utils/auth";
export default { export default {
name: "File", name: "File",
data() { data() {
return { return {
getFileUrl: process.env.VUE_APP_BASE_API + '/admin-api/infra/file/get/', getFileUrl: process.env.VUE_APP_BASE_API + "/admin-api/infra/file/get/",
// 遮罩层 // 遮罩层
loading: true, loading: true,
// 显示搜索条件 // 显示搜索条件
...@@ -108,7 +190,7 @@ export default { ...@@ -108,7 +190,7 @@ export default {
isUploading: false, // 是否禁用上传 isUploading: false, // 是否禁用上传
url: process.env.VUE_APP_BASE_API + "/admin-api/infra/file/upload", // 请求地址 url: process.env.VUE_APP_BASE_API + "/admin-api/infra/file/upload", // 请求地址
headers: { Authorization: "Bearer " + getToken() }, // 设置上传的请求头部 headers: { Authorization: "Bearer " + getToken() }, // 设置上传的请求头部
data: {} // 上传的额外数据,用于文件名 data: {}, // 上传的额外数据,用于文件名
}, },
}; };
}, },
...@@ -120,10 +202,10 @@ export default { ...@@ -120,10 +202,10 @@ export default {
getList() { getList() {
this.loading = true; this.loading = true;
// 处理查询参数 // 处理查询参数
let params = {...this.queryParams}; let params = { ...this.queryParams };
this.addBeginAndEndTime(params, this.dateRangeCreateTime, 'createTime'); this.addBeginAndEndTime(params, this.dateRangeCreateTime, "createTime");
// 执行查询 // 执行查询
getFilePage(params).then(response => { getFilePage(params).then((response) => {
this.list = response.data.list; this.list = response.data.list;
this.total = response.data.total; this.total = response.data.total;
this.loading = false; this.loading = false;
...@@ -182,22 +264,26 @@ export default { ...@@ -182,22 +264,26 @@ export default {
/** 删除按钮操作 */ /** 删除按钮操作 */
handleDelete(row) { handleDelete(row) {
const id = row.id; const id = row.id;
this.$modal.confirm('是否确认删除文件编号为"' + id + '"的数据项?').then(function() { this.$modal
.confirm('是否确认删除文件编号为"' + id + '"的数据项?')
.then(function () {
return deleteFile(id); return deleteFile(id);
}).then(() => { })
.then(() => {
this.getList(); this.getList();
this.$modal.msgSuccess("删除成功"); this.$modal.msgSuccess("删除成功");
}).catch(() => {}); })
.catch(() => {});
}, },
// 用户昵称展示 // 用户昵称展示
sizeFormat(row, column) { sizeFormat(row, column) {
const unitArr = ["Bytes","KB","MB","GB","TB","PB","EB","ZB","YB"]; const unitArr = ["Bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"];
const srcSize = parseFloat(row.size); const srcSize = parseFloat(row.size);
const index = Math.floor(Math.log(srcSize) / Math.log(1024)); const index = Math.floor(Math.log(srcSize) / Math.log(1024));
let size =srcSize/Math.pow(1024,index); let size = srcSize / Math.pow(1024, index);
size = size.toFixed(2);//保留的小数位数 size = size.toFixed(2); //保留的小数位数
return size + ' ' + unitArr[index]; return size + " " + unitArr[index];
},
}, },
}
}; };
</script> </script>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment