黄伟杰 1 month ago
commit 87cda49904

@ -125,6 +125,10 @@ export const MoldBrandApi = {
getMold: async (id: number) => { getMold: async (id: number) => {
return await request.get({ url: `/erp/mold-brand/mold/get?id=` + id }) return await request.get({ url: `/erp/mold-brand/mold/get?id=` + id })
}, },
// 根据状态获得模具
getMoldListByStatus: async (status: number) => {
return await request.get({ url: `/erp/mold/getMoldListByStatus?status=` + status })
},
// ==================== 子表(模具产品) ==================== // ==================== 子表(模具产品) ====================

@ -91,7 +91,12 @@ export const DeviceApi = {
getDevice: async (id: number) => { getDevice: async (id: number) => {
return await request.get({ url: `/iot/device/get?id=` + id }) return await request.get({ url: `/iot/device/get?id=` + id })
}, },
getDeviceListByNoUsed: async () => {
return await request.get({ url: `/iot/device/noUsedlist` })
},
getDeviceList2ByNoUsed: async (id: number) => {
return await request.get({ url: `/iot/device/noUsedlist2?id=` + id })
},
// 新增物联设备 // 新增物联设备
createDevice: async (data: DeviceVO) => { createDevice: async (data: DeviceVO) => {
return await request.post({ url: `/iot/device/create`, data }) return await request.post({ url: `/iot/device/create`, data })

@ -54,6 +54,10 @@ export const DeviceLedgerApi = {
return await request.get({ url: `/mes/device-ledger/noUsedlist` }) return await request.get({ url: `/mes/device-ledger/noUsedlist` })
}, },
getDeviceLedgerList2ByNoUsed: async (id: number) => {
return await request.get({ url: `/mes/device-ledger/noUsedlist2?id=` + id })
},
// 查询设备类型详情 // 查询设备类型详情
getDeviceLedger: async (id: number) => { getDeviceLedger: async (id: number) => {
return await request.get({ url: `/mes/device-ledger/get?id=` + id }) return await request.get({ url: `/mes/device-ledger/get?id=` + id })

@ -14,6 +14,7 @@ export interface OrganizationVO {
status: string // 组织状态 status: string // 组织状态
orgClass: string // 组织等级 orgClass: string // 组织等级
orgType: string // 组织类型 orgType: string // 组织类型
dvId: number
} }
export type DeviceParameterAnalysisNodeVO = { export type DeviceParameterAnalysisNodeVO = {

@ -1916,6 +1916,7 @@ export default {
placeholderUnit: 'Please select unit', placeholderUnit: 'Please select unit',
placeholderInTime: 'Select stock in time', placeholderInTime: 'Select stock in time',
placeholderRemark: 'Please input remark', placeholderRemark: 'Please input remark',
placeholderStatus: 'Please select status',
validatorCodeRequired: 'Mold code can not be empty', validatorCodeRequired: 'Mold code can not be empty',
validatorNameRequired: 'Mold name can not be empty', validatorNameRequired: 'Mold name can not be empty',
validatorUnitRequired: 'Unit can not be empty', validatorUnitRequired: 'Unit can not be empty',

@ -1499,6 +1499,7 @@ export default {
placeholderUnit: '请选择单位', placeholderUnit: '请选择单位',
placeholderInTime: '选择入库时间', placeholderInTime: '选择入库时间',
placeholderRemark: '请输入备注', placeholderRemark: '请输入备注',
placeholderStatus: '请选择状态',
validatorCodeRequired: '模具编码不能为空', validatorCodeRequired: '模具编码不能为空',
validatorNameRequired: '模具名称不能为空', validatorNameRequired: '模具名称不能为空',
validatorUnitRequired: '单位不能为空', validatorUnitRequired: '单位不能为空',

@ -86,6 +86,7 @@
<el-input <el-input
v-model="formData.remark" v-model="formData.remark"
:placeholder="t('MoldManagement.MoldBrand.placeholderRemark')" :placeholder="t('MoldManagement.MoldBrand.placeholderRemark')"
type="textarea"
/> />
</el-form-item> </el-form-item>
</el-form> </el-form>

@ -78,6 +78,7 @@
<el-input <el-input
v-model="formData.remark" v-model="formData.remark"
:placeholder="t('MoldManagement.Mold.placeholderRemark')" :placeholder="t('MoldManagement.Mold.placeholderRemark')"
type="textarea"
/> />
</el-form-item> </el-form-item>
<el-form-item :label="t('MoldManagement.Mold.isEnable')" prop="isEnable"> <el-form-item :label="t('MoldManagement.Mold.isEnable')" prop="isEnable">

@ -6,7 +6,7 @@
:model="queryParams" :model="queryParams"
ref="queryFormRef" ref="queryFormRef"
:inline="true" :inline="true"
label-width="110px" label-width="68px"
> >
<el-form-item :label="t('MoldManagement.MoldBrand.code')" prop="code"> <el-form-item :label="t('MoldManagement.MoldBrand.code')" prop="code">
<el-input <el-input
@ -94,7 +94,7 @@
@current-change="handleCurrentChange" @current-change="handleCurrentChange"
@selection-change="handleSelectionChange" @selection-change="handleSelectionChange"
> >
<el-table-column type="selection" width="55" fixed="left" reserve-selection /> <!-- <el-table-column type="selection" width="55" fixed="left" reserve-selection /> -->
<el-table-column :label="t('MoldManagement.MoldBrand.code')" align="center" prop="code" /> <el-table-column :label="t('MoldManagement.MoldBrand.code')" align="center" prop="code" />
<el-table-column :label="t('MoldManagement.MoldBrand.name')" align="left" prop="name" /> <el-table-column :label="t('MoldManagement.MoldBrand.name')" align="left" prop="name" />
<el-table-column :label="t('MoldManagement.MoldBrand.moldType')" align="center" prop="moldType" /> <el-table-column :label="t('MoldManagement.MoldBrand.moldType')" align="center" prop="moldType" />
@ -112,7 +112,6 @@
<el-table-column label="维保周期" align="center" prop="maintainTime" /> --> <el-table-column label="维保周期" align="center" prop="maintainTime" /> -->
<el-table-column :label="t('MoldManagement.MoldBrand.moldSize')" align="center" prop="moldSize" /> <el-table-column :label="t('MoldManagement.MoldBrand.moldSize')" align="center" prop="moldSize" />
<el-table-column :label="t('MoldManagement.MoldBrand.remark')" align="center" prop="remark" /> <el-table-column :label="t('MoldManagement.MoldBrand.remark')" align="center" prop="remark" />
<el-table-column <el-table-column
:label="t('MoldManagement.MoldBrand.createTime')" :label="t('MoldManagement.MoldBrand.createTime')"
align="center" align="center"
@ -153,22 +152,22 @@
<!-- 表单弹窗添加/修改 --> <!-- 表单弹窗添加/修改 -->
<MoldBrandForm ref="formRef" @success="getList" /> <MoldBrandForm ref="formRef" @success="getList" />
<!-- 子表的列表 --> <!-- 子表的列表 -->
<ContentWrap v-if="currentBrandId"> <!-- <ContentWrap v-if="currentBrandId">
<div class="mb-10px text-14px font-600"> <div class="mb-10px text-14px font-600">
{{ currentBrandDisplay }} {{ currentBrandDisplay }}
</div> </div>
<el-tabs model-value="mold"> <el-tabs model-value="mold">
<el-tab-pane :label="t('MoldManagement.MoldBrand.tabMold')" name="mold"> <el-tab-pane :label="t('MoldManagement.MoldBrand.tabMold')" name="mold">
<MoldList :brand-id="currentBrandId" /> <MoldList :brand-id="currentBrandId" />
</el-tab-pane> </el-tab-pane> -->
<!-- <el-tab-pane label="产品" name="moldBrandProduct"> <!-- <el-tab-pane label="产品" name="moldBrandProduct">
<MoldBrandProductList :brand-id="currentBrandId" /> <MoldBrandProductList :brand-id="currentBrandId" />
</el-tab-pane> --> </el-tab-pane> -->
</el-tabs> <!-- </el-tabs>
</ContentWrap> </ContentWrap> -->
<ContentWrap v-else> <!-- <ContentWrap v-else>
<el-empty :description="t('MoldManagement.MoldBrand.emptyTip')" /> <el-empty :description="t('MoldManagement.MoldBrand.emptyTip')" />
</ContentWrap> </ContentWrap> -->
</template> </template>
<script setup lang="ts"> <script setup lang="ts">

@ -19,6 +19,21 @@ v-loading="typeTreeLoading" :data="brandTreeData" node-key="id" highlight-curren
v-model="queryParams.name" :placeholder="t('MoldManagement.Mold.name')" clearable @keyup.enter="handleQuery" v-model="queryParams.name" :placeholder="t('MoldManagement.Mold.name')" clearable @keyup.enter="handleQuery"
class="!w-240px" /> class="!w-240px" />
</el-form-item> </el-form-item>
<el-form-item :label="t('MoldManagement.Mold.status')" prop="status">
<el-select
v-model="queryParams.status"
:placeholder="t('MoldManagement.Mold.placeholderStatus')"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.ERP_MOLD_STATUS)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item> <el-form-item>
<el-button @click="handleQuery"> <el-button @click="handleQuery">
<Icon icon="ep:search" class="mr-5px" /> {{ t('common.query') }} <Icon icon="ep:search" class="mr-5px" /> {{ t('common.query') }}
@ -95,7 +110,6 @@ type="success" plain @click="handleExport" :loading="exportLoading"
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { DICT_TYPE } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime' import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download' import download from '@/utils/download'
import { DeviceLedgerApi } from '@/api/mes/deviceledger' import { DeviceLedgerApi } from '@/api/mes/deviceledger'
@ -104,6 +118,7 @@ import { MoldBrandApi, MoldBrandTreeVO,MoldVO } from '@/api/erp/mold'
import { useDictStoreWithOut } from '@/store/modules/dict' import { useDictStoreWithOut } from '@/store/modules/dict'
import MoldForm from '@/views/erp/mold/components/MoldForm.vue' import MoldForm from '@/views/erp/mold/components/MoldForm.vue'
import MoldRecordForm from "@/views/erp/mold/components/MoldRecordForm.vue"; import MoldRecordForm from "@/views/erp/mold/components/MoldRecordForm.vue";
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
/** 设备类型 列表 */ /** 设备类型 列表 */
defineOptions({ name: 'DeviceLedger' }) defineOptions({ name: 'DeviceLedger' })
@ -120,6 +135,7 @@ const queryParams = reactive({
code: undefined, code: undefined,
name: undefined, name: undefined,
brand: undefined, brand: undefined,
status: undefined
}) })
const queryFormRef = ref() // const queryFormRef = ref() //
const exportLoading = ref(false) // const exportLoading = ref(false) //
@ -183,7 +199,8 @@ const getList = async () => {
pageSize: queryParams.pageSize, pageSize: queryParams.pageSize,
code: queryParams.code, code: queryParams.code,
name: queryParams.name, name: queryParams.name,
brandId: queryParams.brand brandId: queryParams.brand,
status: queryParams.status
}) })
list.value = data.list list.value = data.list
total.value = data.total total.value = data.total

@ -135,8 +135,7 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<!-- <el-col :span="24">
<el-col :span="24">
<el-form-item :label="t('EquipmentManagement.EquipmentLedger.dvName')" prop="dvId"> <el-form-item :label="t('EquipmentManagement.EquipmentLedger.dvName')" prop="dvId">
<el-select v-model="formData.dvId" filterable :placeholder="t('EquipmentManagement.EquipmentLedger.dvId')"> <el-select v-model="formData.dvId" filterable :placeholder="t('EquipmentManagement.EquipmentLedger.dvId')">
<el-option <el-option
@ -147,7 +146,7 @@
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col> -->
<el-col :span="24"> <el-col :span="24">
<el-form-item :label="t('EquipmentManagement.EquipmentLedger.criticalComponent')" prop="componentIds"> <el-form-item :label="t('EquipmentManagement.EquipmentLedger.criticalComponent')" prop="componentIds">
<el-cascader <el-cascader
@ -386,7 +385,6 @@ const open = async (type: string, id?: number, defaultDeviceTypeId?: number) =>
formType.value = type formType.value = type
resetForm() resetForm()
await ensureOptionsLoaded() await ensureOptionsLoaded()
deviceList.value = await DeviceApi.getDeviceList()
if (type === 'create' && defaultDeviceTypeId) { if (type === 'create' && defaultDeviceTypeId) {
formData.value.deviceType = defaultDeviceTypeId formData.value.deviceType = defaultDeviceTypeId
} }
@ -408,6 +406,11 @@ const open = async (type: string, id?: number, defaultDeviceTypeId?: number) =>
formLoading.value = false formLoading.value = false
} }
} }
if (type == 'create' || typeof formData.value.dvId != 'number') {
deviceList.value = await DeviceApi.getDeviceListByNoUsed()
} else {
deviceList.value = await DeviceApi.getDeviceList2ByNoUsed(formData.value.dvId)
}
} }
defineExpose({ open }) // open defineExpose({ open }) // open

@ -66,23 +66,38 @@
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
<el-form-item :label="t('MoldManagement.MoldGet.remarkSingle')" prop="remark"> <el-form-item :label="t('MoldManagement.MoldReturn.warehouse')" prop="warehouseId">
<el-input <el-select
type="textarea" v-model="formData.warehouseId"
v-model="formData.remark" clearable
:rows="1" filterable
:placeholder="t('MoldManagement.MoldGet.placeholderRemark')" :placeholder="t('MoldManagement.MoldReturn.placeholderWarehouse')"
class="!w-240px"
>
<el-option
v-for="item in warehouseList"
:key="item.id"
:label="item.name"
:value="item.id"
/> />
</el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
<el-form-item :label="t('MoldManagement.MoldGet.attachment')" prop="fileUrl"> <el-form-item :label="t('MoldManagement.MoldGet.attachment')" prop="fileUrl">
<UploadFile :is-show-tip="false" v-model="formData.fileUrl" :limit="1" /> <UploadFile :is-show-tip="false" v-model="formData.fileUrl" :limit="1" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24">
<el-form-item :label="t('MoldManagement.MoldGet.remarkSingle')" prop="remark">
<el-input
type="textarea"
v-model="formData.remark"
:placeholder="t('MoldManagement.MoldGet.placeholderRemark')"
/>
</el-form-item>
</el-col>
</el-row> </el-row>
</el-form> </el-form>
<!-- 子表的表单 --> <!-- 子表的表单 -->
@ -106,12 +121,14 @@ import { StockOutApi, StockOutVO } from '@/api/erp/stock/out'
import StockOutItemForm from './components/StockOutItemForm.vue' import StockOutItemForm from './components/StockOutItemForm.vue'
import { CustomerApi, CustomerVO } from '@/api/erp/sale/customer' import { CustomerApi, CustomerVO } from '@/api/erp/sale/customer'
import {DICT_TYPE, getBoolDictOptions, getStrDictOptions} from "@/utils/dict"; import {DICT_TYPE, getBoolDictOptions, getStrDictOptions} from "@/utils/dict";
import { WarehouseApi, WarehouseVO } from '@/api/erp/stock/warehouse'
/** ERP 其它出库单表单 */ /** ERP 其它出库单表单 */
defineOptions({ name: 'MoldGetForm' }) defineOptions({ name: 'MoldGetForm' })
const { t } = useI18n() // const { t } = useI18n() //
const message = useMessage() // const message = useMessage() //
const warehouseList = ref<WarehouseVO[]>([]) //
const dialogVisible = ref(false) // const dialogVisible = ref(false) //
const dialogTitle = ref('') // const dialogTitle = ref('') //
@ -124,7 +141,8 @@ const formData = ref({
remark: undefined, remark: undefined,
outType: undefined, outType: undefined,
fileUrl: '', fileUrl: '',
items: [] items: [],
warehouseId: undefined
}) })
const formRules = reactive({ const formRules = reactive({
outTime: [ outTime: [
@ -164,6 +182,7 @@ const open = async (type: string, id?: number) => {
} }
// //
customerList.value = await CustomerApi.getCustomerSimpleList() customerList.value = await CustomerApi.getCustomerSimpleList()
warehouseList.value = await WarehouseApi.getWarehouseSimpleList()
} }
defineExpose({ open }) // open defineExpose({ open }) // open
@ -176,6 +195,16 @@ const submitForm = async () => {
// //
formLoading.value = true formLoading.value = true
try { try {
itemFormRef.value.selectedRows.forEach((item, index) => {
const i = {
warehouseId : formData.value.warehouseId,
productId : item.id,
productPrice: 0,
count: 1,
}
formData.value.items.push(i)
console.log(formData.value.items)
});
const data = formData.value as unknown as StockOutVO const data = formData.value as unknown as StockOutVO
if (formType.value === 'create') { if (formType.value === 'create') {
await StockOutApi.createStockOut(data) await StockOutApi.createStockOut(data)

@ -1,279 +1,304 @@
<template> <template>
<el-form <div class="device-ledger-layout">
ref="formRef" <div class="device-ledger-right">
:model="formData" <ContentWrap>
:rules="formRules" <el-form class="-mb-15px" :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px">
v-loading="formLoading" <el-form-item :label="t('MoldManagement.Mold.code')" prop="code">
label-width="0px" <el-input
:inline-message="true" v-model="queryParams.code" :placeholder="t('MoldManagement.Mold.code')" clearable @keyup.enter="handleQuery"
:disabled="disabled" class="!w-240px" />
>
<el-table :data="formData" show-summary :summary-method="getSummaries" class="-mt-10px">
<el-table-column :label="t('MoldManagement.MoldGet.itemIndex')" type="index" align="center" width="60" />
<el-table-column :label="t('MoldManagement.MoldGet.itemWarehouseName')" min-width="125">
<template #default="{ row, $index }">
<el-form-item
:prop="`${$index}.warehouseId`"
:rules="formRules.warehouseId"
class="mb-0px!"
>
<el-select
v-model="row.warehouseId"
clearable
filterable
:placeholder="t('MoldManagement.MoldGet.placeholderWarehouse')"
@change="onChangeWarehouse($event, row)"
>
<el-option
v-for="item in warehouseList"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
</el-form-item> </el-form-item>
</template> <el-form-item :label="t('MoldManagement.Mold.name')" prop="name">
</el-table-column> <el-input
<el-table-column :label="t('MoldManagement.MoldGet.itemMoldName')" min-width="180"> v-model="queryParams.name" :placeholder="t('MoldManagement.Mold.name')" clearable @keyup.enter="handleQuery"
<template #default="{ row, $index }"> class="!w-240px" />
<el-form-item :prop="`${$index}.productId`" :rules="formRules.productId" class="mb-0px!">
<el-select
v-model="row.productId"
clearable
filterable
@change="onChangeProduct($event, row)"
:placeholder="t('MoldManagement.MoldGet.placeholderMold')"
>
<el-option
v-for="item in productList"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
</el-form-item>
</template>
</el-table-column>
<el-table-column :label="t('MoldManagement.MoldGet.itemStockCount')" min-width="100">
<template #default="{ row }">
<el-form-item class="mb-0px!">
<el-input disabled v-model="row.stockCount" :formatter="erpCountInputFormatter" />
</el-form-item>
</template>
</el-table-column>
<el-table-column :label="t('MoldManagement.MoldGet.itemMoldCode')" min-width="150">
<template #default="{ row }">
<el-form-item class="mb-0px!">
<el-input disabled v-model="row.productBarCode" />
</el-form-item>
</template>
</el-table-column>
<el-table-column :label="t('MoldManagement.MoldGet.itemUnitName')" min-width="80">
<template #default="{ row }">
<el-form-item class="mb-0px!">
<el-input disabled v-model="row.productUnitName" />
</el-form-item> </el-form-item>
</template> <el-form-item>
</el-table-column> <el-button @click="handleQuery">
<el-table-column :label="t('MoldManagement.MoldGet.itemCount')" prop="count" fixed="right" min-width="140"> <Icon icon="ep:search" class="mr-5px" /> {{ t('common.query') }}
<template #default="{ row, $index }"> </el-button>
<el-form-item :prop="`${$index}.count`" :rules="formRules.count" class="mb-0px!"> <el-button @click="resetQuery">
<el-input-number <Icon icon="ep:refresh" class="mr-5px" /> {{ t('common.reset') }}
v-model="row.count" </el-button>
controls-position="right"
:min="0"
:precision="0"
class="!w-100%"
/>
</el-form-item> </el-form-item>
</el-form>
</ContentWrap>
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true" @selection-change="handleSelectionChange" ref="tableRef" :row-key="row => row.id">
<el-table-column width="30" type="selection" />
<el-table-column :label="t('MoldManagement.Mold.code')" align="center" prop="code" />
<el-table-column :label="t('MoldManagement.Mold.name')" align="left" prop="name" />
<el-table-column :label="t('MoldManagement.Mold.useTime')" align="center" prop="useTime" />
<el-table-column :label="t('MoldManagement.Mold.status')" align="center" prop="status">
<template #default="scope">
<dict-tag :type="DICT_TYPE.ERP_MOLD_STATUS" :value="scope.row.status" />
</template> </template>
</el-table-column> </el-table-column>
<!-- <el-table-column label="单价" fixed="right" min-width="120"> <el-table-column :label="t('MoldManagement.Mold.machineName')" align="center" prop="machineName" />
<template #default="{ row, $index }"> <el-table-column :label="t('MoldManagement.Mold.remark')" align="center" prop="remark" />
<el-form-item :prop="`${$index}.productPrice`" class="mb-0px!"> <el-table-column :label="t('MoldManagement.Mold.isEnable')" align="center" prop="isEnable">
<el-input-number <template #default="scope">
v-model="row.productPrice" <dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="scope.row.isEnable" />
controls-position="right"
:min="0.01"
:precision="2"
class="!w-100%"
/>
</el-form-item>
</template>
</el-table-column> -->
<!-- <el-table-column label="合计金额" prop="totalPrice" fixed="right" min-width="100">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.totalPrice`" class="mb-0px!">
<el-input disabled v-model="row.totalPrice" :formatter="erpPriceInputFormatter" />
</el-form-item>
</template>
</el-table-column> -->
<el-table-column :label="t('MoldManagement.MoldGet.itemRemark')" fixed="right" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.remark`" class="mb-0px!">
<el-input v-model="row.remark" placeholder="请输入备注" />
</el-form-item>
</template>
</el-table-column>
<el-table-column align="center" fixed="right" :label="t('MoldManagement.MoldGet.itemOperate')" width="60">
<template #default="{ $index }">
<el-button type="danger" @click="handleDelete($index)" link>
<Icon icon="ep:delete" />
</el-button>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column :label="t('MoldManagement.Mold.createTime')" align="center" prop="createTime" :formatter="dateFormatter" width="180px" />
</el-table> </el-table>
</el-form> <Pagination
<el-row justify="center" class="mt-3" v-if="!disabled"> :total="total" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize"
<el-button @click="handleAdd" round>+ {{ t('MoldManagement.MoldGet.itemAddButton') }}</el-button> @pagination="getList" />
</el-row> </ContentWrap>
</div>
</div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ProductApi, ProductVO } from '@/api/erp/product/product' import { DICT_TYPE } from '@/utils/dict'
import { WarehouseApi, WarehouseVO } from '@/api/erp/stock/warehouse' import { dateFormatter } from '@/utils/formatTime'
import { StockApi } from '@/api/erp/stock/stock'
import { MoldBrandApi, MoldVO } from '@/api/erp/mold' import { MoldBrandApi, MoldVO } from '@/api/erp/mold'
import { import { useDictStoreWithOut } from '@/store/modules/dict'
erpCountInputFormatter,
erpPriceInputFormatter,
erpPriceMultiply, const message = useMessage() //
getSumValue const { t } = useI18n() //
} from '@/utils'
const loading = ref(false) //
const props = defineProps<{ const list = ref<MoldVO[]>([]) //
items: undefined const total = ref(0) //
disabled: false const queryParams = reactive({
}>() pageNo: 1,
const formLoading = ref(false) // pageSize: 10,
const formData = ref([]) code: undefined,
const { t } = useI18n() name: undefined,
brand: undefined,
const formRules = reactive({ })
inId: [ const queryFormRef = ref() //
{ required: true, message: t('MoldManagement.MoldGet.validatorItemOutIdRequired'), trigger: 'blur' }
],
warehouseId: [
{ required: true, message: t('MoldManagement.MoldGet.validatorItemWarehouseRequired'), trigger: 'blur' } const dictStore = useDictStoreWithOut()
], const dictReady = ref(false)
productId: [
{ required: true, message: t('MoldManagement.MoldGet.validatorItemMoldRequired'), trigger: 'blur' } /** 查询列表 */
], const getList = async () => {
count: [ loading.value = true
{ required: true, message: t('MoldManagement.MoldGet.validatorItemCountRequired'), trigger: 'blur' } try {
] const data = await MoldBrandApi.getMoldPage({
pageNo: queryParams.pageNo,
pageSize: queryParams.pageSize,
code: queryParams.code,
name: queryParams.name,
brandId: queryParams.brand,
statuss: [1]
}) })
const formRef = ref([]) // Ref list.value = data.list
const productList = ref<MoldVO[]>([]) // total.value = data.total
const warehouseList = ref<WarehouseVO[]>([]) // } finally {
const defaultWarehouse = ref<WarehouseVO>(undefined) // loading.value = false
}
/** 初始化设置出库项 */ }
watch(
() => props.items, /** 搜索按钮操作 */
async (val) => { const handleQuery = () => {
formData.value = val queryParams.pageNo = 1
}, getList()
{ immediate: true } }
)
/** 重置按钮操作 */
/** 监听合同产品变化,计算合同产品总价 */ const resetQuery = () => {
watch( queryFormRef.value.resetFields()
() => formData.value, handleQuery()
(val) => { }
if (!val || val.length === 0) {
return const tableRef = ref()
} const selectedRows = ref<any[]>([])
//
val.forEach((item) => { watch(list, async () => {
item.totalPrice = erpPriceMultiply(item.productPrice, item.count) await nextTick()
restoreSelection()
})
const restoreSelection = () => {
if (!tableRef.value || selectedRows.value.length === 0) return
tableRef.value.clearSelection?.()
selectedRows.value.forEach(selectedRow => {
const rowInTable = list.value.find(row => row.id === selectedRow.id)
if (rowInTable) {
tableRef.value.toggleRowSelection?.(rowInTable, true)
}
}) })
},
{ deep: true }
)
/** 合计 */
const getSummaries = (param: SummaryMethodProps) => {
const { columns, data } = param
const sums: string[] = []
columns.forEach((column, index) => {
if (index === 0) {
sums[index] = t('MoldManagement.MoldGet.sumLabel')
return
}
if (['count', 'totalPrice'].includes(column.property)) {
const sum = getSumValue(data.map((item) => Number(item[column.property])))
sums[index] =
String(Math.trunc(Number(column.property === 'count' ? erpCountInputFormatter(sum) : erpPriceInputFormatter(sum))))
} else {
sums[index] = ''
} }
const handleSelectionChange = (rows: any[]) => {
selectedRows.value = rows
}
const validate = async (): Promise<boolean> => {
if (!tableRef.value) return false
try {
await tableRef.value.validate()
return true
} catch (error) {
return false
}
}
defineExpose({ validate,selectedRows: selectedRows })
/** 初始化 **/
onMounted(async () => {
await dictStore.setDictMap()
dictReady.value = true
getList()
}) })
return sums
</script>
<style scoped>
.device-ledger-layout {
display: flex;
gap: 12px;
} }
/** 新增按钮操作 */ .device-ledger-left {
const handleAdd = () => { width: 280px;
const row = { flex: 0 0 auto;
id: undefined,
warehouseId: defaultWarehouse.value?.id,
productId: undefined,
productUnitName: undefined, //
productBarCode: undefined, //
productPrice: undefined,
stockCount: undefined,
count: 1,
totalPrice: undefined,
remark: undefined
} }
formData.value.push(row)
.device-ledger-right {
flex: 1;
min-width: 0;
} }
/** 删除按钮操作 */ .device-ledger-detail-header {
const handleDelete = (index) => { display: flex;
formData.value.splice(index, 1) align-items: center;
justify-content: space-between;
margin-bottom: 12px;
} }
/** 处理仓库变更 */ .device-ledger-detail-title {
const onChangeWarehouse = (warehouseId, row) => { font-size: 14px;
// font-weight: 600;
setStockCount(row)
} }
/** 处理产品变更 */ .device-ledger-history-steps {
const onChangeProduct = (productId, row) => { padding: 8px 8px 0;
const product = productList.value.find((item) => item.id === productId)
if (product) {
row.productUnitName = product.unitId
row.productBarCode = product.code
} }
//
setStockCount(row) .device-ledger-history-title {
display: flex;
align-items: center;
gap: 10px;
font-size: 13px;
} }
/** 加载库存 */ .device-ledger-history-time {
const setStockCount = async (row) => { font-weight: 600;
if (!row.productId || !row.warehouseId) {
return
} }
const stock = await StockApi.getStock2(row.productId, row.warehouseId)
row.stockCount = stock ? stock.count : 0 .device-ledger-history-operator {
color: var(--el-text-color-secondary);
} }
/** 表单校验 */ .device-ledger-tab-toolbar {
const validate = () => { margin-bottom: 8px;
return formRef.value.validate() text-align: right;
} }
defineExpose({ validate })
/** 初始化 */ .device-ledger-history-items {
onMounted(async () => { display: flex;
// productList.value = await ProductApi.getComponentSimpleList() flex-direction: column;
productList.value = await MoldBrandApi.getMoldAllList() gap: 6px;
warehouseList.value = await WarehouseApi.getWarehouseSimpleList() margin-top: 8px;
defaultWarehouse.value = warehouseList.value.find((item) => item.defaultStatus)
//
if (formData.value.length === 0) {
handleAdd()
} }
})
</script> .device-ledger-history-item {
display: flex;
padding: 10px;
background: var(--el-fill-color-blank);
border: 1px solid var(--el-border-color-lighter);
border-radius: 8px;
flex-direction: column;
gap: 8px;
}
.device-ledger-history-item-head {
display: flex;
align-items: center;
gap: 10px;
}
.device-ledger-history-item-body {
display: flex;
flex-direction: column;
gap: 6px;
width: 100%;
}
.device-ledger-history-item-row {
display: flex;
gap: 10px;
}
.device-ledger-history-item-label {
width: 70px;
flex: 0 0 70px;
color: var(--el-text-color-secondary);
}
.device-ledger-history-item-value {
flex: 1;
color: var(--el-text-color-regular);
word-break: break-word;
}
.device-ledger-history-item-images {
display: flex;
flex-wrap: wrap;
gap: 8px;
margin-top: 4px;
}
.device-ledger-history-item-image {
width: 76px;
height: 76px;
overflow: hidden;
border-radius: 6px;
}
.device-ledger-history-image-error {
display: flex;
width: 100%;
height: 100%;
font-size: 12px;
color: var(--el-text-color-secondary);
background: var(--el-fill-color);
align-items: center;
justify-content: center;
}
.device-ledger-repair-collapse {
padding: 8px 8px 0;
}
.device-ledger-repair-title {
display: flex;
align-items: center;
justify-content: space-between;
width: 100%;
}
.device-ledger-repair-name {
font-weight: 600;
color: var(--el-text-color-primary);
}
.device-ledger-repair-meta {
font-size: 12px;
color: var(--el-text-color-secondary);
}
.device-ledger-history-item-text {
color: var(--el-text-color-regular);
}
</style>

@ -212,7 +212,7 @@
type="primary" type="primary"
@click="openForm('update', scope.row.id)" @click="openForm('update', scope.row.id)"
v-hasPermi="['erp:stock-out:update']" v-hasPermi="['erp:stock-out:update']"
:disabled="scope.row.status === 20" v-if="scope.row.status === 10"
> >
{{ t('MoldManagement.MoldGet.edit') }} {{ t('MoldManagement.MoldGet.edit') }}
</el-button> </el-button>
@ -225,7 +225,7 @@
> >
{{ t('MoldManagement.MoldGet.approve') }} {{ t('MoldManagement.MoldGet.approve') }}
</el-button> </el-button>
<el-button <!-- <el-button
link link
type="danger" type="danger"
@click="handleUpdateStatus(scope.row.id, 10)" @click="handleUpdateStatus(scope.row.id, 10)"
@ -233,12 +233,13 @@
v-else v-else
> >
{{ t('MoldManagement.MoldGet.unapprove') }} {{ t('MoldManagement.MoldGet.unapprove') }}
</el-button> </el-button> -->
<el-button <el-button
link link
type="danger" type="danger"
@click="handleDelete([scope.row.id])" @click="handleDelete([scope.row.id])"
v-hasPermi="['erp:stock-out:delete']" v-hasPermi="['erp:stock-out:delete']"
v-if="scope.row.status === 10"
> >
{{ t('MoldManagement.MoldGet.delete') }} {{ t('MoldManagement.MoldGet.delete') }}
</el-button> </el-button>

@ -134,8 +134,8 @@ const validateLowerMoldId = (_rule: any, value: any, callback: (error?: Error) =
const formRules = reactive({ const formRules = reactive({
operateType: [{ required: true, message: t('MoldManagement.MoldOperate.validatorOperateTypeRequired'), trigger: 'blur' }], operateType: [{ required: true, message: t('MoldManagement.MoldOperate.validatorOperateTypeRequired'), trigger: 'blur' }],
deviceId: [{ required: true, message: t('MoldManagement.MoldOperate.validatorDeviceRequired'), trigger: 'blur' }], deviceId: [{ required: true, message: t('MoldManagement.MoldOperate.validatorDeviceRequired'), trigger: 'blur' }],
moldId: [{ validator: validateMoldId, trigger: 'change' }], moldId: [{ required: true, validator: validateMoldId, trigger: 'change' }],
lowerMoldId: [{ validator: validateLowerMoldId, trigger: 'change' }], lowerMoldId: [{ required: true, validator: validateLowerMoldId, trigger: 'change' }],
}) })
const formRef = ref() // Ref const formRef = ref() // Ref

@ -37,52 +37,49 @@
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
<!-- <el-col :span="8"> <el-col :span="8">
<el-form-item label="客户" prop="customerId"> <el-form-item :label="t('MoldManagement.MoldReturn.inTimeSingle')" prop="inTime">
<el-date-picker
v-model="formData.inTime"
type="date"
value-format="x"
:placeholder="t('MoldManagement.MoldReturn.placeholderInTime')"
class="!w-1/1"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item :label="t('MoldManagement.MoldReturn.warehouse')" prop="warehouseId">
<el-select <el-select
v-model="formData.customerId" v-model="formData.warehouseId"
clearable clearable
filterable filterable
placeholder="请选择客户" :placeholder="t('MoldManagement.MoldReturn.placeholderWarehouse')"
class="!w-1/1" class="!w-240px"
> >
<el-option <el-option
v-for="item in customerList" v-for="item in warehouseList"
:key="item.id" :key="item.id"
:label="item.name" :label="item.name"
:value="item.id" :value="item.id"
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> --> </el-col>
<el-col :span="8"> <el-col :span="8">
<el-form-item :label="t('MoldManagement.MoldReturn.inTimeSingle')" prop="inTime"> <el-form-item :label="t('MoldManagement.MoldReturn.attachment')" prop="fileUrl">
<el-date-picker <UploadFile :is-show-tip="false" v-model="formData.fileUrl" :limit="1" />
v-model="formData.inTime"
type="date"
value-format="x"
:placeholder="t('MoldManagement.MoldReturn.placeholderInTime')"
class="!w-1/1"
/>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24">
<el-col :span="8">
<el-form-item :label="t('MoldManagement.MoldReturn.remarkSingle')" prop="remark"> <el-form-item :label="t('MoldManagement.MoldReturn.remarkSingle')" prop="remark">
<el-input <el-input
type="textarea" type="textarea"
v-model="formData.remark" v-model="formData.remark"
:rows="1"
:placeholder="t('MoldManagement.MoldReturn.placeholderRemark')" :placeholder="t('MoldManagement.MoldReturn.placeholderRemark')"
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8">
<el-form-item :label="t('MoldManagement.MoldReturn.attachment')" prop="fileUrl">
<UploadFile :is-show-tip="false" v-model="formData.fileUrl" :limit="1" />
</el-form-item>
</el-col>
</el-row> </el-row>
</el-form> </el-form>
<!-- 子表的表单 --> <!-- 子表的表单 -->
@ -105,13 +102,14 @@
import { StockInApi, StockInVO } from '@/api/erp/stock/in' import { StockInApi, StockInVO } from '@/api/erp/stock/in'
import StockInItemForm from './components/StockInItemForm.vue' import StockInItemForm from './components/StockInItemForm.vue'
import { CustomerApi, CustomerVO } from '@/api/erp/sale/customer' import { CustomerApi, CustomerVO } from '@/api/erp/sale/customer'
import {DICT_TYPE, getBoolDictOptions, getStrDictOptions} from "@/utils/dict"; import { WarehouseApi, WarehouseVO } from '@/api/erp/stock/warehouse'
/** ERP 其它出库单表单 */ /** ERP 其它出库单表单 */
defineOptions({ name: 'MoldReturnForm' }) defineOptions({ name: 'MoldReturnForm' })
const { t } = useI18n() // const { t } = useI18n() //
const message = useMessage() // const message = useMessage() //
const warehouseList = ref<WarehouseVO[]>([]) //
const dialogVisible = ref(false) // const dialogVisible = ref(false) //
const dialogTitle = ref('') // const dialogTitle = ref('') //
@ -124,7 +122,8 @@ const formData = ref({
remark: undefined, remark: undefined,
inType: undefined, inType: undefined,
fileUrl: '', fileUrl: '',
items: [] items: [],
warehouseId: undefined
}) })
const formRules = reactive({ const formRules = reactive({
inTime: [ inTime: [
@ -132,6 +131,9 @@ const formRules = reactive({
], ],
inType: [ inType: [
{ required: true, message: t('MoldManagement.MoldReturn.validatorInTypeRequired'), trigger: 'blur' } { required: true, message: t('MoldManagement.MoldReturn.validatorInTypeRequired'), trigger: 'blur' }
],
warehouseId: [
{ required: true, message: t('MoldManagement.MoldReturn.validatorInTypeRequired'), trigger: 'blur' }
] ]
}) })
const disabled = computed(() => formType.value === 'detail') const disabled = computed(() => formType.value === 'detail')
@ -164,6 +166,7 @@ const open = async (type: string, id?: number) => {
} }
// //
customerList.value = await CustomerApi.getCustomerSimpleList() customerList.value = await CustomerApi.getCustomerSimpleList()
warehouseList.value = await WarehouseApi.getWarehouseSimpleList()
} }
defineExpose({ open }) // open defineExpose({ open }) // open
@ -176,6 +179,15 @@ const submitForm = async () => {
// //
formLoading.value = true formLoading.value = true
try { try {
itemFormRef.value.selectedRows.forEach((item, index) => {
const i = {
warehouseId : formData.value.warehouseId,
productId : item.id,
productPrice: 0,
count: 1,
}
formData.value.items.push(i)
});
const data = formData.value as unknown as StockInVO const data = formData.value as unknown as StockInVO
if (formType.value === 'create') { if (formType.value === 'create') {
await StockInApi.createStockIn(data) await StockInApi.createStockIn(data)
@ -201,7 +213,8 @@ const resetForm = () => {
remark: undefined, remark: undefined,
fileUrl: undefined, fileUrl: undefined,
items: [], items: [],
inType: "模具入库" inType: "模具入库",
warehouseId: undefined
} }
formRef.value?.resetFields() formRef.value?.resetFields()
} }

@ -1,272 +1,304 @@
<template> <template>
<el-form <div class="device-ledger-layout">
ref="formRef" <div class="device-ledger-right">
:model="formData" <ContentWrap>
:rules="formRules" <el-form class="-mb-15px" :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px">
v-loading="formLoading" <el-form-item :label="t('MoldManagement.Mold.code')" prop="code">
label-width="0px" <el-input
:inline-message="true" v-model="queryParams.code" :placeholder="t('MoldManagement.Mold.code')" clearable @keyup.enter="handleQuery"
:disabled="disabled" class="!w-240px" />
>
<el-table :data="formData" show-summary :summary-method="getSummaries" class="-mt-10px">
<el-table-column :label="t('MoldManagement.MoldReturn.itemIndex')" type="index" align="center" width="60" />
<el-table-column :label="t('MoldManagement.MoldReturn.itemWarehouseName')" min-width="125">
<template #default="{ row, $index }">
<el-form-item
:prop="`${$index}.warehouseId`"
:rules="formRules.warehouseId"
class="mb-0px!"
>
<el-select
v-model="row.warehouseId"
clearable
filterable
:placeholder="t('MoldManagement.MoldReturn.placeholderWarehouse')"
@change="onChangeWarehouse($event, row)"
>
<el-option
v-for="item in warehouseList"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
</el-form-item> </el-form-item>
</template> <el-form-item :label="t('MoldManagement.Mold.name')" prop="name">
</el-table-column> <el-input
<el-table-column :label="t('MoldManagement.MoldReturn.itemMoldName')" min-width="180"> v-model="queryParams.name" :placeholder="t('MoldManagement.Mold.name')" clearable @keyup.enter="handleQuery"
<template #default="{ row, $index }"> class="!w-240px" />
<el-form-item :prop="`${$index}.productId`" :rules="formRules.productId" class="mb-0px!">
<el-select
v-model="row.productId"
clearable
filterable
@change="onChangeProduct($event, row)"
:placeholder="t('MoldManagement.MoldReturn.placeholderMold')"
>
<el-option
v-for="item in productList"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
</el-form-item>
</template>
</el-table-column>
<el-table-column :label="t('MoldManagement.MoldReturn.itemStockCount')" min-width="100">
<template #default="{ row }">
<el-form-item class="mb-0px!">
<el-input disabled v-model="row.stockCount" :formatter="erpCountInputFormatter" />
</el-form-item>
</template>
</el-table-column>
<el-table-column :label="t('MoldManagement.MoldReturn.itemMoldCode')" min-width="150">
<template #default="{ row }">
<el-form-item class="mb-0px!">
<el-input disabled v-model="row.productBarCode" />
</el-form-item>
</template>
</el-table-column>
<el-table-column :label="t('MoldManagement.MoldReturn.itemUnitName')" min-width="80">
<template #default="{ row }">
<el-form-item class="mb-0px!">
<el-input disabled v-model="row.productUnitName" />
</el-form-item> </el-form-item>
</template> <el-form-item>
</el-table-column> <el-button @click="handleQuery">
<el-table-column :label="t('MoldManagement.MoldReturn.itemCount')" prop="count" fixed="right" min-width="140"> <Icon icon="ep:search" class="mr-5px" /> {{ t('common.query') }}
<template #default="{ row, $index }"> </el-button>
<el-form-item :prop="`${$index}.count`" :rules="formRules.count" class="mb-0px!"> <el-button @click="resetQuery">
<el-input-number <Icon icon="ep:refresh" class="mr-5px" /> {{ t('common.reset') }}
v-model="row.count" </el-button>
controls-position="right"
:min="0"
:precision="0"
class="!w-100%"
/>
</el-form-item> </el-form-item>
</el-form>
</ContentWrap>
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true" @selection-change="handleSelectionChange" ref="tableRef" :row-key="row => row.id">
<el-table-column width="30" type="selection" />
<el-table-column :label="t('MoldManagement.Mold.code')" align="center" prop="code" />
<el-table-column :label="t('MoldManagement.Mold.name')" align="left" prop="name" />
<el-table-column :label="t('MoldManagement.Mold.useTime')" align="center" prop="useTime" />
<el-table-column :label="t('MoldManagement.Mold.status')" align="center" prop="status">
<template #default="scope">
<dict-tag :type="DICT_TYPE.ERP_MOLD_STATUS" :value="scope.row.status" />
</template> </template>
</el-table-column> </el-table-column>
<!-- <el-table-column label="单价" fixed="right" min-width="120"> <el-table-column :label="t('MoldManagement.Mold.machineName')" align="center" prop="machineName" />
<template #default="{ row, $index }"> <el-table-column :label="t('MoldManagement.Mold.remark')" align="center" prop="remark" />
<el-form-item :prop="`${$index}.productPrice`" class="mb-0px!"> <el-table-column :label="t('MoldManagement.Mold.isEnable')" align="center" prop="isEnable">
<el-input-number <template #default="scope">
v-model="row.productPrice" <dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="scope.row.isEnable" />
controls-position="right"
:min="0.01"
:precision="2"
class="!w-100%"
/>
</el-form-item>
</template>
</el-table-column> -->
<!-- <el-table-column label="合计金额" prop="totalPrice" fixed="right" min-width="100">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.totalPrice`" class="mb-0px!">
<el-input disabled v-model="row.totalPrice" :formatter="erpPriceInputFormatter" />
</el-form-item>
</template>
</el-table-column> -->
<el-table-column :label="t('MoldManagement.MoldReturn.itemRemark')" fixed="right" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.remark`" class="mb-0px!">
<el-input v-model="row.remark" :placeholder="t('MoldManagement.MoldReturn.placeholderRemark')" />
</el-form-item>
</template>
</el-table-column>
<el-table-column align="center" fixed="right" :label="t('MoldManagement.MoldReturn.itemOperate')" width="60">
<template #default="{ $index }">
<el-button type="danger" @click="handleDelete($index)" link>
<Icon icon="ep:delete" />
</el-button>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column :label="t('MoldManagement.Mold.createTime')" align="center" prop="createTime" :formatter="dateFormatter" width="180px" />
</el-table> </el-table>
</el-form> <Pagination
<el-row justify="center" class="mt-3" v-if="!disabled"> :total="total" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize"
<el-button @click="handleAdd" round>+ {{ t('MoldManagement.MoldReturn.itemAddButton') }}</el-button> @pagination="getList" />
</el-row> </ContentWrap>
</div>
</div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ProductApi, ProductVO } from '@/api/erp/product/product' import { DICT_TYPE } from '@/utils/dict'
import { WarehouseApi, WarehouseVO } from '@/api/erp/stock/warehouse' import { dateFormatter } from '@/utils/formatTime'
import { StockApi } from '@/api/erp/stock/stock'
import { MoldBrandApi, MoldVO } from '@/api/erp/mold' import { MoldBrandApi, MoldVO } from '@/api/erp/mold'
import { import { useDictStoreWithOut } from '@/store/modules/dict'
erpCountInputFormatter,
erpPriceInputFormatter,
erpPriceMultiply, const message = useMessage() //
getSumValue const { t } = useI18n() //
} from '@/utils'
const loading = ref(false) //
const props = defineProps<{ const list = ref<MoldVO[]>([]) //
items: undefined const total = ref(0) //
disabled: false const queryParams = reactive({
}>() pageNo: 1,
const formLoading = ref(false) // pageSize: 10,
const formData = ref([]) code: undefined,
const { t } = useI18n() name: undefined,
const formRules = reactive({ brand: undefined,
inId: [{ required: true, message: t('MoldManagement.MoldReturn.validatorItemInIdRequired'), trigger: 'blur' }], })
warehouseId: [ const queryFormRef = ref() //
{ required: true, message: t('MoldManagement.MoldReturn.validatorItemWarehouseRequired'), trigger: 'blur' }
],
productId: [{ required: true, message: t('MoldManagement.MoldReturn.validatorItemMoldRequired'), trigger: 'blur' }],
count: [{ required: true, message: t('MoldManagement.MoldReturn.validatorItemCountRequired'), trigger: 'blur' }] const dictStore = useDictStoreWithOut()
const dictReady = ref(false)
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await MoldBrandApi.getMoldPage({
pageNo: queryParams.pageNo,
pageSize: queryParams.pageSize,
code: queryParams.code,
name: queryParams.name,
brandId: queryParams.brand,
statuss: [3,0]
}) })
const formRef = ref([]) // Ref list.value = data.list
const productList = ref<MoldVO[]>([]) // total.value = data.total
const warehouseList = ref<WarehouseVO[]>([]) // } finally {
const defaultWarehouse = ref<WarehouseVO>(undefined) // loading.value = false
}
/** 初始化设置出库项 */ }
watch(
() => props.items, /** 搜索按钮操作 */
async (val) => { const handleQuery = () => {
formData.value = val queryParams.pageNo = 1
}, getList()
{ immediate: true } }
)
/** 重置按钮操作 */
/** 监听合同产品变化,计算合同产品总价 */ const resetQuery = () => {
watch( queryFormRef.value.resetFields()
() => formData.value, handleQuery()
(val) => { }
if (!val || val.length === 0) {
return const tableRef = ref()
} const selectedRows = ref<any[]>([])
//
val.forEach((item) => { watch(list, async () => {
item.totalPrice = erpPriceMultiply(item.productPrice, item.count) await nextTick()
restoreSelection()
})
const restoreSelection = () => {
if (!tableRef.value || selectedRows.value.length === 0) return
tableRef.value.clearSelection?.()
selectedRows.value.forEach(selectedRow => {
const rowInTable = list.value.find(row => row.id === selectedRow.id)
if (rowInTable) {
tableRef.value.toggleRowSelection?.(rowInTable, true)
}
}) })
},
{ deep: true }
)
/** 合计 */
const getSummaries = (param: SummaryMethodProps) => {
const { columns, data } = param
const sums: string[] = []
columns.forEach((column, index) => {
if (index === 0) {
sums[index] = t('MoldManagement.MoldReturn.sumLabel')
return
}
if (['count', 'totalPrice'].includes(column.property)) {
const sum = getSumValue(data.map((item) => Number(item[column.property])))
sums[index] =
String(Math.trunc(Number(column.property === 'count' ? erpCountInputFormatter(sum) : erpPriceInputFormatter(sum))))
} else {
sums[index] = ''
} }
const handleSelectionChange = (rows: any[]) => {
selectedRows.value = rows
}
const validate = async (): Promise<boolean> => {
if (!tableRef.value) return false
try {
await tableRef.value.validate()
return true
} catch (error) {
return false
}
}
defineExpose({ validate,selectedRows: selectedRows })
/** 初始化 **/
onMounted(async () => {
await dictStore.setDictMap()
dictReady.value = true
getList()
}) })
return sums
</script>
<style scoped>
.device-ledger-layout {
display: flex;
gap: 12px;
} }
/** 新增按钮操作 */ .device-ledger-left {
const handleAdd = () => { width: 280px;
const row = { flex: 0 0 auto;
id: undefined,
warehouseId: defaultWarehouse.value?.id,
productId: undefined,
productUnitName: undefined, //
productBarCode: undefined, //
productPrice: undefined,
stockCount: undefined,
count: 1,
totalPrice: undefined,
remark: undefined
} }
formData.value.push(row)
.device-ledger-right {
flex: 1;
min-width: 0;
} }
/** 删除按钮操作 */ .device-ledger-detail-header {
const handleDelete = (index) => { display: flex;
formData.value.splice(index, 1) align-items: center;
justify-content: space-between;
margin-bottom: 12px;
} }
/** 处理仓库变更 */ .device-ledger-detail-title {
const onChangeWarehouse = (warehouseId, row) => { font-size: 14px;
// font-weight: 600;
setStockCount(row)
} }
/** 处理产品变更 */ .device-ledger-history-steps {
const onChangeProduct = (productId, row) => { padding: 8px 8px 0;
const product = productList.value.find((item) => item.id === productId)
if (product) {
row.productUnitName = product.unitId
row.productBarCode = product.code
} }
//
setStockCount(row) .device-ledger-history-title {
display: flex;
align-items: center;
gap: 10px;
font-size: 13px;
} }
/** 加载库存 */ .device-ledger-history-time {
const setStockCount = async (row) => { font-weight: 600;
if (!row.productId || !row.warehouseId) {
return
} }
const stock = await StockApi.getStock2(row.productId, row.warehouseId)
row.stockCount = stock ? stock.count : 0 .device-ledger-history-operator {
color: var(--el-text-color-secondary);
} }
/** 表单校验 */ .device-ledger-tab-toolbar {
const validate = () => { margin-bottom: 8px;
return formRef.value.validate() text-align: right;
} }
defineExpose({ validate })
/** 初始化 */ .device-ledger-history-items {
onMounted(async () => { display: flex;
// productList.value = await ProductApi.getComponentSimpleList() flex-direction: column;
productList.value = await MoldBrandApi.getMoldAllList() gap: 6px;
warehouseList.value = await WarehouseApi.getWarehouseSimpleList() margin-top: 8px;
defaultWarehouse.value = warehouseList.value.find((item) => item.defaultStatus)
//
if (formData.value.length === 0) {
handleAdd()
} }
})
</script> .device-ledger-history-item {
display: flex;
padding: 10px;
background: var(--el-fill-color-blank);
border: 1px solid var(--el-border-color-lighter);
border-radius: 8px;
flex-direction: column;
gap: 8px;
}
.device-ledger-history-item-head {
display: flex;
align-items: center;
gap: 10px;
}
.device-ledger-history-item-body {
display: flex;
flex-direction: column;
gap: 6px;
width: 100%;
}
.device-ledger-history-item-row {
display: flex;
gap: 10px;
}
.device-ledger-history-item-label {
width: 70px;
flex: 0 0 70px;
color: var(--el-text-color-secondary);
}
.device-ledger-history-item-value {
flex: 1;
color: var(--el-text-color-regular);
word-break: break-word;
}
.device-ledger-history-item-images {
display: flex;
flex-wrap: wrap;
gap: 8px;
margin-top: 4px;
}
.device-ledger-history-item-image {
width: 76px;
height: 76px;
overflow: hidden;
border-radius: 6px;
}
.device-ledger-history-image-error {
display: flex;
width: 100%;
height: 100%;
font-size: 12px;
color: var(--el-text-color-secondary);
background: var(--el-fill-color);
align-items: center;
justify-content: center;
}
.device-ledger-repair-collapse {
padding: 8px 8px 0;
}
.device-ledger-repair-title {
display: flex;
align-items: center;
justify-content: space-between;
width: 100%;
}
.device-ledger-repair-name {
font-weight: 600;
color: var(--el-text-color-primary);
}
.device-ledger-repair-meta {
font-size: 12px;
color: var(--el-text-color-secondary);
}
.device-ledger-history-item-text {
color: var(--el-text-color-regular);
}
</style>

@ -1,5 +1,4 @@
<template> <template>
<ContentWrap> <ContentWrap>
<!-- 搜索工作栏 --> <!-- 搜索工作栏 -->
<el-form <el-form
@ -7,7 +6,7 @@
:model="queryParams" :model="queryParams"
ref="queryFormRef" ref="queryFormRef"
:inline="true" :inline="true"
label-width="110px" label-width="68px"
> >
<el-form-item :label="t('MoldManagement.MoldReturn.no')" prop="no"> <el-form-item :label="t('MoldManagement.MoldReturn.no')" prop="no">
<el-input <el-input
@ -225,15 +224,14 @@
> >
{{ t('MoldManagement.MoldReturn.approve') }} {{ t('MoldManagement.MoldReturn.approve') }}
</el-button> </el-button>
<el-button <!-- <el-button
link link
type="danger" type="danger"
@click="handleUpdateStatus(scope.row.id, 10)" @click="handleUpdateStatus(scope.row.id, 10)"
v-hasPermi="['erp:stock-out:update-status']" v-hasPermi="['erp:stock-out:update-status']"
v-else
> >
{{ t('MoldManagement.MoldReturn.unapprove') }} {{ t('MoldManagement.MoldReturn.unapprove') }}
</el-button> </el-button> -->
<el-button <el-button
link link
type="danger" type="danger"

@ -105,6 +105,16 @@
:value="item.id" :value="item.id"
/> />
</el-select> </el-select>
</el-form-item>
<el-form-item :label="t('EquipmentManagement.EquipmentLedger.dvName')" prop="dvId" v-if="formData.orgClass == 'workplace'">
<el-select v-model="formData.dvId" filterable :placeholder="t('EquipmentManagement.EquipmentLedger.dvId')">
<el-option
v-for="item in dvList"
:key="item.id"
:label="item.deviceName"
:value="item.id"
/>
</el-select>
</el-form-item> </el-form-item>
<!-- <el-form-item label="组织状态" prop="status"> <!-- <el-form-item label="组织状态" prop="status">
<el-radio-group v-model="formData.status"> <el-radio-group v-model="formData.status">
@ -130,6 +140,7 @@ import { OrganizationApi, OrganizationVO } from '@/api/mes/organization'
import { defaultProps, handleTree } from '@/utils/tree' import { defaultProps, handleTree } from '@/utils/tree'
import {MachineComponentApi} from "@/api/mes/machine"; import {MachineComponentApi} from "@/api/mes/machine";
import {DeviceLedgerApi, DeviceLedgerVO} from "@/api/mes/deviceledger"; import {DeviceLedgerApi, DeviceLedgerVO} from "@/api/mes/deviceledger";
import { DeviceApi,DeviceVO } from '@/api/iot/device'
/** 产线工位 表单 */ /** 产线工位 表单 */
defineOptions({ name: 'OrganizationForm' }) defineOptions({ name: 'OrganizationForm' })
@ -137,7 +148,7 @@ defineOptions({ name: 'OrganizationForm' })
const { t } = useI18n() // const { t } = useI18n() //
const message = useMessage() // const message = useMessage() //
// const deviceList = ref<DeviceVO[]>([]) // const dvList = ref<DeviceVO[]>([]) //
const deviceList = ref<DeviceLedgerVO[]>([]) // const deviceList = ref<DeviceLedgerVO[]>([]) //
const dialogVisible = ref(false) // const dialogVisible = ref(false) //
const dialogTitle = ref('') // const dialogTitle = ref('') //
@ -157,7 +168,8 @@ const formData = ref({
status: undefined, status: undefined,
orgClass: undefined, orgClass: undefined,
orgType: undefined, orgType: undefined,
isCode: undefined isCode: undefined,
dvId: undefined
}) })
const formRules = reactive({ const formRules = reactive({
name: [{ required: true, message: t('FactoryModeling.FactoryStructure.validatorNameRequired'), trigger: 'blur' }], name: [{ required: true, message: t('FactoryModeling.FactoryStructure.validatorNameRequired'), trigger: 'blur' }],
@ -182,8 +194,17 @@ const open = async (type: string, id?: number) => {
} }
} }
await getOrganizationTree() await getOrganizationTree()
await getMachineComponentTree() if (type == 'create' || typeof formData.value.machineId != 'number') {
deviceList.value = await DeviceLedgerApi.getDeviceLedgerListByNoUsed()
} else {
deviceList.value = await DeviceLedgerApi.getDeviceLedgerList2ByNoUsed(formData.value.machineId)
}
//await getMachineComponentTree()
if (type == 'create' || typeof formData.value.dvId != 'number') {
dvList.value = await DeviceApi.getDeviceListByNoUsed()
} else {
dvList.value = await DeviceApi.getDeviceList2ByNoUsed(formData.value.dvId)
}
} }
defineExpose({ open }) // open defineExpose({ open }) // open
@ -255,6 +276,6 @@ const getMachineComponentTree = async () => {
/** 初始化 **/ /** 初始化 **/
onMounted(async () => { onMounted(async () => {
//console.log("ssss") //console.log("ssss")
deviceList.value = await DeviceLedgerApi.getDeviceLedgerList() //deviceList.value = await DeviceLedgerApi.getDeviceLedgerListByNoUsed()
}) })
</script> </script>

Loading…
Cancel
Save