CzRger vor 9 Monaten
Ursprung
Commit
af1e0be60a

+ 34 - 0
snowy-admin-web/src/api/biz/qySecondlineHzdProductApi.js

@@ -0,0 +1,34 @@
+import { baseRequest } from '@/utils/request'
+
+const request = (url, ...arg) => baseRequest(`/biz/qysecondlinehzdproduct/` + url, ...arg)
+
+/**
+ * 二线核注清单商品表Api接口管理器
+ *
+ * @author 曹钊瑞
+ * @date  2024/07/06 20:03
+ **/
+export default {
+	// 获取二线核注清单商品表分页
+	qySecondlineHzdProductPage(data) {
+		return request('page', data, 'get')
+	},
+	// 提交二线核注清单商品表表单 edit为true时为编辑,默认为新增
+	qySecondlineHzdProductSubmitForm(data, edit = false) {
+		return request(edit ? 'edit' : 'add', data)
+	},
+	// 删除二线核注清单商品表
+	qySecondlineHzdProductDelete(data) {
+		return request('delete', data)
+	},
+	// 导出二线核注清单商品表
+    qySecondlineHzdProductExport(data) {
+        return request('export', data, 'post', {
+            responseType: 'blob'
+        })
+    },
+	// 获取二线核注清单商品表详情
+	qySecondlineHzdProductDetail(data) {
+		return request('detail', data, 'get')
+	}
+}

+ 43 - 10
snowy-admin-web/src/api/yqyc/qySecondLineHzdTzApi.js

@@ -1,21 +1,54 @@
 import { baseRequest } from '@/utils/request'
 
 const request = (url, ...arg) => baseRequest(`/biz/qysecondlinehzdtz/` + url, ...arg)
+
+/**
+ * 二线核注单台账信息Api接口管理器
+ *
+ * @author 曹钊瑞
+ * @date  2024/07/06 19:48
+ **/
 export default {
-	// 获取台账编号列表
-	qySecondLineHzdTzTzCodeByCondition(data) {
+	// 获取二线核注单台账信息分页
+	qySecondlineHzdTzPage(data) {
+		return request('page', data, 'get')
+	},
+	// 提交二线核注单台账信息表单 edit为true时为编辑,默认为新增
+	qySecondlineHzdTzSubmitForm(data, edit = false) {
+		return request(edit ? 'edit' : 'add', data)
+	},
+	// 删除二线核注单台账信息
+	qySecondlineHzdTzDelete(data) {
+		return request('delete', data)
+	},
+	// 导出二线核注单台账信息
+    qySecondlineHzdTzExport(data) {
+        return request('export', data, 'post', {
+            responseType: 'blob'
+        })
+    },
+	// 获取二线核注单台账信息详情
+	qySecondlineHzdTzDetail(data) {
+		return request('detail', data, 'get')
+	},
+	// 获取二线核注单台账信息台账编号
+	qySecondlineHzdTzQyRecordInfo(data) {
+		return request('qyRecordInfo', data, 'get')
+	},
+	// 获取二线核注单台账信息表体
+	qySecondlineHzdTzQyProductById(data) {
+		return request('qyProductById', data, 'get')
+	},
+	qySecondlineHzdTzTzCodeByCondition(data) {
 		return request('tzCodeByCondition', data, 'get')
 	},
-	// 获取关联核注单编号
-	qySecondLineHzdTzHgHzdCodeByTzCode(data) {
+	qySecondlineHzdTzHgHzdCodeByTzCode(data) {
 		return request('hgHzdCodeByTzCode', data, 'get')
 	},
-	// 获取表体
-	qySecondLineHzdTzGetProductByHgHzdCode(data) {
+	qySecondlineHzdTzGetProductByHgHzdCode(data) {
 		return request('getProductByHgHzdCode', data, 'get')
 	},
-	// 获取回执
-	qySecondLineHzdTzGetListByHfdId(data) {
-		return baseRequest('/biz/qysecondlinehfdlist/getListByHfdId', data, 'get')
-	},
+	qySecondlineHzdTzGetHzListByTzId(data) {
+		return request('getHzListByTzId', data, 'get')
+	}
 }

+ 3 - 0
snowy-admin-web/src/api/yqyc/qySecondlineHfdApi.js

@@ -30,5 +30,8 @@ export default {
 	// 获取二线出区核放单管理详情
 	qySecondlineHfdDetail(data) {
 		return request('detail', data, 'get')
+	},
+	qysecondlinehfdlistGetListByHfdId(data) {
+		return baseRequest(`/biz/qysecondlinehfdlist/getListByHfdId`, data, 'get')
 	}
 }

+ 324 - 0
snowy-admin-web/src/views/biz/qysecondlinehzdproduct/detail.vue

@@ -0,0 +1,324 @@
+<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="productOrderCode">
+                        <a-input v-model:value="formData.productOrderCode" :disabled="isView" placeholder="请输入商品序号" allow-clear />
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="报关单商品序号:" name="bgdProductOrderCode">
+                        <a-input v-model:value="formData.bgdProductOrderCode" :disabled="isView" placeholder="请输入报关单商品序号" allow-clear />
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="备案序号:" name="recordCode">
+                        <a-input v-model:value="formData.recordCode" :disabled="isView" placeholder="请输入备案序号" allow-clear />
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="通知书序号:" name="noticeCode">
+                        <a-input v-model:value="formData.noticeCode" :disabled="isView" placeholder="请输入通知书序号" allow-clear />
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="商品编码:" name="productCode">
+                        <a-input v-model:value="formData.productCode" :disabled="isView" placeholder="请输入商品编码" allow-clear />
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="商品名称:" name="productName">
+                        <a-input v-model:value="formData.productName" :disabled="isView" placeholder="请输入商品名称" allow-clear />
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="规格型号:" name="specModel">
+                        <a-input v-model:value="formData.specModel" :disabled="isView" placeholder="请输入规格型号" allow-clear />
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="申报数量:" name="sbNum">
+                        <a-input v-model:value="formData.sbNum" :disabled="isView" placeholder="请输入申报数量" allow-clear />
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="申报计量单位:" name="declareUnit">
+                        <a-select v-model:value="formData.declareUnit" :disabled="isView" placeholder="请选择申报计量单位" :options="declareUnitOptions" show-search allow-clear option-filter-prop="label"/>
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="企业申报单价:" name="companySbPrice">
+                        <a-input v-model:value="formData.companySbPrice" :disabled="isView" placeholder="请输入企业申报单价" allow-clear />
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="企业申报总价:" name="companySbCount">
+                        <a-input v-model:value="formData.companySbCount" :disabled="isView" placeholder="请输入企业申报总价" allow-clear />
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="备案单价:" name="recordPrice">
+                        <a-input v-model:value="formData.recordPrice" :disabled="isView" placeholder="请输入备案单价" allow-clear />
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="备案总价:" name="recordTotalPrice">
+                        <a-input v-model:value="formData.recordTotalPrice" :disabled="isView" placeholder="请输入备案总价" allow-clear />
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="币制:" name="currency">
+                        <a-input v-model:value="formData.currency" :disabled="isView" placeholder="请输入币制" allow-clear />
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="原产国(地区):" name="originCountry">
+                        <a-select v-model:value="formData.originCountry" :disabled="isView" placeholder="请选择原产国(地区)" :options="originCountryOptions" show-search allow-clear option-filter-prop="label"/>
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="法定数量:" name="legalQuantity">
+                        <a-input-number v-model:value="formData.legalQuantity" :disabled="isView" :min="1" :max="10000" style="width: 100%" />
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="法定计量单位:" name="legalUnit">
+                        <a-select v-model:value="formData.legalUnit" :disabled="isView" placeholder="请选择法定计量单位" :options="legalUnitOptions" show-search allow-clear option-filter-prop="label"/>
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="第二法定数量:" name="secondLegalQuantity">
+                        <a-input v-model:value="formData.secondLegalQuantity" :disabled="isView" placeholder="请输入第二法定数量" allow-clear />
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="法定第二计量:" name="legalSecondUnit">
+                        <a-select v-model:value="formData.legalSecondUnit" :disabled="isView" placeholder="请选择法定第二计量" :options="legalSecondUnitOptions" show-search allow-clear option-filter-prop="label"/>
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="美元统计总金额:" name="myCount">
+                        <a-input v-model:value="formData.myCount" :disabled="isView" placeholder="请输入美元统计总金额" allow-clear />
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="重量比例因子:" name="weightRatioFactor">
+                        <a-input v-model:value="formData.weightRatioFactor" :disabled="isView" placeholder="请输入重量比例因子" allow-clear />
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="第一比例因子:" name="firstRatioFactor">
+                        <a-input v-model:value="formData.firstRatioFactor" :disabled="isView" placeholder="请输入第一比例因子" allow-clear />
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="第二比例因子:" name="secondRatioFactor">
+                        <a-input v-model:value="formData.secondRatioFactor" :disabled="isView" placeholder="请输入第二比例因子" allow-clear />
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="毛重:" name="grossWeight">
+                        <a-input v-model:value="formData.grossWeight" :disabled="isView" placeholder="请输入毛重" allow-clear />
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="净重:" name="netWeight">
+                        <a-input v-model:value="formData.netWeight" :disabled="isView" placeholder="请输入净重" allow-clear />
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="征免方式:" name="zmMethod">
+                        <a-select v-model:value="formData.zmMethod" :disabled="isView" placeholder="请选择征免方式" :options="zmMethodOptions" show-search allow-clear option-filter-prop="label"/>
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="最终目的国(地区):" name="zzmdg">
+                        <a-select v-model:value="formData.zzmdg" :disabled="isView" placeholder="请选择最终目的国(地区)" :options="zzmdgOptions" show-search allow-clear option-filter-prop="label"/>
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="监管年限到期日:" name="jgnxDqr">
+                        <a-date-picker v-model:value="formData.jgnxDqr" :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="jgnxQsr">
+                        <a-date-picker v-model:value="formData.jgnxQsr" :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="jzkcNum">
+                        <a-input v-model:value="formData.jzkcNum" :disabled="isView" placeholder="请输入进账库存数量" allow-clear />
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="监管年限自用数量:" name="jgnxZysl">
+                        <a-input v-model:value="formData.jgnxZysl" :disabled="isView" placeholder="请输入监管年限自用数量" allow-clear />
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="解除年限数量(已解除监管/总数):" name="jcjgslYjc">
+                        <a-input v-model:value="formData.jcjgslYjc" :disabled="isView" placeholder="请输入解除年限数量(已解除监管/总数)" allow-clear />
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="到期解除监管数量:" name="dqjcjgsl">
+                        <a-input v-model:value="formData.dqjcjgsl" :disabled="isView" placeholder="请输入到期解除监管数量" allow-clear />
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="解除年限数量(二线出区):" name="jcjgslSecondline">
+                        <a-input v-model:value="formData.jcjgslSecondline" :disabled="isView" placeholder="请输入解除年限数量(二线出区)" allow-clear />
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="解除监管数量(补税):" name="jcjgslBs">
+                        <a-input v-model:value="formData.jcjgslBs" :disabled="isView" placeholder="请输入解除监管数量(补税)" allow-clear />
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="解除监管数量(区内转让):" name="jcjgslQnzr">
+                        <a-input v-model:value="formData.jcjgslQnzr" :disabled="isView" placeholder="请输入解除监管数量(区内转让)" allow-clear />
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="解除监管数量(转至区外):" name="jcjgslZzqw">
+                        <a-input v-model:value="formData.jcjgslZzqw" :disabled="isView" placeholder="请输入解除监管数量(转至区外)" allow-clear />
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="解除监管数量(基建物资核销):" name="jcjgslJjwzhx">
+                        <a-input v-model:value="formData.jcjgslJjwzhx" :disabled="isView" placeholder="请输入解除监管数量(基建物资核销)" allow-clear />
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="监管年限内区内转移数量:" name="jgnxnQnzysl">
+                        <a-input v-model:value="formData.jgnxnQnzysl" :disabled="isView" placeholder="请输入监管年限内区内转移数量" allow-clear />
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="监管年限内抵押贷款数量:" name="jgnxnDydksl">
+                        <a-input v-model:value="formData.jgnxnDydksl" :disabled="isView" placeholder="请输入监管年限内抵押贷款数量" allow-clear />
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="监管年限内临时移作他用数量:" name="jgnxnLszztysl">
+                        <a-input v-model:value="formData.jgnxnLszztysl" :disabled="isView" placeholder="请输入监管年限内临时移作他用数量" allow-clear />
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="修改标志:" name="xgbz">
+                        <a-input v-model:value="formData.xgbz" :disabled="isView" placeholder="请输入修改标志" allow-clear />
+                    </a-form-item>
+                </a-col>
+            </a-row>
+        </a-form>
+	</a-card>
+</template>
+
+<script setup name="qySecondlineHzdProductDetail">
+	import tool from '@/utils/tool'
+	import { cloneDeep } from 'lodash-es'
+	import { required } from '@/utils/formRules'
+	import qySecondlineHzdProductApi from '@/api/biz/qySecondlineHzdProductApi'
+	// 抽屉状态
+    const { proxy } = getCurrentInstance()
+	const emit = defineEmits({ successful: null, onClose: null })
+	const formRef = ref()
+	// 表单数据
+	const formData = ref({})
+	const submitLoading = ref(false)
+	const isView = ref(false)
+	const declareUnitOptions = ref([])
+	const originCountryOptions = ref([])
+	const legalUnitOptions = ref([])
+	const legalSecondUnitOptions = ref([])
+	const zmMethodOptions = ref([])
+	const zzmdgOptions = ref([])
+
+	// 打开抽屉
+	const onOpen = (record, view = false) => {
+	    isView.value = view
+		if (record) {
+			let recordData = cloneDeep(record)
+			formData.value = Object.assign({}, recordData)
+		}
+		declareUnitOptions.value = tool.dictList('measurement unit')
+		originCountryOptions.value = tool.dictList('address')
+		legalUnitOptions.value = tool.dictList('measurement unit')
+		legalSecondUnitOptions.value = tool.dictList('measurement unit')
+		zmMethodOptions.value = tool.dictList('zm_type')
+		zzmdgOptions.value = tool.dictList('address')
+	}
+	// 关闭抽屉
+	const onClose = () => {
+		formRef.value.resetFields()
+		formData.value = {}
+		isView.value = true
+		emit('onClose')
+	}
+	// 默认要校验的
+	const formRules = {
+		productOrderCode: [required('请输入商品序号')],
+		bgdProductOrderCode: [required('请输入报关单商品序号')],
+		recordCode: [required('请输入备案序号')],
+		noticeCode: [required('请输入通知书序号')],
+		productCode: [required('请输入商品编码')],
+		productName: [required('请输入商品名称')],
+		specModel: [required('请输入规格型号')],
+		sbNum: [required('请输入申报数量')],
+		declareUnit: [required('请输入申报计量单位')],
+		companySbPrice: [required('请输入企业申报单价')],
+		companySbCount: [required('请输入企业申报总价')],
+		recordPrice: [required('请输入备案单价')],
+		recordTotalPrice: [required('请输入备案总价')],
+		currency: [required('请输入币制')],
+		originCountry: [required('请输入原产国(地区)')],
+		legalQuantity: [required('请输入法定数量')],
+		legalUnit: [required('请输入法定计量单位')],
+		grossWeight: [required('请输入毛重')],
+		netWeight: [required('请输入净重')],
+		zmMethod: [required('请输入征免方式')],
+		jgnxDqr: [required('请输入监管年限到期日')],
+		jgnxQsr: [required('请输入监管年限起始日')],
+		jzkcNum: [required('请输入进账库存数量')],
+	}
+	// 验证并提交数据
+	const onSubmit = () => {
+		formRef.value
+			.validate()
+			.then(() => {
+				submitLoading.value = true
+				const formDataParam = cloneDeep(formData.value)
+				qySecondlineHzdProductApi
+					.qySecondlineHzdProductSubmitForm(formDataParam, formDataParam.id)
+					.then(() => {
+						onClose()
+						emit('successful')
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			})
+			.catch(() => {})
+	}
+	// 抛出函数
+	defineExpose({
+		onOpen
+	})
+</script>
+
+<style lang="less" scoped>
+</style>

+ 344 - 0
snowy-admin-web/src/views/biz/qysecondlinehzdproduct/index.vue

@@ -0,0 +1,344 @@
+<template>
+	<a-card :bordered="false" v-if="indexShow">
+		<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('qySecondlineHzdProductAdd')">
+						<template #icon><plus-outlined /></template>
+						新增
+					</a-button>
+					<xn-batch-delete
+						v-if="hasPerm('qySecondlineHzdProductDelete')"
+						:selectedRowKeys="selectedRowKeys"
+						@batchDelete="deleteBatchQySecondlineHzdProduct"
+					/>
+					<a-button @click="onExport" v-if="hasPerm('qySecondlineHzdProductBatchExport')">
+                        <template #icon><export-outlined /></template>
+                        批量导出
+                    </a-button>
+				</a-space>
+			</template>
+			<template #bodyCell="{ column, record }">
+				<template v-if="column.dataIndex === 'declareUnit'">
+					{{ $TOOL.dictTypeData('measurement unit', record.declareUnit) }}
+				</template>
+				<template v-if="column.dataIndex === 'originCountry'">
+					{{ $TOOL.dictTypeData('address', record.originCountry) }}
+				</template>
+				<template v-if="column.dataIndex === 'legalUnit'">
+					{{ $TOOL.dictTypeData('measurement unit', record.legalUnit) }}
+				</template>
+				<template v-if="column.dataIndex === 'legalSecondUnit'">
+					{{ $TOOL.dictTypeData('measurement unit', record.legalSecondUnit) }}
+				</template>
+				<template v-if="column.dataIndex === 'zmMethod'">
+					{{ $TOOL.dictTypeData('zm_type', record.zmMethod) }}
+				</template>
+				<template v-if="column.dataIndex === 'zzmdg'">
+					{{ $TOOL.dictTypeData('address', record.zzmdg) }}
+				</template>
+				<template v-if="column.dataIndex === 'action'">
+					<a-space>
+					    <a @click="onDetail(record, true)" v-if="hasPerm('qySecondlineHzdProductView')">查看</a>
+                        <a-divider type="vertical" v-if="hasPerm('qySecondlineHzdProductView') && hasPerm(['qySecondlineHzdProductEdit', 'qySecondlineHzdProductDelete'], 'or')" />
+						<a @click="onDetail(record)" v-if="hasPerm('qySecondlineHzdProductEdit')">编辑</a>
+						<a-divider type="vertical" v-if="hasPerm(['qySecondlineHzdProductEdit', 'qySecondlineHzdProductDelete'], 'and')" />
+						<a-popconfirm title="确定要删除吗?" @confirm="deleteQySecondlineHzdProduct(record)">
+							<a-button type="link" danger size="small" v-if="hasPerm('qySecondlineHzdProductDelete')">删除</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="qysecondlinehzdproduct">
+	import { cloneDeep } from 'lodash-es'
+	import Detail from './detail.vue'
+	import qySecondlineHzdProductApi from '@/api/biz/qySecondlineHzdProductApi'
+	import downloadUtil from "@/utils/downloadUtil";
+    const { proxy } = getCurrentInstance()
+	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: 'productOrderCode',
+		},
+		{
+			title: '报关单商品序号',
+			dataIndex: 'bgdProductOrderCode',
+		},
+		{
+			title: '备案序号',
+			dataIndex: 'recordCode',
+		},
+		{
+			title: '通知书序号',
+			dataIndex: 'noticeCode',
+		},
+		{
+			title: '商品编码',
+			dataIndex: 'productCode',
+		},
+		{
+			title: '商品名称',
+			dataIndex: 'productName',
+		},
+		{
+			title: '规格型号',
+			dataIndex: 'specModel',
+		},
+		{
+			title: '申报数量',
+			dataIndex: 'sbNum',
+		},
+		{
+			title: '申报计量单位',
+			dataIndex: 'declareUnit',
+		},
+		{
+			title: '企业申报单价',
+			dataIndex: 'companySbPrice',
+		},
+		{
+			title: '企业申报总价',
+			dataIndex: 'companySbCount',
+		},
+		{
+			title: '备案单价',
+			dataIndex: 'recordPrice',
+		},
+		{
+			title: '备案总价',
+			dataIndex: 'recordTotalPrice',
+		},
+		{
+			title: '币制',
+			dataIndex: 'currency',
+		},
+		{
+			title: '原产国(地区)',
+			dataIndex: 'originCountry',
+		},
+		{
+			title: '法定数量',
+			dataIndex: 'legalQuantity',
+		},
+		{
+			title: '法定计量单位',
+			dataIndex: 'legalUnit',
+		},
+		{
+			title: '第二法定数量',
+			dataIndex: 'secondLegalQuantity',
+		},
+		{
+			title: '法定第二计量',
+			dataIndex: 'legalSecondUnit',
+		},
+		{
+			title: '美元统计总金额',
+			dataIndex: 'myCount',
+		},
+		{
+			title: '重量比例因子',
+			dataIndex: 'weightRatioFactor',
+		},
+		{
+			title: '第一比例因子',
+			dataIndex: 'firstRatioFactor',
+		},
+		{
+			title: '第二比例因子',
+			dataIndex: 'secondRatioFactor',
+		},
+		{
+			title: '毛重',
+			dataIndex: 'grossWeight',
+		},
+		{
+			title: '净重',
+			dataIndex: 'netWeight',
+		},
+		{
+			title: '征免方式',
+			dataIndex: 'zmMethod',
+		},
+		{
+			title: '最终目的国(地区)',
+			dataIndex: 'zzmdg',
+		},
+		{
+			title: '监管年限到期日',
+			dataIndex: 'jgnxDqr',
+		},
+		{
+			title: '监管年限起始日',
+			dataIndex: 'jgnxQsr',
+		},
+		{
+			title: '进账库存数量',
+			dataIndex: 'jzkcNum',
+		},
+		{
+			title: '监管年限自用数量',
+			dataIndex: 'jgnxZysl',
+		},
+		{
+			title: '解除年限数量(已解除监管/总数)',
+			dataIndex: 'jcjgslYjc',
+		},
+		{
+			title: '到期解除监管数量',
+			dataIndex: 'dqjcjgsl',
+		},
+		{
+			title: '解除年限数量(二线出区)',
+			dataIndex: 'jcjgslSecondline',
+		},
+		{
+			title: '解除监管数量(补税)',
+			dataIndex: 'jcjgslBs',
+		},
+		{
+			title: '解除监管数量(区内转让)',
+			dataIndex: 'jcjgslQnzr',
+		},
+		{
+			title: '解除监管数量(转至区外)',
+			dataIndex: 'jcjgslZzqw',
+		},
+		{
+			title: '解除监管数量(基建物资核销)',
+			dataIndex: 'jcjgslJjwzhx',
+		},
+		{
+			title: '监管年限内区内转移数量',
+			dataIndex: 'jgnxnQnzysl',
+		},
+		{
+			title: '监管年限内抵押贷款数量',
+			dataIndex: 'jgnxnDydksl',
+		},
+		{
+			title: '监管年限起始日',
+			dataIndex: 'jgnxQsy',
+		},
+		{
+			title: '监管年限内临时移作他用数量',
+			dataIndex: 'jgnxnLszztysl',
+		},
+		{
+			title: '修改标志',
+			dataIndex: 'xgbz',
+		},
+	]
+	// 操作栏通过权限判断是否显示
+	if (hasPerm(['qySecondlineHzdProductEdit', 'qySecondlineHzdProductDelete'])) {
+		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()
+        return qySecondlineHzdProductApi.qySecondlineHzdProductPage(parameter).then((data) => {
+            return data
+        })
+    }
+    // 搜索同时备份参数
+    const onSearch = (parameter) => {
+        searchFormStateReal.value = cloneDeep(Object.assign(searchFormState.value, filterParam.value))
+        nextTick(() => {
+            tableRef.value.refresh(parameter)
+        })
+    }
+    // 重置
+    const reset = () => {
+        searchFormRef.value.resetFields()
+        onSearch(true)
+    }
+	// 删除
+	const deleteQySecondlineHzdProduct = (record) => {
+		let params = [
+			{
+				id: record.id
+			}
+		]
+		qySecondlineHzdProductApi.qySecondlineHzdProductDelete(params).then(() => {
+			tableRef.value.refresh(true)
+		})
+	}
+	// 批量删除
+	const deleteBatchQySecondlineHzdProduct = (params) => {
+		qySecondlineHzdProductApi.qySecondlineHzdProductDelete(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
+                }
+            })
+        }
+        qySecondlineHzdProductApi.qySecondlineHzdProductExport(params).then((res) => {
+            downloadUtil.resultDownload(res)
+            tableRef.value.clearSelected()
+        })
+    }
+	// 切换至表单
+    const onDetail = (record = null, view) => {
+    	indexShow.value = false
+    	nextTick(() => {
+            detailRef.value.onOpen(record, view)
+    	})
+    }
+</script>
+
+<style lang="less" scoped>
+</style>

+ 937 - 0
snowy-admin-web/src/views/yqyc/zero/two/out-nuclear-annotation/detail.vue

@@ -0,0 +1,937 @@
+<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="onTemp" v-if="!isView">
+          <a-button style="margin-right: 8px" :loading="submitLoading">保存</a-button>
+        </a-popconfirm>
+        <a-popconfirm title="请确认是否申报?" @confirm="onSubmit" v-if="!isView">
+          <a-button type="primary" :loading="submitLoading">申报</a-button>
+        </a-popconfirm>
+			</template>
+		</a-page-header>
+      <a-collapse v-model:activeKey="activeKey" expand-icon-position="end">
+        <a-collapse-panel key="1" header="基本信息">
+          <a-form ref="formRef" :model="formData" :rules="formRules">
+            <a-row :gutter="16">
+              <a-col :span="8">
+                <a-form-item label="台账编号:" name="tzCode">
+					<a-select v-model:value="formData.tzCode" :disabled="isView" placeholder="请选择台账编号" :options="tzOptions" show-search allow-clear option-filter-prop="label" @change="onChangTz"/>
+                </a-form-item>
+              </a-col>
+              <a-col :span="8">
+                <a-form-item label="台账性质:" name="tzNature">
+					<a-select v-model:value="formData.tzNature" :disabled="true" placeholder="请选择台账性质" :options="tzTypeOptions" show-search allow-clear option-filter-prop="label"/>
+                </a-form-item>
+              </a-col>
+              <a-col :span="8">
+                <a-form-item label="使用单位:" name="useDept">
+                  <a-input v-model:value="formData.useDept" :disabled="isView" placeholder="请输入使用单位" allow-clear />
+                </a-form-item>
+              </a-col>
+              <a-col :span="8">
+                <a-form-item label="统一社会信用代码:" name="companyCode">
+                  <a-input v-model:value="formData.companyCode" :disabled="true" placeholder="请输入统一社会信用代码" allow-clear />
+                </a-form-item>
+              </a-col>
+              <a-col :span="8">
+                <a-form-item label="海关备案编号:" name="companyMainHgCode">
+                  <a-input v-model:value="formData.companyMainHgCode" :disabled="true" placeholder="请输入海关备案编号" allow-clear />
+                </a-form-item>
+              </a-col>
+              <a-col :span="8">
+                <a-form-item label="监管方式:" name="regulaMethod">
+                  <a-input v-model:value="formData.regulaMethod" :disabled="isView" placeholder="请输入监管方式" allow-clear />
+                </a-form-item>
+              </a-col>
+              <a-col :span="8">
+                <a-form-item label="运输方式:" name="ysfs">
+                  <a-select v-model:value="formData.ysfs" :disabled="isView" placeholder="请输入运输方式" :options="ysfsOptions" show-search allow-clear option-filter-prop="label"/>
+                </a-form-item>
+              </a-col>
+              <a-col :span="8">
+                <a-form-item label="关联清单编号:" name="glqdCode">
+                  <a-input v-model:value="formData.glqdCode" :disabled="isView" placeholder="请输入关联清单编号" allow-clear />
+                </a-form-item>
+              </a-col>
+              <a-col :span="8">
+                <a-form-item label="对应报关申报编号:" name="dybgCode">
+                  <a-input v-model:value="formData.dybgCode" :disabled="isView" placeholder="请输入对应报关申报编号" allow-clear />
+                </a-form-item>
+              </a-col>
+              <a-col :span="8">
+                <a-form-item label="对应报关单申报单位名称:" name="dybgDept">
+                  <a-input v-model:value="formData.dybgDept" :disabled="isView" placeholder="请输入对应报关单申报单位名称" allow-clear />
+                </a-form-item>
+              </a-col>
+              <a-col :span="24">
+                <a-form-item label="备注:" name="remark">
+                  <a-textarea v-model:value="formData.remark" :disabled="isView" placeholder="请输入备注" :rows="4" />
+                </a-form-item>
+              </a-col>
+            </a-row>
+          </a-form>
+        </a-collapse-panel>
+		  <a-collapse-panel key="2" header="表体信息">
+			  <a-button type="primary" @click="onBodyReset" v-if="!isView">重置</a-button>
+			  <a-form ref="bodyFormRef" :model="bodyData" :rules="bodyRules" style="margin-bottom: 20px;">
+				  <a-row :gutter="16">
+					  <a-col :span="8">
+						  <a-form-item label="商品序号:" name="productOrderCode">
+							  <a-input v-model:value="bodyData.productOrderCode" :disabled="isView" placeholder="请输入商品序号" allow-clear />
+						  </a-form-item>
+					  </a-col>
+					  <a-col :span="8">
+						  <a-form-item label="报关单商品序号:" name="bgdProductOrderCode">
+							  <a-input v-model:value="bodyData.bgdProductOrderCode" :disabled="isView" placeholder="请输入报关单商品序号" allow-clear />
+						  </a-form-item>
+					  </a-col>
+					  <a-col :span="8">
+						  <a-form-item label="备案序号:" name="recordCode">
+							  <a-input v-model:value="bodyData.recordCode" :disabled="isView" placeholder="请输入备案序号" allow-clear />
+						  </a-form-item>
+					  </a-col>
+					  <a-col :span="8">
+						  <a-form-item label="通知书序号:" name="noticeCode">
+							  <a-input v-model:value="bodyData.noticeCode" :disabled="isView" placeholder="请输入通知书序号" allow-clear />
+						  </a-form-item>
+					  </a-col>
+					  <a-col :span="8">
+						  <a-form-item label="商品编码:" name="productCode">
+							  <a-input v-model:value="bodyData.productCode" :disabled="isView" placeholder="请输入商品编码" allow-clear />
+						  </a-form-item>
+					  </a-col>
+					  <a-col :span="8">
+						  <a-form-item label="商品名称:" name="productName">
+							  <a-input v-model:value="bodyData.productName" :disabled="isView" placeholder="请输入商品名称" allow-clear />
+						  </a-form-item>
+					  </a-col>
+					  <a-col :span="8">
+						  <a-form-item label="规格型号:" name="specModel">
+							  <a-input v-model:value="bodyData.specModel" :disabled="isView" placeholder="请输入规格型号" allow-clear />
+						  </a-form-item>
+					  </a-col>
+					  <a-col :span="8">
+						  <a-form-item label="申报数量:" name="sbNum">
+							  <a-input v-model:value="bodyData.sbNum" :disabled="isView" placeholder="请输入申报数量" allow-clear />
+						  </a-form-item>
+					  </a-col>
+					  <a-col :span="8">
+						  <a-form-item label="申报计量单位:" name="declareUnit">
+							  <a-select v-model:value="bodyData.declareUnit" :disabled="isView" placeholder="请选择申报计量单位" :options="declareUnitOptions" show-search allow-clear option-filter-prop="label"/>
+						  </a-form-item>
+					  </a-col>
+					  <a-col :span="8">
+						  <a-form-item label="企业申报单价:" name="companySbPrice">
+							  <a-input v-model:value="bodyData.companySbPrice" :disabled="isView" placeholder="请输入企业申报单价" allow-clear />
+						  </a-form-item>
+					  </a-col>
+					  <a-col :span="8">
+						  <a-form-item label="企业申报总价:" name="companySbCount">
+							  <a-input v-model:value="bodyData.companySbCount" :disabled="isView" placeholder="请输入企业申报总价" allow-clear />
+						  </a-form-item>
+					  </a-col>
+					  <a-col :span="8">
+						  <a-form-item label="备案单价:" name="recordPrice">
+							  <a-input v-model:value="bodyData.recordPrice" :disabled="isView" placeholder="请输入备案单价" allow-clear />
+						  </a-form-item>
+					  </a-col>
+					  <a-col :span="8">
+						  <a-form-item label="备案总价:" name="recordTotalPrice">
+							  <a-input v-model:value="bodyData.recordTotalPrice" :disabled="isView" placeholder="请输入备案总价" allow-clear />
+						  </a-form-item>
+					  </a-col>
+					  <a-col :span="8">
+						  <a-form-item label="币制:" name="currency">
+							  <a-input v-model:value="bodyData.currency" :disabled="isView" placeholder="请输入币制" allow-clear />
+						  </a-form-item>
+					  </a-col>
+					  <a-col :span="8">
+						  <a-form-item label="原产国(地区):" name="originCountry">
+							  <a-select v-model:value="bodyData.originCountry" :disabled="isView" placeholder="请选择原产国(地区)" :options="originCountryOptions" show-search allow-clear option-filter-prop="label"/>
+						  </a-form-item>
+					  </a-col>
+					  <a-col :span="8">
+						  <a-form-item label="法定数量:" name="legalQuantity">
+							  <a-input-number v-model:value="bodyData.legalQuantity" :disabled="isView" :min="1" :max="10000" style="width: 100%" />
+						  </a-form-item>
+					  </a-col>
+					  <a-col :span="8">
+						  <a-form-item label="法定计量单位:" name="legalUnit">
+							  <a-select v-model:value="bodyData.legalUnit" :disabled="isView" placeholder="请选择法定计量单位" :options="legalUnitOptions" show-search allow-clear option-filter-prop="label"/>
+						  </a-form-item>
+					  </a-col>
+					  <a-col :span="8">
+						  <a-form-item label="第二法定数量:" name="secondLegalQuantity">
+							  <a-input v-model:value="bodyData.secondLegalQuantity" :disabled="isView" placeholder="请输入第二法定数量" allow-clear />
+						  </a-form-item>
+					  </a-col>
+					  <a-col :span="8">
+						  <a-form-item label="法定第二计量:" name="legalSecondUnit">
+							  <a-select v-model:value="bodyData.legalSecondUnit" :disabled="isView" placeholder="请选择法定第二计量" :options="legalSecondUnitOptions" show-search allow-clear option-filter-prop="label"/>
+						  </a-form-item>
+					  </a-col>
+					  <a-col :span="8">
+						  <a-form-item label="美元统计总金额:" name="myCount">
+							  <a-input v-model:value="bodyData.myCount" :disabled="isView" placeholder="请输入美元统计总金额" allow-clear />
+						  </a-form-item>
+					  </a-col>
+					  <a-col :span="8">
+						  <a-form-item label="重量比例因子:" name="weightRatioFactor">
+							  <a-input v-model:value="bodyData.weightRatioFactor" :disabled="isView" placeholder="请输入重量比例因子" allow-clear />
+						  </a-form-item>
+					  </a-col>
+					  <a-col :span="8">
+						  <a-form-item label="第一比例因子:" name="firstRatioFactor">
+							  <a-input v-model:value="bodyData.firstRatioFactor" :disabled="isView" placeholder="请输入第一比例因子" allow-clear />
+						  </a-form-item>
+					  </a-col>
+					  <a-col :span="8">
+						  <a-form-item label="第二比例因子:" name="secondRatioFactor">
+							  <a-input v-model:value="bodyData.secondRatioFactor" :disabled="isView" placeholder="请输入第二比例因子" allow-clear />
+						  </a-form-item>
+					  </a-col>
+					  <a-col :span="8">
+						  <a-form-item label="毛重:" name="grossWeight">
+							  <a-input v-model:value="bodyData.grossWeight" :disabled="isView" placeholder="请输入毛重" allow-clear />
+						  </a-form-item>
+					  </a-col>
+					  <a-col :span="8">
+						  <a-form-item label="净重:" name="netWeight">
+							  <a-input v-model:value="bodyData.netWeight" :disabled="isView" placeholder="请输入净重" allow-clear />
+						  </a-form-item>
+					  </a-col>
+					  <a-col :span="8">
+						  <a-form-item label="征免方式:" name="zmMethod">
+							  <a-select v-model:value="bodyData.zmMethod" :disabled="isView" placeholder="请选择征免方式" :options="zmMethodOptions" show-search allow-clear option-filter-prop="label"/>
+						  </a-form-item>
+					  </a-col>
+					  <a-col :span="8">
+						  <a-form-item label="最终目的国(地区):" name="zzmdg">
+							  <a-select v-model:value="bodyData.zzmdg" :disabled="isView" placeholder="请选择最终目的国(地区)" :options="zzmdgOptions" show-search allow-clear option-filter-prop="label"/>
+						  </a-form-item>
+					  </a-col>
+					  <a-col :span="8">
+						  <a-form-item label="监管年限到期日:" name="jgnxDqr">
+							  <a-date-picker v-model:value="bodyData.jgnxDqr" :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="8">
+						  <a-form-item label="监管年限起始日:" name="jgnxQsr">
+							  <a-date-picker v-model:value="bodyData.jgnxQsr" :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="8">
+						  <a-form-item label="进账库存数量:" name="jzkcNum">
+							  <a-input v-model:value="bodyData.jzkcNum" :disabled="isView" placeholder="请输入进账库存数量" allow-clear />
+						  </a-form-item>
+					  </a-col>
+					  <a-col :span="8">
+						  <a-form-item label="监管年限自用数量:" name="jgnxZysl">
+							  <a-input v-model:value="bodyData.jgnxZysl" :disabled="isView" placeholder="请输入监管年限自用数量" allow-clear />
+						  </a-form-item>
+					  </a-col>
+					  <a-col :span="8">
+						  <a-form-item label="解除年限数量(已解除监管/总数):" name="jcjgslYjc">
+							  <a-input v-model:value="bodyData.jcjgslYjc" :disabled="isView" placeholder="请输入解除年限数量(已解除监管/总数)" allow-clear />
+						  </a-form-item>
+					  </a-col>
+					  <a-col :span="8">
+						  <a-form-item label="到期解除监管数量:" name="dqjcjgsl">
+							  <a-input v-model:value="bodyData.dqjcjgsl" :disabled="isView" placeholder="请输入到期解除监管数量" allow-clear />
+						  </a-form-item>
+					  </a-col>
+					  <a-col :span="8">
+						  <a-form-item label="解除年限数量(二线出区):" name="jcjgslSecondline">
+							  <a-input v-model:value="bodyData.jcjgslSecondline" :disabled="isView" placeholder="请输入解除年限数量(二线出区)" allow-clear />
+						  </a-form-item>
+					  </a-col>
+					  <a-col :span="8">
+						  <a-form-item label="解除监管数量(补税):" name="jcjgslBs">
+							  <a-input v-model:value="bodyData.jcjgslBs" :disabled="isView" placeholder="请输入解除监管数量(补税)" allow-clear />
+						  </a-form-item>
+					  </a-col>
+					  <a-col :span="8">
+						  <a-form-item label="解除监管数量(区内转让):" name="jcjgslQnzr">
+							  <a-input v-model:value="bodyData.jcjgslQnzr" :disabled="isView" placeholder="请输入解除监管数量(区内转让)" allow-clear />
+						  </a-form-item>
+					  </a-col>
+					  <a-col :span="8">
+						  <a-form-item label="解除监管数量(转至区外):" name="jcjgslZzqw">
+							  <a-input v-model:value="bodyData.jcjgslZzqw" :disabled="isView" placeholder="请输入解除监管数量(转至区外)" allow-clear />
+						  </a-form-item>
+					  </a-col>
+					  <a-col :span="8">
+						  <a-form-item label="解除监管数量(基建物资核销):" name="jcjgslJjwzhx">
+							  <a-input v-model:value="bodyData.jcjgslJjwzhx" :disabled="isView" placeholder="请输入解除监管数量(基建物资核销)" allow-clear />
+						  </a-form-item>
+					  </a-col>
+					  <a-col :span="8">
+						  <a-form-item label="监管年限内区内转移数量:" name="jgnxnQnzysl">
+							  <a-input v-model:value="bodyData.jgnxnQnzysl" :disabled="isView" placeholder="请输入监管年限内区内转移数量" allow-clear />
+						  </a-form-item>
+					  </a-col>
+					  <a-col :span="8">
+						  <a-form-item label="监管年限内抵押贷款数量:" name="jgnxnDydksl">
+							  <a-input v-model:value="bodyData.jgnxnDydksl" :disabled="isView" placeholder="请输入监管年限内抵押贷款数量" allow-clear />
+						  </a-form-item>
+					  </a-col>
+					  <a-col :span="8">
+						  <a-form-item label="监管年限内临时移作他用数量:" name="jgnxnLszztysl">
+							  <a-input v-model:value="bodyData.jgnxnLszztysl" :disabled="isView" placeholder="请输入监管年限内临时移作他用数量" allow-clear />
+						  </a-form-item>
+					  </a-col>
+					  <a-col :span="8">
+						  <a-form-item label="修改标志:" name="xgbz">
+							  <a-input v-model:value="formData.xgbz" :disabled="isView" placeholder="请输入修改标志" allow-clear />
+						  </a-form-item>
+					  </a-col>
+				  </a-row>
+			  </a-form>
+			  <template v-if="!isView">
+				  <a-button type="primary" style="margin-right: 8px;" v-if="!(bodyData.id || bodyData.__index)" @click="onBodyAdd">插入</a-button>
+				  <a-button type="primary" style="margin-right: 8px;" v-else @click="onBodyEdit">保存</a-button>
+				  <xn-batch-delete
+					  :selectedRowKeys="bodySelectedRowKeys"
+					  @batchDelete="deleteBatchBody"
+				  />
+			  </template>
+			  <a-table
+				  style="margin-top: 10px"
+				  bordered
+				  :dataSource="bodyList"
+				  :columns="bodyColumns"
+				  :pagination="false"
+				  :scroll="{ x: 2000 }"
+				  :row-selection="bodyOptions.rowSelection"
+			  >
+				  <template #bodyCell="{ column, record, index }">
+					  <template v-if="column.dataIndex === 'declareUnit'">
+						  {{ $TOOL.dictTypeData('measurement unit', record.declareUnit) }}
+					  </template>
+					  <template v-if="column.dataIndex === 'originCountry'">
+						  {{ $TOOL.dictTypeData('address', record.originCountry) }}
+					  </template>
+					  <template v-if="column.dataIndex === 'legalUnit'">
+						  {{ $TOOL.dictTypeData('measurement unit', record.legalUnit) }}
+					  </template>
+					  <template v-if="column.dataIndex === 'legalSecondUnit'">
+						  {{ $TOOL.dictTypeData('measurement unit', record.legalSecondUnit) }}
+					  </template>
+					  <template v-if="column.dataIndex === 'zmMethod'">
+						  {{ $TOOL.dictTypeData('zm_type', record.zmMethod) }}
+					  </template>
+					  <template v-if="column.dataIndex === 'zzmdg'">
+						  {{ $TOOL.dictTypeData('address', record.zzmdg) }}
+					  </template>
+					  <template v-if="column.dataIndex === 'action'">
+						  <template v-if="isView">
+							  <a-button type="link" primary size="small" @click="onBodyReset(), bodyData = cloneDeep(record)">查看</a-button>
+						  </template>
+						  <template v-else>
+							  <a-button type="link" primary size="small" @click="onBodyReset(), bodyData = cloneDeep(record)">编辑</a-button>
+							  <a-button type="link" danger size="small" @click="onBodyDel(index)">删除</a-button>
+						  </template>
+					  </template>
+				  </template>
+			  </a-table>
+		  </a-collapse-panel>
+		  <a-collapse-panel key="3" header="附件信息">
+			  <template v-if="!isView">
+				  <div>
+					  友情提示<br/>
+					  1、附件大小要求不超过4M,如果文件过大,建议拆分多个上传;<br/>
+					  2、附件格式要求:PDF文件;<br/>
+					  3、同一附件类型可以上传多个附件;<br/>
+					  4、附件传输过程中会出现传输失败的情况,请随时关注附件传输状态;<br/>
+					  5、要求上传复印件的可上传原件的扫描件。
+				  </div>
+				  <xn-upload ref="ref_upload" v-model:value="fileData.fileUrl" @onChange="fileChange" accept=".pdf" v-if="showFileUpload"/>
+				  <xn-batch-delete
+					  :selectedRowKeys="fileSelectedRowKeys"
+					  @batchDelete="deleteBatchFile"
+				  />
+			  </template>
+			  <a-table
+				  style="margin-top: 10px"
+				  bordered
+				  :dataSource="fileList"
+				  :columns="fileColumns"
+				  :pagination="false"
+				  :row-selection="fileOptions.rowSelection"
+			  >
+				  <template #bodyCell="{ column, record, index, text }">
+					  <template v-if="['attachmentName', 'attachmentFormat', 'attachmentContent'].includes(column.dataIndex)">
+						  <div>
+							  <a-input
+								  v-if="!isView"
+								  v-model:value="record[column.dataIndex]"
+								  style="margin: -5px 0"
+							  />
+							  <template v-else>
+								  {{ text }}
+							  </template>
+						  </div>
+					  </template>
+					  <template v-if="column.dataIndex === 'action'">
+						  <template v-if="isView">
+						  </template>
+						  <template v-else>
+							  <a-button type="link" danger size="small" @click="onFileDel(index)" v-if="!isView">删除</a-button>
+						  </template>
+					  </template>
+				  </template>
+			  </a-table>
+		  </a-collapse-panel>
+      </a-collapse>
+	</a-card>
+</template>
+
+<script setup name="qySecondlineHzdTzDetail">
+	import tool from '@/utils/tool'
+	import { cloneDeep } from 'lodash-es'
+	import { required } from '@/utils/formRules'
+	import qySecondlineHzdTzApi from '@/api/yqyc/qySecondlineHzdTzApi'
+	import {message, Modal} from "ant-design-vue";
+	import {createVNode} from "vue";
+	import {ExclamationCircleOutlined} from "@ant-design/icons-vue";
+	import qySecondlineHfdApi from "@/api/yqyc/qySecondlineHfdApi";
+	// 抽屉状态
+    const { proxy } = getCurrentInstance()
+	const emit = defineEmits({ successful: null, onClose: null })
+	const formRef = ref()
+	// 表单数据
+	const formData = ref({})
+	const submitLoading = ref(false)
+	const isView = ref(false)
+	const tzTypeOptions = ref([])
+	const statusOptions = ref([])
+	const ysfsOptions = ref([])
+	const declareUnitOptions = ref([])
+	const originCountryOptions = ref([])
+	const legalUnitOptions = ref([])
+	const legalSecondUnitOptions = ref([])
+	const zmMethodOptions = ref([])
+	const zzmdgOptions = ref([])
+	const tzOptions = ref([])
+	const activeKey = ref('1')
+	// 打开抽屉
+	const onOpen = (record, view = false, copy) => {
+	    isView.value = view
+		if (record) {
+			qySecondlineHzdTzApi.qySecondlineHzdTzDetail({id: record.id}).then(res => {
+				formData.value = res.baseInfo
+				bodyList.value = res.productList
+				fileList.value = res.attachmentList
+				if (copy) {
+					delete formData.value.id
+				}
+			})
+		}
+		qySecondlineHzdTzApi.qySecondlineHzdTzQyRecordInfo().then(res => {
+			tzOptions.value = res.map(v => Object.assign(v, {label: v.tzCode, value: v.tzCode}))
+		})
+		tzTypeOptions.value = tool.dictList('tzlx')
+		statusOptions.value = tool.dictList('djzt')
+		ysfsOptions.value = tool.dictList('trans_type')
+		declareUnitOptions.value = tool.dictList('measurement unit')
+		originCountryOptions.value = tool.dictList('address')
+		legalUnitOptions.value = tool.dictList('measurement unit')
+		legalSecondUnitOptions.value = tool.dictList('measurement unit')
+		zmMethodOptions.value = tool.dictList('zm_type')
+		zzmdgOptions.value = tool.dictList('address')
+	}
+	// 关闭抽屉
+	const onClose = () => {
+		formRef.value.resetFields()
+		formData.value = {}
+		isView.value = true
+		emit('onClose')
+	}
+	// 默认要校验的
+	const formRules = {
+		dybgDept: [required('请输入对应报关单申报单位名称')],
+	}
+	// 验证并提交数据
+	const onSubmit = () => {
+		formRef.value
+			.validate()
+			.then(() => {
+				submitLoading.value = true
+				const params = {
+					baseInfo: Object.assign(formData.value, {status: '2'}),
+					productList: bodyList.value,
+					attachmentList: fileList.value,
+				}
+				qySecondlineHzdTzApi.qySecondlineHzdTzSubmitForm(params, formData.value.id).then(() => {
+					onClose()
+					emit('successful')
+				}).finally(() => {
+					submitLoading.value = false
+				})
+			})
+			.catch(() => {})
+	}
+	const onTemp = () => {
+		formRef.value
+		.validate()
+		.then(() => {
+			submitLoading.value = true
+			const params = {
+				baseInfo: Object.assign(formData.value, {status: '1'}),
+				productList: bodyList.value,
+				attachmentList: fileList.value,
+			}
+			qySecondlineHzdTzApi.qySecondlineHzdTzSubmitForm(params, formData.value.id).then(() => {
+				onClose()
+				emit('successful')
+			})
+			.finally(() => {
+				submitLoading.value = false
+			})
+		})
+		.catch(() => {
+		})
+	}
+	const bodyFormRef = ref()
+	const bodyData = ref({})
+	const bodySelectedRowKeys = ref([])
+	const bodyList = ref([])
+	// 列表选择配置
+	const bodyOptions = {
+		rowSelection: {
+			onChange: (selectedRowKey, selectedRows) => {
+				bodySelectedRowKeys.value = selectedRows
+			}
+		}
+	}
+	// 默认要校验的
+	const bodyRules = {
+		productOrderCode: [required('请输入商品序号')],
+		bgdProductOrderCode: [required('请输入报关单商品序号')],
+		recordCode: [required('请输入备案序号')],
+		noticeCode: [required('请输入通知书序号')],
+		productCode: [required('请输入商品编码')],
+		productName: [required('请输入商品名称')],
+		specModel: [required('请输入规格型号')],
+		sbNum: [required('请输入申报数量')],
+		declareUnit: [required('请输入申报计量单位')],
+		companySbPrice: [required('请输入企业申报单价')],
+		companySbCount: [required('请输入企业申报总价')],
+		recordPrice: [required('请输入备案单价')],
+		recordTotalPrice: [required('请输入备案总价')],
+		currency: [required('请输入币制')],
+		originCountry: [required('请输入原产国(地区)')],
+		legalQuantity: [required('请输入法定数量')],
+		legalUnit: [required('请输入法定计量单位')],
+		grossWeight: [required('请输入毛重')],
+		netWeight: [required('请输入净重')],
+		zmMethod: [required('请输入征免方式')],
+		jgnxDqr: [required('请输入监管年限到期日')],
+		jgnxQsr: [required('请输入监管年限起始日')],
+		jzkcNum: [required('请输入进账库存数量')],
+	}
+	const bodyColumns = [
+		{
+			title: '商品序号',
+			dataIndex: 'productOrderCode',
+			width: 100
+		},
+		{
+			title: '报关单商品序号',
+			dataIndex: 'bgdProductOrderCode',
+			width: 160
+		},
+		{
+			title: '备案序号',
+			dataIndex: 'recordCode',
+			width: 100
+		},
+		{
+			title: '通知书序号',
+			dataIndex: 'noticeCode',
+			width: 120
+		},
+		{
+			title: '商品编码',
+			dataIndex: 'productCode',
+			width: 100
+		},
+		{
+			title: '商品名称',
+			dataIndex: 'productName',
+			width: 100
+		},
+		{
+			title: '规格型号',
+			dataIndex: 'specModel',
+			width: 100
+		},
+		{
+			title: '申报数量',
+			dataIndex: 'sbNum',
+			width: 100
+		},
+		{
+			title: '申报计量单位',
+			dataIndex: 'declareUnit',
+			width: 160
+		},
+		{
+			title: '企业申报单价',
+			dataIndex: 'companySbPrice',
+			width: 160
+		},
+		{
+			title: '企业申报总价',
+			dataIndex: 'companySbCount',
+			width: 160
+		},
+		{
+			title: '备案单价',
+			dataIndex: 'recordPrice',
+			width: 100
+		},
+		{
+			title: '备案总价',
+			dataIndex: 'recordTotalPrice',
+			width: 100
+		},
+		{
+			title: '币制',
+			dataIndex: 'currency',
+			width: 100
+		},
+		{
+			title: '原产国(地区)',
+			dataIndex: 'originCountry',
+			width: 160
+		},
+		{
+			title: '法定数量',
+			dataIndex: 'legalQuantity',
+			width: 100
+		},
+		{
+			title: '法定计量单位',
+			dataIndex: 'legalUnit',
+			width: 160
+		},
+		{
+			title: '第二法定数量',
+			dataIndex: 'secondLegalQuantity',
+			width: 160
+		},
+		{
+			title: '法定第二计量',
+			dataIndex: 'legalSecondUnit',
+			width: 160
+		},
+		{
+			title: '美元统计总金额',
+			dataIndex: 'myCount',
+			width: 160
+		},
+		{
+			title: '重量比例因子',
+			dataIndex: 'weightRatioFactor',
+			width: 160
+		},
+		{
+			title: '第一比例因子',
+			dataIndex: 'firstRatioFactor',
+			width: 160
+		},
+		{
+			title: '第二比例因子',
+			dataIndex: 'secondRatioFactor',
+			width: 160
+		},
+		{
+			title: '毛重',
+			dataIndex: 'grossWeight',
+			width: 100
+		},
+		{
+			title: '净重',
+			dataIndex: 'netWeight',
+			width: 100
+		},
+		{
+			title: '征免方式',
+			dataIndex: 'zmMethod',
+			width: 160
+		},
+		{
+			title: '最终目的国(地区)',
+			dataIndex: 'zzmdg',
+			width: 160
+		},
+		{
+			title: '监管年限到期日',
+			dataIndex: 'jgnxDqr',
+			width: 160
+		},
+		{
+			title: '监管年限起始日',
+			dataIndex: 'jgnxQsr',
+			width: 160
+		},
+		{
+			title: '进账库存数量',
+			dataIndex: 'jzkcNum',
+			width: 160
+		},
+		{
+			title: '监管年限自用数量',
+			dataIndex: 'jgnxZysl',
+			width: 160
+		},
+		{
+			title: '解除年限数量(已解除监管/总数)',
+			dataIndex: 'jcjgslYjc',
+			width: 240
+		},
+		{
+			title: '到期解除监管数量',
+			dataIndex: 'dqjcjgsl',
+			width: 160
+		},
+		{
+			title: '解除年限数量(二线出区)',
+			dataIndex: 'jcjgslSecondline',
+			width: 200
+		},
+		{
+			title: '解除监管数量(补税)',
+			dataIndex: 'jcjgslBs',
+			width: 200
+		},
+		{
+			title: '解除监管数量(区内转让)',
+			dataIndex: 'jcjgslQnzr',
+			width: 200
+		},
+		{
+			title: '解除监管数量(转至区外)',
+			dataIndex: 'jcjgslZzqw',
+			width: 200
+		},
+		{
+			title: '解除监管数量(基建物资核销)',
+			dataIndex: 'jcjgslJjwzhx',
+			width: 220
+		},
+		{
+			title: '监管年限内区内转移数量',
+			dataIndex: 'jgnxnQnzysl',
+			width: 200
+		},
+		{
+			title: '监管年限内抵押贷款数量',
+			dataIndex: 'jgnxnDydksl',
+			width: 200
+		},
+		{
+			title: '监管年限起始日',
+			dataIndex: 'jgnxQsy',
+			width: 160
+		},
+		{
+			title: '监管年限内临时移作他用数量',
+			dataIndex: 'jgnxnLszztysl',
+			width: 220
+		},
+		{
+			title: '修改标志',
+			dataIndex: 'xgbz',
+			width: 100
+		},
+		{
+			title: '操作',
+			dataIndex: 'action',
+			width: 200,
+			fixed: 'right'
+		},
+	]
+	const onBodyReset = () => {
+		bodyFormRef.value?.resetFields()
+		bodyData.value = {}
+	}
+	const onBodyAdd = () => {
+		bodyFormRef.value
+		.validate()
+		.then(() => {
+			bodyList.value.push(Object.assign({__index: new Date().getTime()}, bodyData.value))
+			onBodyReset()
+			message.success('插入表体信息成功!')
+		})
+		.catch(() => {
+		})
+	}
+	const onBodyEdit = () => {
+		bodyFormRef.value
+		.validate()
+		.then(() => {
+			let k = ''
+			if (bodyData.value.id) {
+				k = 'id'
+			} else if (bodyData.value.__index) {
+				k = '__index'
+			}
+			if (k) {
+				bodyList.value.forEach(v => {
+					if (v[k] === bodyData.value[k]) {
+						Object.assign(v, bodyData.value)
+					}
+				})
+			}
+			onBodyReset()
+			message.success('编辑表体信息成功!')
+		})
+		.catch(() => {
+		})
+	}
+	const onBodyDel = (recode, index) => {
+		Modal.confirm({
+			title: '提示',
+			icon: createVNode(ExclamationCircleOutlined),
+			content: createVNode('div', { style: 'color:red;' }, `是否要删除${record.productName}?`),
+			centered: true,
+			onOk() {
+				bodyList.value.splice(index, 1)
+			},
+			onCancel() {
+			},
+		});
+	}
+	const deleteBatchBody = () => {
+		bodyList.value = bodyList.value.filter(v => {
+			let flag = true
+			bodySelectedRowKeys.value.forEach(s => {
+				if ((v.id && (v.id === s.id)) || (v.__index && (v.__index === s.__index))) {
+					flag = false
+				}
+			})
+			return flag
+		})
+	}
+	const ref_upload = ref()
+	const fileData = ref({})
+	const showFileUpload = ref(true)
+	const fileSelectedRowKeys = ref([])
+	const fileList = ref([])
+	// 列表选择配置
+	const fileOptions = {
+		rowSelection: {
+			onChange: (selectedRowKey, selectedRows) => {
+				fileSelectedRowKeys.value = selectedRows
+			}
+		}
+	}
+	const fileColumns = [
+		{
+			title: '附件名称',
+			dataIndex: 'attachmentName',
+		},
+		{
+			title: '附件格式',
+			dataIndex: 'attachmentFormat',
+		},
+		{
+			title: '附件内容',
+			dataIndex: 'attachmentContent',
+		},
+		{
+			title: '上传时间',
+			dataIndex: 'uploadTime',
+		},
+		{
+			title: '操作',
+			dataIndex: 'action',
+		},
+	]
+	const getFileExtension = (filename) => {
+		// 使用lastIndexOf查找最后一个"."的位置
+		var dotIndex = filename.lastIndexOf(".");
+
+		// 如果找到了".",则提取从"."之后的子串作为后缀名
+		if (dotIndex !== -1 && dotIndex < filename.length - 1) { // 确保"."不是字符串的最后一个字符
+			return filename.slice(dotIndex + 1); // slice从dotIndex+1开始到字符串结束
+		} else {
+			// 如果没有找到".",返回空字符串表示没有后缀
+			return "";
+		}
+	}
+	const fileChange = (file) => {
+		if (file) {
+			const f = ref_upload.value.uploadFileList()[0]
+			fileList.value.push({
+				__index: new Date().getTime(),
+				attachmentUrl: f.url,
+				attachmentName: f.name,
+				attachmentFormat: getFileExtension(f.name),
+				attachmentContent: '',
+				uploadTime: proxy.$util.YMDHms(new Date()),
+			})
+			fileData.value.fileUrl = ''
+			showFileUpload.value = false
+			setTimeout(() => {
+				showFileUpload.value = true
+			}, 0)
+		}
+	}
+	const onFileDel = (recode, index) => {
+		Modal.confirm({
+			title: '提示',
+			icon: createVNode(ExclamationCircleOutlined),
+			content: createVNode('div', { style: 'color:red;' }, `是否要删除?`),
+			centered: true,
+			onOk() {
+				fileList.value.splice(index, 1)
+			},
+			onCancel() {
+			},
+		});
+	}
+	const deleteBatchFile = () => {
+		fileList.value = fileList.value.filter(v => {
+			let flag = true
+			fileSelectedRowKeys.value.forEach(s => {
+				if ((v.id && (v.id === s.id)) || (v.__index && (v.__index === s.__index))) {
+					flag = false
+				}
+			})
+			return flag
+		})
+	}
+	const onChangTz = (val) => {
+		if (val) {
+			const obj = tzOptions.value.filter(v => v.tzCode === val)[0]
+			formData.value.tzNature = obj.tzType
+			formData.value.companyCode = obj.companyCode
+			formData.value.companyMainHgCode = obj.companyMainHgCode
+			qySecondlineHzdTzApi.qySecondlineHzdTzQyProductById({id: obj.id}).then(res => {
+				bodyList.value = res
+				onBodyReset()
+			})
+		} else {
+			formData.value.tzNature = ''
+			formData.value.companyCode = ''
+			formData.value.companyMainHgCode = ''
+			bodyList.value = []
+			onBodyReset()
+		}
+	}
+	// 抛出函数
+	defineExpose({
+		onOpen
+	})
+</script>
+
+<style lang="less" scoped>
+</style>

+ 278 - 0
snowy-admin-web/src/views/yqyc/zero/two/out-nuclear-annotation/index.vue

@@ -0,0 +1,278 @@
+<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="hzdrCode">
+                        <a-input v-model:value="searchFormState.hzdrCode" placeholder="请输入核注单预录入号" allow-clear/>
+                    </a-form-item>
+                </a-col>
+                <a-col :span="6">
+                    <a-form-item label="核注单编号" name="hzdId">
+                        <a-input v-model:value="searchFormState.hzdId" placeholder="请输入核注单编号" allow-clear/>
+                    </a-form-item>
+                </a-col>
+                <a-col :span="6">
+                    <a-form-item label="台账类型" name="tzType">
+                        <a-select v-model:value="searchFormState.tzType" placeholder="请选择台账类型" :options="tzTypeOptions" show-search allow-clear option-filter-prop="label"/>
+                    </a-form-item>
+                </a-col>
+                <a-col :span="6">
+                    <a-form-item label="台账编号" name="tzCode">
+                        <a-input v-model:value="searchFormState.tzCode" placeholder="请输入台账编号" allow-clear/>
+                    </a-form-item>
+                </a-col>
+                <a-col :span="6">
+                    <a-form-item label="申报时间" name="sbsj">
+                        <a-range-picker v-model:value="searchFormState.sbsj" show-time allow-clear/>
+                    </a-form-item>
+                </a-col>
+                <a-col :span="6">
+                    <a-form-item label="申报类型" name="sblx">
+                        <a-input v-model:value="searchFormState.sblx" placeholder="请输入申报类型" allow-clear/>
+                    </a-form-item>
+                </a-col>
+                <a-col :span="6">
+                    <a-form-item label="单据状态" name="status">
+                        <a-select v-model:value="searchFormState.status" placeholder="请选择单据状态" :options="statusOptions" show-search allow-clear option-filter-prop="label"/>
+                    </a-form-item>
+                </a-col>
+                <a-col :span="6">
+                    <div style="width: 100%;display: flex;justify-content: flex-end">
+                        <a-button type="primary" @click="onSearch()">查询</a-button>
+                        <a-button style="margin: 0 0 0 8px" @click="reset">重置</a-button>
+                    </div>
+                </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('qySecondlineHzdTzAdd')">
+						<template #icon><plus-outlined /></template>
+						新增
+					</a-button>
+					<xn-batch-delete
+						v-if="hasPerm('qySecondlineHzdTzDelete')"
+						:selectedRowKeys="selectedRowKeys"
+						@batchDelete="deleteBatchQySecondlineHzdTz"
+					/>
+					<a-button @click="onExport" v-if="hasPerm('qySecondlineHzdTzBatchExport')">
+                        <template #icon><export-outlined /></template>
+                        批量导出
+                    </a-button>
+				</a-space>
+			</template>
+			<template #bodyCell="{ column, record }">
+				<template v-if="column.dataIndex === 'tzType'">
+					{{ $TOOL.dictTypeData('tzlx', record.tzType) }}
+				</template>
+				<template v-if="column.dataIndex === 'status'">
+					{{ $TOOL.dictTypeData('djzt', record.status) }}
+				</template>
+				<template v-if="column.dataIndex === 'action'">
+					<a-space>
+                        <a @click="resultDetailRef.onOpen(record)" v-if="record.status == 3 || record.status == 4">查看回执</a>
+					    <a @click="onDetail(record, true)" v-if="hasPerm('qySecondlineHzdTzView')">查看</a>
+						<a @click="onDetail(record)" v-if="hasPerm('qySecondlineHzdTzEdit') && record.status == 1">编辑</a>
+						<a-popconfirm title="确定要删除吗?" @confirm="deleteQySecondlineHzdTz(record)">
+							<a-button type="link" danger size="small" v-if="hasPerm('qySecondlineHzdTzDelete') && (record.status == 1 || record.status == 4)">删除</a-button>
+						</a-popconfirm>
+						<a @click="onDetail(record, false,true)">复制</a>
+						<a @click="onDetail(record)" v-if="record.status == 3">变更</a>
+						<a @click="onBack(record)" v-if="record.status == 2">撤回</a>
+					</a-space>
+				</template>
+			</template>
+		</s-table>
+	</a-card>
+	<Detail v-else ref="detailRef" @onClose="indexShow = true" @successful="onSearch()" />
+    <ResultDetail ref="resultDetailRef"/>
+</template>
+
+<script setup name="qysecondlinehzdtz">
+	import tool from '@/utils/tool'
+	import { cloneDeep } from 'lodash-es'
+	import Detail from './detail.vue'
+	import qySecondlineHzdTzApi from '@/api/yqyc/qySecondlineHzdTzApi'
+	import downloadUtil from "@/utils/downloadUtil";
+    import {Modal} from "ant-design-vue";
+    import {createVNode} from "vue";
+    import {ExclamationCircleOutlined} from "@ant-design/icons-vue";
+    import ResultDetail from "./result.vue";
+    const { proxy } = getCurrentInstance()
+	const searchFormState = ref({})
+	const searchFormStateReal = ref(searchFormState.value) // 点击搜索后备份的查询参数
+	const searchFormRef = ref()
+	const resultDetailRef = 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 advanced = ref(false)
+	const toggleAdvanced = () => {
+		advanced.value = !advanced.value
+	}
+	const columns = [
+		{
+			title: '核注单预录入号',
+			dataIndex: 'hzdrCode',
+		},
+		{
+			title: '核注单编号',
+			dataIndex: 'hzdId',
+		},
+		{
+			title: '台账类型',
+			dataIndex: 'tzType',
+		},
+		{
+			title: '台账编号',
+			dataIndex: 'tzCode',
+		},
+		{
+			title: '申报时间',
+			dataIndex: 'sbsj',
+            sorter: true,
+		},
+		{
+			title: '申报类型',
+			dataIndex: 'sblx',
+		},
+		{
+			title: '单据状态',
+			dataIndex: 'status',
+		},
+	]
+	// 操作栏通过权限判断是否显示
+	if (hasPerm(['qySecondlineHzdTzEdit', 'qySecondlineHzdTzDelete'])) {
+		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()
+        // sbsj范围查询条件重载
+        if (searchFormStateReal.value.sbsj) {
+            searchFormStateReal.value.startSbsj = searchFormStateReal.value.sbsj[0]
+            searchFormStateReal.value.endSbsj = searchFormStateReal.value.sbsj[1]
+            delete searchFormStateReal.value.sbsj
+        }
+        return qySecondlineHzdTzApi.qySecondlineHzdTzPage(Object.assign(parameter, searchFormStateReal.value)).then((data) => {
+            return data
+        })
+    }
+    // 搜索同时备份参数
+    const onSearch = (parameter) => {
+        searchFormStateReal.value = cloneDeep(Object.assign(searchFormState.value, filterParam.value))
+        nextTick(() => {
+            tableRef.value.refresh(parameter)
+        })
+    }
+    // 重置
+    const reset = () => {
+        searchFormRef.value.resetFields()
+        onSearch(true)
+    }
+	// 删除
+	const deleteQySecondlineHzdTz = (record) => {
+		let params = [
+			{
+				id: record.id
+			}
+		]
+		qySecondlineHzdTzApi.qySecondlineHzdTzDelete(params).then(() => {
+			tableRef.value.refresh(true)
+		})
+	}
+	// 批量删除
+	const deleteBatchQySecondlineHzdTz = (params) => {
+		qySecondlineHzdTzApi.qySecondlineHzdTzDelete(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
+                }
+            })
+        }
+        qySecondlineHzdTzApi.qySecondlineHzdTzExport(params).then((res) => {
+            downloadUtil.resultDownload(res)
+            tableRef.value.clearSelected()
+        })
+    }
+	// 切换至表单
+    const onDetail = (record = null, view, copy) => {
+    	indexShow.value = false
+    	nextTick(() => {
+            detailRef.value.onOpen(record, view, copy)
+    	})
+    }
+    const onBack = (record) => {
+      Modal.confirm({
+        title: '提示',
+        icon: createVNode(ExclamationCircleOutlined),
+        content: '确定要对该核注单进行撤回操作?',
+        centered: true,
+        onOk() {
+          qySecondlineHzdTzApi.qySecondlineHzdTzDetail({id: record.id}).then(res => {
+            const params = res
+            params.baseInfo.status = '1'
+            qySecondlineHzdTzApi.qySecondlineHzdTzSubmitForm(params, true).then(() => {
+              onSearch()
+            })
+          })
+        },
+        onCancel() {
+        },
+      });
+    }
+	const tzTypeOptions = tool.dictList('tzlx')
+	const statusOptions = tool.dictList('djzt')
+</script>
+
+<style lang="less" scoped>
+</style>

+ 77 - 0
snowy-admin-web/src/views/yqyc/zero/two/out-nuclear-annotation/result.vue

@@ -0,0 +1,77 @@
+<template>
+	<a-modal
+		v-model:open="open"
+		title="查看回执"
+		centered
+		width="90%"
+	>
+		<div class="result-detail">
+			<a-page-header
+			>
+				<template #tags>
+					<a-tag :color="formData.status == 3 ? 'green' : 'red'">{{ $TOOL.dictTypeData('djzt', formData.status) }}</a-tag>
+					<a-tooltip :title="resultList[resultList.length - 1]?.result">
+						<InfoCircleOutlined />
+					</a-tooltip>
+				</template>
+			</a-page-header>
+			<a-table
+				style="margin-top: 10px"
+				bordered
+				:dataSource="resultList"
+				:columns="[
+				  {title: '单据类型',dataIndex: 'applyType',key: 'applyType'},
+				  {title: '审核状态',dataIndex: 'status',key: 'status'},
+				  {title: '申请人',dataIndex: 'applicant',key: 'applicant'},
+				  {title: '审核人',dataIndex: 'applyMan',key: 'applyMan'},
+				  {title: '审核时间',dataIndex: 'checkTime',key: 'checkTime'},
+				  {title: '审核结果回执',dataIndex: 'result',key: 'result'},
+				]"
+				:pagination="false"
+			>
+			</a-table>
+		</div>
+		<template #footer></template>
+	</a-modal>
+</template>
+
+<script setup name="enterpriseDetail">
+import tool from '@/utils/tool'
+import {cloneDeep} from 'lodash-es'
+// 抽屉状态
+const open = ref(false)
+const emit = defineEmits({successful: null})
+const formRef = ref()
+// 表单数据
+const formData = ref({})
+const resultList = ref([])
+import qyImg from '@/views/yqyc/zero/enterprise-qualification/qy.png'
+import qySecondlineHzdTzApi from "@/api/yqyc/qySecondlineHzdTzApi";
+
+// 打开抽屉
+const onOpen = (record, view = false) => {
+	open.value = true
+	if (record) {
+		formData.value = Object.assign({}, record)
+		qySecondlineHzdTzApi.qySecondlineHzdTzGetHzListByTzId({id: record.id}).then(res => {
+			resultList.value = res
+		})
+	}
+}
+// 关闭抽屉
+const onClose = () => {
+	formRef.value.resetFields()
+	formData.value = {}
+	open.value = false
+}
+// 抛出函数
+defineExpose({
+	onOpen
+})
+</script>
+<style lang="less" scoped>
+.goods-detail {
+	max-height: 800px;
+	overflow-y: auto;
+}
+</style>

+ 5 - 8
snowy-admin-web/src/views/yqyc/zero/two/out-nuclear-release/detail.vue

@@ -353,11 +353,10 @@
 	import { cloneDeep } from 'lodash-es'
 	import { required } from '@/utils/formRules'
 	import qySecondlineHfdApi from '@/api/yqyc/qySecondlineHfdApi'
-	import qyRecordInfoApi from "@/api/yqyc/qyRecordInfoApi";
 	import {message, Modal} from "ant-design-vue";
 	import {createVNode} from "vue";
 	import {ExclamationCircleOutlined} from "@ant-design/icons-vue";
-	import qySecondLineHzdTzApi from "@/api/yqyc/qySecondLineHzdTzApi";
+	import qySecondlineHzdTzApi from "@/api/yqyc/qySecondlineHzdTzApi";
 	const { proxy } = getCurrentInstance()
 
 	// 抽屉状态
@@ -500,8 +499,6 @@
 	const onOpen = (record, view = false, type, copy) => {
 	    isView.value = view
 		if (record) {
-			let recordData = cloneDeep(record)
-			formData.value = Object.assign({}, recordData)
 			qySecondlineHfdApi.qySecondlineHfdDetail({id: record.id}).then(res => {
 				formData.value = res.baseInfo
 				bodyList.value = res.productList
@@ -511,7 +508,7 @@
 					formData.value.sblx = type
 				}
 				if (formData.value.ledgerCode) {
-					qySecondLineHzdTzApi.qySecondLineHzdTzHgHzdCodeByTzCode({tzCode: formData.value.ledgerCode}).then(res => {
+					qySecondlineHzdTzApi.qySecondlineHzdTzHgHzdCodeByTzCode({tzCode: formData.value.ledgerCode}).then(res => {
 						hzqdOptions.value = res.map(v => ({label: v, value: v}))
 					})
 				}
@@ -524,7 +521,7 @@
 			formData.value.sbqyshxydm = userInfo.companyNumber
 			formData.value.sblx = type
 		}
-		qySecondLineHzdTzApi.qySecondLineHzdTzTzCodeByCondition().then(res => {
+		qySecondlineHzdTzApi.qySecondlineHzdTzTzCodeByCondition().then(res => {
 			tzOptions.value = res.map(v => ({label: v, value: v}))
 		})
 		hfdLxOptions.value = tool.dictList('hfdlx')
@@ -802,7 +799,7 @@
 	}
 	const onChangTz = (val) => {
 		if (val) {
-			qySecondLineHzdTzApi.qySecondLineHzdTzHgHzdCodeByTzCode({tzCode: val}).then(res => {
+			qySecondlineHzdTzApi.qySecondlineHzdTzHgHzdCodeByTzCode({tzCode: val}).then(res => {
 				hzqdOptions.value = res.map(v => ({label: v, value: v}))
 			})
 		} else {
@@ -814,7 +811,7 @@
 	}
 	const onChangHzqd = (val) => {
 		if (val) {
-			qySecondLineHzdTzApi.qySecondLineHzdTzGetProductByHgHzdCode({hgHzCode: val}).then(res => {
+			qySecondlineHzdTzApi.qySecondlineHzdTzGetProductByHgHzdCode({hgHzCode: val}).then(res => {
 				bodyList.value = res
 				onBodyReset()
 			})

+ 0 - 2
snowy-admin-web/src/views/yqyc/zero/two/out-nuclear-release/index.vue

@@ -113,8 +113,6 @@
 	import {Modal} from "ant-design-vue";
 	import {createVNode} from "vue";
 	import {ExclamationCircleOutlined} from "@ant-design/icons-vue";
-	import qyRecordInfoApi from "@/api/yqyc/qyRecordInfoApi";
-    import qySecondLineHzdTzApi from "@/api/yqyc/qySecondLineHzdTzApi";
     import ResultDetail from "./result.vue";
     const { proxy } = getCurrentInstance()
 	const searchFormState = ref({

+ 2 - 2
snowy-admin-web/src/views/yqyc/zero/two/out-nuclear-release/result.vue

@@ -46,14 +46,14 @@ const formRef = ref()
 const formData = ref({})
 const resultList = ref([])
 import qyImg from '@/views/yqyc/zero/enterprise-qualification/qy.png'
-import qySecondLineHzdTzApi from "@/api/yqyc/qySecondLineHzdTzApi";
+import qySecondlineHzdTzApi from "@/api/yqyc/qySecondlineHzdTzApi";
 
 // 打开抽屉
 const onOpen = (record, view = false) => {
 	open.value = true
 	if (record) {
 		formData.value = Object.assign({}, record)
-		qySecondLineHzdTzApi.qySecondLineHzdTzGetListByHfdId({id: record.id}).then(res => {
+		qySecondlineHzdTzApi.qysecondlinehfdlistGetListByHfdId({id: record.id}).then(res => {
 			resultList.value = res
 		})
 	}

+ 0 - 2
snowy-plugin/snowy-plugin-gen/src/main/resources/frontend/index.vue.btl

@@ -134,9 +134,7 @@
 				<template v-if="column.dataIndex === 'action'">
 					<a-space>
 						<a @click="formRef.onOpen(record)" v-if="hasPerm('${classNameFirstLower}View')">查看</a>
-						<a-divider type="vertical" v-if="hasPerm('${classNameFirstLower}View') && hasPerm(['${classNameFirstLower}Edit', '${classNameFirstLower}Delete'], 'or')" />
 						<a @click="formRef.onOpen(record)" v-if="hasPerm('${classNameFirstLower}Edit')">编辑</a>
-						<a-divider type="vertical" v-if="hasPerm(['${classNameFirstLower}Edit', '${classNameFirstLower}Delete'], 'and')" />
 						<a-popconfirm title="确定要删除吗?" @confirm="delete${className}(record)">
 							<a-button type="link" danger size="small" v-if="hasPerm('${classNameFirstLower}Delete')">删除</a-button>
 						</a-popconfirm>

+ 0 - 2
snowy-plugin/snowy-plugin-gen/src/main/resources/frontend/index_inside.vue.btl

@@ -134,9 +134,7 @@
 				<template v-if="column.dataIndex === 'action'">
 					<a-space>
 					    <a @click="onDetail(record, true)" v-if="hasPerm('${classNameFirstLower}View')">查看</a>
-                        <a-divider type="vertical" v-if="hasPerm('${classNameFirstLower}View') && hasPerm(['${classNameFirstLower}Edit', '${classNameFirstLower}Delete'], 'or')" />
 						<a @click="onDetail(record)" v-if="hasPerm('${classNameFirstLower}Edit')">编辑</a>
-						<a-divider type="vertical" v-if="hasPerm(['${classNameFirstLower}Edit', '${classNameFirstLower}Delete'], 'and')" />
 						<a-popconfirm title="确定要删除吗?" @confirm="delete${className}(record)">
 							<a-button type="link" danger size="small" v-if="hasPerm('${classNameFirstLower}Delete')">删除</a-button>
 						</a-popconfirm>