From fd6a5aedf27331de071ba84fdb682a567c4cc692 Mon Sep 17 00:00:00 2001
From: yufei_wang <2267742828@qq.com>
Date: Tue, 18 Feb 2025 11:25:23 +0800
Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E7=BA=BF=E7=BB=93=E7=AE=97=E9=85=8D?=
 =?UTF-8?q?=E7=BD=AE=E7=AE=A1=E7=90=86?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/api/wms/settlementConfiguration/index.ts  |   4 +
 src/components/BasicForm/src/BasicForm.vue    |   1 +
 .../settlementConfiguration/index.vue         | 219 +++++++++++++++---
 .../settlementConfiguration.data.ts           | 177 +++++++++++---
 4 files changed, 340 insertions(+), 61 deletions(-)

diff --git a/src/api/wms/settlementConfiguration/index.ts b/src/api/wms/settlementConfiguration/index.ts
index 6a75bd7c4..6b7ef57ab 100644
--- a/src/api/wms/settlementConfiguration/index.ts
+++ b/src/api/wms/settlementConfiguration/index.ts
@@ -26,6 +26,10 @@ export const getSettlementConfiguration = async (id: number) => {
   return await request.get({ url: `/wms/settlement-configuration/get?id=` + id })
 }
 
+export const editSettlementConfiguration = async (id: number) => {
+  return await request.get({ url: `/wms/settlement-configuration/editView?id=` + id })
+}
+
 // 新增上线结算配置
 export const createSettlementConfiguration = async (data: SettlementConfigurationVO) => {
   return await request.post({ url: `/wms/settlement-configuration/create`, data })
diff --git a/src/components/BasicForm/src/BasicForm.vue b/src/components/BasicForm/src/BasicForm.vue
index fbc4bb175..3e61da23b 100644
--- a/src/components/BasicForm/src/BasicForm.vue
+++ b/src/components/BasicForm/src/BasicForm.vue
@@ -78,6 +78,7 @@
           <el-input v-model="formSchema.value" v-if="isDetail && formTypeDetail == 'InputString'" />
         </template>
       </Form>
+      <slot name="tableForm"></slot>
       <Tabs ref="tabRef" v-if="includeCollectionTable&&formType=='create'&&tableAllSchemas&&tableAllSchemas.tableFormColumns.find(item=>item.field == 'itemCode')" :tabsList="[{
         label: '明细',
         prop: 'TableForm'
diff --git a/src/views/wms/issueManage/onlinesettlement/settlementConfiguration/index.vue b/src/views/wms/issueManage/onlinesettlement/settlementConfiguration/index.vue
index a83603ffd..6e05b7db3 100644
--- a/src/views/wms/issueManage/onlinesettlement/settlementConfiguration/index.vue
+++ b/src/views/wms/issueManage/onlinesettlement/settlementConfiguration/index.vue
@@ -39,16 +39,71 @@
   </ContentWrap>
 
   <!-- 表单弹窗:添加/修改 -->
-  <BasicForm
+  <BasicForm basicFormWidth="68"
     ref="basicFormRef"
-    @success="formsSuccess"
+    @success="submitForm"
     :rules="SettlementConfigurationRules"
     :formAllSchemas="SettlementConfiguration.allSchemas"
     :apiUpdate="SettlementConfigurationApi.updateSettlementConfiguration"
     :apiCreate="SettlementConfigurationApi.createSettlementConfiguration"
     @searchTableSuccess="searchTableSuccess"
     :isBusiness="false"
-  />
+  >
+  <template #tableForm>
+    <!-- 来源库位 -->
+    <template style="display: flex; flex-direction: row;">
+      <div>
+        <span style="font-weight: bold; margin-left: 10px;">来源仓库</span>
+        <ContentWrap style="margin-right: 20px;margin-top: 5px;">
+          <TableForm
+            ref="tableFormFromRef"
+            class="w-[100%]"
+            :isShowButton="true"
+            :isShowReduceButtonSelection="true"
+            :tableFields="SettlementConfigurationDetail.allSchemas.tableFormColumns"
+            :tableData="tableDataFrom"
+            :tableFormRules="SettlementConfigurationDetailRules"
+            @handleAddTable="handleAddTable('from')"
+            @handleDeleteTable="(item, index)=>handleDeleteTable(item, index,'from')"
+            @tableSelectionDelete="(selection)=>tableSelectionDelete(selection,'from')"
+            @inpuFocus="inpuFocus"
+            @inputStringBlur="inputStringBlur"
+            :routeName="routeName"
+          >
+            <!-- <template v-slot="{ row }">
+              <slot :row="row"></slot>
+            </template> -->
+          </TableForm>
+      </ContentWrap>
+    </div>
+    <div>
+      <span style="font-weight: bold; margin-left: 10px;">目标仓库</span>
+      <ContentWrap style="margin-right: 20px;margin-top: 5px;">
+        <TableForm
+          ref="tableFormToRef"
+          class="w-[100%]"
+          :isShowButton="true"
+          :isShowReduceButtonSelection="true"
+          :tableFields="SettlementConfigurationDetail.allSchemas.tableFormColumns"
+          :tableData="tableDataTo"
+          :tableFormRules="SettlementConfigurationDetailRules"
+          @handleAddTable="handleAddTable('to')"
+          @handleDeleteTable="(item, index)=>handleDeleteTable(item, index,'to')"
+          @tableSelectionDelete="(selection)=>tableSelectionDelete(selection,'to')"
+          @inpuFocus="inpuFocus"
+          @inputStringBlur="inputStringBlur"
+          :routeName="routeName"
+        >
+          <!-- <template v-slot="{ row }">
+            <slot :row="row"></slot>
+          </template> -->
+        </TableForm>
+      </ContentWrap>
+    </div>
+    </template>
+  </template>
+
+  </BasicForm>
 
   <!-- 详情 -->
   <Detail ref="detailRef" :isBasic="true" :allSchemas="SettlementConfiguration.allSchemas" />
@@ -59,13 +114,17 @@
 
 <script setup lang="ts">
 import download from '@/utils/download'
-import { SettlementConfiguration,SettlementConfigurationRules } from './settlementConfiguration.data'
+import { SettlementConfiguration,SettlementConfigurationRules,SettlementConfigurationDetail,SettlementConfigurationDetailRules } from './settlementConfiguration.data'
 import * as SettlementConfigurationApi from '@/api/wms/settlementConfiguration'
 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 { Warehouse } from '@/views/wms/basicDataManage/factoryModeling/warehouse/warehouse.data'
+import * as WarehouseApi from '@/api/wms/warehouse'
+
 
+// 上线结算配置管理
 defineOptions({ name: 'SettlementConfiguration' })
 
 const message = useMessage() // 消息弹窗
@@ -76,15 +135,129 @@ const routeName = ref()
 routeName.value = route.name
 const tableColumns = ref(SettlementConfiguration.allSchemas.tableColumns)
 
+  // 主子数据 提交
+  const submitForm = async (formType, submitData) => {
+  let data = {...submitData}
+  if(data.masterId){
+    data.id = data.masterId
+  }
+  data.fromWarehouseCode = tableDataFrom.value.map(item=>(item['warehouseCode'])).join(',') // 拼接子表数据参数
+  data.toWarehouseCode = tableDataTo.value.map(item=>(item['warehouseCode'])).join(',') // 拼接子表数据参数
+  console.log('新增参数',data)
+  try {
+    if (formType === 'create') {
+      await SettlementConfigurationApi.createSettlementConfiguration(data)
+      message.success(t('common.createSuccess'))
+    } else {
+      await SettlementConfigurationApi.updateSettlementConfiguration(data)
+      message.success(t('common.updateSuccess'))
+    }
+    basicFormRef.value.dialogVisible = false
+    // 刷新当前列表
+    getList()
+  } finally {
+    basicFormRef.value.formLoading = false
+  }
+}
+
+const tableFormKeys = {}
+SettlementConfigurationDetail.allSchemas.tableFormColumns.forEach((item) => {
+  tableFormKeys[item.field] = item.default ? item.default : ''
+})
 // 查询页面返回
-const searchTableSuccess = (formField, searchField, val, formRef) => {
+const searchTableSuccess = (formField, searchField, val, formRef, type, row) => {
+
+  console.log('searchTableSuccess',formField, searchField, val, formRef, type, row )
   nextTick(() => {
-    const setV = {}
-    setV[formField] = val[0][searchField]
-    formRef.setValues(setV)
+    if (formField == 'warehouseCode') {
+      if(addType.value== 'from'){
+        // 来源
+        let warehouseCodes = val.filter(item=>tableDataFrom.value.find(item1=>item1['warehouseCode']==item['code']))
+        if(warehouseCodes.length>0){
+          warehouseCodes = warehouseCodes.map(item=>(item.code))
+          message.warning(`仓库代码${warehouseCodes.join(',')}已经存在`)
+        }
+        val = val.filter(item=>!tableDataFrom.value.find(item1=>item1['warehouseCode']==item['code']))
+        if(val.length==0) return
+        val.forEach(item=>{
+          const newRow = JSON.parse(JSON.stringify({...tableFormKeys,...item}))
+          newRow['warehouseCode'] = item['code']
+          newRow['warehouseName'] = item['name']
+          tableDataFrom.value.push(newRow)
+        })
+      }else{
+        // 目标
+        let warehouseCodes = val.filter(item=>tableDataTo.value.find(item1=>item1['warehouseCode']==item['code']))
+        if(warehouseCodes.length>0){
+          warehouseCodes = warehouseCodes.map(item=>(item.code))
+          message.warning(`仓库代码${warehouseCodes.join(',')}已经存在`)
+        }
+        val = val.filter(item=>!tableDataTo.value.find(item1=>item1['warehouseCode']==item['code']))
+        if(val.length==0) return
+        val.forEach(item=>{
+          const newRow = JSON.parse(JSON.stringify({...tableFormKeys,...item}))
+          newRow['warehouseCode'] = item['code']
+          newRow['warehouseName'] = item['name']
+          tableDataTo.value.push(newRow)
+        })
+      }
+    }else{
+      const setV = {}
+      setV[formField] = val[0][searchField]
+      if(formField == 'supplierCode'){
+        setV['supplierName'] = val[0]['name']
+      }else if(formField == 'itemCode'){
+        setV['itemName'] = val[0]['itemName']
+        setV['itemDesc1'] = val[0]['itemDesc1']
+        setV['itemDesc2'] = val[0]['itemDesc2']
+      }
+      formRef.setValues(setV)
+    }
+    
   })
 }
-
+// 来源库位
+const tableDataFrom = ref([])
+// 目标库位
+const tableDataTo = ref([])
+const addType = ref('')
+const handleAddTable = (type)=>{
+  addType.value = type
+  //供应商代码
+  basicFormRef.value.opensearchTable('warehouseCode', 'code', '仓库信息', Warehouse.allSchemas, WarehouseApi.getWarehousePage,[{
+    key: 'available',
+    value: 'TRUE',
+    isMainValue: false
+  }],true,'tableForm1')
+  //修改弹窗宽度
+  basicFormRef.value.changeDialogWidth('1085px')
+}
+ // 删除明细
+ const handleDeleteTable = (item, index, type) => {
+    if(type == 'from'){
+    // 来源
+    tableDataFrom.value.splice(index, 1)
+  }else {
+    // 目标
+    tableDataTo.value.splice(index, 1)
+  }
+}
+// 批量删除
+const tableSelectionDelete = (selection,type) => {
+  if(type == 'from'){
+    // 来源
+    tableDataFrom.value = tableDataFrom.value.filter(item => !selection.includes(item))
+  }else{
+    // 目标
+    tableDataTo.value = tableDataTo.value.filter(item => !selection.includes(item))
+  }
+}
+const inpuFocus = ()=>{
+  
+}
+const inputStringBlur = ()=>{
+  
+}
 // 字段设置 更新主列表字段
 const updataTableColumns = (val) => {
   tableColumns.value = val
@@ -140,6 +313,10 @@ const butttondata = [
 // 列表-操作按钮事件
 const buttonTableClick = async (val, row) => {
   if (val == 'edit') { // 编辑
+    let res = await SettlementConfigurationApi.editSettlementConfiguration(row.id)
+    console.log('编辑',res)
+    tableDataFrom.value = res.fromWarehouseCodeList
+    tableDataTo.value = res.toWarehouseCodeList
     openForm('update', row)
   } else if (val == 'delete') { // 删除
     handleDelete(row.id)
@@ -152,29 +329,7 @@ const openForm = (type: string, row?: any) => {
   basicFormRef.value.open(type, row)
 }
 
-// form表单提交
-const formsSuccess = async (formType,data) => {
-  var isHave =SettlementConfiguration.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 SettlementConfigurationApi.createSettlementConfiguration(data)
-    message.success(t('common.createSuccess'))
-  } else {
-    await SettlementConfigurationApi.updateSettlementConfiguration(data)
-    message.success(t('common.updateSuccess'))
-  }
-  basicFormRef.value.dialogVisible = false
-  getList()
-}
+
 
 /** 详情操作 */
 const detailRef = ref()
diff --git a/src/views/wms/issueManage/onlinesettlement/settlementConfiguration/settlementConfiguration.data.ts b/src/views/wms/issueManage/onlinesettlement/settlementConfiguration/settlementConfiguration.data.ts
index 0fc48c77b..7764c1f8e 100644
--- a/src/views/wms/issueManage/onlinesettlement/settlementConfiguration/settlementConfiguration.data.ts
+++ b/src/views/wms/issueManage/onlinesettlement/settlementConfiguration/settlementConfiguration.data.ts
@@ -1,5 +1,11 @@
 import type { CrudSchema } from '@/hooks/web/useCrudSchemas'
 import { dateFormatter } from '@/utils/formatTime'
+import * as SupplierApi from '@/api/wms/supplier'
+import { Supplier } from '@/views/wms/basicDataManage/supplierManage/supplier/supplier.data'
+import * as SupplieritemApi from '@/api/wms/supplieritem'
+import { Supplieritem} from '@/views/wms/basicDataManage/supplierManage/supplieritem/supplieritem.data'
+import { Warehouse } from '@/views/wms/basicDataManage/factoryModeling/warehouse/warehouse.data'
+import * as WarehouseApi from '@/api/wms/warehouse'
 
 // 表单校验
 export const SettlementConfigurationRules = reactive({
@@ -18,28 +24,89 @@ export const SettlementConfiguration = useCrudSchemas(reactive<CrudSchema[]>([
     field: 'supplierCode',
     sort: 'custom',
     isSearch: true,
+    form: {
+      componentProps: {
+        enterSearch:true,
+        isSearchList: true, // 开启查询弹窗
+        searchListPlaceholder: '请选择供应商代码', // 输入框占位文本
+        searchField: 'code', // 查询弹窗赋值字段
+        searchTitle: '供应商信息', // 查询弹窗标题
+        searchAllSchemas: Supplier.allSchemas, // 查询弹窗所需类
+        searchPage: SupplierApi.getSupplierPage, // 查询弹窗所需分页方法
+        searchCondition: [{
+          key: 'available',
+          value: 'TRUE',
+          isMainValue: false
+        }],
+        verificationParams: [{
+          key: 'code',
+          action: '==',
+          value: '',
+          isMainValue: false,
+          isSearch: true,
+          isFormModel: true,
+        }], // 失去焦点校验参数
+      }
+    },
   },
   {
     label: '供应商名称',
     field: 'supplierName',
     sort: 'custom',
+    form: {
+      componentProps: {
+        disabled: true
+      }
+    }
   },
   {
     label: '物料代码',
     field: 'itemCode',
     sort: 'custom',
     isSearch: true,
+    form: {
+      componentProps: {
+        enterSearch:true,
+        isSearchList: true, // 开启查询弹窗
+        searchListPlaceholder: '请选择物料代码', // 输入框占位文本
+        searchField: 'itemCode', // 查询弹窗赋值字段
+        searchTitle: '供应商物料信息', // 查询弹窗标题
+        searchAllSchemas: Supplieritem.allSchemas, // 查询弹窗所需类
+        searchPage: SupplieritemApi.getSupplieritemPage, // 查询弹窗所需分页方法
+        searchCondition: [{
+          key: 'supplierCode',
+          value: 'supplierCode',
+          message: '请填写供应商代码!',
+          isMainValue: true,
+          isCSV:true,//是否用逗号分隔参数
+        },{
+          key: 'available',
+          value: 'TRUE',
+          isMainValue: false
+        }]
+      }
+    }
   },
   {
     label: '物品名称',
     field: 'itemName',
     sort: 'custom',
     isSearch: true,
+    form: {
+      componentProps: {
+        disabled: true
+      }
+    }
   },
   {
     label: '物品描述',
     field: 'itemDesc1',
     sort: 'custom',
+    form: {
+      componentProps: {
+        disabled: true
+      }
+    }
   },
   {
     label: '物品描述2',
@@ -48,24 +115,24 @@ export const SettlementConfiguration = useCrudSchemas(reactive<CrudSchema[]>([
     isTable: false,
     isForm: false,
   },
-  {
-    label: '来源仓库',
-    field: 'fromWarehouseCode',
-    sort: 'custom',
-    isSearch: true,
-  },
-  {
-    label: '目标仓库',
-    field: 'toWarehouseCode',
-    sort: 'custom',
-    isSearch: true,
-  },
-  {
-    label: '备注',
-    field: 'remark',
-    sort: 'custom',
-    isSearch: true,
-  },
+  // {
+  //   label: '来源仓库',
+  //   field: 'fromWarehouseCode',
+  //   sort: 'custom',
+  //   isSearch: true,
+  // },
+  // {
+  //   label: '目标仓库',
+  //   field: 'toWarehouseCode',
+  //   sort: 'custom',
+  //   isSearch: true,
+  // },
+  // {
+  //   label: '备注',
+  //   field: 'remark',
+  //   sort: 'custom',
+  //   isSearch: true,
+  // },
   {
     label: '创建时间',
     field: 'createTime',
@@ -82,17 +149,17 @@ export const SettlementConfiguration = useCrudSchemas(reactive<CrudSchema[]>([
     },
     isForm: false,
   },
-  {
-    label: '并发乐观锁',
-    field: 'concurrencyStamp',
-    sort: 'custom',
-    isSearch: false,
-    isTable: false,
-    form: {
-      component: 'InputNumber',
-      value: 0
-    },
-  },
+  // {
+  //   label: '并发乐观锁',
+  //   field: 'concurrencyStamp',
+  //   sort: 'custom',
+  //   isSearch: false,
+  //   isTable: false,
+  //   form: {
+  //     component: 'InputNumber',
+  //     value: 0
+  //   },
+  // },
   {
     label: '操作',
     field: 'action',
@@ -103,3 +170,55 @@ export const SettlementConfiguration = useCrudSchemas(reactive<CrudSchema[]>([
     }
   }
 ]))
+
+export const SettlementConfigurationDetail = useCrudSchemas(reactive<CrudSchema[]>([
+  {
+    label: '仓库代码',
+    field: 'warehouseCode',
+    sort: 'custom',
+    tableForm:{
+      multiple:true,//多选
+      enterSearch: false,
+      isInpuFocusShow: false, // 开启查询弹窗
+      disabled: true,
+      searchListPlaceholder: '请选择仓库代码',
+      searchField: 'code',
+      searchTitle: '仓库信息',
+      searchAllSchemas: Warehouse.allSchemas,
+      searchPage: WarehouseApi.getWarehousePage,
+      searchCondition: [
+        {
+          key: 'available',
+          value: 'TRUE',
+          isMainValue: false
+        }
+      ],
+      verificationParams: [
+        {
+          key: 'code',
+          action: '==',
+          value: '',
+          isMainValue: false,
+          isSearch: true,
+          isFormModel: true
+        }
+      ] // 失去焦点校验参数
+    },
+  },
+  {
+    label: '仓库名称',
+    field: 'warehouseName',
+    sort: 'custom',
+    tableForm:{
+      disabled: true
+    }
+  },
+]))
+
+
+//表单校验
+export const SettlementConfigurationDetailRules = reactive({
+  fromWarehouseCode: [
+    { required: true, message: '请选择来源仓库', trigger: 'change' }
+  ],
+})