H5配置页面
							parent
							
								
									0a7e873c66
								
							
						
					
					
						commit
						8a88401c01
					
				| 
						 | 
					@ -13,6 +13,10 @@ export default {
 | 
				
			||||||
	printTemplatePage(data) {
 | 
						printTemplatePage(data) {
 | 
				
			||||||
		return request('page', data, 'get')
 | 
							return request('page', data, 'get')
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
 | 
						// 获取打印模板列表
 | 
				
			||||||
 | 
						printTemplateList(data) {
 | 
				
			||||||
 | 
							return request('list', data, 'get')
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
	// 提交打印模板表单 edit为true时为编辑,默认为新增
 | 
						// 提交打印模板表单 edit为true时为编辑,默认为新增
 | 
				
			||||||
	printTemplateSubmitForm(data, edit = false) {
 | 
						printTemplateSubmitForm(data, edit = false) {
 | 
				
			||||||
		return request(edit ? 'edit' : 'add', data)
 | 
							return request(edit ? 'edit' : 'add', data)
 | 
				
			||||||
| 
						 | 
					@ -24,5 +28,6 @@ export default {
 | 
				
			||||||
	// 获取打印模板详情
 | 
						// 获取打印模板详情
 | 
				
			||||||
	printTemplateDetail(data) {
 | 
						printTemplateDetail(data) {
 | 
				
			||||||
		return request('detail', data, 'get')
 | 
							return request('detail', data, 'get')
 | 
				
			||||||
	}
 | 
						},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,36 @@
 | 
				
			||||||
 | 
					import { baseRequest } from '@/utils/request'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const request = (url, ...arg) => baseRequest(`/print/records/` + url, ...arg)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * 标签打印记录Api接口管理器
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @author luojun
 | 
				
			||||||
 | 
					 * @date  2024/09/16 14:49
 | 
				
			||||||
 | 
					 **/
 | 
				
			||||||
 | 
					export default {
 | 
				
			||||||
 | 
						// 获取标签打印记录分页
 | 
				
			||||||
 | 
						printRecordsPage(data) {
 | 
				
			||||||
 | 
							return request('page', data, 'get')
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						// 提交标签打印记录表单 edit为true时为编辑,默认为新增
 | 
				
			||||||
 | 
						printRecordsSubmitForm(data, edit = false) {
 | 
				
			||||||
 | 
							return request(edit ? 'edit' : 'add', data)
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						// 删除标签打印记录
 | 
				
			||||||
 | 
						printRecordsDelete(data) {
 | 
				
			||||||
 | 
							return request('delete', data)
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						// 获取标签打印记录详情
 | 
				
			||||||
 | 
						printRecordsDetail(data) {
 | 
				
			||||||
 | 
							return request('detail', data, 'get')
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						// 打印标签并保存打印记录
 | 
				
			||||||
 | 
						printRecordsPrint(data) {
 | 
				
			||||||
 | 
							return request('print', data, 'post')
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						// 更具标签打印记录 id
 | 
				
			||||||
 | 
						printTemplateGetProductCode(data) {
 | 
				
			||||||
 | 
							return request('getProductCode', data, 'post')
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -13,6 +13,10 @@ export default {
 | 
				
			||||||
	produceBarcodeHistoryPage(data) {
 | 
						produceBarcodeHistoryPage(data) {
 | 
				
			||||||
		return request('page', data, 'get')
 | 
							return request('page', data, 'get')
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
 | 
						// 获取产品条码历史记录列表
 | 
				
			||||||
 | 
						produceBarcodeHistoryList(data) {
 | 
				
			||||||
 | 
							return request('list', data, 'get')
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
	// 提交产品条码历史记录表单 edit为true时为编辑,默认为新增
 | 
						// 提交产品条码历史记录表单 edit为true时为编辑,默认为新增
 | 
				
			||||||
	produceBarcodeHistorySubmitForm(data, edit = false) {
 | 
						produceBarcodeHistorySubmitForm(data, edit = false) {
 | 
				
			||||||
		return request(edit ? 'edit' : 'add', data)
 | 
							return request(edit ? 'edit' : 'add', data)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -89,6 +89,7 @@ export default function useFormHandler(formItems, api, backRouter) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// 填充表单数据
 | 
						// 填充表单数据
 | 
				
			||||||
	const populateFormData = (data) => {
 | 
						const populateFormData = (data) => {
 | 
				
			||||||
 | 
							console.log(formData, 'formData')
 | 
				
			||||||
		Object.keys(formData).forEach((key) => {
 | 
							Object.keys(formData).forEach((key) => {
 | 
				
			||||||
			if (data[key] !== undefined) formData[key] = data[key]
 | 
								if (data[key] !== undefined) formData[key] = data[key]
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,120 +1,188 @@
 | 
				
			||||||
<template>
 | 
					<template>
 | 
				
			||||||
	<div class="wrap flex">
 | 
						<div class="wrap flex">
 | 
				
			||||||
		<div class="sider">
 | 
							<div class="sider">
 | 
				
			||||||
			<iphone></iphone>
 | 
								<iphone :info="viewinfo"></iphone>
 | 
				
			||||||
		</div>
 | 
							</div>
 | 
				
			||||||
		<div class="content">
 | 
							<div class="content">
 | 
				
			||||||
			<a-tabs v-model:activeKey="activeKey" type="card">
 | 
								<a-tabs v-model:activeKey="activeKey" type="card">
 | 
				
			||||||
				<a-tab-pane key="1" tab="基本配置">Content of Tab Pane 1</a-tab-pane>
 | 
									<a-tab-pane key="1" tab="基本配置">
 | 
				
			||||||
				<a-tab-pane key="2" tab="轮播图" force-render>
 | 
										<a-card title="页面配置">
 | 
				
			||||||
					<a-upload
 | 
											<a-form>
 | 
				
			||||||
						v-model:file-list="fileList"
 | 
												<a-row>
 | 
				
			||||||
						action="https://www.mocky.io/v2/5cc8019d300000980a055e76"
 | 
													<a-col :span="6">
 | 
				
			||||||
						list-type="picture-card"
 | 
														<a-form-item label="LOGO">
 | 
				
			||||||
						@preview="handlePreview"
 | 
															<a-upload
 | 
				
			||||||
					>
 | 
																v-model:file-list="logoFileList"
 | 
				
			||||||
						<div v-if="fileList.length < 8">
 | 
																action="https://www.mocky.io/v2/5cc8019d300000980a055e76"
 | 
				
			||||||
							<plus-outlined />
 | 
																list-type="picture"
 | 
				
			||||||
							<div style="margin-top: 8px">Upload</div>
 | 
																@preview="handlePreview"
 | 
				
			||||||
						</div>
 | 
																:max-count="1"
 | 
				
			||||||
					</a-upload>
 | 
															>
 | 
				
			||||||
					<a-modal :open="previewVisible" :title="previewTitle" :footer="null" @cancel="handleCancel">
 | 
																<a-button>
 | 
				
			||||||
						<img alt="example" style="width: 100%" :src="previewImage" />
 | 
																	<upload-outlined></upload-outlined>
 | 
				
			||||||
					</a-modal>
 | 
																	upload
 | 
				
			||||||
 | 
																</a-button>
 | 
				
			||||||
 | 
															</a-upload>
 | 
				
			||||||
 | 
														</a-form-item>
 | 
				
			||||||
 | 
													</a-col>
 | 
				
			||||||
 | 
													<a-col :span="6">
 | 
				
			||||||
 | 
														<a-form-item label="页面背景图">
 | 
				
			||||||
 | 
															<a-upload
 | 
				
			||||||
 | 
																v-model:file-list="bgFileList"
 | 
				
			||||||
 | 
																action="https://www.mocky.io/v2/5cc8019d300000980a055e76"
 | 
				
			||||||
 | 
																list-type="picture"
 | 
				
			||||||
 | 
																@preview="handlePreview"
 | 
				
			||||||
 | 
																:max-count="1"
 | 
				
			||||||
 | 
															>
 | 
				
			||||||
 | 
																<a-button>
 | 
				
			||||||
 | 
																	<upload-outlined></upload-outlined>
 | 
				
			||||||
 | 
																	upload
 | 
				
			||||||
 | 
																</a-button>
 | 
				
			||||||
 | 
															</a-upload>
 | 
				
			||||||
 | 
														</a-form-item>
 | 
				
			||||||
 | 
													</a-col>
 | 
				
			||||||
 | 
													<a-col :span="24">
 | 
				
			||||||
 | 
														<a-form-item label="是否展示产品信息">
 | 
				
			||||||
 | 
															<a-switch />
 | 
				
			||||||
 | 
														</a-form-item>
 | 
				
			||||||
 | 
														<a-form-item label="是否展示防伪码查询结果">
 | 
				
			||||||
 | 
															<a-switch />
 | 
				
			||||||
 | 
														</a-form-item>
 | 
				
			||||||
 | 
														<a-form-item label="是否展示溯源记录">
 | 
				
			||||||
 | 
															<a-switch />
 | 
				
			||||||
 | 
														</a-form-item>
 | 
				
			||||||
 | 
													</a-col>
 | 
				
			||||||
 | 
												</a-row>
 | 
				
			||||||
 | 
											</a-form>
 | 
				
			||||||
 | 
										</a-card>
 | 
				
			||||||
 | 
										<a-card class="mt-4" title="底部导航">
 | 
				
			||||||
 | 
											<a-form>
 | 
				
			||||||
 | 
												<a-row>
 | 
				
			||||||
 | 
													<a-col :span="24">
 | 
				
			||||||
 | 
														<a-form-item label="是否展示">
 | 
				
			||||||
 | 
															<a-switch />
 | 
				
			||||||
 | 
														</a-form-item>
 | 
				
			||||||
 | 
														<a-form-item label="电话:">
 | 
				
			||||||
 | 
															<a-input></a-input>
 | 
				
			||||||
 | 
														</a-form-item>
 | 
				
			||||||
 | 
														<a-form-item label="官方网址:">
 | 
				
			||||||
 | 
															<a-input></a-input>
 | 
				
			||||||
 | 
														</a-form-item>
 | 
				
			||||||
 | 
														<a-form-item label="地址:">
 | 
				
			||||||
 | 
															<a-input></a-input>
 | 
				
			||||||
 | 
														</a-form-item>
 | 
				
			||||||
 | 
													</a-col>
 | 
				
			||||||
 | 
													<a-col :span="6">
 | 
				
			||||||
 | 
														<a-form-item label="左侧LOGO图">
 | 
				
			||||||
 | 
															<a-upload
 | 
				
			||||||
 | 
																v-model:file-list="btLogoFileList"
 | 
				
			||||||
 | 
																action="https://www.mocky.io/v2/5cc8019d300000980a055e76"
 | 
				
			||||||
 | 
																list-type="picture"
 | 
				
			||||||
 | 
																@preview="handlePreview"
 | 
				
			||||||
 | 
																:max-count="1"
 | 
				
			||||||
 | 
															>
 | 
				
			||||||
 | 
																<a-button>
 | 
				
			||||||
 | 
																	<upload-outlined></upload-outlined>
 | 
				
			||||||
 | 
																	upload
 | 
				
			||||||
 | 
																</a-button>
 | 
				
			||||||
 | 
															</a-upload>
 | 
				
			||||||
 | 
														</a-form-item>
 | 
				
			||||||
 | 
													</a-col>
 | 
				
			||||||
 | 
													<a-col :span="6">
 | 
				
			||||||
 | 
														<a-form-item label="公众号二维码">
 | 
				
			||||||
 | 
															<a-upload
 | 
				
			||||||
 | 
																v-model:file-list="qrFileList"
 | 
				
			||||||
 | 
																action="https://www.mocky.io/v2/5cc8019d300000980a055e76"
 | 
				
			||||||
 | 
																list-type="picture"
 | 
				
			||||||
 | 
																@preview="handlePreview"
 | 
				
			||||||
 | 
																:max-count="1"
 | 
				
			||||||
 | 
															>
 | 
				
			||||||
 | 
																<a-button>
 | 
				
			||||||
 | 
																	<upload-outlined></upload-outlined>
 | 
				
			||||||
 | 
																	upload
 | 
				
			||||||
 | 
																</a-button>
 | 
				
			||||||
 | 
															</a-upload>
 | 
				
			||||||
 | 
														</a-form-item>
 | 
				
			||||||
 | 
													</a-col>
 | 
				
			||||||
 | 
												</a-row>
 | 
				
			||||||
 | 
											</a-form>
 | 
				
			||||||
 | 
										</a-card>
 | 
				
			||||||
 | 
										<a-card class="mt-4" title="轮播图"
 | 
				
			||||||
 | 
											><a-form>
 | 
				
			||||||
 | 
												<a-row>
 | 
				
			||||||
 | 
													<a-col :span="24">
 | 
				
			||||||
 | 
														<a-form-item label="是否展示">
 | 
				
			||||||
 | 
															<a-switch />
 | 
				
			||||||
 | 
														</a-form-item>
 | 
				
			||||||
 | 
													</a-col>
 | 
				
			||||||
 | 
													<a-col :span="6">
 | 
				
			||||||
 | 
														<a-form-item label="轮播图">
 | 
				
			||||||
 | 
															<a-upload
 | 
				
			||||||
 | 
																v-model:file-list="arrFileList"
 | 
				
			||||||
 | 
																action="https://www.mocky.io/v2/5cc8019d300000980a055e76"
 | 
				
			||||||
 | 
																list-type="picture"
 | 
				
			||||||
 | 
																@preview="handlePreview"
 | 
				
			||||||
 | 
																:max-count="5"
 | 
				
			||||||
 | 
															>
 | 
				
			||||||
 | 
																<a-button>
 | 
				
			||||||
 | 
																	<upload-outlined></upload-outlined>
 | 
				
			||||||
 | 
																	upload
 | 
				
			||||||
 | 
																</a-button>
 | 
				
			||||||
 | 
															</a-upload>
 | 
				
			||||||
 | 
														</a-form-item>
 | 
				
			||||||
 | 
													</a-col>
 | 
				
			||||||
 | 
												</a-row>
 | 
				
			||||||
 | 
											</a-form>
 | 
				
			||||||
 | 
										</a-card>
 | 
				
			||||||
 | 
									</a-tab-pane>
 | 
				
			||||||
 | 
									<a-tab-pane key="3" tab="产品信息">
 | 
				
			||||||
 | 
										<a-row :gutter="20">
 | 
				
			||||||
 | 
											<a-col :span="18">
 | 
				
			||||||
 | 
												<XnEditor v-model="viewInfo.productInfo"></XnEditor>
 | 
				
			||||||
 | 
											</a-col>
 | 
				
			||||||
 | 
											<a-col :span="6">
 | 
				
			||||||
 | 
												<div class="fields">
 | 
				
			||||||
 | 
													<p class="fields-item">${条码}</p>
 | 
				
			||||||
 | 
													<p class="fields-item">${条码}</p>
 | 
				
			||||||
 | 
													<p class="fields-item">${条码}</p>
 | 
				
			||||||
 | 
												</div>
 | 
				
			||||||
 | 
											</a-col>
 | 
				
			||||||
 | 
										</a-row>
 | 
				
			||||||
 | 
									</a-tab-pane>
 | 
				
			||||||
 | 
									<a-tab-pane key="4" tab="防伪码查询配置">
 | 
				
			||||||
 | 
										<a-row :gutter="20">
 | 
				
			||||||
 | 
											<a-col :span="18">
 | 
				
			||||||
 | 
												<XnEditor></XnEditor>
 | 
				
			||||||
 | 
											</a-col>
 | 
				
			||||||
 | 
											<a-col :span="6">
 | 
				
			||||||
 | 
												<div class="fields">
 | 
				
			||||||
 | 
													<p class="fields-item">${条码}</p>
 | 
				
			||||||
 | 
													<p class="fields-item">${条码}</p>
 | 
				
			||||||
 | 
													<p class="fields-item">${条码}</p>
 | 
				
			||||||
 | 
												</div>
 | 
				
			||||||
 | 
											</a-col>
 | 
				
			||||||
 | 
										</a-row>
 | 
				
			||||||
				</a-tab-pane>
 | 
									</a-tab-pane>
 | 
				
			||||||
				<a-tab-pane key="3" tab="产品验证正防伪信息">Content of Tab Pane 3</a-tab-pane>
 | 
					 | 
				
			||||||
				<a-tab-pane key="4" tab="溯源流程">Content of Tab Pane 3</a-tab-pane>
 | 
					 | 
				
			||||||
				<a-tab-pane key="5" tab="产品介绍">
 | 
									<a-tab-pane key="5" tab="产品介绍">
 | 
				
			||||||
					<XnEditor></XnEditor>
 | 
										<XnEditor></XnEditor>
 | 
				
			||||||
				</a-tab-pane>
 | 
									</a-tab-pane>
 | 
				
			||||||
				
 | 
					 | 
				
			||||||
				<a-tab-pane key="6" tab="超链接">Content of Tab Pane 3</a-tab-pane>
 | 
					 | 
				
			||||||
			</a-tabs>
 | 
								</a-tabs>
 | 
				
			||||||
		</div>
 | 
							</div>
 | 
				
			||||||
	</div>
 | 
						</div>
 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script setup>
 | 
					<script setup>
 | 
				
			||||||
	// const props = defineProps({})
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// const emit = defineEmits()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// 生命周期钩子
 | 
					 | 
				
			||||||
	import Iphone from '@/views/productionBusiness/basicData/brand/counterfeiting/iphone.vue'
 | 
						import Iphone from '@/views/productionBusiness/basicData/brand/counterfeiting/iphone.vue'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	const siderStyle = {
 | 
						const logoFileList = ref([])
 | 
				
			||||||
		color: '#fff',
 | 
						const bgFileList = ref([])
 | 
				
			||||||
		backgroundColor: '#fff',
 | 
						const btLogoFileList = ref([])
 | 
				
			||||||
		width: '350'
 | 
						const qrFileList = ref([])
 | 
				
			||||||
	}
 | 
						const arrFileList = ref([])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	let activeKey = ref('5')
 | 
						let viewInfo = ref({
 | 
				
			||||||
 | 
							productInfo: ''
 | 
				
			||||||
	onMounted(() => {
 | 
					 | 
				
			||||||
		console.log('Component mounted')
 | 
					 | 
				
			||||||
		// TODO: Add your onMounted code here
 | 
					 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
 | 
					 | 
				
			||||||
	onUpdated(() => {
 | 
					 | 
				
			||||||
		console.log('Component updated')
 | 
					 | 
				
			||||||
		// TODO: Add your onUpdated code here
 | 
					 | 
				
			||||||
	})
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	onUnmounted(() => {
 | 
					 | 
				
			||||||
		console.log('Component unmounted')
 | 
					 | 
				
			||||||
		// TODO: Add your onUnmounted code here
 | 
					 | 
				
			||||||
	})
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// watch(() => {}, () => {})
 | 
					 | 
				
			||||||
	function getBase64(file) {
 | 
					 | 
				
			||||||
		return new Promise((resolve, reject) => {
 | 
					 | 
				
			||||||
			const reader = new FileReader()
 | 
					 | 
				
			||||||
			reader.readAsDataURL(file)
 | 
					 | 
				
			||||||
			reader.onload = () => resolve(reader.result)
 | 
					 | 
				
			||||||
			reader.onerror = (error) => reject(error)
 | 
					 | 
				
			||||||
		})
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	const previewVisible = ref(false)
 | 
					 | 
				
			||||||
	const previewImage = ref('')
 | 
					 | 
				
			||||||
	const previewTitle = ref('')
 | 
					 | 
				
			||||||
	const fileList = ref([
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			uid: '-1',
 | 
					 | 
				
			||||||
			name: 'image.png',
 | 
					 | 
				
			||||||
			status: 'done',
 | 
					 | 
				
			||||||
			url: 'https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png'
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			uid: '-2',
 | 
					 | 
				
			||||||
			name: 'image.png',
 | 
					 | 
				
			||||||
			status: 'done',
 | 
					 | 
				
			||||||
			url: 'https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png'
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			uid: '-3',
 | 
					 | 
				
			||||||
			name: 'image.png',
 | 
					 | 
				
			||||||
			status: 'done',
 | 
					 | 
				
			||||||
			url: 'https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png'
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			uid: '-4',
 | 
					 | 
				
			||||||
			name: 'image.png',
 | 
					 | 
				
			||||||
			status: 'done',
 | 
					 | 
				
			||||||
			url: 'https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png'
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
	])
 | 
					 | 
				
			||||||
	const handleCancel = () => {
 | 
					 | 
				
			||||||
		previewVisible.value = false
 | 
					 | 
				
			||||||
		previewTitle.value = ''
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	const handlePreview = async (file) => {
 | 
					 | 
				
			||||||
		if (!file.url && !file.preview) {
 | 
					 | 
				
			||||||
			file.preview = await getBase64(file.originFileObj)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		previewImage.value = file.url || file.preview
 | 
					 | 
				
			||||||
		previewVisible.value = true
 | 
					 | 
				
			||||||
		previewTitle.value = file.name || file.url.substring(file.url.lastIndexOf('/') + 1)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
</script>
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<style scoped lang="less">
 | 
					<style scoped lang="less">
 | 
				
			||||||
| 
						 | 
					@ -133,4 +201,26 @@
 | 
				
			||||||
			width: 100%;
 | 
								width: 100%;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						.fields {
 | 
				
			||||||
 | 
							border: 1px solid #dcdee2;
 | 
				
			||||||
 | 
							padding: 15px 0;
 | 
				
			||||||
 | 
							border-radius: 5px;
 | 
				
			||||||
 | 
							height: 40vh;
 | 
				
			||||||
 | 
							overflow: hidden;
 | 
				
			||||||
 | 
							overflow-y: auto;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							&-item {
 | 
				
			||||||
 | 
								cursor: pointer;
 | 
				
			||||||
 | 
								height: 50px;
 | 
				
			||||||
 | 
								margin: 0;
 | 
				
			||||||
 | 
								line-height: 50px;
 | 
				
			||||||
 | 
								padding: 0 20px;
 | 
				
			||||||
 | 
								font-size: 16px;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								&:hover {
 | 
				
			||||||
 | 
									background: #f5f7fa;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
</style>
 | 
					</style>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -11,9 +11,7 @@
 | 
				
			||||||
				</div>
 | 
									</div>
 | 
				
			||||||
				<div class="container-box">
 | 
									<div class="container-box">
 | 
				
			||||||
					<h3 class="container-box-title">产品信息</h3>
 | 
										<h3 class="container-box-title">产品信息</h3>
 | 
				
			||||||
					<p class="container-box-desc">产品名称:莫个葡萄红酒</p>
 | 
										<p class="container-box-desc">产品名称:</p>
 | 
				
			||||||
					<p class="container-box-desc">产品名称:莫个葡萄红酒</p>
 | 
					 | 
				
			||||||
					<p class="container-box-desc">产品名称:莫个葡萄红酒</p>
 | 
					 | 
				
			||||||
				</div>
 | 
									</div>
 | 
				
			||||||
				<div class="container-box">
 | 
									<div class="container-box">
 | 
				
			||||||
					<h3 class="container-box-title">防伪查询结果</h3>
 | 
										<h3 class="container-box-title">防伪查询结果</h3>
 | 
				
			||||||
| 
						 | 
					@ -21,9 +19,6 @@
 | 
				
			||||||
				</div>
 | 
									</div>
 | 
				
			||||||
				<div class="container-box">
 | 
									<div class="container-box">
 | 
				
			||||||
					<h3 class="container-box-title">溯源记录</h3>
 | 
										<h3 class="container-box-title">溯源记录</h3>
 | 
				
			||||||
					<p class="container-box-desc">产品名称:莫个葡萄红酒</p>
 | 
					 | 
				
			||||||
					<p class="container-box-desc">产品名称:莫个葡萄红酒</p>
 | 
					 | 
				
			||||||
					<p class="container-box-desc">产品名称:莫个葡萄红酒</p>
 | 
					 | 
				
			||||||
				</div>
 | 
									</div>
 | 
				
			||||||
			</div>
 | 
								</div>
 | 
				
			||||||
		</div>
 | 
							</div>
 | 
				
			||||||
| 
						 | 
					@ -31,7 +26,12 @@
 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script setup>
 | 
					<script setup>
 | 
				
			||||||
	// const props = defineProps({})
 | 
						const props = defineProps({
 | 
				
			||||||
 | 
							info: {
 | 
				
			||||||
 | 
								type: Object,
 | 
				
			||||||
 | 
								default: () => {}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// const emit = defineEmits()
 | 
						// const emit = defineEmits()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -101,19 +101,7 @@
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	const {
 | 
						const { searchFormState, tableRef, columns, loadData, reset, options, searchFormRef } = useTableManagement(
 | 
				
			||||||
		searchFormState,
 | 
					 | 
				
			||||||
		tableRef,
 | 
					 | 
				
			||||||
		selectedRowKeys,
 | 
					 | 
				
			||||||
		columns,
 | 
					 | 
				
			||||||
		loadData,
 | 
					 | 
				
			||||||
		reset,
 | 
					 | 
				
			||||||
		deleteBatchRecords,
 | 
					 | 
				
			||||||
		options,
 | 
					 | 
				
			||||||
		searchFormRef,
 | 
					 | 
				
			||||||
		navigateTo,
 | 
					 | 
				
			||||||
		deleteRecord
 | 
					 | 
				
			||||||
	} = useTableManagement(
 | 
					 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			page: produceBarcodeHistoryApi.produceBarcodeHistoryPage
 | 
								page: produceBarcodeHistoryApi.produceBarcodeHistoryPage
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,182 @@
 | 
				
			||||||
 | 
					<template>
 | 
				
			||||||
 | 
						<a-modal title="打印标签" :width="900" :visible="visible" :destroy-on-close="true" @close="onClose">
 | 
				
			||||||
 | 
							<DynamicForm :formItems="drawerForm" :model="formData" :rules="formRules" ref="formRef1" />
 | 
				
			||||||
 | 
							<template #footer>
 | 
				
			||||||
 | 
								<a-button style="margin-right: 8px" @click="onClose">关闭</a-button>
 | 
				
			||||||
 | 
								<a-button type="primary" @click="onSubmitForm">保存</a-button>
 | 
				
			||||||
 | 
							</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							<div>
 | 
				
			||||||
 | 
								<div style="display: none" id="hiprint-printTemplate"></div>
 | 
				
			||||||
 | 
							</div>
 | 
				
			||||||
 | 
						</a-modal>
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<script setup name="productionOrganizationForm">
 | 
				
			||||||
 | 
						import { cloneDeep } from 'lodash-es'
 | 
				
			||||||
 | 
						import printApi from '@/api/print/printApi'
 | 
				
			||||||
 | 
						import materialCategoryApi from '@/api/base/material/materialCategoryApi'
 | 
				
			||||||
 | 
						import { drawerForm, formRules } from '@/views/productionBusiness/labelPrinting/materialPrint/formFields/drawerForm'
 | 
				
			||||||
 | 
						import useFormHandler from '@/hook/useFormHandler'
 | 
				
			||||||
 | 
						import materialApi from '@/api/base/material/materialApi'
 | 
				
			||||||
 | 
						import unitApi from '@/api/base/unit/unitApi'
 | 
				
			||||||
 | 
						import productCodePackageConfigApi from '@/api/production/productcode/productCodePackageConfigApi'
 | 
				
			||||||
 | 
						import { newHiprintPrintTemplate } from '@/views/productionBusiness/labelPrinting/template/detail/utils/template-helper'
 | 
				
			||||||
 | 
						import { getCurrentInstance } from 'vue'
 | 
				
			||||||
 | 
						import printRecordsApi from '@/api/print/printRecordsApi'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 抽屉状态
 | 
				
			||||||
 | 
						const visible = ref(false)
 | 
				
			||||||
 | 
						const emit = defineEmits({ successful: null })
 | 
				
			||||||
 | 
						const formRef1 = ref(null)
 | 
				
			||||||
 | 
						let recordData = reactive({})
 | 
				
			||||||
 | 
						let hiprintTemplate
 | 
				
			||||||
 | 
						const TEMPLATE_KEY = getCurrentInstance().type.name // 存储模板对象的 key
 | 
				
			||||||
 | 
						let templateRef = ref('')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 打开抽屉
 | 
				
			||||||
 | 
						const onOpen = async (record) => {
 | 
				
			||||||
 | 
							visible.value = true
 | 
				
			||||||
 | 
							formRules.value = [formRef1.value]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (record) {
 | 
				
			||||||
 | 
								recordData = cloneDeep(record)
 | 
				
			||||||
 | 
								fetchData().then(() => {
 | 
				
			||||||
 | 
									populateFormData(recordData)
 | 
				
			||||||
 | 
								})
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								fetchData()
 | 
				
			||||||
 | 
								recordData = {}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// 打印模版
 | 
				
			||||||
 | 
							const printTemplateList = await printApi.printTemplateList()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// 包装关系
 | 
				
			||||||
 | 
							const materialPackageData = await materialApi.materialPackageData({
 | 
				
			||||||
 | 
								materialId: record.id
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// 基本单位
 | 
				
			||||||
 | 
							const unitList = await unitApi.sysUnitList({
 | 
				
			||||||
 | 
								groupId: record.unitGroupId
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// 码包配置
 | 
				
			||||||
 | 
							const productCodePackageConfigListData = await productCodePackageConfigApi.productCodePackageConfigList()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							drawerForm.forEach((item) => {
 | 
				
			||||||
 | 
								if (item.name === 'templateId') {
 | 
				
			||||||
 | 
									item.attrs.options = printTemplateList || []
 | 
				
			||||||
 | 
									item.attrs.onChange = (value) => {
 | 
				
			||||||
 | 
										templateRef.value = JSON.parse(printTemplateList.filter((item) => item.id === value)[0].templateData)
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (item.name === 'materialPackageId') {
 | 
				
			||||||
 | 
									item.attrs.options = materialPackageData.filter((item) => item.enabledState === 'ENABLE')
 | 
				
			||||||
 | 
									item.attrs.onChange = (value) => {
 | 
				
			||||||
 | 
										// 获取当前选择的单位
 | 
				
			||||||
 | 
										const materialPackage = materialPackageData.filter((item) => item.id === value)[0]
 | 
				
			||||||
 | 
										const unit = unitList.filter((item) => item.id === formData.unitId)[0]
 | 
				
			||||||
 | 
										formData.printNumber = (parseInt(materialPackage.unitRate) * formData.harvestNumber) / unit.rate
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (item.name === 'unitId') {
 | 
				
			||||||
 | 
									item.attrs.options = unitList
 | 
				
			||||||
 | 
									item.attrs.onChange = (value) => {
 | 
				
			||||||
 | 
										// 获取当前选择的单位
 | 
				
			||||||
 | 
										const unit = unitList.filter((item) => item.id === value)[0]
 | 
				
			||||||
 | 
										formData.printNumber = unit.rate * formData.harvestNumber
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (item.name === 'packageConfigId') {
 | 
				
			||||||
 | 
									item.attrs.options = productCodePackageConfigListData
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (item.name === 'harvestNumber') {
 | 
				
			||||||
 | 
									item.attrs.onChange = (value) => {
 | 
				
			||||||
 | 
										formData.printNumber = formData.harvestNumber
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							materialCategoryApi.materialCategoryTree().then((res) => {
 | 
				
			||||||
 | 
								drawerForm.forEach((item) => {
 | 
				
			||||||
 | 
									if (item.name === 'templateId') {
 | 
				
			||||||
 | 
										item.attrs.treeData = res
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								})
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						// 关闭抽屉
 | 
				
			||||||
 | 
						const onClose = () => {
 | 
				
			||||||
 | 
							visible.value = false
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						// 默认要校验的refresh
 | 
				
			||||||
 | 
						// 验证并提交数据
 | 
				
			||||||
 | 
						const onSubmitForm = () => {
 | 
				
			||||||
 | 
							// 打印标签先生成打印模版
 | 
				
			||||||
 | 
							/*onSubmit({
 | 
				
			||||||
 | 
								isEnable: true,
 | 
				
			||||||
 | 
								id: recordData.id
 | 
				
			||||||
 | 
							}).then(() => {
 | 
				
			||||||
 | 
								onClose()
 | 
				
			||||||
 | 
								emit('successful')
 | 
				
			||||||
 | 
							})*/
 | 
				
			||||||
 | 
							/*buildDesigner()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// 参数: 打印时设置 左偏移量,上偏移量
 | 
				
			||||||
 | 
							let options = { leftOffset: -1, topOffset: -1 }
 | 
				
			||||||
 | 
							// 扩展
 | 
				
			||||||
 | 
							let ext = {
 | 
				
			||||||
 | 
								callback: () => {
 | 
				
			||||||
 | 
									console.log('浏览器打印窗口已打开')
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							// 调用浏览器打印
 | 
				
			||||||
 | 
							hiprintTemplate.print(
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									name: '1231231',
 | 
				
			||||||
 | 
									qrCode: '1231'
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								options,
 | 
				
			||||||
 | 
								ext
 | 
				
			||||||
 | 
							)*/
 | 
				
			||||||
 | 
							printRecordsApi
 | 
				
			||||||
 | 
								.printRecordsPrint({
 | 
				
			||||||
 | 
									...formData,
 | 
				
			||||||
 | 
									materialId: recordData.id
 | 
				
			||||||
 | 
								})
 | 
				
			||||||
 | 
								.then((res) => {
 | 
				
			||||||
 | 
									console.log(res)
 | 
				
			||||||
 | 
								})
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 初始化模板
 | 
				
			||||||
 | 
						const buildDesigner = () => {
 | 
				
			||||||
 | 
							// eslint-disable-next-line no-undef
 | 
				
			||||||
 | 
							$('#hiprint-printTemplate').empty() // 先清空, 避免重复构建
 | 
				
			||||||
 | 
							// 注意事项: 模板json(object)
 | 
				
			||||||
 | 
							// 如果使用 vue ref创建的模板json, 需要使用 .value 获取 (确保内部能够使用 object.key 拿到对应数据就行)
 | 
				
			||||||
 | 
							hiprintTemplate = newHiprintPrintTemplate(TEMPLATE_KEY, {
 | 
				
			||||||
 | 
								template: templateRef.value, // 模板json(object)
 | 
				
			||||||
 | 
								settingContainer: '#PrintElementOptionSetting' // 元素参数容器
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
							// hiprintTemplate.bindData(recordData)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// 构建 并填充到 容器中
 | 
				
			||||||
 | 
							hiprintTemplate.design('#hiprint-printTemplate')
 | 
				
			||||||
 | 
							console.log(hiprintTemplate)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						let { formData, onSubmit, populateFormData, fetchData } = useFormHandler([...drawerForm], {
 | 
				
			||||||
 | 
							submitForm: materialCategoryApi.materialCategorySubmitForm
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
						// 抛出函数
 | 
				
			||||||
 | 
						defineExpose({
 | 
				
			||||||
 | 
							onOpen
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,157 @@
 | 
				
			||||||
 | 
					import tool from '@/utils/tool'
 | 
				
			||||||
 | 
					import { required } from '@/utils/formRules'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const drawerForm = reactive([
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							label: '打印模版:',
 | 
				
			||||||
 | 
							name: 'templateId',
 | 
				
			||||||
 | 
							type: 'a-select',
 | 
				
			||||||
 | 
							span: 8,
 | 
				
			||||||
 | 
							attrs: {
 | 
				
			||||||
 | 
								placeholder: '请选择打印模版',
 | 
				
			||||||
 | 
								allowClear: true,
 | 
				
			||||||
 | 
								fieldNames: {
 | 
				
			||||||
 | 
									children: 'children',
 | 
				
			||||||
 | 
									label: 'name',
 | 
				
			||||||
 | 
									value: 'id'
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							label: '收货数量:',
 | 
				
			||||||
 | 
							name: 'harvestNumber',
 | 
				
			||||||
 | 
							type: 'a-input',
 | 
				
			||||||
 | 
							span: 8,
 | 
				
			||||||
 | 
							attrs: {
 | 
				
			||||||
 | 
								placeholder: '请输入收货数量',
 | 
				
			||||||
 | 
								allowClear: true
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							label: '单位:',
 | 
				
			||||||
 | 
							name: 'unitId',
 | 
				
			||||||
 | 
							type: 'a-select',
 | 
				
			||||||
 | 
							span: 8,
 | 
				
			||||||
 | 
							attrs: {
 | 
				
			||||||
 | 
								placeholder: '请选择单位',
 | 
				
			||||||
 | 
								fieldNames: {
 | 
				
			||||||
 | 
									children: 'children',
 | 
				
			||||||
 | 
									label: 'name',
 | 
				
			||||||
 | 
									value: 'id'
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							label: '标签数(张):',
 | 
				
			||||||
 | 
							name: 'printNumber',
 | 
				
			||||||
 | 
							type: 'a-input-number',
 | 
				
			||||||
 | 
							span: 8,
 | 
				
			||||||
 | 
							attrs: {
 | 
				
			||||||
 | 
								placeholder: '请输入标签数',
 | 
				
			||||||
 | 
								treeData: [],
 | 
				
			||||||
 | 
								fieldNames: {
 | 
				
			||||||
 | 
									children: 'children',
 | 
				
			||||||
 | 
									label: 'name',
 | 
				
			||||||
 | 
									value: 'id'
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								disabled: true
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							label: '标准包装数量:',
 | 
				
			||||||
 | 
							name: 'standardPackageNumber',
 | 
				
			||||||
 | 
							type: 'a-input-number',
 | 
				
			||||||
 | 
							span: 8,
 | 
				
			||||||
 | 
							attrs: {
 | 
				
			||||||
 | 
								placeholder: '请输入标准包装数量',
 | 
				
			||||||
 | 
								treeData: [],
 | 
				
			||||||
 | 
								fieldNames: {
 | 
				
			||||||
 | 
									children: 'children',
 | 
				
			||||||
 | 
									label: 'name',
 | 
				
			||||||
 | 
									value: 'id'
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							label: '包装:',
 | 
				
			||||||
 | 
							name: 'materialPackageId',
 | 
				
			||||||
 | 
							type: 'a-select',
 | 
				
			||||||
 | 
							span: 8,
 | 
				
			||||||
 | 
							attrs: {
 | 
				
			||||||
 | 
								placeholder: '请选择包装',
 | 
				
			||||||
 | 
								treeData: [],
 | 
				
			||||||
 | 
								fieldNames: {
 | 
				
			||||||
 | 
									children: 'children',
 | 
				
			||||||
 | 
									label: 'name',
 | 
				
			||||||
 | 
									value: 'id'
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							label: '包装单位:',
 | 
				
			||||||
 | 
							name: 'packageUnit',
 | 
				
			||||||
 | 
							type: 'a-tree-select',
 | 
				
			||||||
 | 
							span: 8,
 | 
				
			||||||
 | 
							attrs: {
 | 
				
			||||||
 | 
								placeholder: '请选择包装单位',
 | 
				
			||||||
 | 
								treeData: [],
 | 
				
			||||||
 | 
								fieldNames: {
 | 
				
			||||||
 | 
									children: 'children',
 | 
				
			||||||
 | 
									label: 'name',
 | 
				
			||||||
 | 
									value: 'id'
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								disabled: true
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							label: '二维码规则:',
 | 
				
			||||||
 | 
							name: 'packageConfigId',
 | 
				
			||||||
 | 
							type: 'a-select',
 | 
				
			||||||
 | 
							span: 8,
 | 
				
			||||||
 | 
							attrs: {
 | 
				
			||||||
 | 
								placeholder: '请选择二维码规则',
 | 
				
			||||||
 | 
								fieldNames: {
 | 
				
			||||||
 | 
									children: 'children',
 | 
				
			||||||
 | 
									label: 'name',
 | 
				
			||||||
 | 
									value: 'id'
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							label: '生产日期:',
 | 
				
			||||||
 | 
							name: 'productionTime',
 | 
				
			||||||
 | 
							type: 'a-date-picker',
 | 
				
			||||||
 | 
							span: 8,
 | 
				
			||||||
 | 
							attrs: {
 | 
				
			||||||
 | 
								placeholder: '请输入生产日期',
 | 
				
			||||||
 | 
								allowClear: true,
 | 
				
			||||||
 | 
								valueFormat: 'YYYY-MM-DD HH:mm:ss'
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							label: '失效日期:',
 | 
				
			||||||
 | 
							name: 'failureTime',
 | 
				
			||||||
 | 
							type: 'a-date-picker',
 | 
				
			||||||
 | 
							span: 8,
 | 
				
			||||||
 | 
							attrs: {
 | 
				
			||||||
 | 
								placeholder: '请输入失效日期',
 | 
				
			||||||
 | 
								allowClear: true,
 | 
				
			||||||
 | 
								valueFormat: 'YYYY-MM-DD HH:mm:ss'
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							label: '批次:',
 | 
				
			||||||
 | 
							name: 'batch',
 | 
				
			||||||
 | 
							type: 'a-input',
 | 
				
			||||||
 | 
							span: 8,
 | 
				
			||||||
 | 
							attrs: {
 | 
				
			||||||
 | 
								placeholder: '请输入批次'
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const formRules = {
 | 
				
			||||||
 | 
						name: [required('请输入名称')],
 | 
				
			||||||
 | 
						parentId: [required('请选择上级物料')]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -13,7 +13,6 @@
 | 
				
			||||||
					ref="dynamicTreeRef"
 | 
										ref="dynamicTreeRef"
 | 
				
			||||||
					treeTitle="物料分类"
 | 
										treeTitle="物料分类"
 | 
				
			||||||
					:tableRef="tableRef"
 | 
										:tableRef="tableRef"
 | 
				
			||||||
					:openFormRef="materialCategoryFormRef"
 | 
					 | 
				
			||||||
					:apiModel="{
 | 
										:apiModel="{
 | 
				
			||||||
						getTree: materialCategoryApi.materialCategoryTree,
 | 
											getTree: materialCategoryApi.materialCategoryTree,
 | 
				
			||||||
						delTree: materialCategoryApi.materialCategoryDelete
 | 
											delTree: materialCategoryApi.materialCategoryDelete
 | 
				
			||||||
| 
						 | 
					@ -55,7 +54,7 @@
 | 
				
			||||||
						</template>
 | 
											</template>
 | 
				
			||||||
						<template v-if="column.dataIndex === 'action'">
 | 
											<template v-if="column.dataIndex === 'action'">
 | 
				
			||||||
							<a-space>
 | 
												<a-space>
 | 
				
			||||||
								<a> 打印标签 </a>
 | 
													<a @click="handleOpen(record)"> 打印标签 </a>
 | 
				
			||||||
							</a-space>
 | 
												</a-space>
 | 
				
			||||||
						</template>
 | 
											</template>
 | 
				
			||||||
					</template>
 | 
										</template>
 | 
				
			||||||
| 
						 | 
					@ -64,33 +63,25 @@
 | 
				
			||||||
		</a-row>
 | 
							</a-row>
 | 
				
			||||||
	</a-card>
 | 
						</a-card>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	<material-category-form ref="materialCategoryFormRef" @successful="successful"></material-category-form>
 | 
						<!--	<material-category-form ref="materialCategoryFormRef" @successful="successful"></material-category-form>-->
 | 
				
			||||||
 | 
						<material-print-form ref="materialPrintFormRef"></material-print-form>
 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script setup name="materiel">
 | 
					<script setup name="materiel">
 | 
				
			||||||
	import materialApi from '@/api/base/material/materialApi'
 | 
						import materialApi from '@/api/base/material/materialApi'
 | 
				
			||||||
	import materialCategoryApi from '@/api/base/material/materialCategoryApi'
 | 
						import materialCategoryApi from '@/api/base/material/materialCategoryApi'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	import MaterialCategoryForm from '@/views/productionBusiness/basicData/materiel/detail/materialCategoryForm.vue'
 | 
						// import MaterialCategoryForm from '@/views/productionBusiness/basicData/materiel/detail/materialCategoryForm.vue'
 | 
				
			||||||
 | 
						import MaterialPrintForm from '@/views/productionBusiness/labelPrinting/materialPrint/detail/materialPrintForm.vue'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	import { useTableManagement } from '@/hook/useTableManagement'
 | 
						import { useTableManagement } from '@/hook/useTableManagement'
 | 
				
			||||||
	import { materielColumn } from '@/views/productionBusiness/basicData/materiel/column/materiel-column'
 | 
						import { materielColumn } from '@/views/productionBusiness/basicData/materiel/column/materiel-column'
 | 
				
			||||||
	import { searchFields } from '@/views/productionBusiness/basicData/materiel/formFields/searchFields'
 | 
						import { searchFields } from '@/views/productionBusiness/basicData/materiel/formFields/searchFields'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	const materialCategoryFormRef = ref(null)
 | 
						const materialPrintFormRef = ref(null)
 | 
				
			||||||
	const dynamicTreeRef = ref(null)
 | 
						const dynamicTreeRef = ref(null)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	const {
 | 
						const { searchFormState, tableRef, columns, loadData, options } = useTableManagement(
 | 
				
			||||||
		searchFormState,
 | 
					 | 
				
			||||||
		tableRef,
 | 
					 | 
				
			||||||
		selectedRowKeys,
 | 
					 | 
				
			||||||
		columns,
 | 
					 | 
				
			||||||
		loadData,
 | 
					 | 
				
			||||||
		deleteBatchRecords,
 | 
					 | 
				
			||||||
		options,
 | 
					 | 
				
			||||||
		navigateTo,
 | 
					 | 
				
			||||||
		deleteRecord
 | 
					 | 
				
			||||||
	} = useTableManagement(
 | 
					 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			page: materialApi.materialPage,
 | 
								page: materialApi.materialPage,
 | 
				
			||||||
			delete: materialApi.materialDelete
 | 
								delete: materialApi.materialDelete
 | 
				
			||||||
| 
						 | 
					@ -114,11 +105,8 @@
 | 
				
			||||||
		tableRef.value.refresh()
 | 
							tableRef.value.refresh()
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	const successful = () => {
 | 
						const handleOpen = (record) => {
 | 
				
			||||||
		searchFormState.value.categoryId = null
 | 
							materialPrintFormRef.value.onOpen(record)
 | 
				
			||||||
		tableRef.value.refresh()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		dynamicTreeRef.value.loadTreeData()
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	onMounted(() => {
 | 
						onMounted(() => {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,54 @@
 | 
				
			||||||
 | 
					export const labelRecords = [
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							title: '物料名称',
 | 
				
			||||||
 | 
							dataIndex: 'materialName'
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							title: '打印数量',
 | 
				
			||||||
 | 
							dataIndex: 'printNumber'
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							title: '二维码生成规则',
 | 
				
			||||||
 | 
							dataIndex: 'packageConfigName'
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							title: '打印模版',
 | 
				
			||||||
 | 
							dataIndex: 'templateName'
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							title: '生效时间',
 | 
				
			||||||
 | 
							dataIndex: 'productionTime'
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							title: '失效时间',
 | 
				
			||||||
 | 
							dataIndex: 'productionTime'
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							title: '创建时间',
 | 
				
			||||||
 | 
							dataIndex: 'createTime'
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const labelDetailColumns = [
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							title: '产码',
 | 
				
			||||||
 | 
							dataIndex: 'productCode',
 | 
				
			||||||
 | 
							align: 'center'
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							title: '产码类型',
 | 
				
			||||||
 | 
							dataIndex: 'productCodeType',
 | 
				
			||||||
 | 
							align: 'center'
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							title: '创建时间',
 | 
				
			||||||
 | 
							dataIndex: 'createTime',
 | 
				
			||||||
 | 
							align: 'center'
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							title: '操作',
 | 
				
			||||||
 | 
							dataIndex: 'action',
 | 
				
			||||||
 | 
							align: 'center',
 | 
				
			||||||
 | 
							scopedSlots: { customRender: 'action' }
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,106 @@
 | 
				
			||||||
 | 
					<template>
 | 
				
			||||||
 | 
						<a-modal title="打印标签" :width="900" v-model:visible="visible" :destroy-on-close="true" @close="onClose">
 | 
				
			||||||
 | 
							<DynamicForm :formItems="drawerForm" :model="formData" ref="formRef1" />
 | 
				
			||||||
 | 
							<template #footer>
 | 
				
			||||||
 | 
								<a-button style="margin-right: 8px" @click="onClose">关闭</a-button>
 | 
				
			||||||
 | 
							</template>
 | 
				
			||||||
 | 
							<a-table :dataSource="dataSource" :columns="labelDetailColumns" :pagination="false">
 | 
				
			||||||
 | 
								<template #bodyCell="{ record, column, index }">
 | 
				
			||||||
 | 
									<template v-if="column.dataIndex === 'productCodeType'">
 | 
				
			||||||
 | 
										{{ $TOOL.dictTypeData('DCGS', record.productCodeType) }}
 | 
				
			||||||
 | 
									</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									<template v-if="column.dataIndex === 'action'">
 | 
				
			||||||
 | 
										<a @click="handlePrint(record)"> 打印标签 </a>
 | 
				
			||||||
 | 
									</template>
 | 
				
			||||||
 | 
								</template>
 | 
				
			||||||
 | 
							</a-table>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							<div>
 | 
				
			||||||
 | 
								<div style="display: none" id="hiprint-printTemplate"></div>
 | 
				
			||||||
 | 
							</div>
 | 
				
			||||||
 | 
						</a-modal>
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<script setup name="productionOrganizationForm">
 | 
				
			||||||
 | 
						import { cloneDeep } from 'lodash-es'
 | 
				
			||||||
 | 
						import materialCategoryApi from '@/api/base/material/materialCategoryApi'
 | 
				
			||||||
 | 
						import { drawerForm } from '@/views/productionBusiness/labelPrinting/records/formFields/drawerForm'
 | 
				
			||||||
 | 
						import useFormHandler from '@/hook/useFormHandler'
 | 
				
			||||||
 | 
						import materialApi from '@/api/base/material/materialApi'
 | 
				
			||||||
 | 
						import { labelDetailColumns } from '@/views/productionBusiness/labelPrinting/records/columns'
 | 
				
			||||||
 | 
						import printRecordsApi from '@/api/print/printRecordsApi'
 | 
				
			||||||
 | 
						import {getCurrentInstance} from "vue";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 抽屉状态
 | 
				
			||||||
 | 
						const visible = ref(false)
 | 
				
			||||||
 | 
						const emit = defineEmits({ successful: null })
 | 
				
			||||||
 | 
						const formRef1 = ref(null)
 | 
				
			||||||
 | 
						let recordData = reactive({})
 | 
				
			||||||
 | 
						let dataSource = ref([])
 | 
				
			||||||
 | 
						let hiprintTemplate
 | 
				
			||||||
 | 
						const TEMPLATE_KEY = getCurrentInstance().type.name // 存储模板对象的 key
 | 
				
			||||||
 | 
						let templateRef = ref({})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 打开抽屉
 | 
				
			||||||
 | 
						const onOpen = async (record) => {
 | 
				
			||||||
 | 
							visible.value = true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (record) {
 | 
				
			||||||
 | 
								recordData = cloneDeep(record)
 | 
				
			||||||
 | 
								/// 获取打印详情
 | 
				
			||||||
 | 
								const printRecordsData = await printRecordsApi.printRecordsDetail({
 | 
				
			||||||
 | 
									id: record.id
 | 
				
			||||||
 | 
								})
 | 
				
			||||||
 | 
								// 获取物料的详情
 | 
				
			||||||
 | 
								const materialData = await materialApi.materialDetail({
 | 
				
			||||||
 | 
									id: record.materialId
 | 
				
			||||||
 | 
								})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								const productCodeList = await printRecordsApi.printTemplateGetProductCode({
 | 
				
			||||||
 | 
									id: recordData.id
 | 
				
			||||||
 | 
								})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								templateRef.value = JSON.parse(printRecordsData.templateData)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								dataSource.value = productCodeList
 | 
				
			||||||
 | 
								fetchData().then(() => {
 | 
				
			||||||
 | 
									populateFormData(materialData)
 | 
				
			||||||
 | 
								})
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								fetchData()
 | 
				
			||||||
 | 
								recordData = {}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						// 关闭抽屉
 | 
				
			||||||
 | 
						const onClose = () => {
 | 
				
			||||||
 | 
							visible.value = false
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						const handlePrint = (record) => {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 初始化模板
 | 
				
			||||||
 | 
						const buildDesigner = () => {
 | 
				
			||||||
 | 
							// eslint-disable-next-line no-undef
 | 
				
			||||||
 | 
							$('#hiprint-printTemplate').empty() // 先清空, 避免重复构建
 | 
				
			||||||
 | 
							// 注意事项: 模板json(object)
 | 
				
			||||||
 | 
							// 如果使用 vue ref创建的模板json, 需要使用 .value 获取 (确保内部能够使用 object.key 拿到对应数据就行)
 | 
				
			||||||
 | 
							hiprintTemplate = newHiprintPrintTemplate(TEMPLATE_KEY, {
 | 
				
			||||||
 | 
								template: templateRef.value, // 模板json(object)
 | 
				
			||||||
 | 
								settingContainer: '#PrintElementOptionSetting' // 元素参数容器
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
							// hiprintTemplate.bindData(recordData)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// 构建 并填充到 容器中
 | 
				
			||||||
 | 
							hiprintTemplate.design('#hiprint-printTemplate')
 | 
				
			||||||
 | 
							console.log(hiprintTemplate)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						let { formData, onSubmit, populateFormData, fetchData } = useFormHandler([...drawerForm], {
 | 
				
			||||||
 | 
							submitForm: materialCategoryApi.materialCategorySubmitForm
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
						// 抛出函数
 | 
				
			||||||
 | 
						defineExpose({
 | 
				
			||||||
 | 
							onOpen
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,13 @@
 | 
				
			||||||
 | 
					import tool from '@/utils/tool'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const drawerForm = [
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							label: '单据号:',
 | 
				
			||||||
 | 
							name: 'number',
 | 
				
			||||||
 | 
							type: 'a-input',
 | 
				
			||||||
 | 
							attrs: {
 | 
				
			||||||
 | 
								placeholder: '请输入单号',
 | 
				
			||||||
 | 
								allowClear: true,
 | 
				
			||||||
 | 
								disabled: true
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}]
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,72 @@
 | 
				
			||||||
 | 
					<template>
 | 
				
			||||||
 | 
						<AdvancedSearchForm
 | 
				
			||||||
 | 
							:formState="searchFormState"
 | 
				
			||||||
 | 
							:formFields="searchFields"
 | 
				
			||||||
 | 
							@search="tableRef.refresh()"
 | 
				
			||||||
 | 
							@reset="tableRef.refresh()"
 | 
				
			||||||
 | 
						/>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						<a-card :bordered="false" class="mt-4" style="height: 100%">
 | 
				
			||||||
 | 
							<s-table
 | 
				
			||||||
 | 
								ref="tableRef"
 | 
				
			||||||
 | 
								:columns="columns"
 | 
				
			||||||
 | 
								:data="loadData"
 | 
				
			||||||
 | 
								bordered
 | 
				
			||||||
 | 
								:row-key="(record) => record.id"
 | 
				
			||||||
 | 
								:tool-config="options.toolConfig"
 | 
				
			||||||
 | 
								:scroll="{
 | 
				
			||||||
 | 
									x: 100
 | 
				
			||||||
 | 
								}"
 | 
				
			||||||
 | 
							>
 | 
				
			||||||
 | 
								<template #bodyCell="{ column, record }">
 | 
				
			||||||
 | 
									<template v-if="column.dataIndex === 'number'">
 | 
				
			||||||
 | 
										<span style="color: #0d84ff">{{ record.number }}</span>
 | 
				
			||||||
 | 
									</template>
 | 
				
			||||||
 | 
									<template v-if="column.dataIndex === 'enabledState'">
 | 
				
			||||||
 | 
										<a-tag color="#87d068" v-if="record.enabledState === 'ENABLE'">启用</a-tag>
 | 
				
			||||||
 | 
										<a-tag color="#f50" v-if="record.enabledState === 'DISABLED'">停用</a-tag>
 | 
				
			||||||
 | 
									</template>
 | 
				
			||||||
 | 
									<template v-if="column.dataIndex === 'action'">
 | 
				
			||||||
 | 
										<a-space>
 | 
				
			||||||
 | 
											<a
 | 
				
			||||||
 | 
												@click="handleOpen(record)"
 | 
				
			||||||
 | 
											>
 | 
				
			||||||
 | 
												<EyeOutlined />
 | 
				
			||||||
 | 
												查看
 | 
				
			||||||
 | 
											</a>
 | 
				
			||||||
 | 
										</a-space>
 | 
				
			||||||
 | 
									</template>
 | 
				
			||||||
 | 
								</template>
 | 
				
			||||||
 | 
							</s-table>
 | 
				
			||||||
 | 
						</a-card>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						<RecordsDetail ref="RecordsDetailRef"></RecordsDetail>
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<script setup name="brand">
 | 
				
			||||||
 | 
						import printRecordsApi from '@/api/print/printRecordsApi'
 | 
				
			||||||
 | 
						import { useTableManagement } from '@/hook/useTableManagement'
 | 
				
			||||||
 | 
						import { searchFields } from '@/views/productionBusiness/basicData/brand/formFields/searchFields'
 | 
				
			||||||
 | 
						import { labelRecords } from '@/views/productionBusiness/labelPrinting/records/columns'
 | 
				
			||||||
 | 
						import RecordsDetail from '@/views/productionBusiness/labelPrinting/records/detail/RecordsDetail.vue'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						const RecordsDetailRef = ref(null)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						const handleOpen = (record) => {
 | 
				
			||||||
 | 
							RecordsDetailRef.value.onOpen(record)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						const {
 | 
				
			||||||
 | 
							searchFormState,
 | 
				
			||||||
 | 
							tableRef,
 | 
				
			||||||
 | 
							columns,
 | 
				
			||||||
 | 
							loadData,
 | 
				
			||||||
 | 
							options,
 | 
				
			||||||
 | 
						} = useTableManagement(
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								page: printRecordsApi.printRecordsPage
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							labelRecords,
 | 
				
			||||||
 | 
							['sysBrandEdit', 'sysBrandDelete']
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
		Loading…
	
		Reference in New Issue