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