diff --git a/src/api/mes/productInbound.js b/src/api/mes/productInbound.js
new file mode 100644
index 0000000..c20ffbe
--- /dev/null
+++ b/src/api/mes/productInbound.js
@@ -0,0 +1,73 @@
+import request from '@/utils/request'
+
+export function createProductInbound(data) {
+ return request({
+ url: '/admin-api/erp/stock-in/create',
+ method: 'post',
+ data: { ...data, inType: '产品入库' }
+ })
+}
+
+export function getProductInboundPage(params = {}) {
+ return request({
+ url: '/admin-api/erp/stock-in/page',
+ method: 'get',
+ params: { ...params, inType: '产品入库' }
+ })
+}
+
+export function getProductInboundDetail(id) {
+ return request({
+ url: '/admin-api/erp/stock-in/get',
+ method: 'get',
+ params: { id }
+ })
+}
+
+export function submitProductInbound(data) {
+ return request({
+ url: '/admin-api/erp/stock-in/submit',
+ method: 'put',
+ data
+ })
+}
+
+export function auditProductInbound(data) {
+ return request({
+ url: '/admin-api/erp/stock-in/audit',
+ method: 'put',
+ data
+ })
+}
+
+export function getTaskPage(params = {}) {
+ return request({
+ url: '/admin-api/mes/task/page',
+ method: 'get',
+ params
+ })
+}
+
+export function getTaskDefaultPackagingSchemes(taskId) {
+ return request({
+ url: '/admin-api/mes/task/task-detail/default-packaging-schemes',
+ method: 'get',
+ params: { taskId }
+ })
+}
+
+export function getPalletPage(params = {}) {
+ return request({
+ url: '/admin-api/erp/pallet/page',
+ method: 'get',
+ params
+ })
+}
+
+export function createPallet(data) {
+ return request({
+ url: '/admin-api/erp/pallet/create',
+ method: 'post',
+ data
+ })
+}
diff --git a/src/locales/en-US.js b/src/locales/en-US.js
index 0e02e75..44d0994 100644
--- a/src/locales/en-US.js
+++ b/src/locales/en-US.js
@@ -1390,5 +1390,141 @@ export default {
validatorRepairStatusRequired: 'Repair result is required',
validatorFinishDateRequired: 'Finish date is required',
validatorConfirmDateRequired: 'Confirm date is required'
+ },
+ productInbound: {
+ moduleName: 'Product Inbound',
+ createTitle: 'New Product Inbound',
+ detailTitle: 'Product Inbound Detail',
+ selectProductTitle: 'Select Product',
+ selectTaskTitle: 'Select Task Order',
+ selectTaskProductTitle: 'Select Task Product',
+ selectPalletTitle: 'Select Pallet',
+ createPalletTitle: 'New Pallet',
+ all: 'All',
+ reset: 'Reset',
+ clear: 'Clear',
+ loading: 'Loading...',
+ loadingMore: 'Loading more...',
+ noMoreData: 'No more data',
+ confirm: 'Confirm',
+ cancel: 'Cancel',
+ back: 'Back',
+ submit: 'OK',
+ submitting: 'Submitting...',
+ tip: 'Tip',
+ choose: 'Please select',
+ yes: 'Yes',
+ no: 'No',
+ statusPending: 'Pending Inbound',
+ statusAuditing: 'Pending Review',
+ statusStored: 'Stored',
+ statusRejected: 'Rejected',
+ searchDocumentPlaceholder: 'Enter document No.',
+ searchProductPlaceholder: 'Search product name/code/spec',
+ searchTaskPlaceholder: 'Search task order No.',
+ searchTaskProductPlaceholder: 'Search product name/code',
+ searchPalletPlaceholder: 'Search pallet code',
+ productInfo: 'Product Info',
+ inboundInfo: 'Inbound Info',
+ inboundTime: 'Inbound Time',
+ selectInboundTime: 'Select inbound time',
+ operator: 'Operator',
+ selectOperator: 'Select operator',
+ inboundQuantity: 'Inbound Quantity',
+ reviewer: 'Reviewer',
+ auditor: 'Auditor',
+ documentNo: 'Document No.',
+ inboundType: 'Inbound Type',
+ remark: 'Remark',
+ remarkPlaceholder: 'Enter remark',
+ attachment: 'Attachment',
+ chooseFile: 'Choose File',
+ itemList: 'Inbound List',
+ addProduct: 'Add Product',
+ product: 'Product',
+ pallet: 'Pallet',
+ packageCount: 'Packages',
+ pieceCount: 'Pieces',
+ inboundPackageCount: 'Inbound Packages',
+ inboundPieceCount: 'Inbound Pieces',
+ palletQuantity: 'Pallets',
+ taskOrder: 'Task Order',
+ taskProduct: 'Task Product',
+ emptyAddProduct: 'Please add a product',
+ emptyInboundList: 'No product inbound orders',
+ emptyItemList: 'No inbound items',
+ confirmInbound: 'Confirm Inbound',
+ inboundSuccess: 'Inbound successful',
+ saveFailed: 'Save failed',
+ loadFailed: 'Load failed',
+ detailLoadFailed: 'Failed to load detail',
+ operationFailed: 'Operation failed',
+ submitAudit: 'Submit Review',
+ auditPass: 'Approve',
+ auditReject: 'Reject',
+ auditPassSuccess: 'Approved',
+ auditRejectSuccess: 'Rejected',
+ submitAuditSuccess: 'Review submitted',
+ submitFailed: 'Submit failed',
+ selectAuditor: 'Select auditor',
+ selectInboundStatus: 'Select Inbound Status',
+ confirmAuditPass: 'Confirm approving this product inbound order?',
+ confirmAuditReject: 'Confirm rejecting this product inbound order?',
+ noDetailId: 'No detail ID',
+ completeProductPalletInfo: 'Complete product and pallet information',
+ addProductFirst: 'Please add a product first',
+ taskInfo: 'Task Info',
+ relatedTask: 'Related Task Order',
+ selectTask: 'Select task order',
+ selectTaskProduct: 'Select task product',
+ selectProduct: 'Select product',
+ selectPallet: 'Select pallet',
+ selectPalletFirst: 'Select pallet first',
+ selectTaskFirst: 'Select task order first',
+ selectProductFirst: 'Select product first',
+ emptyTaskProducts: 'No products for this task order',
+ completePalletInfo: 'Complete pallet warehouse/location/packages',
+ productAdded: 'Product added',
+ taskProductLoadFailed: 'Failed to load task products',
+ workOrderNo: 'Work Order No.',
+ code: 'Code',
+ packagingScheme: 'Packaging Scheme',
+ palletPackageQuantity: 'Packages per Pallet',
+ packageQuantity: 'Pieces per Package',
+ selectedPalletCount: '{count} pallet(s) selected',
+ selectedCount: '{count} selected',
+ packageUnit: '{count} pkg',
+ pieceUnit: '{count} pcs',
+ warehouse: 'Warehouse',
+ area: 'Area',
+ location: 'Location',
+ deliveryDate: 'Delivery Date',
+ emptyTask: 'No task orders',
+ emptyProduct: 'No product data',
+ emptyTaskProduct: 'No task products',
+ emptyPallet: 'No pallets',
+ spec: 'Spec',
+ unit: 'Unit',
+ palletCode: 'Pallet Code',
+ palletType: 'Pallet Type',
+ palletStatus: 'Pallet Status',
+ autoCode: 'Auto Code',
+ length: 'Length',
+ width: 'Width',
+ height: 'Height',
+ productCount: 'Packages',
+ ratedLoadWeight: 'Rated Load',
+ enterPalletCode: 'Enter pallet code',
+ selectPalletType: 'Select pallet type',
+ selectPalletStatus: 'Select pallet status',
+ enterPackageCount: 'Enter packages',
+ selectWarehouse: 'Select warehouse',
+ selectArea: 'Select area',
+ selectUnit: 'Select unit',
+ selectWarehouseFirst: 'Select warehouse first',
+ emptyArea: 'No areas',
+ enterRatedLoadWeight: 'Enter rated load',
+ createSuccess: 'Created successfully',
+ createPalletFailed: 'Failed to create pallet'
}
}
diff --git a/src/locales/index.js b/src/locales/index.js
index 449526c..1fcc551 100644
--- a/src/locales/index.js
+++ b/src/locales/index.js
@@ -136,6 +136,14 @@ const literalMap = {
'新增保养': 'moldMaintain.addTitle',
'更换压网': 'moldPressureNet.moduleName',
'压网历史': 'moldPressureNet.historyTitle'
+ , '产品入库': 'productInbound.moduleName',
+ '新增产品入库': 'productInbound.createTitle',
+ '产品入库详情': 'productInbound.detailTitle',
+ '选择产品': 'productInbound.selectProductTitle',
+ '选择托盘': 'productInbound.selectPalletTitle',
+ '新增托盘': 'productInbound.createPalletTitle',
+ '选择任务单': 'productInbound.selectTaskTitle',
+ '选择任务产品': 'productInbound.selectTaskProductTitle'
}
export function getCurrentLocale() {
diff --git a/src/locales/zh-CN.js b/src/locales/zh-CN.js
index 1a932ee..c58872c 100644
--- a/src/locales/zh-CN.js
+++ b/src/locales/zh-CN.js
@@ -1394,6 +1394,142 @@ export default {
validatorFinishDateRequired: '请选择完成日期',
validatorConfirmDateRequired: '请选择验收日期'
},
+ productInbound: {
+ moduleName: '产品入库',
+ createTitle: '新增产品入库',
+ detailTitle: '产品入库详情',
+ selectProductTitle: '选择产品',
+ selectTaskTitle: '选择任务单',
+ selectTaskProductTitle: '选择任务产品',
+ selectPalletTitle: '选择托盘',
+ createPalletTitle: '新增托盘',
+ all: '全部',
+ reset: '重置',
+ clear: '清空',
+ loading: '加载中...',
+ loadingMore: '加载更多...',
+ noMoreData: '没有更多数据',
+ confirm: '确认',
+ cancel: '取消',
+ back: '返回',
+ submit: '确定',
+ submitting: '提交中...',
+ tip: '提示',
+ choose: '请选择',
+ yes: '是',
+ no: '否',
+ statusPending: '待入库',
+ statusAuditing: '待审核',
+ statusStored: '已入库',
+ statusRejected: '已驳回',
+ searchDocumentPlaceholder: '请输入单据编号',
+ searchProductPlaceholder: '搜索产品名称/编码/规格',
+ searchTaskPlaceholder: '搜索任务单号',
+ searchTaskProductPlaceholder: '搜索产品名称/编码',
+ searchPalletPlaceholder: '搜索托盘码',
+ productInfo: '产品信息',
+ inboundInfo: '入库信息',
+ inboundTime: '入库时间',
+ selectInboundTime: '请选择入库时间',
+ operator: '经办人',
+ selectOperator: '请选择经办人',
+ inboundQuantity: '入库数量',
+ reviewer: '审核人',
+ auditor: '审核人',
+ documentNo: '单据编号',
+ inboundType: '入库类型',
+ remark: '备注',
+ remarkPlaceholder: '请输入备注',
+ attachment: '附件',
+ chooseFile: '选择文件',
+ itemList: '入库清单',
+ addProduct: '添加产品',
+ product: '产品',
+ pallet: '托盘',
+ packageCount: '包数',
+ pieceCount: '个数',
+ inboundPackageCount: '入库包数',
+ inboundPieceCount: '入库个数',
+ palletQuantity: '托盘数量',
+ taskOrder: '任务单',
+ taskProduct: '任务产品',
+ emptyAddProduct: '请添加产品',
+ emptyInboundList: '暂无产品入库单',
+ emptyItemList: '暂无入库清单',
+ confirmInbound: '确认入库',
+ inboundSuccess: '入库成功',
+ saveFailed: '保存失败',
+ loadFailed: '加载失败',
+ detailLoadFailed: '详情加载失败',
+ operationFailed: '操作失败',
+ submitAudit: '提交审核',
+ auditPass: '审核通过',
+ auditReject: '审核驳回',
+ auditPassSuccess: '审核通过',
+ auditRejectSuccess: '已驳回',
+ submitAuditSuccess: '提交审核成功',
+ submitFailed: '提交失败',
+ selectAuditor: '请选择审核人',
+ selectInboundStatus: '选择入库状态',
+ confirmAuditPass: '确认审核通过该产品入库单?',
+ confirmAuditReject: '确认驳回该产品入库单?',
+ noDetailId: '暂无详情ID',
+ completeProductPalletInfo: '请完善产品和托盘信息',
+ addProductFirst: '请先添加产品',
+ taskInfo: '任务信息',
+ relatedTask: '关联任务单',
+ selectTask: '请选择任务单',
+ selectTaskProduct: '请选择任务产品',
+ selectProduct: '请选择产品',
+ selectPallet: '请选择托盘',
+ selectPalletFirst: '请先选择托盘',
+ selectTaskFirst: '请先选择任务单',
+ selectProductFirst: '请先选择产品',
+ emptyTaskProducts: '当前任务单暂无产品',
+ completePalletInfo: '请完善托盘仓库/库位/包数',
+ productAdded: '已添加产品',
+ taskProductLoadFailed: '任务产品加载失败',
+ workOrderNo: '工单号',
+ code: '编码',
+ packagingScheme: '包装方案',
+ palletPackageQuantity: '每托包数',
+ packageQuantity: '每包个数',
+ selectedPalletCount: '已选择 {count} 个托盘',
+ selectedCount: '已选 {count} 个',
+ packageUnit: '{count} 包',
+ pieceUnit: '{count} 个',
+ warehouse: '仓库',
+ area: '库区',
+ location: '库位',
+ deliveryDate: '交付日期',
+ emptyTask: '暂无任务单',
+ emptyProduct: '暂无产品数据',
+ emptyTaskProduct: '暂无任务产品',
+ emptyPallet: '暂无托盘',
+ spec: '规格',
+ unit: '单位',
+ palletCode: '托盘码',
+ palletType: '托盘类型',
+ palletStatus: '托盘状态',
+ autoCode: '自动编码',
+ length: '长',
+ width: '宽',
+ height: '高',
+ productCount: '包数',
+ ratedLoadWeight: '额定载重',
+ enterPalletCode: '请输入托盘码',
+ selectPalletType: '请选择托盘类型',
+ selectPalletStatus: '请选择托盘状态',
+ enterPackageCount: '请输入包数',
+ selectWarehouse: '请选择仓库',
+ selectArea: '请选择库区',
+ selectUnit: '请选择单位',
+ selectWarehouseFirst: '请先选择仓库',
+ emptyArea: '暂无库区',
+ enterRatedLoadWeight: '请输入额定载重',
+ createSuccess: '新增成功',
+ createPalletFailed: '新增托盘失败'
+ },
sparepartInbound: {
moduleName: '备件入库',
tabPending: '待入库',
diff --git a/src/pages.json b/src/pages.json
index 693ab5e..bd04494 100644
--- a/src/pages.json
+++ b/src/pages.json
@@ -395,6 +395,69 @@
"navigationStyle": "custom"
}
},
+ {
+ "path": "productInbound/index",
+ "style": {
+ "navigationBarTitleText": "产品入库",
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "productInbound/create",
+ "style": {
+ "navigationBarTitleText": "新增产品入库",
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "productInbound/detail",
+ "style": {
+ "navigationBarTitleText": "产品入库详情",
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "productInbound/productSelect",
+ "style": {
+ "navigationBarTitleText": "选择产品",
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "productInbound/productConfirm",
+ "style": {
+ "navigationBarTitleText": "新增产品入库",
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "productInbound/palletSelect",
+ "style": {
+ "navigationBarTitleText": "选择托盘",
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "productInbound/palletCreate",
+ "style": {
+ "navigationBarTitleText": "新增托盘",
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "productInbound/taskSelect",
+ "style": {
+ "navigationBarTitleText": "选择任务单",
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "productInbound/taskProductSelect",
+ "style": {
+ "navigationBarTitleText": "选择任务产品",
+ "navigationStyle": "custom"
+ }
+ },
{
"path": "sparepartOutbound/index",
"style": {
diff --git a/src/pages_function/pages/moldRepair/userSelect.vue b/src/pages_function/pages/moldRepair/userSelect.vue
index 8909271..db9001b 100644
--- a/src/pages_function/pages/moldRepair/userSelect.vue
+++ b/src/pages_function/pages/moldRepair/userSelect.vue
@@ -63,7 +63,7 @@ const selectedId = ref('')
const searchText = ref('')
const userList = ref([])
const loading = ref(false)
-const fromSource = ref('moldRepair') // moldRepair | sparepartInbound | sparepartOutbound
+const fromSource = ref('moldRepair') // moldRepair | sparepartInbound | sparepartOutbound | productInbound
let searchTimer = null
const pageTitle = computed(() => {
@@ -124,7 +124,11 @@ function handleConfirm() {
return
}
// 根据来源使用不同的 globalData key
- const keyMap = { sparepartInbound: '_sparepartInboundUserSelectResult', sparepartOutbound: '_sparepartOutboundUserSelectResult' }
+ const keyMap = {
+ sparepartInbound: '_sparepartInboundUserSelectResult',
+ sparepartOutbound: '_sparepartOutboundUserSelectResult',
+ productInbound: '_productInboundUserSelectResult'
+ }
const key = keyMap[fromSource.value] || '_moldRepairUserSelectResult'
getApp().globalData[key] = {
field: field.value === 'confirmBy' ? 'confirmBy' : 'acceptedBy',
diff --git a/src/pages_function/pages/productInbound/create.vue b/src/pages_function/pages/productInbound/create.vue
new file mode 100644
index 0000000..3fb6564
--- /dev/null
+++ b/src/pages_function/pages/productInbound/create.vue
@@ -0,0 +1,365 @@
+
+
+
+
+
+
+
+
+
+
+ {{ t('productInbound.inboundTime') }}*
+
+
+ {{ inboundDate || t('productInbound.selectInboundTime') }}
+
+
+
+
+
+
+ {{ t('productInbound.operator') }}*
+
+ {{ selectedOperatorName || t('productInbound.selectOperator') }}
+
+
+
+
+
+ {{ t('productInbound.remark') }}
+
+
+
+
+ {{ t('productInbound.attachment') }}
+
+
+ {{ t('productInbound.chooseFile') }}
+
+
+
+
+
+ {{ file.name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ itemList.length }}
+ {{ t('productInbound.product') }}
+
+
+ {{ totalPalletCount }}
+ {{ t('productInbound.pallet') }}
+
+
+ {{ totalInputCount }}
+ {{ t('productInbound.packageCount') }}
+
+
+ {{ totalPieceCount }}
+ {{ t('productInbound.pieceCount') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ t('productInbound.inboundPackageCount') }}
+ {{ textValue(item.inputCount) }}
+
+
+ {{ t('productInbound.inboundPieceCount') }}
+ {{ textValue(item.count) }}
+
+
+ {{ t('productInbound.palletQuantity') }}
+ {{ getPalletCount(item) }}
+
+
+ {{ t('productInbound.taskOrder') }}
+ {{ item.relateTask ? textValue(item.taskCode) : t('productInbound.no') }}
+
+
+
+
+
+
+
+ {{ t('productInbound.emptyAddProduct') }}
+
+
+
+
+
+
+ {{ t('productInbound.cancel') }}
+ {{ t('productInbound.confirmInbound') }}
+
+
+
+
+
+
+
diff --git a/src/pages_function/pages/productInbound/detail.vue b/src/pages_function/pages/productInbound/detail.vue
new file mode 100644
index 0000000..8cfcb5b
--- /dev/null
+++ b/src/pages_function/pages/productInbound/detail.vue
@@ -0,0 +1,404 @@
+
+
+
+
+
+
+
+
+
+ {{ t('productInbound.loading') }}
+
+
+
+ {{ t('productInbound.documentNo') }}
+ {{ textValue(detail.no) }}
+
+
+ {{ t('productInbound.inboundType') }}
+ {{ textValue(detail.inType) }}
+
+
+ {{ t('productInbound.inboundTime') }}
+ {{ formatDateTime(detail.inTime || detail.createTime) }}
+
+
+ {{ t('productInbound.operator') }}
+ {{ textValue(getStockUserName(detail)) }}
+
+
+ {{ t('productInbound.inboundQuantity') }}
+ {{ textValue(detail.totalCount) }}
+
+
+ {{ t('productInbound.reviewer') }}
+ {{ textValue(detail.auditUserName) }}
+
+
+
+
+ {{ t('productInbound.remark') }}
+ {{ textValue(detail.remark) }}
+
+
+
+ {{ t('productInbound.attachment') }}
+
+
+
+ {{ textValue(getAttachmentName(file, idx)) }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ itemList.length }}
+ {{ t('productInbound.product') }}
+
+
+ {{ totalPalletCount }}
+ {{ t('productInbound.pallet') }}
+
+
+ {{ totalInputCount }}
+ {{ t('productInbound.packageCount') }}
+
+
+ {{ totalPieceCount }}
+ {{ t('productInbound.pieceCount') }}
+
+
+
+
+
+
+
+
+ {{ t('productInbound.inboundPackageCount') }}
+ {{ textValue(getItemInputCount(item)) }}
+
+
+ {{ t('productInbound.inboundPieceCount') }}
+ {{ textValue(getItemPieceCount(item)) }}
+
+
+ {{ t('productInbound.taskOrder') }}
+ {{ isRelatedTask(item) ? textValue(item.taskCode || item.taskName) : t('productInbound.no') }}
+
+
+ {{ t('productInbound.packagingScheme') }}
+ {{ textValue(item.packagingSchemeName) }}
+
+
+ {{ t('productInbound.palletPackageQuantity') }}
+ {{ textValue(item.palletPackageQuantity) }}
+
+
+ {{ t('productInbound.packageQuantity') }}
+ {{ textValue(item.packageQuantity) }}
+
+
+
+
+
+
+ {{ textValue(getPalletCode(pallet)) }}
+ {{ t('productInbound.packageUnit', { count: textValue(pallet.packageCount) }) }}
+
+
+
+ {{ t('productInbound.warehouse') }}
+ {{ textValue(getWarehouseDisplay(pallet, item)) }}
+
+
+ {{ t('productInbound.location') }}
+ {{ textValue(getAreaDisplay(pallet, item)) }}
+
+
+ {{ t('productInbound.pieceCount') }}
+ {{ textValue(getPalletPieceCount(pallet, item)) }}
+
+
+
+
+
+
+ {{ loading ? t('productInbound.loading') : t('productInbound.emptyItemList') }}
+
+
+
+
+
+ {{ t('productInbound.back') }}
+
+
+
+
+
+
+
diff --git a/src/pages_function/pages/productInbound/index.vue b/src/pages_function/pages/productInbound/index.vue
new file mode 100644
index 0000000..3544190
--- /dev/null
+++ b/src/pages_function/pages/productInbound/index.vue
@@ -0,0 +1,510 @@
+
+
+
+
+
+
+
+
+
+ {{ selectedStatusLabel || t('productInbound.all') }}
+
+
+ {{ t('productInbound.reset') }}
+
+
+
+
+
+
+
+
+ {{ t('productInbound.productInfo') }}
+ {{ textValue(item.productNames || item.productName) }}
+
+
+ {{ t('productInbound.inboundTime') }}
+ {{ formatDateTime(item.inTime || item.createTime) }}
+
+
+ {{ t('productInbound.operator') }}
+ {{ textValue(item.stockUserName || item.creatorName || item.creator) }}
+
+
+ {{ t('productInbound.inboundQuantity') }}
+ {{ textValue(item.totalCount) }}
+
+
+ {{ t('productInbound.reviewer') }}
+ {{ textValue(item.auditUserName) }}
+
+
+
+ {{ t('productInbound.submitAudit') }}
+
+
+ {{ t('productInbound.auditPass') }}
+ {{ t('productInbound.auditReject') }}
+
+
+
+ {{ t('productInbound.loading') }}
+ {{ t('productInbound.emptyInboundList') }}
+ {{ t('productInbound.loadingMore') }}
+ {{ t('productInbound.noMoreData') }}
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+ *{{ t('productInbound.auditor') }}
+
+ {{ selectedAuditor ? selectedAuditor.label : t('productInbound.choose') }}
+ v
+
+
+
+ {{ u.label }}
+
+
+
+
+
+
+
+ {{ t('productInbound.remark') }}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ option.label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages_function/pages/productInbound/palletCreate.vue b/src/pages_function/pages/productInbound/palletCreate.vue
new file mode 100644
index 0000000..c59491e
--- /dev/null
+++ b/src/pages_function/pages/productInbound/palletCreate.vue
@@ -0,0 +1,338 @@
+
+
+
+
+
+
+
+ {{ t('productInbound.palletCode') }}*
+
+
+
+ {{ t('productInbound.autoCode') }}
+
+
+
+
+
+ {{ t('productInbound.palletType') }} *
+
+
+ {{ isEmptyValue(formData.palletType) ? t('productInbound.selectPalletType') : getOptionLabel(palletTypeOptions, formData.palletType) }}
+
+
+
+
+
+ {{ t('productInbound.palletStatus') }}*
+
+
+ {{ isEmptyValue(formData.status) ? t('productInbound.selectPalletStatus') : getOptionLabel(palletStatusOptions, formData.status) }}
+
+
+
+
+
+ {{ t('productInbound.spec') }}
+
+
+ x
+
+ x
+
+
+
+
+
+ {{ t('productInbound.productCount') }}
+
+
+
+
+ {{ t('productInbound.warehouse') }}
+
+
+ {{ isEmptyValue(formData.warehouseId) ? t('productInbound.selectWarehouse') : getOptionLabel(warehouseOptions, formData.warehouseId) }}
+
+
+
+
+
+ {{ t('productInbound.area') }}
+
+
+ {{ getAreaPickerText() }}
+
+
+
+
+
+ {{ t('productInbound.ratedLoadWeight') }}
+
+
+
+
+ {{ t('productInbound.unit') }}
+
+
+ {{ isEmptyValue(formData.unit) ? t('productInbound.selectUnit') : getOptionLabel(unitOptions, formData.unit) }}
+
+
+
+
+
+ {{ t('productInbound.remark') }}
+
+
+
+
+
+
+ {{ t('productInbound.cancel') }}
+
+ {{ submitting ? t('productInbound.submitting') : t('productInbound.createPalletTitle') }}
+
+
+
+
+
+
+
+
diff --git a/src/pages_function/pages/productInbound/palletSelect.vue b/src/pages_function/pages/productInbound/palletSelect.vue
new file mode 100644
index 0000000..e29bca6
--- /dev/null
+++ b/src/pages_function/pages/productInbound/palletSelect.vue
@@ -0,0 +1,238 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ t('productInbound.warehouse') }}
+ {{ textValue(getWarehouseName(item.warehouseId)) }}
+
+
+ {{ t('productInbound.area') }}
+ {{ textValue(getAreaName(item.warehouseId, item.areaId)) }}
+
+
+
+
+
+
+ {{ loading ? t('productInbound.loading') : t('productInbound.emptyPallet') }}
+
+
+
+ +
+
+
+
+ {{ t('productInbound.selectedCount', { count: selectedPallets.length }) }}
+ {{ t('productInbound.confirm') }}
+
+
+
+
+
+
+
diff --git a/src/pages_function/pages/productInbound/productConfirm.vue b/src/pages_function/pages/productInbound/productConfirm.vue
new file mode 100644
index 0000000..a50c17c
--- /dev/null
+++ b/src/pages_function/pages/productInbound/productConfirm.vue
@@ -0,0 +1,494 @@
+
+
+
+
+
+
+
+
+
+
+ {{ t('productInbound.relatedTask') }}*
+
+ {{ t('productInbound.yes') }}
+ {{ t('productInbound.no') }}
+
+
+
+
+ {{ t('productInbound.taskOrder') }}*
+
+
+ {{ taskCode || t('productInbound.selectTask') }}
+
+
+
+
+
+
+ {{ t('productInbound.taskProduct') }}*
+
+
+ {{ selectedTaskProduct ? textValue(selectedTaskProduct.productName) : t('productInbound.selectTaskProduct') }}
+
+
+
+
+
+
+ {{ t('productInbound.product') }}*
+
+
+ {{ productName || t('productInbound.selectProduct') }}
+ {{ textValue(productBarCode) }}
+
+
+
+
+
+
+
+
+ {{ t('productInbound.workOrderNo') }}
+ {{ textValue(taskCode) }}
+
+
+ {{ t('productInbound.product') }}
+ {{ textValue(productName) }}
+
+
+ {{ t('productInbound.code') }}
+ {{ textValue(productBarCode) }}
+
+
+ {{ t('productInbound.packagingScheme') }}
+ {{ textValue(packagingSchemeName) }}
+
+
+ {{ t('productInbound.palletPackageQuantity') }}
+ {{ t('productInbound.packageUnit', { count: textValue(palletPackageQuantity) }) }}
+
+
+ {{ t('productInbound.packageQuantity') }}
+ {{ t('productInbound.pieceUnit', { count: textValue(packageQuantity) }) }}
+
+
+
+
+
+
+
+
+
+
+ {{ t('productInbound.palletCode') }}*
+ {{ t('productInbound.selectedPalletCount', { count: selectedPallets.length }) }}
+
+
+
+ {{ palletCode || t('productInbound.selectPallet') }}
+
+
+
+
+
+
+
+
+
+ {{ textValue(getPalletCode(pallet)) }}
+
+
+
+
+
+
+ {{ t('productInbound.warehouse') }}
+
+
+ {{ pallet.warehouseId ? getWarehouseName(pallet.warehouseId) : t('productInbound.choose') }}
+
+
+
+
+
+ {{ t('productInbound.location') }}
+
+
+ {{ pallet.areaId ? getAreaName(pallet.warehouseId, pallet.areaId) : t('productInbound.choose') }}
+
+
+
+
+
+
+
+ {{ t('productInbound.packageCount') }}
+
+
+
+ {{ t('productInbound.pieceCount') }}
+ {{ getPalletItemCount(pallet) }}
+
+
+
+
+
+
+ {{ inputCount }}
+ {{ t('productInbound.packageCount') }}
+
+
+ {{ count }}
+ {{ t('productInbound.pieceCount') }}
+
+
+
+ {{ t('productInbound.selectPalletFirst') }}
+
+
+
+
+
+ {{ t('productInbound.cancel') }}
+ {{ t('productInbound.confirm') }}
+
+
+
+
+
+
+
diff --git a/src/pages_function/pages/productInbound/productSelect.vue b/src/pages_function/pages/productInbound/productSelect.vue
new file mode 100644
index 0000000..ebf5a59
--- /dev/null
+++ b/src/pages_function/pages/productInbound/productSelect.vue
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ t('productInbound.spec') }}
+ {{ textValue(item.standard || item.deviceSpec) }}
+
+
+ {{ t('productInbound.unit') }}
+ {{ textValue(item.unitName) }}
+
+
+
+
+
+
+ {{ loading ? t('productInbound.loading') : t('productInbound.emptyProduct') }}
+
+
+
+ {{ t('productInbound.confirm') }}
+
+
+
+
+
+
+
diff --git a/src/pages_function/pages/productInbound/taskProductSelect.vue b/src/pages_function/pages/productInbound/taskProductSelect.vue
new file mode 100644
index 0000000..5363e43
--- /dev/null
+++ b/src/pages_function/pages/productInbound/taskProductSelect.vue
@@ -0,0 +1,135 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ t('productInbound.packagingScheme') }}
+ {{ textValue(getDefaultScheme(item)?.packagingSchemeName) }}
+
+
+ {{ t('productInbound.palletPackageQuantity') }}
+ {{ textValue(getDefaultScheme(item)?.palletPackageQuantity) }}
+
+
+ {{ t('productInbound.packageQuantity') }}
+ {{ textValue(getDefaultScheme(item)?.packageQuantity) }}
+
+
+
+
+
+
+ {{ t('productInbound.emptyTaskProduct') }}
+
+
+
+ {{ t('productInbound.confirm') }}
+
+
+
+
+
+
+
diff --git a/src/pages_function/pages/productInbound/taskSelect.vue b/src/pages_function/pages/productInbound/taskSelect.vue
new file mode 100644
index 0000000..5f0d41e
--- /dev/null
+++ b/src/pages_function/pages/productInbound/taskSelect.vue
@@ -0,0 +1,154 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ t('productInbound.deliveryDate') }}
+ {{ formatDateTime(item.deliveryDate) }}
+
+
+ {{ t('productInbound.remark') }}
+ {{ textValue(item.remark) }}
+
+
+
+
+
+
+ {{ loading ? t('productInbound.loading') : t('productInbound.emptyTask') }}
+
+
+
+ {{ t('productInbound.confirm') }}
+
+
+
+
+
+
+
diff --git a/src/static/scss/form-control.scss b/src/static/scss/form-control.scss
index d47e6f6..2f522f0 100644
--- a/src/static/scss/form-control.scss
+++ b/src/static/scss/form-control.scss
@@ -2,6 +2,7 @@ page {
--app-form-control-height: 70rpx;
--app-select-field-height: var(--app-form-control-height);
--app-input-field-height: var(--app-form-control-height);
+ --app-textarea-field-height: 150rpx;
}
.app-select-field,
@@ -102,3 +103,13 @@ page {
.selected-items {
min-height: var(--app-select-field-height) !important;
}
+
+.app-textarea-field,
+.form-textarea,
+.modal-textarea,
+.remark-textarea,
+.textarea {
+ min-height: var(--app-textarea-field-height) !important;
+ height: var(--app-textarea-field-height) !important;
+ box-sizing: border-box;
+}
diff --git a/src/utils/dict.ts b/src/utils/dict.ts
index 0eff075..63cf686 100644
--- a/src/utils/dict.ts
+++ b/src/utils/dict.ts
@@ -7,6 +7,8 @@ export enum DICT_TYPE {
FAILURE_LEVEL = "failure_level",
ERP_MOLD_STATUS = "erp_mold_status",
ERP_AUDIT_STATUS = "erp_audit_status",
+ STORAGE_PALLET_TYPES = "storage_pallet_types",
+ STORAGE_PALLET_STATUS = "storage_pallet_status",
MES_ORG_TYPE = "mes_org_type",
MES_TZ_STATUS = "mes_tz_status",
INSPECTION_METHOD = "Inspection_method",
diff --git a/src/utils/permissionMenu.js b/src/utils/permissionMenu.js
index 71675ed..cf95610 100644
--- a/src/utils/permissionMenu.js
+++ b/src/utils/permissionMenu.js
@@ -89,6 +89,10 @@ const MENU_ROUTE_MAP = {
equipment: '/pages_function/pages/equipment/index',
spare: '/pages_function/pages/spare/index',
sparepartInbound: '/pages_function/pages/sparepartInbound/index',
+ productInbound: '/pages_function/pages/productInbound/index',
+ productinbound: '/pages_function/pages/productInbound/index',
+ productIn: '/pages_function/pages/productInbound/index',
+ '产品入库': '/pages_function/pages/productInbound/index',
sparepartoutbound: '/pages_function/pages/sparepartOutbound/index',
'备件出库': '/pages_function/pages/sparepartOutbound/index',
sparepartinbound: '/pages_function/pages/sparepartInbound/index',