Newer
Older
smart-metering-front / src / views / finance / contract / edit.vue
<!-- 分包方资格审批详情 -->
<script lang="ts" setup name="SubpackageApproveEdit">
import type { Ref } from 'vue'
import { ElLoading, ElMessage, ElMessageBox } from 'element-plus'
import type { FormInstance, FormRules } from 'element-plus'
import type { IForm, IPaymentList, dictType } from './contract-interface'
import showPhoto from '@/views/system/tool/showPhoto.vue'
import { UploadFile } from '@/api/measure/file'
import type { IAddress } from '@/components/AddressSelect/address-interface'
import { getDictByCode } from '@/api/system/dict'
import { SCHEDULE } from '@/utils/scheduleDict'
import { cancelApproval, fetchApproval, submitApproval } from '@/api/approval'
import selectCustomer from '@/views/customer/sample/list/selectCustomer.vue'
import type { IOrderList } from '@/views/business/schedule/order/orderList_interface'
import type { ICustomer } from '@/views/customer/customerInfo/customer_interface'
import type { TableColumn } from '@/components/NormalTable/table_interface'
import selectOrder from '@/views/business/schedule/interchangeReceipt/selectOrder.vue'
import { validateMoney } from '@/utils/validate'
import { addContractList, failUpdateContractList, getContractDetail, submitContractList, updateContractList } from '@/api/finance/contract'
import { calc } from '@/utils/useCalc'
import useUserStore from '@/store/modules/user'
import { getUid } from '@/utils/getUid'
import ApprovalDialog from '@/components/Approval/ApprovalDialog.vue'
const approvalDialog = ref() // 审批对话ref
const user = useUserStore() // 用户信息
const customerVisible = ref(false) // 控制选择客户(甲方单位)对话框显隐
const orderVisible = ref(false) // 控制委托单对话框显隐
const loading = ref(false) // 表单加载状态
const infoId = ref('') // id
const pageType = ref('add') // 页面类型: add, edit, detail
const submitId = ref('') // 提交使用的id
const approvalStatusName = ref('') // 审批状态名字
const decisionItem = ref('') // 同意、驳回、拒绝按钮权限
const taskId = ref('') // 任务id,用于同意、驳回、拒绝审批
const $route = useRoute()
const query = $route.query
const textMap: { [key: string]: string } = {
  edit: '编辑',
  add: '新建',
  detail: '详情',
}// 字典
// 从路由中获取页面类型参数
if ($route.params && $route.params.type) {
  pageType.value = $route.params.type as string
  if ($route.params.id) {
    infoId.value = $route.params.id as string
  }
}
// 表单
const form: Ref<IForm> = ref({
  agreementNo: '', // 合同编号
  agreementName: '', // 合同名称
  createUser: '', // 创建人、申请人
  createUserName: '', // 创建人名字、申请人名字
  agreementType: '', // 合同类型
  agreementTypeName: '', // 合同类型名称
  deptId: '', // 创建人所在部门
  deptName: '', // 创建人所在部门名称
  estimateSignDate: '', // 预计签订日期
  agreementAmount: '', // 合同金额
  agreementSourceName: '', // 合同采购来源-字典value
  agreementSource: '', // 合同采购来源-字典code
  agreementStartDate: '', // 合同开始日期
  agreementEndDate: '', // 合同结束日期
  customerId: '', // 甲方单位id-客户id
  firstParty: '', // 甲方单位
  director: '', // 甲方负责人
  secondParty: '', // 乙方单位
  secondDirector: '', // 乙方负责人
  agreementImportantContent: '', // 合同重要内容
  remark: '', // 备注
  minioFileName: '', // 附件
  processId: '', // 流程实例id
})
const orderList = ref<IOrderList[]>([]) // 委托单信息
const checkoutOrderList = ref<string[]>([]) // 多选委托单信息
const orderColumn = ref<TableColumn[]>([
  { text: '委托单编号', value: 'orderCode', align: 'center', width: '160px' },
  { text: '委托方代码', value: 'customerNo', align: 'center', width: '160px' },
  { text: '委托方名称', value: 'customerName', align: 'center' },
  { text: '联系人', value: 'deliverer', align: 'center' },
  { text: '联系方式', value: 'customerPhone', align: 'center' },
  { text: '样品数量', value: 'sampleCount', align: 'center' },
  { text: '是否加急', value: 'isUrgentName', align: 'center', width: '80px', styleFilter: (row: IOrderList) => { return row.isUrgent == 1 ? 'color: red' : '' } },
  { text: '接收状态', value: 'statusName', align: 'center', width: '100px' },
  { text: '完成状态', value: 'finishStatusName', align: 'center', width: '100px' },
])
const ruleFormRef = ref<FormInstance>() // 表单ref
const paymentList = ref<IPaymentList[]>([]) // 收款信息
const checkoutPaymentList = ref<string[]>([]) // 多选收款信息
const paymentColumn = ref([
  { text: '收款次数', value: 'paymentNum', align: 'center', width: '100' },
  { text: '预计收款金额(元)', value: 'estimatePaymentAmount', align: 'center', reg: validateMoney, required: true },
  { text: '预计收款时间', value: 'estimatePaymentDate', align: 'center', required: true },
  { text: '实际收款金额(元)', value: 'actualPaymentAmount', align: 'center', reg: validateMoney },
  { text: '实际收款时间', value: 'actualPaymentDate', align: 'center' },
])
// 自定义校验规则--要求预计结束时间大于预计开始时间
const requireOverTimeValid = (rule: any, value: any, callback: any) => {
  // if (!value) {
  //   return callback(new Error('合同结束日期必填'))
  // }
  if (form.value.agreementEndDate && form.value.agreementStartDate) {
    if (new Date(form.value.agreementEndDate).getTime() <= new Date(form.value.agreementStartDate).getTime()) {
      return callback(new Error('不能小于合同开始日期'))
    }
  }

  callback()
}
// 校验规则
const rules = ref<FormRules>({
  agreementName: [{ required: true, message: '合同名称必填', trigger: 'blur' }],
  agreementType: [{ required: true, message: '合同类型必填', trigger: 'blur' }],
  estimateSignDate: [{ required: true, message: '预计签订日期必填', trigger: 'blur' }],
  // agreementStartDate: [{ required: true, message: '合同开始日期', trigger: 'blur' }],
  agreementEndDate: [{ required: false, type: 'date', validator: requireOverTimeValid, trigger: 'change' }],
  agreementAmount: [{ required: true, message: '合同金额必填', trigger: ['blur', 'change'] },
    { pattern: /^(?!0+(?:\.0+)?$)(?:[1-9]\d*|0)(?:\.\d{1,2})?$/, message: '要求为正数,且最多保留两位小数', trigger: ['blur', 'change'] }],
  agreementSource: [{ required: true, message: '合同采购来源必填', trigger: 'blur' }],
  firstParty: [{ required: true, message: '甲方单位必填', trigger: 'blur' }],
  director: [{ required: true, message: '甲方负责人必填', trigger: 'blur' }],
  secondParty: [{ required: true, message: '乙方负责人必填', trigger: 'blur' }],
  secondDirector: [{ required: true, message: '乙方负责人必填', trigger: 'blur' }],

}) // 表单验证规则
// 初始化router
const $router = useRouter()
// 关闭新增页面的回调
const close = () => {
  $router.back()
}
// ---------------------------------------字典-----------------------------------------
const contractTypeMap = ref<dictType[]>([]) // 合同类型
const contractStatusMap = ref<dictType[]>([]) // 合同完成状态
const contractKindMap = ref<dictType[]>([]) // 合同种类
const contractSourceMap = ref<dictType[]>([]) // 合同采购来源

// 查询字典
const getDict = async () => {
  // 合同类型
  getDictByCode('agreementType').then((response) => {
    contractTypeMap.value = response.data
  })
  // 合同完成状态
  getDictByCode('agreementStatus').then((response) => {
    contractStatusMap.value = response.data
  })
  // 合同种类
  getDictByCode('agreementKind').then((response) => {
    contractKindMap.value = response.data
  })
  // 合同采购来源
  getDictByCode('agreementSource').then((response) => {
    contractSourceMap.value = response.data
  })
}
// ---------------------------------------选择委托单--------------------------------------------
// 点击批量添加
const multiAdd = () => {
  orderVisible.value = true
}
// 修改委托单对话框显隐
const changeOrderVisible = (val: boolean) => {
  orderVisible.value = val
}
// 选好委托单
const confirmCheckoutOrder = (val: Array<IOrderList>) => {
  if (val && val.length) {
    val.forEach((item: any) => {
    // 只添加列表里不存在的
      const index = orderList.value.findIndex((i: IOrderList) => item.orderCode === i.orderCode)
      if (index === -1) {
        orderList.value.push({
          ...item,
          isUrgentName: item.isUrgent == 1 ? '是' : '否',
          finishStatusName: item.statusName === '检测完成' ? '已完成' : '未完成',
        })
      }
    })
  }
}
// 多选发生改变时
const handleOrderSelectionChange = (e: any) => {
  checkoutOrderList.value = e
}
// 点击删除行
const delOrderRow = () => {
  if (checkoutOrderList.value.length <= 0) {
    ElMessage({
      message: '请选中要删除的行',
      type: 'warning',
    })
  }
  else {
    checkoutOrderList.value.forEach((item: any) => {
      orderList.value.forEach((element, index) => {
        if (element.orderCode === item.orderCode) {
          orderList.value.splice(index, 1)
        }
      })
    })
  }
}
// -------------------------------------------收款信息-------------------------------------------------
// 检查收款信息行
function checkPaymentList() {
  for (let index = 0; index < paymentList.value.length; index++) {
    const item = paymentList.value[index]
    for (const prop of paymentColumn.value) {
      // 检查必填
      if (prop.required && !item[prop.value]) {
        ElMessage({
          type: 'warning',
          message: `请先完善第${index + 1}行中${prop.text}`,
          duration: 4000,
        })
        return false
      }
      // 验证正则
      if (prop.reg && typeof prop.reg === 'function') {
        if (item[prop.value] && !prop.reg(item[prop.value])) {
          // ElMessage.warning(`第${index + 1}行中${prop.text}输入不合法`)
          ElMessage({
            type: 'warning',
            message: `第${index + 1}行: 要求${prop.text}为正数,且最多保留两位小数`,
            duration: 4000,
          })
          return false
        }
      }
    }
  }
  return true
}
// 点击增加行
const addPaymentListRow = () => {
  if (!checkPaymentList()) { // 检查收款信息表格
    return false
  }
  paymentList.value.push({
    estimatePaymentAmount: '', // 预计收款金额(单位分)
    estimatePaymentDate: '', // 预计收款时间
    actualPaymentAmount: '', // 实际收款金额(单位分)
    actualPaymentDate: '', 	// 实际收款时间
    paymentNum: '',
    idFront: getUid(), // 生成唯一id
    isEdit: true,
  })
}
// 点击删除行
const delPaymentListRow = () => {
  if (checkoutPaymentList.value.length <= 0) {
    ElMessage({
      message: '请选中要删除的行',
      type: 'warning',
    })
  }
  else {
    checkoutPaymentList.value.forEach((item: any) => {
      paymentList.value.forEach((element, index) => {
        if (element.idFront === item.idFront) {
          paymentList.value.splice(index, 1)
        }
      })
    })
  }
}
// 多选选中
const handlePaymentSelectionChange = (e: any) => {
  checkoutPaymentList.value = e
}
// ----------------------------------------------选择客户(甲方单位)-----------------------------------
// 甲方单位获取焦点
const customerNoFocus = () => {
  customerVisible.value = true
}

// 选好客户
const confirmCheckout = (val: Array<ICustomer>) => {
  if (val && val.length) {
    form.value.customerId = val[0].id // 委托方id
    form.value.firstParty = val[0].customerName // 委托方名称
    form.value.director = val[0].director // 负责人
  }
}

// 控制选择委托方对话框显隐
const changeVisible = (val: boolean) => {
  customerVisible.value = val
}
// -----------------------------------------文件上传-----------------------------------
const fileRef = ref() // 文件上传input
const onFileChange = (event: any) => {
  if (event.target.files?.length !== 0) {
    // 创建formdata对象
    const fd = new FormData()
    fd.append('multipartFile', event.target.files[0])
    const loading = ElLoading.service({
      lock: true,
      background: 'rgba(255, 255, 255, 0.8)',
    })
    UploadFile(fd).then((res) => {
      loading.close()
      if (res.code === 200) {
        form.value.minioFileName = res.data[0]
        // 重置当前验证
        ElMessage.success('文件上传成功')
      }
      else {
        loading.close()
        ElMessage.error(res.message)
      }
    }).catch(() => {
      loading.close()
    })
  }
}
const upload = () => {
  fileRef.value.click()
}
// -------------------------------------------审批----------------------------------------
const approvalRecordData = ref([]) // 审批流程数据
// 查询审批记录
function getApprovalRecord(processId: string) {
  if (pageType.value !== 'add') {
    if (processId) {
      fetchApproval(processId).then((res) => {
        approvalRecordData.value = res.data
      })
    }
    else {
      ElMessage.warning('流程实例id为空')
    }
  }
}
// 审批结束回调
const approvalSuccess = () => {
  close() // 返回上一页
}
// 审批
const handleApprove = (val: string, title = '') => {
  if (val === '取消') {
    const params = {
      processInstanceId: form.value.processId!,
      comments: '',
    }
    ElMessageBox.confirm(
      '确认取消该审批吗?',
      '提示',
      {
        confirmButtonText: '确认',
        cancelButtonText: '取消',
        type: 'warning',
      },
    )
      .then(() => {
        cancelApproval(params).then((res) => {
          ElMessage({
            type: 'success',
            message: '取消成功',
          })
          close()
        })
      })
  }
  else if (val === '同意') {
    approvalDialog.value.initDialog('agree', taskId.value)
  }
  else if (val === '驳回') {
    approvalDialog.value.initDialog('reject', taskId.value)
  }
  else if (val === '拒绝') {
    approvalDialog.value.initDialog('refuse', taskId.value)
  }
}
// -------------------------------------------------------------------------------------
// 获取详情
const getInfo = () => {
  const loading = ElLoading.service({
    lock: true,
    background: 'rgba(255, 255, 255, 0.8)',
  })
  getContractDetail({ id: infoId.value }).then((res) => {
    form.value = res.data
    form.value.agreementAmount = calc(res.data.agreementAmount, 100, '/')
    // 委托单
    orderList.value = res.data.orderList.map((item: { isUrgent: number | string; statusName: string }) => {
      return {
        ...item,
        isUrgentName: item.isUrgent == 1 ? '是' : '否',
        finishStatusName: item.statusName === '检测完成' ? '已完成' : '未完成',
      }
    })
    // 收款信息
    paymentList.value = res.data.paymentList.map((item: { estimatePaymentAmount: number; actualPaymentAmount: number }) => {
      return {
        ...item,
        estimatePaymentAmount: `${item.estimatePaymentAmount}` ? calc(item.estimatePaymentAmount, 100, '/') : item.estimatePaymentAmount,
        actualPaymentAmount: `${item.actualPaymentAmount}` ? calc(item.actualPaymentAmount, 100, '/') : item.actualPaymentAmount,
      }
    })
    loading.close()
  })
}

// 保存
function saveForm(formEl: FormInstance | undefined) {
  if (!orderList.value.length) {
    ElMessage.warning('委托单信息不能为空')
    return false
  }
  if (!paymentList.value.length) {
    ElMessage.warning('收款信息不能为空')
    return false
  }
  if (!checkPaymentList()) { // 检查收款信息表格
    return false
  }
  if (!formEl) { return }
  formEl.validate((valid, fields) => {
    if (valid) {
      const loading = ElLoading.service({
        lock: true,
        background: 'rgba(255, 255, 255, 0.8)',
      })
      const param = {
        ...form.value,
        agreementAmount: calc(Number(form.value.agreementAmount), 100, '*'),
        orderIdList: orderList.value.map(item => item.id),
        paymentList: paymentList.value.map((item) => {
          return {
            ...item,
            estimatePaymentAmount: `${item.estimatePaymentAmount}` ? calc(Number(item.estimatePaymentAmount), 100, '*') : item.estimatePaymentAmount,
            actualPaymentAmount: `${item.actualPaymentAmount}` ? calc(Number(item.actualPaymentAmount), 100, '*') : item.actualPaymentAmount,
            paymentNum: item.xh,
          }
        }),
        agreementKind: '1', // 合同种类,1收入合同
      }
      if (pageType.value === 'add') { // 新建
        addContractList(param).then((res) => {
          if (res.code === 200) {
            submitId.value = res.data.id
            loading.close()
            ElMessage.success('保存成功')
          }
        }).catch(() => {
          loading.close()
        })
      }
      else if (pageType.value === 'edit') { // 编辑
        if (approvalStatusName.value === '未通过-驳回') {
          failUpdateContractList(param).then((res) => {
            if (res.code === 200) {
              loading.close()
              ElMessage.success('保存成功')
              close()
            }
          }).catch(() => {
            loading.close()
          })
        }
        else { // 草稿箱和已取消
          updateContractList(param).then((res) => {
            if (res.code === 200) {
              loading.close()
              ElMessage.success('保存成功')
              close()
            }
          }).catch(() => {
            loading.close()
          })
        }
      }
    }
  })
}
// 提交
const handleSubmit = () => {
  if (submitId.value) {
    const loading = ElLoading.service({
      lock: true,
      background: 'rgba(255, 255, 255, 0.8)',
    })
    const params = {
      id: submitId.value,
      formId: SCHEDULE.BUSINESS_FINANCE_CONTRACT_APPROVE, // 表单id
      processId: form.value.processId, // 流程实例id
    }
    submitContractList(params).then(() => {
      ElMessage.success('已提交')
      loading.close()
      close()
    })
  }
  else {
    ElMessage.warning('请先保存!')
  }
}
onMounted(async () => {
  await getDict()
  approvalStatusName.value = query.approvalStatusName as string // 审批状态名字
  form.value.processId = query.processId as string // 流程实例id
  decisionItem.value = query.decisionItem as string // 同意、驳回、拒绝按钮权限
  taskId.value = query.taskId as string // 流程实例id
  form.value.deptId = user.deptId // 申请单位
  form.value.deptName = user.deptName // 申请单位名称
  form.value.createUser = user.id // 申请人
  form.value.createUserName = user.name // 申请人名称
  // 非添加页面获取详情
  if (pageType.value !== 'add') {
    getInfo()
    if (query.approvalStatusName !== '草稿箱') {
      getApprovalRecord(form.value.processId) // 获取审批流程
    }
  }
})
</script>

<template>
  <app-container>
    <detail-page v-loading="loading" :title="`收入合同管理-${textMap[pageType]}`">
      <template #btns>
        <el-button v-if="pageType === 'detail' && approvalStatusName === '待审批'" type="primary" @click="handleApprove('同意')">
          同意
        </el-button>
        <el-button v-if="pageType === 'detail' && approvalStatusName === '待审批' && decisionItem !== '3'" type="primary" @click="handleApprove('驳回')">
          驳回
        </el-button>
        <el-button v-if="pageType === 'detail' && approvalStatusName === '待审批' && decisionItem !== '2'" type="danger" @click="handleApprove('拒绝')">
          拒绝
        </el-button>
        <el-button v-if="pageType === 'detail' && approvalStatusName === '审批中'" type="info" @click="handleApprove('取消')">
          取消
        </el-button>
        <el-button v-if="pageType === 'add'" type="primary" @click="handleSubmit">
          提交
        </el-button>
        <el-button v-if="pageType !== 'detail'" type="primary" @click="saveForm(ruleFormRef)">
          保存
        </el-button>
        <el-button type="info" @click="close">
          关闭
        </el-button>
      </template>
      <div id="form">
        <el-form
          ref="ruleFormRef"
          :model="form"
          :label-width="120"
          label-position="right"
          :rules="rules"
        >
          <el-row :gutter="24">
            <el-col :span="6">
              <el-form-item label="合同编号:" prop="id">
                <el-input v-model="form.agreementNo" disabled placeholder="系统自动生成" />
              </el-form-item>
            </el-col>
            <el-col :span="6">
              <el-form-item label="合同名称:" prop="agreementName">
                <el-input
                  v-model="form.agreementName"
                  :placeholder="pageType === 'detail' ? '' : '请输入合同名称'"
                  :disabled="pageType === 'detail'"
                />
              </el-form-item>
            </el-col>
            <el-col :span="6">
              <el-form-item label="创建人:">
                <el-input
                  v-model="form.createUserName" disabled
                />
              </el-form-item>
            </el-col>
            <el-col :span="6">
              <el-form-item label="部门:" prop="deptName">
                <el-input
                  v-model="form.deptName" disabled
                />
              </el-form-item>
            </el-col>
            <el-col :span="6">
              <el-form-item label="合同类型" prop="agreementType">
                <el-select v-model="form.agreementType" :placeholder="pageType === 'detail' ? '' : '请选择'" :disabled="pageType === 'detail'" clearable style="width: 100%;">
                  <el-option v-for="item in contractTypeMap" :key="item.id" :label="item.name" :value="item.value" />
                </el-select>
              </el-form-item>
            </el-col>
            <el-col :span="6">
              <el-form-item label="预计签订日期:" prop="estimateSignDate">
                <el-date-picker
                  v-model="form.estimateSignDate"
                  type="date"
                  placeholder="请选择"
                  format="YYYY-MM-DD"
                  value-format="YYYY-MM-DD"
                  :disabled="pageType === 'detail'"
                />
              </el-form-item>
            </el-col>
            <el-col :span="6">
              <el-form-item label="合同金额(元)" prop="agreementAmount">
                <el-input
                  v-model="form.agreementAmount"
                  :placeholder="pageType === 'detail' ? '' : '请输入合同金额'"
                  :class="{ 'detail-input': pageType === 'detail' }"
                  :disabled="pageType === 'detail'"
                />
              </el-form-item>
            </el-col>
            <el-col :span="6">
              <el-form-item label="合同采购来源" prop="agreementSource">
                <el-select v-model="form.agreementSource" :placeholder="pageType === 'detail' ? '' : '请选择'" :disabled="pageType === 'detail'" clearable style="width: 100%;">
                  <el-option v-for="item in contractSourceMap" :key="item.id" :label="item.name" :value="item.value" />
                </el-select>
              </el-form-item>
            </el-col>
            <el-col :span="6">
              <el-form-item label="合同开始日期:" prop="agreementStartDate">
                <el-date-picker
                  v-model="form.agreementStartDate"
                  type="date"
                  :placeholder="pageType === 'detail' ? '' : '请选择'"
                  format="YYYY-MM-DD"
                  value-format="YYYY-MM-DD"
                  :disabled="pageType === 'detail'"
                />
              </el-form-item>
            </el-col>
            <el-col :span="6">
              <el-form-item label="合同结束日期:" prop="agreementEndDate">
                <el-date-picker
                  v-model="form.agreementEndDate"
                  type="date"
                  :placeholder="pageType === 'detail' ? '' : '请选择'"
                  format="YYYY-MM-DD"
                  value-format="YYYY-MM-DD"
                  :disabled="pageType === 'detail'"
                />
              </el-form-item>
            </el-col>
            <el-col :span="6">
              <el-form-item label="甲方单位" prop="firstParty">
                <el-input
                  v-model="form.firstParty"
                  :placeholder="pageType === 'detail' ? '' : '请选择甲方单位'"
                  :class="{ 'detail-input': pageType === 'detail' }"
                  disabled
                >
                  <template v-if="pageType === 'add'" #append>
                    <el-button size="small" @click="customerNoFocus">
                      选择
                    </el-button>
                  </template>
                </el-input>
              </el-form-item>
            </el-col>
            <el-col :span="6">
              <el-form-item label="甲方负责人:" prop="director">
                <el-input
                  v-model="form.director"
                  :placeholder="pageType === 'detail' ? '' : '请输入负责人'"
                  :class="{ 'detail-input': pageType === 'detail' }"
                  :disabled="pageType === 'detail'"
                />
              </el-form-item>
            </el-col>
            <el-col :span="6">
              <el-form-item label="乙方单位:" prop="secondParty">
                <el-input
                  v-model="form.secondParty"
                  :placeholder="pageType === 'detail' ? '' : '请输入乙方单位'"
                  :class="{ 'detail-input': pageType === 'detail' }"
                  :disabled="pageType === 'detail'"
                />
              </el-form-item>
            </el-col>
            <el-col :span="6">
              <el-form-item label="乙方负责人:" prop="secondDirector">
                <el-input
                  v-model="form.secondDirector"
                  :placeholder="pageType === 'detail' ? '' : '请输入负责人'"
                  :class="{ 'detail-input': pageType === 'detail' }"
                  :disabled="pageType === 'detail'"
                />
              </el-form-item>
            </el-col>
          </el-row>

          <el-row :gutter="24" class="marg">
            <el-col :span="12">
              <el-form-item label="合同重要内容:">
                <el-input
                  v-model="form.agreementImportantContent"
                  type="textarea"
                  autosize
                  :placeholder="pageType === 'detail' ? '' : '请输入合同重要内容'"
                  :disabled="pageType === 'detail'"
                  :class="{ 'detail-input': pageType === 'detail' }"
                />
              </el-form-item>
            </el-col>
          </el-row>
          <el-row :gutter="24" class="marg">
            <el-col :span="12">
              <el-form-item label="备注:">
                <el-input
                  v-model="form.remark"
                  type="textarea"
                  autosize
                  :placeholder="pageType === 'detail' ? '' : '请输入备注'"
                  :disabled="pageType === 'detail'"
                  :class="{ 'detail-input': pageType === 'detail' }"
                />
              </el-form-item>
            </el-col>
          </el-row>
          <el-row :gutter="24" class="marg">
            <el-col :span="12">
              <el-form-item label="附件:">
                <show-photo v-if="form.minioFileName" :minio-file-name="form.minioFileName" />
                <span v-else-if="pageType === 'detail'">无</span>
                <input v-show="pageType === ''" ref="fileRef" type="file" @change="onFileChange">
                <el-button v-if="pageType !== 'detail'" id="file" type="primary" :disabled="pageType === 'detail'" :style="{ 'margin-left': form.minioFileName === '' ? '0px' : '20px' }" @click="upload">
                  {{ form.minioFileName === '' ? '上传' : '更换附件' }}
                </el-button>
              </el-form-item>
            </el-col>
          </el-row>
        </el-form>
      </div>
    </detail-page>
    <!-- 表格 -->
    <detail-block title="委托单信息">
      <template #btns>
        <el-button v-if="pageType !== 'detail'" type="primary" @click="multiAdd">
          批量添加
        </el-button>
        <el-button v-if="pageType !== 'detail'" type="info" @click="delOrderRow">
          删除行
        </el-button>
      </template>
      <el-table
        :data="orderList"
        border
        style="width: 100%;"
        max-height="600"
        @selection-change="handleOrderSelectionChange"
      >
        <el-table-column v-if="pageType !== 'detail'" type="selection" width="38" />
        <el-table-column align="center" label="序号" width="80" type="index" />
        <el-table-column
          v-for="item in orderColumn"
          :key="item.value"
          :prop="item.value"
          :label="item.text"
          :width="item.width"
          show-overflow-tooltip
          align="center"
        />
      </el-table>
    </detail-block>
    <!-- 表格 -->
    <detail-block title="收款信息">
      <template #btns>
        <el-button v-if="pageType !== 'detail'" type="primary" @click="addPaymentListRow">
          增加行
        </el-button>
        <el-button v-if="pageType !== 'detail'" type="info" @click="delPaymentListRow">
          删除行
        </el-button>
      </template>
      <el-table
        :data="paymentList"
        border
        style="width: 100%;"
        max-height="600"
        @selection-change="handlePaymentSelectionChange"
      >
        <el-table-column v-if="pageType !== 'detail'" type="selection" width="38" />
        <el-table-column align="center" label="序号" width="80" type="index" />
        <el-table-column
          v-for="item in paymentColumn"
          :key="item.value"
          :prop="item.value"
          :label="item.text"
          :width="item.width"
          show-overflow-tooltip
          align="center"
        >
          <template #header>
            <span v-show="item.required" style="color: red;">*</span><span>{{ item.text }}</span>
          </template>
          <template #default="scope">
            <span v-if="item.value === 'paymentNum'">第{{ scope.$index + 1 }}次</span>
            <!-- 预计收款金额、实际收款金额 -->
            <el-input
              v-if="item.value === 'estimatePaymentAmount' || item.value === 'actualPaymentAmount'"
              v-model="scope.row[item.value]"
              :placeholder="pageType === 'detail' ? '' : `请输入${item.text}`"
              :disabled="pageType === 'detail'"
              class="input"
            />
            <!-- 预计收款时间、实际收款时间 -->
            <el-date-picker
              v-if="item.value === 'estimatePaymentDate' || item.value === 'actualPaymentDate'"
              v-model="scope.row[item.value]"
              type="datetime"
              :placeholder="pageType === 'detail' ? '' : '请选择'"
              format="YYYY-MM-DD HH:mm:ss"
              value-format="YYYY-MM-DD HH:mm:ss"
              :disabled="pageType === 'detail'"
            />
          </template>
        </el-table-column>
      </el-table>
    </detail-block>
    <detail-block v-if="query.approvalStatusName !== '草稿箱' && pageType !== 'add'" title="审批流程">
      <!-- 审批流程 -->
      <approval-record ref="approvalRecord" :approval-record-data="approvalRecordData" />
    </detail-block>
    <!-- 选择客户组件 -->
    <select-customer v-model:visible="customerVisible" @confirmCheckout="confirmCheckout" @changeVisible="changeVisible" />
    <!-- 选择委托单组件 -->
    <select-order v-model:visible="orderVisible" :is-multi="true" @confirmCheckout="confirmCheckoutOrder" @changeVisible="changeOrderVisible" />
    <!-- 审批弹窗 -->
    <approval-dialog ref="approvalDialog" @on-success="approvalSuccess" />
  </app-container>
</template>

<style lang="scss" scoped>
// 样式
</style>