Commit 91ce4ad4 authored by 我在何方's avatar 我在何方

Merge branch 'release' of http://gitlab.jdshangmen.com/jiedao-app/jiedao-app-operator into release

parents e13f3da6 340c62b0
......@@ -328,6 +328,18 @@ export function downloadLoadGoodsList(params) {
});
}
/**
* 下载空运已装单
*/
export function downloadLoadGoods(params) {
return request({
url: "/ecw/box-preload-goods/downloadAirLoadGoodsList",
method: "get",
timeout: 120000,
params,
})
}
// 下载预装单
export function downloadPreloadGoodsList(params) {
return request({
......@@ -410,3 +422,11 @@ export function exportSettlementExcel(params) {
params,
});
}
// 刷新空运提单
export function updateAirBill(id) {
return request({
url: "/shipment/make-bill-of-lading/updateAirBill?ids=" + id,
method: "get"
});
}
......@@ -390,4 +390,16 @@ export function getLineInfo(params) {
method: "get",
params
});
}
/**
* 下载空运已装单
*/
export function downloadLoadGoods(params) {
return request({
url: "/ecw/box-preload-goods/downloadAirLoadGoodsList",
method: "get",
timeout: 120000,
params,
})
}
\ No newline at end of file
......@@ -59,6 +59,15 @@ export function getProductList(params) {
})
}
// 返回简洁的商品列表
export function getSimpleProductList(params) {
return request({
url: '/ecw/product/simpleList',
method: 'get',
params
})
}
// 获得产品分页
export function getProductPage(query) {
return request({
......
......@@ -207,9 +207,9 @@ export default {
},
// 预览
handlePictureCardPreview(file) {
// this.dialogImageUrl = file.url;
// this.dialogVisible = true;
window.open(file.url)
this.dialogImageUrl = file.url;
this.dialogVisible = true;
// window.open(file.url)
},
// 对象转成指定字符串分隔
listToString(list, separator) {
......
......@@ -12,39 +12,39 @@
<el-input v-model="queryParams.titleZh" :placeholder="$t('产品关键字')" style="width:120px" clearable :disabled="loading"/>
<el-button type="primary" @click="reLoad" :loading="loading">{{$t('搜索')}}</el-button>
<div v-if="showAll">
<el-checkbox :label="$t('全选') + `(${total > 500 ? $t('最多500') : $t('{total}个', {total})})`" @change="toggleAll" :disabled="isAllProduct || loading"></el-checkbox>
<el-checkbox :label="$t('全选库内商品(共{cnt}个)', {cnt: allTotal})" v-model="isAllProduct" :disabled="loading"></el-checkbox>
<el-checkbox v-if="showFiltered && enableFiltered" :label="$t('根据商品搜索结果(共{cnt}个)', {cnt: total})" v-model="isAllFiltered" :disabled="loading"></el-checkbox>
<div>
<el-checkbox :label="$t('全选') + `(${$t('{total}个', {total})})`" @change="toggleAll" :disabled="isAllProduct || loading"></el-checkbox>
</div>
</div>
<div class="list">
<div class="item" v-for="item in list" :key="item.id">
<div class="item" v-for="item in currentList" :key="item.id">
<el-checkbox @change="toggleCheck(item, $event)" :value="ids.indexOf(item.id) > -1" :disabled="isAllProduct" /> {{item.titleZh}}
<div>{{item.titleEn}}</div>
</div>
</div>
<el-pagination :total="list.length" :page-sizes="[100, 200, 300, 500]" :page-size="pageSize" @current-change="leftPage = $event" layout="prev, pager, next, total, sizes" :current-page="leftPage" />
</el-card>
</div>
<div class="flex-1 ml-10">
<el-card style="height:100%">
<div slot="header" class="header flex">
<div class="flex-1 flex items-center">{{$t('已选{cnt}个产品', {cnt: isAllProduct || isAllFiltered ? total : choosedList.length})}}</div>
<div class="flex-1 flex items-center">{{$t('已选{cnt}个产品', {cnt: choosedList.length})}}</div>
<el-button :disabled="!choosedList.length" type="text" @click="clearAll">{{$t('全部清除')}}</el-button>
</div>
<div class="list">
<div class="item" v-for="(choosed) in choosedList" :key="choosed.id" :data-data="JSON.stringify(choosed)">
<div class="item" v-for="(choosed) in selectedList" :key="choosed.id" :data-data="JSON.stringify(choosed)">
<el-link class="el-icon-delete" @click="remove(choosed)" :disabled="isAllProduct"/> {{choosed.titleZh}}
<div>{{choosed.titleEn}}</div>
</div>
</div>
<el-pagination :total="choosedList.length" :page-sizes="[100, 200, 300, 500]" :page-size="pageSize" @current-change="rightPage = $event" layout="prev, pager, next, total, sizes" :current-page="rightPage" />
</el-card>
</div>
</div>
</template>
<script>
import {getProductPage, getProductList, getProductIds} from '@/api/ecw/product'
import {getProductPage, getProductList, getProductIds, getSimpleProductList} from '@/api/ecw/product'
import { getProductTypeList } from '@/api/ecw/productType'
import { getProductAttrList } from '@/api/ecw/productAttr'
......@@ -67,11 +67,10 @@ export default {
list: [],
page: 1,
pages: 1,
total: 0, // 当前筛选条件的商品总数
allTotal: 0, // 全库商品总数
queryParams: {
pageNo: 1,
pageSize: 500,
pageSize: 10000,
attrId: null,
titleZh: null,
typeId: null
......@@ -80,12 +79,21 @@ export default {
typeList: [],
attrList: [],
isAllProduct: false,
isAllFiltered: false, // 是否全部搜索结果
//isAllFiltered: false, // 是否全部搜索结果
// 是否显示搜索结果勾选,有筛选条件才显示
showFiltered: false
showFiltered: false,
// 左侧页码
leftPage: 1,
// 右侧页码
rightPage: 1,
// 页大小
pageSize: 100
}
},
computed: {
total(){
return this.list.length
},
ids: {
get() {
let arr = []
......@@ -97,6 +105,14 @@ export default {
set(v) {
}
},
// 左侧当前显示的列表
currentList(){
return this.list.slice((this.leftPage - 1) * this.pageSize, this.leftPage * this.pageSize)
},
// 已勾选的显示列表
selectedList(){
return this.choosedList.slice((this.rightPage - 1) * this.pageSize, this.rightPage * this.pageSize)
}
},
watch: {
......@@ -108,11 +124,11 @@ export default {
this.choosedList = []
this.$emit('setall', isAllProduct)
},
isAllFiltered(isAllFiltered){
/*isAllFiltered(isAllFiltered){
this.choosedList = []
this.isAllProduct = false
this.$emit('setFiltered', isAllFiltered)
},
},*/
defaultIds(newValue, oldValue){
if(!oldValue || !oldValue.length){
this.loadDefaultProds()
......@@ -122,27 +138,28 @@ export default {
this.isAllProduct = isall
}
},
created() {
async created() {
getProductTypeList().then(res => this.typeList = res.data)
getProductAttrList().then(res => this.attrList = res.data)
this.reLoad()
await this.reLoad()
this.ids = this.defaultIds //数据回显
this.isAllProduct = this.isall
// 如果有默认商品则获取内容供回显
if(this.defaultIds.length){
this.loadDefaultProds()
this.setDefaultChooseProds()
//this.loadDefaultProds()
}
// 获取全库商品总数
getProductPage({pageNo: 1, pageSize: 1}).then(res => {
/*getProductPage({pageNo: 1, pageSize: 1}).then(res => {
this.allTotal = res.data.total
})
})*/
},
methods: {
/* setAllProduct(status){
this.isAllProduct = true
}, */
loadDefaultProds(){
/*loadDefaultProds(){
if(!this.defaultIds || !this.defaultIds.length){
return false
}
......@@ -151,16 +168,24 @@ export default {
this.choose(item)
})
})
},*/
// 设置默认选中的商品
setDefaultChooseProds(){
this.list.forEach(item => {
if(this.defaultIds.indexOf(item.id) > -1){
this.choose(item)
}
})
},
toggleAll(status){
this.list.forEach(item => {
this.toggleCheck(item, status)
})
},
reLoad() {
async reLoad() {
this.queryParams.page = 1
this.list = []
this.getList()
await this.getList()
},
loadNextPage() {
if (this.page >= this.pages) {
......@@ -169,19 +194,11 @@ export default {
this.queryParams.page++
this.getList()
},
getList() {
async getList() {
this.loading = true
getProductPage(this.queryParams).then(res => {
this.list = res.data.list //.concat(res.data.list || [])
this.page = res.data.page
this.pages = res.data.pages
this.total = res.data.total
// 必须在搜索之后才显示勾选,这个时候才有数量
this.showFiltered = !!this.queryParams.attrId || !!this.queryParams.titleZh || !!this.queryParams.typeId
}).finally(() => {
this.loading = false
})
let res = await getSimpleProductList(this.queryParams)
this.loading = false
this.list = res.data
},
// 获得指定条件的商品的全部ID
getFilteredIds(){
......
......@@ -191,7 +191,7 @@ export default {
this.$emit('input', data)
this.dialogVisible = false
if (this.isEditing || this.warehouseInId) {
if ((this.isEditing || this.warehouseInId) && this.warehouseInId) {
updateWarehouseInLocation({
"orderId": this.orderId,
"orderItemId": this.orderItemId,
......
......@@ -3832,7 +3832,7 @@
"流程详情": "Flow details",
"收款单核销审核": "The payment voucher verification review",
"系统提示": "System prompt",
"合计:{totalNum}箱,{totalVolume}m³(测) {totalChargeVolume}m³(重) {totalWeight}KG": "Total:{totalNum}Box,{totalVolume}m³(Test) {totalChargeVolume}m³(Weight) {totalWeight}KG",
"合计:{totalNum}箱,{totalVolume}m³(测) {totalChargeVolume}m³(重) {totalWeight}KG(测), {totalChargeWeight}kg(收费)": "Total:{totalNum}Box,{totalVolume}m³(measure) {totalChargeVolume}m³(Weight) {totalWeight}KG(measure),{totalChargeWeight}kg(charge)",
"确定要取消此报价单么?": "Are you sure you want to cancel this quote?",
"确定要恢复此报价单么?": "Are you sure you want to restore this quote?",
"确定要删除此报价单么?": "Are you sure you want to delete this quote?",
......
......@@ -86,7 +86,7 @@
</el-table-column>
</el-table>
<!-- 分页组件 -->
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.page" :limit.sync="queryParams.rows"
@pagination="getList"/>
<!-- 对话框(添加 / 修改) -->
......@@ -158,8 +158,10 @@ export default {
dateRangeCreateTime: [],
// 查询参数
queryParams: {
pageNo: 1,
pageSize: 10,
// pageNo: 1,
// pageSize: 10,
page: 1,
rows: 10,
titleZh: null,
titleEn: null,
validateStart: null,
......
......@@ -134,12 +134,12 @@
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item command="downloadPreloadGoodsList" v-hasPermi="['shipment:air:download:downloadPreloadGoodsList']">{{$t('预装单')}}</el-dropdown-item>
<!--el-dropdown-item command="downloadLoadGoodsList" v-hasPermi="['shipment:air:download:downloadLoadGoodsList']">{{$t('已装单')}}</el-dropdown-item-->
<el-dropdown-item command="downloadReceivableList" v-hasPermi="['shipment:air:download:downloadReceivableList']">{{$t('应收汇总表')}}</el-dropdown-item>
<el-dropdown-item command="downloadAgentListFiles" v-hasPermi="['shipment:air:download:downloadAgentListFiles']">agent list</el-dropdown-item>
<el-dropdown-item command="downloadSoncapFiles" v-hasPermi="['shipment:air:download:downloadSoncapFiles']">soncap</el-dropdown-item>
<el-dropdown-item command="zipDownload" v-hasPermi="['shipment:air:download:zipDownload']">{{$t('提货单')}}</el-dropdown-item>
<el-dropdown-item command="downloadLadingCopy" v-hasPermi="['shipment:air:download:downloadLadingCopy']">{{$t('提单Copy')}}</el-dropdown-item>
<el-dropdown-item command="downloadLoadGoods" v-hasPermi="['shipment:air:download:downloadLoadGoods']">{{$t('已装单')}}</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
......@@ -211,6 +211,7 @@ import {
} from '@/api/ecw/box'
import { getLineInfo } from '@/api/ecw/boxAir'
import { getChannelList } from '@/api/ecw/channel'
import { downloadLoadGoods } from '@/api/ecw/boxAir'
import { getWarehouseList } from '@/api/ecw/warehouse'
import costForm from './costForm.vue'
import regError from './regError.vue'
......@@ -237,8 +238,8 @@ export default {
cabinetList:[],
dateTypes: [
{ value: '1', label: this.$t('分拣时间') },
{ value: '2', label: this.$t('装柜时间') },
{ value: '3', label: this.$t('时间') },
{ value: '7', label: this.$t('出仓时间') },
{ value: '3', label: this.$t('时间') },
{ value: '4', label: this.$t('到港时间') },
{ value: '5', label: this.$t('清关时间') },
{ value: '6', label: this.$t('提货时间') }
......@@ -597,6 +598,13 @@ export default {
case "downloadLadingCopy":
downloadFileByUrl(command, {shipmentId: row.id});
break;
case "downloadLoadGoods":
if(row.tyStatus < 2112){
this.$message.error('请先完成理货后,再下载已装单')
return
}
this.exportExcel(downloadLoadGoods, { shipmentId: row.id }, this.$t("已装单") + `(${row.selfNo}).xls`)
break;
case "handle":
const { noticeType } = row;
if ([1, 2, 3, 4, 8, 14].includes(noticeType)) {
......
......@@ -101,7 +101,7 @@
<el-dialog :title="dialogCfg.title" :visible.sync="dialogCfg.visible" :width="dialogCfg.width" :fullscreen="dialogCfg.fullscreen" append-to-body class="shippingSea-dialog" @closed="dialogclosed">
<makeLadingBill v-if="dialogCfg.visible && ['makeBill','queryBill','resetBill'].includes(dialogCfg.type)" :currData="currData" :currRow="currRow" :dialogCfg="dialogCfg" @closeDialog="closeDialog" :selfNo="shipmentObj.selfNo" />
<previewBill v-if="dialogCfg.type === 'previewBill'" :contentHtml="currData.billContent" :currRow="currRow" :type="dialogCfg.type" />
<previewBill v-if="dialogCfg.type === 'previewBill'" :contentHtml="currData.billContent" :currRow="currRow" :type="dialogCfg.type" :air="type === 'air'" />
</el-dialog>
</el-row>
</template>
......@@ -248,7 +248,7 @@ export default {
let billContent = `${titleZh}${data.orderInfo}${contentZh}`;
this.currData = {
billContent,
orderNo: this.currRow.orderNo,
orderNo: row.orderNo,
};
}).catch(() => {
throw new Error('制作提单失败')
......
......@@ -63,7 +63,7 @@ export default {
currData: Object,
currRow: Object,
dialogCfg: Object,
selfNo: String
selfNo: String,
},
data() {
return {
......
......@@ -4,7 +4,7 @@
<el-row v-if="currRow.status === 2 && type === 'previewBill'" style="text-align: center;">
<el-button type="primary" @click="download">{{$t('下载')}}</el-button>
<el-button type="primary" @click="print">{{$t('打印')}}</el-button>
<el-button type="primary" @click="createPdf">{{$t('刷新提单文件')}}</el-button>
<el-button type="primary" @click="update">{{$t('刷新提单文件')}}</el-button>
</el-row>
</el-row>
</template>
......@@ -16,6 +16,7 @@ import FileSaver from "file-saver";
import html2canvas from 'html2canvas';
import { jsPDF } from "jspdf";
import {uploadFile} from '@/api/infra/file'
import {updateAirBill} from "@/api/ecw/box";
export default {
name: "previewBill",
......@@ -23,8 +24,22 @@ export default {
contentHtml: String,
currRow: Object,
type: String,
// 是否是空运
air: Boolean,
},
methods: {
// 刷新提单
update(){
if(this.air){
let loading = this.$loading()
return updateAirBill(this.currRow.orderId).then(res => {
this.$message.success(this.$t('刷新成功'))
}).finally(() => {
loading.close()
})
}
this.createPdf()
},
download() {
_BOX["downloadBillService"]({ id: this.currRow.id }).then((res) => {
if (res.data && res.data.imgUrl) {
......@@ -46,9 +61,9 @@ export default {
}
const _left = (595.28-_w)/2;
doc.addImage(canvas, 'PNG', _left, 0, _w,_h, '', 'FAST');
return _BOX["downloadBillService"]({ id: this.currRow.id })
}).then(res => {
let form = new FormData()
let pathname = (new URL(res.data.imgUrl)).pathname
......
......@@ -573,6 +573,7 @@ export default {
fileFormat ?? "xlsx"
);
}
this.$message.success(this.$t('已加入导出队列,请稍后在下载日志中下载'))
},
handleApproval(id) {
this.$router.push({path: '/bpm/process-instance/detail', query: {id: id}})
......
......@@ -166,7 +166,7 @@
</el-table-column>
<el-table-column prop="billAbnId" :label="$t('异常')" align="center">
<template slot-scope="scope">
<dict-tag :type="DICT_TYPE.BOX_AIR_SHIPMENT_PROCESS" :value="scope.row.billAbnId" />
<dict-tag :type="DICT_TYPE[getregprocess(scope.row.opStep)]" :value="scope.row.billAbnId" />
</template>
</el-table-column>
<el-table-column prop="abnDetail" :label="$t('异常描述')" align="center" width="300"></el-table-column>
......@@ -321,27 +321,33 @@ export default {
costDetail: {},
// 下载
downloadList: [
{ title: this.$t("预装单"), serviceName: "downloadPreloadGoodsList", hasPermi: "shipment:box:download:downloadPreloadGoodsList" },
{ title: this.$t("预装单"), serviceName: "downloadPreloadGoodsList", hasPermi: "shipment:air:download:downloadPreloadGoodsList" },
// { title: this.$t("已装单"), serviceName: "downloadLoadGoodsList", hasPermi: "shipment:box:download:downloadLoadGoodsList" },
{ title: this.$t("应收汇总表"), serviceName: "downloadReceivableList", hasPermi: "shipment:box:download:downloadReceivableList" },
{ title: this.$t("应收汇总表"), serviceName: "downloadReceivableList", hasPermi: "shipment:air:download:downloadReceivableList" },
{
title: this.$t("提货单"),
serviceName: "zipDownload",
fileFormat: "zip",
hasPermi: "shipment:box:download:zipDownload"
hasPermi: "shipment:air:download:zipDownload"
},
{
title: "agent list",
serviceName: "downloadAgentListFiles",
type: "url",
hasPermi: "shipment:box:download:downloadAgentListFiles"
hasPermi: "shipment:air:download:downloadAgentListFiles"
},
{ title: "soncap", serviceName: "downloadSoncapFiles", type: "url", hasPermi: "shipment:box:download:downloadSoncapFiles" },
{ title: "soncap", serviceName: "downloadSoncapFiles", type: "url", hasPermi: "shipment:air:download:downloadSoncapFiles" },
{
title: this.$t("提单Copy"),
serviceName: "downloadLadingCopy",
type: "url",
hasPermi: "shipment:box:download:downloadLadingCopy"
hasPermi: "shipment:air:download:downloadLadingCopy"
},
{
title: this.$t("已装单"),
serviceName: "downloadLoadGoods",
type: "url",
hasPermi: "shipment:air:download:downloadLoadGoods"
},
],
// 选中行
......@@ -362,6 +368,24 @@ export default {
};
},
methods: {
getregprocess(val) {
var data = ''
switch(val){
case 10:
data = 'FLYING_TICKET_EXCEPTION'
break;
case 12:
data = 'ARRIVAL_TICKET_EXCEPTION'
break
case 13:
data = 'CLEARANCE_TICKET_EXCEPTION'
break
default:
data = 'BOX_SHIPPING_TICKET_EXCEPTION'
break
}
return data
},
selectable(row, index) {
if (row.abnormalDealStatus === 1) return false;
return true;
......@@ -655,6 +679,7 @@ export default {
fileFormat ?? "xlsx"
);
}
this.$message.success(this.$t('已加入导出队列,请稍后在下载日志中下载'))
},
handleApproval(id) {
this.$router.push({path: '/bpm/process-instance/detail', query: {id: id}})
......
......@@ -27,12 +27,12 @@
<userSelect v-model="errorObj.notifyUsers" :placeholder="$t('请选择通知人')" :allUsers="this.$attrs.allUsers" multiple />
</el-form-item>
<!-- <el-form-item :label="$t('是否更新订单状态')">
<el-radio-group v-model="errorObj.orderStatus">
<el-form-item :label="$t('是否更新订单动态')">
<el-radio-group v-model="errorObj.updateStatus">
<el-radio v-for="item in status" :key="item.value" :label="item.value">{{item.label}}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item :label="$t('中文内容')">
<!-- <el-form-item :label="$t('中文内容')">
<el-input v-model="errorObj.contentZh" type="textarea" rows="2" :placeholder="$t('请输入中文内容')"></el-input>
</el-form-item>
<el-form-item :label="$t('英文内容')">
......
......@@ -48,9 +48,9 @@
</el-table-column>
<el-table-column :label="$t('订单数')" align="center" prop="orderCount" />
<el-table-column :label="$t('箱数')" align="center" prop="sumNum" />
<el-table-column :label="$t('入仓体积')" align="center" prop="sumVolume" />
<el-table-column :label="$t('入仓重量')" align="center" prop="sumWeight" />
<el-table-column :label="$t('入仓数量(个)')" align="center" prop="sumQuantity" />
<el-table-column :label="$t('体积')" align="center" prop="sumVolume" />
<el-table-column :label="$t('重量')" align="center" prop="sumWeight" />
<el-table-column :label="$t('数量(个)')" align="center" prop="sumQuantity" />
<el-table-column :label="$t('状态')" align="center" prop="tallyStatus">
<template slot-scope="scope">
{{ statusData[scope.row.status] }}
......
......@@ -18,7 +18,7 @@
</div>
<el-collapse-transition>
<div v-if="item.fold === false ? true : false">
<div v-for="(secGoog, index) in item.sectionOrderList" :key="index" class="part-secGoog">
<div v-for="(secGoog, index) in item.sectionOrderList" :key="index" class="part-secGoog-not">
<p>{{secGoog.orderNo}}</p>
<p>{{secGoog.prodTitleZh}}</p>
<div>
......@@ -567,6 +567,21 @@ export default {
}
}
}
.part-secGoog-not {
margin-top: 5px;
display: flex;
> p {
margin-right: 10px;
color: #4f9cdd;
}
> div {
flex: 1;
> i {
cursor: pointer;
color: red;
}
}
}
}
}
.right-area {
......
......@@ -140,7 +140,7 @@ export default {
this.$set(this.subMaterialObj,'soNo',this.shipmentObj.bookAirInfo?.sono||undefined)
this.$set(this.subMaterialObj,'blMblNo',this.shipmentObj.bookAirInfo?.blNo||undefined)
this.$set(this.subMaterialObj,'markNo',"N/M")
this.$set(this.subMaterialObj,'startPortId',this.shipmentObj.bookAirInfo?.bigPortId||undefined)
this.$set(this.subMaterialObj,'startPortId',this.shipmentObj.bookAirInfo?.departurePortId||undefined)
this.$set(this.subMaterialObj,'shipCompanyId',Number(this.shipmentObj.bookAirInfo?.shipCompanyType)||undefined)
this.$set(this.subMaterialObj,'destPortId',this.shipmentObj.bookAirInfo?.destPortId||undefined)
this.$set(this.subMaterialObj,'kgs',this.shipmentObj.customsInfo?.dcGoodsWgt||undefined)
......
......@@ -20,9 +20,21 @@
</el-card>
<el-row style="margin-top: 15px">
<el-row>
<el-button :disabled="shipmentObj.approvaling" size="small" type="primary" @click="()=>tallyClick('batch')">{{$t('批量理货')}}</el-button>
<el-button :disabled="shipmentObj.approvaling" size="small" type="primary" @click="()=>removeClick('batch')">{{$t('批量移出')}}</el-button>
<el-row class="table-title">
<div>
<el-button :disabled="shipmentObj.approvaling" size="small" type="primary" @click="()=>tallyClick('batch')">{{$t('批量理货')}}</el-button>
<el-button :disabled="shipmentObj.approvaling" size="small" type="primary" @click="()=>removeClick('batch')">{{$t('批量移出')}}</el-button>
</div>
<div>
<template>
<el-input v-model="qrCode" :placeholder="$t('请输入二维码/条码编号')" clearable></el-input>
<el-button type="primary" @click="handlerBatchCreate('single')">{{$t('确定')}}</el-button>
<el-button type="primary" @click="handlerClick('batchInput',$t('批量输入'))">{{$t('批量输入')}}</el-button>
<el-button type="primary" @click="handlerClick('correction',$t('理货纠错'))">{{$t('理货纠错')}}</el-button>
<el-button type="primary" @click="handlerClick('correctionOrder',$t('批量理货纠错'))">{{$t('批量理货纠错')}}</el-button>
</template>
</div>
</el-row>
<el-row style="margin-top: 5px">
<el-table border :data="tallyList" @select="checkboxSelect" @select-all="checkboxSelect" max-height="600px">
......@@ -123,13 +135,83 @@
append-to-body
@cancel="currentTurnExceptionOrder=null"
@success="currentTurnExceptionOrder=null" />
<!-- 对话框 -->
<el-dialog custom-class="shipping-dialog" :title="dialogConfig.title" :visible.sync="dialogConfig.dialogVisible" :fullscreen="dialogConfig.fullscreen" :width="dialogConfig.width" :modal-append-to-body=false append-to-body>
<!-- 装柜纠错 -->
<template v-if="dialogConfig.type === 'correction' && dialogConfig.dialogVisible">
<el-form ref="correctionForm" :rules="rules" :model="correctionObj" label-position="top">
<el-form-item :label="$t('装柜纠错(二维码/条形码编号)')" prop="qrCode">
<el-input v-model="correctionObj.qrCode" :placeholder="$t('请输入二维码/条形码编号')" clearable />
</el-form-item>
</el-form>
<el-row class="operate-button">
<el-button type="primary" @click="onSubmit('correctionForm')">{{$t('提交')}}</el-button>
<el-button @click="closeDialog2">{{$t('取消')}}</el-button>
</el-row>
</template>
<!-- 批量装柜纠错(订单号) -->
<template v-if="dialogConfig.type === 'correctionOrder' && dialogConfig.dialogVisible">
<el-form ref="orderForm" :rules="rules" :model="orderObj" label-position="top">
<el-form-item :label="$t('装柜纠错') +'(' + $t('订单号') + ')'" prop="orderNo">
<el-input type="textarea" :rows="3" v-model="orderObj.orderNo" :placeholder="$t('请输入,多个以逗号分隔')" clearable />
</el-form-item>
</el-form>
<el-row class="operate-button">
<el-button type="primary" @click="onSubmit('orderForm')">{{$t('提交')}}</el-button>
<el-button @click="closeDialog2">{{$t('取消')}}</el-button>
</el-row>
</template>
<!-- 装柜批量输入 -->
<template v-if="dialogConfig.type === 'batchInput' && dialogConfig.dialogVisible">
<el-form ref="batchForm" :rules="rules" :model="batchObj">
<el-form-item label="" prop="qrCode" class="two-element">
<el-input v-model="batchObj.qrCode" :placeholder="$t('请输入订单号')" clearable />
<el-button style="marginLeft:10px;" type="primary" @click="queryOrderInfo">{{$t('确定')}}</el-button>
</el-form-item>
<el-row>
<el-col :span="12">
<el-form-item :label="$t('订单号')">
{{boxOrderInfo.orderNo}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item :label="$t('箱数')">
<el-input-number v-if="boxOrderInfo.isExternalWarehouse === 1" v-model="batchObj.boxNum" :min="0" :max="boxOrderInfo.num" />
<template v-else>
{{boxOrderInfo.num}}
</template>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item :label="$t('方数')">
{{getTotlContent(boxOrderInfo, ['volume'])}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item :label="$t('重量')">
{{getTotlContent(boxOrderInfo, ['weight'])}}
</el-form-item>
</el-col>
</el-row>
</el-form>
<el-row class="operate-button">
<el-button type="primary" :disabled="boxOrderInfo.orderId ? false : true" @click="batchLoad">{{$t('提交')}}</el-button>
<el-button @click="closeDialog2">{{$t('取消')}}</el-button>
</el-row>
</template>
</el-dialog>
</div>
</template>
<script>
import batchTally from "./batchTally.vue";
import { getTallyList, tallyRemove, tallyCommit } from "@/api/ecw/boxSea";
import { formatDate, serviceMsg } from "../../utils";
import { formatDate, serviceMsg, getTotlContent } from "../../utils";
import WarehouseDetail from "./warehouseDetail";
import {getOrder, orderSpecialNeed} from "@/api/ecw/order";
import Exception from "@/views/ecw/box/components/Exception.vue";
......@@ -163,7 +245,27 @@ export default {
fullscreen: false,
},
// 当前转异订单
currentTurnExceptionOrder: null
currentTurnExceptionOrder: null,
// 二维码/条码编号
qrCode: "",
// 批量输入
batchObj: {
boxNum: 0,
},
// 批量纠错(订单号)
orderObj: {},
// 纠错
correctionObj: {},
// 弹窗配置
dialogConfig: {
title: "",
dialogVisible: false,
width: "30%",
type: "",
fullscreen: false,
},
// 订单信息
boxOrderInfo: {},
};
},
created() {
......@@ -172,6 +274,7 @@ export default {
methods: {
// 格式化日期
formatDate,
getTotlContent,
//去重
notset(string){
if(!string) return string
......@@ -357,6 +460,31 @@ export default {
this.showWarehouseInItemId = row.orderItemId;
});
},
/** 点击事件统一入口 */
handlerClick(type, title) {
this.shwoDialog({ type, title });
},
/** 弹窗事件 */
shwoDialog(config) {
this.$set(this.dialogConfig, "title", config.title);
this.$set(this.dialogConfig, "type", config.type);
switch (config.type) {
case "batchInput":
this.$set(this.dialogConfig, "fullscreen", false);
this.batchObj = { boxNum: 0 };
this.boxOrderInfo = {};
break;
case "correction":
this.$set(this.dialogConfig, "fullscreen", false);
this.correctionObj = {};
break;
case "correctionOrder":
this.$set(this.dialogConfig, "fullscreen", false);
this.orderObj = {};
break;
}
this.$set(this.dialogConfig, "dialogVisible", true);
},
},
computed: {
/* 获取仓库 */
......@@ -371,4 +499,19 @@ export default {
</script>
<style lang="scss" scoped>
.table-title {
display: flex;
align-items: center;
margin-bottom: 10px;
> div:first-child {
flex: 1;
font-size: 16px;
}
> div:last-child {
display: flex;
> .el-input {
margin-right: 10px;
}
}
}
</style>
......@@ -17,7 +17,7 @@
</div>
<el-collapse-transition>
<div v-if="item.fold === false ? true : false">
<div v-for="(secGoog, index) in item.sectionOrderList" :key="index" class="part-secGoog">
<div v-for="(secGoog, index) in item.sectionOrderList" :key="index" class="part-secGoog-not">
<p>{{secGoog.orderNo}}</p>
<p>{{secGoog.prodTitleZh}}</p>
<div>
......@@ -538,6 +538,21 @@ export default {
}
}
}
.part-secGoog-not {
margin-top: 5px;
display: flex;
> p {
margin-right: 10px;
color: #4f9cdd;
}
> div {
flex: 1;
> i {
cursor: pointer;
color: red;
}
}
}
}
}
.right-area {
......
......@@ -66,11 +66,15 @@
</el-form>
<!-- 操作工具栏 -->
<div v-if="path === '/customer/customer'" style="color: red;margin-bottom: 5px;">
注意:创建的客户需接收
</div>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button v-if="path === '/customer/potential'" type="primary" plain icon="el-icon-plus" size="mini" @click="handleAddPotential">{{$t('新增潜在客户')}}</el-button>
<el-button v-else type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
v-hasPermi="[ selectAuthorityFn('ecw:customer:create')]">{{$t('新增')}}</el-button>
v-hasPermi="[ selectAuthorityFn('ecw:customer:create')]">{{$t('新增')}}
</el-button>
</el-col>
<el-col :span="1.5" >
<el-button :disabled="selectCustomerList.length === 0" type="primary" size="mini" @click="transferShow = true;"
......@@ -170,6 +174,7 @@
<el-button size="mini" v-has-permi="[selectAuthorityFn('ecw:customer:follow-up')]" type="text" icon="el-icon-collection" @click="followUp(scope.row)">{{$t('跟进')}}</el-button>
<el-button size="mini" v-has-permi="[selectAuthorityFn('ecw:customer:customer-complaint')]" type="text" icon="el-icon-user" @click="complaint(scope.row)">{{$t('客诉')}}</el-button>
<el-button :disabled="scope.row.isInOpenSea" v-has-permi="[selectAuthorityFn('ecw:customer:postpone')]" size="mini" type="text" icon="el-icon-user" @click="delay(scope.row)">{{$t('延期')}}</el-button>
<el-button v-has-permi="['ecw:customer:treat-recovery']" v-if="scope.row.customerService !== null && scope.row.customerServiceAssignedTime !== null && !scope.row.isCustomerServiceConfirmed && !scope.row.isInOpenSea && path === '/customer/customer'" size="mini" type="text" @click="recovery(scope.row)" > {{$t('回收客户')}} </el-button>
</template>
</el-table-column>
</el-table>
......@@ -541,7 +546,7 @@ import {
getCustomerDeptPage,
changeCustomerAir,
getPotential,
setChangeCustomerFcl, potentialExportExcel, deptExportExcel
setChangeCustomerFcl, potentialExportExcel, deptExportExcel, recycleUnconfirmedCustomer
} from "@/api/ecw/customer";
import { getDictDatas, DICT_TYPE } from '@/utils/dict';
import {CommonStatusEnum} from '@/utils/constants'
......@@ -688,6 +693,20 @@ export default {
this.getList();
},
methods: {
recovery(row){
this.$confirm(this.$t('是否要回收当前{name}',row), '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
recycleUnconfirmedCustomer({customerId:row.id}).then(r =>{
this.$message.success(this.$t('回收成功。'))
this.getList()
})
}).catch(() => {
this.$message.info(this.$t('已取消'))
});
},
// 设置整柜
setFullContainerLoad(isFcl){
setChangeCustomerFcl({
......
......@@ -137,7 +137,7 @@
</router-link>
<el-button size="mini" type="text" @click="handleUpdate(scope.row)"
v-hasPermi="['ecw:customer:treat-perfect']">{{$t('完善')}}</el-button>
<el-button v-has-permi="['ecw:customer:treat-recovery']" size="mini" type="text" @click="recovery(scope.row)" > {{$t('回收客户')}} </el-button>
<!-- <el-button v-has-permi="['ecw:customer:treat-recovery']" size="mini" type="text" @click="recovery(scope.row)" > {{$t('回收客户')}} </el-button>-->
</template>
</el-table-column>
......@@ -458,20 +458,20 @@ export default {
})
},
methods: {
recovery(row){
console.log(row,'row')
this.$confirm(this.$t('是否要回收当前{name}',row), '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
recycleUnconfirmedCustomer({customerId:row.id}).then(r =>{
this.$message.success(this.$t('回收成功。'))
})
}).catch(() => {
this.$message.info(this.$t('已取消'))
});
},
// recovery(row){
// console.log(row,'row')
// this.$confirm(this.$t('是否要回收当前{name}',row), '提示', {
// confirmButtonText: '确定',
// cancelButtonText: '取消',
// type: 'warning'
// }).then(() => {
// recycleUnconfirmedCustomer({customerId:row.id}).then(r =>{
// this.$message.success(this.$t('回收成功。'))
// })
// }).catch(() => {
// this.$message.info(this.$t('已取消'))
// });
// },
getDictDatas,
countryFormatter(row, column, cellValue) {
const country = this.countryList.find((e) => e.id === cellValue)
......
......@@ -48,19 +48,19 @@
<el-form-item :label="$t('联系方式')" prop="key">
<el-input v-model="queryParams.phoneNew" :placeholder="$t('请输入联系方式')" clearable/>
</el-form-item>
<el-form-item :label="$t('客户经理')" prop="customerService">
<el-select clearable v-model="queryParams.customerService" :placeholder="$t('请选择客户经理')" clearable size="small">
<el-form-item :label="$t('客户经理')" prop="userId">
<el-select clearable v-model="queryParams.userId" :placeholder="$t('请选择客户经理')" clearable size="small">
<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="$t('始发仓')" prop="destinationId">
<el-select v-model="queryParams.originId" :placeholder="$t('请选择始发仓')" clearable>
<el-form-item :label="$t('始发仓')" prop="startWarehouseId">
<el-select v-model="queryParams.startWarehouseId" :placeholder="$t('请选择始发仓')" clearable>
<el-option v-for="item in exportWarehouseList" :label="$l(item, 'title')" :value="item.id" :key="item.id"></el-option>
</el-select>
</el-form-item>
<el-form-item :label="$t('目的仓')" prop="destinationId">
<el-select :multiple="true" v-model="queryParams.destinationId" multiple :placeholder="$t('请选择目的仓')" clearable>
<el-form-item :label="$t('目的仓')" prop="destWarehouseIdArr">
<el-select :multiple="true" v-model="queryParams.destWarehouseIdArr" multiple :placeholder="$t('请选择目的仓')" clearable>
<el-option v-for="item in importWarehouseList" :label="$l(item, 'title')" :value="item.id" :key="item.id"></el-option>
</el-select>
</el-form-item>
......@@ -167,7 +167,7 @@
tableList: [],
// 弹出层标题
title: "",
dateFilter:[],
dateFilter:[],
detail: {
deptName: null,
targetType: null,
......@@ -256,6 +256,9 @@
listServiceUser().then(r=>{
this.customerServiceList = r.data;
})
getWarehouseList().then(res => {
this.warehouseList = res.data
})
},
methods: {
getChannelList() {
......@@ -295,8 +298,12 @@
/** 查询列表 */
getList() {
this.loading = true;
const params = {...this.queryParams}
if(params.destWarehouseIdArr?.length){
params.destWarehouseIds = params.destWarehouseIdArr.join(',')
}
// 执行查询
myAchievementByPage(this.queryParams).then(response => {
myAchievementByPage(params).then(response => {
this.list = response.data.myAchievementDtos.list;
this.total = response.data.myAchievementDtos.total;
this.myAchievementData = response.data
......
......@@ -48,19 +48,19 @@
<el-form-item :label="$t('联系方式')" prop="key">
<el-input v-model="queryParams.phoneNew" :placeholder="$t('请输入联系方式')" clearable/>
</el-form-item>
<el-form-item :label="$t('客户经理')" prop="customerService">
<el-select clearable v-model="queryParams.customerService" :placeholder="$t('请选择客户经理')" clearable size="small">
<el-form-item :label="$t('客户经理')" prop="userId">
<el-select clearable v-model="queryParams.userId" :placeholder="$t('请选择客户经理')" clearable size="small">
<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="$t('始发仓')" prop="destinationId">
<el-select v-model="queryParams.originId" :placeholder="$t('请选择始发仓')" clearable>
<el-form-item :label="$t('始发仓')" prop="startWarehouseId">
<el-select v-model="queryParams.startWarehouseId" :placeholder="$t('请选择始发仓')" clearable>
<el-option v-for="item in exportWarehouseList" :label="$l(item, 'title')" :value="item.id" :key="item.id"></el-option>
</el-select>
</el-form-item>
<el-form-item :label="$t('目的仓')" prop="destinationId">
<el-select :multiple="true" v-model="queryParams.destinationId" multiple :placeholder="$t('请选择目的仓')" clearable>
<el-form-item :label="$t('目的仓')" prop="destWarehouseIdArr">
<el-select :multiple="true" v-model="queryParams.destWarehouseIdArr" multiple :placeholder="$t('请选择目的仓')" clearable>
<el-option v-for="item in importWarehouseList" :label="$l(item, 'title')" :value="item.id" :key="item.id"></el-option>
</el-select>
</el-form-item>
......@@ -196,6 +196,7 @@
transportType: null,
shippingChannel: null,
endStartTime: null,
destWarehouseIdArr:[]
},
tableQueryParams: {
pageNo: 1,
......@@ -252,6 +253,9 @@
listServiceUser().then(r=>{
this.customerServiceList = r.data;
})
getWarehouseList().then(res => {
this.warehouseList = res.data
})
},
methods: {
getChannelList() {
......@@ -291,8 +295,12 @@
/** 查询列表 */
getList() {
this.loading = true;
const params = {...this.queryParams}
if(params.destWarehouseIdArr?.length){
params.destWarehouseIds = params.destWarehouseIdArr.join(',')
}
// 执行查询
myDeptAchievementByPage(this.queryParams).then(response => {
myDeptAchievementByPage(params).then(response => {
this.list = response.data.myAchievementDtos.list;
this.total = response.data.myAchievementDtos.total;
this.myAchievementData = response.data
......
......@@ -161,6 +161,9 @@
<el-descriptions-item :label="$t('客户经理')">
{{order.salesmanName}}
</el-descriptions-item>
<el-descriptions-item :label="$t('提单是否显示价格')">
{{order.displayBillLadingPrice ? $t('是') : $t('否')}}
</el-descriptions-item>
</el-descriptions>
</el-card>
......
......@@ -514,11 +514,11 @@
</el-form-item>
</div>
<div v-if="[3,4].indexOf(+form.transportId) > -1">
<!--<div v-if="[3,4].indexOf(+form.transportId) > -1">
<el-form-item :label="$t('航空公司')">
<supplier-selector v-model="form.airlineCompany" company-type="10" :disabled="false"/>
</el-form-item>
</div>
</div>-->
<div v-if="[2].indexOf(+form.transportId) > -1">
<el-form-item :label="$t('船公司')">
<supplier-selector v-model="form.shippingCompany" company-type="9" :disabled="false" />
......
......@@ -172,7 +172,7 @@
</el-col>
<el-col :span="15" v-if="statistics">
<!-- 订单列表显示搜索条件对应箱数、仓库实测、收款方数、重量 -->
{{$t('合计:{totalNum}箱,{totalVolume}m³(测) {totalChargeVolume}m³(重) {totalWeight}KG', statistics)}}
{{$t('合计:{totalNum}箱,{totalVolume}m³(测) {totalChargeVolume}m³(重) {totalWeight}KG(测), {totalChargeWeight}kg(收费)', statistics)}}
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
......
......@@ -435,7 +435,7 @@ export default {
},
// 批量可出
batchCanShipment(){
let orderNo = this.multipleSelection.map(item => item.orderNo).join(',')
let orderNo = this.multipleSelection.map(item => item.orderNo).join(', ')
this.$confirm(this.$t(`您确定要将订单{orderNo}设置为可出吗?`, {orderNo})).then(() =>{
return batchCanShipment(this.ids)
}).then(res =>{
......
......@@ -158,17 +158,18 @@
</el-table-column>
<el-table-column
prop="address"
:label="$t('操作')" width="220">
:label="$t('操作')" width="250">
<template v-slot="{ row, column, $index }">
<!--没有入仓记录的不显示打包按钮 https://zentao.test.jdshangmen.com/bug-view-5389.html-->
<el-button-group v-if="orderWarehouseInList(row.orderItemId).length">
<template v-if="wareItemPackStatus(row.orderItemId) == 1">
<el-button size="mini" type="warning" @click="noNeedPack(row)">{{$t('无需打包')}}</el-button>
<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>
<el-button v-else size="mini" type="primary" @click="package(row, $t('修改打包'))">{{$t('修改打包')}}</el-button>
<el-button class="pl-5 pr-5" v-else size="mini" type="primary" @click="package(row, $t('修改打包'))">{{$t('修改打包')}}</el-button>
<el-button size="mini" type="danger" @click="rollback(row)">{{$t('退仓')}}</el-button>
<el-button class="pl-5 pr-5" size="mini" type="info" @click="printTag">{{$t('打印标签')}}</el-button>
</el-button-group>
</template>
</el-table-column>
......@@ -212,6 +213,7 @@
<div style="text-align: center;margin-top: 15px">
<el-button @click="escapeBol = true;" type="primary">{{$t('转异')}}</el-button>
<el-button type="primary" @click="handleSubmit">{{$t('完成备货')}}</el-button>
<el-button type="info" @click="printTag">{{$t('打印标签')}}</el-button>
</div>
</el-form>
......@@ -249,6 +251,7 @@
@close="onPackageClose"
></new-product>
<media-dialog 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>
</template>
......@@ -363,7 +366,9 @@ export default {
// 当前查看的影像
curPictrues: null,
// 是否显示添加新品弹窗
showNewProductDialog: false
showNewProductDialog: false,
// 是否显示打印标签弹层
showPrintTagDialog: false
}
},
......@@ -434,9 +439,11 @@ export default {
form.orderId = this.orderId
form.manualExceptionType = form.manualExceptionType.join(',')
finishStock(form).then(res => {
return this.$alert(this.$t('操作成功'))
return this.$confirm("备货成功,是否需要打印标签").catch(() => {
this.$tab.closePage()
})
}).then(() => {
this.$tab.closePage()
this.printTag()
})
},
// 显示打包弹层
......@@ -496,6 +503,9 @@ export default {
this.$message.success(this.$t('操作成功'))
this.getList()
})
},
printTag(){
this.showPrintTagDialog = true
}
},
watch: {
......
......@@ -886,8 +886,14 @@ export default {
let params = {...this.queryParams};
params.pageNo = undefined;
params.pageSize = undefined;
if(this.type == 'sea'){
params.transportType = 1
}
if(this.type == 'air'){
params.transportType = 3
}
this.addBeginAndEndTime(params, this.dateRangeCreateTime, 'createTime');
// c
this.$modal.confirm(this.$t('是否确认导出所有数据项?')).then(() => {
this.exportLoading = true;
return exportProductPriceExcel(params);
......
......@@ -102,9 +102,12 @@
<el-option v-for="dict in regionTypeDatas" :key="dict.value" :label="dict.label" :value="dict.value"/>
</el-select>
</el-form-item>
<el-form-item :label="$t('国家代码-城市代码')" prop="labelCode" v-if="form.type == '1' || form.type == '3' ">
<el-input v-model="form.labelCode" placeholder="请输入国家代码-城市代码" />
<el-form-item :label="$t('海运订单国家代码-海运订单城市代码-空运订单国家代码-空运自编号国家代码,没有可填0-')" prop="labelCode" v-if="form.type == '1' || form.type == '3' ">
<el-input v-model="form.labelCode" placeholder="请输入海运订单国家代码-海运订单城市代码-空运订单国家代码-空运自编号国家代码" />
</el-form-item>
<el-tooltip effect="dark" :content="$t('海运目的国家简称-海运目的城市简称-空运订单编号目的国家简称-空运自编号目的国简称,\n注意:如果没有海运业务的城市设置,请将海运目的国家简称-海运目的城市简称设置为->0-0,前置的参数不能为空')" placement="top">
<i class="el-icon-question"></i>
</el-tooltip>
<el-form-item :label="$t('显示顺序')" prop="sort">
<el-input v-model="form.sort" :placeholder="$t('请输入显示顺序')" />
</el-form-item>
......
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