From c01430989ee06fd49b1d893f778654444168af9f Mon Sep 17 00:00:00 2001 From: zhaoyiran <yiran_zhao6@163.com> Date: Wed, 5 Mar 2025 19:55:16 +0800 Subject: [PATCH] =?UTF-8?q?YT-1996=E4=BE=9B=E5=BA=94=E5=95=86=E5=9C=B0?= =?UTF-8?q?=E7=82=B9=E4=BE=BF=E6=AC=A1=E6=97=B6=E9=97=B4=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/wms/supplierAddrDeliTime/index.ts | 49 +++ .../supplierAddrDeliTime/index.vue | 383 ++++++++++++++++++ .../supplierAddrDeliTimeDetail.data.ts | 201 +++++++++ 3 files changed, 633 insertions(+) create mode 100644 src/api/wms/supplierAddrDeliTime/index.ts create mode 100644 src/views/wms/basicDataManage/supplierManage/supplierAddrDeliTime/index.vue create mode 100644 src/views/wms/basicDataManage/supplierManage/supplierAddrDeliTime/supplierAddrDeliTimeDetail.data.ts diff --git a/src/api/wms/supplierAddrDeliTime/index.ts b/src/api/wms/supplierAddrDeliTime/index.ts new file mode 100644 index 000000000..7e4e9b0a4 --- /dev/null +++ b/src/api/wms/supplierAddrDeliTime/index.ts @@ -0,0 +1,49 @@ +import request from '@/config/axios' + +export interface SupplierAddrDeliTimeDetailVO { + id: number + masterId: number + code: string + shift: string +} + +// 查询供应商地点便次时间配置明细列表 +export const getSupplierAddrDeliTimeDetailPage = async (params) => { + if (params.isSearch) { + delete params.isSearch + const data = {...params} + return await request.post({ url: '/wms/supplier-addr-deli-time-detail/senior', data }) + } else { + return await request.get({ url: `/wms/supplier-addr-deli-time-detail/page`, params }) + } +} + +// 查询供应商地点便次时间配置明细详情 +export const getSupplierAddrDeliTimeDetail = async (id: number) => { + return await request.get({ url: `/wms/supplier-addr-deli-time-detail/get?id=` + id }) +} + +// 新增供应商地点便次时间配置明细 +export const createSupplierAddrDeliTimeDetail = async (data: SupplierAddrDeliTimeDetailVO) => { + return await request.post({ url: `/wms/supplier-addr-deli-time-main/create`, data }) +} + +// 修改供应商地点便次时间配置明细 +export const updateSupplierAddrDeliTimeDetail = async (data: SupplierAddrDeliTimeDetailVO) => { + return await request.put({ url: `/wms/supplier-addr-deli-time-main/update`, data }) +} + +// 删除供应商地点便次时间配置明细 +export const deleteSupplierAddrDeliTimeDetail = async (id: number) => { + return await request.delete({ url: `/wms/supplier-addr-deli-time-detail/delete?id=` + id }) +} + +// 导出供应商地点便次时间配置明细 Excel +export const exportSupplierAddrDeliTimeDetail = async (params) => { + return await request.download({ url: `/wms/supplier-addr-deli-time-detail/export-excel`, params }) +} + +// 下载用户导入模板 +export const importTemplate = () => { + return request.download({ url: '/wms/supplier-addr-deli-time-detail/get-import-template' }) +} \ No newline at end of file diff --git a/src/views/wms/basicDataManage/supplierManage/supplierAddrDeliTime/index.vue b/src/views/wms/basicDataManage/supplierManage/supplierAddrDeliTime/index.vue new file mode 100644 index 000000000..6436b28c7 --- /dev/null +++ b/src/views/wms/basicDataManage/supplierManage/supplierAddrDeliTime/index.vue @@ -0,0 +1,383 @@ +<template> + <ContentWrap> + <!-- 搜索工作栏 --> + <Search :schema="SupplierAddrDeliTime.allSchemas.searchSchema" @search="setSearchParams" @reset="setSearchParams" /> + </ContentWrap> + + <!-- 列表头部 --> + <TableHead + :HeadButttondata="HeadButttondata" + @button-base-click="buttonBaseClick" + :routeName="routeName" + @updataTableColumns="updataTableColumns" + @searchFormClick="searchFormClick" + :allSchemas="SupplierAddrDeliTime.allSchemas" + /> + + <!-- 列表 --> + <ContentWrap> + <Table + :columns="tableColumns" + :data="tableObject.tableList" + :loading="tableObject.loading" + :pagination="{ + total: tableObject.total + }" + v-model:pageSize="tableObject.pageSize" + v-model:currentPage="tableObject.currentPage" + v-model:sort="tableObject.sort" + > + <template #supplierCode="{row}"> + <el-button type="primary" link @click="openDetail(row, '代码', row.supplierCode)"> + <span>{{ row.supplierCode }}</span> + </el-button> + </template> + <template #action="{ row }"> + <ButtonBase :Butttondata="butttondata" @button-base-click="buttonTableClick($event,row)" /> + </template> + </Table> + </ContentWrap> + + <!-- 表单弹窗:添加/修改 --> + <BasicForm + ref="formRef" + :isOpenSearchTable="true" + fieldTableColumn="code" + :rules="SupplierAddrDeliTimeDetailRules" + :formAllSchemas="SupplierAddrDeliTime.allSchemas" + :tableAllSchemas="SupplierAddrDeliTimeDetail.allSchemas" + + :tableData="tableData" + :apiUpdate="SupplierAddrDeliTimeDetailApi.updateSupplierAddrDeliTimeDetail" + :apiCreate="SupplierAddrDeliTimeDetailApi.createSupplierAddrDeliTimeDetail" + :isBusiness="true" + @handleAddTable="handleAddTable" + @handleDeleteTable="handleDeleteTable" + :isShowReduceButtonSelection="true" + @tableSelectionDelete="tableSelectionDelete" + @searchTableSuccess="searchTableSuccess" + @submitForm="submitForm" + /> + + <!-- 详情 --> + <Detail + ref="detailRef" + :isBasic="false" + :allSchemas="SupplierAddrDeliTime.allSchemas" + :detailAllSchemas="detailAllSchemas" + + :apiCreate="SupplierAddrDeliTimeDetailApi.createPurchaseClaimRequestDetail" + :apiUpdate="SupplierAddrDeliTimeDetailApi.updatePurchaseClaimRequestDetail" + :apiPage="SupplierAddrDeliTimeDetailApi.getPurchaseClaimRequestDetailPage" + :apiDelete="SupplierAddrDeliTimeDetailApi.deletePurchaseClaimRequestDetail" + :detailButtonIsShowDelete="true" + :detailButtonIsShowAdd="false" + @searchTableSuccessDetail="searchTableSuccessDetail" + @detailOpenForm="detailOpenForm" + /> + + <!-- :detailAllSchemas="SupplierAddrDeliTimeDetail.allSchemas" --> + <!-- 导入 --> + <ImportForm ref="importFormRef" url="/wms/supplier-addr-deli-time-detail/import" :importTemplateData="importTemplateData" @success="importSuccess" /> +</template> + +<script setup lang="ts"> +import download from '@/utils/download' +import { SupplierAddrDeliTime, SupplierAddrDeliTimeDetail, SupplierAddrDeliTimeDetailRules } from './supplierAddrDeliTimeDetail.data' +import * as SupplierAddrDeliTimeDetailApi from '@/api/wms/supplierAddrDeliTime' +import * as defaultButtons from '@/utils/disposition/defaultButtons' +import TableHead from '@/components/TableHead/src/TableHead.vue' +import ImportForm from '@/components/ImportForm/src/ImportForm.vue' +import Detail from '@/components/Detail/src/Detail.vue' +import { debug } from 'console' + +defineOptions({ name: 'SupplierAddrDeliTime' }) + +const message = useMessage() // 消息弹窗 +const { t } = useI18n() // 国际化 + +const route = useRoute() // 路由信息 +const routeName = ref() +routeName.value = route.name +const tableColumns = ref(SupplierAddrDeliTime.allSchemas.tableColumns) +const detailAllSchemas = ref(SupplierAddrDeliTimeDetail.allSchemas) +// 查询页面返回 +const searchTableSuccess = (formField, searchField, val, formRef, type, row) => { + nextTick(() => { + if (formField == 'code') { + let codes = val.filter((item) => + tableData.value.find((item1) => item1['code'] == item['code']) + ) + if (codes.length > 0) { + codes = codes.map((item) => item['code']) + message.warning(`编码${codes.join(',')}已经存在`) + } + val = val.filter( + (item) => !tableData.value.find((item1) => item1['code'] == item['code']) + ) + if (val.length == 0) { + return + } + let newVal = val.filter( + (item) => !tableData.value.find((item1) => item1['code'] == item['code']) + ) + newVal.forEach((item) => { + let tfk = JSON.parse(JSON.stringify(tableFormKeys)) + tfk['code'] = item['code'] + tfk['shift'] = item['shift'] + tfk['beginTime'] = item['begeinTime'] + tableData.value.push(tfk) + }) + } + + const setV = {} + setV[formField] = val[0][searchField] + if (formField == 'supplierCode') { + setV['supplierCode'] = val[0].code + setV['supplierName'] = val[0].name + } + formRef.setValues(setV) + }) +} + +//为true表示子表数据中存在数量为0的数据 +const flag = ref(false) + +// 主子数据 提交 +const submitForm = async (formType, submitData) => { + flag.value=false + let data = { ...submitData } + if (data.masterId) { + data.id = data.masterId + } + data.subList = tableData.value // 拼接子表数据参数 + data.subList.forEach((item) => { + item.toWarehouseCode = data.toWarehouseCode + item.toLocationCode = data.toLocationCode + }) + + if (flag.value) { + return + } + formRef.value.formLoading = true + try { + if (formType === 'create') { + await SupplierAddrDeliTimeDetailApi.createSupplierAddrDeliTimeDetail(data) + message.success(t('common.createSuccess')) + } else { + await SupplierAddrDeliTimeDetailApi.updateSupplierAddrDeliTimeDetail(data) + message.success(t('common.updateSuccess')) + } + formRef.value.dialogVisible = false + // 刷新当前列表 + if (formType === 'create') { + getList() + } else { + buttonBaseClick('refresh', null) + } + } finally { + formRef.value.formLoading = false + } +} + +/** + * tableForm方法 + */ + const tableFormKeys = {} +SupplierAddrDeliTimeDetail.allSchemas.tableFormColumns.forEach((item) => { + tableFormKeys[item.field] = item.default ? item.default : '' +}) +// 添加明细 +const handleAddTable = () => { + tableData.value.push(JSON.parse(JSON.stringify(tableFormKeys))) +} + +// 删除明细 +const handleDeleteTable = (item, index) => { + let itemIndex = tableData.value.indexOf(item) + if (itemIndex > -1) { + tableData.value.splice(itemIndex, 1) + } +} + + +// 字段设置 更新主列表字段 +const updataTableColumns = (val) => { + tableColumns.value = val +} + +const { tableObject, tableMethods } = useTable({ + getListApi: SupplierAddrDeliTimeDetailApi.getSupplierAddrDeliTimeDetailPage // 分页接口 +}) + +// 获得表格的各种操作 +const { getList, setSearchParams } = tableMethods + +// 列表头部按钮 +const HeadButttondata = [ + defaultButtons.defaultAddBtn(null), // 新增 + defaultButtons.defaultImportBtn(null), // 导入 + defaultButtons.defaultExportBtn(null), // 导出 + defaultButtons.defaultFreshBtn(null), // 刷新 + defaultButtons.defaultFilterBtn(null), // 筛选 + defaultButtons.defaultSetBtn(null), // 设置 + // { + // label: '自定义扩展按钮', + // name: 'zdy', + // hide: false, + // type: 'primary', + // icon: 'Select', + // color: '' + // }, +] + +// 头部按钮事件 +const buttonBaseClick = (val, item) => { + if (val == 'add') { // 新增 + openForm('create') + } else if (val == 'import') { // 导入 + handleImport() + } else if (val == 'export') { // 导出 + handleExport() + } else if (val == 'refresh') { // 刷新 + getList() + } else if (val == 'filtrate') { // 筛选 + } else { // 其他按钮 + console.log('其他按钮', item) + } +} + +// 列表-操作按钮 +const butttondata = [ + defaultButtons.mainListEditBtn(null), // 编辑 + defaultButtons.mainListDeleteBtn(null), // 删除 +] + +// 列表-操作按钮事件 +const buttonTableClick = async (val, row) => { + if (val == 'edit') { // 编辑 + openForm('update', row) + } else if (val == 'delete') { // 删除 + handleDelete(row.id) + } +} + +/** 添加/修改操作 */ +const basicFormRef = ref() +const tableData = ref([]) +const formRef = ref([]) +// const openForm = (type: string, row?: any) => { +// basicFormRef.value.open(type, row) +// } +const openForm = async (type: string, row?: any) => { + tableData.value = [] // 重置明细数据 + if (row?.id) { + SupplierAddrDeliTime.allSchemas.formSchema.forEach((item) => { + if (item.field == 'supplierCode') { + item.componentProps.isSearchList = false + item.componentProps.disabled = true + } + }) + } else { + SupplierAddrDeliTime.allSchemas.formSchema.forEach((item) => { + if (item.field == 'supplierCode') { + item.componentProps.isSearchList = true + item.componentProps.disabled = false + } + }) + } + formRef.value.open(type, row) +} + +// form表单提交 +const formsSuccess = async (formType,data) => { + var isHave =SupplierAddrDeliTime.allSchemas.formSchema.some(function (item) { + return item.field === 'activeTime' || item.field === 'expireTime'; + }); + if(isHave){ + if(data.activeTime && data.expireTime && data.activeTime >=data.expireTime){ + message.error('失效时间要大于生效时间') + return; + } + } + if(data.activeTime==0)data.activeTime = null; + if(data.expireTime==0)data.expireTime = null; + if (formType === 'create') { + await SupplierAddrDeliTimeDetailApi.createSupplierAddrDeliTimeDetail(data) + message.success(t('common.createSuccess')) + } else { + await SupplierAddrDeliTimeDetailApi.updateSupplierAddrDeliTimeDetail(data) + message.success(t('common.updateSuccess')) + } + basicFormRef.value.dialogVisible = false + getList() +} + +/** 详情操作 */ +const detailRef = ref() +const detailData = ref({}) +const openDetail = (row: any, titleName: any, titleValue: any) => { + detailData.value = row + detailRef.value.openDetail(row, titleName, titleValue, 'basicSupplierAddrDeliTimeDetail') +} + +/** 删除按钮操作 */ +const handleDelete = async (id: number) => { + try { + // 删除的二次确认 + await message.delConfirm() + // 发起删除 + await SupplierAddrDeliTimeDetailApi.deleteSupplierAddrDeliTimeDetail(id) + message.success(t('common.delSuccess')) + // 刷新列表 + await getList() + } catch {} +} + +/** 导出按钮操作 */ +const exportLoading = ref(false) // 导出的加载中 +const handleExport = async () => { + try { + // 导出的二次确认 + await message.exportConfirm() + // 发起导出 + exportLoading.value = true + const data = await SupplierAddrDeliTimeDetailApi.exportSupplierAddrDeliTimeDetail(tableObject.params) + download.excel(data, '供应商地点便次时间配置明细.xlsx') + } catch { + } finally { + exportLoading.value = false + } +} + +/** 导入 */ +const importFormRef = ref() +const handleImport = () => { + importFormRef.value.open() +} +// 导入附件弹窗所需的参数 +const importTemplateData = reactive({ + templateUrl: '', + templateTitle: '供应商地点便次时间配置明细导入模版.xlsx' +}) +// 导入成功之后 +const importSuccess = () => { + getList() +} + +// 筛选提交 +const searchFormClick = (searchData) => { + tableObject.params = { + isSearch: true, + filters: searchData.filters + } + getList() // 刷新当前列表 +} + +/** 初始化 **/ +onMounted(async () => { + getList() + importTemplateData.templateUrl = await SupplierAddrDeliTimeDetailApi.importTemplate() +}) + +</script> diff --git a/src/views/wms/basicDataManage/supplierManage/supplierAddrDeliTime/supplierAddrDeliTimeDetail.data.ts b/src/views/wms/basicDataManage/supplierManage/supplierAddrDeliTime/supplierAddrDeliTimeDetail.data.ts new file mode 100644 index 000000000..5d56d5ffe --- /dev/null +++ b/src/views/wms/basicDataManage/supplierManage/supplierAddrDeliTime/supplierAddrDeliTimeDetail.data.ts @@ -0,0 +1,201 @@ +import type { CrudSchema } from '@/hooks/web/useCrudSchemas' +import { dateFormatter } from '@/utils/formatTime' +import * as SupplierApi from '@/api/wms/supplier' +// import {Supplier} from '@/basicDataManage/supplierManage/supplier/supplier.data' +import { Supplier } from '../supplier/supplier.data' +import { DeliTime } from '../deliTime/deliTime.data' +import * as DeliTimeApi from '@/api/wms/deliTime' + +// 表单校验 +export const SupplierAddrDeliTimeDetailRules = reactive({ + supplierCode: [required], + supplierName: [required], + supplierAddress: [required], + yearAndMonth: [required], + delayDeli: [required], +}) + + + +export const SupplierAddrDeliTime = useCrudSchemas(reactive<CrudSchema[]>([ + { + label: '供应商代码', + field: 'supplierCode', + sort: 'custom', + isSearch: true, + form: { + // labelMessage: '信息提示说明!!!', + componentProps: { + isSearchList: true, // 开启查询弹窗 + searchListPlaceholder: '请选择供应商代码', // 输入框占位文本 + searchField: 'number', // 查询弹窗赋值字段 + searchTitle: '供应商', // 查询弹窗标题 + searchAllSchemas: Supplier.allSchemas, // 查询弹窗所需类 + searchPage: SupplierApi.getSupplierPageSCP, // 查询弹窗所需分页方法 + searchCondition: [ + { + key: 'available', + value: "TRUE", + isMainValue: false + } + ] + } + } + }, + { + label: '供应商名称', + field: 'supplierName', + sort: 'custom', + form :{ + componentProps:{ + disabled:true + } + }, + }, + { + label: '供应商地点', + field: 'supplierAddress', + sort: 'custom', + isSearch: true, + }, + { + label: '年月', + field: 'yearAndMonth', + sort: 'custom', + isSearch: true, + }, + { + label: '延后便次', + field: 'delayDeli', + sort: 'custom', + form: { + component: 'InputNumber', + value: 0, + }, + }, + { + label: '班次', + field: 'shift', + sort: 'custom', + isForm: false, + dictType: DICT_TYPE.SHIFT, + dictClass: 'string', + }, + { + label: '编号', + field: 'code', + sort: 'custom', + isForm: false, + }, + { + label: '创建时间', + field: 'createTime', + sort: 'custom', + formatter: dateFormatter, + search: { + component: 'DatePicker', + componentProps: { + valueFormat: 'YYYY-MM-DD HH:mm:ss', + type: 'daterange', + defaultTime: [new Date('1 00:00:00'), new Date('1 23:59:59')] + } + }, + isForm: false, + }, + { + label: '操作', + field: 'action', + isForm: false, + table: { + width: 150, + fixed: 'right' + } + } +])) + +export const SupplierAddrDeliTimeDetail = useCrudSchemas(reactive<CrudSchema[]>([ + { + label: '编号', + field: 'code', + sort: 'custom', + isForm: false, + tableForm:{ + multiple: true,//多选 + isInpuFocusShow: false, // 开启查询弹窗 + disabled:true, + searchListPlaceholder: '请选择便次时间配置',// 输入框占位文本 + searchField: 'code', // 查询弹窗赋值字段 + searchTitle: '便次时间配置', // 查询弹窗标题 + searchAllSchemas: DeliTime.allSchemas, // 查询弹窗所需类 + searchPage: DeliTimeApi.getDeliTimePage, // 查询弹窗所需分页方法 + searchCondition: [{ + key: 'available', + value: 'TRUE', + action: '==', + isSearch: true, + isMainValue: false + }, + ], + verificationPage: DeliTimeApi.getDeliTimePage, // tableForm下方输入框校验失去焦点之后是否正确的方法 + // isShowTableFormSearch: true, //tableForm下方是否出现输入框 + verificationParams: [{ + key: 'itemCode', + action: '==', + value: '', + isMainValue: false, + isSearch: true, + isFormModel: true, + }], // 失去焦点校验参数 + }, + form: { + // labelMessage: '信息提示说明!!!', + componentProps: { + disabled:true, + enterSearch: true, + isSearchList: true, // 开启查询弹窗 + searchListPlaceholder: '请选择品番', // 输入框占位文本 + searchField: 'itemCode', // 查询弹窗赋值字段 + searchTitle: '供应商物料信息', // 查询弹窗标题 + searchAllSchemas: DeliTime.allSchemas, // 查询弹窗所需类 + searchPage: DeliTimeApi.getDeliTimePage, // 查询弹窗所需分页方法 + searchCondition: [ + { + key: 'available', + value: 'TRUE', + isMainValue: false + }, + ], + verificationParams: [ + { + key: 'itemCode', + action: '==', + value: '', + isMainValue: false, + isSearch: true, + isFormModel: true + } + ] // 失去焦点校验参数 + } + } + }, + { + label: '班次', + field: 'shift', + sort: 'custom', + isForm: false, + tableForm:{ + disabled:true, + } + }, + { + label: '开始时间', + field: 'beginTime', + sort: 'custom', + isForm: false, + formatter: dateFormatter, + tableForm:{ + disabled:true, + formatter: dateFormatter, + } + }, +])) \ No newline at end of file