Commit 9b7ea5fa authored by dragondean@qq.com's avatar dragondean@qq.com

Merge branch 'dev' into release

# Conflicts:
#	src/views/ecw/box/shippingAir/nodePage/tally/index.vue
parents 7fdb0012 e511fa0d
......@@ -6,7 +6,7 @@ VUE_APP_TITLE = 捷道管理系统-测试站
# 捷道管理系统/开发环境
VUE_APP_BASE_API = 'https://api.jd.jdshangmen.com'
VUE_APP_BASE_API = 'https://apitest.groupage.cn'
# 路由懒加载
VUE_CLI_BABEL_TRANSPILE_MODULES = true
......@@ -18,4 +18,4 @@ VUE_APP_TENANT_ENABLE = false
VUE_APP_DOC_ENABLE = true
# 百度统计
VUE_APP_BAIDU_CODE = fadc1bd5db1a1d6f581df60a1807f8ab
\ No newline at end of file
VUE_APP_BAIDU_CODE = fadc1bd5db1a1d6f581df60a1807f8ab
......@@ -99,7 +99,7 @@ let autoTransCnt = 0
async function translate(obj){
// 对未翻译内容调用百度翻译进行翻译操作,有变量的不做处理
for(let text in obj){
if(obj[text] || text.includes('{'))continue
if(obj[text] || text.trim() === '')continue
try{
const textEn = await translateText(text)
console.log(`${text} => ${textEn}\n`)
......
......@@ -402,4 +402,109 @@ export function downloadLoadGoods(params) {
timeout: 120000,
params,
})
}
/**
* 创建理货和合包标签
*
* @export
* @param {*} data
* @return {*}
*/
export function checkInfoSingleCreate(data) {
return request({
url: `/ecw/box-order-check-info/singleCreate`,
method: "post",
data: data
});
}
/**
* 批量创建理货和合包标签
*
* @export
* @param {*} data
* @return {*}
*/
export function checkInfoBatchCreate(data) {
return request({
url: `/ecw/box-order-check-info/batchCreate`,
method: "post",
data: data
});
}
/**
* 删除理货和合包标签
*
* @export
* @param {*} data
* @return {*}
*/
export function checkInfoSingleDelete(data) {
return request({
url: `/ecw/box-order-check-info/singleDelete`,
method: "post",
data: data
});
}
/**
* 批量删除理货和合包标签
*
* @export
* @param {*} data
* @return {*}
*/
export function checkInfoBatchDelete(data) {
return request({
url: `/ecw/box-order-check-info/batchDelete`,
method: "post",
data: data
});
}
/**
* 获取订单理货,合包编号列表
*
* @export
* @param {*} data
* @return {*}
*/
export function getOrderTagList(params) {
return request({
url: `/ecw/box-order-check-info/orderTagList`,
method: "get",
params
});
}
/**
* 根据箱号、订单号查找订单号码,理货和合包使用
*
* @export
* @param {*} data
* @return {*}
*/
export function searchLoadOrderByBoxNo(data) {
return request({
url: `/ecw/box-order-check-info/searchLoadOrderByBoxNo`,
method: "post",
data: data
});
}
/**
* 确认出仓
*
* @export
* @param {*} data
* @return {*}
*/
export function confirmAirCheckout(params) {
return request({
url: `/ecw/box-air-checkout/confirmAirCheckout`,
method: "get",
params
});
}
\ No newline at end of file
......@@ -42,7 +42,13 @@ export function getChannelPage(query) {
params: query
})
}
//启用-禁用渠道
export function channelSwitch(id){
return request({
url:`/ecw/channel/switch/${id}`,
method:'put'
})
}
// 获得渠道列表 TODO
export function getChannelList(query) {
return request({
......@@ -62,7 +68,7 @@ export function exportChannelExcel(query) {
})
}
//
//
export function getChannelListByIds(params){
return request({
url: '/ecw/channel/list',
......
......@@ -81,3 +81,36 @@ export function getCustomerContactsListByCustomer(query) {
return Promise.resolve()
}
}
//全部列表数据
export function warehouseLinePage(params){
return request({
url:'/ecw/warehouse-line/page',
method:'get',
params,
})
}
//获得空运线路模板
export function getAirLineChannelTemplateList(params){
return request({
url:'/ecw/warehouse-line/get-air-line-channel-template-list',
method:'get',
params
})
}
// 根据线路id渠道列表和清关费(复制使用)
export function getAirLineChannelPackagingList(id){
return request({
url:'/ecw/warehouse-line/get-air-line-channel-packaging-list',
method:'get',
params:{lineId:id}
})
}
// 创建仓库线路的渠道包装
export function createWarehouseLineChannelPackaging(data){
return request({
url:'/ecw/warehouse-line/create-warehouse-line-channel-packaging',
method:'put',
data
})
}
......@@ -1032,3 +1032,25 @@ export function getOrderItemCommonAttr(orderId, excludeOrderWarehouseInId){
params: {orderId, excludeOrderWarehouseInId}
})
}
//退仓品名列表
export function getOrderItemDeleted(orderId){
return request({
url: '/ecw/order/order-item-info-when-warehouse-in-deleted/' + orderId,
method: 'get',
})
}
// 打包页面订单数据统计
export function getPackStatistics(orderId){
return request({
url: '/ecw/order/order-packed-page-statistics/' + orderId,
method: 'get'
})
}
//获得订单品名对应的退仓入仓货物详情
export function getOrderWarehouseDeleted(orderId,orderItem){
return request({
url: '/order/order-warehouse-in/get-order-warehouse-in-deleted?orderId=' + orderId+'&orderItemId='+orderItem,
})
}
\ No newline at end of file
......@@ -9,6 +9,14 @@ export function createProductPrice(data) {
})
}
export function createProductPriceAir(data) {
return request({
url: '/ecw/product-price/createAir',
method: 'post',
data: data
})
}
// 更新产品价格
export function updateProductPrice(data) {
return request({
......@@ -18,6 +26,15 @@ export function updateProductPrice(data) {
})
}
// 更新空运价格
export function updateProductPriceAir(data) {
return request({
url: '/ecw/product-price/updateAir',
method: 'put',
data: data
})
}
// 删除产品价格
export function deleteProductPrice(id) {
return request({
......@@ -71,6 +88,15 @@ export function batchUpdateProductPrice(query) {
})
}
// 批量修改空运产品价格
export function batchUpdateProductPriceAir(data) {
return request({
url: '/ecw/product-price/batchUpdate',
method: 'put',
data
})
}
// 批量拉黑
export function batchBlock(query) {
return request({
......@@ -124,3 +150,12 @@ export function batchAddPrice(data) {
data
})
}
// 批量加价空运
export function batchAddPriceAir(data) {
return request({
url: '/ecw/product-price/batchAddPriceAir',
method: 'put',
data
})
}
......@@ -98,6 +98,14 @@ export function getTradeCityList(query) {
params: query
})
}
// 获得目的地国家
export function getTradeCountryList(query) {
return request({
url: '/ecw/region/getTradeCountryList',
method: 'get',
params: query
})
}
export function listByIds(params){
......@@ -106,4 +114,4 @@ export function listByIds(params){
method: 'get',
params
})
}
\ No newline at end of file
}
......@@ -12,8 +12,8 @@
<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>
<el-checkbox :label="$t('全选') + `(${$t('{total}个', {total})})`" @change="toggleAll" :disabled="isAllProduct || loading"></el-checkbox>
<div style="height: 36px; display: flex; align-items: center">
<el-checkbox :label="$t('全选') + `(${$t('{total}个', {total})})`" @change="toggleAll" v-model="isCheckedAll" :disabled="isAllProduct || loading"></el-checkbox>
</div>
</div>
<div class="list">
......@@ -27,18 +27,28 @@
</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: choosedList.length})}}</div>
<div slot="header" class="header">
<el-select v-model="selectedFilterParams.typeId" :placeholder="$t('选择类型')" style="width:120px" clearable :disabled="loading">
<el-option v-for="item in typeList" :key="item.id" :label="item.titleZh" :value="item.id" />
</el-select>
<el-select v-model="selectedFilterParams.attrId" :placeholder="$t('选择属性')" style="width:120px" clearable :disabled="loading">
<el-option v-for="item in attrList" :key="item.id" :label="item.attrName" :value="item.id" />
</el-select>
<el-input v-model="selectedFilterParams.titleZh" :placeholder="$t('产品关键字')" style="width:120px" clearable :disabled="loading"/>
<!--<el-button type="primary" @click="reLoad" :loading="loading">{{$t('搜索')}}</el-button>-->
<el-button :disabled="!choosedList.length" type="text" @click="clearAll">{{$t('全部清除')}}</el-button>
<div class="flex">
<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>
<div class="list">
<div class="item" v-for="(choosed) in selectedList" :key="choosed.id" :data-data="JSON.stringify(choosed)">
<div class="item" v-for="(choosed) in selectedList" :key="choosed.id">
<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-pagination :total="filteredList.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>
......@@ -75,6 +85,11 @@ export default {
titleZh: null,
typeId: null
},
selectedFilterParams:{
attrId: null,
titleZh: null,
typeId: null
},
choosedList: [],
typeList: [],
attrList: [],
......@@ -87,7 +102,9 @@ export default {
// 右侧页码
rightPage: 1,
// 页大小
pageSize: 100
pageSize: 100,
// 是否选中全选
isCheckedAll: false
}
},
computed: {
......@@ -110,9 +127,24 @@ export default {
currentList(){
return this.list.slice((this.leftPage - 1) * this.pageSize, this.leftPage * this.pageSize)
},
// 已勾选的显示列表
// 已选中 且符合筛选的
filteredList(){
return this.choosedList.filter(item => {
if(this.selectedFilterParams.typeId && item.typeId != this.selectedFilterParams.typeId){
return false
}
if(this.selectedFilterParams.attrId && item.attrId != this.selectedFilterParams.attrId){
return false
}
if(this.selectedFilterParams.titleZh && item.titleZh.indexOf(this.selectedFilterParams.titleZh) == -1){
return false
}
return true
})
},
// 已勾选的显示列表,当前分页显示的
selectedList(){
return this.choosedList.slice((this.rightPage - 1) * this.pageSize, this.rightPage * this.pageSize)
return this.filteredList.slice((this.rightPage - 1) * this.pageSize, this.rightPage * this.pageSize)
}
},
watch: {
......@@ -131,7 +163,7 @@ export default {
},*/
defaultIds(newValue, oldValue){
if(!oldValue || !oldValue.length){
this.loadDefaultProds()
// this.loadDefaultProds()
}
},
isall(isall){
......@@ -199,6 +231,8 @@ export default {
let res = await getSimpleProductList(this.queryParams)
this.loading = false
this.list = res.data
this.choosedList = []
this.isCheckedAll = false
},
// 获得指定条件的商品的全部ID
getFilteredIds(){
......@@ -227,6 +261,7 @@ export default {
async clearAll() {
await this.$confirm(this.$t('确定要全部清除么?'))
this.choosedList = []
this.isCheckedAll = false
}
}
}
......
......@@ -204,7 +204,8 @@ export default {
this.getOpenedRouterList()
},
importCity(){
this.getOpenedRouterList()
this.getChannelList()
this.getOpenedRouterList()
},
selectedRoutes(val){
this.$emit('input', val)
......@@ -246,7 +247,7 @@ export default {
}
},
async created(){
this.channelList = (await getChannelList()).data
this.getChannelList()
this.tradeCityList = (await getTradeCityList()).data
// 路线需要过滤失效的进出口城市,所以在程序加载后再加载路线
await this.getOpenedRouterList()
......@@ -268,6 +269,12 @@ export default {
this.inited = true
},
methods:{
async getChannelList(){
let query = {
cityId: this.importCity
}
this.channelList = (await getChannelList(query)).data
},
getAttrList(){
getProductAttrList().then(res => {
this.attrList = res.data
......@@ -315,7 +322,7 @@ export default {
if(this.getSelectedIndex(router) > -1) return
this.selectedRoutes.push({
lineId: router.id,
channelId: router.channel.channelId,
shippingChannelId: router.channel.channelId,
transportId: router.transportType
})
}else{
......@@ -328,7 +335,7 @@ export default {
},
getSelectedIndex(router){
return this.selectedRoutes.findIndex(item => {
return item.lineId == router.id && item.channelId == router.channel.channelId
return item.lineId == router.id && item.shippingChannelId == router.channel.channelId
})
},
SpanMethod({ row, column, rowIndex, columnIndex }){
......
<template>
<el-select
v-model="index"
v-model="valueSync"
filterable
:clearable="clearable"
remote
reserve-keyword
:placeholder="placeholder ? placeholder : $t('请选择')"
:loading="loading">
<el-option
v-if="prepend"
:label="`${prepend.nickname}`"
:value="prepend.id">
</el-option>
<el-option
v-for="(item, index) in list"
:key="item.id"
:label="`${item.nickname}`"
:value="index">
:value="item.id">
</el-option>
</el-select>
</template>
......@@ -26,26 +31,23 @@ export default {
manage:{
type:Boolean,
default:false
}
},
prepend: Object
},
data(){
return {
index: null,
list:[],
loading: false,
size: 20
size: 20,
valueSync: this.value
}
},
watch:{
index(val){
this.$emit('input', val !== null && val !== undefined && val != '' ? this.list[val].id : null)
this.$emit('change', val !== null && val !== undefined && val != '' ? this.list[val]: null)
},
value(val){
this.resetIndex()
this.valueSync = this.value
},
list(){
this.resetIndex()
valueSync(val){
this.$emit('input', val)
}
},
created(){
......@@ -60,39 +62,9 @@ export default {
this.list = res.data
})
}
// this.init()
},
methods:{
resetIndex(){
let index = this.list.findIndex(item => item.id == this.value)
if(index < 0) this.index = null
else this.index = index
}
/* init(){
console.log('初始化联系人选择', this.value)
if(!this.value) return
let index = this.list.findIndex(item => item.customerContactsId == this.value)
if(index < 0){
getCustomerContactsSelect({ids: this.value}).then(res => {
if(!res.data || !res.data.length){
return this.$message.error('联系人信息获取失败')
}
this.list.unshift(res.data[0])
this.index = 0
})
}
}, */
/* remoteMethod(keyword){
let params = {
size: this.size
}
params.searchKey = keyword
this.loading = true
getCustomerContactsSelect(params)
.then(res => this.list = res.data)
.finally(() => this.loading = false)
} */
if(this.value){
this.valueSync = this.value
}
}
}
</script>
......@@ -3889,7 +3889,7 @@
"公司中文名称": "Chinese name of the company",
"展示": "show",
"无归属订单": "Unassigned Order",
"最多可放入{quantity}": "",
"最多可放入{quantity}": "Up to {quantity} can be placed",
"可放入仓方数": "Number of storage units that can be placed",
"可放入收费方数": "Number of charging parties that can be placed",
"入仓方数": "Number of parties entering the warehouse",
......
......@@ -239,7 +239,7 @@ export const DICT_TYPE = {
APP_TYPE:"app_type", //系统类型
AIR_SHIPMENT_PROCESS:'air_shipment_process',
AIR_CUSTOM_CLEARANCE:'air_custom _clearance', //渠道清关费
CUSTOM_CLEARANCE:'custom _clearance', //全部列表空运订单重量上限
AIR_COMMODITY_CUSTOM_CLEARANCE:'air_commodity_custom _clearance'//商品渠道清关费,
}
......
......@@ -19,6 +19,13 @@ const service = axios.create({
// 超时
timeout: 1000 * 30
})
// 如果是生产环境则打印提示
if (process.env.NODE_ENV === 'development' && service.defaults.baseURL === 'https://api2.groupage.cn/admin-api/') {
console.log('%c请注意,当前为生产环境请谨慎操作!!', 'background-color: red; font-size: 3em; color:yellow');
console.log('%c接口地址:' + service.defaults.baseURL, 'background-color: black; font-size: 1.5em; color:yellow !important');
}
// request拦截器
service.interceptors.request.use(config => {
config.headers['locale'] = getLocale()
......
......@@ -466,6 +466,12 @@ export default {
id: this.processInstance.businessKey,
path: this.processInstance.processDefinition?.formCustomViewPath
},
// 线路重量超限
line_weight_exception:{
component: () => import('@/views/ecw/order/exception/components/overweightException'),
id: this.processInstance.businessKey,
path: this.processInstance.processDefinition?.formCustomViewPath
},
}
console.log('formCustomViewPath', this.processInstance.processDefinition.formCustomViewPath.trim())
return map[this.processInstance.processDefinition.formCustomViewPath.trim()]
......
......@@ -7,21 +7,26 @@
<el-radio v-for="dict in transportTypes" :key="dict.value" :label="dict.value">{{$l(dict, 'label')}}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item :label="$t('目的国')" prop="destCountryId">
<el-select v-model="form.destCountryId" clearable>
<el-option v-for="item in tradeCountryList" :key="item.id" :label="$l(item, 'title')" :value="item.id"></el-option>
</el-select>
</el-form-item>
<el-form-item :label="$t('出货渠道')" prop="shippingChannelId">
<el-select v-model="form.shippingChannelId" :placeholder="$t('请选择出货渠道')">
<el-option v-for="item in channelList" :label="$l(item, 'name')" :value="item.channelId" :key="item.channelId"></el-option>
<el-select v-model="form.shippingChannelId" :placeholder="$t('请选择出货渠道')" clearable>
<el-option v-for="item in filteredChannelList" :label="$l(item, 'name')" :value="item.channelId" :key="item.channelId"></el-option>
</el-select>
</el-form-item>
<el-form-item :label="$t('始发地')" prop="startWarehouseId">
<el-select v-model="form.startWarehouseId" :placeholder="$t('请选择始发地')">
<el-select v-model="form.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="destWarehouseId">
<el-select v-model="form.destWarehouseId" :placeholder="$t('请选择目的地')">
<el-select v-model="form.destWarehouseId" :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>
......@@ -73,6 +78,7 @@
<script>
import { createbox, updatebox } from "@/api/ecw/boxAir";
import { getChannelList } from '@/api/ecw/channel'
import { getTradeCountryList } from '@/api/ecw/region'
export default {
name: "editAirForm",
......@@ -91,11 +97,14 @@ export default {
this.form.destinationClearanceSelect = 3
}
this.getChannelList()
this.getTradeCountry()
},
data() {
return {
// 表单参数
form: { },
form: {
destCountryId: undefined
},
channelList: [],
// 表单校验
rules: {
......@@ -108,19 +117,38 @@ export default {
destWarehouseId: [
{ required: true, message: this.$t('目的地不能为空'), trigger: 'blur' }
]
}
},
tradeCountryList:[]
};
},
watch:{
'form.destinationClearanceSelect'(){
if(!this.form.destinationClearance){
this.$set(this.form, 'destinationClearance', 1)
}
watch:{
'form.destinationClearanceSelect'(){
if(!this.form.destinationClearance){
this.$set(this.form, 'destinationClearance', 1)
}
},
'form.destCountryId'(){
this.getChannelList()
},
'form.shippingChannelId'(){
let channel = this.channelList.find(item => item.channelId == this.form.shippingChannelId)
if(channel){
this.$set(this.form, 'destCountryId', channel.countryId)
}
},
'form.destWarehouseId'(){
let city = this.importWarehouseList.find(item => item.id == this.form.destWarehouseId)
if(city){
this.form.destCountryId = city.guojia
}
}
},
methods: {
async getTradeCountry(){
this.tradeCountryList = (await getTradeCountryList()).data
},
getChannelList() {
getChannelList().then((res) => (this.channelList = res.data))
getChannelList({}).then((res) => (this.channelList = res.data))
},
/*destinationClearanceSelect(val) {
this.$set(this.form,'destinationClearance',val)
......@@ -160,9 +188,22 @@ export default {
},
importWarehouseList() {
return this.warehouseList.filter(
(item) => item.tradeType == "1" || item.type == "3"
(item) => {
if(this.form.destCountryId && item.guojia != this.form.destCountryId){
return false
}
return item.tradeType == "1" || item.type == "3"
}
);
},
filteredChannelList(){
return this.channelList.filter(item => {
if(this.form.destCountryId && this.form.destCountryId != item.countryId){
return false
}
return true
})
}
},
};
</script>
......
......@@ -74,7 +74,7 @@
</el-row>
<!-- 列表 -->
<el-table v-loading="loading" :data="list">
<el-table size="mini" v-loading="loading" :data="list">
<el-table-column :label="$t('自编号')" align="center" prop="selfNo">
<template slot-scope="scope">
<a href="javascript:void(0)" @click="handleCommand(scope.row, 'detail')">{{ scope.row.selfNo }}</a>
......@@ -92,16 +92,26 @@
</template>
</el-table-column>
<el-table-column :label="$t('方数(分拣/已装)')" align="center" prop="">
<el-table-column :label="$t('订单方数(分拣/已装)')" align="center" prop="">
<template slot-scope="{row}">
{{row.boxStatistics.volume}}/{{row.boxStatistics.loadVolume}}
</template>
</el-table-column>
<el-table-column :label="$t('重量(分拣/已装)')" align="center" prop="weight">
<el-table-column :label="$t('订单重量(分拣/已装)')" align="center" prop="weight">
<template slot-scope="{row}">
{{row.boxStatistics.weight}}/{{row.boxStatistics.loadWeight}}
</template>
</el-table-column>
<el-table-column :label="$t('合包方数(分拣/已装)')" align="center" prop="weight">
<template slot-scope="{row}">
{{row.boxStatistics.volume }}/{{row.boxStatistics.mergeVolume}}
</template>
</el-table-column>
<el-table-column :label="$t('合包重量(分拣/已装)')" align="center" prop="weight">
<template slot-scope="{row}">
{{row.boxStatistics.weight}}/{{row.boxStatistics.mergeWeight}}
</template>
</el-table-column>
<el-table-column :label="$t('状态')" align="center" prop="shipmentStatusText" />
......@@ -125,8 +135,8 @@
<el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
v-hasPermi="['shipment:box:delete']">{{$t('删除')}}</el-button> -->
<el-dropdown trigger="click" @command="(command) => handleCommand(scope.row, command)" style="marginRight:10px;">
<el-button type="primary"> {{ $t('操作') }}<i class="el-icon-arrow-down el-icon--right"></i> </el-button>
<el-dropdown-menu slot="dropdown">
<el-button type="text"> {{ $t('操作') }}<i class="el-icon-arrow-down el-icon--right"></i> </el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item command="edit" v-has-permi="['shipment:air:edit']" :disabled="scope.row.prStatus>21">{{$t('编辑')}}</el-dropdown-item>
<el-dropdown-item command="air" v-has-permi="['shipment:air:action']">{{$t('操作')}}-{{$t('空运')}}</el-dropdown-item>
<el-dropdown-item command="error" v-has-permi="['shipment:air:exception']">{{$t('异常登记')}}</el-dropdown-item>
......@@ -141,7 +151,7 @@
'shipment:air:download:downloadLoadGoodsList','shipment:air:download:downloadReceivableList',
'shipment:air:download:downloadAgentListFiles','shipment:air:download:downloadSoncapFiles',
'shipment:air:download:zipDownload','shipment:air:download:downloadLadingCopy']">
<el-button type="primary">
<el-button type="text">
{{$t('下载')}}<i class="el-icon-arrow-down el-icon--right"></i>
</el-button>
<el-dropdown-menu slot="dropdown">
......
......@@ -65,11 +65,11 @@
</el-form-item>
<el-form-item :label="$t('出仓箱数')" prop="realNum">
<el-input-number v-model="airCheckoutObj.realNum" :controls="false" :precision="0" />
<el-input-number v-model="airCheckoutObj.realNum" :controls="false" :precision="0" disabled />
</el-form-item>
<el-form-item :label="$t('出仓影像')">
<ImageUpload :limit="1" :isShowTip=false v-model="airCheckoutObj.checkoutFiles" />
<ImageUpload :limit="1" :isShowTip=false v-model="airCheckoutObj.checkoutFiles" @input="saveImage" />
</el-form-item>
<el-form-item :label="$t('备注')">
......@@ -79,16 +79,24 @@
</el-form>
<!-- 开始出仓 -->
<el-dialog :title="$t('开始出仓')" :visible.sync="dialogVisible" fullscreen :modal-append-to-body=false append-to-body>
<startCheckout v-bind="$attrs" v-if="dialogVisible" v-on="$listeners" @closeDialog1="closeDialog1" @reload="reload" />
</el-dialog>
<el-row class="operate-button">
<el-button type="primary" @click="onSubmit(1)">{{$t('保存')}}</el-button>
<el-button :disabled="$attrs.shipmentObj.approvaling" type="success" @click="onSubmit(2)">{{$t('提交')}}</el-button>
<el-button @click="cancel">{{$t('关闭')}}</el-button>
<el-button type="danger" @click="startCheckout">{{$t('确认出仓')}}</el-button>
</el-row>
</div>
</template>
<script>
import { getbox } from "@/api/ecw/box";
import { airCheckoutCreate } from "@/api/ecw/boxSea";
import startCheckout from "./checkout/startCheckout.vue";
import userSelect from "./common/userSelect.vue";
import ImageUpload from "@/components/ImageUpload";
import { constantDict, formatDateStr, formatNumberString, serviceMsg } from "../utils";
......@@ -99,7 +107,7 @@ import { constantDict, formatDateStr, formatNumberString, serviceMsg } from "../
export default {
name: "checkout",
inheritAttrs: false,
components: { userSelect, ImageUpload },
components: { userSelect, ImageUpload, startCheckout },
data() {
return {
// 空运出仓对象
......@@ -114,6 +122,7 @@ export default {
//deliverType: [{ required: true, message: this.$t("必填"), trigger: "change" }],
checkoutTime: [{ required: true, message: this.$t("必填"), trigger: "change" }]
},
dialogVisible: false
};
},
created() {
......@@ -150,10 +159,44 @@ export default {
}
});
},
reload() {
getbox(this.$attrs.shipmentObj.id).then((res)=>{
this.$set(this.airCheckoutObj, 'planNum', res.data.planNum)
this.$set(this.airCheckoutObj, 'realNum', res.data.realNum)
})
},
/** 取消 */
cancel(type) {
this.$emit("closeDialog", type);
},
/** 开始出仓 */
startCheckout() {
this.dialogVisible = true;
},
closeDialog1() {
this.dialogVisible = false;
},
//自动保存图片
saveImage() {
const { ldPictures } = this.airCheckoutObj;
let pictures = ldPictures?.split(",") ?? [];
let newPictures = [];
for (const item of pictures) {
if (item) {
newPictures.push({
type: "image",
url: item,
});
}
}
airCheckoutCreate({
...this.airCheckoutObj,
shipmentId: this.$attrs.shipmentObj.id,
operateType: 1,
}).then(()=>{
this.$emit("getBoxInfo");
})
}
},
};
</script>
......
......@@ -34,6 +34,13 @@
>{{ $t('新建合包箱号') }}</el-button
>
<el-button class="ml-10" @click="pack">{{$t('补单')}}</el-button>
<span style="margin:0 20px">{{$t('状态')}}</span>
<el-select v-model="pkgStatus" :placeholder="$t('状态')" @change="changeStatus" >
<el-option :label="$t('全部')" value="0"></el-option>
<el-option :label="$t('未装箱')" value="1"></el-option>
<el-option :label="$t('装箱中')" value="2"></el-option>
<el-option :label="$t('已装箱')" value="3"></el-option>
</el-select>
</el-row>
<el-row style="margin-top: 5px">
<el-table border :data="pagList" max-height="600px">
......@@ -203,7 +210,8 @@ export default {
showPackDialog: false,
showPagedialogVisible: false,
showPageTitle: '',
showPkgData: {}
showPkgData: {},
pkgStatus:"0" //装箱状态
}
},
created() {
......@@ -221,6 +229,11 @@ export default {
methods: {
formatDate,
getList() {
if(this.pkgStatus>0){
this.queryParams.status = this.pkgStatus
}else{
delete this.queryParams.status
}
getMergePkgList(this.queryParams).then((res) => {
this.pagList = res.data.list
this.total = res.data.total
......@@ -306,6 +319,9 @@ export default {
// 提交补单
onSupplementFinish(){
this.showPackDialog = false
},
changeStatus(){
this.getList()
}
}
}
......
......@@ -40,6 +40,7 @@
<el-col :span="18" class="right-area">
<el-row class="right-title">
<div>{{$t('自编号')}}:{{selfNo}}</div>
<div>{{$t('货物筛选')}}</div>
<div>{{$t('出货渠道')}}:{{channelName}}</div>
<div>{{$t('可出特性')}}:{{attrName}}</div>
......@@ -193,6 +194,7 @@ export default {
// 选中部分
partData: {},
// 部分列表
selfNo: this.$attrs.shipmentObj.selfNo,
partList: [],
// 部分统计
loadStatistics: {},
......@@ -597,6 +599,12 @@ export default {
> div:first-child + div {
margin-left: 20px;
}
> div:first-child + div + div {
margin-left: 20px;
}
> div:first-child + div + div + div {
margin-left: 20px;
}
> div:last-child {
flex: 1;
text-align: right;
......
......@@ -83,10 +83,16 @@ export default {
});
}
});
if (orderLocationList.length === 0) {
this.$message.error(this.$t("没有需要修改储位的订单"));
return;
let orderIds = []
this.storageList.forEach(item=>{
if(!orderIds.includes(item.orderId)){
orderIds.push(item.orderId)
}
})
orderIds.forEach(id=>{
orderLocationList.push({orderId: id})
})
}
tallyLocationUpdate({
......
......@@ -37,7 +37,7 @@
<span class="mr-10">-</span>
<el-input v-model="item.endNum" class="mr-10"></el-input >
<span class="mr-10">/</span>
<weight-select @change="changeWeight" :disabled="index > 0" v-model="item.weightUnit" :options="unitList"></weight-select>
<weight-select @change="setAirFreightWeight" :disabled="index > 0" v-model="item.clearanceVolumeUnit" :options="unitList"></weight-select>
</div>
</el-col>
</el-row>
......@@ -75,7 +75,7 @@ export default {
type:String,
default:'channelPriceStepClearanceList'
},
readonly: Boolean
readonly: Boolean,
},
name: "packaging-type",
components: {Template, WeightSelect, CurrencySelect},
......@@ -96,14 +96,7 @@ export default {
},
computed:{
screenCom(){
let num = undefined
if(this.keyArr === 'channelPriceStepClearanceList'){
num = this.getDictDatas(this.DICT_TYPE.AIR_CUSTOM_CLEARANCE)[0]?.value
}else {
num = this.getDictDatas(this.DICT_TYPE. AIR_COMMODITY_CUSTOM_CLEARANCE)[0]?.value
}
return num
return this.getDictDatas(this.DICT_TYPE.CUSTOM_CLEARANCE)[0]?.value
}
},
mounted() {
......@@ -120,11 +113,6 @@ export default {
})
},
methods:{
changeWeight(e){
this.value1[this.keyArr].forEach(item => {
item.weightUnit = e
})
},
setCurrency(e){
this.value1[this.keyArr].forEach(item => {
item.clearancePriceUnit = e
......@@ -137,14 +125,11 @@ export default {
},
addInterval(){
let p = {
"channelId":'',
"clearancePrice":'',
"clearancePriceUnit": this.value1[this.keyArr].length && this.value1[this.keyArr][0].clearancePriceUnit ? this.value1[this.keyArr][0].clearancePriceUnit : '',
"clearanceVolumeUnit":this.value1[this.keyArr].length ? this.value1[this.keyArr][0].clearanceVolumeUnit : 6,
"endNum":'',
"packagingId":'',
"startNum":'',
"weightUnit": this.value1[this.keyArr].length ? this.value1[this.keyArr][0].weightUnit : 6
}
this.value1[this.keyArr].push(p)
this.$forceUpdate();
......@@ -152,10 +137,11 @@ export default {
deleteFn(index){
this.value1[this.keyArr].splice(index, 1)
this.$forceUpdate();
}
},
watch:{
'value1.priceStepClearanceList':{
'value1.priceStepClearanceCreateReqVOList':{
handler(val){
if(val && val.length === 0){
this.addInterval();
......
This diff is collapsed.
This diff is collapsed.
......@@ -58,6 +58,12 @@
<el-option v-for="item in importWarehouseList" :label="$l(item, 'title')" :value="item.id" :key="item.id"></el-option>
</el-select>
</el-form-item>
<el-form-item label="业绩类型">
<el-select clearable v-model="queryParams.achieveType">
<el-option :value="1" label="新客户"></el-option>
<el-option :value="0" label="旧客户"></el-option>
</el-select>
</el-form-item>
<el-button type="primary" icon="el-icon-search" @click="handleQuery">{{$t('搜索')}}</el-button>
<el-button @click="resetQuery">{{$t('重置')}}</el-button>
<el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExportDetail" :loading="exportLoading" v-hasPermi="['ecw:achievement:export']">{{ $t('导出明细') }}</el-button>
......
......@@ -235,7 +235,7 @@
startTime: [{required: true, message: this.$t("起始时间不能为空"), trigger: "change"}],
endTime: [{required: true, message: this.$t("截止时间不能为空"), trigger: "change"}],
},
};
},
computed: {
......
This diff is collapsed.
<template>
<div class="app-container">
<!-- 搜索工作栏 -->
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" label-width="68px">
<el-form-item :label="$t('运输方式')" prop="transportType">
<dict-selector :type="DICT_TYPE.ECW_TRANSPORT_TYPE" v-model="queryParams.transportType" formatter="number"
clearable/>
</el-form-item>
<el-form-item>
<el-form-item :label="$t('始发仓')" prop="startWarehouseId">
<el-select multiple v-model="queryParams.startWarehouseIdList" :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="destWarehouseIdArr">
<el-select multiple v-model="queryParams.destWarehouseIdList" 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>
<el-form-item :label="$t('出货渠道')" prop="shippingChannel">
<el-select v-model="queryParams.channelId" :placeholder="$t('请选择出货渠道')" clearable>
<el-option v-for="item in channelList" :label="item.nameZh" :value="item.channelId"
:key="item.channelId"></el-option>
</el-select>
</el-form-item>
<el-form-item label-width="200" label="目的仓国家">
<el-select style="width: 100%" filterable clearable v-model="queryParams.destCountryId" :placeholder="$t('请选择国家')">
<el-option v-for="dict in countryList"
:key="dict.id" :label="$l(dict,'title')" :value="parseInt(dict.id)"/>
</el-select>
</el-form-item>
<el-button type="primary" icon="el-icon-search" @click="handleQuery">{{ $t('搜索') }}</el-button>
</el-form-item>
</el-form>
<!-- 列表 -->
<el-table v-loading="loading" :data="list">
<el-table-column :label="$t('序号')" align="center" type="index"/>
<el-table-column :label="$t('始发仓')" align="center">
<template slot-scope="{row}">
{{ $l(row, 'startWarehouseTitle') }}
</template>
</el-table-column>
<el-table-column :label="$t('目的仓')" align="center">
<template slot-scope="{row}">
{{ $l(row, 'destWarehouseTitle') }}
</template>
</el-table-column>
<el-table-column :label="$t('运输方式')" align="center">
<template slot-scope="{row}">
<dict-tag :type="DICT_TYPE.ECW_TRANSPORT_TYPE" :value="row.transportType"></dict-tag>
</template>
</el-table-column>
<el-table-column :label="$t('目的仓国家')" align="center">
<template slot-scope="{row}">
{{$l(row, 'destCountryName')}}
</template>
</el-table-column>
<el-table-column :label="$t('出货渠道')" align="center">
<template slot-scope="{row}">
{{ row.channelIds ? $l(row, 'channelNames') : '/' }}
</template>
</el-table-column>
<el-table-column :label="$t('操作')" align="center">
<template slot-scope="{row}">
<el-button v-if="row.transportType === 3" type="text" @click="$router.push({
path:'/offer/channel-route?id='+ row.id,
query:{
startWarehouseTitle:$l(row,'startWarehouseTitle'),
destWarehouseTitle: $l(row, 'destWarehouseTitle'),
destCountryName:$l(row,'destCountryName')
}
})">空运渠道包装清关费
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页组件 -->
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.page" :limit.sync="queryParams.rows"
@pagination="getList"/>
</div>
</template>
<script>
import {
createDeptTarget,
updateDeptTarget,
deleteDeptTarget,
getDeptTarget,
getDeptTargetPage,
exportDeptTargetExcel,
getCreateInitData,
getPersonTargetPage,
myAchievementByPage
} from "@/api/ecw/deptTarget";
import {listSimpleDepts} from "@/api/system/dept";
import {getChannelList} from '@/api/ecw/channel';
import dayjs from "dayjs";
import {listServiceUser} from "@/api/system/user";
import {getWarehouseList} from '@/api/ecw/warehouse'
import {DICT_TYPE} from "@/utils/dict";
import {warehouseLinePage} from "@/api/ecw/customerContacts";
import {getTradeCountryList} from "@/api/ecw/region";
export default {
name: "EcwOfferAll-routes-list",
components: {},
data() {
return {
countryList:[],
// 遮罩层
loading: true,
// 总条数
total: 0,
list: [],
// 是否显示弹出层
open: false,
tableOpen: false,
channelList: [],
// 查询参数
queryParams: {
page: 1,
rows: 10,
},
// 表单校验
myAchievementData: {},
warehouseList: []
};
},
computed: {
DICT_TYPE() {
return DICT_TYPE
},
exportWarehouseList() {
/* tradeType 1 进口,2出口,3进出口 */
return this.warehouseList.filter(item => item.tradeType == 2 || item.tradeType == 3)
},
importWarehouseList() {
return this.warehouseList.filter(item => item.tradeType == 1 || item.tradeType == 3)
},
},
activated() {
this.getChannelList();
this.getList();
},
created() {
getTradeCountryList().then(r => {
this.countryList = r.data
})
this.getChannelList();
this.getList();
listServiceUser().then(r => {
this.customerServiceList = r.data;
})
getWarehouseList().then(res => {
this.warehouseList = res.data
})
},
methods: {
getChannelList() {
getChannelList().then(res => this.channelList = res.data)
},
customerServiceFn(val) {
if (this.customerServiceList.length > 0) {
let index = this.customerServiceList.findIndex(item => item.id === val.userId);
return index !== -1 ? this.customerServiceList[index]?.nickname : ''
} else {
return ''
}
},
/** 查询列表 */
getList() {
this.loading = true;
const params = {...this.queryParams}
// 执行查询
warehouseLinePage(params).then(r => {
this.loading = false;
this.list = r.data.list;
this.total = r.data.total
})
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.page = 1;
this.getList();
},
}
};
</script>
<style scoped>
.total_num {
display: flex;
align-items: center;
justify-content: center;
margin: 20px 0;
font-size: 15px;
}
.total_num span {
margin: 0 8px;
}
</style>
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
......@@ -274,6 +274,8 @@
<el-button v-else-if="scope.row.orderExceptionType=='stock_up_exception'" v-hasPermi="['ecw:exception:stockUpException']" size="mini" type="text" icon="el-icon-edit" @click="handEdit(scope.row.orderId)">{{$t('处理')}}</el-button>
<el-button v-else-if="scope.row.orderExceptionType=='channel_exception'" v-hasPermi="['ecw:exception:channelException']" size="mini" type="text" icon="el-icon-edit" @click="handEdit(scope.row.orderId)">{{$t('处理')}}</el-button>
<el-button v-else-if="scope.row.orderExceptionType=='channel_packaging_overweight_exception'" v-hasPermi="['ecw:exception:channelPackagingException']" size="mini" type="text" icon="el-icon-edit" @click="handEdit(scope.row.orderId)">{{$t('处理')}}</el-button>
<!-- 2.0.2 -->
<el-button v-else-if="scope.row.orderExceptionType=='line_weight_exception'" v-hasPermi="['ecw:exception:lineWeightException']" size="mini" type="text" icon="el-icon-edit" @click="handEdit(scope.row.orderId)">{{$t('处理')}}</el-button>
</template>
</el-table-column>
</el-table>
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
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