# Conflicts:
#	src/views/erp/stock/in/StockInForm.vue
#	src/views/erp/stock/in/index.vue
#	src/views/erp/stock/out/index.vue
#	src/views/erp/stock/warehouse/index.vue
main
黄伟杰 1 day ago
commit d2aee54a94

@ -9,7 +9,7 @@ VITE_DEV=true
# VITE_BASE_URL='https://besure.ngsk.tech:7001' # VITE_BASE_URL='https://besure.ngsk.tech:7001'
# 本地联调 # 本地联调
# VITE_BASE_URL='http://192.168.5.107:48081' # VITE_BASE_URL='http://192.168.5.107:48081'
VITE_BASE_URL='http://192.168.5.131:48081' VITE_BASE_URL='http://localhost:48081'
# 文件上传类型server - 后端上传, client - 前端直连上传,仅支持 S3 服务 # 文件上传类型server - 后端上传, client - 前端直连上传,仅支持 S3 服务

@ -14,6 +14,14 @@ export interface MoldBrandVO {
remark: string // 备注 remark: string // 备注
isEnable: boolean // 是否启用 isEnable: boolean // 是否启用
} }
export interface MoldBrandTreeVO extends MoldBrandVO {
parentId?: number
parentChain?: string
createTime?: string
children?: MoldBrandTreeVO[]
leaf?: boolean
}
// 模具 VO // 模具 VO
export interface MoldVO { export interface MoldVO {
id: number // ID id: number // ID
@ -45,6 +53,11 @@ export const MoldBrandApi = {
return await request.get({ url: `/erp/mold-brand/get?id=` + id }) return await request.get({ url: `/erp/mold-brand/get?id=` + id })
}, },
getMoldBrandTree: async () => {
return await request.get({ url: `/erp/mold-brand/tree` })
},
// 新增模具型号 // 新增模具型号
createMoldBrand: async (data: MoldBrandVO) => { createMoldBrand: async (data: MoldBrandVO) => {
return await request.post({ url: `/erp/mold-brand/create`, data }) return await request.post({ url: `/erp/mold-brand/create`, data })

@ -13,7 +13,9 @@ export const CriticalComponentApi = {
getCriticalComponentPage: async (params: any) => { getCriticalComponentPage: async (params: any) => {
return await request.get({ url: `/mes/critical-component/page`, params }) return await request.get({ url: `/mes/critical-component/page`, params })
}, },
getCriticalComponentList: async () => {
return await request.get({ url: `/mes/critical-component/list`, })
},
createCriticalComponent: async (data: Partial<CriticalComponentVO>) => { createCriticalComponent: async (data: Partial<CriticalComponentVO>) => {
return await request.post({ url: `/mes/critical-component/create`, data }) return await request.post({ url: `/mes/critical-component/create`, data })
}, },

@ -14,6 +14,8 @@ export interface DvSubjectVO {
judgmentCriteria: string // 判定基准 judgmentCriteria: string // 判定基准
creator?: string // 创建人 creator?: string // 创建人
createTime?: string | number | Date // 创建时间 createTime?: string | number | Date // 创建时间
upperVal?: number
lowerVal?: number
} }
// 维保项目 API // 维保项目 API
@ -22,6 +24,10 @@ export const DvSubjectApi = {
getDvSubjectPage: async (params: any) => { getDvSubjectPage: async (params: any) => {
return await request.get({ url: `/mes/dv-subject/page`, params }) return await request.get({ url: `/mes/dv-subject/page`, params })
}, },
// 查询维保项目列表
getDvSubjectList: async () => {
return await request.get({ url: `/mes/dv-subject/list` })
},
// 查询维保项目详情 // 查询维保项目详情
getDvSubject: async (id: number) => { getDvSubject: async (id: number) => {

@ -81,7 +81,7 @@ const setMenuTheme = (color: string) => {
// //
leftMenuTextActiveColor: isDarkColor ? '#fff' : 'var(--el-color-primary)', leftMenuTextActiveColor: isDarkColor ? '#fff' : 'var(--el-color-primary)',
// logo // logo
logoTitleTextColor: isDarkColor ? '#fff' : 'inherit', logoTitleTextColor: isDarkColor ? '#fff' : '#409EFF',
// logo // logo
logoBorderColor: isDarkColor ? color : '#eee' logoBorderColor: isDarkColor ? color : '#eee'
} }

@ -56,7 +56,8 @@ export default {
operate: 'Operation', operate: 'Operation',
copy: 'Copy', copy: 'Copy',
copySuccess: 'Copy Success', copySuccess: 'Copy Success',
copyError: 'Copy Error' copyError: 'Copy Error',
code:'Auto-generate on Save'
}, },
ErpStock: { ErpStock: {
Warehouse: { Warehouse: {
@ -1007,6 +1008,8 @@ export default {
inspectionMethod: 'Inspection Method', inspectionMethod: 'Inspection Method',
valueType: 'Value Type', valueType: 'Value Type',
judgmentCriteria: 'Judgment Criteria', judgmentCriteria: 'Judgment Criteria',
upperVal: 'Upper Value',
lowerVal: 'Lower Value',
creatorName: 'Creator', creatorName: 'Creator',
createTime: 'Create Time', createTime: 'Create Time',
operate: 'Operate', operate: 'Operate',
@ -1022,7 +1025,9 @@ export default {
placeholderProjectCode: 'Please input project code', placeholderProjectCode: 'Please input project code',
placeholderProjectName: 'Please input project name', placeholderProjectName: 'Please input project name',
placeholderInspectionMethod: 'Please select inspection method', placeholderInspectionMethod: 'Please select inspection method',
placeholderValueType: 'Please select value type' placeholderValueType: 'Please select value type',
placeholderUpperVal: 'Please input upper value',
placeholderLowerVal: 'Please input lower value',
}, },
// Plan Maintenance // Plan Maintenance
PlanMaintenance: { PlanMaintenance: {

@ -1000,6 +1000,8 @@ export default {
inspectionMethod: '检验方式', inspectionMethod: '检验方式',
valueType: '值类型', valueType: '值类型',
judgmentCriteria: '判定基准', judgmentCriteria: '判定基准',
upperVal: '上限值',
lowerVal: '下限值',
creatorName: '创建人', creatorName: '创建人',
createTime: '创建时间', createTime: '创建时间',
operate: '操作', operate: '操作',
@ -1015,7 +1017,9 @@ export default {
placeholderProjectCode: '请输入项目编码', placeholderProjectCode: '请输入项目编码',
placeholderProjectName: '请输入项目名称', placeholderProjectName: '请输入项目名称',
placeholderInspectionMethod: '请选择检验方式', placeholderInspectionMethod: '请选择检验方式',
placeholderValueType: '请选择值类型' placeholderValueType: '请选择值类型',
placeholderUpperVal: '请输入上限值',
placeholderLowerVal: '请输入下限值',
}, },
// 方案维护 // 方案维护

@ -0,0 +1,422 @@
<template>
<div class="device-ledger-layout">
<ContentWrap class="device-ledger-left">
<el-tree
v-loading="typeTreeLoading" :data="brandTreeData" node-key="id" highlight-current :props="typeTreeProps"
:default-expanded-keys="typeTreeExpandedKeys" :expand-on-click-node="false" @node-click="handleTypeNodeClick" />
</ContentWrap>
<div class="device-ledger-right">
<ContentWrap>
<el-form class="-mb-15px" :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px">
<el-form-item :label="t('MoldManagement.Mold.code')" prop="code">
<el-input
v-model="queryParams.name" :placeholder="t('MoldManagement.Mold.code')" clearable @keyup.enter="handleQuery"
class="!w-240px" />
</el-form-item>
<el-form-item :label="t('MoldManagement.Mold.name')" prop="name">
<el-input
v-model="queryParams.name" :placeholder="t('MoldManagement.Mold.name')" clearable @keyup.enter="handleQuery"
class="!w-240px" />
</el-form-item>
<el-form-item>
<el-button @click="handleQuery">
<Icon icon="ep:search" class="mr-5px" /> {{ t('common.query') }}
</el-button>
<el-button @click="resetQuery">
<Icon icon="ep:refresh" class="mr-5px" /> {{ t('common.reset') }}
</el-button>
<el-button type="primary" plain @click="openForm('create')" v-hasPermi="['erp:mold-brand:create']">
<Icon icon="ep:plus" class="mr-5px" /> {{ t('action.add') }}
</el-button>
<el-button
type="success" plain @click="handleExport" :loading="exportLoading"
v-hasPermi="['erp:mold-brand:export']">
<Icon icon="ep:download" class="mr-5px" /> {{ t('action.export') }}
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<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>
</el-table-column>
<el-table-column :label="t('MoldManagement.Mold.machineName')" align="center" prop="machineName" />
<el-table-column :label="t('MoldManagement.Mold.remark')" align="center" prop="remark" />
<el-table-column :label="t('MoldManagement.Mold.isEnable')" align="center" prop="isEnable">
<template #default="scope">
<dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="scope.row.isEnable" />
</template>
</el-table-column>
<el-table-column :label="t('MoldManagement.Mold.createTime')" align="center" prop="createTime" :formatter="dateFormatter" width="180px" />
<el-table-column :label="t('MoldManagement.Mold.operate')" align="center" fixed="right" width="200px">
<template #default="scope">
<el-button link @click="openDetail(scope.row.id)">
{{ t('MoldManagement.Mold.detail') }}
</el-button>
<el-button
link
type="primary"
@click="openForm('update', scope.row.id)"
v-hasPermi="['erp:mold-brand:update']"
>
{{ t('action.edit') }}
</el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['erp:mold-brand:delete']"
>
{{ t('action.del') }}
</el-button>
</template>
</el-table-column>
</el-table>
<Pagination
:total="total" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize"
@pagination="getList" />
</ContentWrap>
</div>
</div>
<!-- 表单弹窗添加/修改 -->
<!-- 表单弹窗添加/修改 -->
<MoldForm ref="formRef" @success="getList" />
<!-- 表单弹窗添加/修改 -->
<MoldRecordForm ref="recordFormRef" @success="getList" />
</template>
<script setup lang="ts">
import { DICT_TYPE } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import { DeviceLedgerApi } from '@/api/mes/deviceledger'
import { DeviceTypeApi, DeviceTypeTreeVO } from '@/api/mes/devicetype'
import { MoldBrandApi, MoldBrandTreeVO,MoldVO } from '@/api/erp/mold'
import { useDictStoreWithOut } from '@/store/modules/dict'
import MoldForm from '@/views/erp/mold/components/MoldForm.vue'
import MoldRecordForm from "@/views/erp/mold/components/MoldRecordForm.vue";
/** 设备类型 列表 */
defineOptions({ name: 'DeviceLedger' })
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(false) //
const list = ref<MoldVO[]>([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
code: undefined,
name: undefined,
brand: undefined,
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
const tableRef = ref()
const selectedIds = ref<number[]>([])
const dictStore = useDictStoreWithOut()
const dictReady = ref(false)
const typeTreeLoading = ref(false)
const typeTreeData = ref<DeviceTypeTreeVO[]>([])
const brandTreeData = ref<MoldBrandTreeVO[]>([])
const typeTreeProps = { label: 'name', children: 'children' }
const typeTreeExpandedKeys = ref<number[]>([0])
const deviceTypeNameMap = ref<Record<number, string>>({})
const buildDeviceTypeNameMap = (nodes: DeviceTypeTreeVO[]) => {
const map: Record<number, string> = {}
const stack = [...nodes]
while (stack.length) {
const node = stack.pop()!
if (typeof node.id === 'number') map[node.id] = node.name
if (Array.isArray(node.children) && node.children.length) stack.push(...node.children)
}
deviceTypeNameMap.value = map
}
const getTypeTree = async () => {
typeTreeLoading.value = true
try {
const data = await DeviceTypeApi.getDeviceTypeTree({ pageNo: 1, pageSize: 10 })
const dd = await MoldBrandApi.getMoldBrandTree()
console.log(dd)
brandTreeData.value = [{ id: 0, code: '', name: '全部', remark: '', sort: 0, children: dd } as any]
console.log(brandTreeData.value)
const treeChildren = JSON.parse(JSON.stringify(data ?? []))
typeTreeData.value = [{ id: 0, code: '', name: '全部', remark: '', sort: 0, children: treeChildren } as any]
buildDeviceTypeNameMap(treeChildren)
typeTreeExpandedKeys.value = [0]
} finally {
typeTreeLoading.value = false
}
}
const handleTypeNodeClick = (node: any) => {
const id = node?.id
queryParams.brand = id === 0 ? undefined : id
queryParams.pageNo = 1
getList()
}
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await MoldBrandApi.getMoldPage({
pageNo: queryParams.pageNo,
pageSize: queryParams.pageSize,
deviceCode: queryParams.code,
deviceName: queryParams.name,
brandId: queryParams.brand
})
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {
if (!queryParams.brand) {
message.error('请选择一个模具型号')
return
}
formRef.value.open(type, id, queryParams.brand)
}
/** 删除按钮操作 */
const buildIdsParam = (ids: number | number[]) => {
return Array.isArray(ids) ? ids.join(',') : String(ids)
}
const handleDelete = async (ids: number | number[]) => {
try {
//
await message.delConfirm()
//
const idsParam = buildIdsParam(ids)
await DeviceLedgerApi.deleteDeviceLedger(idsParam)
message.success(t('common.delSuccess'))
selectedIds.value = []
tableRef.value?.clearSelection?.()
//
await getList()
} catch { }
}
/** 导出按钮操作 */
const handleExport = async () => {
if (!queryParams.brand) {
message.error('请选择一个模具型号')
return
}
try {
await message.exportConfirm()
exportLoading.value = true
const data = await MoldBrandApi.exportMold({
...queryParams,
brandId: queryParams.brand
})
download.excel(data, '模具.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 **/
onMounted(async () => {
await dictStore.setDictMap()
dictReady.value = true
getTypeTree()
getList()
})
const { push } = useRouter()
const openDetail = (id: number) => {
push({ name: 'ErpMoldDetail', params: { id } })
}
</script>
<style scoped>
.device-ledger-layout {
display: flex;
gap: 12px;
}
.device-ledger-left {
width: 280px;
flex: 0 0 auto;
}
.device-ledger-right {
flex: 1;
min-width: 0;
}
.device-ledger-detail-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 12px;
}
.device-ledger-detail-title {
font-size: 14px;
font-weight: 600;
}
.device-ledger-history-steps {
padding: 8px 8px 0;
}
.device-ledger-history-title {
display: flex;
align-items: center;
gap: 10px;
font-size: 13px;
}
.device-ledger-history-time {
font-weight: 600;
}
.device-ledger-history-operator {
color: var(--el-text-color-secondary);
}
.device-ledger-tab-toolbar {
margin-bottom: 8px;
text-align: right;
}
.device-ledger-history-items {
display: flex;
flex-direction: column;
gap: 6px;
margin-top: 8px;
}
.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>

@ -8,72 +8,94 @@
v-loading="formLoading" v-loading="formLoading"
:disabled="disabled" :disabled="disabled"
> >
<el-form-item prop="code">
<template #label>
<span>
入库单号
<el-tooltip content="入库单号" placement="top">
<Icon icon="ep:question-filled" />
</el-tooltip>
</span>
</template>
<el-row :gutter="10" style="width: 100%;">
<el-col :xs="24" :sm="18" :md="16" :lg="14" :xl="12">
<el-input
:disabled="formData.isCode == true || formType === 'update'"
v-model="formData.no"
placeholder="编码保存后自动生成"
/>
</el-col>
<el-col :xs="24" :sm="6" :md="4" :lg="3" :xl="2">
<div>
<el-switch
v-model="formData.isCode"
:disabled="formType === 'update'"
/>
</div>
</el-col>
</el-row>
</el-form-item>
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="8"> <el-col :span="8">
<el-form-item :label="t('ErpStock.In.no')" prop="no"> <el-form-item label="入库类型" prop="inType">
<el-input disabled v-model="formData.no" :placeholder="t('ErpStock.In.placeholderNoAuto')" />
</el-form-item>
</el-col>
<!-- <el-col :span="8">
<el-form-item :label="t('ErpStock.In.supplier')" prop="supplierId">
<el-select <el-select
v-model="formData.supplierId" v-model="formData.inType"
clearable clearable
filterable filterable
:placeholder="t('ErpStock.In.placeholderSupplier')" placeholder="请选择入库类型"
class="!w-1/1" class="!w-1/1"
> >
<el-option <el-option
v-for="item in supplierList" v-for="item in options"
:key="item.id" :key="item.value"
:label="item.name" :label="item.label"
:value="item.id" :value="item.value"
:disabled="item.disabled"
/> />
</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('ErpStock.In.inTime')" prop="inTime"> <el-form-item label="入库时间" prop="inTime">
<el-date-picker <el-date-picker
v-model="formData.inTime" v-model="formData.inTime"
type="date" type="date"
value-format="x" value-format="x"
:placeholder="t('ErpStock.In.placeholderInTime')" placeholder="选择入库时间"
class="!w-1/1" class="!w-1/1"
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <!-- <el-col :span="8">
<el-form-item :label="t('ErpStock.In.inType')" prop="inType"> <el-form-item label="供应商" prop="supplierId">
<el-select <el-select
v-model="formData.inType" v-model="formData.supplierId"
clearable clearable
filterable filterable
:placeholder="t('ErpStock.In.placeholderInType')" placeholder="请选择供应商"
class="!w-1/1" class="!w-1/1"
> >
<el-option <el-option
v-for="item in options" v-for="item in supplierList"
:key="item.value" :key="item.id"
:label="item.label" :label="item.name"
:value="item.value" :value="item.id"
:disabled="item.disabled"
/> />
</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('ErpStock.In.remark')" prop="remark"> <el-form-item label="备注" prop="remark">
<el-input <el-input
type="textarea" type="textarea"
v-model="formData.remark" v-model="formData.remark"
:rows="1" :rows="1"
:placeholder="t('ErpStock.In.placeholderRemark')" placeholder="请输入备注"
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
<el-form-item :label="t('ErpStock.Out.file')" prop="fileUrl"> <el-form-item label="附件" 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>
@ -82,16 +104,16 @@
<!-- 子表的表单 --> <!-- 子表的表单 -->
<ContentWrap> <ContentWrap>
<el-tabs v-model="subTabsName" class="-mt-15px -mb-10px"> <el-tabs v-model="subTabsName" class="-mt-15px -mb-10px">
<el-tab-pane :label="t('ErpStock.In.list')" name="item"> <el-tab-pane label="入库产品清单" name="item">
<StockInItemForm ref="itemFormRef" :items="formData.items" :disabled="disabled" /> <StockInItemForm ref="itemFormRef" :items="formData.items" :disabled="disabled" />
</el-tab-pane> </el-tab-pane>
</el-tabs> </el-tabs>
</ContentWrap> </ContentWrap>
<template #footer> <template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading" v-if="!disabled"> <el-button @click="submitForm" type="primary" :disabled="formLoading" v-if="!disabled">
{{ t('common.ok') }}
</el-button> </el-button>
<el-button @click="dialogVisible = false">{{ t('common.cancel') }}</el-button> <el-button @click="dialogVisible = false"> </el-button>
</template> </template>
</Dialog> </Dialog>
</template> </template>
@ -122,8 +144,8 @@ const formData = ref({
no: undefined no: undefined
}) })
const formRules = reactive({ const formRules = reactive({
inTime: [{ required: true, message: t('ErpStock.In.validatorInTimeRequired'), trigger: 'blur' }], inTime: [{ required: true, message: '入库时间不能为空', trigger: 'blur' }],
inType: [{ required: true, message: t('ErpStock.In.validatorInTypeRequired'), trigger: 'blur' }] inType: [{ required: true, message: '入库类型不能为空', trigger: 'blur' }]
}) })
const disabled = computed(() => formType.value === 'detail') const disabled = computed(() => formType.value === 'detail')
const formRef = ref() // Ref const formRef = ref() // Ref
@ -138,19 +160,19 @@ const options = [
label: '备件入库', label: '备件入库',
}, },
{ // {
value: '原料入库', // value: '',
label: '原料入库', // label: '',
}, // },
{ {
value: '产品入库', value: '产品入库',
label: '产品入库', label: '产品入库',
}, },
{ // {
value: '生产入库', // value: '',
label: '生产入库', // label: '',
disabled: true, // disabled: true,
}, // },
] ]
/** 子表的表单 */ /** 子表的表单 */

@ -283,6 +283,7 @@ const validate = () => {
} }
defineExpose({ validate }) defineExpose({ validate })
/** 初始化 */ /** 初始化 */
onMounted(async () => { onMounted(async () => {
productList.value = await ProductApi.getProductSimpleList() productList.value = await ProductApi.getProductSimpleList()
@ -293,4 +294,6 @@ onMounted(async () => {
handleAdd() handleAdd()
} }
}) })
</script> </script>

@ -1,5 +1,4 @@
<template> <template>
<ContentWrap> <ContentWrap>
<!-- 搜索工作栏 --> <!-- 搜索工作栏 -->
<el-form <el-form
@ -7,23 +6,23 @@
:model="queryParams" :model="queryParams"
ref="queryFormRef" ref="queryFormRef"
:inline="true" :inline="true"
label-width="auto" label-width="68px"
> >
<el-form-item :label="t('ErpStock.In.no')" prop="no"> <el-form-item label="入库单号" prop="no">
<el-input <el-input
v-model="queryParams.no" v-model="queryParams.no"
:placeholder="t('ErpStock.In.placeholderNo')" placeholder="请输入入库单号"
clearable clearable
@keyup.enter="handleQuery" @keyup.enter="handleQuery"
class="!w-240px" class="!w-240px"
/> />
</el-form-item> </el-form-item>
<el-form-item :label="t('ErpStock.In.product')" prop="productId"> <el-form-item label="产品" prop="productId">
<el-select <el-select
v-model="queryParams.productId" v-model="queryParams.productId"
clearable clearable
filterable filterable
:placeholder="t('ErpStock.In.placeholderProduct')" placeholder="请选择产品"
class="!w-240px" class="!w-240px"
> >
<el-option <el-option
@ -34,13 +33,13 @@
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item :label="t('ErpStock.In.inTime')" prop="inTime"> <el-form-item label="入库时间" prop="inTime">
<el-date-picker <el-date-picker
v-model="queryParams.inTime" v-model="queryParams.inTime"
value-format="YYYY-MM-DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss"
type="daterange" type="daterange"
:start-placeholder="t('common.startTimeText')" start-placeholder="开始日期"
:end-placeholder="t('common.endTimeText')" end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]" :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px" class="!w-220px"
/> />
@ -61,12 +60,12 @@
/> />
</el-select> </el-select>
</el-form-item> --> </el-form-item> -->
<el-form-item :label="t('ErpStock.In.warehouse')" prop="warehouseId"> <el-form-item label="仓库" prop="warehouseId">
<el-select <el-select
v-model="queryParams.warehouseId" v-model="queryParams.warehouseId"
clearable clearable
filterable filterable
:placeholder="t('ErpStock.In.placeholderWarehouse')" placeholder="请选择仓库"
class="!w-240px" class="!w-240px"
> >
<el-option <el-option
@ -77,12 +76,12 @@
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item :label="t('ErpStock.In.creator')" prop="creator"> <el-form-item label="创建人" prop="creator">
<el-select <el-select
v-model="queryParams.creator" v-model="queryParams.creator"
clearable clearable
filterable filterable
:placeholder="t('ErpStock.In.placeholderCreator')" placeholder="请选择创建人"
class="!w-240px" class="!w-240px"
> >
<el-option <el-option
@ -93,8 +92,8 @@
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item :label="t('ErpStock.In.status')" prop="status"> <el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" :placeholder="t('ErpStock.In.placeholderStatus')" clearable class="!w-240px"> <el-select v-model="queryParams.status" placeholder="请选择状态" clearable class="!w-240px">
<el-option <el-option
v-for="dict in getIntDictOptions(DICT_TYPE.ERP_AUDIT_STATUS)" v-for="dict in getIntDictOptions(DICT_TYPE.ERP_AUDIT_STATUS)"
:key="dict.value" :key="dict.value"
@ -103,25 +102,25 @@
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item :label="t('ErpStock.In.remark')" prop="remark"> <el-form-item label="备注" prop="remark">
<el-input <el-input
v-model="queryParams.remark" v-model="queryParams.remark"
:placeholder="t('ErpStock.In.placeholderRemark')" placeholder="请输入备注"
clearable clearable
@keyup.enter="handleQuery" @keyup.enter="handleQuery"
class="!w-240px" class="!w-240px"
/> />
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> {{ t('common.query') }}</el-button> <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{ t('common.reset') }}</el-button> <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button <el-button
type="primary" type="primary"
plain plain
@click="openForm('create')" @click="openForm('create')"
v-hasPermi="['erp:stock-in:create']" v-hasPermi="['erp:stock-in:create']"
> >
<Icon icon="ep:plus" class="mr-5px" /> {{ t('action.add') }} <Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button> </el-button>
<el-button <el-button
type="success" type="success"
@ -130,7 +129,7 @@
:loading="exportLoading" :loading="exportLoading"
v-hasPermi="['erp:stock-in:export']" v-hasPermi="['erp:stock-in:export']"
> >
<Icon icon="ep:download" class="mr-5px" /> {{ t('action.export') }} <Icon icon="ep:download" class="mr-5px" /> 导出
</el-button> </el-button>
<el-button <el-button
type="danger" type="danger"
@ -139,7 +138,7 @@
v-hasPermi="['erp:stock-in:delete']" v-hasPermi="['erp:stock-in:delete']"
:disabled="selectionList.length === 0" :disabled="selectionList.length === 0"
> >
<Icon icon="ep:delete" class="mr-5px" /> {{ t('action.del') }} <Icon icon="ep:delete" class="mr-5px" /> 删除
</el-button> </el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
@ -148,10 +147,10 @@
<!-- 列表 --> <!-- 列表 -->
<ContentWrap> <ContentWrap>
<el-tabs v-model="activeName" @tab-click="handleTabClick"> <el-tabs v-model="activeName" @tab-click="handleTabClick">
<el-tab-pane :label="t('ErpStock.In.tabProduct')" name="产品入库" /> <el-tab-pane label="产品入库" name="产品入库" />
<el-tab-pane :label="t('ErpStock.In.tabMaterial')" name="原料入库" /> <!-- <el-tab-pane label="原料入库" name="原料入库" /> -->
<el-tab-pane :label="t('ErpStock.In.tabPart')" name="备件入库" /> <el-tab-pane label="备件入库" name="备件入库" />
<el-tab-pane :label="t('ErpStock.In.tabOther')" name="其他入库" /> <el-tab-pane label="其他入库" name="其他入库" />
</el-tabs> </el-tabs>
<el-table <el-table
@ -162,19 +161,19 @@
@selection-change="handleSelectionChange" @selection-change="handleSelectionChange"
> >
<el-table-column width="30" label="选择" type="selection" /> <el-table-column width="30" label="选择" type="selection" />
<el-table-column min-width="180" :label="t('ErpStock.In.no')" align="center" prop="no" /> <el-table-column min-width="180" label="入库单号" align="center" prop="no" />
<el-table-column :label="t('ErpStock.In.productInfo')" align="left" sortable prop="productNames" min-width="200" /> <el-table-column label="产品信息" align="left" sortable prop="productNames" min-width="200" />
<!-- <el-table-column label="供应商" align="center" prop="supplierName" /> --> <!-- <el-table-column label="供应商" align="center" prop="supplierName" /> -->
<el-table-column <el-table-column
:label="t('ErpStock.In.inTime')" label="入库时间"
align="center" align="center"
prop="inTime" prop="inTime"
:formatter="dateFormatter2" :formatter="dateFormatter2"
width="120px" width="120px"
/> />
<el-table-column :label="t('ErpStock.In.creator')" align="center" prop="creatorName" /> <el-table-column label="创建人" align="center" prop="creatorName" />
<el-table-column <el-table-column
:label="t('ErpStock.In.count')" label="数量"
align="right" align="right"
sortable sortable
prop="totalCount" prop="totalCount"
@ -187,19 +186,19 @@
prop="totalPrice" prop="totalPrice"
:formatter="erpPriceTableColumnFormatter" :formatter="erpPriceTableColumnFormatter"
/> --> /> -->
<el-table-column :label="t('ErpStock.In.status')" align="center" fixed="right" width="90" prop="status"> <el-table-column label="状态" align="center" fixed="right" width="90" prop="status">
<template #default="scope"> <template #default="scope">
<dict-tag :type="DICT_TYPE.ERP_AUDIT_STATUS" :value="scope.row.status" /> <dict-tag :type="DICT_TYPE.ERP_AUDIT_STATUS" :value="scope.row.status" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column :label="t('action.operate')" align="center" fixed="right" width="220"> <el-table-column label="操作" align="center" fixed="right" width="220">
<template #default="scope"> <template #default="scope">
<el-button <el-button
link link
@click="openForm('detail', scope.row.id)" @click="openForm('detail', scope.row.id)"
v-hasPermi="['erp:stock-in:query']" v-hasPermi="['erp:stock-in:query']"
> >
{{ t('action.detail') }} 详情
</el-button> </el-button>
<el-button <el-button
link link
@ -208,7 +207,7 @@
v-hasPermi="['erp:stock-in:update']" v-hasPermi="['erp:stock-in:update']"
:disabled="scope.row.status === 20" :disabled="scope.row.status === 20"
> >
{{ t('action.edit') }} 编辑
</el-button> </el-button>
<el-button <el-button
link link
@ -234,7 +233,7 @@
@click="handleDelete([scope.row.id])" @click="handleDelete([scope.row.id])"
v-hasPermi="['erp:stock-in:delete']" v-hasPermi="['erp:stock-in:delete']"
> >
{{ t('action.del') }} 删除
</el-button> </el-button>
</template> </template>
</el-table-column> </el-table-column>
@ -341,10 +340,10 @@ const handleDelete = async (ids: number[]) => {
const handleUpdateStatus = async (id: number, status: number) => { const handleUpdateStatus = async (id: number, status: number) => {
try { try {
// //
await message.confirm(status === 20 ? t('ErpStock.In.confirmApprove') : t('ErpStock.In.confirmReverseApprove')) await message.confirm(`确定${status === 20 ? '审批' : '反审批'}该入库单吗?`)
// //
await StockInApi.updateStockInStatus(id, status) await StockInApi.updateStockInStatus(id, status)
message.success(status === 20 ? t('ErpStock.In.approveSuccess') : t('ErpStock.In.reverseApproveSuccess')) message.success(`${status === 20 ? '审批' : '反审批'}成功`)
// //
await getList() await getList()
} catch {} } catch {}
@ -358,7 +357,7 @@ const handleExport = async () => {
// //
exportLoading.value = true exportLoading.value = true
const data = await StockInApi.exportStockIn(queryParams) const data = await StockInApi.exportStockIn(queryParams)
download.excel(data, t('ErpStock.In.exportName')) download.excel(data, '其它入库单.xls')
} catch { } catch {
} finally { } finally {
exportLoading.value = false exportLoading.value = false

@ -102,7 +102,6 @@
import { StockOutApi, StockOutVO } from '@/api/erp/stock/out' 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";
/** ERP 其它出库单表单 */ /** ERP 其它出库单表单 */
defineOptions({ name: 'StockOutForm' }) defineOptions({ name: 'StockOutForm' })
@ -140,14 +139,14 @@ const options = [
label: '备件出库', label: '备件出库',
}, },
{ // {
value: '原料出库', // value: '',
label: '原料出库', // label: '',
}, // },
{ // {
value: '产品出库', // value: '',
label: '产品出库', // label: '',
}, // },
{ {
value: '领料出库', value: '领料出库',
label: '领料出库', label: '领料出库',

@ -1,5 +1,4 @@
<template> <template>
<ContentWrap> <ContentWrap>
<!-- 搜索工作栏 --> <!-- 搜索工作栏 -->
<el-form <el-form
@ -7,38 +6,23 @@
:model="queryParams" :model="queryParams"
ref="queryFormRef" ref="queryFormRef"
:inline="true" :inline="true"
label-width="auto" label-width="68px"
> >
<el-form-item :label="t('ErpStock.Out.no')" prop="no"> <el-form-item label="出库单号" prop="no">
<el-input <el-input
v-model="queryParams.no" v-model="queryParams.no"
:placeholder="t('ErpStock.Out.placeholderNo')" placeholder="请输入出库单号"
clearable clearable
@keyup.enter="handleQuery" @keyup.enter="handleQuery"
class="!w-240px" class="!w-240px"
/> />
</el-form-item> </el-form-item>
<el-form-item :label="t('ErpStock.Out.outType')" prop="outType"> <el-form-item label="产品" prop="productId">
<el-select
v-model="queryParams.outType"
clearable
filterable
:placeholder="t('ErpStock.Out.placeholderOutType')"
class="!w-240px"
>
<el-option label="其他出库" value="其他出库" />
<el-option label="备件出库" value="备件出库" />
<el-option label="原料出库" value="原料出库" />
<el-option label="产品出库" value="产品出库" />
<el-option label="领料出库" value="领料出库" disabled />
</el-select>
</el-form-item>
<el-form-item :label="t('ErpStock.Stock.product')" prop="productId">
<el-select <el-select
v-model="queryParams.productId" v-model="queryParams.productId"
clearable clearable
filterable filterable
:placeholder="t('ErpStock.Stock.placeholderProduct')" placeholder="请选择产品"
class="!w-240px" class="!w-240px"
> >
<el-option <el-option
@ -49,12 +33,23 @@
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item :label="t('ErpStock.Out.customer')" prop="customerId"> <el-form-item label="出库时间" prop="outTime">
<el-date-picker
v-model="queryParams.outTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-240px"
/>
</el-form-item>
<!-- <el-form-item label="客户" prop="customerId">
<el-select <el-select
v-model="queryParams.customerId" v-model="queryParams.customerId"
clearable clearable
filterable filterable
:placeholder="t('ErpStock.Out.placeholderCustomer')" placeholder="请选择客户"
class="!w-240px" class="!w-240px"
> >
<el-option <el-option
@ -64,24 +59,13 @@
:value="item.id" :value="item.id"
/> />
</el-select> </el-select>
</el-form-item> </el-form-item> -->
<el-form-item :label="t('ErpStock.Out.outTime')" prop="outTime"> <el-form-item label="仓库" prop="warehouseId">
<el-date-picker
v-model="queryParams.outTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
:start-placeholder="t('common.startTimeText')"
:end-placeholder="t('common.endTimeText')"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item>
<el-form-item :label="t('ErpStock.Out.warehouse')" prop="warehouseId">
<el-select <el-select
v-model="queryParams.warehouseId" v-model="queryParams.warehouseId"
clearable clearable
filterable filterable
:placeholder="t('ErpStock.Out.placeholderWarehouse')" placeholder="请选择仓库"
class="!w-240px" class="!w-240px"
> >
<el-option <el-option
@ -92,12 +76,12 @@
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item :label="t('ErpStock.In.creator')" prop="creator"> <el-form-item label="创建人" prop="creator">
<el-select <el-select
v-model="queryParams.creator" v-model="queryParams.creator"
clearable clearable
filterable filterable
:placeholder="t('ErpStock.In.placeholderCreator')" placeholder="请选择创建人"
class="!w-240px" class="!w-240px"
> >
<el-option <el-option
@ -108,8 +92,8 @@
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item :label="t('ErpStock.In.status')" prop="status"> <el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" :placeholder="t('ErpStock.In.placeholderStatus')" clearable class="!w-240px"> <el-select v-model="queryParams.status" placeholder="请选择状态" clearable class="!w-240px">
<el-option <el-option
v-for="dict in getIntDictOptions(DICT_TYPE.ERP_AUDIT_STATUS)" v-for="dict in getIntDictOptions(DICT_TYPE.ERP_AUDIT_STATUS)"
:key="dict.value" :key="dict.value"
@ -118,25 +102,25 @@
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item :label="t('ErpStock.Out.remark')" prop="remark"> <el-form-item label="备注" prop="remark">
<el-input <el-input
v-model="queryParams.remark" v-model="queryParams.remark"
:placeholder="t('ErpStock.Out.placeholderRemark')" placeholder="请输入备注"
clearable clearable
@keyup.enter="handleQuery" @keyup.enter="handleQuery"
class="!w-240px" class="!w-240px"
/> />
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> {{ t('common.query') }}</el-button> <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{ t('common.reset') }}</el-button> <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button <el-button
type="primary" type="primary"
plain plain
@click="openForm('create')" @click="openForm('create')"
v-hasPermi="['erp:stock-out:create']" v-hasPermi="['erp:stock-out:create']"
> >
<Icon icon="ep:plus" class="mr-5px" /> {{ t('action.add') }} <Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button> </el-button>
<el-button <el-button
type="success" type="success"
@ -145,7 +129,7 @@
:loading="exportLoading" :loading="exportLoading"
v-hasPermi="['erp:stock-out:export']" v-hasPermi="['erp:stock-out:export']"
> >
<Icon icon="ep:download" class="mr-5px" /> {{ t('action.export') }} <Icon icon="ep:download" class="mr-5px" /> 导出
</el-button> </el-button>
<el-button <el-button
type="danger" type="danger"
@ -154,7 +138,7 @@
v-hasPermi="['erp:stock-out:delete']" v-hasPermi="['erp:stock-out:delete']"
:disabled="selectionList.length === 0" :disabled="selectionList.length === 0"
> >
<Icon icon="ep:delete" class="mr-5px" /> {{ t('action.del') }} <Icon icon="ep:delete" class="mr-5px" /> 删除
</el-button> </el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
@ -162,6 +146,14 @@
<!-- 列表 --> <!-- 列表 -->
<ContentWrap> <ContentWrap>
<el-tabs v-model="activeName" @tab-click="handleTabClick">
<el-tab-pane label="领料出库" name="领料出库" />
<!-- <el-tab-pane label="产品出库" name="产品出库" /> -->
<!-- <el-tab-pane label="原料出库" name="原料出库" /> -->
<el-tab-pane label="备件出库" name="备件出库" />
<el-tab-pane label="其他出库" name="其他出库" />
</el-tabs>
<el-table <el-table
v-loading="loading" v-loading="loading"
:data="list" :data="list"
@ -170,20 +162,20 @@
@selection-change="handleSelectionChange" @selection-change="handleSelectionChange"
> >
<el-table-column width="30" label="选择" type="selection" /> <el-table-column width="30" label="选择" type="selection" />
<el-table-column min-width="180" :label="t('ErpStock.Out.no')" align="center" prop="no" /> <el-table-column min-width="180" label="出库单号" align="center" prop="no" />
<el-table-column min-width="100" :label="t('ErpStock.Out.outType')" align="center" prop="outType" /> <el-table-column label="产品信息" align="left" sortable prop="productNames" min-width="180" />
<el-table-column min-width="100" :label="t('ErpStock.Out.customer')" align="center" prop="customerName" /> <!-- <el-table-column label="客户" align="center" prop="customerName" /> -->
<el-table-column :label="t('ErpStock.In.productInfo')" align="left" sortable prop="productNames" min-width="200" />
<el-table-column <el-table-column
:label="t('ErpStock.Out.outTime')" label="出库时间"
align="center" align="center"
sortable
prop="outTime" prop="outTime"
:formatter="dateFormatter2" :formatter="dateFormatter2"
width="120px" width="120px"
/> />
<el-table-column :label="t('ErpStock.In.creator')" align="center" prop="creatorName" /> <el-table-column label="创建人" align="center" prop="creatorName" />
<el-table-column <el-table-column
:label="t('ErpStock.In.count')" label="数量"
align="right" align="right"
sortable sortable
prop="totalCount" prop="totalCount"
@ -196,19 +188,19 @@
prop="totalPrice" prop="totalPrice"
:formatter="erpPriceTableColumnFormatter" :formatter="erpPriceTableColumnFormatter"
/> --> /> -->
<el-table-column :label="t('ErpStock.In.status')" align="center" fixed="right" width="90" prop="status"> <el-table-column label="状态" align="center" fixed="right" width="90" prop="status">
<template #default="scope"> <template #default="scope">
<dict-tag :type="DICT_TYPE.ERP_AUDIT_STATUS" :value="scope.row.status" /> <dict-tag :type="DICT_TYPE.ERP_AUDIT_STATUS" :value="scope.row.status" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column :label="t('action.operate')" align="center" fixed="right" width="220"> <el-table-column label="操作" align="center" fixed="right" width="220">
<template #default="scope"> <template #default="scope">
<el-button <el-button
link link
@click="openForm('detail', scope.row.id)" @click="openForm('detail', scope.row.id)"
v-hasPermi="['erp:stock-out:query']" v-hasPermi="['erp:stock-out:query']"
> >
{{ t('action.detail') }} 详情
</el-button> </el-button>
<el-button <el-button
link link
@ -217,7 +209,7 @@
v-hasPermi="['erp:stock-out:update']" v-hasPermi="['erp:stock-out:update']"
:disabled="scope.row.status === 20" :disabled="scope.row.status === 20"
> >
{{ t('action.edit') }} 编辑
</el-button> </el-button>
<el-button <el-button
link link
@ -243,7 +235,7 @@
@click="handleDelete([scope.row.id])" @click="handleDelete([scope.row.id])"
v-hasPermi="['erp:stock-out:delete']" v-hasPermi="['erp:stock-out:delete']"
> >
{{ t('action.del') }} 删除
</el-button> </el-button>
</template> </template>
</el-table-column> </el-table-column>
@ -352,10 +344,10 @@ const handleDelete = async (ids: number[]) => {
const handleUpdateStatus = async (id: number, status: number) => { const handleUpdateStatus = async (id: number, status: number) => {
try { try {
// //
await message.confirm(status === 20 ? t('ErpStock.Out.confirmApprove') : t('ErpStock.Out.confirmReverseApprove')) await message.confirm(`确定${status === 20 ? '审批' : '反审批'}该出库单吗?`)
// //
await StockOutApi.updateStockOutStatus(id, status) await StockOutApi.updateStockOutStatus(id, status)
message.success(status === 20 ? t('ErpStock.Out.approveSuccess') : t('ErpStock.Out.reverseApproveSuccess')) message.success(`${status === 20 ? '审批' : '反审批'}成功`)
// //
await getList() await getList()
} catch {} } catch {}
@ -369,7 +361,7 @@ const handleExport = async () => {
// //
exportLoading.value = true exportLoading.value = true
const data = await StockOutApi.exportStockOut(queryParams) const data = await StockOutApi.exportStockOut(queryParams)
download.excel(data, t('ErpStock.Out.exportName')) download.excel(data, '其它出库单.xls')
} catch { } catch {
} finally { } finally {
exportLoading.value = false exportLoading.value = false

@ -1,6 +1,5 @@
<!-- ERP 仓库列表 --> <!-- ERP 仓库列表 -->
<template> <template>
<ContentWrap> <ContentWrap>
<!-- 搜索工作栏 --> <!-- 搜索工作栏 -->
<el-form <el-form
@ -8,21 +7,21 @@
:model="queryParams" :model="queryParams"
ref="queryFormRef" ref="queryFormRef"
:inline="true" :inline="true"
label-width="auto" label-width="68px"
> >
<el-form-item :label="t('ErpStock.Warehouse.name')" prop="name"> <el-form-item label="仓库名称" prop="name">
<el-input <el-input
v-model="queryParams.name" v-model="queryParams.name"
:placeholder="t('ErpStock.Warehouse.placeholderName')" placeholder="请输入仓库名称"
clearable clearable
@keyup.enter="handleQuery" @keyup.enter="handleQuery"
class="!w-240px" class="!w-240px"
/> />
</el-form-item> </el-form-item>
<el-form-item :label="t('ErpStock.Warehouse.status')" prop="status"> <el-form-item label="仓库状态" prop="status">
<el-select <el-select
v-model="queryParams.status" v-model="queryParams.status"
:placeholder="t('ErpStock.Warehouse.placeholderStatus')" placeholder="请选择仓库状态"
clearable clearable
class="!w-240px" class="!w-240px"
> >
@ -35,15 +34,15 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> {{ t('common.query') }}</el-button> <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{ t('common.reset') }}</el-button> <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button <el-button
type="primary" type="primary"
plain plain
@click="openForm('create')" @click="openForm('create')"
v-hasPermi="['erp:warehouse:create']" v-hasPermi="['erp:warehouse:create']"
> >
<Icon icon="ep:plus" class="mr-5px" /> {{ t('action.add') }} <Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button> </el-button>
<el-button <el-button
type="success" type="success"
@ -52,7 +51,7 @@
:loading="exportLoading" :loading="exportLoading"
v-hasPermi="['erp:warehouse:export']" v-hasPermi="['erp:warehouse:export']"
> >
<Icon icon="ep:download" class="mr-5px" /> {{ t('action.export') }} <Icon icon="ep:download" class="mr-5px" /> 导出
</el-button> </el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
@ -61,29 +60,29 @@
<!-- 列表 --> <!-- 列表 -->
<ContentWrap> <ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true"> <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column :label="t('ErpStock.Warehouse.name')" align="center" prop="name" /> <el-table-column label="仓库名称" align="center" prop="name" />
<el-table-column :label="t('ErpStock.Warehouse.address')" align="center" prop="address" /> <el-table-column label="仓库地址" align="center" prop="address" />
<el-table-column <!-- <el-table-column
:label="t('ErpStock.Warehouse.warehousePrice')" label="仓储费"
align="center" align="center"
prop="warehousePrice" prop="warehousePrice"
:formatter="erpPriceTableColumnFormatter" :formatter="erpPriceTableColumnFormatter"
/> /> -->
<el-table-column <!-- <el-table-column
:label="t('ErpStock.Warehouse.truckagePrice')" label="搬运费"
align="center" align="center"
prop="truckagePrice" prop="truckagePrice"
:formatter="erpPriceTableColumnFormatter" :formatter="erpPriceTableColumnFormatter"
/> /> -->
<el-table-column :label="t('ErpStock.Warehouse.principal')" align="center" prop="principal" /> <el-table-column label="负责人" align="center" prop="principal" />
<el-table-column :label="t('ErpStock.Warehouse.remark')" align="center" prop="remark" /> <el-table-column label="备注" align="center" prop="remark" />
<el-table-column :label="t('ErpStock.Warehouse.sort')" align="center" prop="sort" /> <el-table-column label="排序" align="center" prop="sort" />
<el-table-column :label="t('ErpStock.Warehouse.status')" align="center" prop="status"> <el-table-column label="状态" align="center" prop="status">
<template #default="scope"> <template #default="scope">
<dict-tag :type="DICT_TYPE.COMMON_STATUS" :value="scope.row.status" /> <dict-tag :type="DICT_TYPE.COMMON_STATUS" :value="scope.row.status" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column :label="t('ErpStock.Warehouse.defaultStatus')" align="center" prop="defaultStatus"> <el-table-column label="是否默认" align="center" prop="defaultStatus">
<template #default="scope"> <template #default="scope">
<el-switch <el-switch
v-model="scope.row.defaultStatus" v-model="scope.row.defaultStatus"
@ -94,13 +93,13 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column
:label="t('ErpStock.Warehouse.createTime')" label="创建时间"
align="center" align="center"
prop="createTime" prop="createTime"
:formatter="dateFormatter" :formatter="dateFormatter"
width="180px" width="180px"
/> />
<el-table-column :label="t('action.operate')" align="center"> <el-table-column label="操作" align="center">
<template #default="scope"> <template #default="scope">
<el-button <el-button
link link
@ -108,7 +107,7 @@
@click="openForm('update', scope.row.id)" @click="openForm('update', scope.row.id)"
v-hasPermi="['erp:warehouse:update']" v-hasPermi="['erp:warehouse:update']"
> >
{{ t('action.edit') }} 编辑
</el-button> </el-button>
<el-button <el-button
link link
@ -116,7 +115,7 @@
@click="handleDelete(scope.row.id)" @click="handleDelete(scope.row.id)"
v-hasPermi="['erp:warehouse:delete']" v-hasPermi="['erp:warehouse:delete']"
> >
{{ t('action.del') }} 删除
</el-button> </el-button>
</template> </template>
</el-table-column> </el-table-column>
@ -207,8 +206,8 @@ const handleDelete = async (id: number) => {
const handleDefaultStatusChange = async (row: WarehouseVO) => { const handleDefaultStatusChange = async (row: WarehouseVO) => {
try { try {
// //
const text = row.defaultStatus ? t('ErpStock.Warehouse.set') : t('ErpStock.Warehouse.cancel') const text = row.defaultStatus ? '设置' : '取消'
await message.confirm(t('ErpStock.Warehouse.confirmDefaultStatus', { action: text, name: row.name })) await message.confirm('确认要' + text + '"' + row.name + '"默认吗?')
// //
await WarehouseApi.updateWarehouseDefaultStatus(row.id, row.defaultStatus) await WarehouseApi.updateWarehouseDefaultStatus(row.id, row.defaultStatus)
// //
@ -227,7 +226,7 @@ const handleExport = async () => {
// //
exportLoading.value = true exportLoading.value = true
const data = await WarehouseApi.exportWarehouse(queryParams) const data = await WarehouseApi.exportWarehouse(queryParams)
download.excel(data, t('ErpStock.Warehouse.exportName')) download.excel(data, '仓库.xls')
} catch { } catch {
} finally { } finally {
exportLoading.value = false exportLoading.value = false

@ -63,7 +63,7 @@
row-key="id" row-key="id"
@selection-change="handleSelectionChange" @selection-change="handleSelectionChange"
> >
<el-table-column type="selection" width="55" reserve-selection /> <!-- <el-table-column type="selection" width="55" reserve-selection /> -->
<el-table-column <el-table-column
:label="t('RecipeManagement.RecipeType.tableNameColumn')" :label="t('RecipeManagement.RecipeType.tableNameColumn')"
align="center" align="center"
@ -106,7 +106,6 @@
@pagination="handlePagination" @pagination="handlePagination"
/> />
</ContentWrap> </ContentWrap>
<Dialog :title="dialogTitle" v-model="dialogVisible"> <Dialog :title="dialogTitle" v-model="dialogVisible">
<el-form <el-form
ref="dialogFormRef" ref="dialogFormRef"

@ -318,12 +318,12 @@ const ensureOptionsLoaded = async () => {
const [deviceTypeRes, userRes, criticalRes, beijianRes] = await Promise.all([ const [deviceTypeRes, userRes, criticalRes, beijianRes] = await Promise.all([
DeviceTypeApi.getDeviceTypeTree({ pageNo: 1, pageSize: 10 }), DeviceTypeApi.getDeviceTypeTree({ pageNo: 1, pageSize: 10 }),
getSimpleUserList(), getSimpleUserList(),
CriticalComponentApi.getCriticalComponentPage({}), CriticalComponentApi.getCriticalComponentList(),
ProductApi.getComponentSimpleList() ProductApi.getComponentSimpleList()
]) ])
deviceTypeTree.value = deviceTypeRes deviceTypeTree.value = deviceTypeRes
users.value = userRes ?? [] users.value = userRes ?? []
criticalComponentOptions.value = (criticalRes?.list ?? []).map((item: any) => { criticalComponentOptions.value = (criticalRes ?? []).map((item: any) => {
const code = item.code ? String(item.code) : '' const code = item.code ? String(item.code) : ''
const name = item.name ? String(item.name) : '' const name = item.name ? String(item.name) : ''
const label = code && name ? `${code}-${name}` : name || code || String(item.id) const label = code && name ? `${code}-${name}` : name || code || String(item.id)

@ -42,6 +42,24 @@
<el-option v-for="dict in valueTypeOptions" :key="dict.value" :label="dict.label" :value="dict.value" /> <el-option v-for="dict in valueTypeOptions" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item :label="t('EquipmentManagement.DvSubject.upperVal')" prop="upperVal" v-if="formData.valueType == 0">
<el-input-number
v-model="formData.upperVal"
:placeholder="t('EquipmentManagement.DvSubject.placeholderUpperVal')"
class="!w-full"
:precision="2"
:step="0.01"
/>
</el-form-item>
<el-form-item :label="t('EquipmentManagement.DvSubject.lowerVal')" prop="lowerVal" v-if="formData.valueType == 0">
<el-input-number
v-model="formData.lowerVal"
:placeholder="t('EquipmentManagement.DvSubject.placeholderLowerVal')"
class="!w-full"
:precision="2"
:step="0.01"
/>
</el-form-item>
<el-form-item :label="t('EquipmentManagement.DvSubject.judgmentCriteria')" prop="judgmentCriteria"> <el-form-item :label="t('EquipmentManagement.DvSubject.judgmentCriteria')" prop="judgmentCriteria">
<el-input <el-input
v-model="formData.judgmentCriteria" v-model="formData.judgmentCriteria"
@ -92,13 +110,15 @@ const formData = ref({
inspectionMethod: undefined, inspectionMethod: undefined,
valueType: undefined, valueType: undefined,
judgmentCriteria: undefined, judgmentCriteria: undefined,
upperVal: undefined,
lowerVal: undefined
}) })
const formRules = reactive({ const formRules = reactive({
subjectCode: [{ required: true, message: '项目编码不能为空', trigger: 'blur' }], subjectCode: [{ required: true, message: '项目编码不能为空', trigger: 'blur' }],
subjectName: [{ required: true, message: '项目名称不能为空', trigger: 'blur' }], subjectName: [{ required: true, message: '项目名称不能为空', trigger: 'blur' }],
inspectionMethod: [{ required: true, message: '检验方式不能为空', trigger: 'change' }], inspectionMethod: [{ required: true, message: '检验方式不能为空', trigger: 'change' }],
valueType: [{ required: true, message: '值类型不能为空', trigger: 'change' }], valueType: [{ required: true, message: '值类型不能为空', trigger: 'change' }],
judgmentCriteria: [{ required: true, message: '判定基准不能为空', trigger: 'blur' }], // judgmentCriteria: [{ required: true, message: '', trigger: 'blur' }],
isEnable: [{ required: true, message: '是否启用不能为空', trigger: 'change' }], isEnable: [{ required: true, message: '是否启用不能为空', trigger: 'change' }],
}) })
const formRef = ref() // Ref const formRef = ref() // Ref
@ -140,7 +160,9 @@ const submitForm = async () => {
isEnable: formData.value.isEnable, isEnable: formData.value.isEnable,
inspectionMethod: formData.value.inspectionMethod, inspectionMethod: formData.value.inspectionMethod,
valueType: formData.value.valueType, valueType: formData.value.valueType,
judgmentCriteria: formData.value.judgmentCriteria judgmentCriteria: formData.value.judgmentCriteria,
upperVal: formData.value.upperVal,
lowerVal: formData.value.lowerVal
} as unknown as DvSubjectVO } as unknown as DvSubjectVO
if (formType.value === 'create') { if (formType.value === 'create') {
await DvSubjectApi.createDvSubject(data) await DvSubjectApi.createDvSubject(data)
@ -167,6 +189,8 @@ const resetForm = () => {
inspectionMethod: undefined, inspectionMethod: undefined,
valueType: undefined, valueType: undefined,
judgmentCriteria: undefined, judgmentCriteria: undefined,
upperVal: undefined,
lowerVal: undefined
} }
formRef.value?.resetFields() formRef.value?.resetFields()
} }

@ -66,9 +66,9 @@ const formType = ref<'create' | 'update'>('create')
const subjectOptions = ref<DvSubjectVO[]>([]) const subjectOptions = ref<DvSubjectVO[]>([])
const ensureSubjectOptionsLoaded = async () => { const ensureSubjectOptionsLoaded = async () => {
if (subjectOptions.value.length) return if (subjectOptions.value.length) return
const res = await DvSubjectApi.getDvSubjectPage({}) const res = await DvSubjectApi.getDvSubjectList()
const list = Array.isArray(res) ? res : res?.list console.log(res)
subjectOptions.value = (list ?? []) as DvSubjectVO[] subjectOptions.value = (res ?? []) as DvSubjectVO[]
} }
const parseIds = (value: any): Array<number | string> => { const parseIds = (value: any): Array<number | string> => {

@ -1,6 +1,6 @@
<template> <template>
<ContentWrap> <ContentWrap>
<el-form class="-mb-15px" :model="queryParams" ref="queryFormRef" :inline="true" label-width="60px"> <el-form class="-mb-15px" :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px">
<el-form-item :label="t('EquipmentManagement.PlanMaintenance.planName')" prop="planName"> <el-form-item :label="t('EquipmentManagement.PlanMaintenance.planName')" prop="planName">
<el-input <el-input
v-model="queryParams.planName" v-model="queryParams.planName"
@ -59,7 +59,8 @@
</el-button> </el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</ContentWrap>
<ContentWrap>
<el-table <el-table
ref="tableRef" ref="tableRef"
v-loading="loading" v-loading="loading"

@ -1,6 +1,6 @@
<template> <template>
<ContentWrap> <ContentWrap>
<el-form class="-mb-15px" :model="queryParams" ref="queryFormRef" :inline="true" label-width="120px"> <el-form class="-mb-15px" :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px">
<el-form-item :label="t('QualityManagement.ZjTask.code')" prop="code"> <el-form-item :label="t('QualityManagement.ZjTask.code')" prop="code">
<el-input <el-input
v-model="queryParams.code" v-model="queryParams.code"
@ -109,8 +109,8 @@ type="success" plain @click="handleExport" :loading="exportLoading"
row-key="id" row-key="id"
@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('QualityManagement.ZjTask.index')" type="index" width="80" /> <el-table-column :label="t('QualityManagement.ZjTask.index')" type="index" width="80"/>
<el-table-column :label="t('QualityManagement.ZjTask.code')" align="center" prop="code" /> <el-table-column :label="t('QualityManagement.ZjTask.code')" align="center" prop="code" />
<el-table-column :label="t('QualityManagement.ZjTask.type')" align="center"> <el-table-column :label="t('QualityManagement.ZjTask.type')" align="center">
<template #default="scope"> <template #default="scope">
@ -153,6 +153,7 @@ type="success" plain @click="handleExport" :loading="exportLoading"
<el-table-column :label="t('QualityManagement.ZjTask.operate')" align="center" min-width="160px"> <el-table-column :label="t('QualityManagement.ZjTask.operate')" align="center" min-width="160px">
<template #default="scope"> <template #default="scope">
<el-button <el-button
v-if="scope.row.status === 0"
link link
type="warning" type="warning"
@click.stop="handleRowClick(scope.row)" @click.stop="handleRowClick(scope.row)"

@ -67,7 +67,7 @@ type="success" plain @click="handleExport" :loading="exportLoading"
row-key="id" row-key="id"
@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="ID" align="center" prop="id" /> --> <!-- <el-table-column label="ID" align="center" prop="id" /> -->
<el-table-column :label="t('QualityManagement.ZjItem.name')" align="center" prop="name" /> <el-table-column :label="t('QualityManagement.ZjItem.name')" align="center" prop="name" />
<el-table-column :label="t('QualityManagement.ZjItem.tool')" align="center" prop="tool" /> <el-table-column :label="t('QualityManagement.ZjItem.tool')" align="center" prop="tool" />

@ -1,7 +1,7 @@
<template> <template>
<ContentWrap> <ContentWrap>
<!-- 搜索工作栏 --> <!-- 搜索工作栏 -->
<el-form class="-mb-15px" :model="queryParams" ref="queryFormRef" :inline="true" label-width="120px"> <el-form class="-mb-15px" :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px">
<el-form-item :label="t('QualityManagement.ZjSchema.name')" prop="name"> <el-form-item :label="t('QualityManagement.ZjSchema.name')" prop="name">
<el-input <el-input
v-model="queryParams.name" v-model="queryParams.name"
@ -35,7 +35,7 @@ v-for="dict in getDictOptions('mes_zj_schema_sample_method')" :key="dict.value"
:value="dict.value" /> :value="dict.value" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item :label="t('QualityManagement.ZjSchema.val')" prop="val"> <!-- <el-form-item :label="t('QualityManagement.ZjSchema.val')" prop="val">
<el-input <el-input
v-model="queryParams.val" v-model="queryParams.val"
:placeholder="t('QualityManagement.ZjSchema.placeholderVal')" :placeholder="t('QualityManagement.ZjSchema.placeholderVal')"
@ -43,7 +43,7 @@ v-for="dict in getDictOptions('mes_zj_schema_sample_method')" :key="dict.value"
@keyup.enter="handleQuery" @keyup.enter="handleQuery"
class="!w-240px" class="!w-240px"
/> />
</el-form-item> </el-form-item> -->
<el-form-item :label="t('QualityManagement.ZjSchema.remark')" prop="remark"> <el-form-item :label="t('QualityManagement.ZjSchema.remark')" prop="remark">
<el-input <el-input
v-model="queryParams.remark" v-model="queryParams.remark"
@ -102,7 +102,7 @@ type="success" plain @click="handleExport" :loading="exportLoading"
@expand-change="handleExpandChange" @expand-change="handleExpandChange"
@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 type="expand"> <el-table-column type="expand">
<template #default="scope"> <template #default="scope">
<el-table <el-table

@ -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('QualityManagement.ZjType.code')" prop="code"> <el-form-item :label="t('QualityManagement.ZjType.code')" prop="code">
<el-input <el-input
@ -80,7 +80,7 @@
row-key="id" row-key="id"
@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="ID" align="center" prop="id" /> --> <!-- <el-table-column label="ID" align="center" prop="id" /> -->
<el-table-column :label="t('QualityManagement.ZjType.code')" align="center" prop="code" /> <el-table-column :label="t('QualityManagement.ZjType.code')" align="center" prop="code" />
<el-table-column :label="t('QualityManagement.ZjType.name')" align="center" prop="name" /> <el-table-column :label="t('QualityManagement.ZjType.name')" align="center" prop="name" />

Loading…
Cancel
Save