Bladeren bron

运费结算

fanzherong_v 2 weken geleden
bovenliggende
commit
86c5803c40
27 gewijzigde bestanden met toevoegingen van 2007 en 16 verwijderingen
  1. 32 0
      snowy-admin-web/src/api/biz/bizAuditLogApi.js
  2. 24 0
      snowy-admin-web/src/api/biz/bizSettleApi.js
  3. 304 0
      snowy-admin-web/src/views/biz/bizsettle/detail.vue
  4. 191 4
      snowy-admin-web/src/views/biz/bizsettle/index.vue
  5. 66 0
      snowy-admin-web/src/views/biz/bizsettle/reviewadmin.vue
  6. 66 0
      snowy-admin-web/src/views/biz/bizsettle/reviewfinance.vue
  7. 159 0
      snowy-admin-web/src/views/biz/bizsettle/uploadFile.vue
  8. 195 0
      snowy-admin-web/src/views/biz/bizsettle/uploadVoucher.vue
  9. 131 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizauditlog/controller/BizAuditLogController.java
  10. 55 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizauditlog/entity/BizAuditLog.java
  11. 34 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizauditlog/enums/BizAuditLogEnum.java
  12. 25 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizauditlog/mapper/BizAuditLogMapper.java
  13. 5 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizauditlog/mapper/mapping/BizAuditLogMapper.xml
  14. 50 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizauditlog/param/BizAuditLogAddParam.java
  15. 55 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizauditlog/param/BizAuditLogEditParam.java
  16. 35 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizauditlog/param/BizAuditLogIdParam.java
  17. 55 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizauditlog/param/BizAuditLogPageParam.java
  18. 85 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizauditlog/service/BizAuditLogService.java
  19. 108 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizauditlog/service/impl/BizAuditLogServiceImpl.java
  20. 86 4
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsettle/controller/BizSettleController.java
  21. 23 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsettle/entity/BizSettle.java
  22. 4 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsettle/param/BizSettleAddParam.java
  23. 17 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsettle/param/BizSettleAuditParam.java
  24. 4 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsettle/param/BizSettleEditParam.java
  25. 12 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsettle/param/BizSettlePageParam.java
  26. 31 4
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsettle/service/BizSettleService.java
  27. 155 4
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsettle/service/impl/BizSettleServiceImpl.java

+ 32 - 0
snowy-admin-web/src/api/biz/bizAuditLogApi.js

@@ -0,0 +1,32 @@
+import { baseRequest } from '@/utils/request'
+
+const request = (url, ...arg) => baseRequest(`/biz/bizauditlog/` + url, ...arg)
+
+/**
+ * 审核记录表Api接口管理器
+ *
+ * @author fanzherong
+ * @date  2025/06/16 14:57
+ **/
+export default {
+	// 获取审核记录表分页
+	bizAuditLogPage(data) {
+		return request('page', data, 'get')
+	},
+	// 提交审核记录表表单 edit为true时为编辑,默认为新增
+	bizAuditLogSubmitForm(data, edit = false) {
+		return request(edit ? 'edit' : 'add', data)
+	},
+	// 删除审核记录表
+	bizAuditLogDelete(data) {
+		return request('delete', data)
+	},
+	// 获取审核记录表详情
+	bizAuditLogDetail(data) {
+		return request('detail', data, 'get')
+	},
+	//获取审核记录列表
+	getList(data){
+		return request('getList',data,'get')
+	}
+}

+ 24 - 0
snowy-admin-web/src/api/biz/bizSettleApi.js

@@ -28,5 +28,29 @@ export default {
 	// 编辑获取明细
 	detailOrder(data){
 		return request('detailOrder',data,'get')
+	},
+	// 提交数据
+	submit(data){
+		return request('submit',data)
+	},
+	//管理员审批
+	auditAdmin(data){
+		return request('auditAdmin',data)
+	},
+	//财务审批
+	auditFinance(data){
+		return request('auditFinance',data)
+	},
+	//上传发票
+	uploadInvoice(data){
+		return request('uploadInvoice',data)
+	},
+	//上传结款凭证
+	uploadVoucher(data){
+		return request('uploadVoucher',data)
+	},
+	//打款审核驳回
+	auditReject(data){
+		return request('auditReject',data)
 	}
 }

+ 304 - 0
snowy-admin-web/src/views/biz/bizsettle/detail.vue

@@ -0,0 +1,304 @@
+<template>
+	<xn-form-container title="详情" :width="1100" :visible="visible" :destroy-on-close="true" @close="onClose">
+		<a-form ref="formRef" :model="formData" :label-col="labelCol4" :wrapper-col="wrapperCol20">
+			<a-divider dashed style="border-color: gray">结算单</a-divider>
+			<a-descriptions :column="4" size="middle" bordered class="mb-2" :label-style="labelStyle" :contentStyle="contentStyle">
+				<a-descriptions-item label="结算单号" :span="2">{{ formData.settleNo }}</a-descriptions-item>
+				<a-descriptions-item label="订单类型" :span="2">
+					<a-tag
+						:color="
+							formData.settleType === '1'
+								? 'orange'
+								: formData.settleType === '2'
+								  ? 'green'
+								  : 'purple'
+						"
+					>
+						{{ $TOOL.dictTypeData('settle_type', formData.settleType) }}
+					</a-tag>
+				</a-descriptions-item>
+				<a-descriptions-item label="结算金额(元)" :span="2">{{ formData.settleAccount }}</a-descriptions-item>
+				<a-descriptions-item label="状态" :span="2">
+					<a-tag
+						:color="
+							formData.settleStatus === '1'
+								? 'red'
+								: formData.settleStatus === '2'
+								  ? 'green'
+								 : formData.settleStatus === '3'
+								  ? '#f50'
+								  : formData.settleStatus === '4'
+								  ? 'processing'
+								  : formData.settleStatus === '5'
+								  ? 'processing'
+								  : formData.settleStatus === '6'
+								  ? 'cyan'
+								  : 'purple'
+						"
+					>
+						{{ $TOOL.dictTypeData('settle_status', formData.settleStatus) }}
+					</a-tag>
+				</a-descriptions-item>
+
+				<a-descriptions-item label="发票信息" :span="4">
+					<p v-for="(item, index) in fileUploadInvoice" :key="index">
+						<a @click="downloadMaterial(item.url)" target="_blank">{{ item.name }}</a>
+					</p>
+				</a-descriptions-item>
+				<a-descriptions-item label="结算凭证" :span="4">
+					<p v-for="(item, index) in fileUploadVoucher" :key="index">
+						<a @click="downloadMaterial(item.url)" target="_blank">{{ item.name }}</a>
+					</p>
+				</a-descriptions-item>
+			</a-descriptions>
+
+			<a-divider dashed style="border-color: gray">结算明细</a-divider>
+
+			<table class="table">
+				<tr>
+					<td>订单编号</td>
+					<td>客户名称</td>
+					<td>货品名称</td>
+					<td>货品编码</td>
+					<td>供应商名称</td>
+					<td>订单重量</td>
+					<td>实际托运重量</td>
+					<td>运费单价</td>
+					<td>操作</td>
+				</tr>
+				<tr v-for="(order, index) in formData.orderList">
+					<td>
+						<a-tooltip :title="order.orderNumber">
+							{{ order.orderNumber }}
+						</a-tooltip>
+					</td>
+					<td>
+						<a-tooltip :title="order.customerName">
+							{{ order.customerName }}
+						</a-tooltip>
+					</td>
+					<td>
+						<a-tooltip :title="order.goodsName">
+							{{ order.goodsName }}
+						</a-tooltip>
+					</td>
+					<td>
+						<a-tooltip :title="order.goodsCode">
+							{{ order.goodsCode }}
+						</a-tooltip>
+					</td>
+					<td>
+						<a-tooltip :title="order.supplierName">
+							{{ order.supplierName }}
+						</a-tooltip>
+					</td>
+					<td>
+						<a-tooltip :title="order.orderWeight">
+							{{ order.orderWeight }}
+						</a-tooltip>
+					</td>
+					<td>
+						<a-tooltip :title="order.orderWeight">
+							{{ order.orderType == '1'? order.shippingWeight:order.netWeight }}
+						</a-tooltip>
+					</td>
+					<td>
+						<a-tooltip :title="order.freightPrice">
+							{{ order.freightPrice }}
+						</a-tooltip>
+					</td>
+					<td>
+						<a-button
+							danger
+							size="small"
+							type="link"
+							@click="deleteCount(index)"
+
+						>
+							<delete-outlined />
+						</a-button>
+					</td>
+				</tr>
+<!--				<tr v-if="formData.orderList.length>0">
+					<th colspan="1">合计</th>
+					<td colspan="8">
+						{{amountTotal}}
+					</td>
+				</tr>-->
+			</table>
+
+			<a-divider dashed style="border-color: gray" v-if="auditDataSource.length > 0">审核记录</a-divider>
+			<a-table
+				:dataSource="auditDataSource"
+				:columns="auditDataColumns"
+				:pagination="false"
+				:bordered="true"
+				v-if="auditDataSource.length > 0"
+			>
+				<template #bodyCell="{ column, record }">
+					<template v-if="column.dataIndex === 'status'">
+						<a-tag :color="record.status === '1' ? 'green' : 'red'">{{
+								$TOOL.dictTypeData('examine_status', record.status)
+							}}</a-tag>
+					</template>
+				</template>
+			</a-table>
+		</a-form>
+	</xn-form-container>
+</template>
+
+<script setup name="recordDoubleForm">
+	import { cloneDeep } from 'lodash-es'
+	import bizSettleApi from "@/api/biz/bizSettleApi";
+	import sysConfig from "@/config";
+	import bizAuditLogApi from "@/api/biz/bizAuditLogApi";
+
+
+	const auditDataSource = ref([])
+
+	// 默认是关闭状态
+	const visible = ref(false)
+	const formData = ref({})
+	const table = ref()
+	const resultJson = ref()
+
+	const labelStyle = {
+		width: '20%'
+	}
+	const contentStyle = {
+		width: '30%'
+	}
+
+	const labelCol4 = ref({span: 4, style: 'width: 26%; line-height: 20px; white-space: normal',})
+	const labelCol8 = ref({span: 8, style: 'width: 26%; line-height: 20px; white-space: normal',})
+	const wrapperCol20 = ref({span: 20})
+
+	const fileUploadInvoice = ref([])
+	const fileUploadVoucher = ref([])
+
+	// 打开抽屉
+	const onOpen = (record) => {
+		visible.value = true
+		//getRecordDoubleDetail(record)
+		if(record){
+			/*let recordData = cloneDeep(record)
+			formData.value = Object.assign({}, recordData)*/
+			bizSettleApi.detailOrder({id:record.id}).then((res)=>{
+				formData.value = res
+
+				if (formData.value.fileInvoicePath) {
+					for (var i = 0; i < formData.value.fileInvoicePath.split(',').length; i++) {
+						fileUploadInvoice.value.push({
+							url: sysConfig.PREVIEW_PATH + formData.value.fileInvoicePath.split(',')[i],
+							name: formData.value.fileInvoiceName.split(',')[i]
+						})
+					}
+				}
+
+				if (formData.value.fileVoucherPath) {
+					for (var i = 0; i < formData.value.fileVoucherPath.split(',').length; i++) {
+						fileUploadVoucher.value.push({
+							url: sysConfig.PREVIEW_PATH + formData.value.fileVoucherPath.split(',')[i],
+							name: formData.value.fileVoucherName.split(',')[i]
+						})
+					}
+
+				}
+
+
+				// 获取审核记录
+				bizAuditLogApi.getList({ type: 'YFJS', dataId: formData.value.id }).then((res) => {
+					auditDataSource.value = res
+				})
+			})
+		}
+
+	}
+	const getRecordDoubleDetail = (record) => {
+		const param = {
+			id: record.id
+		}
+		tbRecordDoubleApi.recordDoubleDetailPic(param).then((data) => {
+			Object.assign(record, data)
+			formData.value = record
+		})
+	}
+
+	const downloadMaterial = (url) => {
+		window.open( url)
+		/*console.log('previewFile:' + JSON.stringify(file))
+		const viewFile = cloneDeep(file)
+		var imgList = []
+		for (let i = 0; i < fileUploadInvoice.value.length; i++) {
+			var img = {}
+			img.url = fileUploadInvoice.value[i].url
+			img.name = fileUploadInvoice.value[i].name
+			imgList.push(img)
+		}
+		commFilePreviewRef.value.previewFileCommon(viewFile, imgList)*/
+	}
+
+
+	const auditDataColumns = [
+		{
+			title: '审核时间',
+			dataIndex: 'createTime',
+			width: 200,
+			align: 'center'
+		},
+		{
+			title: '审核人',
+			dataIndex: 'createUserName',
+			width: 150,
+			align: 'center'
+		},
+		{
+			title: '状态',
+			dataIndex: 'status',
+			width: 200,
+			align: 'center'
+		},
+		{
+			title: '审核意见',
+			dataIndex: 'remark',
+			align: 'center'
+		}
+	]
+
+	// 关闭抽屉
+	const onClose = () => {
+		resultJson.value = ''
+		visible.value = false
+		fileUploadInvoice.value = []
+		fileUploadVoucher.value = []
+	}
+	// 调用这个函数将子组件的一些数据和方法暴露出去
+	defineExpose({
+		onOpen
+	})
+</script>
+
+<style scoped>
+	.imgDiv ::v-deep .ant-image {
+		margin-left: 20px;
+		margin-top: 10px;
+	}
+	.imgDiv ::v-deep .ant-image-mask-info {
+		margin-left: 20px;
+		margin-top: 10px;
+	}
+
+	table {
+		margin-top: 10px;
+		text-align: center;
+		width: 100%;
+	}
+
+	table td {
+		border: 1px solid #f0f2f5;
+		padding: 10px 0;
+	}
+	tr:hover {
+		background-color: #f5f5f5;
+	}
+</style>

+ 191 - 4
snowy-admin-web/src/views/biz/bizsettle/index.vue

@@ -1,4 +1,48 @@
 <template>
+	<a-card :bordered="false" style="margin-bottom: 10px" class="mb-2">
+		<a-form ref="searchFormRef" name="advanced_search" :model="searchFormState" class="ant-advanced-search-form">
+			<a-row :gutter="24">
+				<a-col :span="6">
+					<a-form-item label="结算单号" name="settleNo">
+						<a-input v-model:value="searchFormState.settleNo" placeholder="结算单号查询" />
+					</a-form-item>
+				</a-col>
+				<a-col :span="6">
+					<a-form-item label="结算类型" name="settleType">
+						<a-select v-model:value="searchFormState.settleType" placeholder="结算类型查询"
+								  :options="settleTypeList"
+						> </a-select>
+					</a-form-item>
+				</a-col>
+				<a-col :span="6">
+					<a-form-item label="创建时间" name="createTime">
+						<a-range-picker
+							v-model:value="searchFormState.createTime"
+							value-format="YYYY-MM-DD"
+						/>
+					</a-form-item>
+				</a-col>
+				<template v-if="advanced">
+
+					<a-col :span="6">
+						<a-form-item label="状态" name="settleStatus">
+							<a-select v-model:value="searchFormState.settleStatus" placeholder="状态查询"
+									  :options="settleStatusList"
+							> </a-select>
+						</a-form-item>
+					</a-col>
+				</template>
+				<a-col :span="6">
+					<a-button type="primary" @click="tableRef.refresh()">查询</a-button>
+					<a-button style="margin: 0 8px" @click="reset">重置</a-button>
+					<a @click="toggleAdvanced" style="margin-left: 8px">
+						{{ advanced ? '收起' : '展开' }}
+						<component :is="advanced ? 'up-outlined' : 'down-outlined'" />
+					</a>
+				</a-col>
+			</a-row>
+		</a-form>
+	</a-card>
 	<a-card :bordered="false">
 		<s-table
 			ref="tableRef"
@@ -16,17 +60,94 @@
 				</a-space>
 			</template>
 			<template #bodyCell="{ column, record }">
+				<template v-if="column.dataIndex === 'settleType'">
+					<a-tag
+						:color="
+							record.settleType === '1'
+								? 'orange'
+								: record.settleType === '2'
+								  ? 'green'
+								  : 'purple'
+						"
+					>
+						{{ $TOOL.dictTypeData('settle_type', record.settleType) }}
+					</a-tag>
+				</template>
+				<template v-if="column.dataIndex === 'settleStatus'">
+					<a-tag
+						:color="
+							record.settleStatus === '1'
+								? 'red'
+								: record.settleStatus === '2'
+								  ? 'green'
+								 : record.settleStatus === '3'
+								  ? '#f50'
+								  : record.settleStatus === '4'
+								  ? 'processing'
+								  : record.settleStatus === '5'
+								  ? 'processing'
+								  : record.settleStatus === '6'
+								  ? 'cyan'
+								  : 'purple'
+						"
+					>
+						{{ $TOOL.dictTypeData('settle_status', record.settleStatus) }}
+					</a-tag>
+				</template>
 				<template v-if="column.dataIndex === 'action'">
-					<a-space>
+<!--					<a-space>
 						<a @click="formRef.onOpen(record)" v-if="hasPerm('bizSettleEdit')">编辑</a>
 						<a-divider type="vertical" v-if="hasPerm(['bizSettleEdit', 'bizSettleDelete'], 'and')" />
 						<a style="color:red" size="small" type="link" @click="deleteConfig(record)">删除</a>
-					</a-space>
+					</a-space>-->
+					<a size="small" type="link" @click="detailRef.onOpen(record)" >详情</a>
+
+					<a-divider type="vertical" v-if="hasPerm('bizSettleSubmit') || hasPerm('bizSettleEdit') || hasPerm('bizSettleDelete')"/>
+
+					<a-dropdown>
+						<a class="ant-dropdown-link">
+							更多
+							<DownOutlined />
+						</a>
+
+						<template #overlay>
+							<a-menu>
+								<a-menu-item v-if="hasPerm('bizSettleSubmit') && record.settleStatus == '1'">
+									<a style="color:blue" @click="onSubmit(record)" >提交</a>
+								</a-menu-item>
+								<!--管理员审核-->
+								<a-menu-item v-if="hasPerm('bizSettleAdminAudit') && record.settleStatus == '2'">
+									<a style="color:blue" @click="adminReviewRef.showModal(record.id)" >审核</a>
+								</a-menu-item>
+								<!--财务审核-->
+								<a-menu-item v-if="hasPerm('bizSettleFinanceAudit') && record.settleStatus == '4'">
+									<a style="color:blue" @click="financeReviewRef.showModal(record.id)" >审核</a>
+								</a-menu-item>
+								<a-menu-item v-if="hasPerm('bizSettleEdit') && (record.settleStatus == '1' || record.settleStatus == '2' || record.settleStatus == '3')">
+									<a @click="formRef.onOpen(record)" >编辑</a>
+								</a-menu-item>
+								<a-menu-item v-if="hasPerm('bizSettleUploadInvoice') && (record.settleStatus == '5')">
+									<a style="color:green" @click="uploadFileRef.onOpen(record)" >上传发票</a>
+								</a-menu-item>
+								<a-menu-item v-if="hasPerm('bizSettleUploadVoucher') && (record.settleStatus == '6')">
+									<a style="color:green" @click="uploadVoucherRef.onOpen(record)" >结款凭证</a>
+								</a-menu-item>
+								<a-menu-item v-if="hasPerm('bizSettleDelete')">
+									<a style="color:red" size="small" type="link" @click="deleteConfig(record)">删除</a>
+								</a-menu-item>
+							</a-menu>
+						</template>
+					</a-dropdown>
 				</template>
 			</template>
 		</s-table>
 	</a-card>
 	<Form ref="formRef" @successful="tableRef.refresh()" />
+	<Detail ref="detailRef" @successful="tableRef.refresh()" />
+	<ReviewAdmin ref="adminReviewRef" @successful="tableRef.refresh(true)" />
+	<ReviewFinance ref="financeReviewRef" @successful="tableRef.refresh(true)" />
+	<UploadFileRef ref="uploadFileRef" @successful="tableRef.refresh()" />
+	<UploadVoucherRef ref="uploadVoucherRef" @successful="tableRef.refresh()" />
 </template>
 
 <script setup name="bizsettle">
@@ -36,11 +157,37 @@
 	import {ExclamationCircleOutlined} from '@ant-design/icons-vue';
 	import {Modal} from 'ant-design-vue';
 	import {createVNode} from 'vue';
+	import ReviewAdmin from "./reviewadmin.vue";
+	import ReviewFinance from './reviewfinance.vue'
+	import UploadFileRef from './uploadFile.vue'
+	import UploadVoucherRef from './uploadVoucher.vue'
+	import Detail from './detail.vue'
+	import tool from '@/utils/tool'
+
 
+	const settleStatusList = tool.dictList('settle_status')
+	const settleTypeList = tool.dictList('settle_type')
+	const detailRef = ref()
+	const uploadVoucherRef = ref()
+	const uploadFileRef = ref()
+	const financeReviewRef = ref()
+	const adminReviewRef = ref()
 	const submitLoading = ref(false)
 	const tableRef = ref()
 	const formRef = ref()
 	const toolConfig = { refresh: true, height: true, columnSetting: true, striped: false }
+
+	//查询数据
+	const searchFormState = ref({})
+	const searchFormRef = ref()
+
+	// 查询区域显示更多控制
+	const advanced = ref(false)
+	const toggleAdvanced = () => {
+		advanced.value = !advanced.value
+	}
+
+
 	const columns = [
 		{
 			title: '结算单号',
@@ -53,7 +200,7 @@
 			align:'center',
 		},
 		{
-			title: '结算金额',
+			title: '结算金额(元)',
 			dataIndex: 'settleAccount',
 			align:'center',
 		},
@@ -61,6 +208,11 @@
 			title: '创建日期',
 			dataIndex: 'createTime',
 			align:'center',
+		},
+		{
+			title: '状态',
+			dataIndex: 'settleStatus',
+			align:'center',
 		}
 	]
 	// 操作栏通过权限判断是否显示
@@ -88,7 +240,14 @@
 		}
 	}
 	const loadData = (parameter) => {
-		return bizSettleApi.bizSettlePage(parameter).then((data) => {
+		const searchFormParam = cloneDeep(searchFormState.value)
+		// grossTime范围查询条件重载
+		if (searchFormParam.createTime) {
+			searchFormParam.startCreateTime = searchFormParam.createTime[0]
+			searchFormParam.endCreateTime = searchFormParam.createTime[1]
+			delete searchFormParam.createTime
+		}
+		return bizSettleApi.bizSettlePage(Object.assign(parameter, searchFormParam)).then((data) => {
 			return data
 		})
 	}
@@ -109,6 +268,34 @@
 		})
 	}
 
+	//提交
+	const onSubmit = (record) => {
+
+		Modal.confirm({
+			title: '确定提交该数据吗?',
+			icon: createVNode(ExclamationCircleOutlined),
+			content: '',
+			onOk() {
+				submitLoading.value = true
+				let params =
+					{
+						id: record.id
+					}
+
+
+				bizSettleApi
+					.submit(params)
+					.then(() => {
+						tableRef.value.refresh(true)
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			},
+			onCancel() {}
+		})
+	}
+
 	// 删除
 	const deleteConfig = (record) => {
 

+ 66 - 0
snowy-admin-web/src/views/biz/bizsettle/reviewadmin.vue

@@ -0,0 +1,66 @@
+<template>
+    <a-modal v-model:visible="visible" title="审核">
+
+        <a-form ref="formRef" :label-col="labelCol" :model="formData" layout="horizontal">
+            <a-form-item v-show="false">
+                <a-input v-model:value="formData.id"></a-input>
+            </a-form-item>
+            <a-form-item
+                    label="审核备注"
+                    name="auditingRemark"
+            >
+                <a-textarea v-model:value="formData.settleReason" placeholder="请输入审核备注"
+                            :auto-size="{ minRows: 3, maxRows: 5 }"/>
+            </a-form-item>
+        </a-form>
+        <template #footer>
+            <a-spin :spinning="submitLoading">
+                <a-button style="margin-right: 8px" @click="onsubmit(false)" type="primary" danger>审核驳回</a-button>
+                <a-button type="primary" @click="onsubmit(true)">审核通过</a-button>
+            </a-spin>
+        </template>
+    </a-modal>
+</template>
+<script setup>
+import {message} from 'ant-design-vue';
+import bizSettleApi from '@/api/biz/bizSettleApi'
+
+
+const emit = defineEmits({successful: null})
+const visible = ref(false);
+const submitLoading = ref(false)
+const labelCol = ref({span: 4})
+// 表单数据
+const formData = ref({})
+const showModal = (id) => {
+    formData.value.id = id
+    visible.value = true;
+};
+const onClose = () => {
+    formData.value = {}
+    visible.value = false
+};
+const onsubmit = (flag) => {
+    if (flag === false) {
+        if (!formData.value.settleReason) {
+            message.error('审核驳回时,备注信息不能为空')
+            return
+        }
+    }
+    submitLoading.value = true
+	formData.value.auditFlag = flag
+	bizSettleApi.auditAdmin(formData.value).then(() => {
+        onClose()
+        emit('successful', null)
+    }).finally(() => {
+        submitLoading.value = false
+    })
+}
+// 抛出函数
+defineExpose({
+    showModal
+})
+</script>
+<style scoped>
+
+</style>

+ 66 - 0
snowy-admin-web/src/views/biz/bizsettle/reviewfinance.vue

@@ -0,0 +1,66 @@
+<template>
+    <a-modal v-model:visible="visible" title="审核">
+
+        <a-form ref="formRef" :label-col="labelCol" :model="formData" layout="horizontal">
+            <a-form-item v-show="false">
+                <a-input v-model:value="formData.id"></a-input>
+            </a-form-item>
+            <a-form-item
+                    label="审核备注"
+                    name="auditingRemark"
+            >
+                <a-textarea v-model:value="formData.settleReason" placeholder="请输入审核备注"
+                            :auto-size="{ minRows: 3, maxRows: 5 }"/>
+            </a-form-item>
+        </a-form>
+        <template #footer>
+            <a-spin :spinning="submitLoading">
+                <a-button style="margin-right: 8px" @click="onsubmit(false)" type="primary" danger>审核驳回</a-button>
+                <a-button type="primary" @click="onsubmit(true)">审核通过</a-button>
+            </a-spin>
+        </template>
+    </a-modal>
+</template>
+<script setup>
+import {message} from 'ant-design-vue';
+import bizSettleApi from '@/api/biz/bizSettleApi'
+
+
+const emit = defineEmits({successful: null})
+const visible = ref(false);
+const submitLoading = ref(false)
+const labelCol = ref({span: 4})
+// 表单数据
+const formData = ref({})
+const showModal = (id) => {
+    formData.value.id = id
+    visible.value = true;
+};
+const onClose = () => {
+    formData.value = {}
+    visible.value = false
+};
+const onsubmit = (flag) => {
+    if (flag === false) {
+        if (!formData.value.settleReason) {
+            message.error('审核驳回时,备注信息不能为空')
+            return
+        }
+    }
+    submitLoading.value = true
+	formData.value.auditFlag = flag
+	bizSettleApi.auditFinance(formData.value).then(() => {
+        onClose()
+        emit('successful', null)
+    }).finally(() => {
+        submitLoading.value = false
+    })
+}
+// 抛出函数
+defineExpose({
+    showModal
+})
+</script>
+<style scoped>
+
+</style>

+ 159 - 0
snowy-admin-web/src/views/biz/bizsettle/uploadFile.vue

@@ -0,0 +1,159 @@
+<template>
+	<xn-form-container
+		:title="formData.id ? '上传发票' : '上传发票'"
+		:width="700"
+		v-model:open="open"
+		:destroy-on-close="true"
+		@close="onClose"
+	>
+		<a-form ref="formRef" :model="formData" :rules="formRules" :wrapper-col="wrapperCol" :label-col="labelCol">
+			<a-form-item label="上传发票:" name="filePathList" :rules="[{ required: true, message: '请上传发票' }]">
+				<a-upload
+					v-model:file-list="fileList"
+					class="avatar-uploader"
+					list-type="picture"
+					:show-upload-list="true"
+					:custom-request="customRequest"
+					:remove="file => removeOtherFile(file,index)"
+					:before-upload="beforeUpload"
+					accept="image/png, image/jpeg, image/jpg"
+
+				>
+					<a-button>
+						<upload-outlined></upload-outlined>
+						upload
+					</a-button>
+				</a-upload>
+			</a-form-item>
+		</a-form>
+		<template #footer>
+			<a-button style="margin-right: 8px" @click="onClose">关闭</a-button>
+			<a-button type="primary" @click="onSubmit" :loading="submitLoading">保存</a-button>
+		</template>
+	</xn-form-container>
+</template>
+
+<script setup name="bizRecordForm">
+	import { cloneDeep } from 'lodash-es'
+	import { required } from '@/utils/formRules'
+	import bizSettleApi from "@/api/biz/bizSettleApi";
+	import fileApi from '@/api/dev/fileApi'
+	import sysConfig from "@/config";
+	import {message, Modal, Upload } from 'ant-design-vue';
+	// 抽屉状态
+	const open = ref(false)
+	const emit = defineEmits({ successful: null })
+	const formRef = ref()
+	// 表单数据
+	const formData = ref({filePathList:[],fileNameList:[]})
+	const submitLoading = ref(false)
+
+	//设置表单样式
+	const labelCol = ref({ span: 5})
+	const wrapperCol = ref({ span: 16})
+
+	const fileList = ref([])
+
+	// 打开抽屉
+	const onOpen = (record) => {
+		open.value = true
+		if (record) {
+			let recordData = cloneDeep(record)
+			formData.value = Object.assign({}, recordData)
+			formData.value.filePathList = []
+			formData.value.fileNameList = []
+			fileList.value = []
+			if (formData.value.fileInvoicePath) {
+				for (var i = 0; i < formData.value.fileInvoicePath.split(',').length; i++) {
+					fileList.value.push({
+						url: sysConfig.PREVIEW_PATH + formData.value.fileInvoicePath.split(',')[i],
+						name: formData.value.fileInvoiceName.split(',')[i]
+					})
+				}
+			}
+		}
+	}
+	// 关闭抽屉
+	const onClose = () => {
+		formRef.value.resetFields()
+		formData.value = {}
+		formData.value.fileNameList = []
+		formData.value.filePathList = []
+		fileList.value = []
+		open.value = false
+	}
+	// 默认要校验的
+	const formRules = {
+	}
+	// 验证并提交数据
+	const onSubmit = () => {
+		formRef.value
+			.validate()
+			.then(() => {
+
+				if (
+					formData.value.filePathList == [] ||
+					formData.value.filePathList == '' ||
+					formData.value.filePathList == null
+				) {
+					message.warn('请上传发票')
+					return
+				}
+
+				submitLoading.value = true
+				const formDataParam = cloneDeep(formData.value)
+				console.log("formData:"+formDataParam.filePahList)
+				bizSettleApi
+					.uploadInvoice(formDataParam)
+					.then(() => {
+						onClose()
+						emit('successful')
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			})
+			.catch(() => {})
+	}
+
+	const customRequest = (data) => {
+		console.log("data:"+JSON.stringify(data.file.name))
+		//保存图片
+		const fileData = new FormData()
+		fileData.append('file', data.file)
+		fileApi
+			.uploadImgMap(fileData)
+			.then((result) => {
+				formData.value.filePathList.push(result.imageFile)
+				formData.value.fileNameList.push(data.file.name)
+			}).finally(()=>{
+			data.onSuccess()
+		})
+
+	}
+
+	//文件删除
+	const removeOtherFile = (file) => {
+		fileList.value.forEach((item,index)=>{
+			console.log(item.name+"======="+file.name)
+			if(item.name === file.name){
+
+				fileList.value.splice(index, 1);
+				formData.value.filePathList.splice(index,1)
+				formData.value.fileNameList.splice(index,1)
+			}
+		})
+	}
+
+	const beforeUpload = (file) => {
+		const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png'
+		if (!isJpgOrPng) {
+			message.error('请上传JPG/PNG格式的图片!')
+		}
+		return isJpgOrPng || Upload.LIST_IGNORE
+	}
+	// 抛出函数
+	defineExpose({
+		onOpen
+	})
+</script>

+ 195 - 0
snowy-admin-web/src/views/biz/bizsettle/uploadVoucher.vue

@@ -0,0 +1,195 @@
+<template>
+	<xn-form-container
+		:title="formData.id ? '上传结款凭证' : '上传结款凭证'"
+		:width="700"
+		v-model:open="open"
+		:destroy-on-close="true"
+		@close="onClose"
+	>
+		<a-form ref="formRef" :model="formData" :rules="formRules" :wrapper-col="wrapperCol" :label-col="labelCol">
+			<a-form-item label="发票信息:" >
+				<p v-for="(item, index) in fileUploadInvoice" :key="index" style="margin-top:5px;">
+					<a @click="downloadMaterial(item.url)" target="_blank">{{ item.name }}</a>
+				</p>
+			</a-form-item>
+			<a-form-item label="上传结款凭证:" name="filePathList" :rules="[{ required: true, message: '请上传结款凭证' }]">
+				<a-upload
+					v-model:file-list="fileList"
+					class="avatar-uploader"
+					list-type="picture"
+					:show-upload-list="true"
+					:custom-request="customRequest"
+					:remove="file => removeOtherFile(file,index)"
+					:before-upload="beforeUpload"
+					accept="image/png, image/jpeg, image/jpg"
+
+				>
+					<a-button>
+						<upload-outlined></upload-outlined>
+						upload
+					</a-button>
+				</a-upload>
+			</a-form-item>
+			<a-form-item label="驳回备注:" name="settleReason">
+				<a-textarea
+					v-model:value="formData.settleReason"
+					placeholder="请输入驳回备注"
+					:maxlength="200"
+					show-count
+				/>
+			</a-form-item>
+		</a-form>
+		<template #footer>
+			<a-button style="margin-right: 8px" @click="onClose">关闭</a-button>
+			<a-button style="margin-right: 8px" @click="reject" type="primary" danger>驳回</a-button>
+			<a-button type="primary" @click="onSubmit" :loading="submitLoading">保存</a-button>
+		</template>
+	</xn-form-container>
+</template>
+
+<script setup name="bizRecordForm">
+	import { cloneDeep } from 'lodash-es'
+	import { required } from '@/utils/formRules'
+	import bizSettleApi from "@/api/biz/bizSettleApi";
+	import fileApi from '@/api/dev/fileApi'
+	import sysConfig from "@/config";
+	import {message, Modal, Upload } from 'ant-design-vue';
+	// 抽屉状态
+	const open = ref(false)
+	const emit = defineEmits({ successful: null })
+	const formRef = ref()
+	// 表单数据
+	const formData = ref({filePathList:[],fileNameList:[]})
+	const submitLoading = ref(false)
+
+	//设置表单样式
+	const labelCol = ref({ span: 5})
+	const wrapperCol = ref({ span: 16})
+
+	const fileList = ref([])
+	const fileUploadInvoice = ref([])
+
+	// 打开抽屉
+	const onOpen = (record) => {
+		open.value = true
+		if (record) {
+			let recordData = cloneDeep(record)
+			formData.value = Object.assign({}, recordData)
+			formData.value.filePathList = []
+			formData.value.fileNameList = []
+			fileList.value = []
+			if (formData.value.fileInvoicePath) {
+				for (var i = 0; i < formData.value.fileInvoicePath.split(',').length; i++) {
+					fileUploadInvoice.value.push({
+						url: sysConfig.PREVIEW_PATH + formData.value.fileInvoicePath.split(',')[i],
+						name: formData.value.fileInvoiceName.split(',')[i]
+					})
+				}
+			}
+		}
+	}
+	// 关闭抽屉
+	const onClose = () => {
+		formRef.value.resetFields()
+		formData.value = {}
+		formData.value.fileNameList = []
+		formData.value.filePathList = []
+		fileList.value = []
+		open.value = false
+		fileUploadInvoice.value = []
+	}
+
+	const downloadMaterial = (url) => {
+		window.open( url)
+	}
+
+	// 默认要校验的
+	const formRules = {
+	}
+	// 验证并提交数据
+	const onSubmit = () => {
+		formRef.value
+			.validate()
+			.then(() => {
+
+				if (
+					formData.value.filePathList == [] ||
+					formData.value.filePathList == '' ||
+					formData.value.filePathList == null
+				) {
+					message.warn('请上传发票')
+					return
+				}
+
+				submitLoading.value = true
+				const formDataParam = cloneDeep(formData.value)
+				console.log("formData:"+formDataParam.filePahList)
+				bizSettleApi
+					.uploadVoucher(formDataParam)
+					.then(() => {
+						onClose()
+						emit('successful')
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			})
+			.catch(() => {})
+	}
+
+	const reject = () => {
+		if(formData.value.settleReason== '' || formData.value.settleReason==null){
+			message.error('驳回时,备注信息不能为空')
+			return
+		}
+		submitLoading.value = true
+		const formDataParam = cloneDeep(formData.value)
+		bizSettleApi.auditReject(formDataParam).then((res)=>{
+			onClose()
+			emit('successful')
+		}).finally(() => {
+			submitLoading.value = false
+		})
+	}
+
+	const customRequest = (data) => {
+		console.log("data:"+JSON.stringify(data.file.name))
+		//保存图片
+		const fileData = new FormData()
+		fileData.append('file', data.file)
+		fileApi
+			.uploadImgMap(fileData)
+			.then((result) => {
+				formData.value.filePathList.push(result.imageFile)
+				formData.value.fileNameList.push(data.file.name)
+			}).finally(()=>{
+			data.onSuccess()
+		})
+
+	}
+
+	//文件删除
+	const removeOtherFile = (file) => {
+		fileList.value.forEach((item,index)=>{
+			console.log(item.name+"======="+file.name)
+			if(item.name === file.name){
+
+				fileList.value.splice(index, 1);
+				formData.value.filePathList.splice(index,1)
+				formData.value.fileNameList.splice(index,1)
+			}
+		})
+	}
+
+	const beforeUpload = (file) => {
+		const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png'
+		if (!isJpgOrPng) {
+			message.error('请上传JPG/PNG格式的图片!')
+		}
+		return isJpgOrPng || Upload.LIST_IGNORE
+	}
+	// 抛出函数
+	defineExpose({
+		onOpen
+	})
+</script>

+ 131 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizauditlog/controller/BizAuditLogController.java

@@ -0,0 +1,131 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.bizauditlog.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+import vip.xiaonuo.common.annotation.CommonLog;
+import vip.xiaonuo.common.pojo.CommonResult;
+import vip.xiaonuo.biz.modular.bizauditlog.entity.BizAuditLog;
+import vip.xiaonuo.biz.modular.bizauditlog.param.BizAuditLogAddParam;
+import vip.xiaonuo.biz.modular.bizauditlog.param.BizAuditLogEditParam;
+import vip.xiaonuo.biz.modular.bizauditlog.param.BizAuditLogIdParam;
+import vip.xiaonuo.biz.modular.bizauditlog.param.BizAuditLogPageParam;
+import vip.xiaonuo.biz.modular.bizauditlog.service.BizAuditLogService;
+
+import jakarta.annotation.Resource;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotEmpty;
+import java.util.List;
+
+/**
+ * 审核记录表控制器
+ *
+ * @author fanzherong
+ * @date  2025/06/16 14:57
+ */
+@Tag(name = "审核记录表控制器")
+@RestController
+@Validated
+public class BizAuditLogController {
+
+    @Resource
+    private BizAuditLogService bizAuditLogService;
+
+    /**
+     * 获取审核记录表分页
+     *
+     * @author fanzherong
+     * @date  2025/06/16 14:57
+     */
+    @Operation(summary = "获取审核记录表分页")
+    @SaCheckPermission("/biz/bizauditlog/page")
+    @GetMapping("/biz/bizauditlog/page")
+    public CommonResult<Page<BizAuditLog>> page(BizAuditLogPageParam bizAuditLogPageParam) {
+        return CommonResult.data(bizAuditLogService.page(bizAuditLogPageParam));
+    }
+
+    /**
+     * 添加审核记录表
+     *
+     * @author fanzherong
+     * @date  2025/06/16 14:57
+     */
+    @Operation(summary = "添加审核记录表")
+    @CommonLog("添加审核记录表")
+    @PostMapping("/biz/bizauditlog/add")
+    public CommonResult<String> add(@RequestBody @Valid BizAuditLogAddParam bizAuditLogAddParam) {
+        bizAuditLogService.add(bizAuditLogAddParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 编辑审核记录表
+     *
+     * @author fanzherong
+     * @date  2025/06/16 14:57
+     */
+    @Operation(summary = "编辑审核记录表")
+    @CommonLog("编辑审核记录表")
+    @PostMapping("/biz/bizauditlog/edit")
+    public CommonResult<String> edit(@RequestBody @Valid BizAuditLogEditParam bizAuditLogEditParam) {
+        bizAuditLogService.edit(bizAuditLogEditParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 删除审核记录表
+     *
+     * @author fanzherong
+     * @date  2025/06/16 14:57
+     */
+    @Operation(summary = "删除审核记录表")
+    @CommonLog("删除审核记录表")
+    @PostMapping("/biz/bizauditlog/delete")
+    public CommonResult<String> delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空")
+                                                   List<BizAuditLogIdParam> bizAuditLogIdParamList) {
+        bizAuditLogService.delete(bizAuditLogIdParamList);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 获取审核记录表详情
+     *
+     * @author fanzherong
+     * @date  2025/06/16 14:57
+     */
+    @Operation(summary = "获取审核记录表详情")
+    @GetMapping("/biz/bizauditlog/detail")
+    public CommonResult<BizAuditLog> detail(@Valid BizAuditLogIdParam bizAuditLogIdParam) {
+        return CommonResult.data(bizAuditLogService.detail(bizAuditLogIdParam));
+    }
+
+    /**
+     * 获取审核记录表列表
+     *
+     * @author fanzherong
+     * @date  2025/06/16 14:57
+     */
+    @Operation(summary = "获取审核记录表列表")
+    @GetMapping("/biz/bizauditlog/getList")
+    public CommonResult<List<BizAuditLog>> getList(BizAuditLogPageParam bizAuditLogPageParam) {
+        return CommonResult.data(bizAuditLogService.getList(bizAuditLogPageParam));
+    }
+}

+ 55 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizauditlog/entity/BizAuditLog.java

@@ -0,0 +1,55 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.bizauditlog.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import vip.xiaonuo.common.pojo.CommonEntity;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 审核记录表实体
+ *
+ * @author fanzherong
+ * @date  2025/06/16 14:57
+ **/
+@Getter
+@Setter
+@TableName("biz_audit_log")
+public class BizAuditLog extends CommonEntity {
+
+    /** 审核记录表id */
+    @TableId
+    @Schema(description = "审核记录表id")
+    private String id;
+
+    /** 数据类型:YFJS  运费结算 */
+    @Schema(description = "数据类型:YFJS  运费结算")
+    private String type;
+
+    /** 数据id */
+    @Schema(description = "数据id")
+    private String dataId;
+
+    /** 审核状态 : 1.通过 2. 拒绝 */
+    @Schema(description = "审核状态 : 1.通过 2. 拒绝")
+    private String status;
+
+    /** 原因 */
+    @Schema(description = "原因")
+    private String remark;
+}

+ 34 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizauditlog/enums/BizAuditLogEnum.java

@@ -0,0 +1,34 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.bizauditlog.enums;
+
+import lombok.Getter;
+
+/**
+ * 审核记录表枚举
+ *
+ * @author fanzherong
+ * @date  2025/06/16 14:57
+ **/
+@Getter
+public enum BizAuditLogEnum {
+
+    /** 测试 */
+    TEST("TEST");
+
+    private final String value;
+
+    BizAuditLogEnum(String value) {
+        this.value = value;
+    }
+}

+ 25 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizauditlog/mapper/BizAuditLogMapper.java

@@ -0,0 +1,25 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.bizauditlog.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import vip.xiaonuo.biz.modular.bizauditlog.entity.BizAuditLog;
+
+/**
+ * 审核记录表Mapper接口
+ *
+ * @author fanzherong
+ * @date  2025/06/16 14:57
+ **/
+public interface BizAuditLogMapper extends BaseMapper<BizAuditLog> {
+}

+ 5 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizauditlog/mapper/mapping/BizAuditLogMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="vip.xiaonuo.biz.modular.bizauditlog.mapper.BizAuditLogMapper">
+
+</mapper>

+ 50 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizauditlog/param/BizAuditLogAddParam.java

@@ -0,0 +1,50 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.bizauditlog.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 审核记录表添加参数
+ *
+ * @author fanzherong
+ * @date  2025/06/16 14:57
+ **/
+@Getter
+@Setter
+public class BizAuditLogAddParam {
+
+    /** 数据类型:YFJS  运费结算 */
+    @Schema(description = "数据类型:YFJS  运费结算")
+    private String type;
+
+    /** 数据id */
+    @Schema(description = "数据id")
+    private String dataId;
+
+    /** 审核状态 : 1.通过 2. 拒绝 */
+    @Schema(description = "审核状态 : 1.通过 2. 拒绝")
+    private String status;
+
+    /** 原因 */
+    @Schema(description = "原因")
+    private String remark;
+
+}

+ 55 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizauditlog/param/BizAuditLogEditParam.java

@@ -0,0 +1,55 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.bizauditlog.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 审核记录表编辑参数
+ *
+ * @author fanzherong
+ * @date  2025/06/16 14:57
+ **/
+@Getter
+@Setter
+public class BizAuditLogEditParam {
+
+    /** 审核记录表id */
+    @Schema(description = "审核记录表id", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "id不能为空")
+    private String id;
+
+    /** 数据类型:YFJS  运费结算 */
+    @Schema(description = "数据类型:YFJS  运费结算")
+    private String type;
+
+    /** 数据id */
+    @Schema(description = "数据id")
+    private String dataId;
+
+    /** 审核状态 : 1.通过 2. 拒绝 */
+    @Schema(description = "审核状态 : 1.通过 2. 拒绝")
+    private String status;
+
+    /** 原因 */
+    @Schema(description = "原因")
+    private String remark;
+
+}

+ 35 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizauditlog/param/BizAuditLogIdParam.java

@@ -0,0 +1,35 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.bizauditlog.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import jakarta.validation.constraints.NotBlank;
+
+/**
+ * 审核记录表Id参数
+ *
+ * @author fanzherong
+ * @date  2025/06/16 14:57
+ **/
+@Getter
+@Setter
+public class BizAuditLogIdParam {
+
+    /** 审核记录表id */
+    @Schema(description = "审核记录表id", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "id不能为空")
+    private String id;
+}

+ 55 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizauditlog/param/BizAuditLogPageParam.java

@@ -0,0 +1,55 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.bizauditlog.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 审核记录表查询参数
+ *
+ * @author fanzherong
+ * @date  2025/06/16 14:57
+ **/
+@Getter
+@Setter
+public class BizAuditLogPageParam {
+
+    /** 当前页 */
+    @Schema(description = "当前页码")
+    private Integer current;
+
+    /** 每页条数 */
+    @Schema(description = "每页条数")
+    private Integer size;
+
+    /** 排序字段 */
+    @Schema(description = "排序字段,字段驼峰名称,如:userName")
+    private String sortField;
+
+    /** 排序方式 */
+    @Schema(description = "排序方式,升序:ASCEND;降序:DESCEND")
+    private String sortOrder;
+
+    /** 关键词 */
+    @Schema(description = "关键词")
+    private String searchKey;
+
+    private String type;
+
+    private String dataId;
+
+}

+ 85 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizauditlog/service/BizAuditLogService.java

@@ -0,0 +1,85 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.bizauditlog.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import vip.xiaonuo.biz.modular.bizauditlog.entity.BizAuditLog;
+import vip.xiaonuo.biz.modular.bizauditlog.param.BizAuditLogAddParam;
+import vip.xiaonuo.biz.modular.bizauditlog.param.BizAuditLogEditParam;
+import vip.xiaonuo.biz.modular.bizauditlog.param.BizAuditLogIdParam;
+import vip.xiaonuo.biz.modular.bizauditlog.param.BizAuditLogPageParam;
+
+import java.util.List;
+
+/**
+ * 审核记录表Service接口
+ *
+ * @author fanzherong
+ * @date  2025/06/16 14:57
+ **/
+public interface BizAuditLogService extends IService<BizAuditLog> {
+
+    /**
+     * 获取审核记录表分页
+     *
+     * @author fanzherong
+     * @date  2025/06/16 14:57
+     */
+    Page<BizAuditLog> page(BizAuditLogPageParam bizAuditLogPageParam);
+
+    /**
+     * 添加审核记录表
+     *
+     * @author fanzherong
+     * @date  2025/06/16 14:57
+     */
+    void add(BizAuditLogAddParam bizAuditLogAddParam);
+
+    /**
+     * 编辑审核记录表
+     *
+     * @author fanzherong
+     * @date  2025/06/16 14:57
+     */
+    void edit(BizAuditLogEditParam bizAuditLogEditParam);
+
+    /**
+     * 删除审核记录表
+     *
+     * @author fanzherong
+     * @date  2025/06/16 14:57
+     */
+    void delete(List<BizAuditLogIdParam> bizAuditLogIdParamList);
+
+    /**
+     * 获取审核记录表详情
+     *
+     * @author fanzherong
+     * @date  2025/06/16 14:57
+     */
+    BizAuditLog detail(BizAuditLogIdParam bizAuditLogIdParam);
+
+    /**
+     * 获取审核记录表详情
+     *
+     * @author fanzherong
+     * @date  2025/06/16 14:57
+     **/
+    BizAuditLog queryEntity(String id);
+
+    /**
+     * 查询审核记录列表
+     */
+    List<BizAuditLog> getList(BizAuditLogPageParam bizAuditLogPageParam);
+}

+ 108 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizauditlog/service/impl/BizAuditLogServiceImpl.java

@@ -0,0 +1,108 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.bizauditlog.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollStreamUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import vip.xiaonuo.common.enums.CommonSortOrderEnum;
+import vip.xiaonuo.common.exception.CommonException;
+import vip.xiaonuo.common.page.CommonPageRequest;
+import vip.xiaonuo.biz.modular.bizauditlog.entity.BizAuditLog;
+import vip.xiaonuo.biz.modular.bizauditlog.mapper.BizAuditLogMapper;
+import vip.xiaonuo.biz.modular.bizauditlog.param.BizAuditLogAddParam;
+import vip.xiaonuo.biz.modular.bizauditlog.param.BizAuditLogEditParam;
+import vip.xiaonuo.biz.modular.bizauditlog.param.BizAuditLogIdParam;
+import vip.xiaonuo.biz.modular.bizauditlog.param.BizAuditLogPageParam;
+import vip.xiaonuo.biz.modular.bizauditlog.service.BizAuditLogService;
+
+import java.util.List;
+
+/**
+ * 审核记录表Service接口实现类
+ *
+ * @author fanzherong
+ * @date  2025/06/16 14:57
+ **/
+@Service
+public class BizAuditLogServiceImpl extends ServiceImpl<BizAuditLogMapper, BizAuditLog> implements BizAuditLogService {
+
+    @Override
+    public Page<BizAuditLog> page(BizAuditLogPageParam bizAuditLogPageParam) {
+        QueryWrapper<BizAuditLog> queryWrapper = new QueryWrapper<BizAuditLog>().checkSqlInjection();
+        if(ObjectUtil.isAllNotEmpty(bizAuditLogPageParam.getSortField(), bizAuditLogPageParam.getSortOrder())) {
+            CommonSortOrderEnum.validate(bizAuditLogPageParam.getSortOrder());
+            queryWrapper.orderBy(true, bizAuditLogPageParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()),
+                    StrUtil.toUnderlineCase(bizAuditLogPageParam.getSortField()));
+        } else {
+            queryWrapper.lambda().orderByAsc(BizAuditLog::getId);
+        }
+        return this.page(CommonPageRequest.defaultPage(), queryWrapper);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void add(BizAuditLogAddParam bizAuditLogAddParam) {
+        BizAuditLog bizAuditLog = BeanUtil.toBean(bizAuditLogAddParam, BizAuditLog.class);
+        this.save(bizAuditLog);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void edit(BizAuditLogEditParam bizAuditLogEditParam) {
+        BizAuditLog bizAuditLog = this.queryEntity(bizAuditLogEditParam.getId());
+        BeanUtil.copyProperties(bizAuditLogEditParam, bizAuditLog);
+        this.updateById(bizAuditLog);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void delete(List<BizAuditLogIdParam> bizAuditLogIdParamList) {
+        // 执行删除
+        this.removeByIds(CollStreamUtil.toList(bizAuditLogIdParamList, BizAuditLogIdParam::getId));
+    }
+
+    @Override
+    public BizAuditLog detail(BizAuditLogIdParam bizAuditLogIdParam) {
+        return this.queryEntity(bizAuditLogIdParam.getId());
+    }
+
+    @Override
+    public BizAuditLog queryEntity(String id) {
+        BizAuditLog bizAuditLog = this.getById(id);
+        if(ObjectUtil.isEmpty(bizAuditLog)) {
+            throw new CommonException("审核记录表不存在,id值为:{}", id);
+        }
+        return bizAuditLog;
+    }
+
+    @Override
+    public List<BizAuditLog> getList(BizAuditLogPageParam bizAuditLogPageParam) {
+        QueryWrapper<BizAuditLog> queryWrapper = new QueryWrapper<>();
+        if(ObjectUtil.isNotEmpty(bizAuditLogPageParam.getType())){
+            queryWrapper.lambda().eq(BizAuditLog::getType,bizAuditLogPageParam.getType());
+        }
+        if(ObjectUtil.isNotEmpty(bizAuditLogPageParam.getDataId())){
+            queryWrapper.lambda().eq(BizAuditLog::getDataId,bizAuditLogPageParam.getDataId());
+        }
+        queryWrapper.lambda().orderByDesc(BizAuditLog::getCreateTime);
+        List<BizAuditLog> list = this.list(queryWrapper);
+        return list;
+    }
+}

+ 86 - 4
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsettle/controller/BizSettleController.java

@@ -21,13 +21,10 @@ import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RestController;
+import vip.xiaonuo.biz.modular.bizsettle.param.*;
 import vip.xiaonuo.common.annotation.CommonLog;
 import vip.xiaonuo.common.pojo.CommonResult;
 import vip.xiaonuo.biz.modular.bizsettle.entity.BizSettle;
-import vip.xiaonuo.biz.modular.bizsettle.param.BizSettleAddParam;
-import vip.xiaonuo.biz.modular.bizsettle.param.BizSettleEditParam;
-import vip.xiaonuo.biz.modular.bizsettle.param.BizSettleIdParam;
-import vip.xiaonuo.biz.modular.bizsettle.param.BizSettlePageParam;
 import vip.xiaonuo.biz.modular.bizsettle.service.BizSettleService;
 
 import jakarta.annotation.Resource;
@@ -128,4 +125,89 @@ public class BizSettleController {
     public CommonResult<BizSettle> detailOrder(@Valid BizSettleIdParam bizSettleIdParam) {
         return CommonResult.data(bizSettleService.detailOrder(bizSettleIdParam));
     }
+
+
+    /**
+     * 运费结算提交
+     *
+     * @author xiaofan
+     * @date  2025/06/12 09:54
+     */
+    @Operation(summary = "运费结算提交")
+    @CommonLog("运费结算提交")
+    @PostMapping("/biz/bizsettle/submit")
+    public CommonResult<String> submit(@RequestBody @Valid BizSettleEditParam bizSettleEditParam) {
+        bizSettleService.submit(bizSettleEditParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 管理员审批
+     *
+     * @author xiaofan
+     * @date  2025/06/12 09:54
+     */
+    @Operation(summary = "管理员审批")
+    @CommonLog("管理员审批")
+    @PostMapping("/biz/bizsettle/auditAdmin")
+    public CommonResult<String> auditAdmin(@RequestBody @Valid BizSettleAuditParam bizSettleAuditParam) {
+        bizSettleService.auditAdmin(bizSettleAuditParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 财务审批
+     *
+     * @author xiaofan
+     * @date  2025/06/12 09:54
+     */
+    @Operation(summary = "财务审批")
+    @CommonLog("财务审批")
+    @PostMapping("/biz/bizsettle/auditFinance")
+    public CommonResult<String> auditFinance(@RequestBody @Valid BizSettleAuditParam bizSettleAuditParam) {
+        bizSettleService.auditFinance(bizSettleAuditParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 上传发票
+     *
+     * @author xiaofan
+     * @date  2025/06/12 09:54
+     */
+    @Operation(summary = "上传发票")
+    @CommonLog("上传发票")
+    @PostMapping("/biz/bizsettle/uploadInvoice")
+    public CommonResult<String> uploadInvoice(@RequestBody @Valid BizSettleEditParam bizSettleEditParam) {
+        bizSettleService.uploadInvoice(bizSettleEditParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 上传结款凭证
+     *
+     * @author xiaofan
+     * @date  2025/06/12 09:54
+     */
+    @Operation(summary = "上传结款凭证")
+    @CommonLog("上传结款凭证")
+    @PostMapping("/biz/bizsettle/uploadVoucher")
+    public CommonResult<String> uploadVoucher(@RequestBody @Valid BizSettleEditParam bizSettleEditParam) {
+        bizSettleService.uploadVoucher(bizSettleEditParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 财务审批
+     *
+     * @author xiaofan
+     * @date  2025/06/12 09:54
+     */
+    @Operation(summary = "财务审批")
+    @CommonLog("财务审批")
+    @PostMapping("/biz/bizsettle/auditReject")
+    public CommonResult<String> auditReject(@RequestBody @Valid BizSettleAuditParam bizSettleAuditParam) {
+        bizSettleService.auditReject(bizSettleAuditParam);
+        return CommonResult.ok();
+    }
 }

+ 23 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsettle/entity/BizSettle.java

@@ -51,6 +51,29 @@ public class BizSettle extends CommonEntity {
     @Schema(description = "结算金额")
     private BigDecimal settleAccount;
 
+    /**状态**/
+    private String settleStatus;
+
+    /***
+     * 文件名称
+     */
+    private String fileInvoiceName;
+
+    /**
+     * 文件路径
+     */
+    private String fileInvoicePath;
+
+    /**
+     * 结款凭证名称
+     */
+    private String fileVoucherName;
+
+    /**
+     * 结款凭证路径
+     */
+    private String fileVoucherPath;
+
     @TableField(exist = false)
     private List<BizOrder> orderList;
 }

+ 4 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsettle/param/BizSettleAddParam.java

@@ -48,4 +48,8 @@ public class BizSettleAddParam {
 
     private List<BizOrder> orderList;
 
+    private List<String> fileNameList;
+
+    private List<String> filePathList;
+
 }

+ 17 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsettle/param/BizSettleAuditParam.java

@@ -0,0 +1,17 @@
+package vip.xiaonuo.biz.modular.bizsettle.param;
+
+import jakarta.validation.constraints.NotBlank;
+import lombok.Data;
+
+@Data
+public class BizSettleAuditParam {
+
+    @NotBlank(message = "id不能为空")
+    private String id;
+
+    /**审核备注*/
+    private String settleReason;
+
+    /**审核标识*/
+    private String auditFlag;
+}

+ 4 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsettle/param/BizSettleEditParam.java

@@ -53,4 +53,8 @@ public class BizSettleEditParam {
 
     private List<BizOrder> orderList;
 
+    private List<String> fileNameList;
+
+    private List<String> filePathList;
+
 }

+ 12 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsettle/param/BizSettlePageParam.java

@@ -48,4 +48,16 @@ public class BizSettlePageParam {
     @Schema(description = "关键词")
     private String searchKey;
 
+    /**结算单号*/
+    private String settleNo;
+
+    /** 结算类型 */
+    private String settleType;
+
+    /**状态**/
+    private String settleStatus;
+
+    private String startCreateTime;
+    private String endCreateTime;
+
 }

+ 31 - 4
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsettle/service/BizSettleService.java

@@ -15,10 +15,7 @@ package vip.xiaonuo.biz.modular.bizsettle.service;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import vip.xiaonuo.biz.modular.bizsettle.entity.BizSettle;
-import vip.xiaonuo.biz.modular.bizsettle.param.BizSettleAddParam;
-import vip.xiaonuo.biz.modular.bizsettle.param.BizSettleEditParam;
-import vip.xiaonuo.biz.modular.bizsettle.param.BizSettleIdParam;
-import vip.xiaonuo.biz.modular.bizsettle.param.BizSettlePageParam;
+import vip.xiaonuo.biz.modular.bizsettle.param.*;
 
 import java.util.List;
 
@@ -82,4 +79,34 @@ public interface BizSettleService extends IService<BizSettle> {
      * 编辑查询明细
      */
     BizSettle detailOrder(BizSettleIdParam bizSettleIdParam);
+
+    /**
+     * 提交
+     */
+    void submit(BizSettleEditParam bizSettleEditParam);
+
+    /**
+     * 管理员审批
+     */
+    void auditAdmin(BizSettleAuditParam bizSettleAuditParam);
+
+    /**
+     * 财务审批
+     */
+    void auditFinance(BizSettleAuditParam bizSettleAuditParam);
+
+    /**
+     * 上传发票
+     */
+    void uploadInvoice(BizSettleEditParam bizSettleEditParam);
+
+    /**
+     * 上传结款凭证
+     */
+    void uploadVoucher(BizSettleEditParam bizSettleEditParam);
+
+    /**
+     * 打款驳回
+     */
+    void auditReject(BizSettleAuditParam bizSettleAuditParam);
 }

+ 155 - 4
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsettle/service/impl/BizSettleServiceImpl.java

@@ -14,6 +14,7 @@ package vip.xiaonuo.biz.modular.bizsettle.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollStreamUtil;
+import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -22,11 +23,17 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.google.common.collect.Lists;
 import jakarta.annotation.Resource;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import vip.xiaonuo.biz.modular.bizauditlog.entity.BizAuditLog;
+import vip.xiaonuo.biz.modular.bizauditlog.service.BizAuditLogService;
+import vip.xiaonuo.biz.modular.bizconfig.entity.BizConfig;
+import vip.xiaonuo.biz.modular.bizconfig.service.BizConfigService;
 import vip.xiaonuo.biz.modular.bizorder.entity.BizOrder;
 import vip.xiaonuo.biz.modular.bizorder.param.BizOrderPageParam;
 import vip.xiaonuo.biz.modular.bizorder.service.BizOrderService;
+import vip.xiaonuo.biz.modular.bizsettle.param.*;
 import vip.xiaonuo.biz.modular.bizsettleorder.entity.BizSettleOrder;
 import vip.xiaonuo.biz.modular.bizsettleorder.service.BizSettleOrderService;
 import vip.xiaonuo.common.enums.CommonSortOrderEnum;
@@ -34,10 +41,6 @@ import vip.xiaonuo.common.exception.CommonException;
 import vip.xiaonuo.common.page.CommonPageRequest;
 import vip.xiaonuo.biz.modular.bizsettle.entity.BizSettle;
 import vip.xiaonuo.biz.modular.bizsettle.mapper.BizSettleMapper;
-import vip.xiaonuo.biz.modular.bizsettle.param.BizSettleAddParam;
-import vip.xiaonuo.biz.modular.bizsettle.param.BizSettleEditParam;
-import vip.xiaonuo.biz.modular.bizsettle.param.BizSettleIdParam;
-import vip.xiaonuo.biz.modular.bizsettle.param.BizSettlePageParam;
 import vip.xiaonuo.biz.modular.bizsettle.service.BizSettleService;
 
 import java.text.SimpleDateFormat;
@@ -59,10 +62,27 @@ public class BizSettleServiceImpl extends ServiceImpl<BizSettleMapper, BizSettle
     private BizSettleOrderService bizSettleOrderService;
     @Resource
     private BizOrderService bizOrderService;
+    @Resource
+    private BizConfigService bizConfigService;
+    @Resource
+    private BizAuditLogService bizAuditLogService;
 
     @Override
     public Page<BizSettle> page(BizSettlePageParam bizSettlePageParam) {
         QueryWrapper<BizSettle> queryWrapper = new QueryWrapper<BizSettle>().checkSqlInjection();
+        if(ObjectUtil.isNotEmpty(bizSettlePageParam.getSettleNo())){
+            queryWrapper.lambda().like(BizSettle::getSettleNo,bizSettlePageParam.getSettleNo());
+        }
+        if(ObjectUtil.isNotEmpty(bizSettlePageParam.getSettleType())){
+            queryWrapper.lambda().eq(BizSettle::getSettleType,bizSettlePageParam.getSettleType());
+        }
+        if(ObjectUtil.isNotEmpty(bizSettlePageParam.getStartCreateTime()) && ObjectUtil.isNotEmpty(bizSettlePageParam.getEndCreateTime())){
+            String format = DateUtil.format(new Date(), "yyyy-MM-dd");
+            queryWrapper.lambda().between(BizSettle::getCreateTime,format+" 00:00:00",format+" 23:59:59");
+        }
+        if(ObjectUtil.isNotEmpty(bizSettlePageParam.getSettleStatus())){
+            queryWrapper.lambda().eq(BizSettle::getSettleStatus,bizSettlePageParam.getSettleStatus());
+        }
         Page<BizSettle> page = this.page(CommonPageRequest.defaultPage(), queryWrapper);
         return page;
     }
@@ -70,6 +90,14 @@ public class BizSettleServiceImpl extends ServiceImpl<BizSettleMapper, BizSettle
     @Transactional(rollbackFor = Exception.class)
     @Override
     public void add(BizSettleAddParam bizSettleAddParam) {
+
+        if(ObjectUtil.isNotEmpty(bizSettleAddParam.getSettleAccount())){
+            BizConfig bizConfig = bizConfigService.getOne(new QueryWrapper<BizConfig>().lambda().last("limit 1"));
+            if(bizSettleAddParam.getSettleAccount().compareTo(bizConfig.getSettleAccount()) < 0){
+                throw new CommonException("结算总金额低于结算基础金额,不可计算!");
+            }
+        }
+
         BizSettle bizSettle = BeanUtil.toBean(bizSettleAddParam, BizSettle.class);
         String settleNo = getNumber();
         bizSettle.setSettleNo(settleNo);
@@ -210,4 +238,127 @@ public class BizSettleServiceImpl extends ServiceImpl<BizSettleMapper, BizSettle
         bizSettle.setOrderList(orderList);
         return bizSettle;
     }
+
+    @Override
+    public void submit(BizSettleEditParam bizSettleEditParam) {
+        BizSettle bizSettle = this.queryEntity(bizSettleEditParam.getId());
+        bizSettle.setSettleStatus("2");
+        this.updateById(bizSettle);
+    }
+
+    /**管理员审批*/
+    @Transactional
+    @Override
+    public void auditAdmin(BizSettleAuditParam bizSettleAuditParam) {
+        BizSettle bizSettle = this.queryEntity(bizSettleAuditParam.getId());
+        String status = "2";
+        String auditStatus = "";
+        if(StringUtils.equals(bizSettleAuditParam.getAuditFlag(),"true")){
+            status="4";
+            auditStatus = "1";
+        }else{
+            status = "3";
+            auditStatus = "2";
+        }
+        //修改状态
+        UpdateWrapper<BizSettle> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.set("settle_status",status).eq("id",bizSettle.getId());
+        this.update(updateWrapper);
+
+        //插入审核记录
+        BizAuditLog bizAuditLog = new BizAuditLog();
+        bizAuditLog.setType("YFJS");
+        bizAuditLog.setDataId(bizSettle.getId());
+        bizAuditLog.setStatus(auditStatus);
+        bizAuditLog.setRemark(bizSettleAuditParam.getSettleReason());
+        bizAuditLogService.save(bizAuditLog);
+    }
+
+    /**财务审批*/
+    @Transactional
+    @Override
+    public void auditFinance(BizSettleAuditParam bizSettleAuditParam) {
+        BizSettle bizSettle = this.queryEntity(bizSettleAuditParam.getId());
+        String status = "";
+        String auditStatus = "";
+        if(StringUtils.equals(bizSettleAuditParam.getAuditFlag(),"true")){
+            status="5";
+            auditStatus = "1";
+        }else{
+            status = "3";
+            auditStatus = "2";
+        }
+        //修改状态
+        UpdateWrapper<BizSettle> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.set("settle_status",status).eq("id",bizSettle.getId());
+        this.update(updateWrapper);
+
+        //插入审核记录
+        BizAuditLog bizAuditLog = new BizAuditLog();
+        bizAuditLog.setType("YFJS");
+        bizAuditLog.setDataId(bizSettle.getId());
+        bizAuditLog.setStatus(auditStatus);
+        bizAuditLog.setRemark(bizSettleAuditParam.getSettleReason());
+        bizAuditLogService.save(bizAuditLog);
+    }
+
+    @Override
+    public void uploadInvoice(BizSettleEditParam bizSettleEditParam) {
+        BizSettle bizSettle = this.queryEntity(bizSettleEditParam.getId());
+        if(ObjectUtil.isNotEmpty(bizSettleEditParam.getFileNameList())){
+            StringBuffer fileNameBuffer = new StringBuffer();
+            for(String fileName : bizSettleEditParam.getFileNameList()){
+                fileNameBuffer.append(fileName+",");
+            }
+            bizSettle.setFileInvoiceName(fileNameBuffer.substring(0,fileNameBuffer.length()-1));
+        }
+        if(ObjectUtil.isNotEmpty(bizSettleEditParam.getFilePathList())){
+            StringBuffer filePathBuffer = new StringBuffer();
+            for(String filePath : bizSettleEditParam.getFilePathList()){
+                filePathBuffer.append(filePath+",");
+            }
+            bizSettle.setFileInvoicePath(filePathBuffer.substring(0,filePathBuffer.length()-1));
+        }
+        bizSettle.setSettleStatus("6");
+        this.updateById(bizSettle);
+    }
+
+    @Override
+    public void uploadVoucher(BizSettleEditParam bizSettleEditParam) {
+        BizSettle bizSettle = this.queryEntity(bizSettleEditParam.getId());
+        if(ObjectUtil.isNotEmpty(bizSettleEditParam.getFileNameList())){
+            StringBuffer fileNameBuffer = new StringBuffer();
+            for(String fileName : bizSettleEditParam.getFileNameList()){
+                fileNameBuffer.append(fileName+",");
+            }
+            bizSettle.setFileVoucherName(fileNameBuffer.substring(0,fileNameBuffer.length()-1));
+        }
+        if(ObjectUtil.isNotEmpty(bizSettleEditParam.getFilePathList())){
+            StringBuffer filePathBuffer = new StringBuffer();
+            for(String filePath : bizSettleEditParam.getFilePathList()){
+                filePathBuffer.append(filePath+",");
+            }
+            bizSettle.setFileVoucherPath(filePathBuffer.substring(0,filePathBuffer.length()-1));
+        }
+        bizSettle.setSettleStatus("7");
+        this.updateById(bizSettle);
+    }
+
+    @Override
+    public void auditReject(BizSettleAuditParam bizSettleAuditParam) {
+        BizSettle bizSettle = this.queryEntity(bizSettleAuditParam.getId());
+
+        //修改状态
+        UpdateWrapper<BizSettle> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.set("settle_status","5").eq("id",bizSettle.getId());
+        this.update(updateWrapper);
+
+        //插入审核记录
+        BizAuditLog bizAuditLog = new BizAuditLog();
+        bizAuditLog.setType("YFJS");
+        bizAuditLog.setDataId(bizSettle.getId());
+        bizAuditLog.setStatus("2");
+        bizAuditLog.setRemark(bizSettleAuditParam.getSettleReason());
+        bizAuditLogService.save(bizAuditLog);
+    }
 }