版本更新v0.01
parent
7520fa8dd9
commit
d3e251f3e4
|
@ -28,5 +28,5 @@ export default {
|
|||
// 获取仓库树结构
|
||||
sysStoreTree(data) {
|
||||
return request('tree', data, 'get')
|
||||
},
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import { baseRequest } from '@/utils/request'
|
||||
|
||||
const request = (url, ...arg) => baseRequest(`/inventory/inbound/` + url, ...arg)
|
||||
|
||||
const produceRequest = (url, ...arg) => baseRequest(`/produce/inbound/` + url, ...arg)
|
||||
/**
|
||||
* 入库单Api接口管理器
|
||||
*
|
||||
|
@ -15,15 +15,15 @@ export default {
|
|||
},
|
||||
// 获取入库单 明细列表
|
||||
inventoryInboundDetailList(data) {
|
||||
return request('/detail/list', data, 'get')
|
||||
return request('detail/list', data, 'get')
|
||||
},
|
||||
// 获取入库单 条码列表
|
||||
inventoryInboundBarcodeTree(data) {
|
||||
return request('/barcode/tree/list', data, 'get')
|
||||
return produceRequest('barcode/tree/list', data, 'get')
|
||||
},
|
||||
// 获取入库单 条码(子级)列表
|
||||
inventoryInboundBarcodeTreeChildren(data) {
|
||||
return request('/barcode/tree/childrenList', data, 'get')
|
||||
return request('barcode/tree/childrenList', data, 'get')
|
||||
},
|
||||
// 获取入库单详情
|
||||
inventoryInboundDetail(data) {
|
||||
|
|
|
@ -29,4 +29,8 @@ export default {
|
|||
inventoryInvoiceAuditPass(data, edit = false) {
|
||||
return request('audit/pass', data)
|
||||
},
|
||||
// 获取发货通知单明细列表
|
||||
inventoryInvoiceDetailList(data) {
|
||||
return request('detail/list', data, 'get')
|
||||
},
|
||||
}
|
||||
|
|
|
@ -24,5 +24,14 @@ export default {
|
|||
// 获取生产汇报单详情
|
||||
produceReportDetail(data) {
|
||||
return request('detail', data, 'get')
|
||||
},
|
||||
// 产品包装条码 树
|
||||
produceReportTreeList(data) {
|
||||
return request('barcode/tree/list', data, 'get')
|
||||
},
|
||||
|
||||
// 产品包装条码 树 子级
|
||||
produceReportTreeChildrenList(data) {
|
||||
return request('barcode/tree/childrenList', data, 'get')
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,175 @@
|
|||
<template>
|
||||
<div></div>
|
||||
<a-modal v-model:open="visible" title="物料选择" width="80%" @ok="handleOk" @cancel="handleClose">
|
||||
<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="name">
|
||||
<a-input v-model:value="searchFormState.name" placeholder="请输入名称" />
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="6">
|
||||
<a-form-item label="编码" name="number">
|
||||
<a-input v-model:value="searchFormState.number" placeholder="请输入编码" />
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="6">
|
||||
<a-form-item label="可用状态" name="enabledState">
|
||||
<a-select
|
||||
v-model:value="searchFormState.enabledState"
|
||||
placeholder="请选择可用状态"
|
||||
:options="$TOOL.dictList('COMMON_STATUS')"
|
||||
/>
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="6">
|
||||
<a-button type="primary" @click="tableRef.refresh()">查询</a-button>
|
||||
<a-button style="margin: 0 8px" @click="reset">重置</a-button>
|
||||
</a-col>
|
||||
</a-row>
|
||||
</a-form>
|
||||
|
||||
<a-row :gutter="24">
|
||||
<a-col :span="6">
|
||||
<dynamic-tree
|
||||
ref="dynamicTreeRef"
|
||||
treeTitle="物料分类"
|
||||
:tableRef="tableRef"
|
||||
:apiModel="{
|
||||
getTree: customerCategoryApi.customerCategoryTree,
|
||||
}"
|
||||
@selectTree="selectTree"
|
||||
@treeRefresh="treeRefresh"
|
||||
:toolConfig="{
|
||||
plus: false,
|
||||
edit: false,
|
||||
delete: false,
|
||||
refresh: true
|
||||
}"
|
||||
></dynamic-tree>
|
||||
</a-col>
|
||||
<a-col :span="18">
|
||||
<s-table
|
||||
ref="tableRef"
|
||||
:columns="columns"
|
||||
:data="loadData"
|
||||
:alert="options.alert.show"
|
||||
bordered
|
||||
:row-key="(record) => record.id"
|
||||
:tool-config="options.toolConfig"
|
||||
:row-selection="tableRowSelection"
|
||||
:scroll="{
|
||||
x: 100,
|
||||
y: 500
|
||||
}"
|
||||
>
|
||||
<template #bodyCell="{ column, record }">
|
||||
<template v-if="column.dataIndex === 'number'">
|
||||
<a href="#">{{ record.number }}</a>
|
||||
</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 === 'type'">
|
||||
{{ $TOOL.dictTypeData('OFFICIAL_ACCOUNT_TYPE', record.type) }}
|
||||
</template>
|
||||
</template>
|
||||
</s-table>
|
||||
</a-col>
|
||||
</a-row>
|
||||
</a-modal>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { useTableManagement } from '@/hook/useTableManagement'
|
||||
import { message } from 'ant-design-vue'
|
||||
import customerApi from "@/api/base/customer/customerApi";
|
||||
import customerCategoryApi from "@/api/base/customer/customerCategoryApi";
|
||||
import {clientColumn} from "@/views/productionBusiness/basicData/client/columns/clientColumn";
|
||||
|
||||
const emits = defineEmits(['ok'])
|
||||
|
||||
// 弹窗是否打开
|
||||
const visible = ref(false)
|
||||
// 物料分类
|
||||
const dynamicTreeRef = ref(null)
|
||||
// 列表查询
|
||||
const { searchFormState, tableRef, selectedRowKeys, columns, loadData, reset, options, searchFormRef } =
|
||||
useTableManagement(
|
||||
{
|
||||
page: customerApi.customerPage,
|
||||
},
|
||||
clientColumn,
|
||||
[],
|
||||
false
|
||||
)
|
||||
|
||||
// 选择树
|
||||
const selectTree = (value) => {
|
||||
searchFormState.value.categoryId = value.id
|
||||
tableRef.value.refresh()
|
||||
}
|
||||
|
||||
// 刷新树
|
||||
const treeRefresh = () => {
|
||||
searchFormState.value.categoryId = null
|
||||
tableRef.value.refresh()
|
||||
}
|
||||
|
||||
// 物料单选
|
||||
let clientSelectedRowKey = []
|
||||
let clientSelectedRows = []
|
||||
const tableRowSelection = {
|
||||
type: 'radio',
|
||||
onChange: (selectedRowKey, selectedRows) => {
|
||||
clientSelectedRowKey = selectedRowKey
|
||||
clientSelectedRows = selectedRows
|
||||
}
|
||||
}
|
||||
|
||||
// 确认
|
||||
const handleOk = () => {
|
||||
if (clientSelectedRowKey.length === 0) return message.error('请选择物料')
|
||||
|
||||
emits('ok', {
|
||||
clientSelectedRowKey,
|
||||
clientSelectedRows
|
||||
})
|
||||
|
||||
closeModal()
|
||||
}
|
||||
|
||||
// 关闭弹窗
|
||||
const handleClose = () => {
|
||||
closeModal()
|
||||
}
|
||||
|
||||
// 关闭方法
|
||||
const closeModal = () => {
|
||||
// 关闭弹窗
|
||||
visible.value = false
|
||||
// 清空table 选项
|
||||
tableRef.value.clearSelected()
|
||||
}
|
||||
|
||||
// 打开方法
|
||||
const showOpen = () => {
|
||||
visible.value = true
|
||||
|
||||
nextTick(() => {
|
||||
// 加载物料分类
|
||||
dynamicTreeRef.value.loadTreeData()
|
||||
|
||||
// 加载表格
|
||||
tableRef.value.refresh()
|
||||
})
|
||||
}
|
||||
|
||||
// 导出方法
|
||||
defineExpose({
|
||||
showOpen
|
||||
})
|
||||
</script>
|
||||
|
||||
<style scoped></style>
|
|
@ -59,9 +59,7 @@
|
|||
ref="formRef2"
|
||||
/>
|
||||
</a-tab-pane>
|
||||
<a-tab-pane key="2" tab="扩展字段" force-render>
|
||||
|
||||
</a-tab-pane>
|
||||
<a-tab-pane key="2" tab="扩展字段" force-render> </a-tab-pane>
|
||||
<a-tab-pane key="3" tab="操作信息" v-if="route.query.type !== 'ADD'">
|
||||
<OperationalInformation :detailData="detailData" :colSpan="6"></OperationalInformation>
|
||||
</a-tab-pane>
|
||||
|
@ -108,13 +106,10 @@
|
|||
const formRef1 = ref(null)
|
||||
const formRef2 = ref(null)
|
||||
|
||||
const { formData, formRefs, onSubmit, handleBack, fetchData } = useFormHandler(
|
||||
[...formItems, ...baseFormItems],
|
||||
{
|
||||
const { formData, formRefs, onSubmit, handleBack, fetchData } = useFormHandler([...formItems, ...baseFormItems], {
|
||||
submitForm: supplierApi.supplierSubmitForm,
|
||||
getDetail: supplierApi.supplierDetail
|
||||
}
|
||||
)
|
||||
})
|
||||
|
||||
const onSubmitForm = () => {
|
||||
onSubmit({
|
||||
|
@ -145,7 +140,8 @@
|
|||
})
|
||||
|
||||
// 供应商分类
|
||||
supplierCategoryApi.supplierCategoryTree({
|
||||
supplierCategoryApi
|
||||
.supplierCategoryTree({
|
||||
enabledState: 'ENABLE'
|
||||
})
|
||||
.then((res) => {
|
||||
|
@ -155,12 +151,10 @@
|
|||
}
|
||||
})
|
||||
})
|
||||
|
||||
})
|
||||
|
||||
let activeKey = ref('1')
|
||||
|
||||
|
||||
// 省、市、县 数据回显
|
||||
const cityOptionsObj = cityOptions.reduce((acc, item) => ((acc[item.value] = item.children), acc), {})
|
||||
const getCityOptions = () => {
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
@delTree="delTree"
|
||||
@treeRefresh="treeRefresh"
|
||||
:toolConfig="{
|
||||
plus: hasPerm('supplierCategoryAdd'),
|
||||
plus: true,
|
||||
edit: hasPerm('supplierCategoryEdit'),
|
||||
delete: hasPerm('supplierCategoryDelete'),
|
||||
refresh: true
|
||||
|
@ -52,13 +52,11 @@
|
|||
type: 'ADD'
|
||||
})
|
||||
"
|
||||
v-if="hasPerm('supplierAdd')"
|
||||
>
|
||||
<template #icon><plus-outlined /></template>
|
||||
新增
|
||||
</a-button>
|
||||
<xn-batch-delete
|
||||
v-if="hasPerm('supplierBatchDelete')"
|
||||
:selectedRowKeys="selectedRowKeys"
|
||||
@batchDelete="deleteBatchRecords"
|
||||
/>
|
||||
|
|
|
@ -0,0 +1,149 @@
|
|||
<template>
|
||||
<a-page-header style="padding: 10px; font-size: 20px" @back="handleBack">
|
||||
<template #extra>
|
||||
<!-- <a-button v-if="route.query.type !== 'SEARCH'" key="1" type="primary" @click="onSubmitForm">保存</a-button>-->
|
||||
</template>
|
||||
</a-page-header>
|
||||
|
||||
<a-card :bordered="false" title="入库单">
|
||||
<DynamicForm
|
||||
:allDisabled="route.query.type === 'SEARCH'"
|
||||
:formItems="unitFormItems"
|
||||
:model="formData"
|
||||
:rules="formRules"
|
||||
ref="formRef1"
|
||||
/>
|
||||
</a-card>
|
||||
|
||||
<a-card :bordered="false" class="mt-4" style="height: 100%">
|
||||
<a-tabs v-model:activeKey="activeKey">
|
||||
<a-tab-pane key="1" tab="汇报明细" forceRender>
|
||||
<a-table
|
||||
:columns="detailColumns"
|
||||
:data-source="detailDataSource"
|
||||
:scroll="{
|
||||
x: 100
|
||||
}"
|
||||
>
|
||||
<template #bodyCell="{ column, record }">
|
||||
<template v-if="column.dataIndex === 'action'">
|
||||
<a type="primary" @click="handleOpenViewScan(record)">查看条码</a>
|
||||
</template>
|
||||
</template>
|
||||
</a-table>
|
||||
</a-tab-pane>
|
||||
<a-tab-pane key="2" tab="操作信息" v-if="route.query.type !== 'ADD'">
|
||||
<OperationalInformation :detailData="inform" :colSpan="6"></OperationalInformation>
|
||||
</a-tab-pane>
|
||||
</a-tabs>
|
||||
</a-card>
|
||||
|
||||
<!-- 产看条码 -->
|
||||
<a-modal v-model:open="visible" title="查看条码" width="80%">
|
||||
<a-table
|
||||
style="height: 500px"
|
||||
:columns="modalColumns"
|
||||
:data-source="scanTableList"
|
||||
:pagination="false"
|
||||
:scroll="{ x: 100, y: 420 }"
|
||||
:row-key="(record) => record.id"
|
||||
@expand="columnsExpand"
|
||||
bordered
|
||||
/>
|
||||
</a-modal>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import produceReportApi from '@/api/production/produceTask/produceReportApi'
|
||||
import useFormHandler from '@/hook/useFormHandler'
|
||||
import { useRoute } from 'vue-router'
|
||||
import { unitFormItems, formRules } from '@/views/productionBusiness/productionCenter/report/formFields/detailFields'
|
||||
import { detailColumns, modalColumns } from '@/views/productionBusiness/productionCenter/report/columns/detailColumns'
|
||||
import { cloneDeep } from 'lodash-es'
|
||||
import produceReportDetailApi from '@/api/production/produceTask/produceReportDetailApi'
|
||||
import inventoryInboundApi from '@/api/inventory/inventoryInboundApi'
|
||||
|
||||
const route = useRoute()
|
||||
const formRef1 = ref(null)
|
||||
const tableRef = ref(null)
|
||||
let extendData = ref([])
|
||||
let searchFormState = ref({})
|
||||
|
||||
let { formData, formRefs, inform, handleBack, fetchData, getExtendField } = useFormHandler(unitFormItems, {
|
||||
getDetail: inventoryInboundApi.inventoryInboundDetail
|
||||
})
|
||||
|
||||
let detailDataSource = ref([])
|
||||
|
||||
const options = {
|
||||
alert: {
|
||||
show: true,
|
||||
clear: () => {
|
||||
selectedRowKeys.value = []
|
||||
}
|
||||
},
|
||||
rowSelection: {
|
||||
onChange: (selectedRowKey, selectedRows) => {
|
||||
selectedRowKeys.value = selectedRowKey
|
||||
}
|
||||
},
|
||||
toolConfig: { refresh: true, height: true, columnSetting: true, striped: false }
|
||||
}
|
||||
|
||||
onMounted(async () => {
|
||||
formRefs.value = [formRef1.value]
|
||||
const detailData = await fetchData(route.query.type)
|
||||
searchFormState.value.inboundId = detailData.id
|
||||
// tableRef.value.refresh(true)
|
||||
await loadData()
|
||||
extendData.value = await getExtendField('MATERIAL')
|
||||
})
|
||||
|
||||
// 获取产品包装条码控制器
|
||||
const loadData = async () => {
|
||||
const searchFormParam = cloneDeep(searchFormState.value)
|
||||
return inventoryInboundApi.inventoryInboundDetailList(Object.assign(searchFormParam)).then((data) => {
|
||||
detailDataSource.value = data
|
||||
})
|
||||
}
|
||||
|
||||
let activeKey = ref('1')
|
||||
|
||||
// 查看条码
|
||||
let visible = ref(false)
|
||||
let scanTableList = ref([])
|
||||
let recordTable = {}
|
||||
const handleOpenViewScan = (record) => {
|
||||
recordTable = record
|
||||
visible.value = true
|
||||
inventoryInboundApi
|
||||
.inventoryInboundBarcodeTree({
|
||||
docsDetailId: record.id,
|
||||
docsId: record.inboundId
|
||||
})
|
||||
.then((res) => {
|
||||
scanTableList.value = res
|
||||
scanTableList.value.forEach((item) => {
|
||||
if (item.subAmount && item.subAmount > 0) item.children = []
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
const columnsExpand = (expanded, record) => {
|
||||
if (expanded) {
|
||||
produceReportApi
|
||||
.produceReportTreeChildrenList({
|
||||
docsDetailId: recordTable.id,
|
||||
docsId: record.docsId,
|
||||
parentBarcode: record.barcode
|
||||
})
|
||||
.then((res) => {
|
||||
record.children = res
|
||||
record.children &&
|
||||
record.children.forEach((item) => {
|
||||
if (item.subAmount && item.subAmount > 0) item.children = []
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
</script>
|
|
@ -0,0 +1,69 @@
|
|||
import { required } from '@/utils/formRules'
|
||||
import tool from '@/utils/tool'
|
||||
|
||||
export const unitFormItems = reactive([
|
||||
{
|
||||
label: '单号:',
|
||||
name: 'billNumber',
|
||||
type: 'a-input-number',
|
||||
span: 6,
|
||||
attrs: {
|
||||
placeholder: '请输入编码',
|
||||
allowClear: true
|
||||
}
|
||||
},
|
||||
{
|
||||
label: '业务日期:',
|
||||
name: 'businessDate',
|
||||
type: 'a-date-picker',
|
||||
span: 6,
|
||||
attrs: {
|
||||
placeholder: '请输入业务日期',
|
||||
allowClear: true,
|
||||
valueFormat: 'YYYY-MM-DD HH:mm:ss'
|
||||
}
|
||||
},
|
||||
{
|
||||
label: '状态:',
|
||||
name: 'state',
|
||||
type: 'a-select',
|
||||
span: 6,
|
||||
attrs: {
|
||||
placeholder: '请选择可用状态',
|
||||
options: tool.dictList('PRODUCE_REPORT_STATE')
|
||||
},
|
||||
defaultValue: ''
|
||||
},
|
||||
{
|
||||
label: '类型:',
|
||||
name: 'produceType',
|
||||
type: 'a-select',
|
||||
span: 6,
|
||||
attrs: {
|
||||
options: tool.dictList('PRODUCE_TYPE')
|
||||
}
|
||||
},
|
||||
{
|
||||
label: '生产线:',
|
||||
name: 'productionLineName',
|
||||
type: 'a-select',
|
||||
span: 6,
|
||||
attrs: {
|
||||
placeholder: '请选择是否基本单位',
|
||||
options: tool.dictList('YES_NO')
|
||||
},
|
||||
defaultValue: 'NO'
|
||||
},
|
||||
{
|
||||
label: '备注:',
|
||||
name: 'remarks',
|
||||
type: 'a-textarea',
|
||||
span: 24,
|
||||
attrs: {
|
||||
placeholder: '请输入备注',
|
||||
allowClear: true
|
||||
}
|
||||
}
|
||||
])
|
||||
|
||||
export const formRules = {}
|
|
@ -1,12 +1,13 @@
|
|||
import tool from '@/utils/tool'
|
||||
|
||||
export const searchFields = [
|
||||
{ name: 'billNumber', label: '单号', component: 'a-input', props: { placeholder: '请输入单号' } },
|
||||
{ name: 'billNumber', label: '单号', component: 'a-input', props: { placeholder: '请输入单号' } },
|
||||
{
|
||||
label: '类型:',
|
||||
name: 'type',
|
||||
type: 'a-select',
|
||||
attrs: {
|
||||
component: 'a-select',
|
||||
props: {
|
||||
placeholder: '请选择类型',
|
||||
allowClear: true,
|
||||
options: tool.dictList('INBOUND_TYPE')
|
||||
|
@ -15,9 +16,8 @@ export const searchFields = [
|
|||
{
|
||||
label: '仓库:',
|
||||
name: 'storeId',
|
||||
type: 'a-tree-select',
|
||||
span: 6,
|
||||
attrs: {
|
||||
component: 'a-tree-select',
|
||||
props: {
|
||||
placeholder: '请选择仓库',
|
||||
treeData: [],
|
||||
fieldNames: {
|
||||
|
@ -25,8 +25,7 @@ export const searchFields = [
|
|||
label: 'name',
|
||||
value: 'id'
|
||||
}
|
||||
},
|
||||
defaultValue: ''
|
||||
}
|
||||
},
|
||||
{ name: 'customerName', label: '供货单位名称', component: 'a-input', props: { placeholder: '请输入供货单位名称' } },
|
||||
{ name: 'customerNumber', label: '供货单位编码', component: 'a-input', props: { placeholder: '请输入供货单位编码' } }
|
||||
|
|
|
@ -1,14 +1,13 @@
|
|||
<template>
|
||||
<AdvancedSearchForm
|
||||
:formState="searchFormState"
|
||||
:formFields="searchFields"
|
||||
:formFields="searchFieldsRef"
|
||||
@search="tableRef.refresh()"
|
||||
@reset="tableRef.refresh()"
|
||||
/>
|
||||
|
||||
<a-card :bordered="false" class="mt-4" style="height: 100%">
|
||||
<a-row :gutter="24">
|
||||
|
||||
<a-col :span="24">
|
||||
<s-table
|
||||
ref="tableRef"
|
||||
|
@ -18,15 +17,10 @@
|
|||
bordered
|
||||
:row-key="(record) => record.id"
|
||||
:tool-config="options.toolConfig"
|
||||
:row-selection="options.rowSelection"
|
||||
:scroll="{
|
||||
x: 100
|
||||
}"
|
||||
>
|
||||
<template #operator>
|
||||
<a-space>
|
||||
</a-space>
|
||||
</template>
|
||||
<template #bodyCell="{ column, record }">
|
||||
<template v-if="column.dataIndex === 'billNumber'">
|
||||
<span style="color: #0d84ff">{{ record.billNumber }}</span>
|
||||
|
@ -40,7 +34,7 @@
|
|||
<a-space>
|
||||
<a
|
||||
@click="
|
||||
navigateTo('/inventory/inbound/detail', {
|
||||
navigateTo('/inbound/detail', {
|
||||
type: 'SEARCH',
|
||||
id: record.id
|
||||
})
|
||||
|
@ -51,13 +45,10 @@
|
|||
</a>
|
||||
</a-space>
|
||||
</template>
|
||||
|
||||
</template>
|
||||
</s-table>
|
||||
</a-col>
|
||||
</a-row>
|
||||
|
||||
|
||||
</a-card>
|
||||
</template>
|
||||
|
||||
|
@ -67,16 +58,16 @@
|
|||
import { useTableManagement } from '@/hook/useTableManagement'
|
||||
import { searchFields } from '@/views/productionBusiness/inventory/inbound/formFields/searchFields'
|
||||
import { tableColumns } from '@/views/productionBusiness/inventory/inbound/columns/tableColumn'
|
||||
import sysStoreApi from '@/api/base/store/sysStoreApi'
|
||||
|
||||
const searchFieldsRef = ref(searchFields)
|
||||
|
||||
const tagColorList = ['warning', 'success', 'error', 'purple']
|
||||
const {
|
||||
searchFormState,
|
||||
tableRef,
|
||||
selectedRowKeys,
|
||||
columns,
|
||||
loadData,
|
||||
deleteRecord,
|
||||
deleteBatchRecords,
|
||||
options,
|
||||
navigateTo
|
||||
} = useTableManagement(
|
||||
|
@ -84,15 +75,20 @@
|
|||
page: inventoryInboundApi.inventoryInboundPage
|
||||
},
|
||||
tableColumns,
|
||||
['inventoryInbound:export']
|
||||
['customerEdit', 'customerDelete']
|
||||
)
|
||||
// 批量导出
|
||||
const exportBatchVerify = () =>{
|
||||
const exportBatchVerify = () => {}
|
||||
|
||||
onMounted(async () => {
|
||||
const list = await sysStoreApi.sysStoreTree()
|
||||
console.log(list)
|
||||
searchFieldsRef.value.forEach((item) => {
|
||||
if (item.name === 'storeId') {
|
||||
item.props.treeData = list
|
||||
|
||||
console.log(item.props.treeData, 'item.props.treeData')
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
|
||||
})
|
||||
})
|
||||
</script>
|
||||
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
<a-card :bordered="false" title="基本信息">
|
||||
<DynamicForm
|
||||
:allDisabled="route.query.type === 'SEARCH'"
|
||||
:formItems="basicInfoFormItems"
|
||||
:formItems="basicInfoFormItemsRef"
|
||||
:rules="basicInfoFormRules"
|
||||
:model="formData"
|
||||
ref="formRef1"
|
||||
|
@ -19,9 +19,9 @@
|
|||
readonly
|
||||
v-bind="{ ...item.attrs }"
|
||||
v-model:value="model[item.name]"
|
||||
@click="openClient"
|
||||
></a-input>
|
||||
</template>
|
||||
|
||||
</DynamicForm>
|
||||
</a-card>
|
||||
|
||||
|
@ -36,17 +36,11 @@
|
|||
:allDisabled="route.query.type === 'SEARCH'"
|
||||
:formItems="extendData"
|
||||
:model="extendFormData"
|
||||
:rules="formRules"
|
||||
v-if="extendData.length > 0"
|
||||
/>
|
||||
</a-card>
|
||||
|
||||
<a-card
|
||||
:bordered="false"
|
||||
class="mt-4"
|
||||
style="height: 100%"
|
||||
title="商品明细信息"
|
||||
>
|
||||
<a-card :bordered="false" class="mt-4" style="height: 100%" title="商品明细信息">
|
||||
<a-space>
|
||||
<a-button v-if="route.query.type !== 'SEARCH'" key="1" type="primary" @click="addRow">新增</a-button>
|
||||
<xn-batch-delete
|
||||
|
@ -73,7 +67,7 @@
|
|||
readonly
|
||||
v-model:value="record['productName']"
|
||||
placeholder="请选择商品信息"
|
||||
@click="openMateriel"
|
||||
@click="openMateriel(record, index)"
|
||||
></a-input>
|
||||
</template>
|
||||
<template v-if="column.dataIndex === 'unitName'">
|
||||
|
@ -81,16 +75,15 @@
|
|||
style="width: 100%"
|
||||
:options="record.unitArr"
|
||||
v-model:value="record['unitName']"
|
||||
@change="
|
||||
(value, options) => {
|
||||
cityChange(value, options, record)
|
||||
}
|
||||
"
|
||||
:filter-option="filterOption"
|
||||
:fieldNames="{
|
||||
label: 'name',
|
||||
value: 'id'
|
||||
}"
|
||||
></a-select>
|
||||
</template>
|
||||
<template v-if="column.dataIndex === 'planAmount'">
|
||||
<a-input-number class="xn-wd"
|
||||
<a-input-number
|
||||
class="xn-wd"
|
||||
:disabled="route.query.type === 'SEARCH'"
|
||||
v-model:value="record['planAmount']"
|
||||
:min="0"
|
||||
|
@ -98,9 +91,7 @@
|
|||
</template>
|
||||
<template v-if="column.dataIndex === 'action'">
|
||||
<a-space>
|
||||
<a-button type="link" danger size="small" >
|
||||
<DeleteOutlined />删除
|
||||
</a-button>
|
||||
<a-button type="link" danger size="small"> <DeleteOutlined />删除 </a-button>
|
||||
</a-space>
|
||||
</template>
|
||||
</template>
|
||||
|
@ -109,24 +100,29 @@
|
|||
|
||||
<materiel-selector-plus ref="materielSelectorPlusRef" @ok="materielBackOk"></materiel-selector-plus>
|
||||
|
||||
<client-selector-plus ref="clientSelectorPlusRef" @ok="clientBackOk"></client-selector-plus>
|
||||
</template>
|
||||
|
||||
<script setup name="taskDetail">
|
||||
import { required } from '@/utils/formRules'
|
||||
import inventoryInvoiceApi from '@/api/inventory/inventoryInvoiceApi'
|
||||
import sysStoreApi from '@/api/base/store/sysStoreApi'
|
||||
import materialApi from '@/api/base/material/materialApi'
|
||||
import useFormHandler from '@/hook/useFormHandler'
|
||||
import { basicInfoFormRules, basicInfoFormItems, productDetailFormItems } from '@/views/productionBusiness/inventory/invoice/formFields/detailFields'
|
||||
import {
|
||||
basicInfoFormRules,
|
||||
basicInfoFormItems,
|
||||
productDetailFormItems
|
||||
} from '@/views/productionBusiness/inventory/invoice/formFields/detailFields'
|
||||
import { useRoute } from 'vue-router'
|
||||
import MaterielSelectorPlus from '@/components/Selector/materielSelectorPlus.vue'
|
||||
import ClientSelectorPlus from '@/components/Selector/clientSelectorPlus.vue'
|
||||
const route = useRoute()
|
||||
|
||||
|
||||
|
||||
const formRef1 = ref(null)
|
||||
let extendData = ref([])
|
||||
|
||||
const basicInfoFormItemsRef = ref(basicInfoFormItems)
|
||||
|
||||
const { formData, formRefs, inform, extendFormData, onSubmit, handleBack, fetchData, getExtendField } =
|
||||
useFormHandler([...basicInfoFormItems], {
|
||||
submitForm: inventoryInvoiceApi.inventoryInvoiceSubmitForm,
|
||||
|
@ -142,15 +138,21 @@
|
|||
formData.storeId = res.storeId // 仓库id
|
||||
formData.storeName = res.storeName // 仓库名称
|
||||
formData.storeNumber = res.storeNumber // 仓库编码
|
||||
|
||||
}
|
||||
})
|
||||
|
||||
// 获取明细列表
|
||||
const detailList = await inventoryInvoiceApi.inventoryInvoiceDetailList({
|
||||
invoiceId: formRefs.value.id
|
||||
})
|
||||
|
||||
productDetailData.value = detailList
|
||||
|
||||
// 处理表单 元素数据填充
|
||||
const sysStoreTreeList = await sysStoreApi.sysStoreTree();
|
||||
basicInfoFormItems.forEach((item) => {
|
||||
const sysStoreTreeList = await sysStoreApi.sysStoreTree()
|
||||
basicInfoFormItemsRef.value.forEach((item) => {
|
||||
if (item.name === 'storeId') {
|
||||
item.attrs.treeData = (sysStoreTreeList || []);
|
||||
item.attrs.treeData = sysStoreTreeList || []
|
||||
}
|
||||
})
|
||||
|
||||
|
@ -160,64 +162,61 @@
|
|||
const onSubmitForm = () => {
|
||||
onSubmit({
|
||||
isDeep: true,
|
||||
...formData
|
||||
...formData,
|
||||
detailList: productDetailData.value
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
/* 物料选择器 */
|
||||
const materielSelectorPlusRef = ref(null)
|
||||
let materialPackageData = {}
|
||||
|
||||
// 打开物料选择
|
||||
const openMateriel = () => {
|
||||
let materielIndex = {}
|
||||
const openMateriel = (record, index) => {
|
||||
materielSelectorPlusRef.value.showOpen()
|
||||
materielIndex = index
|
||||
}
|
||||
|
||||
// 物料选择器返回操作
|
||||
const materielBackOk = (event) => {
|
||||
const materielId = event.materielSelectedRows[0].id;
|
||||
if(materielId){
|
||||
// 判断处理 物料-包装关系 数据信息
|
||||
let packageData = handleMaterialPackageData(materielId);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
// 下方无用可删除
|
||||
formData.productName = event.materielSelectedRows[0].name // 物料名称
|
||||
formData.productNumber = event.materielSelectedRows[0].number // 物料名称
|
||||
formData.productId = event.materielSelectedRows[0].id // 物料id
|
||||
// 选择物料自动带出基本单位和生产单位
|
||||
formData.produceUnitName = event.materielSelectedRows[0].produceUnitName // 生产单位
|
||||
formData.produceUnitId = event.materielSelectedRows[0].produceUnitId // 生产单位id
|
||||
|
||||
formData.baseUnitName = event.materielSelectedRows[0].baseUnitName // 生产单位
|
||||
formData.baseUnitId = event.materielSelectedRows[0].baseUnitId // 生产单位id
|
||||
|
||||
formData.unitGroupId = event.materielSelectedRows[0].unitGroupId
|
||||
formData.unitGroupName = event.materielSelectedRows[0].unitGroupName
|
||||
formData.packageProportion = event.materielSelectedRows[0].packageProportion
|
||||
|
||||
const materielBackOk = async (event) => {
|
||||
productDetailData.value[materielIndex].productName = event.materielSelectedRows[0].name
|
||||
productDetailData.value[materielIndex].productNumber = event.materielSelectedRows[0].number
|
||||
productDetailData.value[materielIndex].specification = event.materielSelectedRows[0].specification
|
||||
productDetailData.value[materielIndex].baseUnitName = event.materielSelectedRows[0].baseUnitName
|
||||
productDetailData.value[materielIndex].batchNumber = event.materielSelectedRows[0].batchNumber
|
||||
productDetailData.value[materielIndex].planAmount = event.materielSelectedRows[0].planAmount
|
||||
|
||||
// 获取单位列表
|
||||
productDetailData.value[materielIndex].unitArr = await handleMaterialPackageData(event.materielSelectedRows[0].id)
|
||||
// record.unitArr
|
||||
}
|
||||
|
||||
const handleMaterialPackageData = async (materielId) => {
|
||||
let packageData = [];
|
||||
let packageData = []
|
||||
if (materielId) {
|
||||
packageData = materialPackageData[materielId];
|
||||
packageData = materialPackageData[materielId]
|
||||
if (!packageData || packageData.length === 0) {
|
||||
packageData = await materialApi.materialPackageData({
|
||||
materialId: materielId
|
||||
})
|
||||
if(packageData && packageData.length > 0){
|
||||
materialPackageData[materielId] = packageData;
|
||||
}
|
||||
}
|
||||
return packageData.filter((item) => item.enabledState === 'ENABLE')
|
||||
}
|
||||
return packageData;
|
||||
|
||||
/**
|
||||
* 客户选择器
|
||||
* */
|
||||
const clientSelectorPlusRef = ref(null)
|
||||
|
||||
const openClient = () => {
|
||||
clientSelectorPlusRef.value.showOpen()
|
||||
}
|
||||
|
||||
const clientBackOk = (event) => {
|
||||
formData.customerName = event.clientSelectedRows[0].name
|
||||
formData.customerId = event.clientSelectedRows[0].id
|
||||
}
|
||||
|
||||
/* =================================== 商品明细 ============================*/
|
||||
|
|
|
@ -122,8 +122,8 @@ const basicInfoFormItems = [
|
|||
{
|
||||
label: '备注:',
|
||||
name: 'remarks',
|
||||
type: 'a-input',
|
||||
span: 12,
|
||||
type: 'a-textarea',
|
||||
span: 24,
|
||||
attrs: {
|
||||
placeholder: '请输入备注',
|
||||
allowClear: true
|
||||
|
|
|
@ -0,0 +1,72 @@
|
|||
<!--
|
||||
* @Description:
|
||||
* @Author: CcSimple
|
||||
* @Github: https://github.com/CcSimple
|
||||
* @Date: 2023-02-16 14:35:38
|
||||
* @LastEditors: CcSimple
|
||||
* @LastEditTime: 2023-04-11 13:40:27
|
||||
-->
|
||||
<template>
|
||||
<div class="modal" v-if="show">
|
||||
<div class="wrap" @click="close">
|
||||
<div class="box">
|
||||
<div class="modal-box__header" @click.stop="">预览</div>
|
||||
<div class="preview-body" style="max-height: 50vh; overflow: auto">
|
||||
<div class="container"></div>
|
||||
</div>
|
||||
<div class="modal-box__footer">
|
||||
<button class="primary" @click="close">确定</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { ref } from 'vue'
|
||||
import $ from 'jquery'
|
||||
export default {
|
||||
name: 'StartPreview',
|
||||
setup() {
|
||||
const show = ref(false)
|
||||
const close = () => {
|
||||
show.value = false
|
||||
}
|
||||
const showModal = (...html) => {
|
||||
show.value = true
|
||||
do {
|
||||
setTimeout(() => {
|
||||
$('.container').empty()
|
||||
$('.container').html(html)
|
||||
}, 200)
|
||||
return
|
||||
} while ($('.container').length <= 0)
|
||||
}
|
||||
return {
|
||||
show,
|
||||
close,
|
||||
showModal
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
/* 不同模板 间隙 */
|
||||
.container .hiprint-printTemplate {
|
||||
background: #fff;
|
||||
border-bottom: 10px solid #ccc;
|
||||
}
|
||||
/* 批量打印 间隙 */
|
||||
.container .hiprint-printTemplate .hiprint-printPanel:not(:last-of-type) {
|
||||
border-bottom: 5px solid #ccc;
|
||||
}
|
||||
</style>
|
||||
<style scoped>
|
||||
.preview-body {
|
||||
background: #ccc;
|
||||
padding: 14px 0;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
}
|
||||
</style>
|
|
@ -0,0 +1,342 @@
|
|||
@font-face {
|
||||
font-family: "iconfont"; /* Project id 3559670 */
|
||||
src: url("iconfont.woff2?t=1667531544868") format("woff2"),
|
||||
url("iconfont.woff?t=1667531544868") format("woff"),
|
||||
url("iconfont.ttf?t=1667531544868") format("truetype");
|
||||
}
|
||||
|
||||
.iconfont {
|
||||
font-family: "iconfont" !important;
|
||||
font-size: 16px;
|
||||
font-style: normal;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
|
||||
.sv-edit-data:before {
|
||||
content: "\e655";
|
||||
}
|
||||
|
||||
.sv-shimmer:before {
|
||||
content: "\e6d6";
|
||||
}
|
||||
|
||||
.sv-origin:before {
|
||||
content: "\e6ac";
|
||||
}
|
||||
|
||||
.sv-zIndex:before {
|
||||
content: "\e603";
|
||||
}
|
||||
|
||||
.sv-structure:before {
|
||||
content: "\ec6f";
|
||||
}
|
||||
|
||||
.sv-list:before {
|
||||
content: "\e742";
|
||||
}
|
||||
|
||||
.sv-grid:before {
|
||||
content: "\e849";
|
||||
}
|
||||
|
||||
.sv-flow:before {
|
||||
content: "\e611";
|
||||
}
|
||||
|
||||
.sv-switch:before {
|
||||
content: "\e6f6";
|
||||
}
|
||||
|
||||
.sv-theme:before {
|
||||
content: "\e644";
|
||||
}
|
||||
|
||||
.sv-element:before {
|
||||
content: "\e615";
|
||||
}
|
||||
|
||||
.sv-pdf:before {
|
||||
content: "\e67a";
|
||||
}
|
||||
|
||||
.sv-browser:before {
|
||||
content: "\e726";
|
||||
}
|
||||
|
||||
.sv-font-big:before {
|
||||
content: "\eb04";
|
||||
}
|
||||
|
||||
.sv-font-small:before {
|
||||
content: "\eb05";
|
||||
}
|
||||
|
||||
.sv-font-bold:before {
|
||||
content: "\ec83";
|
||||
}
|
||||
|
||||
.sv-font-tiny:before {
|
||||
content: "\e6c1";
|
||||
}
|
||||
|
||||
.sv-options:before {
|
||||
content: "\e607";
|
||||
}
|
||||
|
||||
.sv-close:before {
|
||||
content: "\e646";
|
||||
}
|
||||
|
||||
.sv-clone:before {
|
||||
content: "\ec7a";
|
||||
}
|
||||
|
||||
.sv-cut:before {
|
||||
content: "\e643";
|
||||
}
|
||||
|
||||
.sv-preview:before {
|
||||
content: "\e61c";
|
||||
}
|
||||
|
||||
.sv-zoom-in:before {
|
||||
content: "\e60f";
|
||||
}
|
||||
|
||||
.sv-zoom-out:before {
|
||||
content: "\e610";
|
||||
}
|
||||
|
||||
.sv-edit:before {
|
||||
content: "\e6b9";
|
||||
}
|
||||
|
||||
.sv-paste:before {
|
||||
content: "\e6c0";
|
||||
}
|
||||
|
||||
.sv-copy:before {
|
||||
content: "\e6c2";
|
||||
}
|
||||
|
||||
.sv-unlock:before {
|
||||
content: "\e6e7";
|
||||
}
|
||||
|
||||
.sv-lock:before {
|
||||
content: "\e6e8";
|
||||
}
|
||||
|
||||
.sv-zIndex-plus:before {
|
||||
content: "\e715";
|
||||
}
|
||||
|
||||
.sv-zIndex-minus:before {
|
||||
content: "\e716";
|
||||
}
|
||||
|
||||
.sv-zIndex-top:before {
|
||||
content: "\e71f";
|
||||
}
|
||||
|
||||
.sv-sigh:before {
|
||||
content: "\e724";
|
||||
}
|
||||
|
||||
.sv-ask:before {
|
||||
content: "\e725";
|
||||
}
|
||||
|
||||
.sv-dev-code:before {
|
||||
content: "\e733";
|
||||
}
|
||||
|
||||
.sv-bug:before {
|
||||
content: "\e73f";
|
||||
}
|
||||
|
||||
.sv-zIndex-bottom:before {
|
||||
content: "\e71d";
|
||||
}
|
||||
|
||||
.sv-new:before {
|
||||
content: "\e64d";
|
||||
}
|
||||
|
||||
.sv-clear:before {
|
||||
content: "\e62d";
|
||||
}
|
||||
|
||||
.sv-base:before {
|
||||
content: "\e7d0";
|
||||
}
|
||||
|
||||
.sv-export:before {
|
||||
content: "\eabf";
|
||||
}
|
||||
|
||||
.sv-import:before {
|
||||
content: "\eac0";
|
||||
}
|
||||
|
||||
.sv-add:before {
|
||||
content: "\eaf3";
|
||||
}
|
||||
|
||||
.sv-printer:before {
|
||||
content: "\eabe";
|
||||
}
|
||||
|
||||
.sv-save:before {
|
||||
content: "\eabd";
|
||||
}
|
||||
|
||||
.sv-more:before {
|
||||
content: "\e625";
|
||||
}
|
||||
|
||||
.sv-menu:before {
|
||||
content: "\e628";
|
||||
}
|
||||
|
||||
.sv-nav-right:before {
|
||||
content: "\e629";
|
||||
}
|
||||
|
||||
.sv-nav-up:before {
|
||||
content: "\e62a";
|
||||
}
|
||||
|
||||
.sv-nav-left:before {
|
||||
content: "\e62b";
|
||||
}
|
||||
|
||||
.sv-nav-down:before {
|
||||
content: "\e62c";
|
||||
}
|
||||
|
||||
.sv-setting:before {
|
||||
content: "\e62e";
|
||||
}
|
||||
|
||||
.sv-delete:before {
|
||||
content: "\e630";
|
||||
}
|
||||
|
||||
.sv-undo:before {
|
||||
content: "\e631";
|
||||
}
|
||||
|
||||
.sv-redo:before {
|
||||
content: "\e632";
|
||||
}
|
||||
|
||||
.sv-refresh:before {
|
||||
content: "\e634";
|
||||
}
|
||||
|
||||
.sv-history:before {
|
||||
content: "\e635";
|
||||
}
|
||||
|
||||
.sv-html:before {
|
||||
content: "\e633";
|
||||
}
|
||||
|
||||
.sv-longText:before {
|
||||
content: "\e64c";
|
||||
}
|
||||
|
||||
.sv-table:before {
|
||||
content: "\ec15";
|
||||
}
|
||||
|
||||
.sv-qrcode:before {
|
||||
content: "\e642";
|
||||
}
|
||||
|
||||
.sv-image:before {
|
||||
content: "\e8ba";
|
||||
}
|
||||
|
||||
.sv-barcode:before {
|
||||
content: "\eb64";
|
||||
}
|
||||
|
||||
.sv-text:before {
|
||||
content: "\e60b";
|
||||
}
|
||||
|
||||
.sv-vline:before {
|
||||
content: "\e63a";
|
||||
}
|
||||
|
||||
.sv-oval:before {
|
||||
content: "\eb99";
|
||||
}
|
||||
|
||||
.sv-rect:before {
|
||||
content: "\e620";
|
||||
}
|
||||
|
||||
.sv-hline:before {
|
||||
content: "\e60a";
|
||||
}
|
||||
|
||||
.sv-print-c:before {
|
||||
content: "\e602";
|
||||
}
|
||||
|
||||
.sv-print:before {
|
||||
content: "\e601";
|
||||
}
|
||||
|
||||
.sv-c:before {
|
||||
content: "\e600";
|
||||
}
|
||||
|
||||
.sv-vertical:before {
|
||||
content: "\e706";
|
||||
}
|
||||
|
||||
.sv-distributeHor:before {
|
||||
content: "\e707";
|
||||
}
|
||||
|
||||
.sv-right:before {
|
||||
content: "\e708";
|
||||
}
|
||||
|
||||
.sv-left:before {
|
||||
content: "\e709";
|
||||
}
|
||||
|
||||
.sv-distributeVer:before {
|
||||
content: "\e70f";
|
||||
}
|
||||
|
||||
.sv-bottom:before {
|
||||
content: "\e710";
|
||||
}
|
||||
|
||||
.sv-top:before {
|
||||
content: "\e711";
|
||||
}
|
||||
|
||||
.sv-horizontal:before {
|
||||
content: "\e712";
|
||||
}
|
||||
|
||||
.sv-rotate:before {
|
||||
content: "\e66f";
|
||||
}
|
||||
|
||||
.sv-butongbu:before {
|
||||
content: "\e636";
|
||||
}
|
||||
|
||||
.sv-synchronization:before {
|
||||
content: "\e676";
|
||||
}
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,174 @@
|
|||
/* 字体样式 */
|
||||
/*@import "./iconfont.css";*/
|
||||
|
||||
/* 定义全局样式 */
|
||||
/* 在 main.js 入库文件引入 */
|
||||
body {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
/* scrollbar */
|
||||
::-webkit-scrollbar {
|
||||
height: 4px;
|
||||
width: 4px;
|
||||
}
|
||||
::-webkit-scrollbar-corner {
|
||||
height: 4px;
|
||||
width: 4px;
|
||||
}
|
||||
::-webkit-scrollbar-thumb {
|
||||
background: purple;
|
||||
border-radius: 2px;
|
||||
background-image: -webkit-linear-gradient(
|
||||
45deg,
|
||||
rgba(255, 255, 255, 0.2) 25%,
|
||||
transparent 25%,
|
||||
transparent 50%,
|
||||
rgba(255, 255, 255, 0.2) 50%,
|
||||
rgba(255, 255, 255, 0.2) 75%,
|
||||
transparent 75%,
|
||||
transparent
|
||||
);
|
||||
}
|
||||
::-webkit-scrollbar-thumb:hover {
|
||||
background: purple;
|
||||
}
|
||||
|
||||
/* flex */
|
||||
.flex-row {
|
||||
display: flex;
|
||||
}
|
||||
.flex-col {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
.flex-wrap {
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
.align-center {
|
||||
align-items: center;
|
||||
}
|
||||
.justify-center {
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.flex-1 {
|
||||
flex: 1;
|
||||
}
|
||||
.flex-2 {
|
||||
flex: 2;
|
||||
}
|
||||
.flex-3 {
|
||||
flex: 3;
|
||||
}
|
||||
.flex-4 {
|
||||
flex: 4;
|
||||
}
|
||||
.flex-5 {
|
||||
flex: 5;
|
||||
}
|
||||
|
||||
.ml-10 {
|
||||
margin-left: 10px;
|
||||
}
|
||||
.mr-10 {
|
||||
margin-right: 10px;
|
||||
}
|
||||
.mt-10 {
|
||||
margin-top: 10px;
|
||||
}
|
||||
.mb-10 {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
/* button 样式 为了好看点 */
|
||||
button {
|
||||
padding: 10px;
|
||||
min-width: 40px;
|
||||
color: white;
|
||||
opacity: 0.9;
|
||||
cursor: pointer;
|
||||
border-width: 0;
|
||||
border: 1px solid #d9d9d9;
|
||||
}
|
||||
button:hover {
|
||||
opacity: 1;
|
||||
}
|
||||
button i {
|
||||
font-size: 16px !important;
|
||||
}
|
||||
.circle,
|
||||
.circle-4 {
|
||||
border-radius: 4px !important;
|
||||
}
|
||||
.circle-10 {
|
||||
border-radius: 10px !important;
|
||||
}
|
||||
/* 按钮颜色 */
|
||||
.primary {
|
||||
background: purple;
|
||||
}
|
||||
.info {
|
||||
color: #000;
|
||||
background: none;
|
||||
}
|
||||
.info:hover {
|
||||
color: purple;
|
||||
border-color: purple;
|
||||
}
|
||||
.secondary {
|
||||
background: #1976d2;
|
||||
}
|
||||
.warning {
|
||||
background: #d32f2f;
|
||||
}
|
||||
|
||||
/* modal */
|
||||
.modal {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
.modal .mask {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
z-index: 1000;
|
||||
height: 100%;
|
||||
background-color: #00000073;
|
||||
}
|
||||
.modal .wrap {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
z-index: 1000;
|
||||
overflow: auto;
|
||||
background-color: #00000073;
|
||||
outline: 0;
|
||||
}
|
||||
.modal .wrap .box {
|
||||
position: relative;
|
||||
margin: 10% auto;
|
||||
width: 40%;
|
||||
background: #fff;
|
||||
border-radius: 4px;
|
||||
z-index: 1001;
|
||||
box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
.modal-box__header {
|
||||
padding: 10px 14px;
|
||||
border-bottom: 1px solid #e9e9e9;
|
||||
}
|
||||
.modal-box__footer {
|
||||
text-align: end;
|
||||
}
|
||||
.modal-box__footer button {
|
||||
min-width: 100px;
|
||||
}
|
||||
.modal-box__footer button:not(:last-child) {
|
||||
margin-right: 10px;
|
||||
}
|
|
@ -0,0 +1,108 @@
|
|||
/*
|
||||
* @Description:
|
||||
* @Author: CcSimple
|
||||
* @Github: https://github.com/CcSimple
|
||||
* @Date: 2023-02-09 13:32:39
|
||||
* @LastEditors: CcSimple
|
||||
* @LastEditTime: 2023-02-09 23:38:03
|
||||
*/
|
||||
import { reactive, computed, toRefs } from "vue";
|
||||
import { getHiprintPrintTemplate } from "../utils/template-helper";
|
||||
|
||||
/**
|
||||
* vue3 组合式函数
|
||||
* 把一些逻辑抽离出来,方便复用
|
||||
* 返回 使用方 可用的方法和数据
|
||||
*/
|
||||
export function usePaper(key) {
|
||||
// 数据
|
||||
const state = reactive({
|
||||
curPaper: {
|
||||
type: "A4",
|
||||
width: 210,
|
||||
height: 296.6,
|
||||
},
|
||||
paperTypes: {
|
||||
A3: {
|
||||
width: 420,
|
||||
height: 296.6,
|
||||
},
|
||||
A4: {
|
||||
width: 210,
|
||||
height: 296.6,
|
||||
},
|
||||
A5: {
|
||||
width: 210,
|
||||
height: 147.6,
|
||||
},
|
||||
B3: {
|
||||
width: 500,
|
||||
height: 352.6,
|
||||
},
|
||||
B4: {
|
||||
width: 250,
|
||||
height: 352.6,
|
||||
},
|
||||
B5: {
|
||||
width: 250,
|
||||
height: 175.6,
|
||||
},
|
||||
},
|
||||
// 自定义纸张
|
||||
paperPopVisible: false,
|
||||
paperWidth: "220",
|
||||
paperHeight: "80",
|
||||
});
|
||||
// 计算属性
|
||||
const curPaperType = computed(() => {
|
||||
let type = "other";
|
||||
let types = state.paperTypes;
|
||||
for (const key in types) {
|
||||
let item = types[key];
|
||||
let { width, height } = state.curPaper;
|
||||
if (item.width === width && item.height === height) {
|
||||
type = key;
|
||||
}
|
||||
}
|
||||
return type;
|
||||
});
|
||||
const tp = () => {
|
||||
return getHiprintPrintTemplate(key);
|
||||
};
|
||||
// 方法
|
||||
const showPaperPop = () => {
|
||||
state.paperPopVisible = true;
|
||||
};
|
||||
const hidePaperPop = () => {
|
||||
state.paperPopVisible = false;
|
||||
};
|
||||
const setPaper = (type, value) => {
|
||||
try {
|
||||
if (Object.keys(state.paperTypes).includes(type)) {
|
||||
state.curPaper = { type: type, width: value.width, height: value.height };
|
||||
tp().setPaper(value.width, value.height);
|
||||
} else {
|
||||
state.curPaper = { type: "other", width: value.width, height: value.height };
|
||||
tp().setPaper(value.width, value.height);
|
||||
}
|
||||
} catch (error) {
|
||||
alert(`操作失败: ${error}`);
|
||||
}
|
||||
};
|
||||
const setPaperOther = () => {
|
||||
let value = {};
|
||||
value.width = state.paperWidth;
|
||||
value.height = state.paperHeight;
|
||||
state.paperPopVisible = false;
|
||||
setPaper("other", value);
|
||||
};
|
||||
// 暴露给使用方
|
||||
return {
|
||||
...toRefs(state),
|
||||
curPaperType,
|
||||
showPaperPop,
|
||||
hidePaperPop,
|
||||
setPaper,
|
||||
setPaperOther,
|
||||
};
|
||||
}
|
|
@ -0,0 +1,49 @@
|
|||
/*
|
||||
* @Description:
|
||||
* @Author: CcSimple
|
||||
* @Github: https://github.com/CcSimple
|
||||
* @Date: 2023-02-09 13:32:39
|
||||
* @LastEditors: CcSimple
|
||||
* @LastEditTime: 2023-02-10 16:00:54
|
||||
*/
|
||||
import { reactive, toRefs } from "vue";
|
||||
import { getHiprintPrintTemplate } from "../utils/template-helper";
|
||||
|
||||
/**
|
||||
* vue3 组合式函数
|
||||
* 把一些逻辑抽离出来,方便复用
|
||||
* 返回 使用方 可用的方法和数据
|
||||
*/
|
||||
export function useZoom(key) {
|
||||
// 数据
|
||||
const state = reactive({
|
||||
scaleValue: 1,
|
||||
scaleMax: 5,
|
||||
scaleMin: 0.5,
|
||||
});
|
||||
// 获取 template
|
||||
const tp = () => {
|
||||
return getHiprintPrintTemplate(key);
|
||||
};
|
||||
// 方法
|
||||
const changeScale = (big) => {
|
||||
let scaleValue = state.scaleValue;
|
||||
if (big) {
|
||||
scaleValue += 0.1;
|
||||
if (scaleValue > state.scaleMax) scaleValue = 5;
|
||||
} else {
|
||||
scaleValue -= 0.1;
|
||||
if (scaleValue < state.scaleMin) scaleValue = 0.5;
|
||||
}
|
||||
if (tp()) {
|
||||
// scaleValue: 放大缩小值, false: 不保存(不传也一样), 如果传 true, 打印时也会放大
|
||||
tp().zoom(scaleValue);
|
||||
state.scaleValue = scaleValue;
|
||||
}
|
||||
};
|
||||
// 暴露给使用方
|
||||
return {
|
||||
...toRefs(state),
|
||||
changeScale,
|
||||
};
|
||||
}
|
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,127 @@
|
|||
/*
|
||||
* @Description:
|
||||
* @Author: CcSimple
|
||||
* @Github: https://github.com/CcSimple
|
||||
* @Date: 2023-02-09 10:40:26
|
||||
* @LastEditors: CcSimple
|
||||
* @LastEditTime: 2023-02-09 11:37:21
|
||||
*/
|
||||
import { hiprint } from 'vue-plugin-hiprint'
|
||||
export const provider1 = function (options) {
|
||||
var addElementTypes = function (context) {
|
||||
context.removePrintElementTypes('providerModule1')
|
||||
context.addPrintElementTypes('providerModule1', [
|
||||
new hiprint.PrintElementTypeGroup('', [
|
||||
// options.config,
|
||||
{
|
||||
tid: 'providerModule1.text',
|
||||
title: '文本',
|
||||
data: '文本',
|
||||
type: 'text',
|
||||
options: {
|
||||
testData: '文本',
|
||||
height: 17,
|
||||
fontSize: 16.5,
|
||||
fontWeight: '700',
|
||||
textAlign: 'center',
|
||||
hideTitle: true
|
||||
}
|
||||
},
|
||||
{ tid: 'providerModule1.image', title: '图片', data: '', type: 'image' },
|
||||
{
|
||||
tid: 'providerModule1.barcode',
|
||||
title: '条形码',
|
||||
data: 'XS888888888',
|
||||
type: 'text',
|
||||
options: {
|
||||
field: 'barcode',
|
||||
testData: 'XS888888888',
|
||||
height: 32,
|
||||
fontSize: 12,
|
||||
lineHeight: 18,
|
||||
textAlign: 'left',
|
||||
textType: 'barcode'
|
||||
}
|
||||
},
|
||||
{
|
||||
tid: 'providerModule1.qrcode',
|
||||
title: '二维码',
|
||||
data: 'XS888888888',
|
||||
type: 'text',
|
||||
options: {
|
||||
field: 'qrcode',
|
||||
testData: 'XS888888888',
|
||||
height: 32,
|
||||
fontSize: 12,
|
||||
lineHeight: 18,
|
||||
textType: 'qrcode'
|
||||
}
|
||||
},
|
||||
// {
|
||||
// tid: 'providerModule1.type',
|
||||
// title: '单据类型',
|
||||
// data: '单据类型',
|
||||
// type: 'text',
|
||||
// options: {
|
||||
// testData: '单据类型',
|
||||
// height: 16,
|
||||
// fontSize: 15,
|
||||
// fontWeight: '700',
|
||||
// textAlign: 'center',
|
||||
// hideTitle: true
|
||||
// }
|
||||
// },
|
||||
{
|
||||
tid: 'providerModule1.date',
|
||||
title: '日期',
|
||||
data: '2020-01-01',
|
||||
type: 'text',
|
||||
options: {
|
||||
field: 'date',
|
||||
testData: '2020-01-01',
|
||||
height: 16,
|
||||
fontSize: 6.75,
|
||||
fontWeight: '700',
|
||||
textAlign: 'left',
|
||||
textContentVerticalAlign: 'middle'
|
||||
}
|
||||
}
|
||||
])
|
||||
// new hiprint.PrintElementTypeGroup('客户', [
|
||||
// {
|
||||
// tid: 'providerModule1.khname',
|
||||
// title: '客户名称',
|
||||
// data: '高级客户',
|
||||
// type: 'text',
|
||||
// options: {
|
||||
// field: 'name',
|
||||
// testData: '高级客户',
|
||||
// height: 16,
|
||||
// fontSize: 6.75,
|
||||
// fontWeight: '700',
|
||||
// textAlign: 'left',
|
||||
// textContentVerticalAlign: 'middle'
|
||||
// }
|
||||
// },
|
||||
// {
|
||||
// tid: 'providerModule1.tel',
|
||||
// title: '客户电话',
|
||||
// data: '18888888888',
|
||||
// type: 'text',
|
||||
// options: {
|
||||
// field: 'tel',
|
||||
// testData: '18888888888',
|
||||
// height: 16,
|
||||
// fontSize: 6.75,
|
||||
// fontWeight: '700',
|
||||
// textAlign: 'left',
|
||||
// textContentVerticalAlign: 'middle'
|
||||
// }
|
||||
// }
|
||||
// ])
|
||||
])
|
||||
}
|
||||
return {
|
||||
addElementTypes: addElementTypes
|
||||
}
|
||||
}
|
|
@ -0,0 +1,90 @@
|
|||
/*
|
||||
* @Description:
|
||||
* @Author: CcSimple
|
||||
* @Github: https://github.com/CcSimple
|
||||
* @Date: 2023-02-09 10:40:26
|
||||
* @LastEditors: CcSimple
|
||||
* @LastEditTime: 2023-02-09 10:50:02
|
||||
*/
|
||||
import { hiprint } from 'vue-plugin-hiprint'
|
||||
export const provider2 = function (options) {
|
||||
console.log(options)
|
||||
var addElementTypes = function (context) {
|
||||
context.removePrintElementTypes('providerModule2')
|
||||
context.addPrintElementTypes('providerModule2', [
|
||||
new hiprint.PrintElementTypeGroup('', [
|
||||
{
|
||||
tid: 'providerModule2.table',
|
||||
title: '表格',
|
||||
type: 'table',
|
||||
options: {
|
||||
field: 'table',
|
||||
fields: [
|
||||
{ text: '名称', field: 'NAME' },
|
||||
{ text: '数量', field: 'SL' },
|
||||
{ text: '规格', field: 'GG' },
|
||||
{ text: '条码', field: 'TM' },
|
||||
{ text: '单价', field: 'DJ' },
|
||||
{ text: '金额', field: 'JE' },
|
||||
{ text: '备注', field: 'DETAIL' }
|
||||
]
|
||||
},
|
||||
columns: [
|
||||
[
|
||||
{ title: '名称', align: 'center', field: 'NAME', width: 100 },
|
||||
{ title: '数量', align: 'center', field: 'SL', width: 100 },
|
||||
{ title: '条码', align: 'center', field: 'TM', width: 100 },
|
||||
{ title: '规格', align: 'center', field: 'GG', width: 100 },
|
||||
{ title: '单价', align: 'center', field: 'DJ', width: 100 },
|
||||
{ title: '金额', align: 'center', field: 'JE', width: 100 },
|
||||
{ title: '备注', align: 'center', field: 'DETAIL', width: 100 }
|
||||
]
|
||||
],
|
||||
footerFormatter: function (options, rows, data, currentPageGridRowsData) {
|
||||
console.log(currentPageGridRowsData)
|
||||
if (data && data['totalCap']) {
|
||||
return `<td style="padding:0 10px" colspan="100">${'应收金额大写: ' + data['totalCap']}</td>`
|
||||
}
|
||||
return '<td style="padding:0 10px" colspan="100">应收金额大写: </td>'
|
||||
}
|
||||
},
|
||||
{ tid: 'providerModule2.customText', title: '文本', customText: '自定义文本', custom: true, type: 'text' },
|
||||
{
|
||||
tid: 'providerModule2.longText',
|
||||
title: '长文本',
|
||||
type: 'longText',
|
||||
options: {
|
||||
field: 'test.longText',
|
||||
width: 200,
|
||||
testData: '长文本分页/不分页测试'
|
||||
}
|
||||
}
|
||||
]),
|
||||
new hiprint.PrintElementTypeGroup('', [
|
||||
{
|
||||
tid: 'providerModule2.hline',
|
||||
title: '横线',
|
||||
type: 'hline'
|
||||
},
|
||||
{
|
||||
tid: 'providerModule2.vline',
|
||||
title: '竖线',
|
||||
type: 'vline'
|
||||
},
|
||||
{
|
||||
tid: 'providerModule2.rect',
|
||||
title: '矩形',
|
||||
type: 'rect'
|
||||
},
|
||||
{
|
||||
tid: 'providerModule2.oval',
|
||||
title: '椭圆',
|
||||
type: 'oval'
|
||||
}
|
||||
])
|
||||
])
|
||||
}
|
||||
return {
|
||||
addElementTypes: addElementTypes
|
||||
}
|
||||
}
|
|
@ -0,0 +1,365 @@
|
|||
export default {
|
||||
panels: [
|
||||
{
|
||||
index: 0,
|
||||
height: 297,
|
||||
width: 210,
|
||||
paperHeader: 49.5,
|
||||
paperFooter: 780,
|
||||
printElements: [
|
||||
{
|
||||
options: {
|
||||
left: 175.5,
|
||||
top: 10.5,
|
||||
height: 27,
|
||||
width: 259,
|
||||
title: 'HiPrint自定义模块打印插件',
|
||||
fontSize: 19,
|
||||
fontWeight: '600',
|
||||
textAlign: 'center',
|
||||
lineHeight: 26,
|
||||
coordinateSync: true,
|
||||
widthHeightSync: true,
|
||||
draggable: false
|
||||
},
|
||||
printElementType: { title: '自定义文本', type: 'text' }
|
||||
},
|
||||
{
|
||||
options: { left: 60, top: 27, height: 13, width: 52, title: '页眉线', textAlign: 'center' },
|
||||
printElementType: { title: '自定义文本', type: 'text' }
|
||||
},
|
||||
{
|
||||
options: { left: 25.5, top: 57, height: 705, width: 9, fixed: true, borderStyle: 'dotted' },
|
||||
printElementType: { type: 'vline' }
|
||||
},
|
||||
{
|
||||
options: { left: 60, top: 61.5, height: 48, width: 87, src: '', fit: 'contain' },
|
||||
printElementType: { title: '图片', type: 'image' }
|
||||
},
|
||||
{
|
||||
options: {
|
||||
left: 153,
|
||||
top: 64.5,
|
||||
height: 39,
|
||||
width: 276,
|
||||
title:
|
||||
'二维码以及条形码均采用svg格式打印。不同打印机打印不会造成失真。图片打印:不同DPI打印可能会导致失真,',
|
||||
fontFamily: '微软雅黑',
|
||||
textAlign: 'center',
|
||||
lineHeight: 18
|
||||
},
|
||||
printElementType: { title: '自定义文本', type: 'text' }
|
||||
},
|
||||
{
|
||||
options: {
|
||||
left: 457.5,
|
||||
top: 79.5,
|
||||
height: 13,
|
||||
width: 120,
|
||||
title: '姓名',
|
||||
field: 'name',
|
||||
testData: '古力娜扎',
|
||||
color: '#f00808',
|
||||
textDecoration: 'underline',
|
||||
textAlign: 'center',
|
||||
fields: [
|
||||
{ text: 'id', field: 'id' },
|
||||
{ text: '姓名', field: 'name' },
|
||||
{ text: '性别', field: 'gender' },
|
||||
{ text: '数量', field: 'count' }
|
||||
]
|
||||
},
|
||||
printElementType: { title: '文本', type: 'text' }
|
||||
},
|
||||
{
|
||||
options: {
|
||||
left: 483,
|
||||
top: 124.5,
|
||||
height: 43,
|
||||
width: 51,
|
||||
title: '123456789',
|
||||
textType: 'qrcode'
|
||||
},
|
||||
printElementType: { title: '自定义文本', type: 'text' }
|
||||
},
|
||||
{
|
||||
options: {
|
||||
left: 285,
|
||||
top: 130.5,
|
||||
height: 34,
|
||||
width: 175,
|
||||
title: '123456789',
|
||||
fontFamily: '微软雅黑',
|
||||
textAlign: 'center',
|
||||
textType: 'barcode'
|
||||
},
|
||||
printElementType: { title: '自定义文本', type: 'text' }
|
||||
},
|
||||
{
|
||||
options: {
|
||||
left: 60,
|
||||
top: 132,
|
||||
height: 19,
|
||||
width: 213,
|
||||
title: '所有打印元素都可已拖拽的方式来改变元素大小',
|
||||
fontFamily: '微软雅黑',
|
||||
textAlign: 'center',
|
||||
lineHeight: 18
|
||||
},
|
||||
printElementType: { title: '自定义文本', type: 'text' }
|
||||
},
|
||||
{
|
||||
options: {
|
||||
left: 153,
|
||||
top: 189,
|
||||
height: 13,
|
||||
width: 238,
|
||||
title: '单击元素,右侧可自定义元素属性',
|
||||
textAlign: 'center',
|
||||
fontFamily: '微软雅黑'
|
||||
},
|
||||
printElementType: { title: '自定义文本', type: 'text' }
|
||||
},
|
||||
{
|
||||
options: { left: 60, top: 190.5, height: 13, width: 51, title: '横线', textAlign: 'center' },
|
||||
printElementType: { title: '自定义文本', type: 'text' }
|
||||
},
|
||||
{
|
||||
options: {
|
||||
left: 415.5,
|
||||
top: 190.5,
|
||||
height: 13,
|
||||
width: 164,
|
||||
title: '可以配置各属性的默认值',
|
||||
textAlign: 'center',
|
||||
fontFamily: '微软雅黑'
|
||||
},
|
||||
printElementType: { title: '自定义文本', type: 'text' }
|
||||
},
|
||||
{
|
||||
options: { left: 60, top: 214.5, height: 10, width: 475.5 },
|
||||
printElementType: { title: '横线', type: 'hline' }
|
||||
},
|
||||
{
|
||||
options: {
|
||||
left: 235.5,
|
||||
top: 220.5,
|
||||
height: 32,
|
||||
width: 342,
|
||||
title:
|
||||
'自定义表格:用户可左键选中表头,右键查看可操作项,操作类似Excel,双击表头单元格可进行编辑。内容:title#field',
|
||||
fontFamily: '微软雅黑',
|
||||
textAlign: 'center',
|
||||
lineHeight: 15
|
||||
},
|
||||
printElementType: { title: '自定义文本', type: 'text' }
|
||||
},
|
||||
{
|
||||
options: {
|
||||
left: 156,
|
||||
top: 265.5,
|
||||
height: 13,
|
||||
width: 94,
|
||||
title: '表头列大小可拖动',
|
||||
fontFamily: '微软雅黑',
|
||||
textAlign: 'center'
|
||||
},
|
||||
printElementType: { title: '自定义文本', type: 'text' }
|
||||
},
|
||||
{
|
||||
options: {
|
||||
left: 60,
|
||||
top: 265.5,
|
||||
height: 13,
|
||||
width: 90,
|
||||
title: '红色区域可拖动',
|
||||
fontFamily: '微软雅黑',
|
||||
textAlign: 'center'
|
||||
},
|
||||
printElementType: { title: '自定义文本', type: 'text' }
|
||||
},
|
||||
{
|
||||
options: {
|
||||
left: 60,
|
||||
top: 285,
|
||||
height: 56,
|
||||
width: 511.5,
|
||||
field: 'table',
|
||||
tableFooterRepeat: '',
|
||||
fields: [
|
||||
{ text: 'id', field: 'id' },
|
||||
{ text: '姓名', field: 'name' },
|
||||
{ text: '性别', field: 'gender' },
|
||||
{ text: '数量', field: 'count' }
|
||||
],
|
||||
columns: [
|
||||
[
|
||||
{ width: 85.25, colspan: 1, rowspan: 1, checked: true },
|
||||
{
|
||||
title: '性别',
|
||||
field: 'gender',
|
||||
width: 85.25,
|
||||
colspan: 1,
|
||||
rowspan: 1,
|
||||
checked: false
|
||||
},
|
||||
{
|
||||
title: '姓名',
|
||||
field: 'name',
|
||||
width: 85.25,
|
||||
align: 'center',
|
||||
colspan: 1,
|
||||
rowspan: 1,
|
||||
checked: true,
|
||||
tableSummary: 'count'
|
||||
},
|
||||
{
|
||||
title: '数量',
|
||||
field: 'count',
|
||||
width: 85.25,
|
||||
align: 'center',
|
||||
colspan: 1,
|
||||
rowspan: 1,
|
||||
checked: true,
|
||||
tableSummary: 'sum'
|
||||
},
|
||||
{
|
||||
width: 85.25,
|
||||
colspan: 1,
|
||||
rowspan: 1,
|
||||
checked: true
|
||||
},
|
||||
{ width: 85.25, colspan: 1, rowspan: 1, checked: true }
|
||||
]
|
||||
]
|
||||
},
|
||||
printElementType: {
|
||||
title: '表格',
|
||||
type: 'table'
|
||||
}
|
||||
},
|
||||
{
|
||||
options: {
|
||||
left: 21,
|
||||
top: 346.5,
|
||||
height: 61.5,
|
||||
width: 15,
|
||||
title: '装订线',
|
||||
lineHeight: 18,
|
||||
fixed: true,
|
||||
contentPaddingTop: 3.75,
|
||||
backgroundColor: '#ffffff'
|
||||
},
|
||||
printElementType: { type: 'text' }
|
||||
},
|
||||
{
|
||||
options: {
|
||||
left: 225,
|
||||
top: 355,
|
||||
height: 13,
|
||||
width: 346.5,
|
||||
title: '自定义模块:主要为开发人员设计,能够快速,简单,实现自己功能',
|
||||
textAlign: 'center'
|
||||
},
|
||||
printElementType: { title: '自定义文本', type: 'text' }
|
||||
},
|
||||
{
|
||||
options: { left: 60, top: 370.5, height: 18, width: 79, title: '配置项表格', textAlign: 'center' },
|
||||
printElementType: { title: '自定义文本', type: 'text' }
|
||||
},
|
||||
{
|
||||
options: {
|
||||
left: 225,
|
||||
top: 385.5,
|
||||
height: 38,
|
||||
width: 346.5,
|
||||
title: '配置模块:主要为客户使用,开发人员可以配置属性,字段,标题等,客户直接使用,配置模块请参考实例2',
|
||||
fontFamily: '微软雅黑',
|
||||
lineHeight: 15,
|
||||
textAlign: 'center',
|
||||
color: '#d93838'
|
||||
},
|
||||
printElementType: { title: '自定义文本', type: 'text' }
|
||||
},
|
||||
{
|
||||
options: {
|
||||
left: 60,
|
||||
top: 487.5,
|
||||
height: 13,
|
||||
width: 123,
|
||||
title: '长文本会自动分页',
|
||||
textAlign: 'center'
|
||||
},
|
||||
printElementType: { title: '自定义文本', type: 'text' }
|
||||
},
|
||||
{
|
||||
options: { left: 60, top: 507, height: 40, width: 511.5, field: 'longText' },
|
||||
printElementType: { title: '长文', type: 'longText' }
|
||||
},
|
||||
{
|
||||
options: { left: 475.5, top: 565.5, height: 100, width: 100 },
|
||||
printElementType: { title: '矩形', type: 'rect' }
|
||||
},
|
||||
{
|
||||
options: { left: 174, top: 568.5, height: 13, width: 90, title: '竖线', textAlign: 'center' },
|
||||
printElementType: { title: '自定义文本', type: 'text' }
|
||||
},
|
||||
{
|
||||
options: { left: 60, top: 574.5, height: 100, width: 10 },
|
||||
printElementType: { title: '竖线', type: 'vline' }
|
||||
},
|
||||
{
|
||||
options: { left: 210, top: 604.5, height: 13, width: 120, title: '横线', textAlign: 'center' },
|
||||
printElementType: { title: '自定义文本', type: 'text' }
|
||||
},
|
||||
{
|
||||
options: { left: 130.5, top: 625.5, height: 10, width: 277 },
|
||||
printElementType: { title: '横线', type: 'hline' }
|
||||
},
|
||||
{
|
||||
options: {
|
||||
left: 364.5,
|
||||
top: 649.5,
|
||||
height: 13,
|
||||
width: 101,
|
||||
title: '矩形',
|
||||
textAlign: 'center'
|
||||
},
|
||||
printElementType: { title: '自定义文本', type: 'text' }
|
||||
},
|
||||
{
|
||||
options: { left: 525, top: 784.5, height: 13, width: 63, title: '页尾线', textAlign: 'center' },
|
||||
printElementType: { title: '自定义文本', type: 'text' }
|
||||
},
|
||||
{
|
||||
options: { left: 12, top: 786, height: 49, width: 49 },
|
||||
printElementType: { title: 'html', type: 'html' }
|
||||
},
|
||||
{
|
||||
options: {
|
||||
left: 75,
|
||||
top: 790.5,
|
||||
height: 13,
|
||||
width: 137,
|
||||
title: '红色原型是自动定义的Html',
|
||||
textAlign: 'center'
|
||||
},
|
||||
printElementType: { title: '自定义文本', type: 'text' }
|
||||
},
|
||||
{
|
||||
options: {
|
||||
left: 334.5,
|
||||
top: 810,
|
||||
height: 13,
|
||||
width: 205,
|
||||
title: '页眉线已上。页尾下以下每页都会重复打印',
|
||||
textAlign: 'center'
|
||||
},
|
||||
printElementType: { title: '自定义文本', type: 'text' }
|
||||
}
|
||||
],
|
||||
paperNumberLeft: 565.5,
|
||||
paperNumberTop: 819
|
||||
}
|
||||
]
|
||||
}
|
|
@ -0,0 +1,21 @@
|
|||
/*
|
||||
* @Description:
|
||||
* @Author: CcSimple
|
||||
* @Github: https://github.com/CcSimple
|
||||
* @Date: 2023-02-09 23:26:18
|
||||
* @LastEditors: CcSimple
|
||||
* @LastEditTime: 2023-02-09 23:35:20
|
||||
*/
|
||||
import { hiprint } from "vue-plugin-hiprint";
|
||||
|
||||
const templateMap = {};
|
||||
|
||||
export function newHiprintPrintTemplate(key, options) {
|
||||
let template = new hiprint.PrintTemplate(options);
|
||||
templateMap[key] = template;
|
||||
return template;
|
||||
}
|
||||
|
||||
export function getHiprintPrintTemplate(key) {
|
||||
return templateMap[key];
|
||||
}
|
|
@ -226,14 +226,14 @@ export const modalColumns = [
|
|||
align: 'center',
|
||||
ellipsis: true
|
||||
},
|
||||
{
|
||||
/*{
|
||||
title: '打码时间',
|
||||
dataIndex: 'subAmount',
|
||||
width: 200,
|
||||
resizable: true,
|
||||
align: 'center',
|
||||
ellipsis: true
|
||||
},
|
||||
},*/
|
||||
{
|
||||
title: '扫描时间',
|
||||
dataIndex: 'scanTime',
|
||||
|
|
|
@ -41,12 +41,14 @@
|
|||
<!-- 产看条码 -->
|
||||
<a-modal v-model:open="visible" title="查看条码" width="80%">
|
||||
<a-table
|
||||
style="height: 500px"
|
||||
:columns="modalColumns"
|
||||
:data-source="scanTableList"
|
||||
:pagination="false"
|
||||
:scroll="{ x: 100 }"
|
||||
:scroll="{ x: 100, y: 420 }"
|
||||
:row-key="(record) => record.id"
|
||||
@expand="columnsExpand"
|
||||
bordered
|
||||
/>
|
||||
</a-modal>
|
||||
</template>
|
||||
|
@ -110,33 +112,36 @@
|
|||
// 查看条码
|
||||
let visible = ref(false)
|
||||
let scanTableList = ref([])
|
||||
let recordTable = {}
|
||||
const handleOpenViewScan = (record) => {
|
||||
recordTable = record
|
||||
visible.value = true
|
||||
producePackageBarcodeApi
|
||||
.producePackageBarcodeTreeList({
|
||||
reportDetailId: record.id,
|
||||
reportId: record.reportId
|
||||
produceReportApi
|
||||
.produceReportTreeList({
|
||||
docsDetailId: record.id,
|
||||
docsId: record.reportId
|
||||
})
|
||||
.then((res) => {
|
||||
scanTableList.value = res
|
||||
scanTableList.value.forEach((item) => {
|
||||
// if (item.subAmount > 0) item.children = []
|
||||
item.children = []
|
||||
if (item.subAmount && item.subAmount > 0) item.children = []
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
const columnsExpand = (expanded, record) => {
|
||||
if (expanded) {
|
||||
producePackageBarcodeApi
|
||||
.producePackageBarcodeTreeChildrenList({
|
||||
reportDetailId: record.reportDetailId,
|
||||
reportId: record.reportId,
|
||||
produceReportApi
|
||||
.produceReportTreeChildrenList({
|
||||
docsDetailId: recordTable.id,
|
||||
docsId: record.docsId,
|
||||
parentBarcode: record.barcode
|
||||
})
|
||||
.then((res) => {
|
||||
record.children = res
|
||||
record.children &&
|
||||
record.children.forEach((item) => {
|
||||
if (item.subAmount && item.subAmount > 0)
|
||||
item.children = []
|
||||
})
|
||||
})
|
||||
|
|
Loading…
Reference in New Issue