Sfoglia il codice sorgente

企业资质备案

heguanxun 9 mesi fa
parent
commit
f47549a37b

+ 231 - 0
snowy-admin-web/src/views/biz/qyrecord/detail.vue

@@ -0,0 +1,231 @@
+<template>
+    <a-card :bordered="false">
+		<a-page-header
+            :title="formData.id ? '编辑企业资质备案' : '新增企业资质备案'"
+			@back="onClose"
+		>
+			<template #extra>
+				<a-button style="margin-right: 8px" @click="onClose">关闭</a-button>
+				<a-popconfirm title="请确认是否保存?" @confirm="onSubmit" v-if="!isView">
+                    <a-button type="primary" :loading="submitLoading">保存</a-button>
+                </a-popconfirm>
+			</template>
+		</a-page-header>
+		<a-form ref="formRef" :model="formData" :rules="formRules" layout="vertical">
+            <a-row :gutter="16">
+                <a-col :span="12">
+                    <a-form-item label="资质类型:" name="zzType">
+                        <a-radio-group v-model:value="formData.zzType" :disabled="isView" placeholder="请选择资质类型" :options="zzTypeOptions" />
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="备案类型:" name="baType">
+                        <a-select v-model:value="formData.baType" :disabled="isView" placeholder="请选择备案类型" :options="baTypeOptions" show-search allow-clear option-filter-prop="label"/>
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="统一社会信用代码:" name="companyCode">
+                        <a-input v-model:value="formData.companyCode" :disabled="isView" placeholder="请输入统一社会信用代码" allow-clear />
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="企业注册名称:" name="companyName">
+                        <a-input v-model:value="formData.companyName" :disabled="isView" placeholder="请输入企业注册名称" allow-clear />
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="法定代表人:" name="companyLegal">
+                        <a-input v-model:value="formData.companyLegal" :disabled="isView" placeholder="请输入法定代表人" allow-clear />
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="法定代表人联系电话:" name="companyLegalPhone">
+                        <a-input v-model:value="formData.companyLegalPhone" :disabled="isView" placeholder="请输入法定代表人联系电话" allow-clear />
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="联系人:" name="companyLinkMan">
+                        <a-input v-model:value="formData.companyLinkMan" :disabled="isView" placeholder="请输入联系人" allow-clear />
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="企业类型:" name="companyType">
+                        <a-select v-model:value="formData.companyType" :disabled="isView" placeholder="请选择企业类型" :options="companyTypeOptions" show-search allow-clear option-filter-prop="label"/>
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="注册资本:" name="companyRegisteredCapital">
+                        <a-input v-model:value="formData.companyRegisteredCapital" :disabled="isView" placeholder="请输入注册资本" allow-clear />
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="成立日期:" name="companyRegisterDate">
+                        <a-date-picker v-model:value="formData.companyRegisterDate" :disabled="isView" value-format="YYYY-MM-DD HH:mm:ss" show-time placeholder="请选择成立日期" style="width: 100%" allow-clear/>
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="企业地址:" name="companyAddress">
+                        <a-input v-model:value="formData.companyAddress" :disabled="isView" placeholder="请输入企业地址" allow-clear />
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="营业期限:" name="companyDeadline">
+                        <a-input v-model:value="formData.companyDeadline" :disabled="isView" placeholder="请输入营业期限" allow-clear />
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="登记机关:" name="companyRegistration">
+                        <a-input v-model:value="formData.companyRegistration" :disabled="isView" placeholder="请输入登记机关" allow-clear />
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="申报企业编号:" name="companyApplyCode">
+                        <a-input v-model:value="formData.companyApplyCode" :disabled="isView" placeholder="请输入申报企业编号" allow-clear />
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="监管场所:" name="companySupervisionPlaceType">
+                        <a-select v-model:value="formData.companySupervisionPlaceType" :disabled="isView" placeholder="请选择监管场所" :options="companySupervisionPlaceTypeOptions" show-search allow-clear option-filter-prop="label"/>
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="主管海关:" name="companyMainHgType">
+                        <a-select v-model:value="formData.companyMainHgType" :disabled="isView" placeholder="请选择主管海关" :options="companyMainHgTypeOptions" show-search allow-clear option-filter-prop="label"/>
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="经营范围:" name="companyJyFw">
+                        <a-textarea v-model:value="formData.companyJyFw" :disabled="isView" placeholder="请输入经营范围" :auto-size="{ minRows: 3, maxRows: 5 }" />
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="申报类型:" name="applyType">
+                        <a-select v-model:value="formData.applyType" :disabled="isView" placeholder="请选择申报类型" :options="applyTypeOptions" show-search allow-clear option-filter-prop="label"/>
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="申报时间:" name="applyTime">
+                        <a-date-picker v-model:value="formData.applyTime" :disabled="isView" value-format="YYYY-MM-DD HH:mm:ss" show-time placeholder="请选择申报时间" style="width: 100%" allow-clear/>
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="申报人:" name="applyMan">
+                        <a-input v-model:value="formData.applyMan" :disabled="isView" placeholder="请输入申报人" allow-clear />
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="享惠类型:" name="applyXhType">
+                        <a-select v-model:value="formData.applyXhType" :disabled="isView" placeholder="请选择享惠类型" :options="applyXhTypeOptions" show-search allow-clear option-filter-prop="label"/>
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="上传附件:" name="applyUrl">
+                        <xn-upload v-model:value="formData.applyUrl" :disabled="isView" />
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="鼓励类产品目录:" name="applyCatalogue">
+                        <a-textarea v-model:value="formData.applyCatalogue" :disabled="isView" placeholder="请输入鼓励类产品目录" :auto-size="{ minRows: 3, maxRows: 5 }" />
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="备注内容:" name="applyRemark">
+                        <a-textarea v-model:value="formData.applyRemark" :disabled="isView" placeholder="请输入备注内容" :auto-size="{ minRows: 3, maxRows: 5 }" />
+                    </a-form-item>
+                </a-col>
+            </a-row>
+        </a-form>
+	</a-card>
+</template>
+
+<script setup name="qyRecordDetail">
+	import tool from '@/utils/tool'
+	import { cloneDeep } from 'lodash-es'
+	import { required } from '@/utils/formRules'
+	import qyRecordApi from '@/api/biz/qyRecordApi'
+	// 抽屉状态
+	const emit = defineEmits({ successful: null })
+	const formRef = ref()
+	// 表单数据
+	const formData = ref({})
+	const submitLoading = ref(false)
+	const isView = ref(false)
+	const zzTypeOptions = ref([])
+	const baTypeOptions = ref([])
+	const companyTypeOptions = ref([])
+	const companySupervisionPlaceTypeOptions = ref([])
+	const companyMainHgTypeOptions = ref([])
+	const applyTypeOptions = ref([])
+	const applyXhTypeOptions = ref([])
+	const statusOptions = ref([])
+
+	// 打开抽屉
+	const onOpen = (record, view = false) => {
+	    isView.value = view
+		if (record) {
+			let recordData = cloneDeep(record)
+			formData.value = Object.assign({}, recordData)
+		}
+		zzTypeOptions.value = tool.dictList('applyzztype')
+		baTypeOptions.value = tool.dictList('qybalx')
+		companyTypeOptions.value = tool.dictList('qylx')
+		companySupervisionPlaceTypeOptions.value = tool.dictList('jtcs')
+		companyMainHgTypeOptions.value = tool.dictList('zhhg')
+		applyTypeOptions.value = tool.dictList('shenbaoleixing')
+		applyXhTypeOptions.value = tool.dictList('xhlx')
+		statusOptions.value = tool.dictList('djzt')
+	}
+	// 关闭抽屉
+	const onClose = () => {
+		formRef.value.resetFields()
+		formData.value = {}
+		isView.value = true
+		emit('onClose')
+	}
+	// 默认要校验的
+	const formRules = {
+		zzType: [required('请输入资质类型')],
+		baType: [required('请输入备案类型')],
+		companyCode: [required('请输入统一社会信用代码')],
+		companyName: [required('请输入企业注册名称')],
+		companyLegal: [required('请输入法定代表人')],
+		companyLegalPhone: [required('请输入法定代表人联系电话')],
+		companyLinkMan: [required('请输入联系人')],
+		companyType: [required('请输入企业类型')],
+		companyRegisteredCapital: [required('请输入注册资本')],
+		companyRegisterDate: [required('请输入成立日期')],
+		companyAddress: [required('请输入企业地址')],
+		companyDeadline: [required('请输入营业期限')],
+		companyRegistration: [required('请输入登记机关')],
+		companySupervisionPlaceType: [required('请输入监管场所')],
+		companyMainHgType: [required('请输入主管海关')],
+		companyJyFw: [required('请输入经营范围')],
+		applyType: [required('请输入申报类型')],
+	}
+	// 验证并提交数据
+	const onSubmit = () => {
+		formRef.value
+			.validate()
+			.then(() => {
+				submitLoading.value = true
+				const formDataParam = cloneDeep(formData.value)
+				qyRecordApi
+					.qyRecordSubmitForm(formDataParam, formDataParam.id)
+					.then(() => {
+						onClose()
+						emit('successful')
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			})
+			.catch(() => {})
+	}
+	// 抛出函数
+	defineExpose({
+		onOpen
+	})
+</script>
+
+<style lang="less" scoped>
+</style>

+ 235 - 0
snowy-admin-web/src/views/biz/qyrecord/index.vue

@@ -0,0 +1,235 @@
+<template>
+	<a-card :bordered="false" v-if="indexShow">
+		<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="companyMainHgType">
+                        <a-select v-model:value="searchFormState.companyMainHgType" placeholder="请选择主管海关" :options="companyMainHgTypeOptions" show-search allow-clear option-filter-prop="label"/>
+                    </a-form-item>
+                </a-col>
+                <a-col :span="6">
+                    <a-form-item label="申报时间" name="applyTime">
+                        <a-range-picker v-model:value="searchFormState.applyTime" value-format="YYYY-MM-DD HH:mm:ss" show-time allow-clear/>
+                    </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 HH:mm:ss" show-time allow-clear/>
+                    </a-form-item>
+                </a-col>
+                <a-col :span="6">
+                    <a-button type="primary" @click="onSearch()">查询</a-button>
+                    <a-button style="margin: 0 8px" @click="reset">重置</a-button>
+                </a-col>
+            </a-row>
+        </a-form>
+		<s-table
+			ref="tableRef"
+			:columns="columns"
+			:data="loadData"
+			:alert="options.alert.show"
+			bordered
+			:row-key="(record) => record.id"
+			:tool-config="toolConfig"
+			:row-selection="options.rowSelection"
+			v-model:filterParam="filterParam"
+			:scroll="{ x: 2000 }"
+		>
+			<template #operator class="table-operator">
+				<a-space>
+					<a-button type="primary" @click="onDetail()" v-if="hasPerm('qyRecordAdd')">
+						<template #icon><plus-outlined /></template>
+						新增
+					</a-button>
+					<xn-batch-delete
+						v-if="hasPerm('qyRecordDelete')"
+						:selectedRowKeys="selectedRowKeys"
+						@batchDelete="deleteBatchQyRecord"
+					/>
+					<a-button @click="onExport" v-if="hasPerm('qyRecordBatchExport')">
+                        <template #icon><export-outlined /></template>
+                        批量导出
+                    </a-button>
+				</a-space>
+			</template>
+			<template #bodyCell="{ column, record }">
+				<template v-if="column.dataIndex === 'companyMainHgType'">
+					{{ $TOOL.dictTypeData('zhhg', record.companyMainHgType) }}
+				</template>
+				<template v-if="column.dataIndex === 'applyType'">
+					{{ $TOOL.dictTypeData('shenbaoleixing', record.applyType) }}
+				</template>
+				<template v-if="column.dataIndex === 'status'">
+					{{ $TOOL.dictTypeData('djzt', record.status) }}
+				</template>
+				<template v-if="column.dataIndex === 'action'">
+					<a-space>
+					    <a @click="onDetail(record, true)" v-if="hasPerm('qyRecordView')">查看</a>
+                        <a-divider type="vertical" v-if="hasPerm('qyRecordView') && hasPerm(['qyRecordEdit', 'qyRecordDelete'], 'or')" />
+						<a @click="onDetail(record)" v-if="hasPerm('qyRecordEdit')">编辑</a>
+						<a-divider type="vertical" v-if="hasPerm(['qyRecordEdit', 'qyRecordDelete'], 'and')" />
+						<a-popconfirm title="确定要删除吗?" @confirm="deleteQyRecord(record)">
+							<a-button type="link" danger size="small" v-if="hasPerm('qyRecordDelete')">删除</a-button>
+						</a-popconfirm>
+					</a-space>
+				</template>
+			</template>
+		</s-table>
+	</a-card>
+	<Detail v-else ref="detailRef" @onClose="indexShow = true" @successful="onSearch()" />
+</template>
+
+<script setup name="qyrecord">
+	import tool from '@/utils/tool'
+	import { cloneDeep } from 'lodash-es'
+	import Detail from './detail.vue'
+	import qyRecordApi from '@/api/biz/qyRecordApi'
+	import downloadUtil from "@/utils/downloadUtil";
+    const { proxy } = getCurrentInstance()
+	const searchFormState = ref({})
+	const searchFormStateReal = ref({}) // 点击搜索后备份的查询参数
+	const searchFormRef = ref()
+	const tableRef = ref()
+	const filterParam = ref({})
+	const detailRef = ref()
+	const indexShow = ref(true)
+	const toolConfig = { refresh: true, height: true, columnSetting: true, striped: false }
+	const columns = [
+		{
+			title: '统一社会信用代码',
+			dataIndex: 'companyCode',
+		},
+		{
+			title: '企业注册名称',
+			dataIndex: 'companyName',
+		},
+		{
+			title: '申报企业编号',
+			dataIndex: 'companyApplyCode',
+		},
+		{
+			title: '主管海关',
+			dataIndex: 'companyMainHgType',
+		},
+		{
+			title: '申报类型',
+			dataIndex: 'applyType',
+		},
+		{
+			title: '申报时间',
+			dataIndex: 'applyTime',
+		},
+		{
+			title: '单据状态',
+			dataIndex: 'status',
+		},
+		{
+			title: '录入时间',
+			dataIndex: 'createTime',
+		},
+	]
+	// 操作栏通过权限判断是否显示
+	if (hasPerm(['qyRecordEdit', 'qyRecordDelete'])) {
+		columns.push({
+			title: '操作',
+			dataIndex: 'action',
+			align: 'center',
+			width: 200,
+			fixed: 'right',
+		})
+	}
+	const selectedRowKeys = ref([])
+	// 列表选择配置
+	const options = {
+		// columns数字类型字段加入 needTotal: true 可以勾选自动算账
+		alert: {
+			show: true,
+			clear: () => {
+				selectedRowKeys.value = ref([])
+			}
+		},
+		rowSelection: {
+			onChange: (selectedRowKey, selectedRows) => {
+				selectedRowKeys.value = selectedRowKey
+			}
+		}
+	}
+	const loadData = (parameter) => {
+        tableRef.value.clearSelected()
+        // applyTime范围查询条件重载
+        if (searchFormStateReal.value.applyTime) {
+            searchFormStateReal.value.startApplyTime = searchFormStateReal.value.applyTime[0]
+            searchFormStateReal.value.endApplyTime = searchFormStateReal.value.applyTime[1]
+            delete searchFormStateReal.value.applyTime
+        }
+        // createTime范围查询条件重载
+        if (searchFormStateReal.value.createTime) {
+            searchFormStateReal.value.startCreateTime = searchFormStateReal.value.createTime[0]
+            searchFormStateReal.value.endCreateTime = searchFormStateReal.value.createTime[1]
+            delete searchFormStateReal.value.createTime
+        }
+        return qyRecordApi.qyRecordPage(Object.assign(parameter, searchFormStateReal.value)).then((data) => {
+            return data
+        })
+    }
+    // 搜索同时备份参数
+    const onSearch = (parameter) => {
+        searchFormStateReal.value = cloneDeep(searchFormState.value)
+        nextTick(() => {
+            tableRef.value.refresh(parameter)
+        })
+    }
+    // 重置
+    const reset = () => {
+        searchFormRef.value.resetFields()
+        onSearch(true)
+    }
+	// 删除
+	const deleteQyRecord = (record) => {
+		let params = [
+			{
+				id: record.id
+			}
+		]
+		qyRecordApi.qyRecordDelete(params).then(() => {
+			tableRef.value.refresh(true)
+		})
+	}
+	// 批量删除
+	const deleteBatchQyRecord = (params) => {
+		qyRecordApi.qyRecordDelete(params).then(() => {
+			tableRef.value.clearRefreshSelected()
+		})
+	}
+	// 批量导出
+    const onExport = () => {
+        const params = {
+            ...filterParam.value
+        }
+        if (selectedRowKeys.value.length > 0) {
+            params.ids = selectedRowKeys.value
+        } else {
+            Object.entries(searchFormStateReal.value).forEach(([key, value]) => {
+                console.log(key)
+                if (proxy.$util.isValue(value)) {
+                    params[key] = value
+                }
+            })
+        }
+        qyRecordApi.qyRecordExport(params).then((res) => {
+            downloadUtil.resultDownload(res)
+            tableRef.value.clearSelected()
+        })
+    }
+	// 切换至表单
+    const onDetail = (record = null, view) => {
+    	indexShow.value = false
+    	nextTick(() => {
+            detailRef.value.onOpen(record, view)
+    	})
+    }
+	const companyMainHgTypeOptions = tool.dictList('zhhg')
+</script>
+
+<style lang="less" scoped>
+</style>

+ 174 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/qyrecord/controller/QyRecordController.java

@@ -0,0 +1,174 @@
+/*
+ * 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.qyrecord.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.hutool.core.util.URLUtil;
+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.qyrecord.entity.QyRecord;
+import vip.xiaonuo.biz.modular.qyrecord.param.QyRecordAddParam;
+import vip.xiaonuo.biz.modular.qyrecord.param.QyRecordEditParam;
+import vip.xiaonuo.biz.modular.qyrecord.param.QyRecordIdParam;
+import vip.xiaonuo.biz.modular.qyrecord.param.QyRecordPageParam;
+import vip.xiaonuo.biz.modular.qyrecord.service.QyRecordService;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.annotation.Resource;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotEmpty;
+import java.util.List;
+import java.io.IOException;
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.fastjson.JSON;
+import java.net.URLEncoder;
+import java.util.HashMap;
+
+/**
+ * 企业资质备案控制器
+ *
+ * @author hgx
+ * @date  2024/07/04 16:52
+ */
+@Tag(name = "企业资质备案控制器")
+@RestController
+@Validated
+public class QyRecordController {
+
+    @Resource
+    private QyRecordService qyRecordService;
+
+    /**
+     * 获取企业资质备案分页
+     *
+     * @author hgx
+     * @date  2024/07/04 16:52
+     */
+    @Operation(summary = "获取企业资质备案分页")
+    @SaCheckPermission("/biz/qyrecord/page")
+    @GetMapping("/biz/qyrecord/page")
+    public CommonResult<Page<QyRecord>> page(QyRecordPageParam qyRecordPageParam) {
+        return CommonResult.data(qyRecordService.page(qyRecordPageParam));
+    }
+
+    /**
+     * 添加企业资质备案
+     *
+     * @author hgx
+     * @date  2024/07/04 16:52
+     */
+    @Operation(summary = "添加企业资质备案")
+    @CommonLog("添加企业资质备案")
+    @SaCheckPermission("/biz/qyrecord/add")
+    @PostMapping("/biz/qyrecord/add")
+    public CommonResult<String> add(@RequestBody @Valid QyRecordAddParam qyRecordAddParam) {
+        qyRecordService.add(qyRecordAddParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 编辑企业资质备案
+     *
+     * @author hgx
+     * @date  2024/07/04 16:52
+     */
+    @Operation(summary = "编辑企业资质备案")
+    @CommonLog("编辑企业资质备案")
+    @SaCheckPermission("/biz/qyrecord/edit")
+    @PostMapping("/biz/qyrecord/edit")
+    public CommonResult<String> edit(@RequestBody @Valid QyRecordEditParam qyRecordEditParam) {
+        qyRecordService.edit(qyRecordEditParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 导出企业资质备案
+     *
+     * @author hgx
+     * @date  2024/07/04 16:52
+     */
+    @Operation(summary = "导出企业资质备案")
+    @CommonLog("导出企业资质备案")
+    @SaCheckPermission("/biz/qyrecord/export")
+    @PostMapping("/biz/qyrecord/export")
+    public void export(@RequestBody @Valid QyRecordPageParam qyRecordPageParam, HttpServletResponse response) {
+        Page<QyRecord> page =  qyRecordService.page(qyRecordPageParam);
+        List<QyRecord> records = page.getRecords();
+        exportExcel(response,QyRecord.class,records,"企业资质备案");
+    }
+
+
+    /**
+     * 导出表格数据
+     * @param cl       表格字段实体类
+     * @param data     查询数据
+     * @param sheetName  表格名称
+     */
+    public void exportExcel(HttpServletResponse response, Class cl, List data, String sheetName){
+       HashMap<String, String> map = new HashMap<>();
+       try {
+           response.setHeader("Content-disposition", "attachment;filename=" + URLUtil.encode(sheetName) + ".xlsx");
+           response.setHeader("Access-Control-Allow-Origin", "*");
+           response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
+           response.setContentType("application/octet-stream;charset=UTF-8");
+           EasyExcel.write(response.getOutputStream(), cl).autoCloseStream(Boolean.FALSE).sheet(sheetName).doWrite(data);
+       } catch (IOException e) {
+           response.reset();
+           response.setContentType("application/json");
+           response.setCharacterEncoding("utf-8");
+           map.put("status", "failure");
+           map.put("message", "下载文件失败" + e.getMessage());
+           try {
+               response.getWriter().println(JSON.toJSONString(map));
+           } catch (IOException ex) {
+               ex.printStackTrace();
+           }
+       }
+    }
+
+    /**
+     * 删除企业资质备案
+     *
+     * @author hgx
+     * @date  2024/07/04 16:52
+     */
+    @Operation(summary = "删除企业资质备案")
+    @CommonLog("删除企业资质备案")
+    @SaCheckPermission("/biz/qyrecord/delete")
+    @PostMapping("/biz/qyrecord/delete")
+    public CommonResult<String> delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空")
+                                                   List<QyRecordIdParam> qyRecordIdParamList) {
+        qyRecordService.delete(qyRecordIdParamList);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 获取企业资质备案详情
+     *
+     * @author hgx
+     * @date  2024/07/04 16:52
+     */
+    @Operation(summary = "获取企业资质备案详情")
+    @SaCheckPermission("/biz/qyrecord/detail")
+    @GetMapping("/biz/qyrecord/detail")
+    public CommonResult<QyRecord> detail(@Valid QyRecordIdParam qyRecordIdParam) {
+        return CommonResult.data(qyRecordService.detail(qyRecordIdParam));
+    }
+}

+ 226 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/qyrecord/entity/QyRecord.java

@@ -0,0 +1,226 @@
+/*
+ * 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.qyrecord.entity;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 企业资质备案实体
+ *
+ * @author hgx
+ * @date  2024/07/04 16:52
+ **/
+@Getter
+@Setter
+@TableName("qy_record")
+public class QyRecord {
+
+    /** ID */
+    @TableId
+    @Schema(description = "ID")
+    @ColumnWidth(12)
+    @ExcelProperty(index = 0,value = "ID")
+    private String id;
+
+    /** 资质类型 */
+    @Schema(description = "资质类型")
+    @ColumnWidth(12)
+    @ExcelProperty(index = 1,value = "资质类型")
+    private String zzType;
+
+    /** 备案类型 */
+    @Schema(description = "备案类型")
+    @ColumnWidth(12)
+    @ExcelProperty(index = 2,value = "备案类型")
+    private String baType;
+
+    /** 统一社会信用代码 */
+    @Schema(description = "统一社会信用代码")
+    @ColumnWidth(12)
+    @ExcelProperty(index = 3,value = "统一社会信用代码")
+    private String companyCode;
+
+    /** 企业注册名称 */
+    @Schema(description = "企业注册名称")
+    @ColumnWidth(12)
+    @ExcelProperty(index = 4,value = "企业注册名称")
+    private String companyName;
+
+    /** 法定代表人 */
+    @Schema(description = "法定代表人")
+    @ColumnWidth(12)
+    @ExcelProperty(index = 5,value = "法定代表人")
+    private String companyLegal;
+
+    /** 法定代表人联系电话 */
+    @Schema(description = "法定代表人联系电话")
+    @ColumnWidth(12)
+    @ExcelProperty(index = 6,value = "法定代表人联系电话")
+    private String companyLegalPhone;
+
+    /** 联系人 */
+    @Schema(description = "联系人")
+    @ColumnWidth(12)
+    @ExcelProperty(index = 7,value = "联系人")
+    private String companyLinkMan;
+
+    /** 企业类型 */
+    @Schema(description = "企业类型")
+    @ColumnWidth(12)
+    @ExcelProperty(index = 8,value = "企业类型")
+    private String companyType;
+
+    /** 注册资本 */
+    @Schema(description = "注册资本")
+    @ColumnWidth(12)
+    @ExcelProperty(index = 9,value = "注册资本")
+    private String companyRegisteredCapital;
+
+    /** 成立日期 */
+    @Schema(description = "成立日期")
+    @ColumnWidth(12)
+    @ExcelProperty(index = 10,value = "成立日期")
+    private Date companyRegisterDate;
+
+    /** 企业地址 */
+    @Schema(description = "企业地址")
+    @ColumnWidth(12)
+    @ExcelProperty(index = 11,value = "企业地址")
+    private String companyAddress;
+
+    /** 营业期限 */
+    @Schema(description = "营业期限")
+    @ColumnWidth(12)
+    @ExcelProperty(index = 12,value = "营业期限")
+    private String companyDeadline;
+
+    /** 登记机关 */
+    @Schema(description = "登记机关")
+    @ColumnWidth(12)
+    @ExcelProperty(index = 13,value = "登记机关")
+    private String companyRegistration;
+
+    /** 申报企业编号 */
+    @Schema(description = "申报企业编号")
+    @ColumnWidth(12)
+    @ExcelProperty(index = 14,value = "申报企业编号")
+    private String companyApplyCode;
+
+    /** 监管场所 */
+    @Schema(description = "监管场所")
+    @ColumnWidth(12)
+    @ExcelProperty(index = 15,value = "监管场所")
+    private String companySupervisionPlaceType;
+
+    /** 主管海关 */
+    @Schema(description = "主管海关")
+    @ColumnWidth(12)
+    @ExcelProperty(index = 16,value = "主管海关")
+    private String companyMainHgType;
+
+    /** 经营范围 */
+    @Schema(description = "经营范围")
+    @ColumnWidth(12)
+    @ExcelProperty(index = 17,value = "经营范围")
+    private String companyJyFw;
+
+    /** 申报类型 */
+    @Schema(description = "申报类型")
+    @ColumnWidth(12)
+    @ExcelProperty(index = 18,value = "申报类型")
+    private String applyType;
+
+    /** 申报时间 */
+    @Schema(description = "申报时间")
+    @ColumnWidth(12)
+    @ExcelProperty(index = 19,value = "申报时间")
+    private Date applyTime;
+
+    /** 申报人 */
+    @Schema(description = "申报人")
+    @ColumnWidth(12)
+    @ExcelProperty(index = 20,value = "申报人")
+    private String applyMan;
+
+    /** 享惠类型 */
+    @Schema(description = "享惠类型")
+    @ColumnWidth(12)
+    @ExcelProperty(index = 21,value = "享惠类型")
+    private String applyXhType;
+
+    /** 上传附件 */
+    @Schema(description = "上传附件")
+    @ColumnWidth(12)
+    @ExcelProperty(index = 22,value = "上传附件")
+    private String applyUrl;
+
+    /** 鼓励类产品目录 */
+    @Schema(description = "鼓励类产品目录")
+    @ColumnWidth(12)
+    @ExcelProperty(index = 23,value = "鼓励类产品目录")
+    private String applyCatalogue;
+
+    /** 备注内容 */
+    @Schema(description = "备注内容")
+    @ColumnWidth(12)
+    @ExcelProperty(index = 24,value = "备注内容")
+    private String applyRemark;
+
+    /** 单据状态 */
+    @Schema(description = "单据状态")
+    @ColumnWidth(12)
+    @ExcelProperty(index = 25,value = "单据状态")
+    private String status;
+
+    /** 创建人 */
+    @Schema(description = "创建人")
+    @ColumnWidth(12)
+    @ExcelProperty(index = 26,value = "创建人")
+    @TableField(fill = FieldFill.INSERT)
+    private String createUser;
+
+    /** 录入时间 */
+    @Schema(description = "录入时间")
+    @ColumnWidth(12)
+    @ExcelProperty(index = 27,value = "录入时间")
+    @TableField(fill = FieldFill.INSERT)
+    private Date createTime;
+
+    /** 更新人 */
+    @Schema(description = "更新人")
+    @ColumnWidth(12)
+    @ExcelProperty(index = 28,value = "更新人")
+    @TableField(fill = FieldFill.UPDATE)
+    private String updateUser;
+
+    /** 更新时间 */
+    @Schema(description = "更新时间")
+    @ColumnWidth(12)
+    @ExcelProperty(index = 29,value = "更新时间")
+    @TableField(fill = FieldFill.UPDATE)
+    private Date updateTime;
+
+    /** 删除状态 */
+    @Schema(description = "删除状态")
+    @ColumnWidth(12)
+    @ExcelProperty(index = 30,value = "删除状态")
+    @TableLogic
+    @TableField(fill = FieldFill.INSERT)
+    private String deleteFlag;
+}

+ 34 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/qyrecord/enums/QyRecordEnum.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.qyrecord.enums;
+
+import lombok.Getter;
+
+/**
+ * 企业资质备案枚举
+ *
+ * @author hgx
+ * @date  2024/07/04 16:52
+ **/
+@Getter
+public enum QyRecordEnum {
+
+    /** 测试 */
+    TEST("TEST");
+
+    private final String value;
+
+    QyRecordEnum(String value) {
+        this.value = value;
+    }
+}

+ 25 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/qyrecord/mapper/QyRecordMapper.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.qyrecord.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import vip.xiaonuo.biz.modular.qyrecord.entity.QyRecord;
+
+/**
+ * 企业资质备案Mapper接口
+ *
+ * @author hgx
+ * @date  2024/07/04 16:52
+ **/
+public interface QyRecordMapper extends BaseMapper<QyRecord> {
+}

+ 5 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/qyrecord/mapper/mapping/QyRecordMapper.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.qyrecord.mapper.QyRecordMapper">
+
+</mapper>

+ 147 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/qyrecord/param/QyRecordAddParam.java

@@ -0,0 +1,147 @@
+/*
+ * 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.qyrecord.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 hgx
+ * @date  2024/07/04 16:52
+ **/
+@Getter
+@Setter
+public class QyRecordAddParam {
+
+    /** 资质类型 */
+    @Schema(description = "资质类型", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "zzType不能为空")
+    private String zzType;
+
+    /** 备案类型 */
+    @Schema(description = "备案类型", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "baType不能为空")
+    private String baType;
+
+    /** 统一社会信用代码 */
+    @Schema(description = "统一社会信用代码", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "companyCode不能为空")
+    private String companyCode;
+
+    /** 企业注册名称 */
+    @Schema(description = "企业注册名称", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "companyName不能为空")
+    private String companyName;
+
+    /** 法定代表人 */
+    @Schema(description = "法定代表人", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "companyLegal不能为空")
+    private String companyLegal;
+
+    /** 法定代表人联系电话 */
+    @Schema(description = "法定代表人联系电话", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "companyLegalPhone不能为空")
+    private String companyLegalPhone;
+
+    /** 联系人 */
+    @Schema(description = "联系人", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "companyLinkMan不能为空")
+    private String companyLinkMan;
+
+    /** 企业类型 */
+    @Schema(description = "企业类型", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "companyType不能为空")
+    private String companyType;
+
+    /** 注册资本 */
+    @Schema(description = "注册资本", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "companyRegisteredCapital不能为空")
+    private String companyRegisteredCapital;
+
+    /** 成立日期 */
+    @Schema(description = "成立日期", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "companyRegisterDate不能为空")
+    private Date companyRegisterDate;
+
+    /** 企业地址 */
+    @Schema(description = "企业地址", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "companyAddress不能为空")
+    private String companyAddress;
+
+    /** 营业期限 */
+    @Schema(description = "营业期限", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "companyDeadline不能为空")
+    private String companyDeadline;
+
+    /** 登记机关 */
+    @Schema(description = "登记机关", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "companyRegistration不能为空")
+    private String companyRegistration;
+
+    /** 申报企业编号 */
+    @Schema(description = "申报企业编号")
+    private String companyApplyCode;
+
+    /** 监管场所 */
+    @Schema(description = "监管场所", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "companySupervisionPlaceType不能为空")
+    private String companySupervisionPlaceType;
+
+    /** 主管海关 */
+    @Schema(description = "主管海关", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "companyMainHgType不能为空")
+    private String companyMainHgType;
+
+    /** 经营范围 */
+    @Schema(description = "经营范围", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "companyJyFw不能为空")
+    private String companyJyFw;
+
+    /** 申报类型 */
+    @Schema(description = "申报类型", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "applyType不能为空")
+    private String applyType;
+
+    /** 申报时间 */
+    @Schema(description = "申报时间")
+    private Date applyTime;
+
+    /** 申报人 */
+    @Schema(description = "申报人")
+    private String applyMan;
+
+    /** 享惠类型 */
+    @Schema(description = "享惠类型")
+    private String applyXhType;
+
+    /** 上传附件 */
+    @Schema(description = "上传附件")
+    private String applyUrl;
+
+    /** 鼓励类产品目录 */
+    @Schema(description = "鼓励类产品目录")
+    private String applyCatalogue;
+
+    /** 备注内容 */
+    @Schema(description = "备注内容")
+    private String applyRemark;
+
+}

+ 152 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/qyrecord/param/QyRecordEditParam.java

@@ -0,0 +1,152 @@
+/*
+ * 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.qyrecord.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 hgx
+ * @date  2024/07/04 16:52
+ **/
+@Getter
+@Setter
+public class QyRecordEditParam {
+
+    /** ID */
+    @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "id不能为空")
+    private String id;
+
+    /** 资质类型 */
+    @Schema(description = "资质类型", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "zzType不能为空")
+    private String zzType;
+
+    /** 备案类型 */
+    @Schema(description = "备案类型", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "baType不能为空")
+    private String baType;
+
+    /** 统一社会信用代码 */
+    @Schema(description = "统一社会信用代码", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "companyCode不能为空")
+    private String companyCode;
+
+    /** 企业注册名称 */
+    @Schema(description = "企业注册名称", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "companyName不能为空")
+    private String companyName;
+
+    /** 法定代表人 */
+    @Schema(description = "法定代表人", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "companyLegal不能为空")
+    private String companyLegal;
+
+    /** 法定代表人联系电话 */
+    @Schema(description = "法定代表人联系电话", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "companyLegalPhone不能为空")
+    private String companyLegalPhone;
+
+    /** 联系人 */
+    @Schema(description = "联系人", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "companyLinkMan不能为空")
+    private String companyLinkMan;
+
+    /** 企业类型 */
+    @Schema(description = "企业类型", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "companyType不能为空")
+    private String companyType;
+
+    /** 注册资本 */
+    @Schema(description = "注册资本", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "companyRegisteredCapital不能为空")
+    private String companyRegisteredCapital;
+
+    /** 成立日期 */
+    @Schema(description = "成立日期", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "companyRegisterDate不能为空")
+    private Date companyRegisterDate;
+
+    /** 企业地址 */
+    @Schema(description = "企业地址", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "companyAddress不能为空")
+    private String companyAddress;
+
+    /** 营业期限 */
+    @Schema(description = "营业期限", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "companyDeadline不能为空")
+    private String companyDeadline;
+
+    /** 登记机关 */
+    @Schema(description = "登记机关", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "companyRegistration不能为空")
+    private String companyRegistration;
+
+    /** 申报企业编号 */
+    @Schema(description = "申报企业编号")
+    private String companyApplyCode;
+
+    /** 监管场所 */
+    @Schema(description = "监管场所", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "companySupervisionPlaceType不能为空")
+    private String companySupervisionPlaceType;
+
+    /** 主管海关 */
+    @Schema(description = "主管海关", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "companyMainHgType不能为空")
+    private String companyMainHgType;
+
+    /** 经营范围 */
+    @Schema(description = "经营范围", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "companyJyFw不能为空")
+    private String companyJyFw;
+
+    /** 申报类型 */
+    @Schema(description = "申报类型", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "applyType不能为空")
+    private String applyType;
+
+    /** 申报时间 */
+    @Schema(description = "申报时间")
+    private Date applyTime;
+
+    /** 申报人 */
+    @Schema(description = "申报人")
+    private String applyMan;
+
+    /** 享惠类型 */
+    @Schema(description = "享惠类型")
+    private String applyXhType;
+
+    /** 上传附件 */
+    @Schema(description = "上传附件")
+    private String applyUrl;
+
+    /** 鼓励类产品目录 */
+    @Schema(description = "鼓励类产品目录")
+    private String applyCatalogue;
+
+    /** 备注内容 */
+    @Schema(description = "备注内容")
+    private String applyRemark;
+
+}

+ 35 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/qyrecord/param/QyRecordIdParam.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.qyrecord.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import jakarta.validation.constraints.NotBlank;
+
+/**
+ * 企业资质备案Id参数
+ *
+ * @author hgx
+ * @date  2024/07/04 16:52
+ **/
+@Getter
+@Setter
+public class QyRecordIdParam {
+
+    /** ID */
+    @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "id不能为空")
+    private String id;
+}

+ 71 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/qyrecord/param/QyRecordPageParam.java

@@ -0,0 +1,71 @@
+/*
+ * 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.qyrecord.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 企业资质备案查询参数
+ *
+ * @author hgx
+ * @date  2024/07/04 16:52
+ **/
+@Getter
+@Setter
+public class QyRecordPageParam {
+
+    /** 当前页 */
+    @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;
+
+    /** 主管海关 */
+    @Schema(description = "主管海关")
+    private String companyMainHgType;
+
+    /** 申报时间开始 */
+    @Schema(description = "申报时间开始")
+    private String startApplyTime;
+
+    /** 申报时间结束 */
+    @Schema(description = "申报时间结束")
+    private String endApplyTime;
+
+    /** 录入时间开始 */
+    @Schema(description = "录入时间开始")
+    private String startCreateTime;
+
+    /** 录入时间结束 */
+    @Schema(description = "录入时间结束")
+    private String endCreateTime;
+
+}

+ 80 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/qyrecord/service/QyRecordService.java

@@ -0,0 +1,80 @@
+/*
+ * 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.qyrecord.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import vip.xiaonuo.biz.modular.qyrecord.entity.QyRecord;
+import vip.xiaonuo.biz.modular.qyrecord.param.QyRecordAddParam;
+import vip.xiaonuo.biz.modular.qyrecord.param.QyRecordEditParam;
+import vip.xiaonuo.biz.modular.qyrecord.param.QyRecordIdParam;
+import vip.xiaonuo.biz.modular.qyrecord.param.QyRecordPageParam;
+
+import java.util.List;
+
+/**
+ * 企业资质备案Service接口
+ *
+ * @author hgx
+ * @date  2024/07/04 16:52
+ **/
+public interface QyRecordService extends IService<QyRecord> {
+
+    /**
+     * 获取企业资质备案分页
+     *
+     * @author hgx
+     * @date  2024/07/04 16:52
+     */
+    Page<QyRecord> page(QyRecordPageParam qyRecordPageParam);
+
+    /**
+     * 添加企业资质备案
+     *
+     * @author hgx
+     * @date  2024/07/04 16:52
+     */
+    void add(QyRecordAddParam qyRecordAddParam);
+
+    /**
+     * 编辑企业资质备案
+     *
+     * @author hgx
+     * @date  2024/07/04 16:52
+     */
+    void edit(QyRecordEditParam qyRecordEditParam);
+
+    /**
+     * 删除企业资质备案
+     *
+     * @author hgx
+     * @date  2024/07/04 16:52
+     */
+    void delete(List<QyRecordIdParam> qyRecordIdParamList);
+
+    /**
+     * 获取企业资质备案详情
+     *
+     * @author hgx
+     * @date  2024/07/04 16:52
+     */
+    QyRecord detail(QyRecordIdParam qyRecordIdParam);
+
+    /**
+     * 获取企业资质备案详情
+     *
+     * @author hgx
+     * @date  2024/07/04 16:52
+     **/
+    QyRecord queryEntity(String id);
+}

+ 103 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/qyrecord/service/impl/QyRecordServiceImpl.java

@@ -0,0 +1,103 @@
+/*
+ * 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.qyrecord.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.qyrecord.entity.QyRecord;
+import vip.xiaonuo.biz.modular.qyrecord.mapper.QyRecordMapper;
+import vip.xiaonuo.biz.modular.qyrecord.param.QyRecordAddParam;
+import vip.xiaonuo.biz.modular.qyrecord.param.QyRecordEditParam;
+import vip.xiaonuo.biz.modular.qyrecord.param.QyRecordIdParam;
+import vip.xiaonuo.biz.modular.qyrecord.param.QyRecordPageParam;
+import vip.xiaonuo.biz.modular.qyrecord.service.QyRecordService;
+
+import java.util.List;
+
+/**
+ * 企业资质备案Service接口实现类
+ *
+ * @author hgx
+ * @date  2024/07/04 16:52
+ **/
+@Service
+public class QyRecordServiceImpl extends ServiceImpl<QyRecordMapper, QyRecord> implements QyRecordService {
+
+    @Override
+    public Page<QyRecord> page(QyRecordPageParam qyRecordPageParam) {
+        QueryWrapper<QyRecord> queryWrapper = new QueryWrapper<QyRecord>().checkSqlInjection();
+        if(ObjectUtil.isNotEmpty(qyRecordPageParam.getCompanyMainHgType())) {
+            queryWrapper.lambda().eq(QyRecord::getCompanyMainHgType, qyRecordPageParam.getCompanyMainHgType());
+        }
+        if(ObjectUtil.isNotEmpty(qyRecordPageParam.getStartApplyTime()) && ObjectUtil.isNotEmpty(qyRecordPageParam.getEndApplyTime())) {
+            queryWrapper.lambda().between(QyRecord::getApplyTime, qyRecordPageParam.getStartApplyTime(), qyRecordPageParam.getEndApplyTime());
+        }
+        if(ObjectUtil.isNotEmpty(qyRecordPageParam.getStartCreateTime()) && ObjectUtil.isNotEmpty(qyRecordPageParam.getEndCreateTime())) {
+            queryWrapper.lambda().between(QyRecord::getCreateTime, qyRecordPageParam.getStartCreateTime(), qyRecordPageParam.getEndCreateTime());
+        }
+        if(ObjectUtil.isAllNotEmpty(qyRecordPageParam.getSortField(), qyRecordPageParam.getSortOrder())) {
+            CommonSortOrderEnum.validate(qyRecordPageParam.getSortOrder());
+            queryWrapper.orderBy(true, qyRecordPageParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()),
+                    StrUtil.toUnderlineCase(qyRecordPageParam.getSortField()));
+        } else {
+            queryWrapper.lambda().orderByAsc(QyRecord::getId);
+        }
+        return this.page(CommonPageRequest.defaultPage(), queryWrapper);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void add(QyRecordAddParam qyRecordAddParam) {
+        QyRecord qyRecord = BeanUtil.toBean(qyRecordAddParam, QyRecord.class);
+        this.save(qyRecord);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void edit(QyRecordEditParam qyRecordEditParam) {
+        QyRecord qyRecord = this.queryEntity(qyRecordEditParam.getId());
+        BeanUtil.copyProperties(qyRecordEditParam, qyRecord);
+        this.updateById(qyRecord);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void delete(List<QyRecordIdParam> qyRecordIdParamList) {
+        // 执行删除
+        this.removeByIds(CollStreamUtil.toList(qyRecordIdParamList, QyRecordIdParam::getId));
+    }
+
+    @Override
+    public QyRecord detail(QyRecordIdParam qyRecordIdParam) {
+        return this.queryEntity(qyRecordIdParam.getId());
+    }
+
+    @Override
+    public QyRecord queryEntity(String id) {
+        QyRecord qyRecord = this.getById(id);
+        if(ObjectUtil.isEmpty(qyRecord)) {
+            throw new CommonException("企业资质备案不存在,id值为:{}", id);
+        }
+        return qyRecord;
+    }
+}