szh-new
张同海 5 months ago
commit 90db7d8d26

@ -79,6 +79,10 @@ enum Api {
GetServiceSelectList = '/mainApi/ClientCommon/GetServiceSelectList', GetServiceSelectList = '/mainApi/ClientCommon/GetServiceSelectList',
// 船名下拉数据 // 船名下拉数据
GetVesselSelectList = '/mainApi/ClientCommon/GetVesselSelectList', GetVesselSelectList = '/mainApi/ClientCommon/GetVesselSelectList',
// 根据往来单位取出关联的费用对象
GetClientSelectInfoByCode = '/mainApi/ClientCommon/GetClientSelectInfoByCode',
// 根据箱型获取数量信息
GetUnitSelectInfo = '/mainApi/ClientCommon/GetUnitSelectInfo',
} }
// 船名下拉数据列表 // 船名下拉数据列表
@ -406,7 +410,20 @@ export function changePassword(data: any) {
data, data,
}) })
} }
export function GetClientSelectInfoByCode(data: any) {
return request<DataResult>({
url: Api.GetClientSelectInfoByCode,
method: 'post',
data,
})
}
export function GetUnitSelectInfo(data: any) {
return request<DataResult>({
url: Api.GetUnitSelectInfo,
method: 'post',
data,
})
}
// 往来单位下拉列表集合 // 往来单位下拉列表集合
export function GetMultiClientList() { export function GetMultiClientList() {
return request({ return request({

@ -123,7 +123,7 @@
<!-- 申请修改弹窗 --> <!-- 申请修改弹窗 -->
<ApplyModify ref="applyModify" @register="registerModal" @refresh="refresh"></ApplyModify> <ApplyModify ref="applyModify" @register="registerModal" @refresh="refresh"></ApplyModify>
<!-- 申请删除 --> <!-- 申请删除 -->
<!-- 引入弹窗 --> <!-- 引入弹窗 -->
<a-modal <a-modal
v-model:visible="visible" v-model:visible="visible"
v-if="visible" v-if="visible"

@ -46,7 +46,7 @@
provide, provide,
} from 'vue' } from 'vue'
// //
import { GetFeeCurrencySelectList, GetFeeCodeSelectList } from '/@/api/common' import { GetFeeCurrencySelectList, GetFeeCodeSelectList, GetClientSelectInfoByCode, GetUnitSelectInfo } from '/@/api/common'
import { HotTable } from '@handsontable/vue3' import { HotTable } from '@handsontable/vue3'
import { registerAllModules } from 'handsontable/registry' import { registerAllModules } from 'handsontable/registry'
import 'handsontable/dist/handsontable.full.min.css' import 'handsontable/dist/handsontable.full.min.css'
@ -83,7 +83,9 @@
default: '', default: '',
}, },
// //
details: { type: [Object, Array] } details: { type: [Object, Array] },
//
type: { type: [String, Number] }
}) })
const emits = defineEmits(['broInsert']) const emits = defineEmits(['broInsert'])
// //
@ -503,8 +505,12 @@
if (item) dict = item[0] if (item) dict = item[0]
list.value[changes[0][0]]['customerType'] = dict?.value list.value[changes[0][0]]['customerType'] = dict?.value
list.value[changes[0][0]]['customerTypeText'] = changes[0][3].split('-')[1] list.value[changes[0][0]]['customerTypeText'] = changes[0][3].split('-')[1]
list.value[changes[0][0]]['customerCode'] = '' //
list.value[changes[0][0]]['customerName'] = '' console.log(props.details)
GetClientSelectInfoByCode({ code: dict?.value, businessId: props.id, businessType: props.type }).then(res => {
list.value[changes[0][0]]['customerCode'] = res.data.clientId
list.value[changes[0][0]]['customerName'] = res.data.clientName
})
}) })
} }
// //
@ -515,24 +521,27 @@
if (item) dict = item[0] if (item) dict = item[0]
list.value[changes[0][0]]['unit'] = dict?.value list.value[changes[0][0]]['unit'] = dict?.value
list.value[changes[0][0]]['unitText'] = changes[0][3].split('-')[1] list.value[changes[0][0]]['unitText'] = changes[0][3].split('-')[1]
GetUnitSelectInfo({ code: dict?.value, businessId: props.id, businessType: props.type }).then(res => {
list.value[changes[0][0]]['quantity'] = res.data.quantity
})
// //
const text = list.value[changes[0][0]]['unitText'] // const text = list.value[changes[0][0]]['unitText']
if (text == '单票') { // if (text == '') {
list.value[changes[0][0]]['quantity'] = 1 // list.value[changes[0][0]]['quantity'] = 1
} else if (text == '件数') { // } else if (text == '') {
list.value[changes[0][0]]['quantity'] = props.details.pkgs // list.value[changes[0][0]]['quantity'] = props.details.pkgs
} else if (text == '重量') { // } else if (text == '') {
list.value[changes[0][0]]['quantity'] = props.details.kgs // list.value[changes[0][0]]['quantity'] = props.details.kgs
} else if (text == '尺码') { // } else if (text == '') {
list.value[changes[0][0]]['quantity'] = props.details.cbm // list.value[changes[0][0]]['quantity'] = props.details.cbm
} else if (text == '计费吨') { // } else if (text == '') {
let r = props.details.kgs // let r = props.details.kgs
const k = (props.details.pkgs || 0) / 1000 // const k = (props.details.pkgs || 0) / 1000
if (k > r) { // if (k > r) {
r = k // r = k
} // }
list.value[changes[0][0]]['quantity'] = r // list.value[changes[0][0]]['quantity'] = r
}
} }
// //
if (changes[0][1] === 'currencyName') { if (changes[0][1] === 'currencyName') {

@ -8,9 +8,9 @@
<!-- 主单信息组件 --> <!-- 主单信息组件 -->
<MainInfo :data="details"></MainInfo> <MainInfo :data="details"></MainInfo>
<!-- 应收表格 --> <!-- 应收表格 -->
<FeeTable tbType="receive" :broData="broPayData" :id="data.id" :details="details" @broInsert="broReceive"></FeeTable> <FeeTable tbType="receive" :type="type" :broData="broPayData" :id="data.id" :details="details" @broInsert="broReceive"></FeeTable>
<!-- 应付表格 --> <!-- 应付表格 -->
<FeeTable tbType="pay" :broData="broReceiveData" :id="data.id" :details="details" @broInsert="broPay"></FeeTable> <FeeTable tbType="pay" :broData="broReceiveData" :type="type" :id="data.id" :details="details" @broInsert="broPay"></FeeTable>
<FeeStatistic :id="data.id" /> <FeeStatistic :id="data.id" />
</div> </div>
</template> </template>
@ -23,7 +23,9 @@
// //
import FeeStatistic from './feeStatistic.vue' import FeeStatistic from './feeStatistic.vue'
const props = defineProps({ const props = defineProps({
details: { type: [Object, Array] } details: { type: [Object, Array] },
//
type: { type: [String, Number] }
}) })
const data = ref(null) const data = ref(null)
// data.value = props.details // data.value = props.details

@ -21,6 +21,7 @@ import {
GetTruckClientList, GetTruckClientList,
GetDispatcherList, GetDispatcherList,
} from '/@/views/operation/seaexport/api/BookingLedger' } from '/@/views/operation/seaexport/api/BookingLedger'
import { getList } from '/@/views/flowcenter/flowInstances/api'
import { GetFeeCurrencySelectList } from '/@/api/common/index' import { GetFeeCurrencySelectList } from '/@/api/common/index'
export default { export default {
// 业务来源 // 业务来源
@ -113,6 +114,12 @@ export default {
return res.data return res.data
}) })
}, },
// 用户
GetUserList: () => {
return getList().then((res) => {
return res.data
})
},
//承运车队 //承运车队
GetTruckClientList: () => { GetTruckClientList: () => {
return GetTruckClientList().then((res) => { return GetTruckClientList().then((res) => {

@ -40,6 +40,8 @@ export const useOptionsStore = defineStore({
GetPackageSelectList: null, GetPackageSelectList: null,
// 币别 // 币别
GetFeeCurrencySelectList: null, GetFeeCurrencySelectList: null,
// 用户表
GetUserList: null,
// 币别 // 币别
GetTruckClientList: null, GetTruckClientList: null,
// 派车调度人员 // 派车调度人员

@ -6,7 +6,9 @@ enum Api {
AuditByBiz = '/feeApi/FeeAudit/AuditByBiz', AuditByBiz = '/feeApi/FeeAudit/AuditByBiz',
Audit = '/feeApi/FeeAudit/Audit', Audit = '/feeApi/FeeAudit/Audit',
SetInvoiceEnabled = '/feeApi/FeeRecord/SetInvoiceEnabled', SetInvoiceEnabled = '/feeApi/FeeRecord/SetInvoiceEnabled',
GetFees = '/feeApi/FeeAudit/GetFees' GetFees = '/feeApi/FeeAudit/GetFees',
GetModifyValue = '/feeApi/FeeRecord/GetModifyValue',
GetStat = '/feeApi/FeeAudit/GetStat'
} }
// 业务列表 // 业务列表
@ -54,9 +56,20 @@ export function GetFees(data: PageRequest) {
}) })
} }
// export function getThermometryWarningCount() { // 根据费用id查询修改后的新值
// return request<DataResult>({ export function GetModifyValue(params) {
// url: Api.getThermometryWarningCount, return request<DataResult>({
// method: 'get', url: Api.GetModifyValue,
// }) method: 'get',
// } params
})
}
// 根据业务id查询关联的统计
export function GetStat(data: PageRequest) {
return request<DataResult>({
url: Api.GetStat,
method: 'post',
data
})
}

@ -0,0 +1,90 @@
<!--
* @Description: 审核审批 -> 修改后的新值
* @Author: lijj
* @Date: 2024-06-13 17:08:08
-->
<template>
<div class="ds-approve-alter-new-value">
<a-spin :spinning="loading">
<a-form layout="vertical" class="ds-form-detail">
<a-row :gutter="15">
<a-col v-for="item in list" :span="item.span" :key='item.value'>
<a-form-item
:label="item.label"
>
<div>
<span v-if="item.field != 'isAdvancedPay'">
{{ detailData[item.field] || '-' }}
</span>
<span v-else>
{{ detailData[item.field] ? '是' : '否' }}
</span>
</div>
</a-form-item>
</a-col>
</a-row>
</a-form>
</a-spin>
</div>
</template>
<script lang="ts" setup>
import { onMounted, ref, reactive, defineProps, watch, defineEmits } from 'vue'
import { GetModifyValue } from '../api'
const props = defineProps({
// id
id: {
type: String
},
selectRow: {
type: Object
}
})
const list = [
{ label: '费用名称', field: 'feeName', span: 5 },
{ label: '费用对象', field: 'customerName', span: 5 },
{ label: '核算单位', field: 'saleOrg', span: 5 },
{ label: '单位标准', field: 'unitText', span: 5 },
{ label: '不含税单价', field: 'noTaxPrice', span: 5 },
{ label: '税率', field: 'taxRate', span: 5 },
{ label: '含税单价', field: 'unitPrice', span: 5 },
{ label: '计费数量', field: 'quantity', span: 5 },
{ label: '不含税金额', field: 'noTaxAmount', span: 5 },
{ label: '含税金额', field: 'amount', span: 5 },
{ label: '币别', field: 'currency', span: 5 },
{ label: '汇率', field: 'exchangeRate', span: 5 },
{ label: '财务税率', field: 'accTaxRate', span: 5 },
{ label: '是否垫付', field: 'isAdvancedPay', span: 5 },
{ label: '修改原因', field: 'reason', span: 5 },
{ label: '责任人', field: 'manager', span: 5 },
{ label: '备注', field: 'remark', span: 5 },
{ label: '申请人', field: 'updateBy', span: 5 },
{ label: '申请时间', field: 'updateTime', span: 5 },
{ label: '更改前利润', field: 'updateTime', span: 5 },
{ label: '更改后利润', field: 'updateTime', span: 5 },
{ label: '利润差额', field: 'updateTime', span: 5 },
]
const detailData = ref({})
const loading = ref(false)
const init =() => {
if (props.id) {
loading.value = true
GetModifyValue({ id: props.id }).then(res => {
loading.value = false
detailData.value = res.data
})
}
}
onMounted(() => {
init()
})
</script>
<style lang="less">
.ds-approve-alter-new-value {
background: #ffffff;
height: 100%;
padding: 5px 10px;
border: 1px solid #d1d1d1;
}
</style>

@ -0,0 +1,334 @@
<!--
* @Description: 审批统计组件
* @Author: lijj
* @Date: 2024-05-07 15:19:07
-->
<template>
<div class="fee-statistic">
<a-collapse>
<a-collapse-panel>
<template v-slot:header>
<p>
<span class="title">利润合计</span>
<span class="title">RMB应收: </span>
<span class="count" :class="{ warnText: statisticData.receivableCNY < 0 }">{{ statisticData.receivableCNY }}</span>
<span class="title">RMB应付: </span>
<span class="count" :class="{ warnText: statisticData.payableCNY < 0 }">{{ statisticData.payableCNY }}</span>
<span class="title">RMB利润: </span>
<span class="count" :class="{ warnText: statisticData.profitCNY < 0 }">{{ statisticData.profitCNY }}</span>
<span class="line"></span>
<span class="title">USD应收: </span>
<span class="count" :class="{ warnText: statisticData.receivableUSD < 0 }">{{ statisticData.receivableUSD }}</span>
<span class="title">USD应付: </span>
<span class="count" :class="{ warnText: statisticData.payableUSD < 0 }">{{ statisticData.payableUSD }}</span>
<span class="title">USD利润: </span>
<span class="count" :class="{ warnText: statisticData.profitUSD < 0 }">{{ statisticData.profitUSD }}</span>
<span class="line"></span>
<span class="title">合计应收: </span>
<span class="count" :class="{ warnText: statisticData.receivableTotal < 0 }">{{ statisticData.receivableTotal }}</span>
<span class="title">合计应付: </span>
<span class="count" :class="{ warnText: statisticData.payableTotal < 0 }">{{ statisticData.payableTotal }}</span>
<span class="title">合计利润: </span>
<span class="count" :class="{ warnText: statisticData.profitTotal < 0 }">{{ statisticData.profitTotal }}</span>
<span class="title">利润率: </span>
<span class="count" :class="{ warnText: statisticData.profitUSD < 0 }">{{ statisticData.profitUSD }}%</span>
</p>
</template>
<a-tabs v-model:activeKey="activeKey">
<a-tab-pane key="1" tab="客户合计">
<a-table
:columns="customerColumns"
:data-source="customerData"
:pagination="false"
bordered
/>
</a-tab-pane>
<a-tab-pane key="2" tab="币别合计" force-render>
<a-table
:columns="currencyColumns"
:data-source="currencyData"
:pagination="false"
bordered
/>
</a-tab-pane>
<a-tab-pane key="3" tab="票合计" force-render>
<a-table
:columns="billColumns"
:data-source="billData"
:pagination="false"
bordered
/>
</a-tab-pane>
</a-tabs>
</a-collapse-panel>
</a-collapse>
</div>
</template>
<script lang="ts" setup>
import { onMounted, ref, defineProps, watch } from 'vue'
import { GetStat } from '../api'
const props = defineProps({
// id
id: {
type: Array
}
})
//
const currencyColumns = [
{
title: '总计',
dataIndex: 'currency',
width: 100
},
{
title: '应收不含税',
dataIndex: 'noTaxReceivableTotal',
width: 150
},
{
title: '应收含税',
dataIndex: 'receivableTotal',
width: 150
},
{
title: '应付不含税',
dataIndex: 'noTaxPayableTotal',
width: 150
},
{
title: '应付含税',
dataIndex: 'payableTotal',
width: 150
},
{
title: '利润不含税',
dataIndex: 'noTaxProfitTotal',
width: 150
},
{
title: '利润含税',
dataIndex: 'profitTotal',
width: 150
}
]
//
const customerColumns = [
{
title: '结算对象',
dataIndex: 'customerName',
width: 150
},
{
title: 'RMB应收',
dataIndex: 'receivableCNY',
width: 150
},
{
title: 'RMB应付',
dataIndex: 'payableCNY',
width: 150
},
{
title: 'RMB利润',
dataIndex: 'profitCNY',
width: 150
},
{
title: 'USD应收',
dataIndex: 'receivableUSD',
width: 150
},
{
title: 'USD应付',
dataIndex: 'payableUSD',
width: 150
},
{
title: 'USD利润',
dataIndex: 'profitUSD',
width: 150
},
{
title: '其他币别应收',
dataIndex: 'receivableOther',
width: 150
},
{
title: '其他币别应付',
dataIndex: 'payableOther',
width: 150
},
{
title: '其他币别利润',
dataIndex: 'profitOther',
width: 150
},
{
title: '合计应收',
dataIndex: 'receivableTotal',
width: 150
},
{
title: '合计应付',
dataIndex: 'payableTotal',
width: 150
},
{
title: '合计利润',
dataIndex: 'profitTotal',
width: 150
}
]
//
const billColumns = [
{
title: '描述',
dataIndex: 'billNO',
width: 150
},
{
title: 'RMB应收',
dataIndex: 'receivableCNY',
width: 150
},
{
title: 'RMB应付',
dataIndex: 'payableCNY',
width: 150
},
{
title: 'RMB利润',
dataIndex: 'profitCNY',
width: 150
},
{
title: 'USD应收',
dataIndex: 'receivableUSD',
width: 150
},
{
title: 'USD应付',
dataIndex: 'payableUSD',
width: 150
},
{
title: 'USD利润',
dataIndex: 'profitUSD',
width: 150
},
{
title: '其他币别应收',
dataIndex: 'receivableOther',
width: 150
},
{
title: '其他币别应付',
dataIndex: 'payableOther',
width: 150
},
{
title: '其他币别利润',
dataIndex: 'profitOther',
width: 150
},
{
title: '合计应收',
dataIndex: 'receivableTotal',
width: 150
},
{
title: '合计应付',
dataIndex: 'payableTotal',
width: 150
},
{
title: '合计利润',
dataIndex: 'profitTotal',
width: 150
}
]
//
const statisticData = ref({})
//
const activeKey = ref('1')
//
const currencyData = ref([])
//
const customerData = ref([])
//
const billData = ref([])
const init = (id) => {
console.log(id)
if (id.length) {
const postData = {
id: id[id.length - 1].id,
businessType: id[id.length - 1].businessType
}
GetStat(postData).then(res => {
const { data } = res
statisticData.value = data
currencyData.value = data.byCurrency
customerData.value = data.byCustomer
billData.value = data.byBusiness
})
}
}
watch(
() => props.id,
(id) => {
console.log(id)
init(id)
})
</script>
<style lang="scss">
.fee-statistic {
position: fixed;
bottom: 0;
background: #ffffff;
z-index: 199;
.title {
font-size: 12px;
font-weight: 600;
color: #04408c;
margin-left: 10px;
}
.count {
color: rgb(0, 128, 0);
font-weight: 600;
font-size: 12px;
}
.warnText {
color: red;
}
.line {
display: inline-block;
height: 10px;
width: 2px!important;
background: #04408c;
margin: 0 5px 0 15px;
}
.ant-collapse > .ant-collapse-item > .ant-collapse-header {
padding: 5px 15px;
p {
margin-bottom: 0;
}
}
.ant-collapse-content-box {
padding-top: 0;
}
.ant-table-cell {
padding: 5px 10px!important;
}
.ant-tabs-nav {
margin-bottom: 0;
}
.ant-table-wrapper {
padding-left: 0;
}
.ant-tabs-tab {
padding: 8px;
}
}
</style>

@ -5,29 +5,40 @@
--> -->
<template> <template>
<div class="ds-approve-fee-table"> <div class="ds-approve-fee-table">
<BasicTable <data class="ds-table" :style="{ width: tbWidth + '%' }">
class="ds-fee-child-table" <BasicTable
@register="registerTable" class="ds-fee-child-table"
:scroll="{ 'x': '100%', 'y': fheight + 'px'}" @register="registerTable"
@selection-change="selectHandle" :scroll="{ 'x': '100%', 'y': fheight + 'px'}"
> @selection-change="selectHandle"
<template #toolbar> >
<FeeActionBar <template #toolbar>
:ids="feeIds" <FeeActionBar
:feeStatus="feeStatus" :ids="feeIds"
:profit="profit" :feeStatus="feeStatus"
:data="data" :profit="profit"
@refresh="reload" :data="data"
@checkProfit="checkProfit" @refresh="reload"
></FeeActionBar> @checkProfit="checkProfit"
</template> ></FeeActionBar>
<template v-slot:bodyCell="{ column, record }">
<template v-if="column.dataIndex == 'feeStatusText'">
<span v-if="record.feeStatus != 1" class="ds-green-status"> {{ record.feeStatusText }}</span>
<span v-else class="ds-orange-status"> {{ record.feeStatusText }}</span>
</template> </template>
</template> <template v-slot:bodyCell="{ column, record }">
</BasicTable> <template v-if="column.dataIndex == 'feeStatusText'">
<span v-if="record.feeStatus != 1" class="ds-green-status"> {{ record.feeStatusText }}</span>
<span v-else class="ds-orange-status"> {{ record.feeStatusText }}</span>
</template>
</template>
</BasicTable>
</data>
<data class="ds-form">
<!-- 修改后的新值组件 -->
<AlterNewValue
:selectRow="selectRow"
:style="{ 'height': '100%', 'overflow': 'auto' }"
v-if="tbWidth == 70"
:id="feeIds[feeIds.length - 1]"
/>
</data>
</div> </div>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
@ -36,6 +47,7 @@
import { useMessage } from '/@/hooks/web/useMessage' import { useMessage } from '/@/hooks/web/useMessage'
import { GetFees } from '../api' import { GetFees } from '../api'
import FeeActionBar from './feeActionBar.vue' import FeeActionBar from './feeActionBar.vue'
import AlterNewValue from './AlterNewValue.vue'
import { formatTableData } from '/@/hooks/web/common' import { formatTableData } from '/@/hooks/web/common'
import emitter from '/@/utils/Bus' import emitter from '/@/utils/Bus'
const { notification } = useMessage() const { notification } = useMessage()
@ -68,6 +80,8 @@
return emit('checkProfit') return emit('checkProfit')
} }
const data = ref([]) const data = ref([])
//
const tbWidth = ref(100)
// //
const oldData = ref([]) const oldData = ref([])
const [registerTable, { reload, setTableData, getDataSource, getSelectRows }] = useTable({ const [registerTable, { reload, setTableData, getDataSource, getSelectRows }] = useTable({
@ -370,6 +384,7 @@
const feeIds = ref() const feeIds = ref()
// //
const feeStatus = ref() const feeStatus = ref()
const selectRow = ref()
// //
const selectHandle = (v) => { const selectHandle = (v) => {
let ids = [] let ids = []
@ -384,6 +399,14 @@
} }
feeStatus.value = status feeStatus.value = status
feeIds.value = ids feeIds.value = ids
//
if (status[status.length - 1] == 3) {
//
tbWidth.value = 70
selectRow.value = v.rows[v.rows.length - 1]
} else {
tbWidth.value = 100
}
} }
watch( watch(
() => props.id, () => props.id,
@ -400,7 +423,11 @@
watch( watch(
() => props.feeHeight, () => props.feeHeight,
(v) => { (v) => {
fheight.value = v / 2 - 70 if ( v < 140) {
fheight.value = 0
} else {
fheight.value = v / 2 - 70
}
const tb = document.getElementsByClassName('ds-fee-child-table') const tb = document.getElementsByClassName('ds-fee-child-table')
for (let i = 0; i < tb.length; i++) { for (let i = 0; i < tb.length; i++) {
const child = tb[i].getElementsByClassName('ant-table-body') const child = tb[i].getElementsByClassName('ant-table-body')
@ -423,6 +450,11 @@
<style lang="less"> <style lang="less">
.ds-approve-fee-table { .ds-approve-fee-table {
display: flex;
flex-direction: row;
.ds-form {
flex: 1;
}
.ant-table-body { .ant-table-body {
min-height: 162px; min-height: 162px;
} }

@ -65,6 +65,7 @@
@checkProfit="checkProfit" @checkProfit="checkProfit"
></FeeTable> ></FeeTable>
</div> </div>
<Statistic v-show="busId.length" :id="busId"></Statistic>
</div> </div>
</a-spin> </a-spin>
</template> </template>
@ -76,6 +77,7 @@
import { columns, searchFormSchema } from './columns' import { columns, searchFormSchema } from './columns'
import { useMessage } from '/@/hooks/web/useMessage' import { useMessage } from '/@/hooks/web/useMessage'
import FeeTable from './components/feeTable.vue' import FeeTable from './components/feeTable.vue'
import Statistic from './components/Statistic.vue'
import MainActionBar from './components/mainActionBar.vue' import MainActionBar from './components/mainActionBar.vue'
import { formatTableData } from '/@/hooks/web/common' import { formatTableData } from '/@/hooks/web/common'
const { notification } = useMessage() const { notification } = useMessage()
@ -393,7 +395,6 @@
} }
.main-tb { .main-tb {
flex: 1; flex: 1;
background: #ffffff;
padding-bottom: 0!important; padding-bottom: 0!important;
} }
.vben-basic-table-header__toolbar { .vben-basic-table-header__toolbar {

@ -0,0 +1,37 @@
/*
* @Description: ->
* @Author: lijj
* @Date: 2024-04-25 15:48:33
*/
import { request } from '/@/utils/request'
import { DataResult, PageRequest } from '/@/api/model/baseModel'
enum Api {
list = '/feeApi/PaymentApplication/GetList',
edit = '/feeApi/FeeCurrency/EditFeeCurrency',
info = '/feeApi/FeeCurrency/GetFeeCurrencyInfo'
}
// 列表 (Auth)
export function GetList(data: PageRequest) {
return request<DataResult>({
url: Api.list,
method: 'post',
data
})
}
// 编辑 (Auth)
export function editFeeCurrency(data: PageRequest) {
return request<DataResult>({
url: Api.edit,
method: 'post',
data
})
}
// 详情 (Auth)
export function getFeeCurrencyInfo(query) {
return request<DataResult>({
url: Api.info,
method: 'get',
params: query
})
}

@ -0,0 +1,306 @@
/*
* @Description: tsx
* @Author: lijj
* @Date: 2024-04-25 15:48:33
*/
import { ref } from 'vue'
import { BasicColumn, FormSchema } from '/@/components/Table'
import { getOptions } from '/@/hooks/dict'
import { getDictOption } from '/@/utils/dictUtil'
import { useOptionsStore } from '/@/store/modules/options'
const optionsStore = useOptionsStore()
// 申请单状态
const ApplyBillStatus = ref([])
getDictOption('apply_bill_status').then((res) => {
ApplyBillStatus.value = res
})
// 结算对象下拉数据
import { GetClientListByCode } from '/@/api/common'
// 人员下拉
import { getList } from '/@/views/flowcenter/flowInstances/api'
// 费用状态
export const FeeStatus = [ '审核通过' ,'录入状态', '提交审核', '申请修改 ', '申请删除', '撤销申请', '驳回提交', '驳回申请, 部分结算, 结算完毕']
export const columns: BasicColumn[] = [
{
title: '申请单号',
dataIndex: 'applicationNO',
width: 150,
align: 'left'
},
{
title: '状态',
dataIndex: 'status',
width: 100,
align: 'left'
},
{
title: '结算单位',
dataIndex: 'customerName',
width: 150,
align: 'left'
},
{
title: '币别',
dataIndex: 'currency',
width: 80,
align: 'left'
},
{
title: 'RMB',
dataIndex: 'amountRMB',
width: 100,
align: 'left'
},
{
title: 'USD',
dataIndex: 'amountUSD',
width: 100,
align: 'left'
},
{
title: '其他币别',
dataIndex: 'amountOther',
width: 100,
align: 'left'
},
// {
// title: '结算RMB',
// dataIndex: 'financeSoftCode',
// width: 200
// },
// {
// title: '结算USD',
// dataIndex: 'financeSoftCode',
// width: 200
// },
// {
// title: '结算其他币别',
// dataIndex: 'financeSoftCode',
// width: 200
// },
{
title: '申请日期',
dataIndex: 'createTime',
width: 120,
align: 'left'
},
{
title: '申请人',
dataIndex: 'createByName',
width: 120
},
{
title: '申请支付日期',
dataIndex: 'financeSoftCode',
width: 200
},
{
title: '最后审核日期',
dataIndex: 'auditTime',
width: 120
},
{
title: '最后审核人',
dataIndex: 'auditerName',
width: 120
},
{
title: '结算对象银行',
dataIndex: 'customerBank',
width: 150
},
{
title: '结算对象账户',
dataIndex: 'customerBAN',
width: 140
},
{
title: '备注',
dataIndex: 'note',
width: 150
},
// {
// title: '已开发票',
// dataIndex: 'financeSoftCode',
// width: 200
// },
// {
// title: '发票备注',
// dataIndex: 'financeSoftCode',
// width: 200
// },
// {
// title: '预计结算RMBRMB',
// dataIndex: 'financeSoftCode',
// width: 200
// },
// {
// title: '预计结算RMBUSD',
// dataIndex: 'financeSoftCode',
// width: 200
// },
// {
// title: '预计结算其他',
// dataIndex: 'financeSoftCode',
// width: 200
// },
// {
// title: '未申请',
// dataIndex: 'financeSoftCode',
// width: 200
// },
// {
// title: '未申请USD',
// dataIndex: 'financeSoftCode',
// width: 200
// },
// {
// title: '未申请其他',
// dataIndex: 'financeSoftCode',
// width: 200
// },
{
title: '委托单位',
dataIndex: 'client',
width: 120
},
////////////////////
{
title: '申请方式',
dataIndex: 'financeSoftCode',
width: 200
},
{
title: '已打印',
dataIndex: 'financeSoftCode',
width: 200
},
{
title: '入账申请编号',
dataIndex: 'financeSoftCode',
width: 200
},
{
title: '驳回原因',
dataIndex: 'financeSoftCode',
width: 200
},
{
title: '结算方式',
dataIndex: 'financeSoftCode',
width: 200
},
{
title: '申请部门',
dataIndex: 'financeSoftCode',
width: 200
},
{
title: '打印次数',
dataIndex: 'financeSoftCode',
width: 200
},
{
title: '所属分部',
dataIndex: 'financeSoftCode',
width: 200
},
{
title: '发票日期',
dataIndex: 'financeSoftCode',
width: 200
},
{
title: '发票金额',
dataIndex: 'financeSoftCode',
width: 200
},
{
title: '收到发票',
dataIndex: 'financeSoftCode',
width: 200
}
]
export const searchFormSchema: FormSchema[] = [
{
field: 'billNO',
label: '业务编号',
component: 'Input',
colProps: { span: 4 },
},
{
field: 'applicationNO',
label: '申请单编号',
component: 'Input',
colProps: { span: 4 },
},
{
field: 'customerId',
label: '结算单位',
component: 'ApiSelect',
colProps: { span: 4 },
componentProps: () => {
return {
api: GetClientListByCode,
labelField: 'shortName',
valueField: 'id',
resultField: 'data',
immediate: false,
filterOption: (input: string, option: any) => {
return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0
}
}
}
},
{
field: 'billStatus',
label: '申请单状态',
component: 'Select',
colProps: { span: 4 },
componentProps: {
options: ApplyBillStatus,
allowClear: true,
showSearch: true,
filterOption: (input: string, option: any) => {
return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0
}
},
},
{
field: 'applicationNO',
label: '发票备注',
component: 'Input',
colProps: { span: 4 }
},
{
field: 'createTime',
label: '费用申请日期',
component: 'RangePicker',
required: false,
dynamicDisabled: false,
colProps: { span: 4 },
componentProps: {
allowClear: true
}
},
{
field: 'createBy',
label: '申请人',
component: 'ApiSelect',
colProps: { span: 4 },
componentProps: () => {
return {
api: getList,
labelField: 'label',
valueField: 'value',
immediate: false,
resultField: 'data',
filterOption: (input: string, option: any) => {
return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0
}
}
}
},
]

@ -0,0 +1,208 @@
<!--
* @Description: 付费申请操作栏
* @Author: lijj
* @Date: 2024-04-29 11:54:04
-->
<template>
<div class="ds-table-action-bar">
<div class="nav" @click="addBooking">
<i class="iconfont icon-jiahao2fill"></i>新建
</div>
<div class="nav">
<i class="iconfont icon-jiahao2fill"></i>入账申请加入
</div>
<div class="nav"
><i class="iconfont icon-fuzhi"></i>提交审核</div
>
<div class="nav"
><i class="iconfont icon-fuzhi1"></i>撤销提交</div
>
<a-popconfirm
title="确定删除当前选中订舱?"
ok-text="是"
cancel-text="否"
@confirm="removeMoreFun"
>
<div class="nav"><i class="iconfont icon-shanchu2"></i>删除</div>
</a-popconfirm>
<div class="nav"><i class="iconfont icon-xiaopiaodayin"></i>打印</div>
<div class="nav">
<i class="iconfont icon-shishijifei"></i>导出Excel
</div>
</div>
</template>
<script lang="ts" setup>
import { onMounted, ref, defineProps, reactive } from 'vue'
import { useGo } from '/@/hooks/web/usePage'
import { useMessage } from '/@/hooks/web/useMessage'
import { useRouter } from 'vue-router'
import { useModal } from '/@/components/Modal'
const router = useRouter()
const { createMessage } = useMessage()
const go = useGo()
const props = defineProps({
selectRow: {
type: Function
},
reload: {
type: Function
}
})
//
function addBooking() {
const addNum = Math.round(Math.random() * 1000)
go(`/BookingDetail?addNum=${addNum}`)
}
//
function copyBooking() {
const select = props.selectRow()
const pkIdArr = select.map((item, index) => {
return item.id
})
if (pkIdArr.length === 0 || pkIdArr.length > 1) {
createMessage.warning('请仅选择一条数据!')
return false
}
go(`/BookingDetail?id=${pkIdArr[0]}&isCopy=${true}`)
}
const copyMoreFlag = ref(false)
const copyMoreForm = reactive({
number: 1,
})
//
function removeMoreFun() {
const select = props.selectRow()
if (select.length === 0) {
createMessage.warning('请选择操作订单!')
return false
}
const removeArr = select.map((item) => {
return item.id
})
}
</script>
<style lang="scss">
.ds-table-action-bar {
padding: 0 10px;
.nav {
display: inline-block;
margin-right: 8px;
cursor: pointer;
border: 1px solid rgba(255, 255, 255, 0);
padding: 0 10px;
height: 28px;
line-height: 26px;
color: #000;
.iconfont {
margin-right: 6px;
}
&:hover {
border: 1px solid rgba(255, 255, 255, 0);
border-radius: 4px;
}
&:nth-of-type(1) {
.iconfont {
color: #1d8aff;
}
&:hover {
background: #fff;
box-shadow: 0 0 10px #eee;
}
}
&:nth-of-type(2) {
.iconfont {
color: #865ef8;
}
&:hover {
background: #fff;
box-shadow: 0 0 10px #eee;
}
}
&:nth-of-type(3) {
.iconfont {
color: #ff9702;
}
&:hover {
background: #fff;
box-shadow: 0 0 10px #eee;
}
}
&:nth-of-type(4) {
.iconfont {
color: #1d8aff;
}
&:hover {
background: #fff;
box-shadow: 0 0 10px #eee;
}
}
&:nth-of-type(5) {
.iconfont {
color: #ff1062;
}
&:hover {
background: #fff;
box-shadow: 0 0 10px #eee;
}
}
&:nth-of-type(6) {
.iconfont {
color: #1ebeca;
}
&:hover {
background: #fff;
box-shadow: 0 0 10px #eee;
}
}
&:nth-of-type(7) {
.iconfont {
color: #82c93d;
}
&:hover {
background: #fff;
box-shadow: 0 0 10px #eee;
}
}
&:nth-of-type(8) {
.iconfont {
color: #1d8aff;
}
&:hover {
background: #fff;
box-shadow: 0 0 10px #eee;
}
}
&:nth-of-type(9) {
.iconfont {
color: #f6826b;
}
&:hover {
background: #fff;
box-shadow: 0 0 10px #eee;
}
}
}
}
</style>

@ -0,0 +1,111 @@
<!--
* @Description: 操作管理 -> 付费申请
* @Author: lijj
* @Date: 2024-06-20 11:54:04
-->
<template>
<div class="ds-pay-apply">
<BasicTable @register="registerTable">
<template #toolbar>
<TableActionBar :selectRow="getSelectRows" :reload="reload"></TableActionBar>
</template>
<template v-slot:bodyCell="{ column, record }">
<!-- 复制单号 -->
<template v-if="column.dataIndex == 'applicationNO'">
<span @click="copyNo($event, record.applicationNO)" style="cursor: pointer"><span class="iconfont icon-fuzhi" :style="{'fontSize': '12px', 'color': '#419638'}"></span> <span class="ds-green-status">{{ record.applicationNO }}</span></span>
</template>
<!-- 状态 -->
<template v-if="column.dataIndex == 'status'">
<span v-if="record.status == 0" class="ds-green-status"> {{ FeeStatus[record.status] }}</span>
<span v-else-if="record.status == 1" class="ds-blue-status"> {{ FeeStatus[record.status] }}</span>
<span v-else-if="/^2|3|4|5|6$/.test(record.status)" class="ds-orange-status"> {{ FeeStatus[record.status] }}</span>
<span v-else-if="/^7|8$/.test(record.status)" class="ds-red-status"> {{ FeeStatus[record.status] }}</span>
<span v-else class="ds-purple-status"> {{ FeeStatus[record.status] }}</span>
</template>
</template>
</BasicTable>
</div>
</template>
<script lang="ts" setup>
import { onMounted, ref } from 'vue'
import { BasicTable, useTable } from '/@/components/Table'
import TableActionBar from './components/tableActionBar.vue'
import { useMessage } from '/@/hooks/web/useMessage'
const { createMessage } = useMessage()
import { GetList } from './api'
import { columns, searchFormSchema, FeeStatus } from './columns'
const [registerTable, { reload, getForm, getPaginationRef, getSelectRows }] = useTable({
title: '',
api: async (p) => {
const res = await GetList(p)
return new Promise((resolve) => {
resolve({ data: [...res.data], total: res.count })
})
},
beforeFetch: () => {
var currentPageInfo: any = getPaginationRef()
var data = getForm().getFieldsValue()
const postParam = {
queryCondition: '',
pageCondition: {
pageIndex: currentPageInfo.current,
pageSize: currentPageInfo.pageSize,
sortConditions: [],
},
}
let condition: API.ConditionItem[] = []
if (!!data.UserName) {
condition.push({
FieldName: 'UserName',
FieldValue: data.UserName,
ConditionalType: 1,
})
}
if (!!data.UserCode) {
condition.push({
FieldName: 'UserCode',
FieldValue: data.UserCode,
ConditionalType: 1,
})
}
postParam.queryCondition = JSON.stringify(condition)
// console.log(postParam);
return postParam
},
columns,
formConfig: {
labelWidth: 120,
schemas: searchFormSchema,
},
isTreeTable: false,
pagination: true,
striped: false,
useSearchForm: true,
showTableSetting: true,
bordered: true,
showIndexColumn: true,
canResize: false,
rowSelection: { type: 'checkbox' },
immediate: false
})
const copyNo = (e, v) => {
e.stopPropagation()
navigator.clipboard.writeText(v)
createMessage.success("复制成功")
}
onMounted(() => {
//
reload()
})
function handleSuccess() {
reload()
}
</script>
<style lang="less">
.ds-pay-apply {
.vben-basic-table-header__toolbar {
justify-content: space-between;
}
}
</style>

@ -71,7 +71,7 @@
></mastetMore> ></mastetMore>
</a-tab-pane> </a-tab-pane>
<a-tab-pane key="5-5" tab="应收应付费用" v-if="$route.query.id"> <a-tab-pane key="5-5" tab="应收应付费用" v-if="$route.query.id">
<costEntry :details="bookingDetails"></costEntry> <costEntry :details="bookingDetails" type="1"></costEntry>
</a-tab-pane> </a-tab-pane>
</a-tabs> </a-tabs>
</a-spin> </a-spin>
@ -247,7 +247,7 @@
// } // }
// let { ctx: that, proxy }: any = getCurrentInstance() // let { ctx: that, proxy }: any = getCurrentInstance()
// loading // loading
const loading = ref(true) const loading = ref(false)
const id = ref(route.query.id) const id = ref(route.query.id)
const isCopy = ref(route.query.isCopy || false) const isCopy = ref(route.query.isCopy || false)
const Showtabs = ref(false) const Showtabs = ref(false)

@ -2380,9 +2380,9 @@
} }
function editColumns(row) { function editColumns(row) {
if (row.mblno) { if (row.mblno) {
go(`/BookingDetail?id=${row.id}&type=${row.carrierid}&mblno=${row.mblno}`) go(`/BookingDetail?id=${row.id}&mblno=${row.mblno}`)
} else { } else {
go(`/BookingDetail?id=${row.id}&type=${row.carrierid}&customerNo=${row.customerNo}`) go(`/BookingDetail?id=${row.id}&customerNo=${row.customerNo}`)
} }
} }
function customSortMethod() {} function customSortMethod() {}

@ -151,7 +151,7 @@
import ConditionFilter from '/@/components/Condition/index.vue' import ConditionFilter from '/@/components/Condition/index.vue'
import { onMounted, ref } from 'vue' import { onMounted, ref } from 'vue'
import { BasicTable, useTable } from '/@/components/Table' import { BasicTable, useTable } from '/@/components/Table'
import { PageDataByBooking, UpdateUserQuerySet } from './api/BookingLedger.js' import { PageDataByBooking, UpdateUserQuerySet, GetUserQuerySet } from './api/BookingLedger.js'
import { getColumnsByClient } from '/@/views/baseinfo/formcopy/api' import { getColumnsByClient } from '/@/views/baseinfo/formcopy/api'
import { useModal } from '/@/components/Modal' import { useModal } from '/@/components/Modal'
import { columns, searchFormSchema, FeeStatus } from './columns' import { columns, searchFormSchema, FeeStatus } from './columns'
@ -162,8 +162,8 @@
import { Field } from '/@/components/Render/interface' import { Field } from '/@/components/Render/interface'
import { useOptionsStore } from '/@/store/modules/options' import { useOptionsStore } from '/@/store/modules/options'
const optionsStore = useOptionsStore() const optionsStore = useOptionsStore()
// import { usePermissionStore } from '/@/store/modules/permission' import { usePermissionStore } from '/@/store/modules/permission'
// import initData from './modules/initData.js' import initData from './modules/initData.js'
import { useRouter, useRoute } from 'vue-router' import { useRouter, useRoute } from 'vue-router'
const router = useRouter() const router = useRouter()
const { notification } = useMessage() const { notification } = useMessage()
@ -352,9 +352,9 @@
}) })
function editColumns(row) { function editColumns(row) {
if (row.mblno) { if (row.mblno) {
go(`/BookingDetail?id=${row.id}&type=${row.carrierid}&mblno=${row.mblno}`) go(`/BookingDetail?id=${row.id}&mblno=${row.mblno}`)
} else { } else {
go(`/BookingDetail?id=${row.id}&type=${row.carrierid}&customerNo=${row.customerNo}`) go(`/BookingDetail?id=${row.id}&customerNo=${row.customerNo}`)
} }
} }
function FnCopy(data) { function FnCopy(data) {
@ -476,12 +476,65 @@
reload() reload()
} }
} }
async function createdInit() {
showColumns.value = JSON.parse(JSON.stringify(initData.columns))
formAllData.value = JSON.parse(JSON.stringify(initData.condAllData))
fromTableAllData.value = JSON.parse(JSON.stringify(initData.columnsAllData))
tableHeight.value = document.body.clientHeight - 230
const res: API.DataResult = await getColumnsByClient({
tableViewName: 'op_sea_export',
})
const fullPath = ref(router.currentRoute.value.fullPath)
usePermissionStore().getWrouteList.forEach((item: Record<any, any>) => {
item.children[0].children?.forEach((item2: Record<any, any>) => {
if (fullPath.value.indexOf(item2.path) != -1) {
permissionId.value = item2.id
}
})
})
if (res.succeeded) {
console.log(res)
let data: any[] = []
res.data.forEach((item) => {
data.push({
id: item.dbColumnName,
title: item.columnDescription,
name: 'Select',
value: null,
props: {
disabled: false,
multiple: false,
// placeholder: '',
options: [],
},
style: {
width: '100%',
},
})
})
fields.value = data
}
FnGetUserQuerySet()
// getConfigUser(true)
}
async function FnGetUserQuerySet() {
const res: API.DataResult = await GetUserQuerySet({
permissionId: permissionId.value,
})
if (res.succeeded) {
console.log(res)
AdvancedQueryData.value = JSON.parse(res.data.content)
}
}
function handledbclick(record, index, event) { function handledbclick(record, index, event) {
editColumns(record) editColumns(record)
} }
onMounted(() => { onMounted(() => {
// //
reload() reload()
createdInit()
}) })
</script> </script>

Loading…
Cancel
Save