فهرست منبع

销售订单B2B-页面开发

jingbb 1 ماه پیش
والد
کامیت
d610b8cc48

+ 455 - 0
src/views/saleCode/salesOrderB2B/SaleOrderB2BForm.data.ts

@@ -0,0 +1,455 @@
+import {BasicColumn} from '/@/components/Table';
+import {FormSchema} from '/@/components/Table';
+import { rules} from '/@/utils/helper/validator';
+import { render } from '/@/utils/common/renderUtils';
+import {JVxeTypes,JVxeColumn} from '/@/components/jeecg/JVxeTable/types'
+import { getWeekMonthQuarterYear } from '/@/utils';
+//列表数据
+export const columns: BasicColumn[] = [
+   {
+    title: '订单编号(bill code)',
+    align:"center",
+    dataIndex: 'billCode'
+   },   
+   {
+    title: '单据日期(bill date)',
+    align:"center",
+    dataIndex: 'billDate',
+    customRender:({text}) =>{
+      text = !text ? "" : (text.length > 10 ? text.substr(0,10) : text);
+      return text;
+    },
+   },
+  
+   {
+    title: '项目(project)',
+    align:"center",
+    dataIndex: 'projectName'
+   },
+   {
+    title: '客户(customer)',
+    align:"center",
+    dataIndex: 'customerName',
+    width:280,
+    // ellipsis: false,
+   },
+   {
+    title: '优先级(priority)',
+    align:"center",
+    dataIndex: 'priority_dictText'
+   },
+   {
+    title: '产品分类(production class)',
+    align:"center",
+    dataIndex: 'productionClass_dictText'
+   },
+   {
+    title: '机型(model)',
+    align:"center",
+    dataIndex: 'model'
+   },
+   {
+    title: '厂家(maker)',
+    align:"center",
+    dataIndex: 'maker'
+   },
+   {
+    title: '船IMO(imo)',
+    dataIndex: 'imo',
+    align:"center",
+   },
+   {
+    title: '船(shipName)',
+    dataIndex: 'shipName',
+    align:"center",
+   },
+   {
+    title: '销售部门(sale department)',
+    align:"center",
+    dataIndex: 'saleDepartment'
+   },
+   {
+    title: '业务员(salesman)',
+    align:"center",
+    dataIndex: 'salesman',
+   },
+   {
+    title: '合同来源(sourceCode)',
+    align:"center",
+    dataIndex: 'sourceCode2',
+   },
+   {
+    title: '报价单来源(sourceCode)',
+    align:"center",
+    dataIndex: 'sourceCode',
+   },
+   {
+    title: '提交(submit)',
+    align:"center",
+    dataIndex: 'submit',
+    customRender:function (t, r, index) {
+      if(t.text==1){
+        return '是(yes)'
+      }else if(t.text==0){
+        return '否(no)'
+      }
+    }
+   },
+   {
+    title: '关闭(close)',
+    align:"center",
+    dataIndex: 'close',
+    customRender:function (t, r, index) {
+      if(t.text==1){
+        return '是(yes)'
+      }else if(t.text==0){
+        return '否(no)'
+      }
+    }
+   },
+   {
+    title: '关闭原因(close reason)',
+    align:"center",
+    dataIndex: 'closeReason',
+   },
+   {
+    title: '客户确认(customer confirm)',
+    align:"center",
+    dataIndex: 'status',
+    width:250,
+    customRender:function (t, r, index) {
+      if(t.text==1){
+        return '已确认'
+      }else if(t.text==0){
+        return '未确认'
+      }
+    }
+   },
+   {
+    title: '技术协议(T/A)',
+    align:"center",
+    dataIndex: 'baseProtocaol',
+    width:250,
+    slots: { customRender: 'viewFile' },
+   },
+   {
+    title: '扫描合同(scan contract)',
+    align:"center",
+    dataIndex: 'scanProtocaol',
+    width:250,
+    slots: { customRender: 'viewFile' },
+   },
+   {
+    title: '订单金额(order money)',
+    align:"center",
+    dataIndex: 'orderMoney',
+    width:250
+   },
+   {
+    title: '发货金额(delivery money)',
+    align:"center",
+    dataIndex: 'deliveryMoney',
+    width:250
+   },
+   {
+    title: '客户订单号(customer order)',
+    align:"center",
+    dataIndex: 'customerOrder',
+    width:200
+   },
+   {
+    title: '发票金额(invoice money)',
+    align:"center",
+    dataIndex: 'invoiceMoney',
+    width:250
+   },
+   {
+    title: '收款金额(collected money)',
+    align:"center",
+    dataIndex: 'collectedMoney',
+    width:250
+   },
+];
+
+//子表表格配置
+export const saleOrderShipColumns: JVxeColumn[] = [
+    {
+      title: '船名(ship name)',
+      key: 'shipName',
+      type: JVxeTypes.normal,
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '主机号(host number)',
+      key: 'hostNumber',
+      type: JVxeTypes.input,
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '工程编号(project No)',
+      key: 'projectNo',
+      type: JVxeTypes.input,
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '船厂(ship factory)',
+      key: 'shipFactory',
+      type: JVxeTypes.normal,
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '船东(shipowner)',
+      key: 'shipowner',
+      type: JVxeTypes.normal,
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '操作(operation)',
+      key: 'action',
+      width:"400px",
+      // 固定在右侧
+      fixed: 'right',
+      // 对齐方式为居中
+      align: 'center',
+      // 组件类型定义为【插槽】
+      type: JVxeTypes.slot,
+      // slot 的名称,对应 v-slot 冒号后面和等号前面的内容
+      slotName: 'action',
+    },
+  ]
+export const saleOrderProductColumns: JVxeColumn[] = [
+    {
+      title: '交期(delivery time)',
+      key: 'deliveryTime',
+      type: JVxeTypes.date,
+      placeholder: '请输入${title}',
+      width:"200px",
+      defaultValue:'',
+    },
+    // {
+    //   title: '产品分类(product class)',
+    //   key: 'productClass',
+    //   type: JVxeTypes.normal,
+    //   placeholder: '请输入${title}',
+    //   width:"200px",
+    //   defaultValue:'',
+    // },
+    {
+      title: '产品编码(product code)',
+      key: 'productCode',
+      type: JVxeTypes.normal,
+      placeholder: '请输入${title}',
+      width:"200px",
+      defaultValue:'',
+    },
+    {
+      title: '产品中文名(chinese name)',
+      key: 'chineseName',
+      type: JVxeTypes.normal,
+      placeholder: '请输入${title}',
+      width:"200px",
+      defaultValue:'',
+    },
+    {
+      title: '产品英文名(english name)',
+      key: 'englishName',
+      type: JVxeTypes.input,
+      placeholder: '请输入${title}',
+      width:"200px",
+      defaultValue:'',
+    },
+    {
+      title: '型号(model)',
+      key: 'model',
+      type: JVxeTypes.normal,
+      placeholder: '请输入${title}',
+      width:"200px",
+      defaultValue:'',
+    },
+    {
+      title: '备件号(partno)',
+      key: 'partno',
+      type: JVxeTypes.normal,
+      placeholder: '请输入${title}',
+      width:"200px",
+      defaultValue:'',
+    },
+    {
+      title: '订货号(orderno)',
+      key: 'orderno',
+      type: JVxeTypes.normal,
+      placeholder: '请输入${title}',
+      width:"200px",
+      defaultValue:'',
+    },
+    {
+      title: '图号(drawingno)',
+      key: 'drawingno',
+      type: JVxeTypes.normal,
+      placeholder: '请输入${title}',
+      width:"200px",
+      defaultValue:'',
+    },
+    // {
+    //   title: '厂家(factory)',
+    //   key: 'factory',
+    //   placeholder: '请输入${title}',
+    //   width:"200px",
+    //   defaultValue:'',
+    //   type: JVxeTypes.normal,
+    // },
+    {
+      title: '质量等级(quality grade)',
+      key: 'qualityGrade',
+      type: JVxeTypes.normal,
+      placeholder: '请输入${title}',
+      width:"200px",
+      defaultValue:'',
+    },
+    {
+      title: '数量(quantity)',
+      key: 'quantity',
+      type: JVxeTypes.inputNumber,
+      validateRules: [{ required: true, message: '' }],
+      placeholder: '请输入${title}',
+      width:"200px",
+      defaultValue:'',
+    },
+    {
+      title: '税率(tax rate)',
+      key: 'taxRate',
+      type: JVxeTypes.normal,
+      placeholder: '请输入${title}',
+      defaultValue:'',  
+      width:"200px",
+    },
+    // {
+    //   title: '折扣(discount)',
+    //   key: 'discount',
+    //   width:"200px",
+    //   placeholder: '请输入${title}',
+    //   defaultValue:'',
+    //   type: JVxeTypes.normal,
+    // },
+    {
+      title: '单价(price)',
+      key: 'taxPrice',
+      type: JVxeTypes.inputNumber,
+      validateRules: [{ required: true, message: '' }],
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '金额(money)',
+      key: 'taxAmount',
+      type: JVxeTypes.normal,
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+      statistics:['sum'],
+    },
+    {
+      title: '折后单价(discounted unit price)',
+      key: 'discountedPrice',
+      type: JVxeTypes.normal,
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '折后金额(converted amount)',
+      key: 'discountedAmount',
+      type: JVxeTypes.normal,
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+      statistics:['sum'],
+    },
+    {
+      title: '备注(note)',
+      key: 'notes',
+      width:"200px",
+      type: JVxeTypes.input,
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '操作(operation)',
+      key: 'action',
+      width:"200px",
+      // 固定在右侧
+      fixed: 'right',
+      // 对齐方式为居中
+      align: 'center',
+      // 组件类型定义为【插槽】
+      type: JVxeTypes.slot,
+      // slot 的名称,对应 v-slot 冒号后面和等号前面的内容
+      slotName: 'action',
+    },
+  ]
+
+// 高级查询数据
+export const superQuerySchema = {
+  status: {title: '状态(1-已报价,0-已报价)',order: 0,view: 'number', type: 'number',},
+  otherStatus: {title: '其他状态(other status)',order: 2,view: 'text', type: 'string',},
+  submit: {title: '提交(1是 0否)',order: 3,view: 'text', type: 'string',},
+  billDate: {title: '单据日期(bill date)',order: 4,view: 'date', type: 'string',},
+  billCode: {title: '询价单号(bill code)',order: 5,view: 'text', type: 'string',},
+  inquiryProject: {title: '询价项目(inquiry project)',order: 6,view: 'text', type: 'string',},
+  inquiryCustomer: {title: '询价客户(inquiry customer)',order: 7,view: 'text', type: 'string',},
+  inquiryPlatform: {title: '询价平台(inquiry platform)',order: 8,view: 'text', type: 'string',},
+  customerInquiryNumber: {title: '客户询价单号(customer inquiry number)',order: 9,view: 'text', type: 'string',},
+  inquiryPeriodEnd: {title: '询价有效期(inquiry period)止',order: 10,view: 'date', type: 'string',},
+  inquiryPeriodBegin: {title: '询价有效期(inquiry period)始',order: 11,view: 'date', type: 'string',},
+  busynessType: {title: '业务类型(busyness type)',order: 12,view: 'text', type: 'string',},
+  priority: {title: '优先级(priority)',order: 13,view: 'text', type: 'string',},
+  productionClass: {title: '产品分类(production class)',order: 14,view: 'text', type: 'string',},
+  model: {title: '机型(model)',order: 15,view: 'text', type: 'string',},
+  maker: {title: '厂家(maker)',order: 16,view: 'text', type: 'string',},
+  saleDepartment: {title: '销售部门(sale department)',order: 17,view: 'text', type: 'string',},
+  salesman: {title: '业务员(salesman)',order: 18,view: 'text', type: 'string',},
+  inquiryTeam: {title: '采购询价组(procurement inquiry team)',order: 19,view: 'text', type: 'string',},
+  deliveryTime: {title: '交期(delivery time)',order: 20,view: 'datetime', type: 'string',},
+  attachs: {title: '附件(attachs)',order: 21,view: 'text', type: 'string',},
+  inquiryNotes: {title: '询价备注(inquiry notes)',order: 22,view: 'text', type: 'string',},
+  //子表高级查询
+  saleInquiryFormShip: {
+    title: '销售询价单子表 - 船明细',
+    view: 'table',
+    fields: {
+        shipId: {title: '船id',order: 0,view: 'text', type: 'string',},
+        shipName: {title: '船名',order: 1,view: 'text', type: 'string',},
+        hostNumber: {title: '主机号',order: 2,view: 'text', type: 'string',},
+        projectNo: {title: '工程编号',order: 3,view: 'text', type: 'string',},
+        shipFactory: {title: '船厂',order: 4,view: 'text', type: 'string',},
+        shipowner: {title: '船东',order: 5,view: 'text', type: 'string',},
+    }
+  },
+  saleInquiryFormProduct: {
+    title: '销售询价单子表 - 产品明细',
+    view: 'table',
+    fields: {
+        productId: {title: '产品id',order: 0,view: 'number', type: 'number',},
+        deliveryTime: {title: '交期',order: 1,view: 'date', type: 'string',},
+        productClass: {title: '产品分类',order: 2,view: 'text', type: 'string',},
+        productCode: {title: '产品编码',order: 3,view: 'text', type: 'string',},
+        chineseName: {title: '产品中文名',order: 4,view: 'text', type: 'string',},
+        englishName: {title: '产品英文名',order: 5,view: 'text', type: 'string',},
+        specifications: {title: '规格',order: 6,view: 'text', type: 'string',},
+        model: {title: '型号',order: 7,view: 'text', type: 'string',},
+        factory: {title: '厂家',order: 8,view: 'text', type: 'string',},
+        qualityGrade: {title: '质量等级',order: 9,view: 'text', type: 'string',},
+        quantity: {title: '数量',order: 10,view: 'number', type: 'number',},
+        unit: {title: '单位',order: 11,view: 'text', type: 'string',},
+        needShip: {title: '需要船检证书(1是 0否)',order: 12,view: 'text', type: 'string',},
+        shipInspection: {title: '船检证书',order: 13,view: 'text', type: 'string',},
+        notes: {title: '备注',order: 14,view: 'text', type: 'string',},
+    }
+  },
+};

+ 456 - 0
src/views/saleCode/salesOrderB2B/SaleOrderB2BFormList.vue

@@ -0,0 +1,456 @@
+<template>
+  <div class="p-2">
+    <!--查询区域-->
+    <div class="jeecg-basic-table-form-container">
+      <a-form ref="formRef" @keyup.enter.native="reload" :model="queryParam" :label-col="{ style: 'width: 200px' }">
+        <a-row :gutter="24">
+          <a-col :lg="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="queryParam.billDate" class="query-group-cust" />
+            </a-form-item>
+          </a-col>
+          <a-col :lg="8">
+            <a-form-item name="project">
+              <template #label><span title="系统项目(project)">系统项目(project)</span></template>
+              <ApiSelect
+                  :api="ProjectOption"
+                  showSearch
+                  v-model:value="queryParam.project"
+                  :filterOption="true"
+                  resultField="records"
+                  labelField="code"
+                  valueField="id"
+                  :params="{ pageSize: -1 ,status:1}"
+                  optionFilterProp="label"
+              />
+            </a-form-item>
+          </a-col>
+          <template v-if="toggleSearchStatus">
+            <a-col :lg="8">
+              <a-form-item name="billCode">
+                <template #label><span title="订单编号(bill code)">订单单号(bill code)</span></template>
+                <JInput placeholder="请输入订单编号(bill code)" v-model:value="queryParam.billCode" allow-clear AutoComplete="off" />
+              </a-form-item>
+            </a-col>
+            <a-col :lg="16">
+              <a-form-item name="customer">
+                <template #label><span title="客户(customer)">客户(customer)</span></template>
+                <JSelect   v-model:value="queryParam.customer" :get-option-url="CustomerOption" :showField="showField" :param="{status:1}"></JSelect>
+              </a-form-item>
+            </a-col>
+            <a-col :lg="8">
+              <a-form-item name="priority">
+                <template #label><span title="优先级(priority)">优先级(priority)</span></template>
+                <JDictSelectTag v-model:value="queryParam.priority" placeholder="请选择" dictCode="priority" style="width: 100%" />
+              </a-form-item>
+            </a-col>
+            <a-col :lg="8">
+              <a-form-item name="productionClass">
+                <template #label><span title="产品分类(production class)">产品分类(production class)</span></template>
+                <ApiSelect
+                  :api="ClassList"
+                  showSearch
+                  v-model:value="queryParam.productionClass"
+                  :filterOption="true"
+                  resultField="records"
+                  labelField="name"
+                  valueField="id"
+                  :params="{ pageSize: -1 }"
+                  optionFilterProp="label"
+                />
+              </a-form-item>
+            </a-col>
+            <a-col :lg="8">
+              <a-form-item name="model">
+                <template #label><span title="机型(model)">机型(model)</span></template>
+                <JDictSelectTag v-model:value="queryParam.model" placeholder="请选择" dictCode="model_typer" style="width: 100%" />
+              </a-form-item>
+            </a-col>
+            <a-col :lg="8">
+              <a-form-item name="maker">
+                <template #label><span title="厂家(maker)">厂家(maker)</span></template>
+                <JDictSelectTag v-model:value="queryParam.maker" placeholder="请选择" dictCode="factory" />
+              </a-form-item>
+            </a-col>
+            <a-col :lg="8">
+              <a-form-item name="shipName" >
+                <template #label><span title="船(shipName)">船(shipName)</span></template>
+                <JInput placeholder="请输入船(shipName)" v-model:value="queryParam.shipName" allow-clear ></JInput>
+              </a-form-item>
+            </a-col>
+            <a-col :lg="8">
+              <a-form-item name="imo" >
+                <template #label><span title="船IMO(imo)">船IMO(imo)</span></template>
+                <JInput placeholder="请输入船IMO(imo)" v-model:value="queryParam.imo" allow-clear ></JInput>
+              </a-form-item>
+            </a-col>
+            <a-col :lg="8">
+              <a-form-item name="sourceCode2" >
+                <template #label><span title="合同来源(sourceCode)">合同来源(sourceCode)</span></template>
+                <JInput placeholder="请输入合同来源(sourceCode)" v-model:value="queryParam.sourceCode2" allow-clear ></JInput>
+              </a-form-item>
+            </a-col>
+            <a-col :lg="8">
+              <a-form-item name="sourceCode" >
+                <template #label><span title="报价单来源(sourceCode)">报价单来源(sourceCode)</span></template>
+                <JInput placeholder="请输入报价单来源(sourceCode)" v-model:value="queryParam.sourceCode" allow-clear ></JInput>
+              </a-form-item>
+            </a-col>
+            <a-col :lg="8">
+              <a-form-item name="imo" >
+                <template #label><span title="船IMO(imo)">船IMO(imo)</span></template>
+                <JInput placeholder="请输入船IMO(imo)" v-model:value="queryParam.imo" allow-clear ></JInput>
+              </a-form-item>
+            </a-col>
+            <a-col :lg="8">
+              <a-form-item name="saleDepartment">
+                <template #label><span title="销售部门(sale saleDepartment)">销售部门(sale department)</span></template>
+                <JSelectDept v-model:value="queryParam.saleDepartment" :multiple="false" />
+              </a-form-item>
+            </a-col>
+            <a-col :lg="8">
+              <a-form-item name="salesman">
+                <template #label><span title="业务员(salesman)">业务员(salesman)</span></template>
+                <ApiSelect
+                  :api="SaleManOption"
+                  showSearch
+                  v-model:value="queryParam.salesman"
+                  :filterOption="true"
+                  resultField="records"
+                  labelField="realname"
+                  valueField="username"
+                  :params="{ pageSize: -1 }"
+                  optionFilterProp="label"
+                />
+                <!-- <JSelectUser v-model:value="queryParam.salesman" placeholder="请选择" :multiple="false" /> -->
+              </a-form-item>
+            </a-col>
+            <a-col :lg="8">
+              <a-form-item name="submit">
+                <template #label><span title="提交(submit)">提交(submit)</span></template>
+                <JDictSelectTag v-model:value="queryParam.submit" placeholder="请选择" dictCode="yes_or_no" style="width: 100%" />
+              </a-form-item>
+            </a-col>
+            <a-col :lg="8">
+              <a-form-item name="status">
+                <template #label><span title="客户确认(customer confirm)">客户确认(customer confirm)</span></template>
+                <JDictSelectTag v-model:value="queryParam.status" placeholder="请选择" dictCode="customer_confirm" />
+              </a-form-item>
+            </a-col>
+            <a-col :lg="8">
+              <a-form-item name="close">
+                <template #label><span title="关闭(close)">关闭(close)</span></template>
+                <JDictSelectTag v-model:value="queryParam.close" placeholder="请选择" dictCode="yes_or_no" style="width: 100%" />
+              </a-form-item>
+            </a-col>
+            <a-col :lg="8">
+              <a-form-item name="shipName">
+                <template #label><span title="船名(shipName)">船名(shipName)</span></template>
+                <ApiSelect
+                  :api="shipOption"
+                  showSearch
+                  allowInput
+                  v-model:value="queryParam.shipName"
+                  :filterOption="true"
+                  resultField="records"
+                  labelField="shipName"
+                  valueField="shipName"
+                  :params="{ pageSize: -1 }"
+                  optionFilterProp="label"
+                />
+              </a-form-item>
+            </a-col>
+          </template>
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <span style="float: left; overflow: hidden" class="table-page-search-submitButtons">
+              <a-col :lg="6">
+                <a-button type="primary" preIcon="ant-design:search-outlined" @click="reload">查询</a-button>
+                <a-button preIcon="ant-design:reload-outlined" @click="searchReset" style="margin-left: 8px">重置</a-button>
+                <a @click="toggleSearchStatus = !toggleSearchStatus" style="margin-left: 8px">
+                  {{ toggleSearchStatus ? '收起' : '展开' }}
+                  <Icon :icon="toggleSearchStatus ? 'ant-design:up-outlined' : 'ant-design:down-outlined'" />
+                </a>
+              </a-col>
+            </span>
+          </a-col>
+        </a-row>
+      </a-form>
+    </div>
+    <!--引用表格-->
+    <BasicTable @register="registerTable" :rowSelection="rowSelection" size="small">
+      <!--插槽:table标题-->
+      <template #tableTitle>
+        <a-button type="primary" v-auth="'saleCode:sale_order:exportXls'" preIcon="ant-design:export-outlined" @click="onExportXls">
+          导出(export)</a-button
+        >
+        <!-- <a-button type="primary" @click="submit"> 提交(submit)</a-button>
+        <a-button type="primary" @click="cancelSubmit"> 取消提交(cancelSubmit)</a-button>
+        <a-button type="primary" @click="close" v-auth="'saleCode:sale_order:close'"> 关闭(close)</a-button> -->
+        <!-- <a-button type="primary" @click="cancelClose"> 取消关闭(cancel close)</a-button> -->
+        <!-- <a-button type="primary" @click="confirm" v-auth="'saleCode:sale_order:confirm'"> 确认(confirm)</a-button>
+        <a-button type="primary" @click="cancelConfirm" v-auth="'saleCode:sale_order:cancelConfirm'"> 取消确认(cancel confirm)</a-button> -->
+        <a-dropdown v-if="selectedRowKeys.length > 0">
+          <template #overlay>
+            <a-menu>
+              <a-menu-item key="1" @click="batchHandleDelete" v-auth="'saleCode:sale_order_form:deleteBatch'">
+                <Icon icon="ant-design:delete-outlined" />
+                删除(delete)
+              </a-menu-item>
+            </a-menu>
+          </template>
+          <a-button v-auth="'saleCode:sale_order:delete'"
+            >批量操作
+            <Icon icon="mdi:chevron-down" />
+          </a-button>
+        </a-dropdown>
+      </template>
+      <!--操作栏-->
+      <template #action="{ record }">
+        <TableAction :actions="getTableAction(record)" :dropDownActions="getDropDownAction(record)" />
+      </template>
+      <!--字段回显插槽-->
+      <template #bodyCell="{ column, record, index, text }"> </template>
+      //
+      <template #viewFile="props">
+        <a @click="viewFileDetail(props)">查看(view)</a>
+      </template>
+    </BasicTable>
+    <!-- 表单区域 -->
+    <SaleInquiryFormB2BModal @register="registerModal" @success="handleSuccess" />
+    <ViewFileListModal ref="ViewFileListModalRef" />
+  </div>
+</template>
+
+<script lang="ts" name="saleCode-saleInquiryForm" setup>
+  import { ref, reactive, computed, unref, onMounted } from 'vue';
+  import { BasicTable, useTable, TableAction } from '/@/components/Table';
+  import { useListPage } from '/@/hooks/system/useListPage';
+  import { useModal } from '/@/components/Modal';
+  import SaleInquiryFormB2BModal from './components/SaleOrderFormB2BModal.vue';
+  import { columns, superQuerySchema } from './SaleOrderB2BForm.data';
+  import {
+    list,
+    deleteOne,
+    batchDelete,
+    getImportUrl,
+    getExportUrl,
+    ProjectOption,
+    CustomerOption,
+    ClassList,
+    SaleManOption,
+    shipOption
+  } from './SaleOrderyB2BForm.api';
+  import { cloneDeep } from 'lodash-es';
+  import { JDictSelectTag, ApiSelect, JInput,JSelect } from '/@/components/Form';
+  import JSelectUser from '/@/components/Form/src/jeecg/components/JSelectUser.vue';
+  import JSelectDept from '/@/components/Form/src/jeecg/components/JSelectDept.vue';
+  import ViewFileListModal from './components/ViewFileListModal.vue';
+  const formRef = ref();
+  var showField = ref('currency_dictText+name');
+  const ViewFileListModalRef = ref();
+  const queryParam = reactive<any>({});
+  //注册model
+  const [registerModal, { openModal }] = useModal();
+  //注册table数据
+  const { prefixCls, tableContext, onExportXls, onImportXls } = useListPage({
+    tableProps: {
+      title: '销售订单',
+      api: list,
+      columns,
+      canResize: false,
+      useSearchForm: false,
+      actionColumn: {
+        width: 300,
+        fixed: 'right',
+      },
+      scroll: {
+        x: '5300px',
+        y:'calc(100vh - 400px)',
+      },
+      beforeFetch: async (params) => {
+        let rangerQuery = await setRangeQuery();
+        return Object.assign(params, rangerQuery);
+      },
+    },
+    exportConfig: {
+      name: '销售订单',
+      url: getExportUrl,
+      params: queryParam,
+    },
+    importConfig: {
+      url: getImportUrl,
+      success: handleSuccess,
+    },
+  });
+
+  const [registerTable, { reload }, { rowSelection, selectedRowKeys }] = tableContext;
+
+  // 高级查询配置
+  const superQueryConfig = reactive(superQuerySchema);
+
+  /**
+   * 高级查询事件
+   */
+  function handleSuperQuery(params) {
+    Object.keys(params).map((k) => {
+      queryParam[k] = params[k];
+    });
+    reload();
+  }
+
+  /**
+   * 编辑事件
+   */
+  function handleEdit(record: Recordable) {
+    openModal(true, {
+      record,
+      isUpdate: true,
+      showFooter: true,
+      isRevise: false,
+    });
+  }
+  /**
+   * 详情
+   */
+  function handleDetail(record: Recordable) {
+    openModal(true, {
+      record,
+      isUpdate: true,
+      showFooter: false,
+    });
+  }
+  /**
+   * 删除事件
+   */
+  async function handleDelete(record) {
+    await deleteOne({ id: record.id }, handleSuccess);
+  }
+  /**
+   * 批量删除事件
+   */
+  async function batchHandleDelete() {
+    await batchDelete({ ids: selectedRowKeys.value }, handleSuccess);
+  }
+  /**
+   * 成功回调
+   */
+  function handleSuccess() {
+    (selectedRowKeys.value = []) && reload();
+  }
+  /**
+   * 操作栏
+   */
+  function getTableAction(record) {
+    return [
+      {
+        label: '编辑(edit)',
+        onClick: handleEdit.bind(null, record),
+        auth: 'saleCode:sale_order:edit',
+        ifShow: record.submit == '0' || !record.submit,
+      },
+    ];
+  }
+  /**
+   * 下拉操作栏
+   */
+  function getDropDownAction(record) {
+    return [
+      {
+        label: '详情(detail)',
+        onClick: handleDetail.bind(null, record),
+      },
+      {
+        label: '删除(delete)',
+        popConfirm: {
+          title: '是否确认删除',
+          confirm: handleDelete.bind(null, record),
+          placement: 'topLeft',
+        },
+        auth: 'saleCode:sale_order:delete',
+        ifShow: record.submit == '0' || !record.submit,
+      },
+    ];
+  }
+  function viewFileDetail(props) {
+    ViewFileListModalRef.value.getTable(props.column.dataIndex, props.record);
+  }
+
+  /* ----------------------以下为原生查询需要添加的-------------------------- */
+  const toggleSearchStatus = ref<boolean>(false);
+  const labelCol = reactive({
+    xs: 24,
+    sm: 9,
+  });
+  const wrapperCol = reactive({
+    xs: 24,
+    sm: 15,
+  });
+  const labelCol1 = reactive({
+    xs: 24,
+    sm: 12,
+  });
+  const wrapperCol1 = reactive({
+    xs: 24,
+    sm: 12,
+  });
+  /**
+   * 重置
+   */
+  function searchReset() {
+    formRef.value.resetFields();
+    selectedRowKeys.value = [];
+    //刷新数据
+    reload();
+  }
+
+  let rangeField = 'billDate,';
+
+  /**
+   * 设置范围查询条件
+   */
+  async function setRangeQuery() {
+    let queryParamClone = cloneDeep(queryParam);
+    if (rangeField) {
+      let fieldsValue = rangeField.split(',');
+      fieldsValue.forEach((item) => {
+        if (queryParamClone[item]) {
+          let range = queryParamClone[item];
+          queryParamClone[item + '_begin'] = range[0];
+          queryParamClone[item + '_end'] = range[1];
+          delete queryParamClone[item];
+        } else {
+          queryParamClone[item + '_begin'] = '';
+          queryParamClone[item + '_end'] = '';
+        }
+      });
+    }
+    return queryParamClone;
+  }
+</script>
+<style lang="less" scoped>
+  .jeecg-basic-table-form-container {
+    padding: 0;
+    .table-page-search-submitButtons {
+      display: block;
+      margin-bottom: 8px;
+      white-space: nowrap;
+    }
+    .query-group-cust {
+      min-width: 100px !important;
+    }
+    .query-group-split-cust {
+      width: 30px;
+      display: inline-block;
+      text-align: center;
+    }
+    .ant-form-item:not(.ant-form-item-with-help) {
+      margin-bottom: 8px;
+      height: 32px;
+    }
+    :deep(.ant-picker),
+    :deep(.ant-input-number) {
+      width: 100%;
+    }
+  }
+</style>

+ 112 - 0
src/views/saleCode/salesOrderB2B/SaleOrderyB2BForm.api.ts

@@ -0,0 +1,112 @@
+import {defHttp} from '/@/utils/http/axios';
+import { useMessage } from "/@/hooks/web/useMessage";
+
+const { createConfirm } = useMessage();
+
+enum Api {
+  list = '/b2bCode/saleOrderB2b/list',
+  edit='/b2bCode/saleOrderB2b/edit',
+  deleteOne = '/b2bCode/saleOrderB2b/delete',
+  deleteBatch = '/b2bCode/saleOrderB2b/deleteBatch',
+  importExcel = '/b2bCode/saleOrderB2b/importExcel',
+  exportXls = '/b2bCode/saleOrderB2b/exportXls',
+  queryDataById = '/b2bCode/saleOrderB2b/queryById',
+  saleOrderFormShipList = '/b2bCode/saleOrderB2b/querySaleOrderShipB2bByMainId',
+  saleOrderFormProductList = '/saleOrderB2b/querySaleOrderProductB2bByMainId',
+  classList='baseCode/baseProductClass/list',
+  customerList='/cuspCode/cuspCustomerProfile/list',
+  projectList='/baseCode/baseProjectArchive/list',
+  salemanOption = 'sys/user/list',
+  linkOption = '/cuspCode/cuspCustomerProfile/queryCuspCustomerProfileManByMainId',
+}
+/**
+ * 导出api
+ * @param params
+ */
+export const getExportUrl = Api.exportXls;
+
+/**
+ * 导入api
+ */
+export const getImportUrl = Api.importExcel;
+
+/**
+ * 查询子表数据
+ * @param params
+ */
+export const querySaleOrderFormShipFormShippTable = (id) => defHttp.get({url: Api.saleOrderFormShipList, params:{ id }});
+/**
+ * 查询子表数据
+ * @param params
+ */
+export const querySaleOrderFormProductListByMainId = (id) => defHttp.get({url: Api.saleOrderFormProductList, params:{ id }});
+
+/**
+ * 列表接口
+ * @param params
+ */
+export const list = (params) =>
+  defHttp.get({url: Api.list, params});
+
+/**
+ * 分类列表接口
+ * @param params
+ */
+export const ClassList = (params) =>
+  defHttp.get({url: Api.classList, params});
+
+
+
+/**
+ * 删除单个
+ */
+export const deleteOne = (params,handleSuccess) => {
+  return defHttp.delete({url: Api.deleteOne, params}, {joinParamsToUrl: true}).then(() => {
+    handleSuccess();
+  });
+}
+/**
+ * 批量删除
+ * @param params
+ */
+export const batchDelete = (params, handleSuccess) => {
+  createConfirm({
+    iconType: 'warning',
+    title: '确认删除',
+    content: '是否删除选中数据',
+    okText: '确认',
+    cancelText: '取消',
+    onOk: () => {
+      return defHttp.delete({url: Api.deleteBatch, data: params}, {joinParamsToUrl: true}).then(() => {
+        handleSuccess();
+      });
+    }
+  });
+}
+/**
+ * 保存或者更新
+ * @param params
+ */
+export const saveOrUpdate = (params, isUpdate) => {
+  let url = Api.edit ;
+  return defHttp.post({url: url, params});
+}
+
+/**
+* 根据id查询数据
+* @param params
+*/
+export const queryDataById = (id) => defHttp.get({url: Api.queryDataById, params:{ id }});
+
+
+
+//获取客户下拉框列表
+export const CustomerOption = (params) => defHttp.get({ url: Api.customerList, params });
+
+//获取项目下拉框列表
+export const ProjectOption = (params) => defHttp.get({ url: Api.projectList, params });
+//获取业务员下拉框
+export const SaleManOption = (params) => defHttp.get({ url: Api.salemanOption, params });
+//获取船舶下拉框
+export const shipOption = (params) => defHttp.get({ url: Api.shipList, params });
+export const LinkOption = (params) => defHttp.get({ url: Api.linkOption, params });

+ 109 - 0
src/views/saleCode/salesOrderB2B/components/FileUploadModal.vue

@@ -0,0 +1,109 @@
+<template>
+    <a-modal
+      :title="title"
+      width="45%"
+      :visible="visible"
+      :maskClosable="false"
+      ref="FileUploadModalRef"
+      switchFullscreen
+      @ok = "handleOk"
+      @cancel="handleCancel">
+        <div>
+          <a-card >
+            <div class="table-page-search-wrapper">
+                <a-form :model="queryParams" :label-col="labelCol" :wrapper-col="wrapperCol">
+                <a-row :gutter="24">
+                    <a-col :xl="24" :lg="24" :md="24">
+                        <a-form-item label="名字(name)">
+                            <a-input placeholder="请输入" v-model:value="queryParams.name"></a-input>
+                        </a-form-item>
+                    </a-col>
+                    <a-col :xl="24" :lg="24" :md="24">
+                        <a-form-item label="附件(attachs)">
+							<JUpload v-model:value="queryParams.attachs"></JUpload>
+						</a-form-item>
+                    </a-col>
+                </a-row>
+            </a-form>
+           </div>
+        </a-card>
+      </div>
+    </a-modal>
+</template>
+<script lang="ts" setup>
+    import {ref,reactive  } from 'vue';
+    import { defHttp } from '/@/utils/http/axios';
+    import { message,Modal  } from 'ant-design-vue';
+    import JUpload from '/@/components/Form/src/jeecg/components/JUpload/JUpload.vue';
+    const emit = defineEmits([ 'addList']); //定义emit
+    var visible = ref(false)
+    var title = ref('')
+    var executeMethod =ref('')
+    const labelCol = reactive({
+        xs:24,
+        sm:4,
+    });
+    const wrapperCol = reactive({
+        xs: 24,
+        sm: 16,
+    });
+    const FileUploadModalRef = ref();
+    const queryParams = ref({
+        name:'',
+        attachs:'',
+        headId:'',
+        type:''
+    });
+    function handleOk(){
+        let executeUrl = ''
+        if(executeMethod.value=='add'){
+            executeUrl = '/saleCode/saleOrderFiles/add'
+        }else{
+            executeUrl = '/saleCode/saleOrderFiles/edit'
+        }
+        defHttp.post({ url: executeUrl, params: queryParams.value }, { isTransformResponse: false }).then((res) => {
+          if (res.success) {
+            emit('addList');
+            message.warning(res.message);
+            handleCancel()
+          } else {
+            message.warning(res.message);
+          }
+        })
+    }
+    function handleCancel(){
+      visible.value = false
+      Modal.destroyAll();
+    }
+    function getTable(fatherId,fatherTitle,status,id){
+        visible.value = true
+        queryParams.value.headId = fatherId.value
+        title.value = fatherTitle.value=='scanProtocaol'?'扫描合同查看(view scan contract)':'技术协议查看(view T/A)'
+        queryParams.value.type = fatherTitle.value=='scanProtocaol'?'1':'2'
+        executeMethod.value = status
+        if(status=='edit'){
+            getForm(id)
+        }
+    }
+    function getForm(id){
+        defHttp.get({ url: '/saleCode/saleOrderFiles/queryById', params: {id:id} }, { isTransformResponse: false }).then((res) => {
+          if (res.success) {
+            queryParams.value = res.result
+          } else {
+            message.warning(res.message);
+          }
+        })
+    }
+    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>

+ 75 - 0
src/views/saleCode/salesOrderB2B/components/SaleOrderFormB2BModal.vue

@@ -0,0 +1,75 @@
+<template>
+  <div ref="SaleOrderDetailsRef">
+    <BasicModal v-bind="$attrs" @register="registerModal" :title="title" width="95%"  @ok="handleSubmit" :getContainer ='()=>$refs.SaleOrderDetailsRef' :maskClosable="false">
+      <SlaeOrderB2BFormForm ref="formComponent" :formDisabled="formDisabled" :formBpm="false" @success="submitSuccess"></SlaeOrderB2BFormForm>
+    </BasicModal>
+  </div>
+</template>
+
+<script lang="ts">
+  import { ref, unref } from 'vue';
+  import { BasicModal, useModalInner } from '/@/components/Modal';
+  import SlaeOrderB2BFormForm from './SlaeOrderB2BFormForm.vue';
+
+  export default {
+    name: "SaleOrderFormModal",
+    components:{
+      BasicModal,
+      SlaeOrderB2BFormForm
+    },
+    emits:['register','success'],
+    setup(_p, {emit}){
+      const formComponent = ref()
+      const isUpdate = ref(true);
+      const formDisabled = ref(false);
+      const title = ref('')
+      var SaleOrderDetailsRef = ref()
+      //表单赋值
+      const [registerModal, {setModalProps, closeModal}] = useModalInner(async (data) => {
+        setModalProps({confirmLoading: false,showCancelBtn:data?.showFooter,showOkBtn:data?.showFooter});
+          isUpdate.value = !!data?.isUpdate;
+          formDisabled.value = !data?.showFooter;
+          title.value = data?.isUpdate ? (unref(formDisabled) ? '详情' : '编辑') : '新增';
+          if (unref(isUpdate)) {
+            formComponent.value.edit(data.record)
+          }else{
+            formComponent.value.add()
+          }
+      });
+
+      function handleSubmit() {
+        formComponent.value.submitForm();
+      }
+
+      function submitSuccess(){
+        emit('success');
+        closeModal();
+      }
+      return {
+        registerModal,
+        title,
+        formComponent,
+        formDisabled,
+        handleSubmit,
+        submitSuccess,
+        SaleOrderDetailsRef,
+      }
+    }
+  }
+</script>
+<style lang="less" scoped>
+	/** 时间和数字输入框样式 */
+  :deep(.ant-input-number) {
+    width: 100%;
+  }
+
+  :deep(.ant-calendar-picker) {
+    width: 100%;
+  }
+  /deep/.ant-modal {
+    // width: 520px;
+    padding-bottom: 0;
+    margin-top: -10px;
+    height: 100%;
+}
+</style>

+ 799 - 0
src/views/saleCode/salesOrderB2B/components/SlaeOrderB2BFormForm.vue

@@ -0,0 +1,799 @@
+<template>
+  <a-spin :spinning="loading">
+    <JFormContainer :disabled="disabled">
+      <template #detail>
+        <a-form v-bind="formItemLayout" name="SaleOrderForm" ref="formRef">
+          <a-row>
+            <a-col :span="12">
+              <a-form-item
+                label="组织(organize)"
+                v-bind="validateInfos.organize"
+                id="SaleOrderForm-organize"
+                name="organize"
+              >
+                <a-select v-model:value="formData.organize" :disabled="formData.id!==''&&formData.submit == '1'">
+                  <a-select-option value="上海">上海</a-select-option>
+                  <a-select-option value="香港">香港</a-select-option>
+                </a-select>
+              </a-form-item>
+            </a-col>
+            <a-col :span="12">
+              <a-form-item label="订单编号(bill code)" v-bind="validateInfos.billCode" id="SaleOrderForm-billCode" name="billCode">
+                <a-input v-model:value="formData.billCode" placeholder="自动生成" disabled />
+              </a-form-item>
+            </a-col>
+            <a-col :span="12">
+              <a-form-item
+                label="单据日期(bill date)"
+                v-bind="validateInfos.billDate"
+                id="SaleOrderForm-billDate"
+                name="billDate"
+              >
+                <a-date-picker
+                  placeholder="请选择单据日期(bill date)"
+                  v-model:value="formData.billDate"
+                  value-format="YYYY-MM-DD"
+                  style="width: 100%"
+                  allow-clear
+                />
+              </a-form-item>
+            </a-col>
+
+            <a-col :span="12">
+              <a-form-item label="项目(project)" v-bind="validateInfos.projectName" id="SaleOrderForm-projectName" name="projectName">
+                <a-input-search
+                  v-model:value="formData.projectName"
+                  placeholder="请输入项目(project)"
+                  readonly
+                  :disabled="notAllowEdit"
+                  allow-clear
+                  enter-button="Search"
+                  AutoComplete="off"
+                  @search="onSearchProject"
+                />
+              </a-form-item>
+            </a-col>
+            <a-col :span="12">
+              <a-form-item
+                label="客户(customer)"
+                v-bind="validateInfos.customerName"
+                id="SaleOrderForm-customerName"
+                name="customerName"
+              >
+                <a-input v-model:value="formData.customerName" placeholder="请选择" allow-clear disabled />
+              </a-form-item>
+            </a-col>
+            <a-col :span="12">
+							<a-form-item label="客户联系人(inquiry platform)" v-bind="validateInfos.inquiryPlatform" id="SaleInquiryFormForm-inquiryPlatform" name="inquiryPlatform">
+                <a-select  v-model:value="formData.liaisonId" labelInValue @change="onChangeLiaison" allowClear>
+                    <a-select-option v-for="item in linkOption" :key="item.id" :value="item.id">{{ item.name }}</a-select-option>
+                </a-select>
+							</a-form-item>
+						</a-col>
+            <a-col :span="12">
+              <a-form-item label="中间人(intermediator)" v-bind="validateInfos.intermediator" id="SaleOrderForm-intermediator" name="intermediator"  >
+                <a-input v-model:value="formData.intermediatorName" placeholder="请选择" allow-clear disabled />
+              </a-form-item>
+            </a-col>
+            <a-col :span="12">
+              <a-form-item
+                label="优先级(priority)"
+                v-bind="validateInfos.priority"
+                id="SaleOrderForm-priority"
+                name="priority"
+              >
+                <JDictSelectTag v-model:value="formData.priority" placeholder="请选择" dictCode="priority" disabled />
+              </a-form-item>
+            </a-col>
+            <a-col :span="12">
+              <a-form-item
+                label="产品分类(production class)"
+                v-bind="validateInfos.productionClass"
+                id="SaleOrderForm-productionClass"
+                name="productionClass"
+              >
+                <ApiSelect
+                  :api="ClassList"
+                  showSearch
+                  v-model:value="formData.productionClass"
+                  optionFilterProp="label"
+                  resultField="records"
+                  labelField="name"
+                  valueField="id"
+                  disabled
+                />
+              </a-form-item>
+            </a-col>
+            <a-col :span="12">
+              <a-form-item
+                label="机型(model)"
+                v-bind="validateInfos.model"
+                id="SaleOrderForm-model"
+                name="model"
+              >
+                <JDictSelectTag v-model:value="formData.model" placeholder="请选择" dictCode="model_typer" disabled />
+              </a-form-item>
+            </a-col>
+            <a-col :span="12">
+              <a-form-item label="厂家(maker)" v-bind="validateInfos.maker" id="SaleOrderForm-maker" name="maker" >
+                <a-input v-model:value="formData.maker" placeholder="请输入厂家(maker)" allow-clear disabled />
+              </a-form-item>
+            </a-col>
+            <a-col :span="12">
+              <a-form-item
+                label="币种(currency)"
+                v-bind="validateInfos.currency"
+                id="SaleOrderForm-currency"
+                name="currency"
+              >
+                <JDictSelectTag v-model:value="formData.currency" placeholder="请选择" dictCode="currency" disabled />
+              </a-form-item>
+            </a-col>
+            <!-- <a-col :span="12">
+							<a-form-item label="汇率(exchange rate)" v-bind="validateInfos.exchangeRate" id="SaleOrderForm-exchangeRate" name="exchangeRate" :labelCol="formItemLayout.labelCol1" :wrapperCol="formItemLayout.wrapperCol1">
+								<a-input v-model:value="formData.exchangeRate" placeholder="请输入"  allow-clear AutoComplete="off"></a-input>
+							</a-form-item>
+						</a-col> -->
+            <a-col :span="12">
+              <a-form-item label="交货条款(delivery term)" v-bind="validateInfos.deliveryTerms" id="SaleOrderForm-deliveryTerms" name="deliveryTerms" >
+                <JDictSelectTag v-model:value="formData.deliveryTerms" placeholder="请选择" dictCode="delivery_terms" />
+              </a-form-item>
+            </a-col>
+            <a-col :span="12">
+              <a-form-item
+                label="付款条件(payment terms)"
+                v-bind="validateInfos.paymentTerms"
+                id="SaleOrderForm-paymentTerms"
+                name="paymentTerms"
+              >
+                <JDictSelectTag v-model:value="formData.paymentTerms" placeholder="请选择" dictCode="payment_terms" disabled />
+              </a-form-item>
+            </a-col>
+
+            <a-col :span="12">
+              <a-form-item label="交期(delivery time)" v-bind="validateInfos.deliveryTime" id="SaleOrderForm-deliveryTime" name="deliveryTime"  >
+                <a-date-picker
+                  placeholder="请选择交期(delivery time)"
+                  v-model:value="formData.deliveryTime"
+                  value-format="YYYY-MM-DD"
+                  format="YYYY-MM-DD"
+                  @change="changeMainDeliveryTime"
+                  style="width: 100%"
+                  allow-clear
+                />
+              </a-form-item>
+            </a-col>
+            <a-col :span="12">
+              <a-form-item
+                label="发货方式(delivery)"
+                v-bind="validateInfos.delivery"
+                id="SaleOrderForm-delivery"
+                name="delivery"
+              >
+                <JDictSelectTag v-model:value="formData.delivery" placeholder="请选择" dictCode="delivery_sale_order" />
+              </a-form-item>
+            </a-col>
+            <a-col :span="12">
+              <a-form-item
+                label="收件地址(delivery address)"
+                v-bind="validateInfos.deliveryAddress"
+                id="SaleOrderForm-deliveryAddress"
+                name="deliveryAddress"
+              >
+                <a-input v-model:value="formData.deliveryAddress" placeholder="请输入" AutoComplete="off" />
+              </a-form-item>
+            </a-col>
+            <a-col :span="12">
+              <a-form-item
+                label="开票抬头(invoice header)"
+                v-bind="validateInfos.invoiceHeader"
+                id="SaleOrderForm-invoiceHeader"
+                name="invoiceHeader"
+              >
+                <a-input v-model:value="formData.invoiceHeader" placeholder="请输入" AutoComplete="off" />
+              </a-form-item>
+            </a-col>
+            <a-col :span="12">
+              <a-form-item
+                label="包装要求(package requirement)"
+                v-bind="validateInfos.packagebRequirement"
+                id="SaleOrderForm-packagebRequirement"
+                name="packagebRequirement"
+              >
+                <a-input
+                  v-model:value="formData.packagebRequirement"
+                  placeholder="请输入包装要求(package requirement)"
+                  allow-clear
+                  AutoComplete="off"
+                />
+              </a-form-item>
+            </a-col>
+            <a-col :span="12">
+              <a-form-item
+                label="质保期(warranty period)"
+                v-bind="validateInfos.warrantyPeriod"
+                id="SaleOrderForm-warrantyPeriod"
+                name="warrantyPeriod"
+              >
+                <a-input
+                  v-model:value="formData.warrantyPeriod"
+                  placeholder="请输入"
+                  style="width: 85%; margin-right: 1%"
+                  AutoComplete="off"
+                />月(month)
+              </a-form-item>
+            </a-col>
+            <a-col :span="12">
+              <a-form-item label="是否出口(export)" v-bind="validateInfos.isExport" id="SaleOrderForm-isExport" name="isExport"  >
+                <JDictSelectTag v-model:value="formData.isExport" placeholder="请选择" dictCode="yes_or_no" AutoComplete="off" />
+              </a-form-item>
+            </a-col>
+            <a-col :span="12">
+              <a-form-item
+                label="销售部门(sale department)"
+                v-bind="validateInfos.saleDepartment"
+                id="SaleOrderForm-saleDepartment"
+                name="saleDepartment"
+              >
+                <a-input v-model:value="formData.saleDepartmentName" placeholder="请输入" allow-clear disabled />
+              </a-form-item>
+            </a-col>
+            <a-col :span="12">
+              <a-form-item
+                label="客户订单号(custormer order)"
+                v-bind="validateInfos.customerOrder"
+                id="SaleOrderForm-customerOrder"
+                name="customerOrder"
+              >
+                <a-input
+                  v-model:value="formData.customerOrder"
+                  placeholder="请输入客户订单号(custormer order number)"
+                  allow-clear
+                  AutoComplete="off"
+                />
+              </a-form-item>
+            </a-col>
+            <a-col :span="12">
+              <a-form-item
+                label="业务员(salesman)"
+                v-bind="validateInfos.salesman"
+                id="SaleOrderForm-salesman"
+                name="salesman"
+              >
+                <a-input v-model:value="formData.salesmanName" placeholder="请输入业务员(salesman)" allow-clear disabled />
+              </a-form-item>
+            </a-col>
+            <a-col :span="12">
+              <a-form-item
+                label="折后金额(converted amount)"
+                v-bind="validateInfos.convertedAmount"
+                id="SaleOrderForm-convertedAmount"
+                name="convertedAmount"
+              >
+                <a-input v-model:value="formData.convertedAmount" placeholder="请输入折后金额(converted amount)" allow-clear disabled />
+              </a-form-item>
+            </a-col>
+            <a-col :span="12">
+              <a-form-item
+                label="折上折(double discount)"
+                v-bind="validateInfos.doubleDiscount"
+                id="SaleOrderForm-doubleDiscount"
+                name="doubleDiscount"
+              >
+                <a-input
+                  v-model:value="formData.doubleDiscount"
+                  placeholder="请输入折上折(double discount)"
+                  suffix="%"
+                  allow-clear
+                  AutoComplete="off"
+                  @change="changeDiscount"
+                />
+              </a-form-item>
+            </a-col>
+            <a-col :span="12">
+              <a-form-item
+                label="质保条款(warranty terms)"
+                v-bind="validateInfos.warrantyTerms"
+                id="SaleOrderForm-warrantyTerms"
+                name="warrantyTerms"
+              >
+                <a-input v-model:value="formData.warrantyTerms" placeholder="请输入质保条款(warranty terms)" allow-clear AutoComplete="off" />
+              </a-form-item>
+            </a-col>
+            <a-col :span="12">
+              <a-form-item
+                label="预付比例(advance ratio)"
+                v-bind="validateInfos.advanceRatio"
+                id="SaleOrderForm-advanceRatio"
+                name="advanceRatio"
+              >
+                <a-input v-model:value="formData.advanceRatio" placeholder="请输入" allow-clear AutoComplete="off" />
+              </a-form-item>
+            </a-col>
+            <a-col :span="12">
+              <a-form-item label="备注(notes)" v-bind="validateInfos.notes" id="SaleOrderForm-notes" name="notes">
+                <a-input v-model:value="formData.notes" AutoComplete="off" />
+              </a-form-item>
+            </a-col>
+            <a-col :span="12">
+              <a-form-item
+                label="协议条款(agreement terms)"
+                v-bind="validateInfos.agreementTerms"
+                id="SaleOrderForm-agreementTerms"
+                name="agreementTerms"
+              >
+              <JSelectMultiple  v-model:value="formData.agreementTerms"   placeholder="" dictCode="base_agreement_terms,name,name"  page="false" showSearch/>
+              </a-form-item>
+            </a-col>
+            <a-col :span="12">
+              <a-form-item label="附件(attachs)" v-bind="validateInfos.attachs" id="SaleOrderForm-attachs" name="attachs">
+                <JUpload v-model:value="formData.attachs" />
+              </a-form-item>
+            </a-col>
+          </a-row>
+        </a-form>
+      </template>
+    </JFormContainer>
+
+    <!-- 子表单区域 -->
+    <a-tabs v-model:activeKey="activeKey" animated style="padding: 24px; padding-top: 0px">
+      <a-tab-pane tab="销售订单 - 产品明细(product details)" key="SaleOrderFormShipFormProduct" :forceRender="true">
+        <j-vxe-table
+          :keep-source="true"
+          resizable
+          ref="SaleOrderFormShipFormProductTableRef"
+          :loading="SaleOrderFormShipFormProductTable.loading"
+          :columns="SaleOrderFormShipFormProductTable.columns"
+          :dataSource="SaleOrderFormShipFormProductTable.dataSource"
+          :maxHeight="340"
+          :disabled="disabled"
+          :rowNumber="true"
+          :rowSelection="true"
+          asyncRemove
+          @value-change="changeValues"
+        >
+          <template #action="props" v-if="!(formData.id!==''&&formData.submit == '1')">
+            <a-popconfirm title="确定删除吗?" @confirm="handleDelete(props)" v-if="!(formData.id!==''&&formData.submit == '1')">
+              <a>删除(delete)</a>
+            </a-popconfirm>
+          </template>
+        </j-vxe-table>
+      </a-tab-pane>
+      <a-tab-pane tab="销售订单 - 船明细(ship details)" key="SaleOrderFormShipFormShip" :forceRender="true">
+        <j-vxe-table
+          :keep-source="true"
+          resizable
+          ref="SaleOrderFormShipFormShipTableRef"
+          :loading="SaleOrderFormShipFormShipTable.loading"
+          :columns="SaleOrderFormShipFormShipTable.columns"
+          :dataSource="SaleOrderFormShipFormShipTable.dataSource"
+          :maxHeight="340"
+          :disabled="disabled"
+          :rowNumber="true"
+          :rowSelection="true"
+        >
+          <template #action="props">
+            <a @click="viewAccessory(props)">查看配件信息(view accessory information)</a>
+          </template>
+        </j-vxe-table>
+      </a-tab-pane>
+    </a-tabs>
+    <SelectProjectModal ref="SelectProjectModalRef" @select-project="addProject" />
+    <BaseShipArchiveAccessoriesModal ref="BaseShipArchiveAccessoriesModalRef" />
+  </a-spin>
+</template>
+
+<script lang="ts">
+  import { defineComponent, ref, reactive, computed, toRaw, nextTick } from 'vue';
+  import { defHttp } from '/@/utils/http/axios';
+  import { useValidateAntFormAndTable } from '/@/hooks/system/useJvxeMethods';
+  import {
+    querySaleOrderFormShipFormShippTable,
+    ClassList,
+    querySaleOrderFormProductListByMainId,
+    CustomerOption,
+    queryDataById,
+    saveOrUpdate,
+    LinkOption
+  } from '../SaleOrderyB2BForm.api';
+  import { JVxeTable } from '/@/components/jeecg/JVxeTable';
+  import { saleOrderShipColumns, saleOrderProductColumns } from '../SaleOrderB2BForm.data';
+  import SelectProjectModal from '../../../publicComponents/SelectProjectModal.vue';
+  import BaseShipArchiveAccessoriesModal from '../../../publicComponents/BaseShipArchiveAccessoriesModal.vue';
+  import JFormContainer from '/@/components/Form/src/container/JFormContainer.vue';
+  import JUpload from '/@/components/Form/src/jeecg/components/JUpload/JUpload.vue';
+  import { JDictSelectTag,JSelectMultiple } from '/@/components/Form';
+  import JSelectInput from '/@/components/Form/src/jeecg/components/JSelectInput.vue';
+  import { Form, message } from 'ant-design-vue';
+  import { useUserStore } from '/@/store/modules/user';
+  import { ApiSelect } from '/@/components/Form/index';
+  import moment from 'moment';
+  const useForm = Form.useForm;
+  export default defineComponent({
+    name: 'SaleOrderForm',
+    components: {
+      JVxeTable,
+      JFormContainer,
+      JUpload,
+      JDictSelectTag,
+      JSelectInput,
+      SelectProjectModal,
+      BaseShipArchiveAccessoriesModal,
+      ApiSelect,
+      JSelectMultiple
+    },
+    props: {
+      formDisabled: {
+        type: Boolean,
+        default: false,
+      },
+      formData: { type: Object, default: () => {} },
+      formBpm: { type: Boolean, default: true },
+    },
+    emits: ['success'],
+    setup(props, { emit }) {
+      const userStore = useUserStore();
+      const loading = ref(false);
+      const formRef = ref();
+      var linkOption = ref([]);
+      const SaleOrderFormShipFormShipTableRef = ref();
+      const SelectProjectModalRef = ref();
+      const BaseShipArchiveAccessoriesModalRef = ref();
+      const SaleOrderFormShipFormShipTable = reactive<Record<string, any>>({
+        loading: false,
+        columns: saleOrderShipColumns,
+        dataSource: [],
+      });
+      const SaleOrderFormShipFormProductTableRef = ref();
+      const SaleOrderFormShipFormProductTable = reactive<Record<string, any>>({
+        loading: false,
+        columns: saleOrderProductColumns,
+        dataSource: [],
+      });
+      const activeKey = ref('SaleOrderFormShipFormProduct');
+      var notAllowEdit = ref(false);
+      const formData = reactive<Record<string, any>>({
+        id: '',
+        status: undefined,
+        delFlag: undefined,
+        organize: '',
+        billCode: '',
+        billDate: moment(new Date()).format('YYYY-MM-DD'),
+        project: '',
+        projectName: '',
+        customer: '',
+        customerName: '',
+        intermediator: '',
+        intermediatorName: '',
+        priority: '',
+        productionClass: '',
+        model: '',
+        maker: '',
+        deliveryTerms: '',
+        paymentTerms: '',
+        delivery: '',
+        deliveryTime: '',
+        deliveryAddress: '',
+        invoiceHeader: '',
+        invoiceAddress: '',
+        warrantyPeriod: '',
+        isExport: '',
+        packagebRequirement: '',
+        saleDepartment: '',
+        saleDepartmentName: '',
+        salesman: '',
+        salesmanName: '',
+        customerOrder: '',
+        doubleDiscount: '',
+        convertedAmount: '',
+        warrantyTerms: '',
+        advanceRatio: '',
+        notes: '',
+        attachs: '',
+        sourceCode: '',
+        sourceCode2: '',
+        currency: '',
+        exchangeRate: '',
+        submit: undefined,
+        agreementTerms: '',
+        liaisonId:'',
+        liaisonInfo:''
+      });
+
+      //表单验证
+      const validatorRules = reactive({
+        projectName: [{ required: true, message: '请选择项目(select project)' }],
+        organize: [{ required: true, message: '请选择组织(select organize)' }],
+        // currency: [{ required: true, message: '请选择币种(select currency)' }],
+      });
+      const { resetFields, validate, validateInfos } = useForm(formData, validatorRules, { immediate: false });
+      const dbData = {};
+      const formItemLayout = {
+        labelCol: { xs: { span: 24 }, sm: { span: 6 } },
+        wrapperCol: { xs: { span: 24 }, sm: { span: 16 } },
+        labelCol1: { xs: { span: 24 }, sm: { span: 6 } },
+        wrapperCol1: { xs: { span: 24 }, sm: { span: 16 } },
+      };
+
+      // 表单禁用
+      const disabled = computed(() => {
+        if (props.formBpm === true) {
+          if (props.formData.disabled === false) {
+            return false;
+          } else {
+            return true;
+          }
+        }
+        return props.formDisabled;
+      });
+
+      function add() {
+        resetFields();
+        SaleOrderFormShipFormShipTable.dataSource = [];
+        SaleOrderFormShipFormProductTable.dataSource = [];
+        activeKey.value = 'SaleOrderFormShipFormProduct';
+        formData.salesman = userStore.getUserInfo.username;
+        formData.salesmanName = userStore.getUserInfo.realname;
+        formData.saleDepartment = userStore.getUserInfo.orgCode;
+        formData.saleDepartmentName = userStore.getUserInfo.orgName;
+        linkOption.value=[]
+      }
+      async function edit(row) {
+        //主表数据
+        await queryMainData(row.id);
+        //子表数据
+        const SaleOrderFormShipFormShipDataList = await querySaleOrderFormShipFormShippTable(row['id']);
+        SaleOrderFormShipFormShipTable.dataSource = [...SaleOrderFormShipFormShipDataList];
+        const SaleOrderFormShipFormProductDataList = await querySaleOrderFormProductListByMainId(row['id']);
+        SaleOrderFormShipFormProductTable.dataSource = [...SaleOrderFormShipFormProductDataList];
+        notAllowEdit.value = true;
+        getLinkOptionsArr(formData.customer)
+      }
+
+      async function queryMainData(id) {
+        const row = await queryDataById(id);
+        resetFields();
+        const tmpData = {};
+        Object.keys(formData).forEach((key) => {
+          if (row.hasOwnProperty(key)) {
+            tmpData[key] = row[key];
+          }
+        });
+        //赋值
+        Object.assign(formData, tmpData);
+      }
+      const { getSubFormAndTableData, transformData } = useValidateAntFormAndTable(activeKey, {
+        saleOrderShip: SaleOrderFormShipFormShipTableRef,
+        saleOrderProduct: SaleOrderFormShipFormProductTableRef,
+      });
+
+      async function getFormData() {
+        try {
+          // 触发表单验证
+          await validate();
+        } catch ({ errorFields }) {
+          if (errorFields) {
+            const firstField = errorFields[0];
+            if (firstField) {
+              formRef.value.scrollToField(firstField.name, { behavior: 'smooth', block: 'center' });
+            }
+          }
+          return Promise.reject(errorFields);
+        }
+        return transformData(toRaw(formData));
+      }
+
+      async function submitForm() {
+        if (formData.sourceCode == '' && formData.sourceCode2 == '') {
+          message.warning('请选择合同或报价单');
+        } else {
+          SaleOrderFormShipFormProductTableRef.value!.validateTable().then(async (errMap) => {
+            if (errMap) {
+              console.log('表单验证未通过:', { errMap });
+            } else {
+              const mainData = await getFormData();
+              const subData = await getSubFormAndTableData();
+              const values = Object.assign({}, dbData, mainData, subData);
+              console.log('表单提交数据', values);
+              const isUpdate = values.id ? true : false;
+              await saveOrUpdate(values, isUpdate);
+              //关闭弹窗
+              emit('success');
+            }
+          });
+        }
+      }
+
+      function setFieldsValue(values) {
+        if (values) {
+          Object.keys(values).map((k) => {
+            formData[k] = values[k];
+          });
+        }
+      }
+      function onSearchProject() {
+        SelectProjectModalRef.value.getTable();
+      }
+      function changeDiscount() {
+        var xTable = SaleOrderFormShipFormProductTableRef.value!.getXTable();
+        var detail = xTable.data,
+        num = 0;
+        detail.map((item) => {
+          item.discount = formData.doubleDiscount
+          item.discountedPrice = (Number(item.taxPrice) * (1 - Number(item.discount) / 100)).toFixed(2);
+          item.discountedAmount = (Number(item.discountedPrice) * Number(item.quantity)).toFixed(2);
+          num = num + Number(item.discountedAmount);
+        });
+        SaleOrderFormShipFormProductTable.dataSource = detail;
+        // formData.convertedAmount = num * (1 - Number(formData.doubleDiscount) / 100);
+        formData.convertedAmount = num
+      }
+      function addProject(data) {
+        formData.project = data[0].id;
+        formData.projectName = data[0].code;
+        formData.customer = data[0].customerId;
+        formData.customerName = data[0].customerId_dictText;
+        getLinkOptionsArr(formData.customer)
+      }
+      function changeMainDeliveryTime(prop) {
+        if (SaleOrderFormShipFormProductTable.dataSource.length > 0) {
+          var xTable = SaleOrderFormShipFormProductTableRef.value!.getXTable();
+          var newArr = [...xTable.data];
+          newArr.map((item) => {
+            item.deliveryTime = prop;
+          });
+          SaleOrderFormShipFormProductTable.dataSource = newArr;
+        }
+      }
+      //查看配件信息
+      function viewAccessory(prop) {
+        BaseShipArchiveAccessoriesModalRef.value.getTable(prop.row);
+      }
+      //产品明细-删除行
+      function handleDelete(prop) {
+        var xTable = SaleOrderFormShipFormProductTableRef.value!.getXTable();
+        var newArray = [...xTable.data];
+        newArray.splice(prop.rowIndex, 1);
+        SaleOrderFormShipFormProductTable.dataSource = newArray;
+        isSelect();
+        if (newArray.length == 0) {
+          add();
+        }
+      }
+       // 判断有没有参照的子表
+       function isSelect() {
+        var arrQuo = [],
+          arrCon = [];
+        if (SaleOrderFormShipFormProductTable.dataSource)
+          SaleOrderFormShipFormProductTable.dataSource.map((item) => {
+            var sign = '';
+            sign = item.sourceType ? item.sourceType.substring(0, 3) : '';
+            if (item.sourceType && sign == 'Quo') {
+              arrQuo.push(item.sourceType);
+            } else if (item.sourceType && sign == 'Con') {
+              arrCon.push(item.sourceType);
+            }
+          });
+        if (arrQuo.length == 0 && arrCon.length == 0) {
+          formData.sourceCode2 = '';
+          formData.sourceCode = '';
+          notAllowEdit.value = false;
+        } else if (arrQuo.length == 0) {
+          formData.sourceCode = '';
+          notAllowEdit.value = true;
+        } else if (arrCon.length == 0) {
+          formData.sourceCode2 = '';
+          notAllowEdit.value = true;
+        }
+      }
+      function changeValues(prop) {
+        // if (prop.col.key == 'discountedPrice' && prop.row.quantity && prop.row.discountedPrice) {
+        //   prop.row.discountedAmount = (prop.value * prop.row.quantity).toFixed(2);
+        //   var arr = SaleOrderFormShipFormProductTableRef.value.getTableData();
+        //   var allAmount = 0;
+        //   arr.map((item) => {
+        //     allAmount = allAmount + Number(item.discountedAmount);
+        //   });
+        //   formData.convertedAmount = allAmount;
+        //   formData.convertedAmount = Number(formData.convertedAmount).toFixed(2);
+        // }
+        if ((prop.col.key == 'quantity'||prop.col.key == 'taxPrice') && prop.row.quantity && prop.row.discountedPrice&& prop.row.taxPrice) {
+          prop.row.taxAmount = (prop.row.quantity * prop.row.taxPrice).toFixed(2);
+          prop.row.discountedAmount = (prop.row.quantity * prop.row.discountedPrice).toFixed(2);
+          var arr = SaleOrderFormShipFormProductTableRef.value.getTableData();
+          var allAmount = 0;
+          arr.map((item) => {
+            allAmount = allAmount + Number(item.discountedAmount);
+          });
+          formData.convertedAmount = allAmount;
+          formData.convertedAmount = Number(formData.convertedAmount).toFixed(2);
+        }
+      }
+      async function getLinkOptionsArr(customerId){
+        var obj = await LinkOption({id:customerId})
+        linkOption.value = obj
+        if(obj.lenght!==0&&typeof obj === 'undefined'){
+           formData.liaisonId = obj[0].id
+          formData.liaisonInfo = obj[0].name
+        }
+      }
+      function onChangeLiaison(data){
+        if(data&&data!==undefined){
+          formData.liaisonId = data.key
+          formData.liaisonInfo = data.label[0].children
+        }else{
+          formData.liaisonId = ''
+          formData.liaisonInfo = ''
+        }
+        
+      }
+      /**
+       * 值改变事件触发-树控件回调
+       * @param key
+       * @param value
+       */
+      function handleFormChange(key, value) {
+        formData[key] = value;
+      }
+      return {
+        SaleOrderFormShipFormShipTableRef,
+        SaleOrderFormShipFormShipTable,
+        SaleOrderFormShipFormProductTableRef,
+        SaleOrderFormShipFormProductTable,
+        validatorRules,
+        validateInfos,
+        activeKey,
+        loading,
+        formData,
+        setFieldsValue,
+        handleFormChange,
+        formItemLayout,
+        disabled,
+        getFormData,
+        submitForm,
+        add,
+        edit,
+        formRef,
+        onSearchProject,
+        SelectProjectModalRef,
+        addProject,
+        changeMainDeliveryTime,
+        handleDelete,
+        BaseShipArchiveAccessoriesModalRef,
+        viewAccessory,
+        notAllowEdit,
+        ClassList,
+        changeValues,
+        changeDiscount,
+        CustomerOption,
+        linkOption,
+        getLinkOptionsArr,
+        onChangeLiaison
+      };
+    },
+  });
+</script>
+<style lang="less" scoped>
+  /** 时间和数字输入框样式 */
+  :deep(.ant-input-number) {
+    width: 100%;
+  }
+
+  :deep(.ant-calendar-picker) {
+    width: 100%;
+  }
+  // /deep/.vxe-table--body-wrapper{
+  //   height: 100% !important;
+  // }
+  /deep/.ant-modal-body {
+    padding: 24px !important;
+  }
+
+  /deep/.ant-form-item {
+    margin-bottom: 8px !important;
+  }
+  /deep/.vxe-cell--valid-error-msg {
+    color: red !important;
+    background-color: white !important;
+  }
+</style>

+ 128 - 0
src/views/saleCode/salesOrderB2B/components/ViewFileListModal.vue

@@ -0,0 +1,128 @@
+<template>
+    <div ref="viewFileDetailRef">
+        <a-modal
+            :title="title"
+            width="60%"
+            :visible="visible"
+            :maskClosable="false"
+            :getContainer ='()=>$refs.viewFileDetailRef'
+            switchFullscreen
+            :footer="false"
+            @cancel="handleCancel">
+                <div>
+                    <a-button type="primary"  @click="handleAdd" preIcon="ant-design:plus-outlined" style="margin-bottom: 1%;"> 新增(add)</a-button>
+                    <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 #operation="{ text, record,index }">
+                            <a @click="handleEdit(record)">编辑(edit)</a>
+                            <a-divider type="vertical"/>
+                            <a-popconfirm title="确定删除吗?" @confirm="handleDelete(record)">
+                            <a>删除(delete)</a>
+                            </a-popconfirm>
+                        </template>
+                    </a-table>
+                </div>
+        </a-modal>
+        <FileUploadModal ref="FileUploadModalRef" @addList="loadData"></FileUploadModal>
+    </div>
+  </template>
+  
+  <script lang="ts" setup>
+      import {ref} from 'vue';
+      import {defHttp} from '/@/utils/http/axios';
+      import FileUploadModal from './FileUploadModal.vue';
+    import { message} from 'ant-design-vue';
+      var visible = ref(false);
+      var title = ref('')
+      var fatherId = ref('')
+      var fatherTitle = ref('')
+      var FileUploadModalRef = ref()
+      var params=ref({
+        headId:'',
+        type:'',
+        pageSize:'-1',
+      })
+      var columns = ref([
+            {
+            title: '上传时间(upload time)',
+            align:"center",
+            dataIndex: 'createTime',
+            key: 'createTime'
+          },
+          {
+            title: '名称(name)',
+            align:"center",
+            dataIndex: 'name',
+            key: 'name'
+          },
+          {
+            title: '操作(operation)',
+            align:"center",
+            dataIndex: 'operation',
+            key: 'operation',
+            slots: { customRender: 'operation' },
+          },
+      ])
+      var dataSource=ref([])
+      function loadData(){
+        defHttp.get({url:"/saleCode/saleOrderFiles/list",params:params.value}).then(res=>{
+          if(res){
+            dataSource.value = res.records
+          }
+        })
+      }
+      function getTable(dataIndex,record){
+          visible.value = true
+          title.value = dataIndex=='scanProtocaol'?'扫描合同查看(view scan contract)':'技术协议查看(view T/A)'
+          fatherId.value = record.id
+          fatherTitle.value = dataIndex
+          params.value.headId=record.id
+          params.value.type = dataIndex=='scanProtocaol'?'1':'2'
+          loadData()
+      }
+      function handleCancel(){
+        visible.value = false;
+      }
+      function handleAdd(){
+        FileUploadModalRef.value.getTable(fatherId,fatherTitle,'add')
+      }
+      function handleEdit(record){
+        FileUploadModalRef.value.getTable(fatherId,fatherTitle,'edit',record.id)
+      }
+      function handleDelete(record){
+        let params = {id:record.id}
+        defHttp.delete({ url: '/saleCode/saleOrderFiles/delete', params},{joinParamsToUrl: true,isTransformResponse: false}).then((res) => {
+          if (res) {
+            loadData()
+          } else {
+            message.warning(res.message);
+          }
+        })
+     }
+      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>
+