jingbb 6 mesiacov pred
rodič
commit
8c0293e9fe

+ 107 - 0
src/views/publicComponents/BaseShipArchiveAccessoriesModal.vue

@@ -0,0 +1,107 @@
+<template>
+  <div ref="accessoriesDetailsRef">
+      <a-modal
+            title="配件明细(accessories details)"
+            width="70%"
+            :visible="visible"
+            :maskClosable="false"
+            :getContainer ='()=>$refs.accessoriesDetailsRef'
+            switchFullscreen
+            @cancel="handleCancel">
+              <div>
+                <a-table
+                      :columns="columns"
+                      :row-key="record => record.id"
+                      :data-source="dataSource"
+                      bordered
+                      size="small"
+                      height="500"
+                      :pagination="false"
+                      :scroll="{ x: 1000, y: 500 }"
+                  > 
+                      <template #attachs="{ text, record,index }">
+                          <a :href="baseUrl+record.attachs">{{record.attachs}}</a>
+                      </template>
+                  </a-table>
+              </div>
+        </a-modal>
+  </div>
+</template>
+
+<script lang="ts" setup>
+    import {ref, computed, unref,reactive} from 'vue';
+    import { useGlobSetting } from '/@/hooks/setting';
+    import {defHttp} from '/@/utils/http/axios';
+    const { domainUrl } = useGlobSetting();
+    var visible = ref(false);
+    var columns = ref([
+          {
+          title: '配件类型(accessory type)',
+          align:"center",
+          dataIndex: 'accessoryType',
+          key: 'accessoryType'
+        },
+        {
+          title: '规格(specifications)',
+          align:"center",
+          dataIndex: 'specifications',
+          key: 'specifications'
+        },
+        {
+          title: '型号(model)',
+          align:"center",
+          dataIndex: 'model',
+          key: 'model'
+        },
+        {
+          title: '序列号(serial number)',
+          align:"center",
+          dataIndex: 'serialNumber',
+          key: 'serialNumber'
+        },
+        {
+          title: '备注(notes)',
+          align:"center",
+          dataIndex: 'notes',
+          key: 'notes'
+        },
+        {
+          title: '附件(attachs)',
+          align:"center",
+          dataIndex: 'attachs',
+          key: 'attachs',
+          slots: { customRender: 'attachs' },
+        },
+    ])
+    var dataSource=ref([])
+    const baseUrl = domainUrl + '/sys/common/static/';
+    function getTable(record){
+        visible.value = true
+        let params={headId:record.id}
+        defHttp.get({url:"/baseCode/baseShipArchiveAccessories/list",params}).then(res=>{
+        if(res){
+          dataSource.value = res.records
+        }
+    })
+    }
+    function handleCancel(){
+      visible.value = false;
+    }
+    defineExpose({
+      getTable
+    });
+  </script>
+
+<style lang="less" scoped>
+	/** 时间和数字输入框样式 */
+  :deep(.ant-input-number) {
+    width: 100%;
+  }
+
+  :deep(.ant-calendar-picker) {
+    width: 100%;
+  }
+  /deep/.ant-modal-body{
+    padding: 14px !important;
+  }
+</style>

+ 443 - 0
src/views/publicComponents/SelectContractModal.vue

@@ -0,0 +1,443 @@
+<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" :label-col="labelCol" :wrapper-col="wrapperCol" @keyup.enter.native="searchQuery">
+                <a-row :gutter="24">
+                    <a-col :md="6" :sm="8">
+                        <a-form-item label="合同编码(contract code)">
+                            <a-input placeholder="请输入" v-model:value="queryParams.billCode"></a-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="queryParams.billDate" class="query-group-cust"/>
+                        </a-form-item>
+                    </a-col> 
+                    <template v-if="toggleSearchStatus">
+                        <a-col :md="6" :sm="8">
+                            <a-form-item label="项目(project)">
+                                <a-input placeholder="请输入" v-model:value="queryParams.quotationProject" :disabled="fatherProject!==''"></a-input>
+                            </a-form-item>
+                        </a-col>
+                        <a-col :md="6" :sm="8">
+                            <a-form-item label="产品分类(production class)" :label-col="labelCol1" :wrapper-col="wrapperCol1">
+                                <!-- <a-input placeholder="请输入" v-model:value="queryParams.classId"></a-input> -->
+                                <JSelectInput   v-model:value="queryParams.productionClass"  placeholder="请选择" :options="classOption" ></JSelectInput>
+                            </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="6" :sm="8">
+                            <a-form-item label="客户(customer)">
+                                <a-input placeholder="请输入" v-model:value="queryParams.quotationCustomer"></a-input>
+                            </a-form-item>
+                        </a-col>
+                        <a-col :md="6" :sm="8">
+                            <a-form-item label="机型(model)">
+                                <a-input placeholder="请输入" v-model:value="queryParams.headModel"></a-input>
+                            </a-form-item>
+                        </a-col>
+                        
+                        <a-col :md="6" :sm="8">
+                            <a-form-item label="产品英文名(English name)" :label-col="labelCol1" :wrapper-col="wrapperCol1">
+                                <a-input placeholder="请输入" v-model:value="queryParams.englishName"></a-input>
+                            </a-form-item>
+                        </a-col>
+                        <a-col :md="6" :sm="8">
+                            <a-form-item label="产品编码(product code)">
+                                <a-input placeholder="请输入" v-model:value="queryParams.productCode"></a-input>
+                            </a-form-item>
+                        </a-col>
+                        <a-col :md="6" :sm="8">
+                            <a-form-item label="型号(model)">
+                                <a-input placeholder="请输入" v-model:value="queryParams.childModel"></a-input>
+                            </a-form-item>
+                        </a-col>                        
+                        
+                        <a-col :md="6" :sm="8">
+                            <a-form-item label="业务员(salesman)" >
+                                <JDictSelectTag v-model:value="queryParams.salesman" placeholder="请选择" dictCode="yes_or_no"/>
+                            </a-form-item>
+                        </a-col>
+                        <a-col :md="6" :sm="8">
+                            <a-form-item label="销售部门(sale department)" :label-col="labelCol1" :wrapper-col="wrapperCol1">
+                                <JDictSelectTag v-model:value="queryParams.saleDepartment" placeholder="请选择" dictCode="yes_or_no"/>
+                            </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: 300 }"
+                :rowSelection="{ 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} from '/@/components/Form';
+    import JSelectInput from '/@/components/Form/src/jeecg/components/JSelectInput.vue';
+    const emit = defineEmits([ 'selectContract']); //定义emit
+    let classOption = ref([])
+    var visible = ref(false)
+    var fatherProject = ref('')
+    var fatherSourceCode = ref('')
+    const columns = [
+        {
+            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"
+        },
+        {
+            title: '客户(custormer)',
+            dataIndex: 'quotationCustomerName',
+            key: 'quotationCustomerName',
+            align:"center"
+        },
+        {
+            title: '优先级(priority)',
+            dataIndex: 'priority',
+            key: 'priority',
+            align:"center"
+        },
+        {
+            title: '产品分类(production class)',
+            dataIndex: 'productClass',
+            key: 'productClass',
+            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 selectedRows = ref([]);
+    const toggleSearchStatus = ref(false);
+    const queryParams = ref({
+        billCode:'',
+        billDate:'',
+        quotationProject:'',
+        quotationProjectName:'',
+        productionClass:'',
+        priority:'',
+        quotationCustomer:'',
+        quotationCustomerName:'',
+        headModel:'',
+        englishName:'',
+        productCode:'',
+        childModel:'',
+        saleDepartment:'',
+        salesman:'',
+        
+    });
+    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 = ''
+        }
+        return filterObj(params);
+    }
+    function handleTableChange(paginations, filters, sorter){
+        pagination.value.total = paginations.total;
+        pagination.value.current = paginations.current;
+        pagination.value.pageSize = paginations.pageSize;
+        if(fatherProject.value&&fatherProject.value!==''){
+            queryParams.value.quotationProjectName = fatherProject.value
+        }else {
+            queryParams.value.quotationProjectName = ''
+        }
+        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(){
+        loadData();
+    }
+    function searchReset(){
+        queryParams.value = {
+            billCode:'',
+            billDate:'',
+            quotationProject:'',
+            quotationProjectName:'',
+            productionClass:'',
+            priority:'',
+            quotationCustomer:'',
+            quotationCustomerName:'',
+            headModel:'',
+            englishName:'',
+            productCode:'',
+            childModel:'',
+            saleDepartment:'',
+            salesman:'',
+        }
+        pagination.value.current =1;
+        pagination.value.pageSize = 10; 
+        loadData();
+    }
+    function handleToggleSearch(){
+        toggleSearchStatus.value = !toggleSearchStatus.value;
+    }
+    function onSelectChange(keys,rows){
+        selectedRowKeys.value = keys
+        selectedRows.value = rows
+    }
+    function handleOk(){
+        var arr = []
+        selectedRows.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', selectedRows.value)
+            handleCancel()
+        }
+    }
+    function handleCancel(){
+      visible.value = false
+      selectedRowKeys.value = []
+      selectedRows.value=[]
+    }
+    function getTable(formData){r
+        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()
+    }
+    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>

+ 84 - 0
src/views/publicComponents/SelectProjectModal.vue

@@ -0,0 +1,84 @@
+<template>
+    <a-modal
+      title="选择项目(select project)"
+      width="95%"
+      :visible="visible"
+      :maskClosable="false"
+      switchFullscreen
+      @ok = "handleOk"
+      @cancel="handleCancel">
+        <div>
+            <!--引用表格-->
+          <BasicTable @register="registerTable" :rowSelection="rowSelection" size="small">
+          </BasicTable>
+        </div>
+      </a-modal>
+</template>
+<script lang="ts" name="baseCode-baseShipArchive" setup>
+  import {ref, reactive } from 'vue';
+  import {BasicTable} from '/@/components/Table';
+  import { useListPage } from '/@/hooks/system/useListPage'
+  import {columns, searchFormSchema} from './components/BaseProjectArchive.data';
+  import {list} from './components/BaseProjectArchive.api';
+  import { message } from 'ant-design-vue';
+
+  const queryParam = reactive<any>({});
+  var visible = ref(false);
+  const emit = defineEmits([ 'selectProject']); //定义emit
+  //注册table数据
+  const { tableContext} = useListPage({
+      tableProps:{
+           api:list,
+           columns,
+           canResize:false,
+           formConfig: {
+              schemas: searchFormSchema,
+              autoSubmitOnEnter:true,
+              showAdvancedButton:true,
+              fieldMapToNumber: [
+              ],
+              fieldMapToTime: [
+                 ['shipDate', ['shipDate_begin', 'shipDate_end'], 'YYYY-MM-DD HH:mm:ss'],
+              ],
+            },
+           showTableSetting:false,
+           showActionColumn:false,
+           actionColumn: {
+               width: 200,
+               fixed:'right'
+            },
+            beforeFetch: (params) => {
+              return Object.assign(params, queryParam);
+            },
+      }
+  })
+
+  const [registerTable, {reload},{ rowSelection, selectedRowKeys }] = tableContext
+  
+  function handleCancel() {
+    visible.value = false;
+    selectedRowKeys.value = []
+  }
+  function handleOk() {
+        if(selectedRowKeys.value.length!==1){
+          message.warning('请选择一条数据数据')
+        }else{
+            emit('selectProject',rowSelection.selectedRows)
+            handleCancel()
+        }  
+    }
+  function getTable(){
+    visible.value = true
+   }
+   defineExpose({
+    getTable
+  });
+
+
+</script>
+
+<style lang="less" scoped>
+  :deep(.ant-picker),:deep(.ant-input-number){
+    width: 100%;
+  }
+</style>

+ 421 - 0
src/views/publicComponents/SelectQuotationModal.vue

@@ -0,0 +1,421 @@
+<template>
+    <a-modal
+      title="选择报价单(Select Quotation)"
+      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" :label-col="labelCol" :wrapper-col="wrapperCol" @keyup.enter.native="searchQuery">
+                <a-row :gutter="24">
+                    <a-col :md="6" :sm="8">
+                        <a-form-item label="询价单号(bill code)">
+                            <a-input placeholder="请输入" v-model:value="queryParams.billCode"></a-input>
+                        </a-form-item>
+                    </a-col>
+                    <a-col :md="6" :sm="8">
+                        <a-form-item label="单据日期(bill date)">
+                            <a-range-picker value-format="YYYY-MM-DD"  v-model:value="queryParams.billDate" class="query-group-cust"/>
+                        </a-form-item>
+                    </a-col> 
+                    <template v-if="toggleSearchStatus">
+                        <a-col :md="6" :sm="8">
+                            <a-form-item label="项目(project)">
+                                <a-input placeholder="请输入" v-model:value="queryParams.quotationProject" :disabled="fatherProject!==''"></a-input>
+                            </a-form-item>
+                        </a-col>
+                        <a-col :md="6" :sm="8">
+                            <a-form-item label="产品分类(production class)" :label-col="labelCol1" :wrapper-col="wrapperCol1">
+                                <!-- <a-input placeholder="请输入" v-model:value="queryParams.classId"></a-input> -->
+                                <JSelectInput   v-model:value="queryParams.productionClass"  placeholder="请选择" :options="classOption" ></JSelectInput>
+                            </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="6" :sm="8">
+                            <a-form-item label="客户(customer)">
+                                <a-input placeholder="请输入" v-model:value="queryParams.quotationCustomerName"></a-input>
+                            </a-form-item>
+                        </a-col>
+                        <a-col :md="6" :sm="8">
+                            <a-form-item label="机型(model)">
+                                <a-input placeholder="请输入" v-model:value="queryParams.headModel"></a-input>
+                            </a-form-item>
+                        </a-col>
+                        
+                        <a-col :md="6" :sm="8">
+                            <a-form-item label="产品英文名(English name)" :label-col="labelCol1" :wrapper-col="wrapperCol1">
+                                <a-input placeholder="请输入" v-model:value="queryParams.englishName"></a-input>
+                            </a-form-item>
+                        </a-col>
+                        <a-col :md="6" :sm="8">
+                            <a-form-item label="产品编码(product code)">
+                                <a-input placeholder="请输入" v-model:value="queryParams.productCode"></a-input>
+                            </a-form-item>
+                        </a-col>
+                        <a-col :md="6" :sm="8">
+                            <a-form-item label="型号(model)">
+                                <a-input placeholder="请输入" v-model:value="queryParams.childModel"></a-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: 300 }"
+                :rowSelection="{ 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} from '/@/components/Form';
+    import JSelectInput from '/@/components/Form/src/jeecg/components/JSelectInput.vue';
+    const emit = defineEmits([ 'selectQuotation']); //定义emit
+    let classOption = ref([])
+    var visible = ref(false)
+    var fatherProject = ref('')
+    var fatherSourceCode = ref('')
+    const columns = [
+        {
+            title: '报价单号(bill code)',
+            dataIndex: 'billCode',
+            key: 'billCode',
+            align:"center",
+            width:250,
+            
+        },
+        {
+            title: '单据日期(bill date)',
+            dataIndex: 'billDate',
+            key: 'billDate',
+            align:"center"
+        },
+        {
+            title: '报价项目(quotation project)',
+            dataIndex: 'quotationProjectName',
+            key: 'quotationProjectName',
+            align:"center",
+            width:250,
+        },
+        {
+            title: '客户(custormer)',
+            dataIndex: 'quotationCustomerName',
+            key: 'quotationCustomerName',
+            align:"center"
+        },
+        {
+            title: '报价有效期(quotation period)',
+            dataIndex: 'time',
+            key: 'time',
+            align:"center",
+            width:250,
+            customRender:({text,record}) =>{
+                if(record.quotationPeriodBegin&&record.quotationPeriodEnd){
+                    text = record.quotationPeriodBegin+'~'+record.quotationPeriodEnd
+                }else if(!record.quotationPeriodBegin){
+                    text = record.quotationPeriodEnd
+                }else if(!record.quotationPeriodEnd){
+                    text = record.quotationPeriodBegin
+                }else{
+                    text=''
+                }
+                return text;
+            },
+        },
+        {
+            title: '优先级(priority)',
+            dataIndex: 'priority_dictText',
+            key: 'priority_dictText',
+            align:"center"
+        },
+        {
+            title: '产品分类(production class)',
+            dataIndex: 'productionClass',
+            key: 'productionClass',
+            align:"center",
+            width:250,
+        },
+        {
+            title: '机型(model)',
+            dataIndex: 'headModel',
+            key: 'headModel',
+            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: '型号(childModel)',
+            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: 'taxAmount',
+            dataIndex: 'taxAmount',
+            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 selectedRows = ref([]);
+    const toggleSearchStatus = ref(false);
+    const queryParams = ref({
+        billCode:'',
+        billDate:'',
+        quotationProject:'',
+        quotationProjectName:'',
+        productionClass:'',
+        priority:'',
+        quotationCustomerName:'',
+        quotationCustomer:'',
+        headModel:'',
+        englishName:'',
+        productCode:'',
+        childModel:''
+    });
+    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/saleQuotation/saleQuotationDetailsAlert',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 = ''
+        }
+        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(){
+        loadData();
+    }
+    function searchReset(){
+        queryParams.value = {
+            billCode:'',
+            billDate:'',
+            quotationProject:'',
+            quotationProjectName:'',
+            productionClass:'',
+            priority:'',
+            quotationCustomerName:'',
+            quotationCustomer:'',
+            headModel:'',
+            englishName:'',
+            productCode:'',
+            childModel:''
+        }
+        pagination.value.current =1;
+        pagination.value.pageSize = 10; 
+        loadData();
+    }
+    function handleToggleSearch(){
+        toggleSearchStatus.value = !toggleSearchStatus.value;
+    }
+    function onSelectChange(keys,rows){
+        selectedRowKeys.value = keys
+        selectedRows.value = rows
+    }
+    function handleOk(){
+        var arr = []
+        selectedRows.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('selectQuotation', selectedRows.value)
+            handleCancel()
+        }
+    }
+    function handleCancel(){
+      visible.value = false
+      selectedRowKeys.value = []
+      selectedRows.value=[]
+    }
+    function getTable(formData){
+        visible.value = true
+        if(formData.projectName&&formData.projectName!==''){
+            fatherProject.value = formData.project
+        }else{
+            fatherProject.value = ''
+        }
+        if(formData.sourceCode&&formData.sourceCode!==''){
+            fatherSourceCode.value = formData.sourceCode
+        }else{
+            fatherSourceCode.value = ''
+        }
+        loadData()
+        getOptiom()
+    }
+    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>

+ 14 - 0
src/views/publicComponents/components/BaseProjectArchive.api.ts

@@ -0,0 +1,14 @@
+import {defHttp} from '/@/utils/http/axios';
+import { useMessage } from "/@/hooks/web/useMessage";
+
+const { createConfirm } = useMessage();
+
+enum Api {
+  list = '/baseCode/baseProjectArchive/list'
+}
+/**
+ * 列表接口
+ * @param params
+ */
+export const list = (params) =>
+  defHttp.get({url: Api.list, params});

+ 84 - 0
src/views/publicComponents/components/BaseProjectArchive.data.ts

@@ -0,0 +1,84 @@
+import {BasicColumn} from '/@/components/Table';
+import {FormSchema} from '/@/components/Table';
+import { rules} from '/@/utils/helper/validator';
+import { render } from '/@/utils/common/renderUtils';
+import { getWeekMonthQuarterYear } from '/@/utils';
+//列表数据
+export const columns: BasicColumn[] = [
+  {
+    title: '编码(code)',
+    align:"center",
+    dataIndex: 'code'
+   },
+   {
+    title: '名称(name)',
+    align:"center",
+    dataIndex: 'name'
+   },
+  
+   {
+    title: '客户(customer)',
+    align:"center",
+    dataIndex: 'customerId_dictText'
+   },
+   {
+    title: '备注(notes)',
+    align:"center",
+    dataIndex: 'notes'
+   },
+   {
+    title: '创建时间(create time)',
+    align:"center",
+    dataIndex: 'createTime'
+   },
+   {
+    title: '创建人(create by)',
+    align:"center",
+    dataIndex: 'createBy'
+   },
+];
+//查询数据
+export const searchFormSchema: FormSchema[] = [
+	  {
+      label: "编码(code)",
+      field: 'code',
+      component: 'Input',
+      componentProps:{
+      },
+      //colProps: {span: 6},
+ 	  },
+   {
+      label: "名称(name)",
+      field: 'name',
+      component: 'Input',
+        //colProps: {span: 6},
+    },
+    {
+      label: "客户(customer)",
+      field: 'customerId',
+      component: 'JDictSelectTag',
+      componentProps:{
+          dictCode: 'customer',
+      },
+      //colProps: {span: 6},
+ 	  },
+     {
+      label: "创建时间(create time)",
+      field: "createTime",
+      component: 'RangePicker',
+      labelWidth: 150,
+      componentProps: {
+          valueType: 'Date',
+          showTime:true
+      },
+      //colProps: {span: 6},
+	},
+	{
+    label: "创建人(create by)",
+    field: 'createBy',
+    component: 'Input',
+    labelWidth: 120,
+    //colProps: {span: 6},
+   },
+	
+];