<template> <a-modal title="选择合同(Select Contract)" width="95%" :visible="visible" :maskClosable="false" switchFullscreen @ok = "handleOk" @cancel="handleCancel"> <div> <a-card :body-style="{ padding: '10px' }" :bordered="false" style="margin: 10px;" > <div class="table-page-search-wrapper"> <a-form :model="queryParams" @keyup.enter.native="searchQuery" :label-col="{ style: 'width: 200px' }"> <a-row :gutter="24"> <a-col :md="6" :sm="8"> <a-form-item label="合同编码(contract code)"> <j-input placeholder="请输入" v-model:value="queryParams.billCode"></j-input> </a-form-item> </a-col> <a-col :md="6" :sm="8"> <a-form-item name="billDate"> <template #label><span title="单据日期(bill date)">单据日期(bill date)</span></template> <a-range-picker value-format="YYYY-MM-DD" v-model:value="billDate" class="query-group-cust" @change="changeBillDate"/> </a-form-item> </a-col> <template v-if="toggleSearchStatus"> <a-col :md="6" :sm="8"> <a-form-item label="项目(project)"> <ApiSelect :api="ProjectOption" showSearch v-model:value="queryParams.quotationProject" optionFilterProp="label" resultField="records" labelField="code" valueField="id" :params='{pageSize:-1}' :disabled="fatherProject!==''" /> </a-form-item> </a-col> <a-col :md="6" :sm="8"> <a-form-item label="产品分类(production class)"> <ApiSelect :api="ClassList" showSearch v-model:value="queryParams.productionClass" optionFilterProp="label" resultField="records" labelField="name" valueField="id" :params='{pageSize:-1}' /> </a-form-item> </a-col> <a-col :md="6" :sm="8"> <a-form-item label="优先级(priority)" > <JDictSelectTag v-model:value="queryParams.priority" placeholder="请选择" dictCode="priority"/> </a-form-item> </a-col> <a-col :md="12" :sm="16"> <a-form-item label="客户(customer)"> <JSelect v-model:value="queryParams.quotationCustomer" :get-option-url="CustomerOption" :showField="showField"></JSelect> </a-form-item> </a-col> <a-col :md="6" :sm="8"> <a-form-item label="机型(model)"> <JDictSelectTag v-model:value="queryParams.headModel" placeholder="请选择" dictCode="model_typer" style="width: 100%;"/> </a-form-item> </a-col> <a-col :md="6" :sm="8"> <a-form-item label="产品英文名(English name)"> <j-input placeholder="请输入" v-model:value="queryParams.englishName"></j-input> </a-form-item> </a-col> <a-col :md="6" :sm="8"> <a-form-item label="产品编码(product code)"> <j-input placeholder="请输入" v-model:value="queryParams.productCode"></j-input> </a-form-item> </a-col> <a-col :md="6" :sm="8"> <a-form-item label="型号(model)"> <j-input placeholder="请输入" v-model:value="queryParams.childModel"></j-input> </a-form-item> </a-col> <a-col :md="6" :sm="8"> <a-form-item label="业务员(salesman)" > <j-input placeholder="请输入" v-model:value="queryParams.salesman"></j-input> </a-form-item> </a-col> <a-col :md="6" :sm="8"> <a-form-item label="销售部门(sale department)"> <j-input placeholder="请输入" v-model:value="queryParams.saleDepartment"></j-input> </a-form-item> </a-col> </template> <a-col :md="6" :sm="8"> <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons"> <a-button type="primary" @click="searchQuery" >查询(search)</a-button> <a-button type="primary" @click="searchReset" style="margin-left: 8px">重置(reset)</a-button> <a @click="handleToggleSearch" style="margin-left: 8px"> {{ toggleSearchStatus ? '收起' : '展开' }} <a-icon :type="toggleSearchStatus ? 'up' : 'down'" /> </a> </span> </a-col> </a-row> </a-form> </div> </a-card> <a-card :body-style="{ padding: '10px' }" :bordered="false" style="margin: 10px;"> <a-alert type="info" show-icon class="alert" style="margin-bottom: 8px"> <template #message> <template v-if="selectedRowKeys.length > 0"> <span>已选中 {{ selectedRowKeys.length }} 条记录</span> <a-divider type="vertical" /> <a @click="selectedRowKeys = []">清空</a> </template> <template v-else> <span>未选中任何数据</span> </template> </template> </a-alert> <a-table :columns="columns" :row-key="record => record.childId" :data-source="dataSource" bordered size="small" @change="handleTableChange" :pagination="pagination" :scroll="{ x: 3500, y: 400 }" :rowSelection="{ onSelect: onSelect, onSelectAll: onSelectAll,selectedRowKeys: selectedRowKeys, onChange: onSelectChange }" > </a-table> </a-card> </div> </a-modal> </template> <script lang="ts" setup> import {ref, reactive } from 'vue'; import { defHttp } from '/@/utils/http/axios'; import { message } from 'ant-design-vue'; import { filterObj, getFileAccessHttpUrl } from '/@/utils/common/compUtils'; import { JDictSelectTag,ApiSelect,JInput,JSelect} from '/@/components/Form'; import {ProjectOption,CustomerOption,ClassList} from '../saleCode/salesOrder/SaleOrderyForm.api'; const emit = defineEmits([ 'selectContract']); //定义emit var showField = ref('currency+name'); let classOption = ref([]) var visible = ref(false) var fatherProject = ref('') var fatherSourceCode = ref('') const columns = [ { type: 'selection', fixed: 'left', width:0 }, { title: '合同编码(bill code)', dataIndex: 'billCode', key: 'billCode', align:"center", width:250, }, { title: '单据日期(bill date)', dataIndex: 'billDate', key: 'billDate', align:"center" }, { title: '项目(project)', dataIndex: 'quotationProjectName', key: 'quotationProjectName', align:"center", ellipsis: true, }, { title: '客户(custormer)', dataIndex: 'quotationCustomerName', key: 'quotationCustomerName', align:"center",ellipsis: true, }, { title: '优先级(priority)', dataIndex: 'priority', key: 'priority', align:"center" }, { title: '产品分类(production class)', dataIndex: 'productionClass_dictText', key: 'productionClass_dictText', align:"center", width:250, }, { title: '机型(model)', dataIndex: 'headModel', key: 'headModel', align:"center" }, { title: '销售部门(sale department)', dataIndex: 'saleDepartment', key: 'saleDepartment', align:"center", width:250, }, { title: '业务员(salesman)', dataIndex: 'salesman', key: 'salesman', align:"center" }, { title: '产品编码(product code)', dataIndex: 'productCode', key: 'productCode', align:"center", width:250, }, { title: '产品英文名(English name)', key: 'englishName', dataIndex: 'englishName', align:"center", width:250, }, // { // title: '规格(specifications)', // key: 'specifications', // dataIndex: 'specifications', // align:"center" // }, { title: '型号(model)', key: 'childModel', dataIndex: 'childModel', align:"center" }, { title: '厂家(factory)', key: 'factory', dataIndex: 'factory', align:"center", width:250 }, { title: '质量等级(quantity grade)', key: 'quantityGrade', dataIndex: 'quantityGrade', align:"center", width:250, }, { title: '数量(quanlity)', key: 'quanlity', dataIndex: 'quanlity', align:"center", width:250, }, { title: '单价(price)', key: 'taxPrice', dataIndex: 'taxPrice', align:"center", width:250, }, { title: '价税合计(tax money)', key: 'taxMoney', dataIndex: 'taxMoney', align:"center", width:250, }, ]; const labelCol = ref({ xs: { span: 24 }, sm: { span: 9 }, }); const wrapperCol = ref({ xs: { span: 24 }, sm: { span: 15 }, }); const labelCol1 = ref({ xs: { span: 24 }, sm: { span: 12 }, }); const wrapperCol1 = ref({ xs: { span: 24 }, sm: { span: 12 }, }); const dataSource =ref([]); let selectedRowKeys = ref([]); let selectionRows = ref([]); const toggleSearchStatus = ref(false); var billDate = ref([]) const queryParams = ref({ billCode:'', quotationProject:'', quotationProjectName:'', productionClass:'', priority:'', quotationCustomer:'', quotationCustomerName:'', headModel:'', englishName:'', productCode:'', childModel:'', saleDepartment:'', salesman:'', billDate_begin:'', billDate_end:'', }); let pagination = ref({ current: 1, pageSize: 10, total: '', // 假设总共有100条数据 showSizeChanger: true, showQuickJumper: true, showTotal: (total, range) => { return range[0] + "-" + range[1] + " 共" + total + "条" }, size:'small' }); function loadData(){ let params = getQueryParams(); defHttp .get({ url: '/saleCode/saleContract/selectContractDetailAlert',params}, { isTransformResponse: false }) .then((res) => { if (res.success) { dataSource.value = res.result.records; pagination.value.total = res.result.total; pagination.value.current = res.result.current; pagination.value.pageSize = res.result.size; } else { message.error(res.message); } }) .finally(() => { // loading.value = false; }); } function getQueryParams(){ let params = Object.assign(queryParams.value); params.pageNo = pagination.value.current; params.pageSize = pagination.value.pageSize; if(fatherProject.value&&fatherProject.value!==''){ queryParams.value.quotationProject = fatherProject.value }else { queryParams.value.quotationProject = params.quotationProject } return filterObj(params); } function handleTableChange(paginations, filters, sorter){ pagination.value.total = paginations.total; pagination.value.current = paginations.current; pagination.value.pageSize = paginations.pageSize; loadData() }; function getOptiom(){ defHttp .get({ url: 'baseCode/baseProductClass/list'}, { isTransformResponse: false }) .then((res) => { if (res.success) { classOption.value = [] res.result.records.forEach(element => { var obj = { label: element.name?element.name:'无名称请维护', value: element.id?element.id:'' }; classOption.value.push( obj) }); } }) .finally(() => { // loading.value = false; }); } function searchQuery(){ pagination.value.current = 1 selectedRowKeys.value = [] selectionRows.value=[] loadData(); } function searchReset(){ billDate.value = [] queryParams.value = { billCode:'', quotationProject:'', quotationProjectName:'', productionClass:'', priority:'', quotationCustomer:'', quotationCustomerName:'', headModel:'', englishName:'', productCode:'', childModel:'', saleDepartment:'', salesman:'', billDate_begin:'', billDate_end:'', } pagination.value.current =1; pagination.value.pageSize = 10; selectedRowKeys.value = [] selectionRows.value=[] loadData(); } function handleToggleSearch(){ toggleSearchStatus.value = !toggleSearchStatus.value; } function onSelectChange(selectedRowKeys1, selectionRows1) { var arr = [] selectionRows.value.map(item=>{ arr.push(item.childId) }) selectedRowKeys.value = arr } function onSelect(record, selected, selectionRows1, nativeEvent) { if (selected) { selectionRows.value.push(record) console.log( selectionRows.value); }else{ const delIndex = selectionRows.value.findIndex((val) => { return val.childId === record.childId }) selectionRows.value.splice(delIndex, 1) } } function onSelectAll(selected, selectionRows1, changeRows) { if (selected) { selectionRows.value = selectionRows.value.concat(changeRows) } if (!selected) { let selectionRows2 = JSON.parse(JSON.stringify(selectionRows.value)) const delIndex = [] selectionRows2.forEach((item, index) => { changeRows.forEach((val, itemIndex) => { if (item.childId === val.childId) { delIndex.push(index) } }) }) delIndex.forEach((item) => { delete selectionRows2[item] }) selectionRows2 = selectionRows2.filter((item) => { return item !== undefined }) selectionRows.value = selectionRows2 } } function handleOk(){ var arr = [] selectionRows.value.map(item=>arr.push(item.billCode)) if(fatherSourceCode.value&&fatherSourceCode.value!==''){ arr.push(fatherSourceCode.value) } if(selectedRowKeys.value.length==0){ message.error('请勾选数据'); }else if(new Set(arr).size!==1){ message.error('请勾选合同编号相同的数据'); }else{ emit('selectContract', selectionRows.value) handleCancel() } } function handleCancel(){ visible.value = false selectedRowKeys.value = [] selectionRows.value=[] billDate.value = [] queryParams.value = { billCode:'', quotationProject:'', quotationProjectName:'', productionClass:'', priority:'', quotationCustomer:'', quotationCustomerName:'', headModel:'', englishName:'', productCode:'', childModel:'', saleDepartment:'', salesman:'', billDate_begin:'', billDate_end:'', } pagination.value.current =1; pagination.value.pageSize = 10; } function getTable(formData){ visible.value = true if(formData.projectName&&formData.projectName!==''){ fatherProject.value = formData.project }else{ fatherProject.value = '' } if(formData.sourceCode2&&formData.sourceCode2!==''){ fatherSourceCode.value = formData.sourceCode2 }else{ fatherSourceCode.value = '' } loadData() getOptiom() } function changeBillDate(prop){ if(prop){ billDate.value = prop queryParams.value.billDate_begin = prop[0] queryParams.value.billDate_end = prop[1] }else{ billDate.value = [] queryParams.value.billDate_begin = '' queryParams.value.billDate_end = '' } } defineExpose({ getTable }); </script> <style scoped lang="less"> /deep/.ant-form-item{ margin-bottom: 8px !important; } // /deep/.ant-table-wrapper .ant-table-thead > tr > th, .ant-table-wrapper .ant-table-thead > tr > td{ // padding: 8px !important; // } </style>