hurx 2 روز پیش
والد
کامیت
2471d76dd9

+ 0 - 5
src/views/customer/customerFile/customerContract/customerContractInfo.vue

@@ -73,11 +73,6 @@
           </template>
         </el-table-column>
         <el-table-column label="项目负责人" align="center" prop="projectLeader" width="180" />
-        <el-table-column label="附件管理" align="center" prop="annex">
-          <template>
-            <span>下载</span>
-          </template>
-        </el-table-column>
         <el-table-column label="状态" align="center" prop="contractStatus" width="150">
           <template #default="scope">
             <dict-tag :options="contract_status" :value="scope.row.contractStatus" />

+ 32 - 3
src/views/customer/customerFile/customerContract/customerCreateContract.vue

@@ -47,6 +47,7 @@
                 placeholder="请选择起始时间"
                 class="w-full"
                 style="width: 100%"
+                @change="contractFormRef?.validateField('endTime')"
               />
             </el-form-item>
           </el-col>
@@ -79,7 +80,7 @@
           </el-col>
           <el-col :span="8">
             <el-form-item label="合同金额" prop="contractAmount">
-              <el-input v-model="form.contractAmount" placeholder="请输入合同金额" style="width: 95%" />万元
+              <el-input v-model="form.contractAmount" placeholder="请输入合同金额" style="width: 95%" @input="handleAmountInput" />万元
             </el-form-item>
           </el-col>
         </el-row>
@@ -87,7 +88,7 @@
         <el-row :gutter="20">
           <el-col :span="8">
             <el-form-item label="附件管理" prop="annex">
-              <el-upload></el-upload>
+              <FileUpload v-model="form.annex" :file-size="5" :file-type="['jpg', 'jpeg', 'png', 'xlsx', 'xls', 'doc', 'docx', 'pdf']" />
             </el-form-item>
           </el-col>
         </el-row>
@@ -136,6 +137,7 @@ const initFormData: ContractForm = {
   annex: undefined,
   remark: undefined
 };
+
 const data = reactive<PageData<ContractForm, ContractQuery>>({
   form: { ...initFormData },
   queryParams: {
@@ -162,12 +164,39 @@ const data = reactive<PageData<ContractForm, ContractQuery>>({
   rules: {
     contractName: [{ required: true, message: '合同名称不能为空', trigger: 'blur' }],
     contractType: [{ required: true, message: '合同类型不能为空', trigger: 'change' }],
-    contractAmount: [{ required: true, message: '合同金额不能为空', trigger: 'blur' }]
+    contractAmount: [
+      { required: true, message: '合同金额不能为空', trigger: 'blur' },
+      { pattern: /^\d+(\.\d+)?$/ as RegExp, message: '金额只能填写数字', trigger: 'blur' }
+    ],
+    startTime: [{ required: true, message: '起始时间不能为空', trigger: 'change' }],
+    endTime: [
+      { required: true, message: '截止时间不能为空', trigger: 'change' },
+      { validator: validateEndTime, trigger: 'change' }
+    ]
   }
 });
 
 const { queryParams, form, rules } = toRefs(data);
 
+/** 过滤金额输入:仅允许数字和小数点 */
+const handleAmountInput = (val: string) => {
+  let value = val.replace(/[^\d.]/g, '');
+  const parts = value.split('.');
+  if (parts.length > 2) {
+    value = parts[0] + '.' + parts.slice(1).join('');
+  }
+  form.value.contractAmount = value;
+};
+
+/** 校验截止时间不早于起始时间 */
+function validateEndTime(_rule: any, value: any, callback: any) {
+  if (form.value.startTime && value && value < form.value.startTime) {
+    callback(new Error('截止时间不能早于起始时间'));
+  } else {
+    callback();
+  }
+}
+
 /** 禁用截止日期:只能选择起始日期之后的日期 */
 const disabledEndDate = (time: Date) => {
   if (!form.value.startTime) {

+ 40 - 15
src/views/customer/customerFile/customerInfo/overview/contractManagement.vue

@@ -70,7 +70,7 @@
           </template>
         </el-table-column>
 
-        <el-table-column label="附件管理" align="center" prop="annex" />
+        <!-- <el-table-column label="附件管理" align="center" prop="annex" /> -->
         <el-table-column v-if="!isViewMode" label="操作" align="center" class-name="small-padding fixed-width">
           <template #default="scope">
             <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['customer:contract:edit']">编辑</el-button>
@@ -92,12 +92,12 @@
           </el-col>
           <el-col :span="8">
             <el-form-item label="合同名称" prop="contractName">
-              <el-input v-model="form.contractName" placeholder="请输入合同名称" :disabled="isViewMode" />
+              <el-input v-model="form.contractName" placeholder="请输入合同名称" :disabled="isDisabled" />
             </el-form-item>
           </el-col>
           <el-col :span="8">
             <el-form-item label="合同类型" prop="contractType">
-              <el-select v-model="form.contractType" placeholder="请选择合同类型" class="w-full" :disabled="isViewMode">
+              <el-select v-model="form.contractType" placeholder="请选择合同类型" class="w-full" :disabled="isDisabled">
                 <el-option v-for="dict in contract_type" :key="dict.value" :label="dict.label" :value="dict.value"></el-option>
               </el-select>
             </el-form-item>
@@ -106,7 +106,7 @@
         <el-row :gutter="20">
           <el-col :span="8">
             <el-form-item label="合同金额" prop="contractAmount">
-              <el-input v-model="form.contractAmount" placeholder="请输入合同金额" :disabled="isViewMode" />
+              <el-input v-model="form.contractAmount" placeholder="请输入合同金额" :disabled="isDisabled" @input="handleAmountInput" />
             </el-form-item>
           </el-col>
           <el-col :span="8">
@@ -116,19 +116,19 @@
           </el-col>
           <el-col :span="8">
             <el-form-item label="客户名称" prop="customerName">
-              <el-input v-model="form.customerName" placeholder="请输入客户名称" :disabled="isViewMode" />
+              <el-input v-model="form.customerName" placeholder="请输入客户名称" :disabled="isDisabled" />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="20">
           <el-col :span="8">
             <el-form-item label="客户负责人" prop="customerLeader">
-              <el-input v-model="form.customerLeader" placeholder="请输入客户负责人" :disabled="isViewMode" />
+              <el-input v-model="form.customerLeader" placeholder="请输入客户负责人" :disabled="isDisabled" />
             </el-form-item>
           </el-col>
           <el-col :span="8">
             <el-form-item label="我方负责人" prop="projectLeader">
-              <el-input v-model="form.projectLeader" placeholder="请输入我方负责人" :disabled="isViewMode" />
+              <el-input v-model="form.projectLeader" placeholder="请输入我方负责人" :disabled="isDisabled" />
             </el-form-item>
           </el-col>
           <el-col :span="8">
@@ -140,7 +140,7 @@
                 placeholder="请选择起始时间"
                 class="w-full"
                 style="width: 100%"
-                :disabled="isViewMode"
+                :disabled="isDisabled"
               />
             </el-form-item>
           </el-col>
@@ -156,7 +156,7 @@
                 placeholder="请选择截止时间"
                 class="w-full"
                 style="width: 100%"
-                :disabled="isViewMode"
+                :disabled="isDisabled"
                 :disabled-date="disabledEndDate"
               />
             </el-form-item>
@@ -165,17 +165,20 @@
         <el-row :gutter="20">
           <el-col :span="16">
             <el-form-item label="附件管理" prop="annex">
-              <el-upload action="#" :auto-upload="false" :disabled="isViewMode">
-                <el-button type="primary" :disabled="isViewMode">选择文件</el-button>
-              </el-upload>
+              <FileUpload
+                v-model="form.annex"
+                :file-size="5"
+                :file-type="['jpg', 'jpeg', 'png', 'xlsx', 'xls', 'doc', 'docx', 'pdf']"
+                :disabled="isDisabled"
+              />
             </el-form-item>
           </el-col>
         </el-row>
       </el-form>
       <template #footer>
         <div class="dialog-footer">
-          <el-button v-if="!isViewMode" :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button>
-          <el-button @click="cancel">{{ isViewMode ? '关 闭' : '取 消' }}</el-button>
+          <el-button v-if="!isDisabled" :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button>
+          <el-button @click="cancel">{{ isDisabled ? '关 闭' : '取 消' }}</el-button>
         </div>
       </template>
     </el-drawer>
@@ -198,6 +201,8 @@ const { contract_type, contract_status } = toRefs<any>(proxy?.useDict('contract_
 
 // 查看模式
 const isViewMode = computed(() => route.query.status === 'view');
+const isDialogView = ref(false);
+const isDisabled = computed(() => isViewMode.value || isDialogView.value);
 
 const contractList = ref<ContractVO[]>([]);
 const buttonLoading = ref(false);
@@ -261,7 +266,10 @@ const data = reactive<PageData<ContractForm, ContractQuery>>({
   },
   rules: {
     customerNo: [{ required: true, message: '客户编号不能为空', trigger: 'blur' }],
-    contractAmount: [{ required: true, message: '合同金额不能为空', trigger: 'blur' }],
+    contractAmount: [
+      { required: true, message: '合同金额不能为空', trigger: 'blur' },
+      { pattern: /^\d+(\.\d{1,6})?$/ as RegExp, message: '金额最多6位小数', trigger: 'blur' }
+    ],
     contractType: [{ required: true, message: '合同类型不能为空', trigger: 'change' }],
     startTime: [{ required: true, message: '合同开始时间不能为空', trigger: 'blur' }],
     endTime: [{ required: true, message: '合同结束时间不能为空', trigger: 'blur' }]
@@ -304,6 +312,20 @@ const cancel = () => {
 const reset = () => {
   form.value = { ...initFormData };
   contractFormRef.value?.resetFields();
+  isDialogView.value = false;
+};
+
+/** 过滤金额输入:仅允许数字和一个小数点,小数位最多6位 */
+const handleAmountInput = (val: string) => {
+  let value = val.replace(/[^\d.]/g, '');
+  const parts = value.split('.');
+  if (parts.length > 2) {
+    value = parts[0] + '.' + parts.slice(1).join('');
+  }
+  if (parts[0] !== undefined && parts[1] !== undefined && parts[1].length > 6) {
+    value = parts[0] + '.' + parts[1].slice(0, 6);
+  }
+  form.value.contractAmount = value;
 };
 
 /** 搜索按钮操作 */
@@ -338,6 +360,7 @@ const handleAdd = () => {
   if (props.customerName) {
     form.value.customerName = props.customerName;
   }
+  isDialogView.value = false;
   dialog.visible = true;
   dialog.title = '添加客户合同';
 };
@@ -348,6 +371,7 @@ const handleUpdate = async (row?: ContractVO) => {
   const _id = row?.id || ids.value[0];
   const res = await getContract(_id);
   Object.assign(form.value, res.data);
+  isDialogView.value = false;
   dialog.visible = true;
   dialog.title = '修改客户合同';
 };
@@ -357,6 +381,7 @@ const handleReview = async (row?: ContractVO) => {
   const _id = row?.id || ids.value[0];
   const res = await getContract(_id);
   Object.assign(form.value, res.data);
+  isDialogView.value = true;
   dialog.visible = true;
   dialog.title = '查看合同详情';
 };