<template>
  <view class="contract-container">
    <!-- 基本信息 -->
    <uni-card title="基本信息" spacing="0">
      <uni-forms ref="baseFormRef" :modelValue="baseForm" :rules="baseFormRules" label-position="left" :label-width="100" :border="true">
        <uni-forms-item name="contract_number" label="合同编号" required>
          <uni-easyinput v-model="baseForm.contract_number" placeholder="请输入合同编号"></uni-easyinput>
        </uni-forms-item>
        <uni-forms-item name="contract_name" label="合同名称" required>
          <uni-easyinput v-model="baseForm.contract_name" placeholder="请输入合同名称"></uni-easyinput>
        </uni-forms-item>
        <uni-forms-item name="contract_type" label="合同类型" required>
          <picker @change="onContractTypeChange" :range="contractTypeList" range-key="contract_type_name">
            <view class="picker">{{ baseForm.contract_type_name || '请选择合同类型' }}</view>
          </picker>
        </uni-forms-item>
        <uni-forms-item name="applyDate" label="申请日期">
          <uni-easyinput v-model="baseForm.applyDate" type="date" disabled />
        </uni-forms-item>
        <uni-forms-item name="department" label="填报部门">
          <uni-easyinput v-model="baseForm.department" disabled></uni-easyinput>
        </uni-forms-item>
        <uni-forms-item name="salesman_name" label="经办人">
          <uni-easyinput v-model="baseForm.salesman_name" disabled placeholder="自动生成"></uni-easyinput>
        </uni-forms-item>
        <uni-forms-item name="salesmanTel" label="联系电话">
          <uni-easyinput v-model="baseForm.salesmanTel" type="number" placeholder="请输入联系电话"></uni-easyinput>
        </uni-forms-item>
        <uni-forms-item name="firstparty_name" label="需方" required>
          <!-- 销售合同：显示选择客户按钮 -->
          <view v-if="isSalesContract" class="selector-wrapper" @click="openClientSelector">
            <text v-if="baseForm.firstparty_name">{{ baseForm.firstparty_name }}</text>
            <text v-else class="placeholder">请选择客户</text>
          </view>
          <!-- 其他合同类型：显示公司名称(只读) -->
          <uni-easyinput v-else v-model="baseForm.firstparty_name" disabled placeholder="自动生成"></uni-easyinput>
        </uni-forms-item>
        <uni-forms-item name="secondparty_name" label="供方" required>
          <!-- 销售合同：显示公司名称(只读) -->
          <uni-easyinput v-if="isSalesContract" v-model="baseForm.secondparty_name" disabled placeholder="自动生成"></uni-easyinput>
          <!-- 其他合同类型：显示选择供应商按钮 -->
          <view v-else class="selector-wrapper" @click="openSupplierSelector">
            <text v-if="baseForm.secondparty_name">{{ baseForm.secondparty_name }}</text>
            <text v-else class="placeholder">请选择供应商</text>
          </view>
        </uni-forms-item>
        <uni-forms-item name="contract_money" label="合同金额">
          <uni-easyinput
              v-model="baseForm.contract_money"
              type="digit"
              placeholder="请输入合同金额（自动计算或手动输入）"
              :readonly="!canEditContractMoney"
          ></uni-easyinput>
        </uni-forms-item>
        <uni-forms-item name="contractContent" label="合同内容">
          <uni-easyinput v-model="baseForm.contractContent" type="textarea" placeholder="请输入合同内容"></uni-easyinput>
        </uni-forms-item>
        <uni-forms-item name="projectItem" label="所属项目或产品">
          <uni-easyinput v-model="baseForm.projectItem" placeholder="请输入所属项目或产品"></uni-easyinput>
        </uni-forms-item>
        <uni-forms-item name="usePosition" label="使用位置">
          <uni-easyinput v-model="baseForm.usePosition" placeholder="请输入使用位置"></uni-easyinput>
        </uni-forms-item>
        <uni-forms-item name="other_contractor" label="对方联系人及电话">
          <uni-easyinput v-model="baseForm.other_contractor" placeholder="请输入对方联系人及电话"></uni-easyinput>
        </uni-forms-item>
        <uni-forms-item name="otherFile" label="随合同提交的其它材料">
          <uni-easyinput v-model="baseForm.otherFile" type="textarea" placeholder="请输入其它材料说明"></uni-easyinput>
        </uni-forms-item>
        <uni-forms-item name="salesmanSign" label="经办人签字">
          <uni-easyinput v-model="baseForm.salesmanSign" placeholder="请输入经办人签字"></uni-easyinput>
        </uni-forms-item>
      </uni-forms>
    </uni-card>

    <!-- 物料明细 -->
    <uni-card title="物品信息" spacing="0">
      <view class="material-actions">
        <button type="primary" size="mini" @click="openMaterialSelector" plain>添加物料</button>
      </view>

      <!-- 物料列表 - 卡片式展示 -->
      <view v-if="materialList.length > 0" class="material-list">
        <view v-for="(item, index) in materialList" :key="index" class="material-card">
          <view class="material-header" @click="toggleExpand(index)">
            <view class="material-main-info">
              <text class="material-name">{{ item.itemName }}</text>
              <text class="material-code">{{ item.itemCode }}</text>
            </view>
            <view class="material-expand">
              <uni-icons :type="item.expanded ? 'up' : 'down'" size="16" color="#999"></uni-icons>
            </view>
          </view>

          <!-- 展开的详细信息 -->
          <view v-show="item.expanded" class="material-detail">
            <view class="detail-row">
              <text class="detail-label">规格型号：</text>
              <text class="detail-value">{{ item.specification }}</text>
            </view>
            <view class="detail-row">
              <text class="detail-label">单位：</text>
              <text class="detail-value">{{ item.measureName }}</text>
            </view>
            <view class="detail-row">
              <text class="detail-label">数量：</text>
              <uni-easyinput
                  v-model="item.qty"
                  type="digit"
                  placeholder="请输入数量"
                  style="width: 100px; display: inline-block;"
                  @blur="onQuantityBlur(item)"
              />
            </view>
            <view class="detail-row">
              <text class="detail-label">税前单价：</text>
              <uni-easyinput
                  v-model="item.price"
                  type="digit"
                  placeholder="请输入税前单价"
                  style="width: 120px; display: inline-block;"
                  @blur="onPriceBlur(item)"
              />
            </view>
            <view class="detail-row">
              <text class="detail-label">税率 (%)：</text>
              <uni-easyinput
                  v-model="item.cess"
                  type="digit"
                  placeholder="请输入税率"
                  style="width: 80px; display: inline-block;"
                  @blur="onCessBlur(item)"
              />
            </view>
            <view class="detail-row">
              <text class="detail-label">税后单价：</text>
              <text class="detail-value price-value">{{ item.priceTax }}</text>
            </view>
            <!-- 采购申请单编号（仅当从采购申请单添加且非销售合同时显示） -->
            <view v-if="!isSalesContract && item.purchaseNumber" class="detail-row purchase-number-row">
              <text class="detail-label">采购申请单：</text>
              <text class="detail-value purchase-number">{{ item.purchaseNumber }}</text>
            </view>
            <view class="detail-row delete-row">
              <button type="warn" size="mini" @click="removeMaterial(index)">删除</button>
            </view>
          </view>
        </view>
      </view>

      <view v-else class="empty-materials">
        <text>暂无物料，请点击上方按钮添加</text>
      </view>
    </uni-card>

    <!-- 付款信息 -->
    <uni-card title="付款信息" spacing="0">
      <view class="payment-actions">
        <button type="primary" size="mini" @click="addPaymentInfo" :disabled="materialList.length === 0" plain>添加付款方式</button>
      </view>

      <!-- 付款方式列表 -->
      <view v-if="paymentList.length > 0" class="payment-list">
        <view v-for="(item, index) in paymentList" :key="index" class="payment-card">
          <view class="payment-header" @click="togglePaymentExpand(index)">
            <view class="payment-main-info">
              <text class="payment-type">{{ item.payTypeName }}</text>
              <text class="payment-proportion">比例：{{ item.proportion }}%</text>
            </view>
            <view class="payment-expand">
              <uni-icons :type="item.expanded ? 'up' : 'down'" size="16" color="#999"></uni-icons>
            </view>
          </view>

          <!-- 展开的详细信息 -->
          <view v-show="item.expanded" class="payment-detail">
            <view class="detail-row">
              <text class="detail-label">付款方式：</text>
              <picker @change="(e) => onPaymentTypeChange(index, e)" :range="paymentTypeList" range-key="payTypeName">
                <view class="picker">
                  {{ item.payTypeName || '请选择付款方式' }}
                </view>
              </picker>
            </view>
            <view class="detail-row">
              <text class="detail-label">比例：</text>
              <uni-easyinput
                  v-model="item.proportion"
                  type="digit"
                  placeholder="请输入比例"
                  style="width: 80px; display: inline-block;"
                  @blur="onProportionBlur(item)"
              />
              <text>%</text>
            </view>
            <view class="detail-row">
              <text class="detail-label">金额：</text>
              <text class="detail-value price-value">{{ item.amount }}</text>
            </view>
            <view class="detail-row">
              <text class="detail-label">已付金额：</text>
              <uni-easyinput
                  v-model="item.amountPaid"
                  type="digit"
                  placeholder="请输入已付金额"
                  style="width: 120px; display: inline-block;"
                  @blur="onAmountPaidBlur(item)"
              />
            </view>
            <view class="detail-row">
              <text class="detail-label">付款状态：</text>
              <text class="detail-value status-tag" :class="'status-' + item.payStatus">{{ item.payStatusName }}</text>
            </view>
            <view class="detail-row">
              <text class="detail-label">付款时间：</text>
              <uni-datetime-picker
                  ref="payTimePicker"
                  v-model="item.payTime"
                  type="date"
                  placeholder="选择付款时间"
                  style="display: inline-block;"
                  @click.native.stop
                  @confirm="(e) => onPayTimeConfirm(item, e)"
              />
            </view>
            <view class="detail-row">
              <text class="detail-label">备注：</text>
              <uni-easyinput
                  v-model="item.remark"
                  placeholder="请输入备注"
                  style="flex: 1; display: inline-block;"
              />
            </view>
            <view class="detail-row delete-row">
              <button type="warn" size="mini" @click="removePayment(index)">删除</button>
            </view>
          </view>
        </view>
      </view>

      <view v-else class="empty-payments">
        <text v-if="materialList.length === 0">请先添加物料信息</text>
        <text v-else>暂无付款方式，请点击上方按钮添加</text>
      </view>
    </uni-card>

    <!-- 上传附件 -->
    <uni-card title="上传附件" :extra="`${fileList.length}/50`" spacing="0">
      <uni-file-picker
          ref="filePicker"
          v-model="fileList"
          :auto-upload="true"
          mode="list"
          :limit="50"
          :limit-length="50"
          file-mediatype="all"
          @select="handleFileSelect"
          @progress="handleFileProgress"
          @success="handleFileSuccess"
          @fail="handleFileFail"
          @delete="handleFileDelete"
      />
    </uni-card>

    <!-- 提交按钮 -->
    <view class="submit-btn-wrapper">
      <button type="primary" :loading="isSubmitting" :disabled="isSubmitting" @click="submitForm">提 交</button>
    </view>

    <!-- 选择器弹出层 -->
    <uni-popup ref="selectorPopup" type="center">
      <view class="selector-popup">
        <view class="popup-header">
          <text class="popup-title">{{ popupTitle }}</text>
          <uni-icons type="closeempty" size="20" @click="closePopup"></uni-icons>
        </view>

        <!-- 物料来源选择（仅物料选择时显示，且非销售合同） -->
        <view v-if="selectorType === 'material' && !isSalesContract" class="material-source-selector">
          <view class="source-options">
            <view 
                :class="['source-option', materialSource === 'mes' ? 'active' : '']"
                @click="materialSource = 'mes'; onMaterialSourceChange()">
              MES 系统
            </view>
            <view 
                :class="['source-option', materialSource === 'purchase' ? 'active' : '']"
                @click="materialSource = 'purchase'; onMaterialSourceChange()">
              采购申请
            </view>
          </view>
        </view>

        <!-- 搜索框 -->
        <view v-if="(selectorType === 'material' && materialSource === 'mes') || selectorType === 'supplier' || selectorType === 'client'" class="search-bar">
          <uni-easyinput
              v-model="searchKeyword"
              :placeholder="selectorType === 'material' ? '输入物料名称搜索' : (selectorType === 'supplier' ? '输入供应商名称搜索' : '输入客户名称搜索')"
              clearable
              @confirm="handleSearch"
          />
          <button type="primary" size="mini" @click="handleSearch">搜索</button>
        </view>

        <!-- 采购申请单选择器（采购申请模式，且非销售合同） -->
        <view v-if="selectorType === 'material' && materialSource === 'purchase' && !isSalesContract" class="purchase-selector">
          <picker @change="onPurchaseChange" :range="purchaseApplyList" range-key="contractPurchaseFormNumber">
            <view class="picker">
              {{ selectedPurchaseApply ? selectedPurchaseApply.contractPurchaseFormNumber : '全部采购申请单' }}
            </view>
          </picker>
          <button type="primary" size="mini" @click="loadPurchaseMaterials">查询</button>
          <button type="warn" size="mini" @click="clearPurchaseSelection" v-if="selectedPurchaseApply">清空</button>
        </view>

        <scroll-view
            scroll-y
            class="popup-content"
            refresher-enabled
            :refresher-triggered="isRefreshing"
            @refresherrefresh="onRefresh"
            @scrolltolower="loadMore"
        >
          <view v-for="(item, index) in selectorList" :key="index"
                class="selector-item"
                @click="selectItem(item)">
            <view class="selector-item-content">
              <view class="item-info">
                <text class="item-name">{{ getSelectorItemName(item) }}</text>
                <!-- 采购申请模式显示采购单号（仅非销售合同） -->
                <text v-if="!isSalesContract && materialSource === 'purchase' && item.purchaseNumber" class="item-purchase">
                  采购单：{{ item.purchaseNumber }}
                </text>
                <text v-if="getItemCode(item)" class="item-code">{{ getItemCode(item) }}</text>
                <text v-if="getItemSpec(item)" class="item-spec">{{ getItemSpec(item) }}</text>
                <!-- 显示单位和数量 -->
                <text v-if="item.measureName || item.qty" class="item-extra">
                  <text v-if="item.measureName">{{ item.measureName }}</text>
                  <text v-if="item.qty"> 可用：{{ item.qty }}</text>
                </text>
              </view>
              <text v-if="isSelected(item)" class="selected-tag">已选择</text>
            </view>
          </view>

          <!-- 加载状态 -->
          <view v-if="isLoading && selectorList.length > 0" class="loading-text">
            <uni-load-more status="loading" />
          </view>

          <!-- 没有更多数据 -->
          <view v-else-if="!hasMore && selectorList.length > 0" class="no-more-text">
            <text>没有更多了</text>
          </view>

          <!-- 空数据提示 -->
          <view v-if="selectorList.length === 0 && !isLoading" class="empty-data">
            <text>{{ searchKeyword ? '暂无相关数据' : '暂无数据' }}</text>
          </view>
        </scroll-view>
      </view>
    </uni-popup>
  </view>
</template>

<script setup lang="ts">
import { onMounted, reactive, ref, computed } from 'vue'
import { onLoad } from '@dcloudio/uni-app'
import { useUserStore } from '@/store/user.js'
import $modal from '@/plugins/modal.js'
import $tab from '@/plugins/tab.js'
import { getContractInitData, startContractProcess, getMaterialList, getSupplierList, getClientList, getPurchaseApplyList, getPurchaseDetailList, checkContractNumber } from '@/api/contract.js'
import { uploadFile, getProcessInfo } from '@/api/work.js'
import config from '@/config.js'

const userStore = useUserStore()

// 流程信息（参考通用流程）
let processInfo = reactive({
  modelName: '合同审批',
  reqOffice: 0,
  control: '',
  formId: '',
  modelId: '',
  tmodelId: '',
  isMoreIns: '',
  pathJudgeType: '',
  form: []
})

// 接收页面参数
onLoad((options) => {
  const { modelName, modelId, control } = options
  if (modelName) processInfo.modelName = modelName
  if (modelId) processInfo.modelId = modelId
  if (control) processInfo.control = control
})

// 初始化流程信息（获取 formId, tmodelId 等）
onMounted(() => {
  initProcessInfo().then(() => {
    // 初始化基本信息（流水号、部门等）
    initBaseForm()
  })
})

function initProcessInfo() {
  return new Promise<void>((resolve, reject) => {
    // 如果没有传入 modelId，使用默认值或提示错误
    if (!processInfo.modelId) {
      $modal.msgError('缺少流程模型')
      reject(new Error('缺少流程模型 ID'))
      return
    }

    getProcessInfo(processInfo)
        .then(({ returnParams }) => {
          const { formId, tmodelId, isMoreIns, pathJudgeType, reqOffice } = returnParams.flow[0]
          processInfo.formId = formId
          processInfo.tmodelId = tmodelId
          processInfo.isMoreIns = isMoreIns
          processInfo.pathJudgeType = pathJudgeType
          processInfo.reqOffice = reqOffice || 0 // 是否需要附件（0-不需要，1-需要）
          resolve()
        })
        .catch(err => {
          console.error('获取流程信息失败:', err)
          reject(err)
        })
  })
}

function initBaseForm() {
  // 获取初始化数据 (流水号、部门信息等)
  getContractInitData(userStore.user.useId).then(res => {
    if (res.returnCode === '1') {
      const params = res.returnParams
      
      // 合同编号改为手动输入，不再生成
      // baseForm.contract_number = params.contract_number || ''
      baseForm.contract_number = '' // 清空，由用户手动输入
      baseForm.initiator = params.initiator || userStore.user.name
      baseForm.department = params.department || ''
      baseForm.depid = params.depid || null
      baseForm.applyDate = params.applyDate || ''
      baseForm.salesman_name = params.salesman_name || userStore.user.name
      baseForm.salesmanTel = params.salesmanTel || ''
      baseForm.salesman = params.salesman || userStore.user.useId.toString()
      baseForm.firstparty_name = params.firstparty_name || ''
      // 保存公司名称，用于销售合同时对调需方供方
      ;(baseForm as any).companyName = params.firstparty_name || ''
      // 录入人信息 (与 PC 端保持一致)
      baseForm.contract_entrying_operator = params.contract_entrying_operator || userStore.user.useId.toString()
      baseForm.contract_entrying_operator_name = params.contract_entrying_operator_name || userStore.user.name

      // 合同类型列表
      if (params.typeList && params.typeList.length > 0) {
        contractTypeList.value = params.typeList
      }

      // 付款方式列表（用于付款信息选择）
      if (params.paymentList && params.paymentList.length > 0) {
        paymentTypeList.value = params.paymentList
      }
    } else {
      console.error('获取初始化数据失败，returnCode:', res.returnCode)
      $modal.msgError('获取初始化数据失败：' + (res.returnMsg || '未知错误'))
    }
  }).catch(err => {
    console.error('获取初始化数据异常:', err)
    $modal.msgError('获取初始化数据失败：' + (err.message || '未知错误'))
  })
}

const baseForm = reactive({
  contract_number: '',
  contract_name: '',
  contract_type: '',
  contract_type_name: '',
  applyDate: '',
  initiator: '',
  department: '',
  depid: null,
  salesman: '',
  salesman_name: '',
  salesmanTel: '',
  supplierCode: '',  // 供应商或客户的编码
  supplierName: '',  // 供应商或客户的名称
  contract_money: '',
  contractContent: '',
  projectItem: '',
  usePosition: '',
  other_contractor: '',
  otherFile: '',
  salesmanSign: '',
  firstparty_name: '',   // 需方名称
  secondparty_name: '',  // 供方名称
  // 录入人信息 (与 PC 端保持一致)
  contract_entrying_operator: '',
  contract_entrying_operator_name: ''
})

const contractTypeList = ref<any[]>([])
const paymentTypeList = ref<any[]>([])
const materialList = ref<any[]>([])
const paymentList = ref<any[]>([])
const isSubmitting = ref(false)

// 文件上传相关
const fileList = ref<any[]>([])
const fileSeqs = ref<any[]>([])

// 表单校验规则
const baseFormRef = ref(null)
const baseFormRules = computed(() => {
  return {
    contract_number: {
      rules: [{ required: true, message: '请输入合同编号' }],
      label: '合同编号'
    },
    contract_name: {
      rules: [{ required: true, message: '请输入合同名称' }],
      label: '合同名称'
    },
    contract_type: {
      rules: [{ required: true, message: '请选择合同类型' }],
      label: '合同类型'
    },
    secondparty_name: {
      rules: [{ required: true, message: '请选择供方' }],
      label: '供方'
    }
  }
})

// 选择器相关
const selectorPopup = ref(null)
const selectorList = ref<any[]>([])
const selectorType = ref('') // 'material', 'supplier', 'client', 'salesman'

// 物料来源：'mes' - MES 系统，'purchase' - 采购申请
const materialSource = ref('mes')
const purchaseApplyList = ref<any[]>([]) // 采购申请单列表
const selectedPurchaseApply = ref<any>(null) // 选中的采购申请单

// 分页和搜索相关
const currentPage = ref(1)
const pageSize = 20
const hasMore = ref(true)
const isLoading = ref(false)
const isRefreshing = ref(false)
const searchKeyword = ref('')

// 判断是否为销售合同
const isSalesContract = computed(() => {
  return baseForm.contract_type === '1' || baseForm.contract_type === 1
})

// 合同金额是否可编辑（有物料时可编辑）
const canEditContractMoney = computed(() => {
  return materialList.value.length > 0
})

const popupTitle = computed(() => {
  if (selectorType.value === 'material') return '选择物料'
  if (selectorType.value === 'supplier') return '选择供应商'
  if (selectorType.value === 'client') return '选择客户'
  if (selectorType.value === 'salesman') return '选择经办人'
  return '选择'
})

// 切换展开/收起状态
function toggleExpand(index: number) {
  if (materialList.value[index]) {
    materialList.value[index].expanded = !materialList.value[index].expanded
  }
}

// 切换付款方式展开/收起
function togglePaymentExpand(index: number) {
  if (paymentList.value[index]) {
    paymentList.value[index].expanded = !paymentList.value[index].expanded
  }
}

// 物料价格计算
function calculateMaterialPrice(item: any) {
  const price = parseFloat(item.price) || 0
  const cess = parseFloat(item.cess) || 0

  // 计算税后单价：税前单价 * (1 + 税率 / 100)
  item.priceTax = (price * (1 + cess / 100)).toFixed(2)

  // 重新计算总价
  calculateTotalPrice()
}

// 计算合同总价
function calculateTotalPrice() {
  let total = 0
  materialList.value.forEach(item => {
    const qty = parseFloat(item.qty) || 0
    const priceTax = parseFloat(item.priceTax) || 0
    total += qty * priceTax
  })

  // 如果合同金额为空或小于总价，自动更新
  const currentMoney = parseFloat(baseForm.contract_money) || 0
  if (!currentMoney || currentMoney < total) {
    baseForm.contract_money = total.toFixed(2)
  }

  // 更新付款信息中的金额
  calculatePaymentAmount()
}

// 数量变化时
function onQuantityBlur(item: any) {
  calculateTotalPrice()
}

// 税前单价变化时
function onPriceBlur(item: any) {
  calculateMaterialPrice(item)
}

// 税率变化时
function onCessBlur(item: any) {
  calculateMaterialPrice(item)
}

// 添加付款方式
function addPaymentInfo() {
  if (materialList.value.length === 0) {
    $modal.msgWarn('请先添加物料信息')
    return
  }

  paymentList.value.push({
    payType: '',
    payTypeName: '',
    proportion: '0',
    amount: '0',
    amountPaid: '0',
    payTime: '',
    payStatus: '0',
    payStatusName: '未支付',
    remark: '',
    expanded: true
  })
}

// 付款方式类型变化
function onPaymentTypeChange(index: number, e: any) {
  const selectedIndex = e.detail.value
  const selected = paymentTypeList.value[selectedIndex]
  if (selected) {
    paymentList.value[index].payType = selected.payType
    paymentList.value[index].payTypeName = selected.payTypeName
  }
}

// 付款时间变化
function onPayTimeChange(item: any, e: any) {
  // uni-datetime-picker 返回的可能是时间戳或 Date 对象，需要转换为字符串
  const dateValue = e
  if (dateValue) {
    // 如果是时间戳或数字，转换为日期字符串
    if (typeof dateValue === 'number' || typeof dateValue === 'string') {
      const date = new Date(dateValue)
      if (!isNaN(date.getTime())) {
        const year = date.getFullYear()
        const month = String(date.getMonth() + 1).padStart(2, '0')
        const day = String(date.getDate()).padStart(2, '0')
        item.payTime = `${year}-${month}-${day}`
      }
    } else if (typeof dateValue === 'object') {
      // 如果已经是 Date 对象
      const year = dateValue.getFullYear()
      const month = String(dateValue.getMonth() + 1).padStart(2, '0')
      const day = String(dateValue.getDate()).padStart(2, '0')
      item.payTime = `${year}-${month}-${day}`
    }
  }
}

// 比例变化时重新计算金额
function onProportionBlur(item: any) {
  calculatePaymentAmount()
}

// 计算付款金额（根据比例）
function calculatePaymentAmount() {
  const contractMoney = parseFloat(baseForm.contract_money) || 0

  paymentList.value.forEach(item => {
    const proportion = parseFloat(item.proportion) || 0
    const amount = (contractMoney * proportion / 100).toFixed(2)
    item.amount = amount

    // 更新付款状态
    updatePaymentStatus(item)
  })
}

// 更新付款状态
function updatePaymentStatus(item: any) {
  const amount = parseFloat(item.amount) || 0
  const amountPaid = parseFloat(item.amountPaid) || 0

  if (amountPaid === 0) {
    item.payStatus = '0'
    item.payStatusName = '未支付'
  } else if (amountPaid < amount) {
    item.payStatus = '1'
    item.payStatusName = '部分支付'
  } else if (amountPaid >= amount) {
    item.payStatus = '2'
    item.payStatusName = '已支付'
  }
}

// 已付金额变化时
function onAmountPaidBlur(item: any) {
  updatePaymentStatus(item)
}

// 监听合同金额变化
function onContractMoneyChange() {
  calculatePaymentAmount()
}

// 打开物料选择器
async function openMaterialSelector() {
  selectorType.value = 'material'
  materialSource.value = 'mes' // 默认 MES 系统模式
  currentPage.value = 1
  hasMore.value = true
  selectorList.value = []
  await loadMaterials(1, false)
  openPopup()
}

// 打开供应商选择器
async function openSupplierSelector() {
  selectorType.value = 'supplier'
  currentPage.value = 1
  hasMore.value = true
  selectorList.value = []
  await loadSuppliers(1, false)
  openPopup()
}

// 加载物料列表（分页）
async function loadMaterials(page: number, append: boolean = false) {
  if (isLoading.value) return

  isLoading.value = true
  if (page === 1) {
    isRefreshing.value = true
  }

  try {
    const res = await getMaterialList(
        userStore.user.useId,
        page,
        pageSize,
        searchKeyword.value
    )

    if (res.returnCode === '1') {
      const result = res.returnParams
      const newList = result.list || []

      if (append) {
        // 追加模式（加载更多）
        selectorList.value = [...selectorList.value, ...newList]
      } else {
        // 覆盖模式（刷新/搜索）
        selectorList.value = newList
      }

      // 判断是否还有更多数据
      hasMore.value = selectorList.value.length < result.total
    } else {
      $modal.msgError('加载物料失败')
    }
  } catch (error) {
    console.error('加载物料失败', error)
    $modal.msgError('加载失败')
  } finally {
    isLoading.value = false
    isRefreshing.value = false
  }
}

// 加载供应商列表（分页）
async function loadSuppliers(page: number, append: boolean = false) {
  if (isLoading.value) return

  isLoading.value = true
  if (page === 1) {
    isRefreshing.value = true
  }

  try {
    const res = await getSupplierList(
        userStore.user.useId,
        page,
        pageSize,
        searchKeyword.value
    )

    if (res.returnCode === '1') {
      const result = res.returnParams
      const newList = result.list || []

      if (append) {
        selectorList.value = [...selectorList.value, ...newList]
      } else {
        selectorList.value = newList
      }

      hasMore.value = selectorList.value.length < result.total
    } else {
      $modal.msgError('加载供应商失败')
    }
  } catch (error) {
    console.error('加载供应商失败', error)
    $modal.msgError('加载失败')
  } finally {
    isLoading.value = false
    isRefreshing.value = false
  }
}

// 加载更多
function loadMore() {
  if (!hasMore.value || isLoading.value) return
  currentPage.value++

  if (selectorType.value === 'material') {
    if (materialSource.value === 'mes') {
      loadMaterials(currentPage.value, true)
    } else {
      // 采购申请模式，加载物料分页
      loadPurchaseMaterials(false)
    }
  } else if (selectorType.value === 'supplier') {
    loadSuppliers(currentPage.value, true)
  } else if (selectorType.value === 'client') {
    loadClients(currentPage.value, true)
  }
}

// 下拉刷新
function onRefresh() {
  currentPage.value = 1
  if (selectorType.value === 'material') {
    if (materialSource.value === 'mes') {
      loadMaterials(1, false)
    } else {
      // 采购申请模式，重新加载物料
      loadPurchaseMaterials(true)
    }
  } else if (selectorType.value === 'supplier') {
    loadSuppliers(1, false)
  } else if (selectorType.value === 'client') {
    loadClients(1, false)
  }
}

// 搜索
function handleSearch() {
  currentPage.value = 1
  if (selectorType.value === 'material') {
    loadMaterials(1, false)
  } else if (selectorType.value === 'supplier') {
    loadSuppliers(1, false)
  } else if (selectorType.value === 'client') {
    loadClients(1, false)
  }
}

// 物料来源切换时
async function onMaterialSourceChange() {
  currentPage.value = 1
  hasMore.value = true
  selectorList.value = []
  searchKeyword.value = ''
  
  if (materialSource.value === 'mes') {
    // MES 系统模式，加载物料列表
    await loadMaterials(1, false)
  } else {
    // 采购申请模式，先加载采购申请单列表，然后加载所有物料
    await loadPurchaseApplyList()
    // 加载完采购申请单后，立即查询物料（默认不指定具体采购单）
    await loadPurchaseMaterials(true) // true 表示重置分页
  }
}

// 加载采购申请单列表（与 PC 端一致，不分页）
async function loadPurchaseApplyList() {
  if (isLoading.value) return
  
  isLoading.value = true
  isRefreshing.value = true
  
  try {
    const res = await getPurchaseApplyList(
      userStore.user.useId
    )
    
    if (res.returnCode === '1') {
      const result = res.returnParams
      purchaseApplyList.value = result.list || []
      selectedPurchaseApply.value = null
      selectorList.value = [] // 清空物料列表
    } else {
      $modal.msgError('加载采购申请单失败')
    }
  } catch (error) {
    console.error('加载采购申请单失败', error)
    $modal.msgError('加载失败')
  } finally {
    isLoading.value = false
    isRefreshing.value = false
  }
}

// 采购申请单选择变化
function onPurchaseChange(e: any) {
  const selectedIndex = e.detail.value
  selectedPurchaseApply.value = purchaseApplyList.value[selectedIndex]
  // 选择采购单后，重新加载物料（重置分页）
  loadPurchaseMaterials(true)
}

// 清空采购申请单选择
function clearPurchaseSelection() {
  selectedPurchaseApply.value = null
  // 清空后重新加载所有物料
  loadPurchaseMaterials(true)
}

// 加载采购申请单的物料
async function loadPurchaseMaterials(resetPage = false) {
  if (isLoading.value) return
  
  // 如果是分页加载，不清空列表
  if (resetPage) {
    currentPage.value = 1
    selectorList.value = []
  }
  
  isLoading.value = true
  isRefreshing.value = resetPage
  
  try {
    // 如果不指定采购申请单，则查询所有物料
    const purchaseFormId = selectedPurchaseApply.value 
      ? selectedPurchaseApply.value.contractPurchaseFormId.toString()
      : ''
    
    const res = await getPurchaseDetailList(
      userStore.user.useId,
      purchaseFormId,
      currentPage.value,
      10 // 每页 10 条，与 PC 端一致
    )
    
    if (res.returnCode === '1') {
      const result = res.returnParams
      const newList = result.list || []
      
      if (resetPage) {
        selectorList.value = newList
      } else {
        // 追加数据
        selectorList.value.push(...newList)
      }
      
      // 判断是否还有更多数据
      hasMore.value = selectorList.value.length < result.total
      
      if (!resetPage) {
        currentPage.value++
      }
    } else {
      $modal.msgError('加载物料失败')
    }
  } catch (error) {
    console.error('加载物料失败', error)
    $modal.msgError('加载失败')
  } finally {
    isLoading.value = false
    isRefreshing.value = false
  }
}

// 判断是否已选中
// 注意：只有当物料编码和采购申请单编号都相同时，才认为是重复选择
function isSelected(item: any): boolean {
  if (selectorType.value === 'material') {
    const itemCode = item.itemCode || item.materialCode || ''
    const purchaseNumber = item.purchaseNumber || ''
    
    // 检查物料列表中是否存在相同的物料（物料编码 + 采购申请单编号都相同）
    return materialList.value.some(m => {
      const existItemCode = m.itemCode || ''
      const existPurchaseNumber = m.purchaseNumber || ''
      
      // 只有当物料编码和采购申请单编号都相同时，才认为是重复
      return existItemCode === itemCode && 
             ((existPurchaseNumber === purchaseNumber) || 
              (!existPurchaseNumber && !purchaseNumber))
    })
  } else if (selectorType.value === 'supplier') {
    const code = item.vendorCode || item.supplierCode
    return baseForm.supplierCode === code
  } else if (selectorType.value === 'client') {
    const code = item.clientCode
    return baseForm.supplierCode === code
  }
  return false
}

function openPopup() {
  ;(selectorPopup.value as any).open()
}

function closePopup() {
  ;(selectorPopup.value as any).close()
}

function getSelectorItemName(item: any): string {
  if (selectorType.value === 'material') {
    return item.itemName || item.materialName || ''
  } else if (selectorType.value === 'supplier') {
    return item.vendorName || item.supplierName || ''
  } else if (selectorType.value === 'client') {
    return item.clientName || ''
  }
  return ''
}

function getItemCode(item: any): string {
  if (selectorType.value === 'material') {
    return item.itemCode || item.materialCode || ''
  } else if (selectorType.value === 'supplier') {
    return item.vendorCode || item.supplierCode || ''
  } else if (selectorType.value === 'client') {
    return item.clientCode || ''
  }
  return ''
}

function getItemSpec(item: any): string {
  if (selectorType.value === 'material') {
    return item.specification || item.materialModel || ''
  }
  // 客户和供应商没有规格字段
  return ''
}

function selectItem(item: any) {
  if (selectorType.value === 'material') {
    addMaterial(item)
  } else if (selectorType.value === 'supplier') {
    selectSupplier(item)
  } else if (selectorType.value === 'client') {
    selectClient(item)
  }
  closePopup()
}

function addMaterial(item: any) {
  // 检查是否已存在（根据物料编码 + 采购申请单编号判断）
  const exists = isSelected(item)
  if (exists) {
    $modal.msgWarn('该物料已存在')
    return
  }
  
  // 销售合同不允许选择有采购申请单的物料
  if (isSalesContract.value) {
    const purchaseId = item.purchaseId || ''
    const purchaseNumber = item.purchaseNumber || ''
    if ((purchaseId && purchaseId !== 'null' && purchaseId !== '0' && purchaseId !== 'undefined') || 
        (purchaseNumber && purchaseNumber !== 'null' && purchaseNumber !== 'undefined')) {
      $modal.msgWarn('销售合同不允许选择来自采购申请单的物料')
      return
    }
  }

  // 确保数值字段正确转换（防止后端返回对象或字符串）
  const qty = parseFloat(item.qty) || 0
  const price = parseFloat(item.price) || 0
  const cess = parseFloat(item.cess) || 0
  const priceTax = parseFloat(item.priceTax) || 0

  materialList.value.push({
    itemCode: item.itemCode,
    itemName: item.itemName,
    specification: item.specification,
    measureName: item.measureName,
    qty: qty,
    price: price,
    cess: cess,
    priceTax: priceTax,
    purchaseId: isSalesContract.value ? '' : (item.purchaseId || selectedPurchaseApply.value?.contractPurchaseFormId || ''),
    purchaseNumber: isSalesContract.value ? '' : (item.purchaseNumber || selectedPurchaseApply.value?.contractPurchaseFormNumber || ''),
    expanded: true
  })

  // 重新计算总价
  calculateTotalPrice()
}

function selectSupplier(item: any) {
  // 供方=供应商名称
  baseForm.secondparty_name = item.vendorName
  // supplierCode/supplierName 保存供应商信息
  baseForm.supplierCode = item.vendorCode
  baseForm.supplierName = item.vendorName
}

// 打开客户选择器（销售合同时使用）
async function openClientSelector() {
  selectorType.value = 'client'
  currentPage.value = 1
  hasMore.value = true
  selectorList.value = []
  await loadClients(1, false)
  openPopup()
}

// 加载客户列表（分页）
async function loadClients(page: number, append: boolean = false) {
  if (isLoading.value) return

  isLoading.value = true
  if (page === 1) {
    isRefreshing.value = true
  }

  try {
    const res = await getClientList(
        userStore.user.useId,
        page,
        pageSize,
        searchKeyword.value
    )

    if (res.returnCode === '1') {
      const result = res.returnParams
      const newList = result.list || []

      if (append) {
        // 追加模式（加载更多）
        selectorList.value = [...selectorList.value, ...newList]
      } else {
        // 覆盖模式（刷新/搜索）
        selectorList.value = newList
      }

      // 判断是否还有更多数据
      hasMore.value = selectorList.value.length < result.total
    } else {
      $modal.msgError('加载客户失败')
    }
  } catch (error) {
    console.error('加载客户失败', error)
    $modal.msgError('加载失败')
  } finally {
    isLoading.value = false
    isRefreshing.value = false
  }
}

// 选择客户
function selectClient(item: any) {
  // 需方=客户名称
  baseForm.firstparty_name = item.clientName
  // supplierCode/supplierName 保存客户信息
  baseForm.supplierCode = item.clientCode
  baseForm.supplierName = item.clientName
}

function removeMaterial(index: number) {
  $modal.confirm('', '确认删除该物料？')
      .then(() => {
        materialList.value.splice(index, 1)
        // 重新计算总价
        calculateTotalPrice()
      })
      .catch(() => {})
}

function removePayment(index: number) {
  $modal.confirm('', '确认删除该付款方式？')
      .then(() => {
        paymentList.value.splice(index, 1)
      })
      .catch(() => {})
}

// 合同类型变化
let lastContractType = '' // 保存上一次的合同类型

function onContractTypeChange(e: any) {
  const index = e.detail.value
  const oldContractType = lastContractType
  const newContractType = contractTypeList.value[index].contract_type
  
  // 如果合同类型发生变化，检查是否需要清理物料
  if (oldContractType !== String(newContractType)) {
    // 切换到销售合同时，检查是否有来自采购申请单的物料
    if (newContractType === '1' || newContractType === 1) {
      const invalidMaterials: number[] = []
      materialList.value.forEach((item, idx) => {
        const purchaseId = item.purchaseId || ''
        const purchaseNumber = item.purchaseNumber || ''
        // 排除空值、null字符串、0等无效值
        if ((purchaseId && purchaseId !== 'null' && purchaseId !== '0' && purchaseId !== 'undefined') || 
            (purchaseNumber && purchaseNumber !== 'null' && purchaseNumber !== 'undefined')) {
          invalidMaterials.push(idx)
        }
      })
      
      if (invalidMaterials.length > 0) {
        $modal.confirm('', `检测到已选择的物料中有 ${invalidMaterials.length} 条来自采购申请单的数据，销售合同不允许使用采购申请单物料，是否清除这些不符合要求的物料？`)
          .then(() => {
            // 用户确认，删除不符合要求的物料（从后往前删，避免索引错乱）
            for (let i = invalidMaterials.length - 1; i >= 0; i--) {
              materialList.value.splice(invalidMaterials[i], 1)
            }
            // 重新计算总价
            calculateTotalPrice()
            // 更新合同类型为销售合同
            baseForm.contract_type = newContractType
            baseForm.contract_type_name = contractTypeList.value[index].contract_type_name
            lastContractType = String(newContractType)
            // 调整需方供方显示
            adjustPartyDisplay()
            $modal.msgSuccess(`已清除 ${invalidMaterials.length} 条不符合要求的物料`)
          })
          .catch(() => {
            // 用户取消，恢复原来的合同类型
            // 不需要做任何事，因为还没有更新 contract_type
          })
        return // 等待用户确认后再继续
      }
    }
  }
  
  // 更新合同类型
  baseForm.contract_type = newContractType
  baseForm.contract_type_name = contractTypeList.value[index].contract_type_name
  lastContractType = String(newContractType)
  
  // 根据合同类型调整需方和供方的显示
  adjustPartyDisplay()
}

// 根据合同类型调整需方和供方的显示
function adjustPartyDisplay() {
  // 从初始化数据中获取公司名称（需在 initBaseForm 中保存）
  const companyName = (baseForm as any).companyName || ''
  
  if (isSalesContract.value) {
    // 销售合同：需方=选择客户，供方=公司名称(只读)
    baseForm.secondparty_name = companyName
    baseForm.supplierCode = ''
    baseForm.supplierName = ''
    baseForm.firstparty_name = ''
  } else {
    // 其他合同类型：需方=公司名称(只读)，供方=选择供应商
    baseForm.firstparty_name = companyName
    baseForm.secondparty_name = ''
    baseForm.supplierCode = ''
    baseForm.supplierName = ''
  }
}

// 文件上传相关函数
async function handleFileSelect(files: any) {
  files.tempFiles.forEach(async (file: any) => {
    const data = {
      name: file.name,
      filePath: file.path,
    }
    try {
      const res = await uploadFile(data)
      file.seq = res.returnParams
      fileSeqs.value.push({ 'seq': res.returnParams, 'path': file.path })
      fileList.value.push(file)
      $modal.msgSuccess('文件' + data.name + '上传成功')
    } catch (err) {
      $modal.msgError('文件' + data.name + '上传失败，请删除重新上传')
      console.error('文件上传失败:', err)
    }
  })
}

function handleFileProgress(file: any, progress: any) {
  //console.log('handleFileProgress', file, progress)
}

function handleFileSuccess(file: any, res: any) {
  //console.log('handleFileSuccess', file, res)
}

function handleFileFail(file: any, err: any) {
  //console.log('handleFileFail', file, err)
}

function handleFileDelete(file: any) {
  const index = fileSeqs.value.findIndex(({ path }) => path === file.tempFilePath)
  if (index !== -1) {
    fileSeqs.value.splice(index, 1)
  }
}

async function submitForm() {
  // 先进行表单校验
  if (!baseFormRef.value) {
    $modal.msgError('表单未初始化')
    return
  }

  try {
    await baseFormRef.value.validate()
  } catch (error) {
    console.error('表单校验失败', error)
    $modal.msgError('请填写必填项')
    return
  }

  // 1. 校验基本信息
  // 1. 校验必填字段
  if (!baseForm.contract_number || baseForm.contract_number.trim() === '') {
    $modal.msgError('合同编号不能为空')
    return
  }
  
  // 验证合同编号唯一性
  try {
    const checkRes = await checkContractNumber(userStore.user.useId, baseForm.contract_number)
    if (checkRes.returnCode !== '1') {
      $modal.msgError(checkRes.returnMsg || '合同编号验证失败')
      return
    }
  } catch (error) {
    console.error('合同编号验证失败', error)
    $modal.msgError('合同编号验证失败，请重试')
    return
  }
  
  if (!baseForm.contract_name || baseForm.contract_name.trim() === '') {
    $modal.msgError('合同名称不能为空')
    return
  }
  if (baseForm.contract_name.length > 100) {
    $modal.msgError('合同名称长度不能超过 100')
    return
  }

  // 校验合同类型不能为空（可能是数字或字符串）
  if (!baseForm.contract_type && baseForm.contract_type !== 0) {
    $modal.msgError('合同类型不能为空')
    return
  }

  // 经办人验证（与 PC 端一致）
  /*if (!baseForm.salesman || !baseForm.salesman.trim()) {
    $modal.msgError('经办人不能为空')
    return
  }*/

  // 合同金额验证（与 PC 端一致，验证是否为数字）
  if (baseForm.contract_money && isNaN(Number(baseForm.contract_money))) {
    $modal.msgError('合同金额只能是数字')
    return
  }

  // 根据合同类型验证不同字段：销售合同验证需方（客户），其他合同验证供方（供应商）
  if (isSalesContract.value) {
    // 销售合同：验证需方（客户）
    if (!baseForm.firstparty_name || baseForm.firstparty_name.trim() === '') {
      $modal.msgError('需方不能为空')
      return
    }
  } else {
    // 其他合同：验证供方（供应商）
    if (!baseForm.secondparty_name || baseForm.secondparty_name.trim() === '') {
      $modal.msgError('供方不能为空')
      return
    }
  }

  // 2. 校验物料列表（如果添加了的话）
  for (let i = 0; i < materialList.value.length; i++) {
    const item = materialList.value[i]
    if (!item.qty || Number(item.qty) <= 0) {
      $modal.msgError(`请填写第${i + 1}个物料的数量，且必须大于 0`)
      return
    }
    if (!item.price || Number(item.price) < 0) {
      $modal.msgError(`请填写第${i + 1}个物料的税前单价，且不能为负数`)
      return
    }
    if (!item.cess || Number(item.cess) < 0) {
      $modal.msgError(`请填写第${i + 1}个物料的税率，且不能为负数`)
      return
    }
    if (!item.priceTax || Number(item.priceTax) < 0) {
      $modal.msgError(`请填写第${i + 1}个物料的税后单价，且不能为负数`)
      return
    }
  }

  // 3. 校验付款信息（如果有添加的话）
  if (paymentList.value.length > 0) {
    // 校验每个付款信息的必填字段
    for (let i = 0; i < paymentList.value.length; i++) {
      const item = paymentList.value[i]
      if (!item.payType || item.payType.trim() === '') {
        $modal.msgError(`请填写第${i + 1}个付款方式的付款方式`)
        return
      }
      if (!item.proportion || Number(item.proportion) <= 0) {
        $modal.msgError(`请填写第${i + 1}个付款方式的比例，且必须大于 0`)
        return
      }
     /* if (!item.amount || Number(item.amount) < 0) {
        $modal.msgError(`请填写第${i + 1}个付款方式的金额，且不能为负数`)
        return
      }*/
    }
  }

  // 4. 校验合同金额不能小于物料总金额
  if (materialList.value.length > 0) {
    const contractMoney = parseFloat(baseForm.contract_money) || 0
    let totalPrice = 0
    materialList.value.forEach(item => {
      const qty = parseFloat(item.qty) || 0
      const priceTax = parseFloat(item.priceTax) || 0
      totalPrice += qty * priceTax
    })

    if (contractMoney && contractMoney < totalPrice) {
      $modal.msgError('合同金额不能小于物料总金额：' + totalPrice.toFixed(2))
      return
    }
  }

  isSubmitting.value = true

  try {
    // 构建表单数据 (注意字段命名要与后端 Java 模型一致)
    const formData = {
      contract_number: baseForm.contract_number,
      contract_name: baseForm.contract_name,
      contract_type: baseForm.contract_type,
      applyDate: baseForm.applyDate,
      initiator: baseForm.initiator,
      department: baseForm.department,
      depid: baseForm.depid,
      salesman: baseForm.salesman,
      salesman_name: baseForm.salesman_name,
      salesmanTel: baseForm.salesmanTel,
      supplierCode: baseForm.supplierCode,
      supplierName: baseForm.supplierName,
      contract_money: baseForm.contract_money,
      contractContent: baseForm.contractContent,
      projectItem: baseForm.projectItem,
      usePosition: baseForm.usePosition,
      other_contractor: baseForm.other_contractor,
      otherFile: baseForm.otherFile,
      salesmanSign: baseForm.salesmanSign,
      firstparty_name: baseForm.firstparty_name,
      secondparty_name: baseForm.secondparty_name,
      // 录入人信息 (与 PC 端保持一致)
      contract_entrying_operator: baseForm.contract_entrying_operator,
      contract_entrying_operator_name: baseForm.contract_entrying_operator_name,
      materialList: materialList.value.map(item => ({
        itemCode: item.itemCode,
        itemName: item.itemName,
        specification: item.specification,
        measureName: item.measureName,
        qty: item.qty,
        price: item.price,
        cess: item.cess,
        priceTax: item.priceTax,
        purchaseId: item.purchaseId,
        purchaseNumber: item.purchaseNumber
      })),
      paymentList: paymentList.value.map(item => ({
        payType: item.payType,
        payTypeName: item.payTypeName,
        proportion: item.proportion,
        amount: item.amount,
        amountPaid: item.amountPaid,
        payTime: item.payTime,
        payStatus: item.payStatus,
        payStatusName: item.payStatusName,
        remark: item.remark
      }))
    }

    // 准备提交流程参数
    const processInfoData = {
      staffId: userStore.user.useId,
      staffName: userStore.user.name,
      gxId: userStore.user.gxId,
      groupId: userStore.user.groupid,
      insName: userStore.user.name + '的' + processInfo.modelName,
      modelId: processInfo.modelId,
      tmodelId: processInfo.tmodelId,
      formId: processInfo.formId,
      fileIds: fileSeqs.value.length === 0 ? '' : fileSeqs.value.map(f => f.seq)
    }

    // 检查是否需要附件
    if (processInfo.reqOffice == 1 && fileSeqs.value.length === 0) {
      $modal.msgError('该流程需要上传附件')
      isSubmitting.value = false
      return
    }

    // 一次性提交表单和流程数据
    const res = await startContractProcess(userStore.user.useId, formData, processInfoData)

    if (res.returnCode !== '1') {
      $modal.msgError(res.returnMsg || '提交失败')
      isSubmitting.value = false
      return
    }

    $modal.msgSuccess('提交成功')
    setTimeout(() => {
      $tab.navigateBack()
    }, 1000)
  } catch (error) {
    console.error('提交失败', error)
    $modal.msgError('提交失败，请重试')
  } finally {
    isSubmitting.value = false
  }
}
</script>

<style lang="scss" scoped>
.contract-container {
  padding-bottom: 80px;
}

.selector-wrapper {
  padding: 10px 0;
  cursor: pointer;

  .placeholder {
    color: #c0c4cc;
  }
}

.payment-actions,
.material-actions {
  display: flex;
  gap: 10px;
  margin-bottom: 15px;

  button {
    flex: 1;
  }
}

// 物料列表 - 卡片式展示
.material-list {
  display: flex;
  flex-direction: column;
  gap: 10px;
}

.material-card {
  border: 1px solid #e5e5e5;
  border-radius: 6px;
  overflow: hidden;
  background-color: #fff;
  margin-bottom: 8px;

  .material-header {
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding: 10px 12px;
    background-color: #f8f9fa;
    cursor: pointer;

    .material-main-info {
      display: flex;
      align-items: center;
      gap: 8px;
      flex: 1;

      .material-name {
        font-size: 14px;
        font-weight: bold;
        color: #333;
      }

      .material-code {
        font-size: 12px;
        color: #999;
        white-space: nowrap;
      }
    }

    .material-expand {
      display: flex;
      align-items: center;
      margin-left: 10px;
    }
  }

  .material-detail {
    padding: 10px 12px;
    border-top: 1px solid #e5e5e5;

    .detail-row {
      display: flex;
      align-items: center;
      flex-wrap: wrap;
      gap: 8px;
      margin-bottom: 8px;

      .detail-label {
        font-size: 13px;
        color: #666;
        flex-shrink: 0;
      }

      .detail-value {
        flex: 0 0 auto;
        font-size: 13px;
        color: #333;
      }

      .price-value {
        font-weight: bold;
        color: #f76560;
      }
      
      // ✅ 采购申请单编号样式
      &.purchase-number-row {
        background-color: #f9f9f9;
        padding: 6px 8px;
        border-radius: 4px;
        margin-top: 4px;
        
        .detail-label {
          color: #999;
          font-size: 12px;
        }
        
        .purchase-number {
          color: #007aff;
          font-weight: 500;
          font-size: 13px;
        }
      }
    }

    .delete-row {
      margin-top: 10px;
      text-align: center;
      padding-top: 8px;
      border-top: 1px dashed #e5e5e5;
    }
  }
}

// 付款方式列表
.payment-list {
  display: flex;
  flex-direction: column;
  gap: 10px;
}

.payment-card {
  border: 1px solid #e5e5e5;
  border-radius: 6px;
  overflow: hidden;
  background-color: #fff;
  margin-bottom: 8px;

  .payment-header {
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding: 10px 12px;
    background-color: #f8f9fa;
    cursor: pointer;

    .payment-main-info {
      display: flex;
      align-items: center;
      gap: 8px;
      flex: 1;

      .payment-type {
        font-size: 14px;
        font-weight: bold;
        color: #333;
      }

      .payment-proportion {
        font-size: 12px;
        color: #999;
      }
    }

    .payment-expand {
      display: flex;
      align-items: center;
      margin-left: 10px;
    }
  }

  .payment-detail {
    padding: 10px 12px;
    border-top: 1px solid #e5e5e5;

    .detail-row {
      display: flex;
      align-items: center;
      flex-wrap: wrap;
      gap: 8px;
      margin-bottom: 8px;

      .detail-label {
        font-size: 13px;
        color: #666;
        flex-shrink: 0;
      }

      .detail-value {
        flex: 0 0 auto;
        font-size: 13px;
        color: #333;
      }

      .status-tag {
        padding: 2px 8px;
        border-radius: 4px;
        font-size: 12px;

        &.status-0 {
          background-color: #f0f0f0;
          color: #999;
        }

        &.status-1 {
          background-color: #ffecdb;
          color: #ff8800;
        }

        &.status-2 {
          background-color: #e8f5e9;
          color: #4caf50;
        }
      }
    }

    .delete-row {
      margin-top: 10px;
      text-align: center;
      padding-top: 8px;
      border-top: 1px dashed #e5e5e5;
    }
  }
}

.empty-materials,
.empty-payments {
  text-align: center;
  padding: 30px;
  color: #909399;
  font-size: 14px;
}

.submit-btn-wrapper {
  position: sticky;
  width: 100%;
  bottom: 10px;
  padding: 10px 15px;
  background-color: #fff;
  box-shadow: 0 -2px 10px rgba(0, 0, 0, 0.05);
  z-index: 10;
  box-sizing: border-box;

  button {
    background-color: #007aff !important;
    color: #fff !important;
  }
}

.selector-popup {
  // ✅ 关键：使用固定宽度，不设置 width，只使用 max-width
  width: 580px; // 固定宽度
  max-width: 95vw; // 最大为屏幕宽度的 95%
  min-width: 300px;
  max-height: 70vh;
  background-color: #fff;
  border-radius: 12px;
  overflow: hidden; // ✅ 隐藏所有超出内容
  box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);

  position: relative;
  margin: 0 auto;

  .popup-header {
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding: 15px;
    border-bottom: 1px solid #e5e5e5;
    width: 100%;
    box-sizing: border-box;
    overflow: hidden; // ✅ 防止内容撑开

    .popup-title {
      font-size: 16px;
      font-weight: bold;
      overflow: hidden;
      text-overflow: ellipsis;
      white-space: nowrap;
      max-width: calc(100% - 30px); // ✅ 给关闭按钮留空间
    }
  }

  // 物料来源选择器
  .material-source-selector {
    padding: 10px 15px;
    border-bottom: 1px solid #f0f0f0;
    width: 100%;
    box-sizing: border-box;
    overflow: hidden;

    .source-options {
      display: flex;
      gap: 10px;
      width: 100%;

      .source-option {
        flex: 1;
        min-width: 0; // ✅ 允许缩小
        padding: 8px 12px;
        text-align: center;
        background-color: #f5f5f5;
        border-radius: 6px;
        font-size: 14px;
        cursor: pointer;
        transition: all 0.2s;
        overflow: hidden; // ✅ 防止撑开

        &.active {
          background-color: #007aff;
          color: #fff;
          font-weight: 500;
        }
      }
    }
  }

  // 采购申请单选择器
  .purchase-selector {
    display: flex;
    gap: 8px; // ✅ 减小间距
    padding: 10px 15px;
    border-bottom: 1px solid #f0f0f0;
    align-items: center;
    width: 100%;
    box-sizing: border-box;
    overflow: hidden;

    .picker {
      flex: 1;
      min-width: 0; // ✅ 允许缩小
      padding: 8px 12px;
      background-color: #f5f5f5;
      border-radius: 6px;
      font-size: 14px;
      overflow: hidden;
      text-overflow: ellipsis; // ✅ 超出显示省略号
    }
    
    // ✅ 清空按钮样式
    button[type="warn"] {
      flex-shrink: 0;
      padding: 0 12px;
    }
  }

  .search-bar {
    display: flex;
    gap: 10px;
    padding: 10px 15px;
    align-items: center;
    width: 100%;
    box-sizing: border-box;
    overflow: hidden;
  }

  .popup-content {
    max-height: 50vh;
    width: 100%;
    overflow-x: hidden;
    
    // ✅ 强制使用固定布局
    position: relative;

    .selector-item {
      padding: 10px 12px;
      border-bottom: 1px solid #f0f0f0;
      width: 100%;
      box-sizing: border-box;
      // ✅ 防止内容撑开
      overflow: hidden;

      &:active {
        background-color: #f5f5f5;
      }

      .selector-item-content {
        display: flex;
        justify-content: space-between;
        align-items: center;
        gap: 8px;
        width: 100%;
        max-width: 100%;
        overflow: hidden;
        
        // ✅ 关键：强制缩小
        min-width: 0;

        .item-info {
          // ✅ 最强力的缩小设置
          flex: 1 1 auto !important;
          min-width: 0 !important;
          max-width: none !important;
          display: flex;
          flex-wrap: wrap;
          align-items: center;
          gap: 4px;
          overflow: hidden;
          position: relative;

          .item-name {
            font-size: 15px;
            font-weight: bold;
            color: #333;
            flex-basis: 100%;
            margin-bottom: 4px;
            word-break: break-all; // 长文字换行
            overflow-wrap: break-word;
          }

          // 采购单号
          .item-purchase {
            font-size: 12px;
            color: #007aff;
            flex-basis: 100%;
            margin-bottom: 2px;
            word-break: break-all;
            overflow-wrap: break-word;
          }

          .item-code,
          .item-spec,
          .item-extra {
            font-size: 13px;
            color: #666;
            white-space: nowrap;
            font-weight: 500;
            flex-shrink: 0;
            max-width: 100%; // 限制最大宽度
            overflow: hidden;
            text-overflow: ellipsis; // 超出显示省略号
          }

          .item-code::after,
          .item-spec::after {
            content: ' | ';
            margin: 0 4px;
            color: #ddd;
          }

          .item-spec:last-child::after,
          .item-extra:last-child::after {
            content: '';
          }
        }

        .selected-tag {
          color: #409eff;
          font-size: 12px;
          flex-shrink: 0;
          flex-grow: 0;
          white-space: nowrap;
          max-width: 50px; // ✅ 限制最大宽度
          overflow: hidden;
          text-overflow: ellipsis;
        }
      }
    }

    .loading-text {
      text-align: center;
      padding: 12px;
      color: #909399;
      font-size: 13px;
    }

    .no-more-text {
      text-align: center;
      padding: 12px;
      color: #909399;
      font-size: 13px;
    }

    .empty-data {
      text-align: center;
      padding: 30px;
      color: #909399;
    }
  }
}

// 基本信息中的禁用字段样式优化（参考 edit/index.vue）
::v-deep .uni-forms {
  .uni-forms-item__content {
    .uni-easyinput__content-input {
      font-size: calc(14px + 1.2*(1rem - 16px)) !important;
      font-weight: 500;
      color: #333;
    }

    .uni-date {
      .uni-icons {
        font-size: calc(22px + 1.2*(1rem - 16px)) !important;
        font-weight: 500;
      }

      .uni-date__x-input {
        height: auto;
        font-size: calc(14px + 1.2*(1rem - 16px)) !important;
        font-weight: 500;
        color: #333;
      }
    }
  }
}
</style>