Commit 1b06a571 authored by 332784038@qq.com's avatar 332784038@qq.com

Merge branch 'pre-release' into zhengyi_dev

parents 2f1a232c 459094f5
...@@ -19,4 +19,4 @@ VUE_APP_TENANT_ENABLE = false ...@@ -19,4 +19,4 @@ VUE_APP_TENANT_ENABLE = false
VUE_APP_DOC_ENABLE = true VUE_APP_DOC_ENABLE = true
# 百度统计 # 百度统计
VUE_APP_BAIDU_CODE = fadc1bd5db1a1d6f581df60a1807f8ab VUE_APP_BAIDU_CODE = fadc1bd5db1a1d6f581df60a1807f8ab
\ No newline at end of file
...@@ -7,7 +7,7 @@ VUE_APP_TITLE = 捷道管理系统-测试站 ...@@ -7,7 +7,7 @@ VUE_APP_TITLE = 捷道管理系统-测试站
# 捷道管理系统/开发环境 # 捷道管理系统/开发环境
VUE_APP_BASE_API = 'https://devapi.jd.qipx.top' VUE_APP_BASE_API = 'https://devapi.jd.qipx.top'
# VUE_APP_BASE_API = 'https://apitest.groupage.cn'
# VUE_APP_BASE_API = 'http://110.41.143.128:48080' # VUE_APP_BASE_API = 'http://110.41.143.128:48080'
# VUE_APP_BASE_API = 'http://127.0.0.1:48080' # VUE_APP_BASE_API = 'http://127.0.0.1:48080'
......
...@@ -10,7 +10,7 @@ ENV = 'staging' ...@@ -10,7 +10,7 @@ ENV = 'staging'
VUE_APP_BASE_API = 'https://api.jd.qipx.top' VUE_APP_BASE_API = 'https://api.jd.qipx.top'
# 静态资源地址 # 静态资源地址
# PUBLIC_PATH = 'https://static.jd.qipx.top/' #PUBLIC_PATH = 'https://static.jd.qipx.top/'
# 多租户的开关 # 多租户的开关
VUE_APP_TENANT_ENABLE = false VUE_APP_TENANT_ENABLE = false
......
This diff is collapsed.
...@@ -353,6 +353,20 @@ export function airShipmentCreate(data) { ...@@ -353,6 +353,20 @@ export function airShipmentCreate(data) {
data, data,
}); });
} }
/**
* 空运撤回
*
* @export
* @param {*} data
* @return {*}
*/
export function airShipmentRecall(data) {
return request({
url: "/ecw/box-air-shipment/recall",
method: "put",
data,
});
}
/** /**
* 空运出仓 * 空运出仓
......
import request from '@/utils/request'
// 创建
export async function createCurrencyRate({ sourceId, targetId, sourceAmount, targetAmount, countries, expiration, remarks, }) {
return await request.post('/ecw/currency-rate/create', { sourceId, targetId, sourceAmount, targetAmount, countries, expiration, remarks, })
}
// 更新
export async function updateCurrencyRate(id, { sourceAmount, targetAmount, countries, expiration, remarks, }) {
return await request.put('/ecw/currency-rate/update', { sourceAmount, targetAmount, countries, expiration, remarks, }, { params: { id, }, })
}
// 删除
export async function deleteCurrencyRate(id) {
return await request.delete('/ecw/currency-rate/delete', { params: { id, }, })
}
// 获得
export async function getCurrencyRate({ sourceId, targetId, }) {
return await request.get('/ecw/currency-rate/get', { params: { sourceId, targetId, }, })
}
// 获得分页
export async function getCurrencyRatePage({ sourceId, targetId, countries, expired, expiration, page, rows, }) {
return await request.get('/ecw/currency-rate/page', { params: { sourceId, targetId, countries, expired, expirationAfter: expiration[0], expirationBefore: expiration[1], page, rows, }, })
}
// 获得日志分页
export async function getCurrencyRateLogs({ id, page, rows, }) {
return await request.get('/ecw/currency-rate/logs', { params: { id, page, rows, }})
}
This diff is collapsed.
...@@ -26,6 +26,32 @@ export function queryMemberExchangeRecord(data) { ...@@ -26,6 +26,32 @@ export function queryMemberExchangeRecord(data) {
}); });
} }
//获取会员等级日志
export function queryMemberOperateLevelLog(data) {
return request({
url: "/member/level-operate-log/page",
method: "post",
data: data,
});
}
//获取会员等级详情
export function queryMemberLevelDetails(data) {
return request({
url: "/member/level-details/page",
method: "post",
data: data,
});
}
//更新会员等级详情
export function updateMemberLevelDetails(data) {
return request({
url: "/member/level-details/update",
method: "put",
data: data,
});
}
// 批量核销按钮 // 批量核销按钮
export function batchVerifyAPI(data) { export function batchVerifyAPI(data) {
...@@ -140,7 +166,32 @@ export function addNewMemberLevel(data) { ...@@ -140,7 +166,32 @@ export function addNewMemberLevel(data) {
data, data,
}); });
} }
// 启用关闭 会员等级规则
export function memberLevelStatus(data) {
return request({
url: "/member/user-level/status",
method: "post",
data,
});
}
// 新增会员等级设置
export function memberLevelConfigDetails(data) {
return request({
url: "/member/user-level/get",
method: "post",
data,
});
}
// 操作日志分页
export function operateLogPage(data) {
return request({
url: "/member/user-level-log/page",
method: "post",
data: data,
timeout: 5 * 60000
})
}
// 删除会员等级 // 删除会员等级
export function delMemberLevel(data) { export function delMemberLevel(data) {
return request({ return request({
......
...@@ -17,6 +17,13 @@ export function updateOffer(data) { ...@@ -17,6 +17,13 @@ export function updateOffer(data) {
data: data data: data
}) })
} }
export function updateByCustomerFollow(data) {
return request({
url: "/ecw/offer/updateByCustomerFollow",
method: "put",
data: data
})
}
// 删除报价单管理 // 删除报价单管理
export function deleteOffer(id) { export function deleteOffer(id) {
...@@ -43,6 +50,15 @@ export function getOfferPage(query) { ...@@ -43,6 +50,15 @@ export function getOfferPage(query) {
}) })
} }
// 汇总
export function statistics(query) {
return request({
url: "/ecw/offer/statistics",
method: "get",
params: query
})
}
// 导出报价单管理 Excel // 导出报价单管理 Excel
export function exportOfferExcel(query) { export function exportOfferExcel(query) {
return request({ return request({
......
...@@ -843,6 +843,13 @@ export function canShipmentPage(params) { ...@@ -843,6 +843,13 @@ export function canShipmentPage(params) {
params params
}) })
} }
// 待备货(可出)订单列表数量统计
export function dataScopeCanShipmentCount() {
return request({
url: "/air/order/data/scope/can/shipment/count",
method: "get"
})
}
// 待出订单列表 // 待出订单列表
export function waitingShipmentPage(params) { export function waitingShipmentPage(params) {
return request({ return request({
...@@ -916,6 +923,16 @@ export function noNeedPack(orderItemId) { ...@@ -916,6 +923,16 @@ export function noNeedPack(orderItemId) {
}) })
} }
// 批量无需打包
export function noNeedPacks(data) {
return request({
url: "/order/order-warehouse-in/no-need-to-packs",
method: "post",
data
})
}
// 完成打包 // 完成打包
export function finishPacked(data) { export function finishPacked(data) {
return request({ return request({
......
...@@ -189,3 +189,21 @@ export function getReleaseTypeUpdateInfo(orderId) { ...@@ -189,3 +189,21 @@ export function getReleaseTypeUpdateInfo(orderId) {
method: "get" method: "get"
}) })
} }
//获得控货订单列表查询订单分页
export function getCargoControlDetailListPage(params) {
return request({
url: "/ecw/order-cargo-control-pick/cargo/control/orderDetail",
method: "get",
params
})
}
//查询控货订单列表统计
export function statisticsOrderControl(params) {
return request({
url: "/ecw/order-cargo-control-pick/cargo/control/statistics",
method: "get",
params
})
}
import request from '@/utils/request'
// 创建短信节点
export function createSmsNode(data) {
return request({
url: '/system/sms-node/create',
method: 'post',
data: data
})
}
// 更新短信节点
export function updateSmsNode(data) {
return request({
url: '/system/sms-node/update',
method: 'put',
data: data
})
}
// 删除短信节点
export function deleteSmsNode(id) {
return request({
url: '/system/sms-node/delete?id=' + id,
method: 'delete'
})
}
// 获得短信节点
export function getSmsNode(id) {
return request({
url: '/system/sms-node/get?id=' + id,
method: 'get'
})
}
// 获得短信节点分页
export function getSmsNodePage(query) {
return request({
url: '/system/sms-node/page',
method: 'get',
params: query
})
}
// 导出短信节点 Excel
export function exportSmsNodeExcel(query) {
return request({
url: '/system/sms-node/export-excel',
method: 'get',
params: query,
responseType: 'blob'
})
}
// 测试短信节点
export function testSms(data) {
return request({
url: '/system/sms-node/test',
method: 'post',
data: data
})
}
...@@ -62,3 +62,11 @@ export function exportSmsTemplateExcel(query) { ...@@ -62,3 +62,11 @@ export function exportSmsTemplateExcel(query) {
}) })
} }
// 获得短信模板列表
export function getSmsTemplateList(query) {
return request({
url: '/system/sms-template/list',
method: 'get',
params: query
})
}
<template> <template>
<div class="dict-selector">
<selector v-model="valueSync" :options="countryList" value-field="tel" key-field="id" :label-field="item => $l(item, 'name') + ' +' + item.tel" filterable clearable :disabled="disabled"></selector> <selector v-model="valueSync" :options="countryList" value-field="tel" key-field="id" :label-field="item => $l(item, 'name') + ' +' + item.tel" filterable clearable :disabled="disabled"></selector>
</div>
</template> </template>
<script> <script>
import {getCountryListAll} from '@/api/ecw/country' import {getCountryListAll} from '@/api/ecw/country'
......
<template> <template xmlns="http://www.w3.org/1999/html">
<el-dialog <el-dialog
:title="$t('选择联系人')" :title="$t('选择联系人')"
visible visible
...@@ -6,11 +6,18 @@ ...@@ -6,11 +6,18 @@
:close-on-click-modal="false" :close-on-click-modal="false"
> >
<div class="header mb-10 flex-center"> <div class="header mb-10 flex-center">
<div class="flex-center">{{ $t("关键字") }}</div>
<el-input v-model="form.searchKey" clearable class="w-200"></el-input> <el-form :model="form" size="small" :inline="true" label-width="80px">
<el-button type="primary" class="ml-10" @click="handleQuery">{{ <el-form-item :label="$t('电话')" prop="phone">
$t("搜索") <el-input v-model="form.phone" @change="replaceBlank" clearable class="w-160"></el-input>
}}</el-button> </el-form-item>
<el-form-item :label="$t('关键字')" prop="searchKey">
<el-input v-model="form.searchKey" @change="replaceBlank" clearable class="w-160"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" @click="handleQuery">{{ $t("搜索") }}</el-button>
</el-form-item>
</el-form>
</div> </div>
<div class="list"> <div class="list">
<div <div
...@@ -66,7 +73,9 @@ import { ...@@ -66,7 +73,9 @@ import {
getCustomerContactsSelect, getCustomerContactsSelect,
getCustomerContactsSelect2, getCustomerContactsSelect2,
} from "@/api/ecw/customerContacts"; } from "@/api/ecw/customerContacts";
import UserSelector from "@/components/UserSelector/index.vue";
export default { export default {
components: {UserSelector},
props: { props: {
type: Number, type: Number,
}, },
...@@ -89,6 +98,7 @@ export default { ...@@ -89,6 +98,7 @@ export default {
methods: { methods: {
handleQuery() { handleQuery() {
this.form.pageNo = 1; this.form.pageNo = 1;
this.replaceBlank()
this.loadList(); this.loadList();
}, },
loadList() { loadList() {
...@@ -112,6 +122,15 @@ export default { ...@@ -112,6 +122,15 @@ export default {
choose(contact) { choose(contact) {
this.$emit("choose", contact); this.$emit("choose", contact);
}, },
replaceBlank(){
// JDAA-177 7.选择联系人弹出页,没有去掉中间和前后空格
if(this.form.phone){
this.form.phone = this.form.phone.replace(/\s+/g, '');
}
if(this.form.searchKey) {
this.form.searchKey = this.form.searchKey.replace(/\s+/g, '');
}
}
}, },
}; };
</script> </script>
......
...@@ -85,7 +85,7 @@ export default { ...@@ -85,7 +85,7 @@ export default {
if(!this.value || !this.value.length){ if(!this.value || !this.value.length){
return return
} }
getCustomerContactsSelect({ids: this.value.join(',')}) getCustomerContactsSelect({ids: this.value.join(','),...this.queryParams})
.then(res => { .then(res => {
this.$set(this, 'choosedList', res.data.list) this.$set(this, 'choosedList', res.data.list)
}) })
...@@ -124,4 +124,4 @@ export default { ...@@ -124,4 +124,4 @@ export default {
overflow-x: hidden; overflow-x: hidden;
padding: 0 10px; padding: 0 10px;
} }
</style> </style>
\ No newline at end of file
<template> <template>
<div class="dict-selector"> <div class="dict-selector">
<el-select <el-select v-if="formType == 'select'" v-model="valueSync" filterable :placeholder="placeholder || $t('请选择')" :clearable="clearable" :multiple="multiple" :disabled="disabled" @change="(val) => $emit('change', val)">
v-if="formType == 'select'" <el-option v-for="dict in formattedList" :key="dict.value" :label="$l(dict, 'label')" :value="dict.value" />
v-model="valueSync"
:placeholder="placeholder || $t('请选择')"
:clearable="clearable"
:multiple="multiple"
:disabled="disabled"
@change="(val) => $emit('change', val)"
>
<el-option
v-for="dict in formattedList"
:key="dict.value"
:label="$l(dict, 'label')"
:value="dict.value"
/>
</el-select> </el-select>
<el-radio-group <el-radio-group v-if="formType == 'radio'" v-model="valueSync" :disabled="disabled">
v-if="formType == 'radio'" <el-radio v-for="dict in formattedList" :label="dict.value" :checked="valueSync === dict.value" :key="dict.value">{{ $l(dict, "label") }}</el-radio>
v-model="valueSync"
:disabled="disabled"
>
<el-radio
v-for="dict in formattedList"
:label="dict.value"
:checked="valueSync === dict.value"
:key="dict.value"
>{{ $l(dict, "label") }}</el-radio
>
</el-radio-group> </el-radio-group>
<el-checkbox-group <el-checkbox-group v-if="formType == 'checkbox'" v-model="valueSync" :disabled="disabled">
v-if="formType == 'checkbox'" <el-checkbox v-for="dict in formattedList" :label="dict.value" :key="dict.value">{{ $l(dict, "label") }}</el-checkbox>
v-model="valueSync"
:disabled="disabled"
>
<el-checkbox
v-for="dict in formattedList"
:label="dict.value"
:key="dict.value"
>{{ $l(dict, "label") }}</el-checkbox
>
</el-checkbox-group> </el-checkbox-group>
</div> </div>
</template> </template>
...@@ -47,31 +15,29 @@ ...@@ -47,31 +15,29 @@
const FORMATTERS = { const FORMATTERS = {
string: String, string: String,
bool: function (val) { bool: function (val) {
return [false, "false", 0, "0"].indexOf(val) < 0; return [false, "false", 0, "0"].indexOf(val) < 0
}, },
number: Number, number: Number,
array: function (val) { array: function (val) {
return typeof val == "string" return typeof val == "string" ? val.split(",").filter((item) => item && item !== "") : val
? val.split(",").filter((item) => item && item !== "") }
: val; }
},
};
export default { export default {
props: { props: {
placeholder: { placeholder: {
type: String, type: String,
default: null, default: null
}, },
type: String, type: String,
value: [String, Number, Array, Boolean], value: [String, Number, Array, Boolean],
multiple: Boolean, multiple: Boolean,
formType: { formType: {
type: String, type: String,
default: "select", default: "select"
}, },
formatter: { formatter: {
type: [Function, String], type: [Function, String],
default: String, default: String
}, },
defaultable: Boolean, // 是否默认选择第一个 defaultable: Boolean, // 是否默认选择第一个
disabled: Boolean, disabled: Boolean,
...@@ -80,104 +46,92 @@ export default { ...@@ -80,104 +46,92 @@ export default {
*/ */
filter: { filter: {
type: Function, type: Function,
default: () => true, default: () => true
}, },
clearable: Boolean, clearable: Boolean
}, },
data() { data() {
return { return {
valueSync: this.multiple ? [] : null, valueSync: this.multiple ? [] : null
}; }
}, },
computed: { computed: {
dicts() { dicts() {
return this.getList(this.type); return this.getList(this.type)
}, },
dictList() { dictList() {
return this.dicts.filter(this.filter); return this.dicts.filter(this.filter)
}, },
formattedList() { formattedList() {
let arr = []; let arr = []
this.dictList.forEach((item) => { this.dictList.forEach((item) => {
arr.push({ arr.push({
label: item.label, label: item.label,
labelEn: item.labelEn, labelEn: item.labelEn,
value: this.format(item.value), value: this.format(item.value),
cssClass: item.cssClass, cssClass: item.cssClass,
colorType: item.colorType, colorType: item.colorType
}); })
}); })
return arr; return arr
}, }
}, },
watch: { watch: {
valueSync(val) { valueSync(val) {
this.$emit("input", val); this.$emit("input", val)
}, },
value(val) { value(val) {
if (val != this.valueSync) this.setValueSync(); if (val != this.valueSync) this.setValueSync()
}, },
dictList() { dictList() {
this.setDefault(); this.setDefault()
}, }
}, },
created() { created() {
this.setValueSync(); this.setValueSync()
this.setDefault(); this.setDefault()
}, },
methods: { methods: {
format(val) { format(val) {
if (val === null || val == undefined || val == "") return val; if (val === null || val == undefined || val == "") return val
let formatter = let formatter = typeof this.formatter == "function" ? this.formatter : FORMATTERS[this.formatter]
typeof this.formatter == "function"
? this.formatter
: FORMATTERS[this.formatter];
if (!formatter) { if (!formatter) {
console.warn("格式器无效", this.formatter); console.warn("格式器无效", this.formatter)
return val; return val
} }
return formatter(val); return formatter(val)
}, },
changeValue(val) { changeValue(val) {
this.valueSync = val; this.valueSync = val
}, },
setValueSync() { setValueSync() {
if ( if (this.value === null || this.value === undefined || this.value === "") {
this.value === null || return (this.valueSync = this.multiple ? [] : this.value)
this.value === undefined ||
this.value === ""
) {
return (this.valueSync = this.multiple ? [] : this.value);
} }
if (this.multiple) { if (this.multiple) {
let value = this.value || []; let value = this.value || []
if (typeof this.value == "string") { if (typeof this.value == "string") {
value = this.value.split(",").filter((item) => item && item != ""); value = this.value.split(",").filter((item) => item && item != "")
} }
this.valueSync = value.map((item) => this.format(item)); this.valueSync = value.map((item) => this.format(item))
} else { } else {
this.valueSync = this.format(this.value); this.valueSync = this.format(this.value)
} }
}, },
getList() { getList() {
return this.getDictDatas(this.type); return this.getDictDatas(this.type)
}, },
setDefault() { setDefault() {
if (!this.defaultable) return; if (!this.defaultable) return
if ( if (this.dictList.length && (this.valueSync === null || this.valueSync == undefined || this.valueSync == "")) {
this.dictList.length && this.valueSync = this.multiple ? [] : this.formattedList[0].value
(this.valueSync === null ||
this.valueSync == undefined ||
this.valueSync == "")
) {
this.valueSync = this.multiple ? [] : this.formattedList[0].value;
} }
}, }
}, }
}; }
</script> </script>
<style scoped> <style scoped>
.dict-selector { .dict-selector {
......
...@@ -85,7 +85,7 @@ export default { ...@@ -85,7 +85,7 @@ export default {
["link", "image", "video"] // 链接、图片、视频 ["link", "image", "video"] // 链接、图片、视频
], ],
}, },
placeholder: "请输入内容", placeholder: this.$t("请输入内容"),
readOnly: this.readOnly, readOnly: this.readOnly,
}, },
}; };
......
...@@ -422,6 +422,7 @@ export default { ...@@ -422,6 +422,7 @@ export default {
}, },
}, },
async created() { async created() {
this.tradeCityList = (await getTradeCityList()).data this.tradeCityList = (await getTradeCityList()).data
// 路线需要过滤失效的进出口城市,所以在程序加载后再加载路线 // 路线需要过滤失效的进出口城市,所以在程序加载后再加载路线
await this.getOpenedRouterList() await this.getOpenedRouterList()
...@@ -434,6 +435,7 @@ export default { ...@@ -434,6 +435,7 @@ export default {
// this.getAddressCity() // this.getAddressCity()
// this.getAddressTown() // this.getAddressTown()
this.getChannelList() this.getChannelList()
if (this.value && this.value.length) { if (this.value && this.value.length) {
this.selectedRoutes = this.value this.selectedRoutes = this.value
} }
...@@ -442,9 +444,11 @@ export default { ...@@ -442,9 +444,11 @@ export default {
if (this.showAttr) { if (this.showAttr) {
this.getAttrList() this.getAttrList()
} }
await this.$nextTick() await this.$nextTick()
this.inited = true
setTimeout(() => {
this.inited = true
}, 1000);
}, },
methods: { methods: {
getChannelList() { getChannelList() {
...@@ -486,6 +490,7 @@ export default { ...@@ -486,6 +490,7 @@ export default {
this.exportCity = +this.option.exportCity || null this.exportCity = +this.option.exportCity || null
this.transportType = this.option.transportId || null this.transportType = this.option.transportId || null
this.channelId = +this.option.channelId || null this.channelId = +this.option.channelId || null
this.channelIds = this.option.channelIds || []
}, },
// 全选、全不选 某个运输方式所有线路 // 全选、全不选 某个运输方式所有线路
toggleGroupChecker(index, selected) { toggleGroupChecker(index, selected) {
......
<template> <template>
<el-select :clearable="clearable" v-model="valueSync" :multiple="multiple" :disabled="disabled" :filterable="filterable" :placeholder="$t('请选择')"> <el-select :clearable="clearable" v-model="valueSync" :multiple="multiple" :disabled="disabled" :filterable="filterable" :placeholder="$t('请选择')" @change="(val) => $emit('change', val)">
<el-option v-for="item in optionsFormated" :key="item.key" :label="item.label" :value="item.value" /> <el-option v-for="item in optionsFormated" :key="item.key" :label="item.label" :value="item.value" />
</el-select> </el-select>
</template> </template>
<script> <script>
export default { export default {
data(){ data() {
return { return {
valueSync: undefined valueSync: undefined
} }
},
props: {
options: Array,
value: [String, Number, Array, Boolean, Object],
labelField: {
type: [String, Function],
default: "label"
},
valueField: {
type: String,
default: "value"
}, },
props:{ keyField: {
options: Array, type: String,
value: [String, Number, Array, Boolean, Object], default: "value"
labelField: {
type: [String, Function],
default: 'label'
},
valueField: {
type: String,
default: 'value'
},
keyField:{
type: String,
default: 'value'
},
filterable: Boolean,
multiple: Boolean,
clearable: Boolean,
defaultable: Boolean, // 没有值的时候是否选择第一项
disabled: Boolean,
test: String
}, },
computed:{ filterable: Boolean,
optionsFormated(){ multiple: Boolean,
let arr = [] clearable: Boolean,
this.options.forEach((item, index) => { defaultable: Boolean, // 没有值的时候是否选择第一项
arr.push({ disabled: Boolean,
label: typeof this.labelField == 'string' ? item[this.labelField] : (this.labelField)(item, index), test: String
value: item[this.valueField], },
key: item[this.keyField] computed: {
}) optionsFormated() {
}) let arr = []
return arr this.options.forEach((item, index) => {
} arr.push({
label: typeof this.labelField == "string" ? item[this.labelField] : this.labelField(item, index),
value: item[this.valueField],
key: item[this.keyField]
})
})
return arr
}
},
watch: {
valueSync(val) {
console.log("valueSync变化", val, this.value)
this.$emit("input", val)
}, },
watch:{ value(value) {
valueSync(val){ console.log("value传值变化", value, this.valueSync)
console.log('valueSync变化', val, this.value) if (value !== undefined) this.valueSync = value
this.$emit('input', val)
},
value(value){
console.log('value传值变化', value, this.valueSync)
if(value !== undefined)this.valueSync = value
},
optionsFormated(){
this.setDefault()
},
test(val, old){
console.warn('test变化', val, old)
}
}, },
created(){ optionsFormated() {
if(this.test == 'allPriceUnit'){ this.setDefault()
console.log('allPriceUnit selector', this.value, this.defaultable)
}
this.valueSync = this.value
this.setDefault()
}, },
methods:{ test(val, old) {
setDefault(){ console.warn("test变化", val, old)
if(!this.defaultable){ }
return false },
} created() {
if(this.optionsFormated.length && (this.valueSync == null || this.valueSync == '')){ if (this.test == "allPriceUnit") {
this.valueSync = this.optionsFormated[0].value console.log("allPriceUnit selector", this.value, this.defaultable)
} }
} this.valueSync = this.value
this.setDefault()
},
methods: {
setDefault() {
if (!this.defaultable) {
return false
}
if (this.optionsFormated.length && (this.valueSync == null || this.valueSync == "")) {
this.valueSync = this.optionsFormated[0].value
}
} }
}
} }
</script> </script>
...@@ -4,8 +4,11 @@ ...@@ -4,8 +4,11 @@
<!-- 对话框(添加 / 修改) --> <!-- 对话框(添加 / 修改) -->
<el-dialog :title="title" :visible.sync="open" width="900px" append-to-body> <el-dialog :title="title" :visible.sync="open" width="900px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px"> <el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="客户名称" prop="customerId"> <el-form-item label="客户编号" prop="customerNumber">
<customer-select v-model="form.customerId" ></customer-select> <el-input v-model="form.customerNumber" type="text" disabled style="width: 206px"></el-input>
</el-form-item>
<el-form-item label="客户名称" prop="customerName">
<el-input v-model="form.customerName" type="text" disabled style="width: 206px"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="投诉类型" prop="type"> <el-form-item label="投诉类型" prop="type">
<el-select v-model="form.type" placeholder="请选择投诉类型"> <el-select v-model="form.type" placeholder="请选择投诉类型">
...@@ -44,7 +47,7 @@ ...@@ -44,7 +47,7 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="投诉内容" prop="content"> <el-form-item label="投诉内容" prop="content">
<el-input v-model="form.content" type="textarea" placeholder="请输入内容" /> <el-input v-model="form.content" type="textarea" rows="6" placeholder="请输入内容" />
</el-form-item> </el-form-item>
<el-form-item label="处理状态" prop="status"> <el-form-item label="处理状态" prop="status">
<span>{{ getDictDataLabel(DICT_TYPE.CUSTOMER_COMPLAINT_STATUS, 1) }}</span> <span>{{ getDictDataLabel(DICT_TYPE.CUSTOMER_COMPLAINT_STATUS, 1) }}</span>
...@@ -69,7 +72,7 @@ ...@@ -69,7 +72,7 @@
:filter="(e) => e.value == '2' || e.value == '3'" :formatter="Number"></dict-selector> :filter="(e) => e.value == '2' || e.value == '3'" :formatter="Number"></dict-selector>
</el-form-item> </el-form-item>
<el-form-item v-show="form.status == '2'" label="查明原因" required> <el-form-item v-show="form.status == '2'" label="查明原因" required>
<el-input type="textarea" placeholder="请输入查明原因" v-model="form.ascertainReason"></el-input> <el-input type="textarea" placeholder="请输入查明原因" v-model="forertainReason"></el-input>
</el-form-item> </el-form-item>
<el-form-item v-show="form.status == '2'" label="处理方案"> <el-form-item v-show="form.status == '2'" label="处理方案">
<el-input v-model="form.plan" placeholder="请输入处理方案"></el-input> <el-input v-model="form.plan" placeholder="请输入处理方案"></el-input>
...@@ -109,6 +112,7 @@ import DictSelector from '@/components/DictSelector' ...@@ -109,6 +112,7 @@ import DictSelector from '@/components/DictSelector'
import { DICT_TYPE, getDictDatas, getDictDataLabel } from '@/utils/dict' import { DICT_TYPE, getDictDatas, getDictDataLabel } from '@/utils/dict'
import {getBillNoSearch, getOrderNoSearch} from "@/api/ecw/order" import {getBillNoSearch, getOrderNoSearch} from "@/api/ecw/order"
import customerSelect from "@/views/ecw/customer/customerSelect"; import customerSelect from "@/views/ecw/customer/customerSelect";
import CustomerSelectByNumber from '@/views/ecw/customer/customerSelectByNumber.vue'
export default { export default {
name: "customerComplaints", name: "customerComplaints",
...@@ -117,9 +121,12 @@ export default { ...@@ -117,9 +121,12 @@ export default {
* 作为组件时要传入 customerId,用于限制范围和隐藏搜索筛选 * 作为组件时要传入 customerId,用于限制范围和隐藏搜索筛选
*/ */
props: { props: {
customerId: Number customerId: Number,
customerName: String,
customerNumber: String,
}, },
components: { components: {
CustomerSelectByNumber,
DictSelector, DictSelector,
customerSelect customerSelect
}, },
...@@ -203,6 +210,8 @@ export default { ...@@ -203,6 +210,8 @@ export default {
this.form = { this.form = {
id: undefined, id: undefined,
customerId: this.customerId, customerId: this.customerId,
customerName: this.customerName,
customerNumber: this.customerNumber,
type: undefined, type: undefined,
orderId: undefined, orderId: undefined,
ladingbillId: undefined, ladingbillId: undefined,
......
This diff is collapsed.
...@@ -324,5 +324,8 @@ ...@@ -324,5 +324,8 @@
"特殊设置": "特殊设置", "特殊设置": "特殊设置",
"已卸柜/已到仓时间": "已卸柜/已到仓时间", "已卸柜/已到仓时间": "已卸柜/已到仓时间",
"动态": "动态", "动态": "动态",
"增值服务": "增值服务" "增值服务": "增值服务",
"免泡重量": "免泡重量",
"请输入免泡重量": "请输入免泡重量",
"出货撤回": "出货撤回"
} }
<template> <template>
<div v-if="!item.hidden"> <div v-if="!item.hidden">
<template v-if="hasOneShowingChild(item.children,item) && (!onlyOneChild.children||onlyOneChild.noShowingChildren)&&!item.alwaysShow"> <template v-if="hasOneShowingChild(item.children, item) && (!onlyOneChild.children || onlyOneChild.noShowingChildren) && !item.alwaysShow">
<app-link v-if="onlyOneChild.meta" :to="resolvePath(onlyOneChild.path)"> <app-link v-if="onlyOneChild.meta" :to="resolvePath(onlyOneChild.path)">
<el-menu-item :index="resolvePath(onlyOneChild.path)" :class="{'submenu-title-noDropdown':!isNest}"> <el-menu-item :index="resolvePath(onlyOneChild.path)" :class="{ 'submenu-title-noDropdown': !isNest }">
<item :icon="onlyOneChild.meta.icon||(item.meta&&item.meta.icon)" :title="$l(onlyOneChild.meta, 'title')" :badge="badge" /> <item :icon="onlyOneChild.meta.icon || (item.meta && item.meta.icon)" :title="$l(onlyOneChild.meta, 'title')" :badge="badge" />
</el-menu-item> </el-menu-item>
</app-link> </app-link>
</template> </template>
...@@ -12,27 +12,20 @@ ...@@ -12,27 +12,20 @@
<template slot="title"> <template slot="title">
<item v-if="item.meta" :icon="item.meta && item.meta.icon" :title="$l(item.meta, 'title')" :badge="badge" /> <item v-if="item.meta" :icon="item.meta && item.meta.icon" :title="$l(item.meta, 'title')" :badge="badge" />
</template> </template>
<sidebar-item <sidebar-item v-for="(child, index) in item.children" :key="index" :is-nest="true" :item="child" :base-path="resolvePath(child.path)" class="nest-menu" />
v-for="child in item.children"
:key="child.path"
:is-nest="true"
:item="child"
:base-path="resolvePath(child.path)"
class="nest-menu"
/>
</el-submenu> </el-submenu>
</div> </div>
</template> </template>
<script> <script>
import path from 'path' import path from "path"
import { isExternal } from '@/utils/validate' import { isExternal } from "@/utils/validate"
import Item from './Item' import Item from "./Item"
import AppLink from './Link' import AppLink from "./Link"
import FixiOSBug from './FixiOSBug' import FixiOSBug from "./FixiOSBug"
export default { export default {
name: 'SidebarItem', name: "SidebarItem",
components: { Item, AppLink }, components: { Item, AppLink },
mixins: [FixiOSBug], mixins: [FixiOSBug],
props: { props: {
...@@ -47,24 +40,24 @@ export default { ...@@ -47,24 +40,24 @@ export default {
}, },
basePath: { basePath: {
type: String, type: String,
default: '' default: ""
} }
}, },
data() { data() {
this.onlyOneChild = null this.onlyOneChild = null
return {} return {}
}, },
computed:{ computed: {
badge(){ badge() {
return this.$store.getters.badgeData[this.item.meta?.badgeField] return this.$store.getters.badgeData[this.item.meta?.badgeField]
} }
}, },
methods: { methods: {
hasOneShowingChild(children = [], parent) { hasOneShowingChild(children = [], parent) {
if (!children) { if (!children) {
children = []; children = []
} }
const showingChildren = children.filter(item => { const showingChildren = children.filter((item) => {
if (item.hidden) { if (item.hidden) {
return false return false
} else { } else {
...@@ -81,7 +74,7 @@ export default { ...@@ -81,7 +74,7 @@ export default {
// Show parent if there are no child router to display // Show parent if there are no child router to display
if (showingChildren.length === 0) { if (showingChildren.length === 0) {
this.onlyOneChild = { ... parent, path: '', noShowingChildren: true } this.onlyOneChild = { ...parent, path: "", noShowingChildren: true }
return true return true
} }
......
import Vue from 'vue' import Vue from "vue"
import Cookies from 'js-cookie' import Cookies from "js-cookie"
import Element from 'element-ui' import Element from "element-ui"
import './assets/styles/element-variables.scss' import "./assets/styles/element-variables.scss"
import '@/assets/styles/index.scss' // global css import "@/assets/styles/index.scss" // global css
import '@/assets/styles/ruoyi.scss' // ruoyi css import "@/assets/styles/ruoyi.scss" // ruoyi css
import App from './App' import App from "./App"
import store from './store' import store from "./store"
import router from './router' import router from "./router"
import directive from './directive' // directive import directive from "./directive" // directive
import plugins from './plugins' // plugins import plugins from "./plugins" // plugins
import Print from 'vue-print-nb' import Print from "vue-print-nb"
import './assets/icons' // icon import "./assets/icons" // icon
import './permission' // permission control import "./permission" // permission control
import './tongji' // 百度统计 import "./tongji" // 百度统计
import { getDicts } from "@/api/system/dict/data"; import { getDicts } from "@/api/system/dict/data"
import { getConfigKey } from "@/api/infra/config"; import { getConfigKey } from "@/api/infra/config"
import { parseTime, resetForm, addDateRange, addBeginAndEndTime, addBeginAndEndTimeNew, handleTree} from "@/utils/ruoyi"; import { parseTime, resetForm, addDateRange, addBeginAndEndTime, addBeginAndEndTimeNew, handleTree } from "@/utils/ruoyi"
import Pagination from "@/components/Pagination"; import { removeEmpty } from "@/utils/index"
import Pagination from "@/components/Pagination"
// 自定义表格工具扩展 // 自定义表格工具扩展
import RightToolbar from "@/components/RightToolbar" import RightToolbar from "@/components/RightToolbar"
import DictSelector from '@/components/DictSelector' import DictSelector from "@/components/DictSelector"
// 代码高亮插件 // 代码高亮插件
// import hljs from 'highlight.js' // import hljs from 'highlight.js'
// import 'highlight.js/styles/github-gist.css' // import 'highlight.js/styles/github-gist.css'
import {DICT_TYPE, getDictDataLabel, getDictDatas, getDictDatas2} from "@/utils/dict"; import { DICT_TYPE, getDictDataLabel, getDictDatas, getDictDatas2 } from "@/utils/dict"
import i18n from './i18n' import i18n from "./i18n"
// 全局方法挂载 // 全局方法挂载
Vue.prototype.getDicts = getDicts Vue.prototype.getDicts = getDicts
...@@ -39,40 +40,40 @@ Vue.prototype.getDictDatas2 = getDictDatas2 ...@@ -39,40 +40,40 @@ Vue.prototype.getDictDatas2 = getDictDatas2
Vue.prototype.getDictDataLabel = getDictDataLabel Vue.prototype.getDictDataLabel = getDictDataLabel
Vue.prototype.DICT_TYPE = DICT_TYPE Vue.prototype.DICT_TYPE = DICT_TYPE
Vue.prototype.handleTree = handleTree Vue.prototype.handleTree = handleTree
Vue.prototype.removeEmpty = removeEmpty
Date.prototype.format = function(format) { Date.prototype.format = function (format) {
var date = { var date = {
"M+": this.getMonth() + 1, "M+": this.getMonth() + 1,
"d+": this.getDate(), "d+": this.getDate(),
"h+": this.getHours(), "h+": this.getHours(),
"m+": this.getMinutes(), "m+": this.getMinutes(),
"s+": this.getSeconds(), "s+": this.getSeconds(),
"q+": Math.floor((this.getMonth() + 3) / 3), "q+": Math.floor((this.getMonth() + 3) / 3),
"S+": this.getMilliseconds() "S+": this.getMilliseconds()
}; }
if (/(y+)/i.test(format)) { if (/(y+)/i.test(format)) {
format = format.replace(RegExp.$1, (this.getFullYear() + '').substr(4 - RegExp.$1.length)); format = format.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length))
} }
for (var k in date) { for (var k in date) {
if (new RegExp("(" + k + ")").test(format)) { if (new RegExp("(" + k + ")").test(format)) {
format = format.replace(RegExp.$1, RegExp.$1.length == 1 format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? date[k] : ("00" + date[k]).substr(("" + date[k]).length))
? date[k] : ("00" + date[k]).substr(("" + date[k]).length)); }
}
} }
return format; return format
} }
// 全局组件挂载 // 全局组件挂载
Vue.component('DictTag', DictTag) Vue.component("DictTag", DictTag)
Vue.component('DocAlert', DocAlert) Vue.component("DocAlert", DocAlert)
Vue.component('Pagination', Pagination) Vue.component("Pagination", Pagination)
Vue.component('RightToolbar', RightToolbar) Vue.component("RightToolbar", RightToolbar)
Vue.component('DictSelector', DictSelector) Vue.component("DictSelector", DictSelector)
// 字典标签组件 // 字典标签组件
import DictTag from '@/components/DictTag' import DictTag from "@/components/DictTag"
import DocAlert from '@/components/DocAlert' import DocAlert from "@/components/DocAlert"
// 头部标签插件 // 头部标签插件
import VueMeta from 'vue-meta' import VueMeta from "vue-meta"
Vue.use(directive) Vue.use(directive)
Vue.use(plugins) Vue.use(plugins)
...@@ -81,22 +82,22 @@ Vue.use(Print) ...@@ -81,22 +82,22 @@ Vue.use(Print)
// Vue.use(hljs.vuePlugin); // Vue.use(hljs.vuePlugin);
// bpmnProcessDesigner 需要引入 // bpmnProcessDesigner 需要引入
import MyPD from "@/components/bpmnProcessDesigner/package/index.js"; import MyPD from "@/components/bpmnProcessDesigner/package/index.js"
Vue.use(MyPD); Vue.use(MyPD)
import "@/components/bpmnProcessDesigner/package/theme/index.scss"; import "@/components/bpmnProcessDesigner/package/theme/index.scss"
import "bpmn-js/dist/assets/diagram-js.css"; import "bpmn-js/dist/assets/diagram-js.css"
import "bpmn-js/dist/assets/bpmn-font/css/bpmn.css"; import "bpmn-js/dist/assets/bpmn-font/css/bpmn.css"
import "bpmn-js/dist/assets/bpmn-font/css/bpmn-codes.css"; import "bpmn-js/dist/assets/bpmn-font/css/bpmn-codes.css"
import "bpmn-js/dist/assets/bpmn-font/css/bpmn-embedded.css"; import "bpmn-js/dist/assets/bpmn-font/css/bpmn-embedded.css"
// Form Generator 组件需要使用到 tinymce // Form Generator 组件需要使用到 tinymce
import Tinymce from '@/components/tinymce/index.vue' import Tinymce from "@/components/tinymce/index.vue"
Vue.component('tinymce', Tinymce) Vue.component("tinymce", Tinymce)
import '@/icons' import "@/icons"
import axios from 'axios' import axios from "axios"
Vue.prototype.$axios = axios Vue.prototype.$axios = axios
import '@/styles/index.scss' import "@/styles/index.scss"
import '@/styles/custom.scss' import "@/styles/custom.scss"
/** /**
* If you don't want to use mock-server * If you don't want to use mock-server
...@@ -108,40 +109,46 @@ import '@/styles/custom.scss' ...@@ -108,40 +109,46 @@ import '@/styles/custom.scss'
*/ */
Vue.use(Element, { Vue.use(Element, {
size: Cookies.get('size') || 'medium', // set element-ui default size size: Cookies.get("size") || "medium", // set element-ui default size
i18n: (key, value) => i18n.t(key, value) i18n: (key, value) => i18n.t(key, value)
}) })
// 重定向路由(关闭当前标签) // 重定向路由(关闭当前标签)
Vue.prototype.$redirect = (path) =>{ Vue.prototype.$redirect = (path) => {
let currentView = router.history.current let currentView = router.history.current
router.replace(path) router.replace(path)
store.dispatch("tagsView/delView", currentView) store.dispatch("tagsView/delView", currentView)
} }
window.ElementUI = Element window.ElementUI = Element
// 显示表单错误信息 // 显示表单错误信息
Vue.prototype.$showFormValidateErrors = (errors) => { Vue.prototype.$showFormValidateErrors = (errors) => {
let vm = new Vue() let vm = new Vue()
let createElement = vm.$createElement let createElement = vm.$createElement
let fieldList = Object.values(errors) let fieldList = Object.values(errors)
Element.Notification({ Element.Notification({
title: i18n.$t('表单错误'), title: i18n.$t("表单错误"),
type: 'warning', type: "warning",
duration: 3000, duration: 3000,
message: createElement('div', fieldList.map(function (errorList) { message: createElement(
return createElement('div', errorList.map((item) => { "div",
return createElement('div', item.message) fieldList.map(function (errorList) {
})) return createElement(
})) "div",
}) errorList.map((item) => {
return createElement("div", item.message)
})
)
})
)
})
} }
Vue.config.productionTip = false Vue.config.productionTip = false
new Vue({ new Vue({
el: '#app', el: "#app",
router, router,
store, store,
i18n, i18n,
render: h => h(App) render: (h) => h(App)
}) })
import router from "./router"; import router from "./router"
import store from "./store"; import store from "./store"
import { Message } from "element-ui"; import { Message } from "element-ui"
import NProgress from "nprogress"; import NProgress from "nprogress"
import "nprogress/nprogress.css"; import "nprogress/nprogress.css"
import { getToken } from "@/utils/auth"; import { getToken } from "@/utils/auth"
import { isRelogin } from "@/utils/request"; import { isRelogin } from "@/utils/request"
NProgress.configure({ showSpinner: false }); NProgress.configure({ showSpinner: false })
// 增加三方登陆 update by 芋艿 // 增加三方登陆 update by 芋艿
const whiteList = [ const whiteList = ["/login", "/social-login", "/auth-redirect", "/bind", "/register", "/oauthLogin/gitee"]
"/login",
"/social-login",
"/auth-redirect",
"/bind",
"/register",
"/oauthLogin/gitee",
];
router.beforeEach((to, from, next) => { router.beforeEach((to, from, next) => {
NProgress.start(); NProgress.start()
if (to.matched && to.matched.length > 2) { if (to.matched && to.matched.length > 2) {
to.matched.splice(1, to.matched.length - 2); to.matched.splice(1, to.matched.length - 2)
} }
if (getToken()) { if (getToken()) {
to.meta.title && store.dispatch("settings/setTitle", to.meta.title); to.meta.title && store.dispatch("settings/setTitle", to.meta.title)
/* has token*/ /* has token*/
if (to.path === "/login") { if (to.path === "/login") {
next({ path: "/" }); next({ path: "/" })
NProgress.done(); NProgress.done()
} else { } else {
if (store.getters.roles.length === 0) { if (store.getters.roles.length === 0) {
isRelogin.show = true; isRelogin.show = true
// 获取字典数据 add by 芋艿 // 获取字典数据 add by 芋艿
store.dispatch("dict/loadDictDatas"); store.dispatch("dict/loadDictDatas")
//获取货币
store.dispatch("staticData/loadCurrencyList")
// 判断当前用户是否已拉取完user_info信息 // 判断当前用户是否已拉取完user_info信息
store store
.dispatch("GetInfo") .dispatch("GetInfo")
.then(() => { .then(() => {
isRelogin.show = false; isRelogin.show = false
store.dispatch("GenerateRoutes").then((accessRoutes) => { store.dispatch("GenerateRoutes").then((accessRoutes) => {
// 根据roles权限生成可访问的路由表 // 根据roles权限生成可访问的路由表
router.addRoutes(accessRoutes); // 动态添加可访问路由表 router.addRoutes(accessRoutes) // 动态添加可访问路由表
next({ ...to, replace: true }); // hack方法 确保addRoutes已完成 next({ ...to, replace: true }) // hack方法 确保addRoutes已完成
}); })
}) })
.catch((err) => { .catch((err) => {
store.dispatch("LogOut").then(() => { store.dispatch("LogOut").then(() => {
Message.error(err); Message.error(err)
next({ path: "/" }); next({ path: "/" })
}); })
}); })
} else { } else {
next(); next()
} }
} }
} else { } else {
// 没有token // 没有token
if (whiteList.indexOf(to.path) !== -1) { if (whiteList.indexOf(to.path) !== -1) {
// 在免登录白名单,直接进入 // 在免登录白名单,直接进入
next(); next()
} else { } else {
next(`/login?redirect=${to.fullPath}`); // 否则全部重定向到登录页 next(`/login?redirect=${to.fullPath}`) // 否则全部重定向到登录页
NProgress.done(); NProgress.done()
} }
} }
}); })
router.afterEach(() => { router.afterEach(() => {
NProgress.done(); NProgress.done()
}); })
import { getCurrency } from "@/api/ecw/currency"
const getters = { const getters = {
sidebar: state => state.app.sidebar, sidebar: (state) => state.app.sidebar,
size: state => state.app.size, size: (state) => state.app.size,
device: state => state.app.device, device: (state) => state.app.device,
visitedViews: state => state.tagsView.visitedViews, visitedViews: (state) => state.tagsView.visitedViews,
cachedViews: state => state.tagsView.cachedViews, cachedViews: (state) => state.tagsView.cachedViews,
userId: state => state.user.id, userId: (state) => state.user.id,
token: state => state.user.token, token: (state) => state.user.token,
avatar: state => state.user.avatar, avatar: (state) => state.user.avatar,
name: state => state.user.name, name: (state) => state.user.name,
introduction: state => state.user.introduction, introduction: (state) => state.user.introduction,
roles: state => state.user.roles, roles: (state) => state.user.roles,
permissions: state => state.user.permissions, permissions: (state) => state.user.permissions,
permission_routes: state => state.permission.routes, permission_routes: (state) => state.permission.routes,
// 工具栏 // 工具栏
topbarRouters:state => state.permission.topbarRouters, topbarRouters: (state) => state.permission.topbarRouters,
defaultRoutes:state => state.permission.defaultRoutes, defaultRoutes: (state) => state.permission.defaultRoutes,
sidebarRouters:state => state.permission.sidebarRouters, sidebarRouters: (state) => state.permission.sidebarRouters,
// 数据字典 // 数据字典
dict_datas: state => state.dict.dictDatas, dict_datas: (state) => state.dict.dictDatas,
// 角标数据 // 角标数据
badgeData: state => state.user.badgeData badgeData: (state) => state.user.badgeData,
//获取货币
getCurrencySymbol: (state) => (id) => {
const label = state.staticData.currencyList.find((currencyItem) => currencyItem.id === id)
return label ? label.fuhao : ""
},
getCurrencyData: (state) => (id) => {
const label = state.staticData.currencyList.find((currencyItem) => currencyItem.id === id)
return label ? label : {}
}
} }
export default getters export default getters
import Vue from 'vue' import Vue from "vue"
import Vuex from 'vuex' import Vuex from "vuex"
import app from './modules/app' import app from "./modules/app"
import user from './modules/user' import user from "./modules/user"
import tagsView from './modules/tagsView' import tagsView from "./modules/tagsView"
import permission from './modules/permission' import permission from "./modules/permission"
import settings from './modules/settings' import settings from "./modules/settings"
import dict from './modules/dict' import dict from "./modules/dict"
import getters from './getters' import getters from "./getters"
import staticData from "./modules/staticData"
Vue.use(Vuex) Vue.use(Vuex)
...@@ -18,6 +19,7 @@ const store = new Vuex.Store({ ...@@ -18,6 +19,7 @@ const store = new Vuex.Store({
permission, permission,
settings, settings,
dict, dict,
staticData
}, },
getters getters
}) })
......
import { getCurrencyList } from "@/api/ecw/currency" //币种列表
const state = {
currencyList: []
}
const mutations = {
SET_CURRENCY_LIST: (state, currencyList) => {
state.currencyList = currencyList
}
}
const actions = {
async loadCurrencyList({ commit }) {
const response = await getCurrencyList()
if (!response || !response.data) {
return
}
commit("SET_CURRENCY_LIST", response.data)
}
}
export default {
namespaced: true,
state,
mutations,
actions
}
...@@ -2,7 +2,7 @@ import {login, logout, getInfo, socialLogin, socialLogin2} from '@/api/login' ...@@ -2,7 +2,7 @@ import {login, logout, getInfo, socialLogin, socialLogin2} from '@/api/login'
import { getToken, setToken, removeToken } from '@/utils/auth' import { getToken, setToken, removeToken } from '@/utils/auth'
import {getNotReadInternalMessageTotal,} from '@/api/system/internalMessage' import {getNotReadInternalMessageTotal,} from '@/api/system/internalMessage'
import {taskTodoCount, userMark} from "@/api/bpm/task"; import {taskTodoCount, userMark} from "@/api/bpm/task";
import {getWaitingShipmentCount} from "@/api/ecw/order"; import {getWaitingShipmentCount,dataScopeCanShipmentCount} from "@/api/ecw/order";
const user = { const user = {
state: { state: {
...@@ -17,7 +17,9 @@ const user = { ...@@ -17,7 +17,9 @@ const user = {
download: 0, download: 0,
badgeData:{ badgeData:{
// 待出订单数量 // 待出订单数量
waitingShipment: 0 waitingShipment: 0,
// 空运待备货
stocking: 0
} }
}, },
...@@ -211,6 +213,10 @@ const user = { ...@@ -211,6 +213,10 @@ const user = {
console.log('getWaitingShipmentCount', res.data) console.log('getWaitingShipmentCount', res.data)
commit('SET_BADGE_DATA', { waitingShipment: res.data}, ) commit('SET_BADGE_DATA', { waitingShipment: res.data}, )
}) })
dataScopeCanShipmentCount().then(res => {
console.log('stocking', res.data)
commit('SET_BADGE_DATA', { stocking: res.data}, )
})
} }
} }
} }
......
...@@ -3,8 +3,8 @@ ...@@ -3,8 +3,8 @@
* *
* 数据字典工具类 * 数据字典工具类
*/ */
import store from "@/store"; import store from "@/store"
import i18n from "@/i18n"; import i18n from "@/i18n"
export const DICT_TYPE = { export const DICT_TYPE = {
USER_TYPE: "user_type", USER_TYPE: "user_type",
...@@ -27,6 +27,9 @@ export const DICT_TYPE = { ...@@ -27,6 +27,9 @@ export const DICT_TYPE = {
SYSTEM_SMS_TEMPLATE_TYPE: "system_sms_template_type", SYSTEM_SMS_TEMPLATE_TYPE: "system_sms_template_type",
SYSTEM_SMS_SEND_STATUS: "system_sms_send_status", SYSTEM_SMS_SEND_STATUS: "system_sms_send_status",
SYSTEM_SMS_RECEIVE_STATUS: "system_sms_receive_status", SYSTEM_SMS_RECEIVE_STATUS: "system_sms_receive_status",
SYSTEM_SMS_NODE_NODE: "system_sms_node_node", //节点
SYSTEM_SMS_TEMPLATE_MESSAGE_TYPE: "system_sms_template_message_type", //发送类型
SYSTEM_SMS_TEMPLATE_LANGUAGE: "system_sms_template_language", //节点
SYSTEM_MAIL_SEND_STATUS: "mail_send_status", SYSTEM_MAIL_SEND_STATUS: "mail_send_status",
SYSTEM_ERROR_CODE_TYPE: "system_error_code_type", SYSTEM_ERROR_CODE_TYPE: "system_error_code_type",
INTERNAL_MESSAGE_TYPE: "internal_message_type", INTERNAL_MESSAGE_TYPE: "internal_message_type",
...@@ -155,23 +158,29 @@ export const DICT_TYPE = { ...@@ -155,23 +158,29 @@ export const DICT_TYPE = {
ECW_PORT_TYPE: "port_type", //港口类型 ECW_PORT_TYPE: "port_type", //港口类型
CERTIFICATE_TYPE: "certificate_type", //证件类型 CERTIFICATE_TYPE: "certificate_type", //证件类型
//customer //customer
CUSTOMER_CREDIT_RULE_TYPE: 'customer_credit_rule_type', CUSTOMER_CREDIT_RULE_TYPE: "customer_credit_rule_type",
CUSTOMER_LEVEL_RULE_TYPE: 'customer_level_rule_type', CUSTOMER_LEVEL_RULE_TYPE: "customer_level_rule_type",
CUSTOMER_ESOURCE_TYPE:'customer_resource_type',//客户资源类型 CUSTOMER_ESOURCE_TYPE: "customer_resource_type", //客户资源类型
CUSTOMER_OPERATE_TYPE:'customer_operate_type', CUSTOMER_OPERATE_TYPE: "customer_operate_type",
CUSTOMER_GET_METHOD: 'customer_get_method', //获取方式 CUSTOMER_GET_METHOD: "customer_get_method", //获取方式
CUSTOMER_FROM: 'customer_from', //创建入口 CUSTOMER_FROM: "customer_from", //创建入口
CUSTOMER_ROLE: 'customer_role', //角色 CUSTOMER_ROLE: "customer_role", //角色
CUSTOMER_FOLLOWUP_TYPE: 'customer_followup_type', //跟进类型 PICKUP_POINTS: "pickup_points", //常用提货网点
CUSTOMER_FOLLOWUP_METHOD: 'customer_followup_method', //跟进方式 CUSTOMER_FOLLOWUP_TYPE: "customer_followup_type", //跟进类型
CUSTOMER_FOLLOWUP_RESULT_TYPE: 'customer_followup_result_type', //跟进结果 CUSTOMER_FOLLOWUP_METHOD: "customer_followup_method", //跟进方式
CUSTOMER_FOLLOWUP_STATUS: 'customer_followup_status', //跟进状态 CUSTOMER_FOLLOWUP_SALE_STAGE: "sale_stage", //销售阶段
ECW_OFFER_CUSTOMER_STATUS: "ecw_offer_customer_status", //客户状态
ECW_OFFER_CARGO_STATUS: "ecw_offer_cargo_status", //货物状态
ECW_OFFER_INQUIRY_SOURCE: "ecw_offer_inquiry_source", //询盘来源
ECW_OFFER_REASON_DICT: "ecw_offer_reason_dict", //输单原因
CUSTOMER_FOLLOWUP_RESULT_TYPE: "customer_followup_result_type", //跟进结果
CUSTOMER_FOLLOWUP_STATUS: "customer_followup_status", //跟进状态
CUSTOMER_QUERY_NUMBER_FIELD: "customer_query_number_field", //客户查询数字字段 CUSTOMER_QUERY_NUMBER_FIELD: "customer_query_number_field", //客户查询数字字段
// order // order
ORDER_TYPE: "order_type", // 订单类型 ORDER_TYPE: "order_type", // 订单类型
PRODUCT_RECORD_ATTRIBUTE: "product_record_attribute", //产品备案属性 PRODUCT_RECORD_ATTRIBUTE: "product_record_attribute", //产品备案属性
PROD_QUERY_TITLE_ZH_FIELD: 'prod_query_title_zh_field', // 商品列表商品中文名称查询类型 PROD_QUERY_TITLE_ZH_FIELD: "prod_query_title_zh_field", // 商品列表商品中文名称查询类型
CONTROL_GOODS_STATUS: "control_goods_status", //控货状态 CONTROL_GOODS_STATUS: "control_goods_status", //控货状态
DISBURSEMENT_TYPE: "disbursement_type", //垫付类型 DISBURSEMENT_TYPE: "disbursement_type", //垫付类型
DRAWEE: "drawee", // 付款人 DRAWEE: "drawee", // 付款人
...@@ -183,13 +192,11 @@ export const DICT_TYPE = { ...@@ -183,13 +192,11 @@ export const DICT_TYPE = {
PAYMENT_TYPE: "payment_type", //收款类型 PAYMENT_TYPE: "payment_type", //收款类型
ORDER_WAREHOUSE_IN_STATUS: "order_warehouse_in_diff_status", // 入仓状态 ORDER_WAREHOUSE_IN_STATUS: "order_warehouse_in_diff_status", // 入仓状态
ORDER_NO_QUOTE_EXCEPTION_RESULT: "order_no_quote_exception_result", //未报价异常处理结果 ORDER_NO_QUOTE_EXCEPTION_RESULT: "order_no_quote_exception_result", //未报价异常处理结果
ORDER_SUPERFLUOUS_BOX_EXCEPTION_RESULT: ORDER_SUPERFLUOUS_BOX_EXCEPTION_RESULT: "order_superfluous_box_exception_result", //多箱异常处理结果
"order_superfluous_box_exception_result", //多箱异常处理结果
ORDER_LACI_BOX_EXCEPTION_RESULT: "order_lack_box_exception_result", //少箱异常处理结果 ORDER_LACI_BOX_EXCEPTION_RESULT: "order_lack_box_exception_result", //少箱异常处理结果
ORDER_PAY_EXCEPTION_RESULT: "order_pay_exception_result", //预付异常处理结果 ORDER_PAY_EXCEPTION_RESULT: "order_pay_exception_result", //预付异常处理结果
ORDER_MISS_EXCEPTION_RESULT: "order_miss_exception_result", //货物丢失异常处理结果 ORDER_MISS_EXCEPTION_RESULT: "order_miss_exception_result", //货物丢失异常处理结果
ORDER_SUPERFLUOUS_GOODS_EXCEPTION_RESULT: ORDER_SUPERFLUOUS_GOODS_EXCEPTION_RESULT: "order_superfluous_goods_exception_result", //货物增多异常处理结果
"order_superfluous_goods_exception_result", //货物增多异常处理结果
ORDER_DAMAGE_EXCEPTION_RESULT: "order_damage_exception_result", //货物破损异常处理结果 ORDER_DAMAGE_EXCEPTION_RESULT: "order_damage_exception_result", //货物破损异常处理结果
ORDER_IN_WATER_EXCEPTION_RESULT: "order_in_water_exception_result", //货物浸水异常处理结果 ORDER_IN_WATER_EXCEPTION_RESULT: "order_in_water_exception_result", //货物浸水异常处理结果
ORDER_HEAVY_CARGO_EXCEPTION_RESULT: "order_heavy_cargo_exception_result", //重货异常处理结果 ORDER_HEAVY_CARGO_EXCEPTION_RESULT: "order_heavy_cargo_exception_result", //重货异常处理结果
...@@ -267,9 +274,25 @@ export const DICT_TYPE = { ...@@ -267,9 +274,25 @@ export const DICT_TYPE = {
REWARD_REDEEM_STATUS: "reward_redeem_status", //礼品兑换状态 REWARD_REDEEM_STATUS: "reward_redeem_status", //礼品兑换状态
MEMBER_SCORE_OPERATE_TYPE: "member_user_score_log_operate_type", //会员积分日志操作类型 MEMBER_SCORE_OPERATE_TYPE: "member_user_score_log_operate_type", //会员积分日志操作类型
SCORE_RULE_TYPE: "score_rule_type", //积分规则指标类型 SCORE_RULE_TYPE: "score_rule_type", //积分规则指标类型
CUSTOMER_SIDE: "customer_side", //积分规则客户方
YES_OR_NO: "yes_or_no", YES_OR_NO: "yes_or_no",
YES_OR_NO_OR_ALL: "yes_or_no_or_all",
CLIENT_PLATFORM: "client_platform", CLIENT_PLATFORM: "client_platform",
MEMBER_SCORE_SOURCE: "member_score_source", //会员积分来源 MEMBER_SCORE_SOURCE: "member_score_source", //会员积分来源
MEMBERSHIP_LEVELS: "membership_levels", //会员等级
ENABLE_STATUS: "enable_status", //会员等级规则开启状态
MEMBER_USER_OPERATE_LOG: "member_user_operate_log", //会员等级操作日志
INVOICE_DATA_STATUS: "invoice_data_status", // 开票资料状态
INVOICING_STATUS: "invoicing_status", //开票状态
RECEIPT_DETAIL_STATUS: "receipt_detail_status", //明细状态
INVOICEING_LINK: "invoicing_link", //开票环节
RECEIPT_GENERATE_PATH: "receipt_generate_path", //收款单生成路径
RECEIPT_LINK: "receipt_link", //应收款日志环节
ECW_INCOME_RELATION_SYMBOL: "income_relation_symbol", //银行收支明细查询关系符号
LADING_BILL_STATUS_DATA: "lading_Bill_Status_Data", //提单制作
ATTRIBUTION_OF_INCOME: "attribution_of_income", //收入归属
PICKUP_RATE_COMPARISON_SYMBOLS: "pickup_rate_comparison_symbols", //提货率比较符号
CURRENCY_RATE_STATUS: "currency_rate_status", // 货币汇率状态
}; };
/** /**
...@@ -284,7 +307,7 @@ export function getDictDatas(dictType) { ...@@ -284,7 +307,7 @@ export function getDictDatas(dictType) {
// debugger // debugger
// } // }
// debugger // debugger
return store.getters.dict_datas[dictType] || []; return store.getters.dict_datas[dictType] || []
} }
/** /**
...@@ -296,44 +319,44 @@ export function getDictDatas(dictType) { ...@@ -296,44 +319,44 @@ export function getDictDatas(dictType) {
*/ */
export function getDictDatas2(dictType, values) { export function getDictDatas2(dictType, values) {
if (values === undefined) { if (values === undefined) {
return []; return []
} }
// 如果是单个元素,则转换成数组 // 如果是单个元素,则转换成数组
if (!Array.isArray(values)) { if (!Array.isArray(values)) {
values = [this.value]; values = [this.value]
} }
// 获得字典数据 // 获得字典数据
const results = []; const results = []
for (const value of values) { for (const value of values) {
const dict = getDictData(dictType, value); const dict = getDictData(dictType, value)
if (dict) { if (dict) {
results.push(dict); results.push(dict)
} }
} }
// debugger // debugger
// console.log(results); // console.log(results);
return results; return results
} }
export function getDictData(dictType, value) { export function getDictData(dictType, value) {
// 获取 dictType 对应的数据字典数组 // 获取 dictType 对应的数据字典数组
const dictDatas = getDictDatas(dictType); const dictDatas = getDictDatas(dictType)
if (!dictDatas || dictDatas.length === 0) { if (!dictDatas || dictDatas.length === 0) {
return ""; return ""
} }
// 获取 value 对应的展示名 // 获取 value 对应的展示名
value = value + ""; // 强制转换成字符串,因为 DictData 小类数值,是字符串 value = value + "" // 强制转换成字符串,因为 DictData 小类数值,是字符串
for (const dictData of dictDatas) { for (const dictData of dictDatas) {
if (dictData.value === value) { if (dictData.value === value) {
return dictData; return dictData
} }
} }
return undefined; return undefined
} }
export function getDictDataLabel(dictType, value) { export function getDictDataLabel(dictType, value) {
const dict = getDictData(dictType, value); const dict = getDictData(dictType, value)
return dict ? i18n.l(dict, "label") : ""; return dict ? i18n.l(dict, "label") : ""
} }
export class getDictDataL {} export class getDictDataL {}
This diff is collapsed.
This diff is collapsed.
...@@ -95,12 +95,18 @@ ...@@ -95,12 +95,18 @@
<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="contentZh"> <el-form-item :label="$t('法文标题')" prop="titleFr">
<el-input v-model="form.titleFr" :placeholder="$t('请输入法文标题')" />
</el-form-item>
<el-form-item :label="$t('中文内容')" :key="this.isChinese" prop="contentZh">
<editor v-model="form.contentZh" :min-height="150"/> <editor v-model="form.contentZh" :min-height="150"/>
</el-form-item> </el-form-item>
<el-form-item :label="$t('英文内容')" prop="contentEn"> <el-form-item :label="$t('英文内容')" :key="this.isChinese" prop="contentEn">
<editor v-model="form.contentEn" :min-height="150"/> <editor v-model="form.contentEn" :min-height="150"/>
</el-form-item> </el-form-item>
<el-form-item :label="$t('法文内容')" :key="this.isChinese" prop="contentFr">
<editor v-model="form.contentFr" :min-height="150"/>
</el-form-item>
<el-form-item :label="$t('WEB端广告图片(建议尺寸长*宽')+'1120*450)'" prop="bannerUrlWeb"> <el-form-item :label="$t('WEB端广告图片(建议尺寸长*宽')+'1120*450)'" prop="bannerUrlWeb">
<el-col :span="8"> <el-col :span="8">
<el-input v-model="form.bannerUrlWeb" :placeholder="$t('请上传WEB端广告图片')" /> <el-input v-model="form.bannerUrlWeb" :placeholder="$t('请上传WEB端广告图片')" />
...@@ -168,8 +174,10 @@ export default { ...@@ -168,8 +174,10 @@ export default {
pageSize: 10, pageSize: 10,
titleZh: null, titleZh: null,
titleEn: null, titleEn: null,
titleFr: null,
contentZh: null, contentZh: null,
contentEn: null, contentEn: null,
contentFr: null,
bannerUrlWeb: null, bannerUrlWeb: null,
bannerUrlApp: null, bannerUrlApp: null,
status: null, status: null,
...@@ -180,6 +188,7 @@ export default { ...@@ -180,6 +188,7 @@ export default {
rules: { rules: {
titleZh: [{ required: true, message: this.$t("中文标题不能为空"), trigger: "blur" }], titleZh: [{ required: true, message: this.$t("中文标题不能为空"), trigger: "blur" }],
titleEn: [{ required: true, message: this.$t("英文标题不能为空"), trigger: "blur" }], titleEn: [{ required: true, message: this.$t("英文标题不能为空"), trigger: "blur" }],
titleFr: [{ required: true, message: this.$t("法文标题不能为空"), trigger: "blur" }],
bannerUrlWeb: [{ required: true, message: this.$t("web端广告图片不能为空"), trigger: "blur" }], bannerUrlWeb: [{ required: true, message: this.$t("web端广告图片不能为空"), trigger: "blur" }],
bannerUrlApp: [{ required: true, message: this.$t("app端广告图片不能为空"), trigger: "blur" }] bannerUrlApp: [{ required: true, message: this.$t("app端广告图片不能为空"), trigger: "blur" }]
...@@ -190,6 +199,17 @@ export default { ...@@ -190,6 +199,17 @@ export default {
}, },
computed: { computed: {
isChinese() {
this.rules={
titleZh: [{ required: true, message: this.$t("中文标题不能为空"), trigger: "blur" }],
titleEn: [{ required: true, message: this.$t("英文标题不能为空"), trigger: "blur" }],
titleFr: [{ required: true, message: this.$t("法文标题不能为空"), trigger: "blur" }],
bannerUrlWeb: [{ required: true, message: this.$t("web端广告图片不能为空"), trigger: "blur" }],
bannerUrlApp: [{ required: true, message: this.$t("app端广告图片不能为空"), trigger: "blur" }]
};
return this.$i18n.locale === "zh_CN";
},
statusName() { statusName() {
return value => { return value => {
for(let index in this.statusDictDatas) { for(let index in this.statusDictDatas) {
...@@ -230,8 +250,10 @@ export default { ...@@ -230,8 +250,10 @@ export default {
id: undefined, id: undefined,
titleZh: undefined, titleZh: undefined,
titleEn: undefined, titleEn: undefined,
titleFr: undefined,
contentZh: undefined, contentZh: undefined,
contentEn: undefined, contentEn: undefined,
contentFr: undefined,
bannerUrlWeb: undefined, bannerUrlWeb: undefined,
bannerUrlApp: undefined, bannerUrlApp: undefined,
status: undefined, status: undefined,
...@@ -291,7 +313,7 @@ export default { ...@@ -291,7 +313,7 @@ export default {
/** 删除按钮操作 */ /** 删除按钮操作 */
handleDelete(row) { handleDelete(row) {
const id = row.id; const id = row.id;
this.$modal.confirm(this.$t('是否确认删除广告设置编号为"') + id + this.$t('"的数据项?')).then(function() { this.$modal.confirm(this.$t('是否确认删除广告设置编号为\'{0}\'的数据项?', {0: id})).then(function() {
return deleteBanner(id); return deleteBanner(id);
}).then(() => { }).then(() => {
this.getList(); this.getList();
......
...@@ -79,7 +79,7 @@ ...@@ -79,7 +79,7 @@
<el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)" <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
v-hasPermi="['ecw:banner-pop:update']">{{$t('修改')}}</el-button> v-hasPermi="['ecw:banner-pop:update']">{{$t('修改')}}</el-button>
<el-button size="mini" type="text" @click="handleStatus(scope.row)" <el-button size="mini" type="text" @click="handleStatus(scope.row)"
v-hasPermi="['ecw:banner-pop:update']">{{scope.row.status == CommonStatusEnum.ENABLE ? '禁用' : '启用'}}</el-button> v-hasPermi="['ecw:banner-pop:update']">{{scope.row.status == CommonStatusEnum.ENABLE ? $t('禁用') : $t('启用')}}</el-button>
<el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)" <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
v-hasPermi="['ecw:banner-pop:delete']">{{$t('删除')}}</el-button> v-hasPermi="['ecw:banner-pop:delete']">{{$t('删除')}}</el-button>
</template> </template>
...@@ -92,12 +92,15 @@ ...@@ -92,12 +92,15 @@
<!-- 对话框(添加 / 修改) --> <!-- 对话框(添加 / 修改) -->
<el-dialog :title="title" :visible.sync="open" width="900px" append-to-body> <el-dialog :title="title" :visible.sync="open" width="900px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="100px"> <el-form ref="form" :model="form" :rules="rules" label-width="100px">
<el-form-item label="标题(中文)" 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="标题(英文)" 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="titleFr">
<el-input v-model="form.titleFr" :placeholder="$t('请输入英文标题')" />
</el-form-item>
<el-form-item :label="$t('有效期')" prop="validateStart"> <el-form-item :label="$t('有效期')" prop="validateStart">
<el-date-picker type="datetime" :placeholder="$t('请选择日期')" value-format="yyyy-MM-dd HH:mm:ss" v-model="form.validateStart" @change="startChange"> <el-date-picker type="datetime" :placeholder="$t('请选择日期')" value-format="yyyy-MM-dd HH:mm:ss" v-model="form.validateStart" @change="startChange">
</el-date-picker> </el-date-picker>
...@@ -113,12 +116,18 @@ ...@@ -113,12 +116,18 @@
<el-form-item :label="$t('网页英文')" prop="htmlWebEn"> <el-form-item :label="$t('网页英文')" prop="htmlWebEn">
<editor v-model="form.htmlWebEn" :min-height="150"/> <editor v-model="form.htmlWebEn" :min-height="150"/>
</el-form-item> </el-form-item>
<el-form-item label="APP中文" prop="htmlAppZh"> <el-form-item :label="$t('网页法文')" prop="htmlWebFr">
<editor v-model="form.htmlWebFr" :min-height="150"/>
</el-form-item>
<el-form-item :label="$t('APP中文')" prop="htmlAppZh">
<editor v-model="form.htmlAppZh" :min-height="150"/> <editor v-model="form.htmlAppZh" :min-height="150"/>
</el-form-item> </el-form-item>
<el-form-item label="APP英文" prop="htmlAppEn"> <el-form-item :label="$t('APP英文')" prop="htmlAppEn">
<editor v-model="form.htmlAppEn" :min-height="150"/> <editor v-model="form.htmlAppEn" :min-height="150"/>
</el-form-item> </el-form-item>
<el-form-item :label="$t('APP法文')" prop="htmlAppFr">
<editor v-model="form.htmlAppFr" :min-height="150"/>
</el-form-item>
</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">{{ $t('确 定') }}</el-button>
...@@ -164,11 +173,15 @@ export default { ...@@ -164,11 +173,15 @@ export default {
rows: 10, rows: 10,
titleZh: null, titleZh: null,
titleEn: null, titleEn: null,
titleFr: null,
validateStart: null, validateStart: null,
validateEnd: null, validateEnd: null,
htmlWebZh: null, htmlWebZh: null,
htmlWebEn: null, htmlWebEn: null,
htmlWebFr: null,
htmlAppZh: null, htmlAppZh: null,
htmlAppEn: null,
htmlAppFr: null,
status: null, status: null,
}, },
// 表单参数 // 表单参数
...@@ -177,6 +190,7 @@ export default { ...@@ -177,6 +190,7 @@ export default {
rules: { rules: {
titleZh: [{ required: true, message: this.$t("中文标题不能为空"), trigger: "blur" }], titleZh: [{ required: true, message: this.$t("中文标题不能为空"), trigger: "blur" }],
titleEn: [{ required: true, message: this.$t("英文标题不能为空"), trigger: "blur" }], titleEn: [{ required: true, message: this.$t("英文标题不能为空"), trigger: "blur" }],
titleFr: [{ required: true, message: this.$t("法文标题不能为空"), trigger: "blur" }],
validateStart: [{ required: true, message: this.$t("有效期开始时间不能为空"), trigger: "blur" }] validateStart: [{ required: true, message: this.$t("有效期开始时间不能为空"), trigger: "blur" }]
}, },
CommonStatusEnum: CommonStatusEnum, CommonStatusEnum: CommonStatusEnum,
...@@ -348,7 +362,7 @@ export default { ...@@ -348,7 +362,7 @@ export default {
/** 删除按钮操作 */ /** 删除按钮操作 */
handleDelete(row) { handleDelete(row) {
const id = row.id; const id = row.id;
this.$modal.confirm(this.$t('是否确认删除广告弹窗编号为"') + id + this.$t('"的数据项?')).then(function() { this.$modal.confirm(this.$t('是否确认删除广告弹窗编号{id}的数据项?',{id})).then(function() {
return deleteBannerPop(id); return deleteBannerPop(id);
}).then(() => { }).then(() => {
this.getList(); this.getList();
......
...@@ -758,11 +758,11 @@ export default { ...@@ -758,11 +758,11 @@ export default {
// } // }
//目的国 //目的国
if (this.countryIdList != null && this.countryIdList != "") { if (this.countryIdList != null && this.countryIdList != "") {
obj.countryIdLists = this.countryIdList obj.countryIdList = this.countryIdList
} }
//目的城市 //目的城市
if (this.destCityIdList != null && this.destCityIdList != "") { if (this.destCityIdList != null && this.destCityIdList != "") {
obj.destCityIdLists = this.destCityIdList obj.destCityIdList = this.destCityIdList
} }
//目的仓 //目的仓
if (this.destWarehouseIdList != null && this.destWarehouseIdList != "") { if (this.destWarehouseIdList != null && this.destWarehouseIdList != "") {
...@@ -827,7 +827,11 @@ export default { ...@@ -827,7 +827,11 @@ export default {
}, },
/** 重置按钮操作 */ /** 重置按钮操作 */
resetQuery() { resetQuery() {
this.dateRangeCreateTime = [] this.queryParams = {};
this.dateRangeCreateTime = [];
this.countryIdList = null;
this.destCityIdList = null;
this.destWarehouseIdList = null;
this.resetForm('queryForm') this.resetForm('queryForm')
this.handleQuery() this.handleQuery()
}, },
...@@ -913,7 +917,7 @@ export default { ...@@ -913,7 +917,7 @@ export default {
this.handleDelete(row); this.handleDelete(row);
break; break;
case "editLadingBill": case "editLadingBill":
let line = await getLineInfo({startWarehouseId: row.startWarehouseId,destWarehouseIdList: row.destWarehouseIdList,transportType:row.transportType}) let line = await getLineInfo({startWarehouseId: row.startWarehouseId,destWarehouseId: row.destWarehouseId,transportType:row.transportType})
let makeBillNode = line.data.makeBillNode let makeBillNode = line.data.makeBillNode
console.log(row,this.makeBillNodeStatus[makeBillNode]) console.log(row,this.makeBillNodeStatus[makeBillNode])
if(row.shipmentStatusAir<this.makeBillNodeStatus[makeBillNode]){ if(row.shipmentStatusAir<this.makeBillNodeStatus[makeBillNode]){
......
...@@ -969,11 +969,11 @@ export default { ...@@ -969,11 +969,11 @@ export default {
// } // }
//目的国 //目的国
if (this.countryIdList != null && this.countryIdList != "") { if (this.countryIdList != null && this.countryIdList != "") {
obj.countryIdLists = this.countryIdList obj.countryIdList = this.countryIdList
} }
//目的城市 //目的城市
if (this.destCityIdList != null && this.destCityIdList != "") { if (this.destCityIdList != null && this.destCityIdList != "") {
obj.destCityIdLists = this.destCityIdList obj.destCityIdList = this.destCityIdList
} }
//目的仓 //目的仓
if (this.destWarehouseIdList != null && this.destWarehouseIdList != "") { if (this.destWarehouseIdList != null && this.destWarehouseIdList != "") {
......
...@@ -355,6 +355,9 @@ export default { ...@@ -355,6 +355,9 @@ export default {
resetQuery() { resetQuery() {
this.queryParams = {}; this.queryParams = {};
this.dateRangeCreateTime = []; this.dateRangeCreateTime = [];
this.countryIdList = null;
this.destCityIdList = null;
this.destWarehouseIdList = null;
this.resetForm("queryForm"); this.resetForm("queryForm");
this.handleQuery(); this.handleQuery();
}, },
......
...@@ -67,6 +67,19 @@ ...@@ -67,6 +67,19 @@
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column :label="$t('包装类型')" align="center" prop="">
<template slot-scope="scope">
<span v-for="(unit,index) in scope.row.units.split(',')" :key="index">
<dict-tag :type="DICT_TYPE.ECW_PACKAGING_TYPE" :value="unit" /><span v-if="index<scope.row.units.split(',').length-1">, </span>
</span>
</template>
</el-table-column>
<el-table-column :label="$t('关联单')" align="center" prop="hasRelationOrder" width="120">
<template slot-scope="scope">
<el-link type="primary" v-if="scope.row.hasRelationOrder" @click.native="showRelatedOrder(scope.row)">{{ $t('') }}</el-link>
<span v-else>{{ $t('') }}</span>
</template>
</el-table-column>
<el-table-column :label="$t('计划箱数')" align="center" prop="num"> <el-table-column :label="$t('计划箱数')" align="center" prop="num">
<template slot-scope="scope"> <template slot-scope="scope">
{{getTotlContent(scope.row,['num'])}} {{getTotlContent(scope.row,['num'])}}
...@@ -74,7 +87,7 @@ ...@@ -74,7 +87,7 @@
</el-table-column> </el-table-column>
<el-table-column :label="$t('实装箱数')" align="center" prop="installNum"> <el-table-column :label="$t('实装箱数')" align="center" prop="installNum">
<template slot-scope="scope"> <template slot-scope="scope">
{{ scope.row.installNum }}{{$t('')}} {{ scope.row.installNum }}{{$t('')}}<span v-if="scope.row.mixStatus === 1">{{$t('混箱')}}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column :label="$t('体积')" align="center" prop="volume"> <el-table-column :label="$t('体积')" align="center" prop="volume">
...@@ -87,6 +100,11 @@ ...@@ -87,6 +100,11 @@
{{getTotlContent(scope.row,['weight'])}} {{getTotlContent(scope.row,['weight'])}}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column :label="$t('储位')" align="center" prop="positionNo">
<template slot-scope="scope">
{{notset(scope.row.positionNo)}}
</template>
</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" @click="moveOut(scope.row)" v-if="!isUnderReview && scope.row.installNum === 0">{{$t('移出')}}</el-button> <el-button type="text" size="small" @click="moveOut(scope.row)" v-if="!isUnderReview && scope.row.installNum === 0">{{$t('移出')}}</el-button>
...@@ -237,12 +255,15 @@ ...@@ -237,12 +255,15 @@
<!-- 拆单 --> <!-- 拆单 -->
<splitOrder v-bind="$attrs" v-on="$listeners" :shipmentObj="shipmentObj" v-if="dialogConfig.type === 'splitOrder' && dialogConfig.dialogVisible" :currRow="currRow" @closeDialog2="closeDialog2" /> <splitOrder v-bind="$attrs" v-on="$listeners" :shipmentObj="shipmentObj" v-if="dialogConfig.type === 'splitOrder' && dialogConfig.dialogVisible" :currRow="currRow" @closeDialog2="closeDialog2" />
</el-dialog> </el-dialog>
<!-- 关联单 -->
<realated-order :orderItemId="showRelatedItemId" v-if="showRelatedItemId" @close="showRelatedItemId=null"></realated-order>
</div> </div>
</template> </template>
<script> <script>
import dayjs from "dayjs"; import dayjs from "dayjs";
import supplementOrder from "./supplementOrder.vue"; import supplementOrder from "./supplementOrder.vue";
import RealatedOrder from "../../../shippingSea/nodePage/tally/realatedOrder.vue";
import { getCabinetPage } from "@/api/ecw/cabinet"; import { getCabinetPage } from "@/api/ecw/cabinet";
import { getbox } from "@/api/ecw/box"; import { getbox } from "@/api/ecw/box";
import { import {
...@@ -280,12 +301,14 @@ export default { ...@@ -280,12 +301,14 @@ export default {
supplementOrder, supplementOrder,
splitOrder, splitOrder,
WorkFlow, WorkFlow,
RealatedOrder,
}, },
props: { props: {
shipmentObj: Object, shipmentObj: Object,
}, },
data() { data() {
return { return {
showRelatedItemId: null,
// 表格数据 // 表格数据
listData: [], listData: [],
// 表格数据 // 表格数据
...@@ -353,6 +376,23 @@ export default { ...@@ -353,6 +376,23 @@ export default {
this.newshipmentObj = data ?? {}; this.newshipmentObj = data ?? {};
}); });
}, },
//去重
notset(string) {
if (!string) return string
let arr = string.split(',')
arr = arr.filter((item, index) => {
return arr.indexOf(item) == index
})
return arr.toString()
},
getpositionNo(arr){
if(!arr) return arr
let data = []
arr.forEach(item=>{
data.push(item.areaName+item.locationName)
})
return data.toString()
},
/* 装柜部分列表 */ /* 装柜部分列表 */
getLoadSecGoodsList() { getLoadSecGoodsList() {
loadSecGoodsList({ shipmentId: this.shipmentObj.id }).then((res) => { loadSecGoodsList({ shipmentId: this.shipmentObj.id }).then((res) => {
...@@ -524,6 +564,10 @@ export default { ...@@ -524,6 +564,10 @@ export default {
}); });
} }
}, },
// 显示关联单
showRelatedOrder(row) {
this.showRelatedItemId = row.orderId
},
/* 移出 */ /* 移出 */
moveOut(row) { moveOut(row) {
let params = { let params = {
......
...@@ -148,12 +148,13 @@ ...@@ -148,12 +148,13 @@
<script> <script>
import { import {
loadSecGoodsList, loadSecGoodsList,
preloadPage, // preloadPage,
createSection, createSection,
deleteSection, deleteSection,
createGoods, // createGoods,
remove, remove,
} from "@/api/ecw/boxSea"; } from "@/api/ecw/boxSea";
import { preloadPage, createGoods } from "@/api/ecw/boxAir";
import { import {
formatDate, formatDate,
getTotlContent, getTotlContent,
...@@ -227,7 +228,7 @@ export default { ...@@ -227,7 +228,7 @@ export default {
let params = { let params = {
...this.queryParams, ...this.queryParams,
}; };
preloadPage({ ...params, ...this.pageParam }).then((res) => { preloadPage({ ...params, ...this.pageParam, shipmentId: this.$attrs.shipmentObj.id }).then((res) => {
const { data } = res; const { data } = res;
this.toBePreList = data.dataList?.list ?? []; this.toBePreList = data.dataList?.list ?? [];
this.total = data.dataList?.total ?? 0; this.total = data.dataList?.total ?? 0;
...@@ -278,7 +279,9 @@ export default { ...@@ -278,7 +279,9 @@ export default {
let params = { let params = {
secId: this.partData.id, secId: this.partData.id,
shipmentId: this.$attrs.shipmentObj.id, shipmentId: this.$attrs.shipmentObj.id,
isTally: this.$attrs.shipmentObj.isTally,
orderId: item.orderId, orderId: item.orderId,
isCover: 1,
}; };
if (type === "all") { if (type === "all") {
params.orderItemIdList = item.boxOrderItemList.map( params.orderItemIdList = item.boxOrderItemList.map(
...@@ -354,6 +357,7 @@ export default { ...@@ -354,6 +357,7 @@ export default {
createSection({ createSection({
shipmentId: this.$attrs.shipmentObj.id, shipmentId: this.$attrs.shipmentObj.id,
isCover: 1, isCover: 1,
isTally: this.$attrs.shipmentObj.isTally
}).then((res) => { }).then((res) => {
serviceMsg(res, this).then(() => { serviceMsg(res, this).then(() => {
this.getSecGoods(); this.getSecGoods();
......
...@@ -87,6 +87,26 @@ ...@@ -87,6 +87,26 @@
/> />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column :label="$t('报关方式')" align="center" prop="customsType">
<template slot-scope="scope">
<div :class="scope.row.customsType !== 1 ? 'custom_type_red' : ''">
<dict-tag :type="DICT_TYPE.ECW_CUSTOMS_TYPE" :value="scope.row.customsType" />
</div>
</template>
</el-table-column>
<el-table-column :label="$t('包装类型')" align="center" prop="">
<template slot-scope="scope">
<span v-for="(unit,index) in scope.row.units.split(',')" :key="index">
<dict-tag :type="DICT_TYPE.ECW_PACKAGING_TYPE" :value="unit" /><span v-if="index<scope.row.units.split(',').length-1">, </span>
</span>
</template>
</el-table-column>
<el-table-column :label="$t('关联单')" align="center" prop="hasRelationOrder" width="120">
<template slot-scope="scope">
<el-link type="primary" v-if="scope.row.hasRelationOrder" @click.native="showRelatedOrder(scope.row)">{{ $t('') }}</el-link>
<span v-else>{{ $t('') }}</span>
</template>
</el-table-column>
<el-table-column <el-table-column
:label="$t('计划/已装')" :label="$t('计划/已装')"
align="center" align="center"
...@@ -94,7 +114,7 @@ ...@@ -94,7 +114,7 @@
> >
<template slot-scope="scope"> <template slot-scope="scope">
<el-link type="primary" @click.native="orderClick(scope.row)"> <el-link type="primary" @click.native="orderClick(scope.row)">
{{ scope.row.sumNum }}/{{ scope.row.installNum }} {{ scope.row.sumNum }}/{{ scope.row.installNum }} <span v-if="scope.row.mixStatus === 1">{{$t('混箱')}}</span>
</el-link> </el-link>
</template> </template>
</el-table-column> </el-table-column>
......
...@@ -150,9 +150,9 @@ ...@@ -150,9 +150,9 @@
<el-table-column :label="$t('序号')" align="center" prop="tidanNum" width="50" /> <el-table-column :label="$t('序号')" align="center" prop="tidanNum" width="50" />
<el-table-column :label="$t('订单号')" align="center" prop="orderNo" width="120"> <el-table-column :label="$t('订单号')" align="center" prop="orderNo" width="120">
<template slot-scope="scope"> <template slot-scope="scope">
<div> <el-link type="primary" @click="orderHandleClick(scope.row)">
{{scope.row.orderNo}} {{scope.row.orderNo}}
</div> </el-link>
<div style="color:blue;fontWeight:bold;"> <div style="color:blue;fontWeight:bold;">
{{ scope.row.isExternalWarehouse === 1 ? '(' +$t('外部仓')+')' : ''}} {{ scope.row.isExternalWarehouse === 1 ? '(' +$t('外部仓')+')' : ''}}
</div> </div>
...@@ -245,7 +245,9 @@ ...@@ -245,7 +245,9 @@
<el-row v-for="(item, index) in toBePreList" :key="index" class="tobePre-row"> <el-row v-for="(item, index) in toBePreList" :key="index" class="tobePre-row">
<el-row class="preinstall-title order-title"> <el-row class="preinstall-title order-title">
<div> <div>
<p>{{item.orderNo}}</p> <el-link type="primary" @click="orderHandleClick(item)">
{{item.orderNo}}
</el-link>
</div> </div>
<div> <div>
<p>{{$t('发往')}}</p> <p>{{$t('发往')}}</p>
...@@ -557,6 +559,10 @@ export default { ...@@ -557,6 +559,10 @@ export default {
getChannelList().then((res) => (this.channelList = res.data)); getChannelList().then((res) => (this.channelList = res.data));
}, },
methods: { methods: {
orderHandleClick(row){
const routeData = this.$router.resolve({ path: '/order/detail' ,query:{orderId: row.orderId}});
window.open(routeData.href, '_blank');
},
formatDate, formatDate,
getTotlContent, getTotlContent,
selectChannel(){ selectChannel(){
......
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.
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.
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.
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