sunzehua 4 months ago
commit 50507c54f1

Binary file not shown.

After

Width:  |  Height:  |  Size: 510 KiB

@ -0,0 +1,82 @@
<!--
* @Description: 审批按钮组件
* @Author: lijj
* @Date: 2024-04-29 11:54:04
-->
<template>
<div>
<a-button @click="approveHandle('2')" danger class="mr10">
{{ rejectText }}
</a-button>
<a-button @click="approveHandle('1')" type="primary">
{{ agreeText }}
</a-button>
<a-modal
v-model:visible="visible"
title="驳回"
width="40%"
@ok="handleOk"
>
<BasicForm @register="registerForm" />
</a-modal>
</div>
</template>
<script lang="ts" setup>
import { ref, computed, defineProps, onMounted } from 'vue'
import { BasicForm, useForm } from '/@/components/Form/index'
const props = defineProps({
//
agreeText: {
type: String,
default: "同意"
},
rejectText: {
type: String,
default: "驳回"
},
//
approve: {
type: Function
}
})
const visible = ref(false)
const formSchema = [
{
field: 'remark',
label: '驳回原因',
defaultValue: '',
component: 'InputTextArea',
required: true,
colProps: { span: 24 },
componentProps: {
autoSize: {
minRows: 4,
maxRows: 4
}
}
}
]
const [registerForm, { resetFields, setFieldsValue, validate, updateSchema }] =
useForm({
labelWidth: 150,
schemas: formSchema,
showActionButtonGroup: false
})
const approveHandle = (v) => {
resetFields()
if (v == 2) {
//
visible.value = true
return
}
props.approve()
visible.value = false
}
const handleOk = async () => {
const res = await validate()
console.log(res)
props.approve(res.remark)
visible.value = false
}
</script>

@ -1,3 +1,8 @@
<!--
* @Desc:
* @Author: lijj
* @Date: 2024-07-22 09:59:17
-->
<template>
<BasicTitle v-if="getTitle" :class="prefixCls" :help-message="helpMessage">
{{ getTitle }}

@ -1,3 +1,8 @@
/*
* @Desc:
* @Author: lijj
* @Date: 2024-05-13 09:06:51
*/
export default {
api: {
operationFailed: 'Operation failed',
@ -59,7 +64,9 @@ export default {
login: {
backSignIn: 'Back sign in',
mobileSignInFormTitle: 'Mobile sign in',
signInFormTitle: 'Sign in',
signInFormTitle: 'Password login',
loginPageIntro: 'The leading office platform in China integrates export pre shipment manifest, VGM declaration, and comprehensive tracking data query, aiming to provide a simple and efficient office tool for export clearance enterprises.',
loginPageTitle: 'Welcome to login',
signUpFormTitle: 'Sign up',
forgetFormTitle: 'Reset password',

@ -56,8 +56,10 @@ export default {
},
login: {
backSignIn: '返回',
signInFormTitle: '登录',
signInFormTitle: '账号密码登录',
loginPageTitle: '欢迎登录',
mobileSignInFormTitle: '手机登录',
loginPageIntro: '国内领先的集合了出口预配舱单、VGM申报和综合运踪数据查询于一体的办公平台旨在为出口通关企业提供一款简单高效的办公工具。',
signUpFormTitle: '企业用户注册',
forgetFormTitle: '重置密码',
@ -68,7 +70,7 @@ export default {
loginButton: '登录',
registerButton: '企业用户注册',
rememberMe: '记住',
rememberMe: '记住密码',
forgetPassword: '忘记密码?',
otherSignIn: '其他登录方式',

@ -67,12 +67,12 @@ service.interceptors.response.use(
const res = response.data
if (res.succeeded === false ) {
$message.error(res.message || UNKNOWN_ERROR)
return Promise.reject(res.data || res.message || res.error || 'Error')
} else {
return response
}
},
(error) => {
console.log(error.response)
if (axios.isCancel(error)) {
// 主动取消请求
return Promise.reject(error)
@ -88,10 +88,11 @@ service.interceptors.response.use(
$message.error(error.response.statusText)
}
} else {
console.log(error)
$message.error(error.message);
}
return Promise.reject(error)
},
}
)
export type Response<T = any> = {

@ -10,7 +10,7 @@
{ "label": "代理(国内)", "value": "isAgentCn" },
{ "label": "快递公司", "value": "isExpress" },
{ "label": "航空公司", "value": "isAirLines" },
{ "label": "发货人", "value": "isShipper" },
{ "label": "国外发货人", "value": "isShipper" },
{ "label": "通知人", "value": "isNotifyParty" },
{ "label": "仓库", "value": "isWareHouse" },
{ "label": "码头", "value": "isWharf" },
@ -19,5 +19,6 @@
{ "label": "贸易代理", "value": "isTradingAgency" },
{ "label": "其他", "value": "isOther" },
{ "label": "船代", "value": "isShipAgency" },
{ "label": "经营单位", "value": "isEnterprise" }
{ "label": "经营单位", "value": "isEnterprise" },
{ "label": "国内发货人", "value": "isShipperCn" }
]

@ -112,7 +112,7 @@ export const columns: BasicColumn[] = [
title: '是否启用',
dataIndex: 'status',
sorter: true,
width: 80,
width: 90,
customRender: ({ text }) => {
if (text === 0) {
return <Tag color="success"></Tag>
@ -141,7 +141,19 @@ export const searchFormSchema: FormSchema[] = [
field: 'CnName',
label: '港口中文名称',
component: 'Input',
colProps: { span: 6 },
colProps: { span: 4 }
},
{
field: 'countryName',
label: '国家',
component: 'Input',
colProps: { span: 4 }
},
{
field: 'ediCode',
label: 'EDI代码',
component: 'Input',
colProps: { span: 4 }
},
]
export const formSchema: FormSchema[] = [

@ -1,6 +1,11 @@
<!--
* @Desc:
* @Author: lijj
* @Date: 2024-05-13 09:06:51
-->
<template>
<div>
<BasicTable @register="registerTable">
<BasicTable class="ds-table-detail" @register="registerTable">
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'action'">
<TableAction
@ -24,6 +29,7 @@
import { ApiBasicsList, ApiExistList } from './api'
import { useModal } from '/@/components/Modal'
import TenantAuditStepModal from './TenantAuditStepModal.vue'
import { formatParams } from '/@/hooks/web/common'
import { columns, searchFormSchema } from './columns'
const [registerModal, { openModal }] = useModal()
const [registerTable, { reload, getForm, getPaginationRef, getSelectRows }] = useTable({
@ -33,46 +39,12 @@
// rowSelection: { type: 'radio' },
api: async (p) => {
const res: API.DataResult = await ApiBasicsList(p)
const res2: API.DataResult = await ApiExistList()
let data = []
res.data.forEach((item) => {
let type = true
res2.data.forEach((item2) => {
if (item.id == item2) {
type = false
}
})
if (type) {
data.push(item)
}
})
console.log(data)
return new Promise((resolve) => {
resolve({ data: [...data] })
resolve({ data: [...res.data] })
})
},
beforeFetch: () => {
var currentPageInfo: any = getPaginationRef()
var data = getForm().getFieldsValue()
const postParam: API.PageRequest = {
queryCondition: '',
pageCondition: {
pageIndex: currentPageInfo.current,
pageSize: currentPageInfo.pageSize,
sortConditions: [],
},
}
let condition: API.ConditionItem[] = []
if (!!data.CnName) {
condition.push({
FieldName: 'CnName',
FieldValue: data.CnName,
ConditionalType: 1,
})
}
postParam.queryCondition = JSON.stringify(condition)
return postParam
beforeFetch: (p) => {
return formatParams(p)
},
columns,
formConfig: {
@ -88,13 +60,7 @@
size: false,
setting: false,
fullScreen: false,
},
// actionColumn: {
// width: 80,
// title: '',
// dataIndex: 'action',
// fixed: undefined,
// },
}
})
function handleCreate() {

@ -60,8 +60,9 @@
import { useModal } from '/@/components/Modal'
import TenantAuditStepModal from './TenantAuditStepModal.vue'
import { columns, searchFormSchema } from './columns'
import { formatParams } from '/@/hooks/web/common'
import { useMessage } from '/@/hooks/web/useMessage'
const { notification } = useMessage()
const { createMessage } = useMessage()
const visible = ref<boolean>(false)
const refImportFlow = ref()
@ -75,35 +76,7 @@
})
},
beforeFetch: (p) => {
var data = getForm().getFieldsValue()
const postParam: API.PageRequest = {
queryCondition: '',
pageCondition: {
pageIndex: p.page,
pageSize: p.pageSize,
sortConditions: [],
},
}
if (p.field) {
postParam.pageCondition.sortConditions = [
{
sortField: p.field,
listSortDirection: p.order == 'ascend' ? 0 : 1,
},
]
} else {
postParam.pageCondition.sortConditions = []
}
let condition: API.ConditionItem[] = []
if (!!data.CnName) {
condition.push({
FieldName: 'CnName',
FieldValue: data.CnName,
ConditionalType: 1,
})
}
postParam.queryCondition = JSON.stringify(condition)
return postParam
return formatParams(p)
},
columns,
formConfig: {
@ -136,7 +109,7 @@
ids: [],
}
if (select.length === 0) {
notification.warning({ message: '请至少选择一条数据', duration: 3 })
createMessage.warning('请至少选择一条数据')
return false
} else {
ApiData.ids = select.map((item) => {
@ -145,8 +118,7 @@
}
ApiDel(ApiData).then((res) => {
console.log(res)
notification.success({ message: res.message, duration: 3 })
createMessage.success(res.message)
reload()
})
}
@ -169,9 +141,9 @@
id: '',
})
if (res.succeeded) {
notification.success({ message: res.message, duration: 3 })
createMessage.success(res.message)
} else {
notification.error({ message: res.message, duration: 3 })
createMessage.warning(res.message)
}
reload()
visible.value = false

@ -2033,3 +2033,15 @@ export function CreateTask(data) {
data,
})
}
// 可用舱位列表
// 任务审核
export function SeaExportTaskAudit(data) {
return request({
url: '/opApi/SeaExportTask/Audit',
method: 'post',
data
})
}

@ -87,6 +87,7 @@
v-model:value="company"
style="width: 100px; height: 16px"
placeholder="请选择"
:disabled="!!route.query.source"
optionLabelProp="label"
@change="handleChange"
>
@ -172,6 +173,8 @@
import { ApiEdit } from '/@/views/baseinfo/sendReciveTem/api'
import textareaView from '../detail/components/textareaView.vue'
import { useMessage } from '/@/hooks/web/useMessage'
import { useRoute } from 'vue-router'
const route = useRoute()
const { createMessage } = useMessage()
const props = defineProps({
details: {

@ -62,7 +62,6 @@ export const formSchema1: FormSchema[] = [
}
}
},
{
label: '',
field: 'consigneeContent',
@ -983,3 +982,22 @@ export const formSchema6: FormSchema[] = [
colProps: { span: 12 }
}
]
// 仓位列表
export const storageColumns: BasicColumn[] = [
{
title: '舱位提单号',
dataIndex: 'mblno',
width: 150,
}
]
// 仓位表格过滤表单
export const storageSearchFormSchema: FormSchema[] = [
{
field: 'mblno',
label: '装货地',
component: 'Input',
colProps: { span: 6 }
},
]

@ -0,0 +1,103 @@
<!--
* @Description: 引入仓位数据列表弹窗组件
* @Author: lijj
* @Date: 2024-04-29 11:54:04
-->
<template>
<a-modal
title="引入舱位"
@cancel="visible = false"
@ok="handleOk"
v-if="visible"
:visible="visible"
width="80%"
:loading="loading"
>
<BasicTable
@register="registerTable"
/>
</a-modal>
</template>
<script lang="ts" setup>
import { defineExpose, ref, defineProps } from 'vue'
import { BasicTable, useTable } from '/@/components/Table'
import { GetBillManageHistoryList, ImportBillManageHistory } from '../../api/BookingLedger.js'
import { storageColumns, storageSearchFormSchema } from './ladingInfo'
//
import { useMessage } from '/@/hooks/web/useMessage'
const { createMessage } = useMessage()
import { useI18n } from '/@/hooks/web/useI18n'
const { t } = useI18n()
const props = defineProps({
// id
id: {
type: String
},
//
reload: {
type: Function
}
})
//
import { formatParams } from '/@/hooks/web/common'
const [registerTable, { reload, getSelectRows }] = useTable({
title: '',
api: async (p) => {
const res: API.DataResult = await GetBillManageHistoryList(p)
return new Promise((resolve) => {
resolve({ data: [...res.data], total: res.count })
})
},
//
beforeFetch: (p) => {
return formatParams(p)
},
columns: storageColumns,
formConfig: {
labelWidth: 120,
//
schemas: storageSearchFormSchema,
},
maxHeight: 600,
isTreeTable: false,
pagination: true,
useSearchForm: true,
showTableSetting: false,
bordered: true,
showIndexColumn: true,
indexColumnProps: {
width: 60,
},
rowSelection: {
type: 'checkbox'
},
canResize: true,
resizeHeightOffset: 80
})
const visible = ref(false)
//
const init = () => {
visible.value = true
}
const loading = true
const handleOk = () => {
const rows = getSelectRows()
const ids = rows.map(item => {
return item.id
})
ImportBillManageHistory({ ids, businessType: 1, id: props.id }).then(res => {
visible.value = false
if (res.succeeded) {
createMessage.success('导入成功!')
props.reload()
}
})
}
defineExpose({
init
})
</script>
<style lang="less">
</style>

@ -2,6 +2,7 @@
<textarea
class="ant-input"
v-model="tvalue"
:disabled="!!route.query.source"
:style="`width:100%;display:inline-block;height: ${height}px; line-height: 16px;`"
@input="debounce(textareaChange, 300, $event)"
@blur="textareaBlur"
@ -10,6 +11,8 @@
<script lang="ts" setup>
import { ref, watch } from 'vue'
import { useMessage } from '/@/hooks/web/useMessage'
import { useRoute } from 'vue-router'
const route = useRoute()
const { notification } = useMessage()
let timer
const props = defineProps({

@ -18,6 +18,7 @@
<div class="flex">
<div style="flex: 1; width: 0;">
<ActionBar
v-if="source == 'edit'"
:id="route.query.id"
code="sea_freight_export"
name="hyck"
@ -45,7 +46,7 @@
@editLineName="editLineNameFun"
>
</mailingInfo>
<div class="ds-card mt15">
<div v-if="source == 'edit'" class="ds-card mt15">
<cargoInfo ref="RefcargoInfo" :details="bookingDetails"></cargoInfo>
<div class="line"></div>
<goodsTable
@ -61,7 +62,10 @@
>
</goodsTable>
</div>
<otherInfo ref="OtherInfo" :details="bookingDetails"></otherInfo>
<!-- 联系人信息 -->
<ContactList v-if="source == 'edit'" :id="id"></ContactList>
<!-- 其他信息 -->
<otherInfo v-if="source == 'edit'" ref="OtherInfo" :details="bookingDetails"></otherInfo>
</a-tab-pane>
<a-tab-pane key="2-2" tab="EDI补充信息">
<ediMore ref="RefediMore" :details="bookingDetails"></ediMore>
@ -91,10 +95,17 @@
></manifestTicket>
</a-tab-pane>
</a-tabs>
<div v-if="route.query.source == 'view'" class="approve-box">
<ApproveBtns
agreeText="完成任务"
rejectText="驳回任务"
:approve="approveDc"
></ApproveBtns>
</div>
</a-spin>
</div>
</div>
<transition name="slide">
<transition name="slide" v-if="source == 'edit'">
<rightContent
v-show="rightFlag"
class="right-content"
@ -122,7 +133,7 @@
:details="bookingDetails"
></LadingInfo>
</a-tab-pane>
<a-button type="link" class="right-flag" @click="toggle">
<a-button type="link" class="right-flag" @click="toggle" v-if="source == 'edit'">
{{ rightFlag ? '收起' : '展开' }}
</a-button>
</a-tabs>
@ -130,7 +141,7 @@
</template>
<script lang="ts" setup>
import { ref, computed, watch } from 'vue'
import { ref, computed, watch, onMounted } from 'vue'
import { useAppStore } from '/@/store/modules/app'
import { useMessage } from '/@/hooks/web/useMessage'
import rules from './rules'
@ -139,6 +150,8 @@
import costEntry from '/@/components/CostEntry/index.vue'
//
import manifestTicket from './components/manifestTicket.vue'
//
import ApproveBtns from '/@/components/ApproveBtns/index.vue'
const router = useRouter()
const route = useRoute()
import {
@ -148,7 +161,8 @@
GetClientSourceDetailSelectList,
GetSaleList,
GetDeptList,
SeaExportCopy
SeaExportCopy,
SeaExportTaskAudit
} from '../api/BookingLedger'
import { getDictDropDown } from '/@/api/common'
const appStore = useAppStore()
@ -167,12 +181,16 @@
import LadingInfo from './components/ladingInfo.vue'
//
import otherInfo from './modules/otherInfo.vue'
//
import ContactList from './modules/contactList.vue'
const go = useGo()
const initDetail = {}
// loading
const loading = ref(false)
const id = ref(route.query.id)
const isCopy = ref(route.query.isCopy || false)
//
const source = ref(route.query.source || 'edit')
// const isCopy = ref(route.query.isCopy || false)
const Showtabs = ref(false)
const bookingDetails = ref({ ...initDetail })
// // const bookingDetails = ref()
@ -267,17 +285,11 @@
// },
// { immediate: true, deep: true },
// )
// onMounted(() => {
// // window.addEventListener(
// // 'scroll',
// // () => {
// // scrollTop.value = document.getElementsByClassName('sidemenu')[0]
// // ? document.getElementsByClassName('sidemenu')[0].scrollTop
// // : document.getElementsByClassName('topmenu')[0].scrollTop
// // },
// // true,
// // )
// })
onMounted(() => {
console.log(document.getElementsByClassName('main-tab')[0])
// tab
if (source.value != 'edit') document.getElementsByClassName('main-tab')[0].getElementsByClassName('ant-tabs-nav-wrap')[0].style.display = 'none'
})
// onBeforeRouteUpdate((to, from, next) => {
// console.log(to, from, next, 'onBeforeRouteUpdate')
// next()
@ -507,7 +519,7 @@
component: 'Select',
required: false,
dynamicDisabled: ({ values }) => {
return !values.sourceId
return !values.sourceId || source.value != 'edit'
},
colProps: { span: 4 },
componentProps: {
@ -543,7 +555,7 @@
field: 'saleOrgId',
component: 'Select',
required: false,
dynamicDisabled: false,
dynamicDisabled: source.value == 'edit' ? false : true,
// defaultValue: '',
colProps: { span: 4 },
componentProps: {
@ -566,7 +578,7 @@
field: 'saleDeptId',
component: 'Select',
required: false,
dynamicDisabled: false,
dynamicDisabled: source.value == 'edit' ? false : true,
// defaultValue: '',
colProps: { span: 4 },
componentProps: {
@ -587,7 +599,7 @@
field: 'saleDeptId',
component: 'Select',
required: false,
dynamicDisabled: false,
dynamicDisabled: source.value == 'edit' ? false : true,
// defaultValue: '',
colProps: { span: 4 },
componentProps: {
@ -1520,78 +1532,22 @@
const submitDc = (v) => {
loading.value = v
}
// function changePageFun(type) {
// const key = route.fullPath
// if (
// Object.keys(appStore.getneedSavePages).includes(key) &&
// (appStore.getneedSavePages[key].details || appStore.getneedSavePages[key].hbList)
// ) {
// Modal.confirm({
// title: '',
// content: ' ',
// onOk() {
// changePage(type)
// const $data = appStore.getneedSavePages
// delete $data[key]
// appStore.setneedSavePages($data)
// },
// onCancel() {},
// })
// } else {
// changePage(type)
// }
// }
// function addSedList() {
// if (isAdd.value) {
// notification.error({ message: '', duration: 3 })
// return false
// }
// const data = JSON.parse(JSON.stringify(bookingDetails.value))
// data.isNoSave = true
// // data.hblno = ''
// data.shipper = ''
// data.consignee = ''
// data.notifyparty = ''
// data.issuetype = ''
// data.blfrt = ''
// data.prepardat = ''
// data.prepardatid = ''
// if (data.ctnInputs.length > 0) {
// data.ctnInputs.map((item) => {
// delete item.id
// })
// }
// bookingDetails.value.hbList = [data]
// tabActiveKey.value = '2'
// Showtabs.value = true
// setTimeout(() => {
// RefsedOrder.value.init(bookingDetails.value.hbList)
// }, 200)
// }
// function removeOrderFun() {
// DeleteBookingOrder(bookingDetails.value.id)
// .then((res) => {
// if (res.succeeded) {
// notification.error({ message: '', duration: 3 })
// const $data = appStore.getneedSavePages
// delete $data[route.fullPath]
// appStore.setneedSavePages($data)
// const removeIcon = document
// .getElementsByClassName('ant-tabs-tab-active')[0]
// .getElementsByTagName('i')[0]
// removeIcon.click()
// that.$forceUpdate()
// appStore.setdeleteId(bookingDetails.value.id)
// } else {
// notification.error({ message: res.message, duration: 3 })
// }
// })
// .catch((err) => {
// console.log(err)
// })
// }
//
const approveDc = (remark) => {
const postData = {
result: remark ? 2 : 1,
ids: [id.value],
businessType: '1'
}
if (remark) postData['remark'] = remark
loading.value = true
SeaExportTaskAudit(postData).then(res => {
loading.value = false
createMessage.success(res.message)
}).catch(() => {
loading.value = false
})
}
// function handleSaveCtnListCover(data, slots) {
// const arr = []
// data.forEach((item) => {
@ -1996,5 +1952,9 @@
.slide-leave-to {
width: 0;
}
.approve-box {
text-align: right;
padding: 20px;
}
}
</style>

@ -76,7 +76,7 @@
const [registerModal, { setModalProps, closeModal, updateFormField }] = useModalInner(async (data) => {
//
GetOrderContactListByClientId({ id: data.companyId }).then(res => {
GetOrderContactListByClientId({ businessId: data.id }).then(res => {
personList.value = res.data
})
resetFields()

@ -138,22 +138,54 @@ export const basicInfoFormSchema: FormSchema[] = [
},
},
{
field: 'customerNo',
field: 'customerNum',
label: '客户编号',
component: 'Input',
required: false,
dynamicDisabled: true,
// defaultValue: '',
colProps: { span: 4 },
colProps: { span: 4 }
},
{
field: 'customerNo',
label: '国内发货人',
field: 'shipperCn',
label: '',
component: 'Input',
required: false,
dynamicDisabled: true,
show: false,
},
{
label: '国内发货人',
field: 'shipperCnId',
component: 'ApiSelect',
required: false,
dynamicDisabled: false,
// defaultValue: '',
colProps: { span: 4 },
componentProps: ({ formModel }) => {
return {
allowClear: true,
showSearch: true,
api: () => {
return new Promise((resolve) => {
const arr = getOptions('shippercn')
console.log(arr)
resolve(arr)
})
},
labelField: 'name',
valueField: 'id',
showName: 'shortName',
resultField: 'data',
filterOption: (input: string, option: any) => {
return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0
},
onChange: (e, obj) => {
if (obj) {
formModel.shipperCn = obj.label
} else {
formModel.shipperCn = ''
}
}
}
},
},
{
field: 'accountDate',
@ -656,6 +688,46 @@ export const basicInfoFormSchema: FormSchema[] = [
return !values.saleId
},
},
{
label: '',
field: 'agent',
component: 'Input',
show: false,
},
{
field: 'agentId',
label: '国外代理',
component: 'ApiSelect',
required: false,
dynamicDisabled: false,
// defaultValue: '',
colProps: { span: 4 },
componentProps: ({ formActionType, formModel }) => {
return {
allowClear: true,
showSearch: true,
api: () => {
return new Promise((resolve) => {
const arr = getOptions('agent')
resolve(arr)
})
},
labelField: 'name',
valueField: 'id',
resultField: 'data',
filterOption: (input: string, option: any) => {
return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0
},
onChange: (e, obj) => {
if (obj) {
formModel.agent = obj.label
} else {
formModel.agent = ''
}
},
}
},
},
{
field: 'truckerId',
label: '车队',
@ -1544,56 +1616,16 @@ export const mailingInfoFormSchemaR: FormSchema[] = [
},
{
field: 'atd',
label: 'ATD',
label: '计费日',
component: 'DatePicker',
required: false,
dynamicDisabled: false,
// defaultValue: '',
colProps: { span: 6 },
colProps: { span: 12 },
componentProps: {
allowClear: true,
},
},
{
label: '',
field: 'agent',
component: 'Input',
show: false,
},
{
field: 'agentId',
label: '国外代理',
component: 'ApiSelect',
required: false,
dynamicDisabled: false,
// defaultValue: '',
colProps: { span: 6 },
componentProps: ({ formActionType, formModel }) => {
return {
allowClear: true,
showSearch: true,
api: () => {
return new Promise((resolve) => {
const arr = getOptions('agent')
resolve(arr)
})
},
labelField: 'name',
valueField: 'id',
resultField: 'data',
filterOption: (input: string, option: any) => {
return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0
},
onChange: (e, obj) => {
if (obj) {
formModel.agent = obj.label
} else {
formModel.agent = ''
}
},
}
},
},
{
field: 'termDelivery',
label: '贸易方式',
@ -1601,7 +1633,7 @@ export const mailingInfoFormSchemaR: FormSchema[] = [
required: false,
dynamicDisabled: false,
// defaultValue: '',
colProps: { span: 6 },
colProps: { span: 12 },
componentProps: {
options: FntermDelivery,
allowClear: true,
@ -1618,7 +1650,7 @@ export const mailingInfoFormSchemaR: FormSchema[] = [
required: false,
dynamicDisabled: false,
// defaultValue: '',
colProps: { span: 6 },
colProps: { span: 12 },
componentProps: {
options: FntradeTerm,
allowClear: true,
@ -1642,7 +1674,7 @@ export const mailingInfoFormSchemaR: FormSchema[] = [
required: false,
dynamicDisabled: false,
// defaultValue: '',
colProps: { span: 24 },
colProps: { span: 12 },
componentProps: ({ formModel }) => {
return {
option: optionsStore.getOptionsByCode('GetClientLanesSelectList'),

@ -53,13 +53,17 @@
<span class="iconfont icon-tuandui" @click="openPersonModal(item, '报关行', 'customserId')"></span>
</template>
<template #isBusinessLocking="item">
<span class="lock-box">
<span class="lock-box" style="margin-right: 15px;">
业务锁定
<div></div>
<div>
<span class="iconfont" :class="{ 'icon-locksuo': item.values.isBusinessLocking, 'icon-lock-openkaisuo': !item.values.isBusinessLocking }"></span>
</div>
</span>
<span class="lock-box">
费用锁定
<div></div>
<div>
<span class="iconfont" :class="{ 'icon-locksuo': item.values.isFeeLocking, 'icon-lock-openkaisuo': !item.values.isFeeLocking }"></span>
</div>
</span>
<!-- <span class="iconfont" :class="{ item.values.isBusinessLocking ? 'icon-locksuo' : 'icon-lock-openkaisuo'}"></span>
<span class="iconfont" :class="{ item.values.isFeeLocking ? 'icon-locksuo' : 'icon-lock-openkaisuo'}"></span> -->
@ -111,13 +115,17 @@
import { BasicForm, useForm } from '/@/components/Form/index'
import { basicInfoFormSchema, personColumns } from './baseInfo.tsx'
import { BasicTable, useTable, TableAction } from '/@/components/Table'
import { ref, watch } from 'vue'
import { ref, watch, onMounted } from 'vue'
import { GetBusinessOrderContactList } from '/@/views/operation/seaexport/api/BookingLedger'
import { useMessage } from '/@/hooks/web/useMessage'
import { formatParams } from '/@/hooks/web/common'
import PersonModal from './PersonModal.vue'
const { createMessage } = useMessage()
import { useModal } from '/@/components/Modal'
import { useRoute } from 'vue-router'
const route = useRoute()
//
const source = ref(route.query.source || 'edit')
const [registerModal, { openModal }] = useModal()
const props = defineProps({
details: { type: Object, default: {} },
@ -237,6 +245,13 @@
setFieldsValue(v)
},
)
onMounted(() => {
if (source.value != 'edit') {
basicInfoFormSchema.forEach(item => {
item.dynamicDisabled = true
})
}
})
defineExpose({
// RefbasicFrom,
getFieldsValue,
@ -280,7 +295,22 @@
}
.lock-box {
display: inline-block;
width: calc(50% - 7.5px);
padding-top: 3px;
font-size: 12px;
div {
border: 1px solid #d9d9d9;
border-radius: 2px;
height: 26px;
line-height: 26px;
text-align: center;
span {
font-size: 14px;
}
}
.icon-locksuo {
color: #257AFA;
}
}
}
</style>

@ -0,0 +1,99 @@
<template>
<div>
<BasicTable
@register="registerTable"
>
<template #tableTitle>
<h4 style="margin: 0 20px 0 0; ">联系人信息</h4>
<a-button type="link" @click="create">
<span class="iconfont icon-new_document"></span>
新增
</a-button>
<a-button type="link" @click="del">
<span class="iconfont icon-shanchu2"></span>
删除
</a-button>
</template>
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'action'">
<TableAction
:actions="[
{
icon: 'clarity:note-edit-line',
tooltip: '编辑',
onClick: handleEdit.bind(null, record)
},
]"
/>
</template>
</template>
</BasicTable>
<PersonModal @register="registerModal" @success="handleSuccess" />
</div>
</template>
<script lang="ts" setup>
import { BasicForm, useForm } from '/@/components/Form/index'
import { personColumns } from './baseInfo.tsx'
import { BasicTable, useTable } from '/@/components/Table'
import { ref, watch, onMounted } from 'vue'
import { GetBusinessOrderContactList } from '/@/views/operation/seaexport/api/BookingLedger'
import { useMessage } from '/@/hooks/web/useMessage'
import { useModal } from '/@/components/Modal'
import { formatParams } from '/@/hooks/web/common'
import PersonModal from './PersonModal.vue'
const [registerModal, { openModal }] = useModal()
const { createMessage } = useMessage()
const props = defineProps({
id: { type: String },
})
//
const [registerTable, { reload, getForm, getPaginationRef }] = useTable({
api: async (p) => {
const res: API.DataResult = await GetBusinessOrderContactList(p)
return new Promise((resolve) => {
resolve({ data: [...res.data], total: res.count })
})
},
beforeFetch: (p) => {
p['businessId'] = props.id
return formatParams(p)
},
columns: personColumns,
isTreeTable: false,
pagination: true,
striped: true,
useSearchForm: false,
showTableSetting: false,
bordered: true,
showIndexColumn: true,
rowSelection: {
type: 'checkbox'
},
canResize: false,
actionColumn: {
width: 60,
title: '操作',
dataIndex: 'action',
fixed: 'right',
}
})
function handleSuccess() {
reload()
}
//
const create = () => {
openModal(true, {
isUpdate: false,
id: props.id
})
}
//
function handleEdit(record) {
openModal(true, {
record,
isUpdate: true,
id: props.id
})
}
</script>

@ -6,7 +6,11 @@
<script lang="ts" setup>
import { BasicForm, useForm } from '/@/components/Form/index'
import { ediMoreFormSchema } from './baseInfo.tsx'
import { ref, watch, defineProps, defineExpose } from 'vue'
import { ref, watch, defineProps, defineExpose, onMounted } from 'vue'
import { useRoute } from 'vue-router'
const route = useRoute()
//
const source = ref(route.query.source || 'edit')
const props = defineProps({
details: {
type: Object,
@ -41,6 +45,13 @@
// function dateChangeFun({ type, value }) {
// props.details[type] = value || ''
// }
onMounted(() => {
if (source.value != 'edit') {
ediMoreFormSchema.forEach(item => {
item.dynamicDisabled = true
})
}
})
defineExpose({
// RefediFrom,
getFieldsValue,

@ -29,7 +29,11 @@
<script lang="ts" setup>
import { BasicForm, useForm } from '/@/components/Form/index'
import { mailingInfoFormSchemaL, mailingInfoFormSchemaR } from './baseInfo.tsx'
import { ref, reactive, getCurrentInstance, watch, onMounted } from 'vue'
import { ref, getCurrentInstance, watch, onMounted } from 'vue'
import { useRoute } from 'vue-router'
const route = useRoute()
//
const source = ref(route.query.source || 'edit')
const props = defineProps({
details: {
type: Object,
@ -648,6 +652,18 @@
function handleOpenFd() {
visibleJW.value = true
}
onMounted(() => {
if (source.value != 'edit') {
mailingInfoFormSchemaR.forEach(item => {
item.dynamicDisabled = true
})
}
if (source.value != 'edit') {
mailingInfoFormSchemaL.forEach(item => {
item.dynamicDisabled = true
})
}
})
defineExpose({
// RefmailingFrom,
getFieldsValueL,

@ -1812,6 +1812,8 @@
console.log(res)
emit('submitDc', false)
createMessage.success(res.message)
}).catch(() => {
emit('submitDc', false)
})
}
function handleModelCancel() {

@ -4,7 +4,7 @@
* @Date: 2024-04-29 11:54:04
-->
<template>
<div class="ds-card mt15 other-info">
<div class="ds-card other-info">
<div class="flex">
<h4>其他信息</h4>
<ConfigForm

@ -738,11 +738,11 @@
bookingServiceItem.value = res.data.ext
// this.$bus.$emit('bookingServiceItem', res.data.ext)
emit('bookingServiceItem', res.data.ext)
} else {
createMessage.error(res.data.msg)
}
seriveLoading.value = false
}).chath
}).catch(() => {
seriveLoading.value = false
})
} else {
spinning.value = true
getStatusServiceList(1, null)
@ -777,10 +777,11 @@
getServiceItemList(2, data.projectCode)
}, 500)
} else {
createMessage.error(res.message)
spinning.value = false
getServiceItemList(1, null)
}
}).catch(() => {
seriveLoading.value = false
})
} else {
bookingServiceItem.value.forEach((item) => {
@ -800,10 +801,11 @@
getServiceItemList(2, data.projectCode)
}, 500)
} else {
createMessage.error(res.message)
spinning.value = false
getServiceItemList(1, null)
}
}).catch(() => {
seriveLoading.value = false
})
}
}
@ -829,10 +831,10 @@
}
}
booGoodsStatusItem.value = res.data.ext
} else {
createMessage.error(res.data.msg)
}
spinning.value = false
}).catch(() => {
spinning.value = false
})
}
//
@ -856,7 +858,6 @@
SaveServiceStatus(obj).then((res) => {
if (res.data.succ) {
} else {
createMessage.error(res.data.msg)
getStatusServiceList(1, null)
}
spinning.value = false
@ -870,7 +871,6 @@
CancelServiceStatus(obj).then((res) => {
if (res.data.succ) {
} else {
createMessage.error(res.data.msg)
getStatusServiceList(1, null)
}
spinning.value = false
@ -923,8 +923,6 @@
if (res.data.succ) {
GoodsStatusVisible.value = false
getStatusServiceList(1, null)
} else {
createMessage.error(res.data.msg)
}
goodStatusLoading.value = false
})
@ -976,8 +974,6 @@
rows: res.data.extra.detailList,
type: res.data.succ ? 'success' : 'fail',
})
} else {
createMessage.error(res.message)
}
})
}

@ -111,8 +111,8 @@
</template>
</BasicTable>
<!-- 合计 -->
<div>
<h5 v-if="calcData.length" style="position: absolute; bottom: 75px; left: 22px"></h5>
<div class="static-box">
<h5 v-if="calcData.length" style="position: absolute; bottom: 68px; left: 22px"></h5>
<a-table
class="ds-table"
:columns="calcColumns"
@ -412,7 +412,7 @@
width: 60,
},
canResize: true,
resizeHeightOffset: 80,
resizeHeightOffset: 75,
immediate: false,
actionColumn: {
width: 80,
@ -424,7 +424,7 @@
})
function editColumns(row) {
if (row.mblno) {
go(`/BookingDetail?id=${row.id}&mblno=${row.mblno}`)
go(`/BookingDetail?id=${row.id}`)
} else {
go(`/BookingDetail?id=${row.id}&customerNo=${row.customerNo}`)
}
@ -547,5 +547,9 @@
.vben-basic-table-header__toolbar {
justify-content: space-between;
}
.static-box {
position: fixed;
bottom: 0;
}
}
</style>

@ -1,6 +1,166 @@
<!--
* @Desc:
* @Author: lijj
* @Date: 2024-07-17 08:39:51
-->
<template>
<div :class="prefixCls" class="login-background-img">
<AppLocalePicker class="absolute top-4 right-4 enter-x xl:text-gray-600" :show-text="false" />
<div :class="prefixCls">
<div :class="`${prefixCls}-login-left`">
<img src="../../../assets/loginmini/icon/login_bg.jpg" alt="">
</div>
<div :class="`${prefixCls}-login-right`">
<img class="logo" src="/src/assets/images/logo.png" alt="">
<AppLocalePicker class="absolute top-4 right-4 enter-x xl:text-gray-600" :show-text="false" />
<div class="aui-container">
<div class="aui-form">
<div class="aui-image">
<div class="aui-image-text">
<img :src="adTextImg" />
</div>
</div>
<div class="aui-formBox">
<div class="aui-formWell">
<h4></h4>
<div class="aui-flex aui-form-nav investment_title">
<div class="page-title">
{{ t('sys.login.loginPageTitle') }}
</div>
<div class="page-intro">
{{ t('sys.login.loginPageIntro') }}
</div>
<!-- <div
class="aui-flex-box"
:class="activeIndex === 'accountLogin' ? 'activeNav on' : ''"
@click="loginClick('accountLogin')"
>{{ t('sys.login.signInFormTitle') }}
</div> -->
<!-- <div
class="aui-flex-box"
:class="activeIndex === 'phoneLogin' ? 'activeNav on' : ''"
@click="loginClick('phoneLogin')"
>{{ t('sys.login.mobileSignInFormTitle') }}
</div> -->
</div>
<div class="aui-form-box" style="height: 180px">
<a-form
v-if="activeIndex === 'accountLogin'"
ref="loginRef"
:model="formData"
@keyup.enter.native="loginHandleClick"
>
<div class="aui-account">
<div class="aui-inputClear">
<i class="icon icon-code"></i>
<a-form-item>
<a-input
v-model:value="formData.username"
class="fix-auto-fill"
:placeholder="t('sys.login.userName')"
/>
</a-form-item>
</div>
<div class="aui-inputClear">
<i class="icon icon-password"></i>
<a-form-item>
<a-input
v-model:value="formData.password"
class="fix-auto-fill"
type="password"
:placeholder="t('sys.login.password')"
/>
</a-form-item>
</div>
<div class="aui-flex">
<div class="aui-flex-box">
<div class="aui-choice">
<a-input
v-model:value="rememberMe"
class="fix-auto-fill"
type="checkbox"
/>
<span class="remeber-txt">{{ t('sys.login.rememberMe') }}</span>
</div>
</div>
<!-- <div class="aui-forget">
<a @click="forgetHandelClick"> {{ t('sys.login.forgetPassword') }}</a>
</div> -->
</div>
</div>
</a-form>
<!-- <a-form
v-else
ref="phoneFormRef"
:model="phoneFormData"
@keyup.enter.native="loginHandleClick"
>
<div class="aui-account phone">
<div class="aui-inputClear phoneClear">
<a-input
v-model:value="phoneFormData.mobile"
class="fix-auto-fill"
:placeholder="t('sys.login.mobile')"
/>
</div>
<div class="aui-inputClear">
<a-input
v-model:value="phoneFormData.smscode"
class="fix-auto-fill"
:maxlength="6"
:placeholder="t('sys.login.smsCode')"
/>
<div v-if="showInterval" class="aui-code">
<a>{{ t('component.countdown.normalText') }}</a>
</div>
<div v-else class="aui-code">
<span class="aui-get-code code-shape">{{
t('component.countdown.sendText', [unref(timeRuning)])
}}</span>
</div>
</div>
</div>
</a-form> -->
</div>
<div class="aui-formButton">
<div class="aui-flex">
<a-button
:loading="loginLoading"
class="aui-link-login"
type="primary"
@click="loginHandleClick"
>
{{ t('sys.login.loginButton') }}</a-button
>
</div>
<div class="aui-flex">
<a-button
type="primary"
ghost
@click="registerHandleClick"
>
{{ t('sys.login.registerButton') }}</a-button
>
</div>
</div>
</div>
<!-- <a-form @keyup.enter.native="loginHandleClick">
<div class="aui-flex aui-third-text">
<div class="aui-flex-box aui-third-border">
<span>{{ t('sys.login.otherSignIn') }}</span>
</div>
</div>
<div class="aui-flex" :class="`${prefixCls}-sign-in-way`"> </div>
</a-form> -->
</div>
</div>
</div>
</div>
<div v-show="type === 'forgot'" :class="`${prefixCls}-form`">
<MiniForgotpad ref="forgotRef" @go-back="goBack" @success="handleSuccess" />
</div>
<div v-show="type === 'register'" :class="`${prefixCls}-form`">
<MiniRegister ref="registerRef" @go-back="goBack" @success="handleSuccess" />
</div>
<!-- <AppLocalePicker class="absolute top-4 right-4 enter-x xl:text-gray-600" :show-text="false" />
<AppDarkModeToggle class="absolute top-3 right-7 enter-x" />
<div v-if="!getIsMobile" class="aui-logo">
<div>
@ -66,16 +226,6 @@
/>
</a-form-item>
</div>
<!-- <div class="aui-inputClear">-->
<!-- <i class="icon icon-code"></i>-->
<!-- <a-form-item>-->
<!-- <a-input class="fix-auto-fill" type="text" :placeholder="t('sys.login.inputCode')" v-model:value="formData.inputCode" />-->
<!-- </a-form-item>-->
<!-- <div class="aui-code">-->
<!-- <img v-if="randCodeData.requestCodeSuccess" :src="randCodeData.randCodeImage" @click="handleChangeCheckCode" />-->
<!-- <img v-else style="margin-top: 2px; max-width: initial" :src="codeImg" @click="handleChangeCheckCode" />-->
<!-- </div>-->
<!-- </div>-->
<div class="aui-flex">
<div class="aui-flex-box">
<div class="aui-choice">
@ -137,9 +287,6 @@
{{ t('sys.login.loginButton') }}</a-button
>
</div>
<!-- <div class="aui-flex">-->
<!-- <a class="aui-linek-code aui-flex-box" @click="codeHandleClick">{{ t('sys.login.qrSignInFormTitle') }}</a>-->
<!-- </div>-->
<div class="aui-flex">
<a class="aui-linek-code aui-flex-box" @click="registerHandleClick">{{
t('sys.login.registerButton')
@ -165,8 +312,7 @@
</div>
<div v-show="type === 'register'" :class="`${prefixCls}-form`">
<MiniRegister ref="registerRef" @go-back="goBack" @success="handleSuccess" />
</div>
<!-- 第三方登录相关弹框 -->
</div> -->
</div>
</template>
<script lang="ts" setup name="login-mini">
@ -383,144 +529,81 @@
})
</script>
<style lang="less" scoped>
@import '/@/assets/loginmini/style/home.less';
@import '/@/assets/loginmini/style/base.less';
:deep(.ant-input:focus) {
box-shadow: none;
}
.aui-get-code {
float: right;
position: relative;
z-index: 3;
background: #ffffff;
color: #1573e9;
border-radius: 100px;
padding: 5px 16px;
margin: 7px;
border: 1px solid #1573e9;
top: 12px;
}
.aui-get-code:hover {
color: #1573e9;
}
.code-shape {
border-color: #dadada !important;
color: #aaa !important;
}
:deep(.jeecg-dark-switch) {
position: absolute;
margin-right: 10px;
}
.aui-link-login {
height: 42px;
padding: 10px 15px;
font-size: 14px;
border-radius: 8px;
margin-top: 15px;
margin-bottom: 8px;
}
.aui-phone-logo {
position: absolute;
margin-left: 10px;
width: 60px;
top: 2px;
z-index: 4;
}
.top-3 {
top: 0.45rem;
}
</style>
<style lang="less">
@prefix-cls: ~'@{namespace}-mini-login';
@dark-bg: #293146;
html[data-theme='dark'] {
.@{prefix-cls} {
background-color: @dark-bg !important;
background-image: none;
&::before {
background-image: url(/@/assets/svg/login-bg-dark.svg);
}
.aui-inputClear {
background-color: #232a3b !important;
}
.ant-input,
.ant-input-password {
background-color: #232a3b !important;
}
.ant-btn:not(.ant-btn-link):not(.ant-btn-primary) {
border: 1px solid #4a5569 !important;
.@{prefix-cls} {
display: flex;
&-login-right {
width: 560px;
padding: 0 100px;
position: relative;
.logo {
width: 260px;
margin-left: 50px;
position: absolute;
bottom: 20px;
}
&-form {
background: @dark-bg !important;
.page-title {
font-size: 30px;
font-weight: 600;
}
.app-iconify {
color: #fff !important;
}
.aui-inputClear input,
.aui-input-line input,
.aui-choice {
color: #c9d1d9 !important;
.page-intro {
font-weight: 400;
letter-spacing: 1px;
line-height: 22px;
color: rgba(122, 135, 152, 1);
text-align: left;
vertical-align: top;
margin-top: 20px;
margin-bottom: 40px;
}
.aui-formBox {
background-color: @dark-bg !important;
}
.aui-third-text span {
background-color: @dark-bg !important;
.ant-form-item {
margin-bottom: 20px;
.ant-input {
height: 40px!important;
}
}
.aui-form-nav .aui-flex-box {
color: #c9d1d9 !important;
.ant-btn {
height: 40px!important;
width: 100%;
font-size: 14px!important;
}
.aui-formButton .aui-linek-code {
background: @dark-bg !important;
color: white !important;
.aui-link-login {
color: #ffffff;
font-weight: 600;
margin-bottom: 6px;
}
.aui-code-line {
border-left: none !important;
.aui-form-box {
height: auto!important;
}
.ant-checkbox-inner,
.aui-success h3 {
border-color: #c9d1d9;
.remeber-txt {
color: rgba(122, 135, 152, 1);
position: relative;
top: -5px;
display: inline-block;
}
//update-begin---author:wangshuai ---date:20230828 forQQYUN-6363------------
&-sign-in-way {
.anticon {
font-size: 22px !important;
color: #888 !important;
cursor: pointer !important;
&:hover {
color: @primary-color !important;
}
.aui-choice {
position: relative;
top: -10px;
input {
float: left;
width: 20px;
}
}
//update-end---author:wangshuai ---date:20230828 forQQYUN-6363------------
}
input.fix-auto-fill,
.fix-auto-fill input {
-webkit-text-fill-color: #c9d1d9 !important;
box-shadow: inherit !important;
}
.ant-divider-inner-text {
font-size: 12px !important;
color: @text-color-secondary !important;
.aui-container {
position: relative;
top: 50%;
margin-top: -400px;
}
}
.aui-third-login a {
background: transparent;
&-login-left {
img {
width: 100%;
height: 100vh;
}
flex: 1;
}
}
</style>

@ -3,9 +3,6 @@
<div class="aui-container">
<div class="aui-form">
<div class="aui-image">
<div class="aui-image-text">
<img :src="jeecgAdTextImg" alt="" />
</div>
</div>
<div class="aui-formBox">
<div class="aui-formWell">
@ -156,8 +153,8 @@
// import { getCaptcha, register } from '/@/api/sys/user';
// import { SmsEnum } from '/@/views/sys/login/useLogin';
import { useMessage } from '/@/hooks/web/useMessage'
import logoImg from '/@/assets/loginmini/icon/ds_logo.png'
import jeecgAdTextImg from '/@/assets/loginmini/icon/jeecg_ad_text.png'
// import logoImg from '/@/assets/loginmini/icon/ds_logo.png'
// import jeecgAdTextImg from '/@/assets/loginmini/icon/jeecg_ad_text.png'
import eyeKImg from '/@/assets/loginmini/icon/icon-eye-k.png'
import eyeGImg from '/@/assets/loginmini/icon/icon-eye-g.png'
import { useI18n } from '/@/hooks/web/useI18n'

@ -572,7 +572,6 @@ function handledbclick(row) {
import { useRouter } from 'vue-router'
const router = useRouter();
function handleEdit(data) {
console.log(data)
switch (data.tasK_BASE_TYPE) {
case 'VGM_COMPARE':
// VGM
@ -721,11 +720,18 @@ function handleEdit(data) {
query: { taskPKId: data.id }
});
break;
case 'WAIT_ORDER_AUDIT':
//
go({
path: '/commontaskmanage/booking-approval',
query: { id: data.ouT_BS_NO, source: 'view' }
});
break;
default:
//
go({
path: '/commontaskmanage/BookingDetails',
query: { taskPKId: data.id }
path: '/commontaskmanage/booking-approval',
query: { id: data.ouT_BS_NO, source: 'view' }
});
break;
}

Loading…
Cancel
Save