方案报价
							parent
							
								
									697e80b515
								
							
						
					
					
						commit
						35a1f094a1
					
				|  | @ -805,7 +805,6 @@ const getContactOptions = computed(() => | |||
| 
 | ||||
| const route = useRoute(); | ||||
| onMounted(async () => { | ||||
|   console.log('%csrc/views/crm/contract/ContractForm.vue:760 statement.value', 'color: #007acc;', statement.value); | ||||
|   formType.value = props.id || route.query.id | ||||
| 
 | ||||
|   if (formType.value) await open(formType.value) | ||||
|  |  | |||
|  | @ -120,7 +120,8 @@ const getList = (val: []) => { | |||
| 
 | ||||
| } | ||||
| const props = defineProps<{ | ||||
|   data: undefined | ||||
|   data: undefined, | ||||
|   type: undefined | ||||
| }>() | ||||
| 
 | ||||
| /** 监听主表的关联字段的变化,加载对应的子表数据 */ | ||||
|  |  | |||
|  | @ -41,7 +41,14 @@ | |||
|       <el-table-column label="产品单位" min-width="150"> | ||||
|         <template #default="{ row, $index }"> | ||||
|           <el-form-item :prop="`${$index}.productUnit`" :rules="formRules.productUnit" class="mb-0px!"> | ||||
|             <el-input v-model="row.productUnit" placeholder="请输入产品单位" disabled /> | ||||
|             <el-select v-model="row.productUnit" placeholder="产品单位" disabled> | ||||
|               <el-option | ||||
|                 v-for="dict in getIntDictOptions(DICT_TYPE.CRM_PRODUCT_UNIT)" | ||||
|                 :key="dict.value" | ||||
|                 :label="dict.label" | ||||
|                 :value="dict.value" | ||||
|               /> | ||||
|             </el-select> | ||||
|           </el-form-item> | ||||
|         </template> | ||||
|       </el-table-column> | ||||
|  | @ -69,28 +76,56 @@ | |||
|       <el-table-column label="产品票据" min-width="150"> | ||||
|         <template #default="{ row, $index }"> | ||||
|           <el-form-item :prop="`${$index}.productInvoice`" :rules="formRules.productInvoice" class="mb-0px!"> | ||||
|             <el-input v-model="row.productInvoice" placeholder="请输入产品票据" disabled /> | ||||
|             <el-select v-model="row.productInvoice" placeholder="请选择状态" disabled> | ||||
|               <el-option | ||||
|                 v-for="dict in getIntDictOptions(DICT_TYPE.CRM_PRODUCT_INVOICE)" | ||||
|                 :key="dict.value" | ||||
|                 :label="dict.label" | ||||
|                 :value="dict.value" | ||||
|               /> | ||||
|             </el-select> | ||||
|           </el-form-item> | ||||
|         </template> | ||||
|       </el-table-column> | ||||
|       <el-table-column label="产品开具项目" min-width="150"> | ||||
|         <template #default="{ row, $index }"> | ||||
|           <el-form-item :prop="`${$index}.productInvoiceItem`" :rules="formRules.productInvoiceItem" class="mb-0px!"> | ||||
|             <el-input v-model="row.productInvoiceItem" placeholder="请输入产品开具项目" disabled /> | ||||
|             <el-select v-model="row.productInvoiceItem" placeholder="请选择状态" disabled> | ||||
|               <el-option | ||||
|                 v-for="dict in getIntDictOptions(DICT_TYPE.CRM_PRODUCT_INVOICE_ITEMS)" | ||||
|                 :key="dict.value" | ||||
|                 :label="dict.label" | ||||
|                 :value="dict.value" | ||||
|               /> | ||||
|             </el-select> | ||||
|           </el-form-item> | ||||
|         </template> | ||||
|       </el-table-column> | ||||
|       <el-table-column label="服务费票据" min-width="150"> | ||||
|         <template #default="{ row, $index }"> | ||||
|           <el-form-item :prop="`${$index}.serviceInvoice`" :rules="formRules.serviceInvoice" class="mb-0px!"> | ||||
|             <el-input v-model="row.serviceInvoice" placeholder="请输入服务费票据" disabled /> | ||||
|             <el-select v-model="row.serviceInvoice" placeholder="服务费票据" disabled> | ||||
|               <el-option | ||||
|                 v-for="dict in getIntDictOptions(DICT_TYPE.CRM_SERVICE_FEE_INVOICE)" | ||||
|                 :key="dict.value" | ||||
|                 :label="dict.label" | ||||
|                 :value="dict.value" | ||||
|               /> | ||||
|             </el-select> | ||||
|           </el-form-item> | ||||
|         </template> | ||||
|       </el-table-column> | ||||
|       <el-table-column label="服务开具项目" min-width="150"> | ||||
|         <template #default="{ row, $index }"> | ||||
|           <el-form-item :prop="`${$index}.serviceInvoiceItem`" :rules="formRules.serviceInvoiceItem" class="mb-0px!"> | ||||
|             <el-input v-model="row.serviceInvoiceItem" placeholder="请输入服务开具项目" disabled /> | ||||
|             <el-select v-model="row.serviceInvoiceItem" placeholder="服务开具项目" disabled> | ||||
|               <el-option | ||||
|                 v-for="dict in getIntDictOptions(DICT_TYPE.CRM_SERVICE_FEE_INVOICE_ITEMS)" | ||||
|                 :key="dict.value" | ||||
|                 :label="dict.label" | ||||
|                 :value="dict.value" | ||||
|               /> | ||||
|             </el-select> | ||||
|           </el-form-item> | ||||
|         </template> | ||||
|       </el-table-column> | ||||
|  | @ -105,7 +140,7 @@ | |||
| <script setup lang="ts"> | ||||
| import * as ProductApi from '@/api/crm/product' | ||||
| import { erpPriceInputFormatter, erpPriceMultiply } from '@/utils' | ||||
| import { DICT_TYPE } from '@/utils/dict' | ||||
| import { DICT_TYPE, getIntDictOptions } from '@/utils/dict' | ||||
| 
 | ||||
| const props = defineProps<{ | ||||
|   products: undefined | ||||
|  |  | |||
|  | @ -7,8 +7,10 @@ | |||
|       :rules="formRules" | ||||
|       label-width="120px" | ||||
|     > | ||||
|       <ContentWrap style="border: none;font-weight: 700"> | ||||
|         基础信息 | ||||
|       </ContentWrap> | ||||
|       <el-row> | ||||
|          | ||||
|         <el-col :span="8"> | ||||
|           <el-form-item label="合同名称" prop="name"> | ||||
|             <el-input v-model="formData.name" disabled placeholder="请输入合同名称" /> | ||||
|  | @ -22,9 +24,10 @@ | |||
|         <el-col :span="8"> | ||||
|           <el-form-item label="报价单编号" prop="quotationId"> | ||||
|             <el-select | ||||
|             disabled | ||||
|               @change="handleQuotationChange" | ||||
|               v-model="formData.quotationId" | ||||
|               placeholder="请选择报价单编号" | ||||
|               disabled | ||||
|               class="w-1/1" | ||||
|             > | ||||
|               <el-option | ||||
|  | @ -41,7 +44,7 @@ | |||
|             <el-select | ||||
|               v-model="formData.customerId" | ||||
|               disabled="" | ||||
|               placeholder="请选择客户" | ||||
|               placeholder="客户" | ||||
|               class="w-1/1" | ||||
|             > | ||||
|               <el-option | ||||
|  | @ -53,174 +56,32 @@ | |||
|             </el-select> | ||||
|           </el-form-item> | ||||
|         </el-col> | ||||
|         <el-col :span="8"> | ||||
|           <el-form-item label="方案签约人" prop="pricingUserId"> | ||||
|             <el-select | ||||
|               @change="handleQuotationChange" | ||||
|               v-model="formData.pricingUserId" | ||||
|               disabled | ||||
|               class="w-1/1" | ||||
|             > | ||||
|               <el-option | ||||
|                 v-for="item in quotationList" | ||||
|                 :key="item.id" | ||||
|                 :label="item.no" | ||||
|                 :value="item.id" | ||||
|               /> | ||||
|             </el-select> | ||||
|           </el-form-item> | ||||
|         </el-col> | ||||
|          | ||||
|         <el-col :span="8"> | ||||
|           <el-form-item label="合同签订日期" prop="startTime"> | ||||
|             <el-date-picker | ||||
|               v-model="formData.startTime" | ||||
|               type="date" | ||||
|               disabled | ||||
|               value-format="x" | ||||
|               placeholder="选择合同签订日期" | ||||
|               style="width: 100%" | ||||
|             /> | ||||
|           </el-form-item> | ||||
|         </el-col> | ||||
|         <el-col :span="8"> | ||||
|           <el-form-item label="合同结束时间" prop="endTime"> | ||||
|             <el-date-picker | ||||
|               v-model="formData.endTime" | ||||
|               type="date" | ||||
|               disabled | ||||
|               value-format="x" | ||||
|               placeholder="选择合同结束时间" | ||||
|               style="width: 100%" | ||||
|             /> | ||||
|           </el-form-item> | ||||
|         </el-col> | ||||
|         <el-col :span="8"> | ||||
|           <el-form-item label="票据模板" prop="invoiceTemplateId"> | ||||
|             <el-input v-model="formData.invoiceTemplateId" placeholder="请输入票据模板" disabled /> | ||||
|           </el-form-item> | ||||
|         </el-col> | ||||
|       </el-row> | ||||
|        | ||||
|       <el-row> | ||||
|         <el-col :span="8"> | ||||
|           <el-form-item label="违约金比例" prop="penaltyRate"> | ||||
|             <el-input v-model="formData.penaltyRate" disabled placeholder="请输入违约金比例" /> | ||||
|           </el-form-item> | ||||
|         </el-col> | ||||
|         <el-col :span="8"> | ||||
|           <el-form-item label="延期付款利率" prop="latePaymentRate"> | ||||
|             <el-input v-model="formData.latePaymentRate" disabled placeholder="请输入延期付款利率" /> | ||||
|           </el-form-item> | ||||
|         </el-col> | ||||
|         <el-col :span="8"> | ||||
|           <el-form-item label="财务结算方式" prop="settleMethod"> | ||||
|             <el-select v-model="formData.settleMethod" disabled placeholder="请选择财务结算方式"> | ||||
|               <el-option | ||||
|                 v-for="dict in getIntDictOptions('settle_method')" | ||||
|                 :key="dict.value" | ||||
|                 :label="dict.label" | ||||
|                 :value="dict.value" | ||||
|               /> | ||||
|             </el-select> | ||||
|           </el-form-item> | ||||
|         </el-col> | ||||
|         <el-col :span="8"> | ||||
|           <el-form-item label="最晚付款日期" prop="lastPayDate"> | ||||
|             <el-date-picker | ||||
|               v-model="formData.lastPayDate" | ||||
|               type="date" | ||||
|               disabled | ||||
|               value-format="x" | ||||
|               style="width: 100%" | ||||
|               placeholder="选择最晚付款日期" | ||||
|             /> | ||||
|           </el-form-item> | ||||
|         </el-col> | ||||
|         <el-col :span="8"> | ||||
|           <el-form-item label="合同期限(月)" prop="contractTerm"> | ||||
|             <el-input v-model="formData.contractTerm" disabled placeholder="请输入合同期限(月)" /> | ||||
|           </el-form-item> | ||||
|         </el-col> | ||||
|         <el-col :span="8"> | ||||
|           <el-form-item label="报价签约人" prop="signUserId"> | ||||
|             <el-select v-model="formData.signUserId" placeholder="请选择报价签约人" disabled > | ||||
|               <el-option | ||||
|                 v-for="dict in userOptions" | ||||
|                 :key="dict.id" | ||||
|                 :label="dict.nickname" | ||||
|                 :value="dict.id" | ||||
|               /> | ||||
|             </el-select> | ||||
|           </el-form-item> | ||||
|         </el-col> | ||||
|         <el-col :span="8"> | ||||
|           <el-form-item label="签约人联系电话" prop="signPhoneNumber"> | ||||
|             <el-input v-model="formData.signPhoneNumber" placeholder="请输入签约人联系电话" disabled /> | ||||
|           </el-form-item> | ||||
|         </el-col> | ||||
|         <el-col :span="8"> | ||||
|           <el-form-item label="签约人Email" prop="signEmail"> | ||||
|             <el-input v-model="formData.signEmail" placeholder="请输入签约人Email" disabled /> | ||||
|           </el-form-item> | ||||
|         </el-col> | ||||
|         <el-col :span="8"> | ||||
|           <el-form-item label="签约人微信" prop="signWechat"> | ||||
|             <el-input v-model="formData.signWechat" placeholder="请输入签约人微信" disabled /> | ||||
|           </el-form-item> | ||||
|         </el-col> | ||||
|       </el-row> | ||||
|        | ||||
|       <el-row> | ||||
|         <el-col :span="8"> | ||||
|           <el-form-item label="商机负责人" prop="ownerUserId"> | ||||
|             <el-select v-model="formData.ownerUserId" placeholder="请选择商机负责人" disabled> | ||||
|               <el-option | ||||
|                 v-for="dict in userOptions" | ||||
|                 :key="dict.id" | ||||
|                 :label="dict.nickname" | ||||
|                 :value="dict.id" | ||||
|               /> | ||||
|             </el-select> | ||||
|           </el-form-item> | ||||
|         </el-col> | ||||
|         <el-col :span="8"> | ||||
|           <el-form-item label="拓展人" prop="expanderUserId"> | ||||
|             <el-select v-model="formData.expanderUserId" placeholder="请选择拓展人" disabled> | ||||
|               <el-option | ||||
|                 v-for="dict in userOptions" | ||||
|                 :key="dict.id" | ||||
|                 :label="dict.nickname" | ||||
|                 :value="dict.id" | ||||
|               /> | ||||
|             </el-select> | ||||
|           </el-form-item> | ||||
|         </el-col> | ||||
|         <el-col :span="8"> | ||||
|           <el-form-item label="方案报价人" prop="pricingUserId"> | ||||
|             <el-select v-model="formData.pricingUserId" placeholder="请选择方案报价人" disabled> | ||||
|               <el-option | ||||
|                 v-for="dict in userOptions" | ||||
|                 :key="dict.id" | ||||
|                 :label="dict.nickname" | ||||
|                 :value="dict.id" | ||||
|               /> | ||||
|             </el-select> | ||||
|           </el-form-item> | ||||
|         </el-col> | ||||
|       </el-row> | ||||
|        | ||||
|       <el-row> | ||||
|         <el-col :span="8"> | ||||
|           <el-form-item label="售后维护人" prop="afterSaleUserId"> | ||||
|             <el-select v-model="formData.afterSaleUserId" disabled placeholder="请选择售后维护人"> | ||||
|               <el-option | ||||
|                 v-for="dict in userOptions" | ||||
|                 :key="dict.id" | ||||
|                 :label="dict.nickname" | ||||
|                 :value="dict.id" | ||||
|               /> | ||||
|             </el-select> | ||||
|           </el-form-item> | ||||
|         </el-col> | ||||
|         <el-col :span="8"> | ||||
|           <el-form-item label="协作人" prop="collUserId"> | ||||
|             <el-select v-model="formData.collUserId" disabled placeholder="请选择协作人"> | ||||
|               <el-option | ||||
|                 v-for="dict in userOptions" | ||||
|                 :key="dict.id" | ||||
|                 :label="dict.nickname" | ||||
|                 :value="dict.id" | ||||
|               /> | ||||
|             </el-select> | ||||
|           <el-form-item label="授信额度" prop="creditLimit"> | ||||
|             <el-input v-model="formData.creditLimit" placeholder="授信额度" disabled /> | ||||
|           </el-form-item> | ||||
|         </el-col> | ||||
|         <el-col :span="8"> | ||||
|           <el-form-item label="授信方式" prop="creditMethod" > | ||||
|             <el-select v-model="formData.creditMethod" placeholder="请选择授信方式" disabled> | ||||
|             <el-select v-model="formData.creditMethod" placeholder="授信方式" disabled> | ||||
|               <el-option | ||||
|                 v-for="dict in getIntDictOptions('credit_method')" | ||||
|                 :key="dict.value" | ||||
|  | @ -232,7 +93,7 @@ | |||
|         </el-col> | ||||
|         <el-col :span="8"> | ||||
|           <el-form-item label="授信计算周期" prop="creditCalcCycle" > | ||||
|             <el-select v-model="formData.creditCalcCycle" placeholder="请选择授信计算周期" disabled> | ||||
|             <el-select v-model="formData.creditCalcCycle" placeholder="授信计算周期" disabled> | ||||
|               <el-option | ||||
|                 v-for="dict in getIntDictOptions('credit_calc_cycle')" | ||||
|                 :key="dict.value" | ||||
|  | @ -242,57 +103,36 @@ | |||
|             </el-select> | ||||
|           </el-form-item> | ||||
|         </el-col> | ||||
|         <el-col :span="8"> | ||||
|           <el-form-item label="授信额度" prop="creditLimit"> | ||||
|             <el-input v-model="formData.creditLimit" placeholder="请输入授信额度" disabled /> | ||||
|           </el-form-item> | ||||
|         </el-col> | ||||
|         <el-col :span="8"> | ||||
|           <el-form-item label="合作主体" prop="partnerCompanyId"> | ||||
|             <el-select v-model="formData.partnerCompanyId" placeholder="请选择合作主体" disabled > | ||||
|               <el-option | ||||
|                 v-for="dict in orgList" | ||||
|                 :key="dict.id" | ||||
|                 :label="dict.name" | ||||
|                 :value="dict.id" | ||||
|               /> | ||||
|             </el-select> | ||||
|           </el-form-item> | ||||
|         </el-col> | ||||
|         <el-col :span="8"> | ||||
|           <el-form-item label="归属部门" prop="deptId"  > | ||||
|             <el-tree-select | ||||
|               v-model="formData.deptId" | ||||
|               :data="deptTree" | ||||
|               :props="defaultProps" | ||||
|               filterable | ||||
|               disabled | ||||
|               check-strictly | ||||
|               node-key="id" | ||||
|               placeholder="请选择归属部门" | ||||
|             /> | ||||
|           </el-form-item> | ||||
|         </el-col> | ||||
|         <el-col :span="8"> | ||||
|           <el-form-item label="第几次报价" prop="quotationTimes"> | ||||
|             <el-input v-model="formData.quotationTimes" disabled placeholder="请输入第几次报价" /> | ||||
|             <el-input v-model="formData.quotationTimes" disabled placeholder="第几次报价" /> | ||||
|           </el-form-item> | ||||
|         </el-col> | ||||
|         <el-col :span="8"> | ||||
|         <el-form-item label="账期" prop="paymentTerm"> | ||||
|           <el-select v-model="formData.paymentTerm" disabled placeholder="账期"> | ||||
|             <el-option | ||||
|               v-for="dict in getStrDictOptions('payment_term')" | ||||
|               :key="dict.value" | ||||
|               :label="dict.label" | ||||
|               :value="dict.value" | ||||
|             /> | ||||
|           </el-select> | ||||
|         </el-form-item> | ||||
|       </el-col> | ||||
|       <el-col :span="8"> | ||||
|         <el-form-item label="票据模板" prop="invoiceTemplateId"> | ||||
|           <el-select v-model="formData.invoiceTemplateId" disabled placeholder="请选择票据模板"> | ||||
|             <el-option | ||||
|               v-for="dict in templateOptions" | ||||
|               :key="dict.id" | ||||
|               :label="dict.name" | ||||
|               :value="dict.id" | ||||
|             /> | ||||
|           </el-select> | ||||
|         </el-form-item> | ||||
|       </el-col> | ||||
|       </el-row> | ||||
| 
 | ||||
|       <el-row> | ||||
|         <el-col :span="24"> | ||||
|           <el-form-item label="合同正文" prop="contractBody"> | ||||
|             <el-input v-model="formData.contractBody" type="textarea" rows="5" disabled placeholder="请输入合同正文" /> | ||||
|           </el-form-item> | ||||
|         </el-col> | ||||
|         <el-col :span="24"> | ||||
|           <el-form-item label="合同补充协议" prop="contractAgreement"> | ||||
|             <el-input v-model="formData.contractAgreement" type="textarea" rows="5"  disabled placeholder="请输入合同补充协议" /> | ||||
|           </el-form-item> | ||||
|         </el-col> | ||||
|       </el-row> | ||||
| 
 | ||||
|       <el-row> | ||||
|         <el-col :span="8"> | ||||
|           <el-form-item label="线上总金额" prop="onlinePrice"> | ||||
|  | @ -318,19 +158,295 @@ | |||
|           <el-form-item label="总金额" prop="price"> | ||||
|             <el-input | ||||
|               disabled | ||||
|                placeholder="总金额" | ||||
|               v-model="formData.totalPrice" | ||||
|               :formatter="erpPriceInputFormatter" | ||||
|             /> | ||||
|           </el-form-item> | ||||
|         </el-col> | ||||
|       </el-row> | ||||
|       <el-row> | ||||
|       <el-col :span="24"> | ||||
|         <ContentWrap style="border: none;font-weight: 700"> | ||||
|           甲方基本信息 | ||||
|         </ContentWrap> | ||||
|       </el-col> | ||||
|       <el-col :span="8"> | ||||
|         <el-form-item label="甲方名称" prop="partyName"> | ||||
|           <el-select v-model="formData.partyName" disabled placeholder="甲方名称"> | ||||
|             <el-option | ||||
|               v-for="dict in getStrDictOptions('payment_term')" | ||||
|               :key="dict.value" | ||||
|               :label="dict.label" | ||||
|               :value="dict.value" | ||||
|             /> | ||||
|           </el-select> | ||||
|         </el-form-item> | ||||
|       </el-col> | ||||
|       <!-- <el-col :span="8"> | ||||
|         <el-form-item label="客户编号" prop="customerId"> | ||||
|           <el-input v-model="formData.customerId" disabled placeholder="客户编号" /> | ||||
|         </el-form-item> | ||||
|       </el-col> --> | ||||
|       <el-col :span="8"> | ||||
|         <el-form-item label="法人代表" prop="legalPersonName"> | ||||
|           <el-input v-model="formData.legalPersonName" placeholder="法人代表" disabled /> | ||||
|         </el-form-item> | ||||
|       </el-col> | ||||
|       <el-col :span="8"> | ||||
|         <el-form-item label="统一信用代码" prop="creditNo"> | ||||
|           <el-input v-model="formData.creditNo" placeholder="统一信用代码" disabled /> | ||||
|         </el-form-item> | ||||
|       </el-col> | ||||
|       <el-col :span="8"> | ||||
|         <el-form-item label="企业类型" prop="regType"> | ||||
|           <el-input v-model="formData.regType" placeholder="企业类型" disabled /> | ||||
|         </el-form-item> | ||||
|       </el-col> | ||||
|       <el-col :span="8"> | ||||
|         <!-- <el-form-item label="融资信息" prop="financingInfo"> | ||||
|           <el-input v-model="formData.financingInfo" placeholder="融资信息" disabled  /> | ||||
|         </el-form-item> --> | ||||
|       </el-col> | ||||
|       <el-col :span="8"> | ||||
|         <el-form-item label="实缴资金" prop="actualCapital"> | ||||
|           <el-input v-model="formData.actualCapital" placeholder="实缴资金" disabled  /> | ||||
|         </el-form-item> | ||||
|       </el-col> | ||||
|       <el-col :span="8"> | ||||
|         <el-form-item label="参保人数" prop="socialEmployeeNum"> | ||||
|           <el-input v-model="formData.socialEmployeeNum" placeholder="参保人数" disabled  /> | ||||
|         </el-form-item> | ||||
|       </el-col> | ||||
|       <el-col :span="8"> | ||||
|         <!-- <el-form-item label="上市情况" prop="listingStatus"> | ||||
|           <el-input v-model="formData.listingStatus" placeholder="上市情况" disabled /> | ||||
|         </el-form-item> --> | ||||
|       </el-col> | ||||
|       <el-col :span="8"> | ||||
|         <el-form-item label="注册地址" prop="registeredAddress"> | ||||
|           <el-input v-model="formData.registeredAddress" placeholder="注册地址" disabled /> | ||||
|         </el-form-item> | ||||
|       </el-col> | ||||
|       <el-col :span="24"> | ||||
|         <ContentWrap style="border: none;font-weight: 700"> | ||||
|           乙方基本信息 | ||||
|         </ContentWrap> | ||||
|       </el-col> | ||||
|       <el-col :span="8"> | ||||
|         <el-form-item label="合作主体" prop="partnerCompanyId"> | ||||
|           <el-select v-model="formData.partnerCompanyId" placeholder="合作主体" disabled > | ||||
|             <el-option | ||||
|               v-for="dict in orgList" | ||||
|               :key="dict.id" | ||||
|               :label="dict.orgName" | ||||
|               :value="dict.id" | ||||
|             /> | ||||
|           </el-select> | ||||
|         </el-form-item> | ||||
|       </el-col> | ||||
|       <el-col :span="8"> | ||||
|         <el-form-item label="开户行" prop="bankName"> | ||||
|           <el-input v-model="formData.bankName" placeholder="开户行" disabled /> | ||||
|         </el-form-item> | ||||
|       </el-col> | ||||
|       <el-col :span="8"> | ||||
|         <el-form-item label="银行账号" prop="bankAccount"> | ||||
|           <el-input v-model="formData.bankAccount" placeholder="银行账号" disabled /> | ||||
|         </el-form-item> | ||||
|       </el-col> | ||||
|       <el-col :span="8"> | ||||
|         <el-form-item label="法人代表" prop="legalRepresentative"> | ||||
|           <el-input v-model="formData.legalRepresentative" placeholder="法人代表" disabled /> | ||||
|         </el-form-item> | ||||
|       </el-col> | ||||
|       <el-col :span="8"> | ||||
|         <el-form-item label="商务负责人" prop="ownerUserId"> | ||||
|           <el-input v-model="formData.ownerUserId" placeholder="商务负责人" disabled /> | ||||
|         </el-form-item> | ||||
|       </el-col> | ||||
|       <el-col :span="8"> | ||||
|         <el-form-item label="手机号" prop="mobile"> | ||||
|           <el-input | ||||
|             v-model="formData.ownerUserMobile" | ||||
|             placeholder="手机号" | ||||
|             disabled | ||||
|           /> | ||||
|         </el-form-item> | ||||
|       </el-col> | ||||
|       <el-col :span="8"> | ||||
|         <el-form-item label="E-mail" prop="email"> | ||||
|           <el-input | ||||
|             v-model="formData.ownerUserEmail" | ||||
|             placeholder="E-mail" | ||||
|             disabled | ||||
|           /> | ||||
|         </el-form-item> | ||||
|       </el-col> | ||||
|       <el-col :span="8"> | ||||
|         <el-form-item label="微信号" prop="wechat"> | ||||
|           <el-input | ||||
|             v-model="formData.ownerUserWechat" | ||||
|             placeholder="微信号" | ||||
|             disabled | ||||
|           /> | ||||
|         </el-form-item> | ||||
|       </el-col> | ||||
|       <el-col :span="8"> | ||||
|         <el-form-item label="归属部门" prop="deptId"> | ||||
|           <el-tree-select | ||||
|             v-model="formData.deptId" | ||||
|             :data="deptTree" | ||||
|             disabled | ||||
|             :props="defaultProps" | ||||
|             check-strictly | ||||
|             node-key="id" | ||||
|             placeholder="归属部门" | ||||
|           /> | ||||
|         </el-form-item> | ||||
|       </el-col> | ||||
|       <el-col :span="24"> | ||||
|         <ContentWrap style="border: none;font-weight: 700"> | ||||
|           合同信息 | ||||
|         </ContentWrap> | ||||
|       </el-col> | ||||
|       <el-col :span="8"> | ||||
|           <el-form-item label="合同类型" prop="contractType"> | ||||
|             <el-radio-group v-model="formData.contractType" disabled> | ||||
|               <el-radio :label="1">单次合同</el-radio> | ||||
|               <el-radio :label="2">框架合同</el-radio> | ||||
|             </el-radio-group> | ||||
|           </el-form-item> | ||||
|         </el-col> | ||||
|         <el-col :span="8"> | ||||
|           <el-form-item label="合同签订日期" prop="startTime"> | ||||
|             <el-date-picker | ||||
|               v-model="formData.startTime" | ||||
|               disabled | ||||
|               type="date" | ||||
|               value-format="x" | ||||
|               placeholder="选择合同签订日期" | ||||
|               style="width: 100%" | ||||
|             /> | ||||
|           </el-form-item> | ||||
|         </el-col> | ||||
|         <el-col :span="8"> | ||||
|           <el-form-item label="合同结束时间" prop="endTime"> | ||||
|             <el-date-picker | ||||
|               v-model="formData.endTime" | ||||
|               type="date" | ||||
|               disabled | ||||
|               value-format="x" | ||||
|               placeholder="选择合同结束时间" | ||||
|               style="width: 100%" | ||||
|             /> | ||||
|           </el-form-item> | ||||
|         </el-col> | ||||
|         <el-col :span="8"> | ||||
|           <el-form-item label="合同期限(月)" prop="contractTerm"> | ||||
|             <el-input v-model="formData.contractTerm" disabled oninput = "value=value.replace(/[^\d]/g,'')" placeholder="请输入合同期限(月)" /> | ||||
|           </el-form-item> | ||||
|         </el-col> | ||||
|         <el-col :span="8"> | ||||
|           <el-form-item label="账单日" prop="statementDate"> | ||||
|             <el-select v-model="formData.statementDate" disabled placeholder="请选择账单日"  > | ||||
|               <el-option | ||||
|                 v-for="(dict, index) in statement" | ||||
|                 :key="index" | ||||
|                 :label="index + 1" | ||||
|                 :value="index + 1" | ||||
|               /> | ||||
|             </el-select> | ||||
|           </el-form-item> | ||||
|         </el-col> | ||||
|         <el-col :span="8"> | ||||
|           <el-form-item label="最晚付款日" prop="lastPayDate"> | ||||
|             <el-select v-model="formData.lastPayDate" disabled placeholder="请选择最晚付款日"  > | ||||
|               <el-option | ||||
|                 v-for="(dict, index) in statement" | ||||
|                 :key="index" | ||||
|                 :label="index + 1" | ||||
|                 :value="index + 1" | ||||
|               /> | ||||
|             </el-select> | ||||
|           </el-form-item> | ||||
|         </el-col> | ||||
|         <el-col :span="8"> | ||||
|           <el-form-item label="违约金比例" prop="penaltyRate"> | ||||
|             <el-input v-model="formData.penaltyRate" disabled placeholder="请输入违约金比例" /> | ||||
|           </el-form-item> | ||||
|         </el-col> | ||||
|         <el-col :span="8"> | ||||
|           <el-form-item label="延期付款利率" prop="latePaymentRate"> | ||||
|             <el-input v-model="formData.latePaymentRate" disabled placeholder="请输入延期付款利率" /> | ||||
|           </el-form-item> | ||||
|         </el-col> | ||||
|         <!-- <el-col :span="8"> | ||||
|           <el-form-item label="票据模板" prop="invoiceTemplateId"> | ||||
|             <el-input v-model="formData.invoiceTemplateId" placeholder="请输入票据模板" disabled /> | ||||
|           </el-form-item> | ||||
|         </el-col> | ||||
|       </el-row> | ||||
|        | ||||
|       <el-row> --> | ||||
|       <el-col :span="24"> | ||||
|         <ContentWrap style="border: none;font-weight: 700"> | ||||
|           财务与客服对接信息 | ||||
|         </ContentWrap> | ||||
|       </el-col> | ||||
|       <el-col :span="8"> | ||||
|         <el-form-item label="财务结算方式" prop="settleMethod"> | ||||
|           <el-radio-group v-model="formData.settleMethod" disabled> | ||||
|             <el-radio :label="1">按月结算</el-radio> | ||||
|             <el-radio :label="0">按项目结算</el-radio> | ||||
|           </el-radio-group> | ||||
|         </el-form-item> | ||||
|       </el-col> | ||||
|       <el-col :span="8"> | ||||
|         <el-form-item label="售后维护人" prop="afterSaleUserId"> | ||||
|           <el-select v-model="formData.afterSaleUserId" disabled placeholder="请选择售后维护人"> | ||||
|             <el-option | ||||
|               v-for="dict in userOptions" | ||||
|               :key="dict.id" | ||||
|               :label="dict.nickname" | ||||
|               :value="dict.id" | ||||
|             /> | ||||
|           </el-select> | ||||
|         </el-form-item> | ||||
|       </el-col> | ||||
|       <el-col :span="8"> | ||||
|           <el-form-item label="协作人" prop="collUserId"> | ||||
|             <el-select v-model="formData.collUserId" disabled placeholder="请选择协作人"> | ||||
|               <el-option | ||||
|                 v-for="dict in userOptions" | ||||
|                 :key="dict.id" | ||||
|                 :label="dict.nickname" | ||||
|                 :value="dict.id" | ||||
|               /> | ||||
|             </el-select> | ||||
|           </el-form-item> | ||||
|         </el-col> | ||||
|       <el-col :span="24"> | ||||
|         <el-form-item label="合同正文" prop="contractBody"> | ||||
|           <el-input v-model="formData.contractBody" disabled type="textarea" rows="5" placeholder="请输入合同正文" /> | ||||
|         </el-form-item> | ||||
|       </el-col> | ||||
|       <el-col :span="24"> | ||||
|         <el-form-item label="合同补充协议" prop="contractAgreement"> | ||||
|           <el-input v-model="formData.contractAgreement" disabled type="textarea" rows="5" placeholder="请输入合同补充协议" /> | ||||
|         </el-form-item> | ||||
|       </el-col> | ||||
|          | ||||
|       </el-row> | ||||
| 
 | ||||
|        | ||||
|       <!-- 子表的表单 --> | ||||
|       <ContentWrap> | ||||
|         <el-tabs v-model="subTabsName" class="-mt-15px -mb-10px"> | ||||
|           <el-tab-pane label="产品清单" name="product"> | ||||
|             <ContractProductForm | ||||
|             :type="1" | ||||
|               ref="productFormRef" | ||||
|                :type="1" | ||||
|               :products="formData.products" | ||||
|               :disabled="disabled" | ||||
|             /> | ||||
|  | @ -347,11 +463,10 @@ | |||
|         </el-tabs> | ||||
|       </ContentWrap> | ||||
|     </el-form> | ||||
|      | ||||
|     <!-- 显示在其他页面时的判断type --> | ||||
|   </ContentWrap> | ||||
| </template> | ||||
| <script lang="ts" setup> | ||||
| import { getIntDictOptions, DICT_TYPE } from '@/utils/dict' | ||||
| import * as CustomerApi from '@/api/crm/customer' | ||||
| import * as ContractApi from '@/api/crm/contract' | ||||
| import * as ContactApi from '@/api/crm/contact' | ||||
|  | @ -359,11 +474,15 @@ import * as UserApi from '@/api/system/user' | |||
| import { QuotationApi,QuotationVO } from '@/api/crm/quotation' | ||||
| import { erpPriceMultiply, erpPriceInputFormatter } from '@/utils' | ||||
| import { useUserStore } from '@/store/modules/user' | ||||
| import { BillTemplateApi, BillTemplateVO } from '@/api/crm/billtemplate' | ||||
| import ContractProductForm from '@/views/crm/contract/components/ContractProductForm.vue' | ||||
| import ContractAAuthorizedCompanyForm from '../components/ContractAAuthorizedCompanyForm.vue' | ||||
| import ContractAAuthorizedPersonForm from '../components/ContractAAuthorizedPersonForm.vue' | ||||
| import ContractBAuthorizedPersonForm from '../components/ContractBAuthorizedPersonForm.vue' | ||||
| import { propTypes } from '@/utils/propTypes' | ||||
| import { getIntDictOptions, getStrDictOptions, DICT_TYPE } from '@/utils/dict' | ||||
| import { defaultProps, handleTree } from '@/utils/tree' | ||||
| import * as DeptApi from '@/api/system/dept' | ||||
| 
 | ||||
| const { t } = useI18n() // 国际化 | ||||
| const message = useMessage() // 消息弹窗 | ||||
|  | @ -372,15 +491,22 @@ const props = defineProps({ | |||
|   id: propTypes.number.def(undefined), | ||||
|   type: propTypes.number.def(undefined), | ||||
| }) | ||||
| const templateOptions = ref([])  | ||||
| const dialogVisible = ref(false) // 弹窗的是否展示 | ||||
| const dialogTitle = ref('') // 弹窗的标题 | ||||
| const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用 | ||||
| const formType = ref('') // 表单的类型:create - 新增;update - 修改 | ||||
| const deptTree = ref() // 部门树形结构 | ||||
| const formData = ref({ | ||||
|   id: undefined, | ||||
|   name: undefined, | ||||
|   no: undefined, | ||||
|   customerId: undefined, | ||||
|   partyName: undefined, | ||||
|   lastPayDate: undefined, | ||||
|   partAddress: undefined, | ||||
|   secPartyPerson: undefined, | ||||
|   wechat: undefined, | ||||
|   quotationId: undefined, | ||||
|   invoiceTemplateId: undefined, | ||||
|   processInstanceId: undefined, | ||||
|  | @ -412,13 +538,20 @@ const formData = ref({ | |||
|   partnerCompanyId: undefined, | ||||
|   deptId: undefined, | ||||
|   quotationTimes: undefined, | ||||
|   statementDate: undefined, | ||||
|   products: [] | ||||
| }) | ||||
| const formRules = reactive({ | ||||
|   name: [{ required: true, message: '合同名称不能为空', trigger: 'blur' }], | ||||
|   customerId: [{ required: true, message: '客户不能为空', trigger: 'blur' }], | ||||
|   quotationId: [{ required: true, message: '报价单编号不能为空', trigger: 'blur' }], | ||||
|   orderDate: [{ required: true, message: '下单日期不能为空', trigger: 'blur' }], | ||||
|   ownerUserId: [{ required: true, message: '负责人不能为空', trigger: 'blur' }] | ||||
|   // ownerUserId: [{ required: true, message: '负责人不能为空', trigger: 'blur' }], | ||||
|   statementDate: [{ required: true, message: '账单日不能为空', trigger: 'change' }], | ||||
|   contractType: [{ required: true, message: '合同类型不能为空', trigger: 'change' }], | ||||
|   penaltyRate: [{ required: true, message: '违约金比例不能为空', trigger: 'blur' }], | ||||
|   latePaymentRate: [{ required: true, message: '延期付款利率不能为空', trigger: 'blur' }], | ||||
|   collUserId: [{ required: true, message: '协作人不能为空', trigger: 'blur' }], | ||||
| }) | ||||
| const formRef = ref() // 表单 Ref | ||||
| const userOptions = ref<UserApi.UserVO[]>([]) // 用户列表 | ||||
|  | @ -426,6 +559,7 @@ const customerList = ref([]) // 客户列表的数据 | |||
| const quotationList = ref<QuotationVO[]>([]) | ||||
| const contactList = ref<ContactApi.ContactVO[]>([]) | ||||
| const orgList = ref([]) | ||||
| const statement = ref(new Array(31).fill(null)) | ||||
| 
 | ||||
| /** 子表的表单 */ | ||||
| const subTabsName = ref('product') | ||||
|  | @ -479,8 +613,30 @@ const submitForm = async () => { | |||
|   const valid = await formRef.value.validate() | ||||
|   if (!valid) return | ||||
|   // 提交请求 | ||||
|   if(contractAAuthorizedCompanyFormRef.value.getData().length) { | ||||
|     const contractAAuthorizedCompanyValid = await contractAAuthorizedCompanyFormRef.value.validate() | ||||
|     if (!contractAAuthorizedCompanyValid) return message.warning('请完善合同甲方关联单位') | ||||
|   } else { | ||||
|     return message.warning('请完善合同甲方关联单位') | ||||
|   }  | ||||
| 
 | ||||
|    if(contractAAuthorizedPersonFormRef.value.getData().length) { | ||||
|     const contractAAuthorizedPerson = await contractAAuthorizedPersonFormRef.value.validate() | ||||
|     if (!contractAAuthorizedPerson) return message.warning('请完善合同甲方授权人信息') | ||||
|   } else { | ||||
|     return message.warning('请完善合同甲方授权人信息') | ||||
|   }  | ||||
| 
 | ||||
|   if(contractBAuthorizedPersonFormRef.value.getData().length) { | ||||
|     const contractBAuthorizedPersonPerson = await contractBAuthorizedPersonFormRef.value.validate() | ||||
|     if (!contractBAuthorizedPersonPerson) return message.warning('请完善合同乙方授权人信息') | ||||
|   } else { | ||||
|     return message.warning('请完善合同乙方授权人信息') | ||||
|   }  | ||||
| 
 | ||||
|   return | ||||
|   formLoading.value = true | ||||
|   productFormRef.value.validate() | ||||
| 
 | ||||
|   try { | ||||
|     const data = unref(formData.value) as unknown as ContractApi.ContractVO | ||||
|     // 拼接子表的数据 | ||||
|  | @ -545,6 +701,7 @@ const resetForm = () => { | |||
|     partnerCompanyId: undefined, | ||||
|     deptId: undefined, | ||||
|     quotationTimes: undefined, | ||||
|     paymentTerm: undefined, | ||||
|     products: [] | ||||
|   } | ||||
|   formRef.value?.resetFields() | ||||
|  | @ -562,12 +719,14 @@ const handleQuotationChange = async (quotationId: number) => { | |||
|     formData.value.invoiceTemplateId = quotation.invoiceTemplateId;  | ||||
| 
 | ||||
|     formData.value.ownerUserId = quotation.ownerUserId; | ||||
|     formData.value.ownerUserMobile = quotation.ownerUserMobile; | ||||
|     formData.value.ownerUserWechat = quotation.ownerUserWechat; | ||||
|     formData.value.ownerUserEmail = quotation.ownerUserEmail; | ||||
|     formData.value.expanderUserId = quotation.expanderUserId; | ||||
|     formData.value.pricingUserId = quotation.pricingUserId; | ||||
|     formData.value.signUserId = quotation.signUserId; | ||||
|     formData.value.signPhoneNumber = quotation.signPhoneNumber; | ||||
|     formData.value.signEmail = quotation.signEmail; | ||||
|     formData.value.signWechat = quotation.signWechat; | ||||
|     formData.value.paymentTerm = quotation.paymentTerm; | ||||
| 
 | ||||
|     formData.value.partnerCompanyId = quotation.partnerCompanyId; | ||||
| 
 | ||||
|  | @ -580,8 +739,10 @@ const handleQuotationChange = async (quotationId: number) => { | |||
|     formData.value.onlinePrice = quotation.onlinePrice; | ||||
|     formData.value.totalPrice = quotation.totalPrice; | ||||
|      | ||||
|      // 🔁 自动加载客户详情 | ||||
|      const customerRes = await ContractApi.quotationTimes(quotation.id); | ||||
|      formData.value.quotationTimes = customerRes.quotationTimes; | ||||
|      await onCustomerChange(quotation.customerId); | ||||
|      await onPartnerChange(quotation.partnerCompanyId); | ||||
|   } catch (err) { | ||||
|   } finally { | ||||
| 
 | ||||
|  | @ -603,13 +764,16 @@ const onCustomerChange = async (customerId: string) => { | |||
|     formData.value.insuredCount = customerRes.insuredCount; | ||||
|     formData.value.establishmentDate = customerRes.establishmentDate; | ||||
|     formData.value.enterpriseType = customerRes.enterpriseType; | ||||
|     formData.value.businessStatus = customerRes.businessStatus; | ||||
|     formData.value.defendantRecord = customerRes.defendantRecord; | ||||
|     formData.value.businessAbnormal = customerRes.businessAbnormal; | ||||
|     formData.value.equityPledge = customerRes.equityPledge; | ||||
|     formData.value.dishonestRecord = customerRes.dishonestRecord; | ||||
|     formData.value.financingRecord = customerRes.financingRecord; | ||||
|     formData.value.enforcementRecord = customerRes.enforcementRecord; | ||||
|     formData.value.actualCapital = customerRes.actualCapital; | ||||
| 
 | ||||
|     formData.value.partAddress = customerRes.partAddress; | ||||
|     formData.value.listingStatus = customerRes.listingStatus; | ||||
|     formData.value.legalPersonName = customerRes.legalPersonName; | ||||
|     formData.value.creditCode = customerRes.creditCode; | ||||
|     formData.value.regType = customerRes.regType; | ||||
|     formData.value.financingInfo = customerRes.financingInfo; | ||||
|     formData.value.socialEmployeeNum = customerRes.socialEmployeeNum; | ||||
|     formData.value.registeredAddress = customerRes.registeredAddress; | ||||
|   } catch (err) { | ||||
|     console.error('获取客户详情失败:', err); | ||||
|   } finally { | ||||
|  | @ -617,6 +781,23 @@ const onCustomerChange = async (customerId: string) => { | |||
|   } | ||||
| } | ||||
| 
 | ||||
| const onPartnerChange = async (id: string) => { | ||||
|   if (!id) return | ||||
|   try { | ||||
|     formLoading.value = true; | ||||
|     const res = await ContractApi.getOrgInfo(id); | ||||
|     formData.value.bankName = res.bankName; | ||||
|     formData.value.bankAccount = res.bankAccount; | ||||
|     formData.value.legalRepresentative = res.legalRepresentative; | ||||
|     formData.value.businessLicenseNumber = res.businessLicenseNumber; | ||||
|     formData.value.businessLicense = res.businessLicense; | ||||
|     // formData.value.partnerCompanyId = res.partnerCompanyId; | ||||
|   } catch (err) { | ||||
|   } finally { | ||||
|     formLoading.value = false; | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** 动态获取客户联系人 */ | ||||
| const getContactOptions = computed(() => | ||||
|  | @ -625,7 +806,6 @@ const getContactOptions = computed(() => | |||
| 
 | ||||
| const route = useRoute(); | ||||
| onMounted(async () => { | ||||
|   console.log('%csrc/views/crm/contract/detail/ContractDetail.vue:627 props.id', 'color: #007acc;', props.id); | ||||
|   formType.value = props.id || route.query.id | ||||
| 
 | ||||
|   if (formType.value) await open(formType.value) | ||||
|  | @ -637,6 +817,16 @@ onMounted(async () => { | |||
|   // 获得报价列表 | ||||
|   quotationList.value = await QuotationApi.getSimpleQuotationList() | ||||
| 
 | ||||
|   //票据 | ||||
|    const tempData = await BillTemplateApi.getBillTemplatePage({ | ||||
|     pageNo: 1, | ||||
|     pageSize: 1000, | ||||
|   }) | ||||
|   templateOptions.value = tempData.list | ||||
| 
 | ||||
| 
 | ||||
|   // 获得部门树 | ||||
|   deptTree.value = handleTree(await DeptApi.getSimpleDeptList()) | ||||
|   // 默认新建时选中自己 | ||||
|   // if (formType.value === 'create') { | ||||
|   //   formData.value.ownerUserId = useUserStore().getUser.id | ||||
|  |  | |||
|  | @ -648,7 +648,7 @@ const resetForm = () => { | |||
| 
 | ||||
| const route = useRoute(); | ||||
| onMounted(async () => { | ||||
|   console.log('%csrc/views/crm/quotation/QuotationDetail.vue:651 props.id', 'color: #007acc;', props.id); | ||||
|   console.log('%csrc/views/crm/quotation/QuotationDetail.vue:651 props.id', 'color: #007acc;', props.id, route.query.id); | ||||
|   formType.value = props.id ||  route.query.id; | ||||
| 
 | ||||
|   if (formType.value) open(formType.value) | ||||
|  |  | |||
|  | @ -324,7 +324,7 @@ | |||
|       </el-col> | ||||
|       <el-col :span="8"> | ||||
|         <el-form-item label="票据模板" prop="invoiceTemplateId"> | ||||
|           <el-select v-model="formData.invoiceTemplateId" :disabled="!formData.businessId" placeholder="请选择票据模板"> | ||||
|           <el-select v-model="formData.invoiceTemplateId" :disabled="!formData.businessId" @change="changeTemplate" placeholder="请选择票据模板"> | ||||
|             <el-option | ||||
|               v-for="dict in templateOptions" | ||||
|               :key="dict.id" | ||||
|  | @ -374,7 +374,7 @@ | |||
|     <!-- 子表的表单 --> | ||||
|     <el-tabs v-model="subTabsName"> | ||||
|       <el-tab-pane label="报价产品关联" name="quotationProduct"> | ||||
|         <QuotationProductForm ref="quotationProductFormRef" :products="formData.products" :quotation-id="formData.id" :business-id="formData.businessId" :billTemplateId="formData.invoiceTemplateId" /> | ||||
|         <QuotationProductForm ref="quotationProductFormRef" :handleType="handleType" :quotation-id="formData.id" :business-id="formData.businessId" :billTemplateId="formData.invoiceTemplateId" :products="formData.products" /> | ||||
|       </el-tab-pane> | ||||
|     </el-tabs> | ||||
|     <div style="text-align: right"> | ||||
|  | @ -394,10 +394,13 @@ import * as CustomerApi from '@/api/crm/customer' | |||
| import * as UserApi from '@/api/system/user' | ||||
| import * as DeptApi from '@/api/system/dept' | ||||
| import * as BusinessApi from '@/api/crm/business' | ||||
| import { propTypes } from '@/utils/propTypes' | ||||
| 
 | ||||
| /** CRM 方案报价 表单 */ | ||||
| defineOptions({ name: 'QuotationForm' }) | ||||
| 
 | ||||
| const props = defineProps({ | ||||
|   id: propTypes.number.def(undefined), | ||||
| }) | ||||
| const { t } = useI18n() // 国际化 | ||||
| const message = useMessage() // 消息弹窗 | ||||
| const customerList = ref([]) // 客户列表的数据 | ||||
|  | @ -407,6 +410,7 @@ const businessList = ref([]) | |||
| const deptTree = ref() // 部门树形结构 | ||||
| const deptList = ref() // 部门 | ||||
| const orgList = ref([]) | ||||
| const handleType = ref('') | ||||
| 
 | ||||
| const invoiceTemplateList = ref([])  | ||||
| const { proxy }: any = getCurrentInstance(); | ||||
|  | @ -492,6 +496,8 @@ const quotationProductFormRef = ref() | |||
| 
 | ||||
| const onBusinessChange = async (businessId: string) => { | ||||
|   if (!businessId) return | ||||
| 
 | ||||
|   handleType.value = 1 | ||||
|   try { | ||||
|     formLoading.value = true; | ||||
|     const res = await BusinessApi.getBusiness(businessId); | ||||
|  | @ -620,6 +626,11 @@ const submitForm = async () => { | |||
| 
 | ||||
| } | ||||
| 
 | ||||
| const changeTemplate = async() => { | ||||
|   handleType.value = 1 | ||||
|   console.log('%csrc/views/crm/quotation/QuotationForm.vue:631 handleType.value,222', 'color: #007acc;', handleType.value,222); | ||||
| } | ||||
| 
 | ||||
| const goBack = ()=> { | ||||
|   proxy.$router.go(-1) | ||||
| } | ||||
|  | @ -657,7 +668,7 @@ const resetForm = () => { | |||
| 
 | ||||
| const route = useRoute(); | ||||
| onMounted(async () => { | ||||
|   formType.value = route.query.id; | ||||
|   formType.value = props.id ||  route.query.id; | ||||
| 
 | ||||
|   if (formType.value) open(formType.value) | ||||
| 
 | ||||
|  |  | |||
|  | @ -62,28 +62,57 @@ | |||
|       <el-table-column label="产品票据" min-width="150"> | ||||
|         <template #default="{ row, $index }"> | ||||
|           <el-form-item :prop="`${$index}.productInvoice`" :rules="formRules.productInvoice" class="mb-0px!"> | ||||
|             <dict-tag :type="DICT_TYPE.CRM_PRODUCT_INVOICE" :value="row.productInvoice" /> | ||||
|             <el-select v-model="row.productInvoice" placeholder="请选择状态" disabled class="!w-240px"> | ||||
|               <el-option | ||||
|                 v-for="dict in getIntDictOptions(DICT_TYPE.CRM_PRODUCT_INVOICE)" | ||||
|                 :key="dict.value" | ||||
|                 :label="dict.label" | ||||
|                 :value="dict.value" | ||||
|               /> | ||||
|             </el-select> | ||||
|           </el-form-item> | ||||
|         </template> | ||||
|       </el-table-column> | ||||
|       <el-table-column label="产品开具项目" min-width="150"> | ||||
|       <el-table-column label="产品开具项目" min-width="250"> | ||||
|         <template #default="{ row, $index }"> | ||||
|           <el-form-item :prop="`${$index}.productInvoiceItems`" :rules="formRules.productInvoiceItems" class="mb-0px!"> | ||||
|           <el-form-item :prop="`${$index}.productInvoiceItem`" :rules="formRules.productInvoiceItems" class="mb-0px!"> | ||||
|             <dict-tag :type="DICT_TYPE.CRM_PRODUCT_INVOICE_ITEMS" :value="row.productInvoiceItems" /> | ||||
|             <el-select v-model="row.productInvoiceItem" placeholder="请选择状态" disabled> | ||||
|               <el-option | ||||
|                 v-for="dict in getIntDictOptions(DICT_TYPE.CRM_PRODUCT_INVOICE_ITEMS)" | ||||
|                 :key="dict.value" | ||||
|                 :label="dict.label" | ||||
|                 :value="dict.value" | ||||
|               /> | ||||
|             </el-select> | ||||
|           </el-form-item> | ||||
|         </template> | ||||
|       </el-table-column> | ||||
|       <el-table-column label="服务费票据" min-width="150"> | ||||
|         <template #default="{ row, $index }"> | ||||
|           <el-form-item :prop="`${$index}.serviceFeeInvoice`" :rules="formRules.serviceFeeInvoice" class="mb-0px!"> | ||||
|             <dict-tag :type="DICT_TYPE.CRM_SERVICE_FEE_INVOICE" :value="row.serviceFeeInvoice" /> | ||||
|           <el-form-item :prop="`${$index}.serviceInvoice`" :rules="formRules.serviceFeeInvoice" class="mb-0px!"> | ||||
|             <el-select v-model="row.serviceInvoice" placeholder="请选择状态" disabled class="!w-240px"> | ||||
|               <el-option | ||||
|                 v-for="dict in getIntDictOptions(DICT_TYPE.CRM_SERVICE_FEE_INVOICE)" | ||||
|                 :key="dict.value" | ||||
|                 :label="dict.label" | ||||
|                 :value="dict.value" | ||||
|               /> | ||||
|             </el-select> | ||||
|           </el-form-item> | ||||
|         </template> | ||||
|       </el-table-column> | ||||
|       <el-table-column label="服务开具项目" min-width="150"> | ||||
|       <el-table-column label="服务开具项目" min-width="250"> | ||||
|         <template #default="{ row, $index }"> | ||||
|           <el-form-item :prop="`${$index}.serviceFeeInvoiceItems`" :rules="formRules.serviceFeeInvoiceItems" class="mb-0px!"> | ||||
|             <dict-tag :type="DICT_TYPE.CRM_SERVICE_FEE_INVOICE_ITEMS" :value="row.serviceFeeInvoiceItems" /> | ||||
|           <el-form-item :prop="`${$index}.serviceInvoiceItem`" :rules="formRules.serviceFeeInvoiceItems" class="mb-0px!"> | ||||
|             <el-select v-model="row.serviceInvoiceItem" placeholder="请选择状态" disabled class="!w-240px"> | ||||
|               <el-option | ||||
|                 v-for="dict in getIntDictOptions(DICT_TYPE.CRM_SERVICE_FEE_INVOICE_ITEMS)" | ||||
|                 :key="dict.value" | ||||
|                 :label="dict.label" | ||||
|                 :value="dict.value" | ||||
|               /> | ||||
|             </el-select> | ||||
|           </el-form-item> | ||||
|         </template> | ||||
|       </el-table-column> | ||||
|  | @ -122,55 +151,7 @@ const formRules = reactive({ | |||
| const formRef = ref() // 表单 Ref | ||||
| 
 | ||||
| /** 监听主表的关联字段的变化,加载对应的子表数据 */ | ||||
| watch( | ||||
|   () => props.businessId, | ||||
|   async (val) => { | ||||
|     // 1. 重置表单 | ||||
|     formData.value = [] | ||||
|     // 2. val 非空,则加载数据 | ||||
|     if (!val) { | ||||
|       return; | ||||
|     } | ||||
|     try { | ||||
|       formLoading.value = true | ||||
|       // if(val.quotationId) { | ||||
|         // formData.value = await QuotationApi.getQuotationProductListByQuotationId(val.quotationId) | ||||
|       // } else if(val.businessId) { | ||||
|         const business = await BusinessApi.getBusiness(val); | ||||
|         formData.value = business.products | ||||
|       // } | ||||
|     } finally { | ||||
|       formLoading.value = false | ||||
|     } | ||||
|   }, | ||||
| ) | ||||
| 
 | ||||
| watch( | ||||
|   () => props.billTemplateId, | ||||
|   async (val) => { | ||||
|     // 1. 重置表单 | ||||
|     formData.value = [] | ||||
|     // 2. val 非空,则加载数据 | ||||
|     if (!val) { | ||||
|       return; | ||||
|     } | ||||
|     try { | ||||
|       formLoading.value = true | ||||
|       // if(val.quotationId) { | ||||
|         // formData.value = await QuotationApi.getQuotationProductListByQuotationId(val.quotationId) | ||||
|       // } else if(val.businessId) { | ||||
|         const business = await BillTemplateApi.getTemplateProduct({ | ||||
|           businessId: props.businessId, | ||||
|           billTemplateId: val, | ||||
|         }); | ||||
|         console.log('%csrc/views/crm/quotation/components/QuotationProductForm.vue:167 business.data', 'color: #007acc;', business.data); | ||||
|         formData.value = business | ||||
|       // } | ||||
|     } finally { | ||||
|       formLoading.value = false | ||||
|     } | ||||
|   }, | ||||
| ) | ||||
| watch( | ||||
|   () => props.products, | ||||
|   (val) => { | ||||
|  | @ -179,6 +160,7 @@ watch( | |||
|     } | ||||
|     nextTick(() => { | ||||
|       formData.value = val | ||||
|       console.log('%csrc/views/crm/quotation/components/QuotationProductDetail.vue:134 val', 'color: #007acc;', val); | ||||
|     }) | ||||
|   }, | ||||
|   { immediate: true } | ||||
|  |  | |||
|  | @ -158,7 +158,8 @@ const props = defineProps<{ | |||
|   quotationId: undefined, // 报价编号(主表的关联字段) | ||||
|   businessId: undefined, | ||||
|   billTemplateId: undefined, | ||||
|   products: undefined | ||||
|   products: undefined, | ||||
|   handleType: undefined | ||||
| }>() | ||||
| const formLoading = ref(false) // 表单的加载中 | ||||
| const formData = ref([]) | ||||
|  | @ -179,10 +180,13 @@ const formRules = reactive({ | |||
| }) | ||||
| const formRef = ref() // 表单 Ref | ||||
| 
 | ||||
| const emit = defineEmits(['update:handleType']) | ||||
| /** 监听主表的关联字段的变化,加载对应的子表数据 */ | ||||
| watch( | ||||
|   () => props.businessId, | ||||
|   async (val) => { | ||||
| 
 | ||||
|     if(!props.handleType) return | ||||
|     // 1. 重置表单 | ||||
|     formData.value = [] | ||||
|     // 2. val 非空,则加载数据 | ||||
|  | @ -191,24 +195,29 @@ watch( | |||
|     } | ||||
|     try { | ||||
|       formLoading.value = true | ||||
|       console.log('%csrc/views/crm/quotation/components/QuotationProductForm.vue:214 1111', 'color: #007acc;', 2222); | ||||
|       // if(val.quotationId) { | ||||
|         // formData.value = await QuotationApi.getQuotationProductListByQuotationId(val.quotationId) | ||||
|       // } else if(val.businessId) { | ||||
|         const business = await BusinessApi.getBusiness(val); | ||||
|         formData.value = business.products | ||||
|       // console.log('%csrc/views/crm/quotation/components/QuotationProductForm.vue:214 1111', 'color: #007acc;', 2222); | ||||
|       emit('update:handleType', 0) | ||||
|       // } | ||||
|     } finally { | ||||
|       formLoading.value = false | ||||
|     } | ||||
|   }, | ||||
|   // { immediate: true } | ||||
|   { immediate: true } | ||||
| ) | ||||
| 
 | ||||
| watch( | ||||
|   () => props.billTemplateId, | ||||
|   async (val) => { | ||||
|     // 2. val 非空,则加载数据 | ||||
|     if(!props.handleType) { | ||||
|       return | ||||
|     } | ||||
| 
 | ||||
|     if (!val) { | ||||
|       return; | ||||
|     } | ||||
|  | @ -223,21 +232,29 @@ watch( | |||
|         }); | ||||
|         for(let i = 0; i < business.length; i++) { | ||||
|           let data = business[i] | ||||
|           if(!data.productId) { | ||||
|             data.productInvoice = '' | ||||
|             data.productInvoiceItem = '' | ||||
|             data.serviceInvoice = '' | ||||
|             data.serviceInvoiceItem = '' | ||||
|           } | ||||
|           let foundItem = formData.value.find(item => item.productId == data.productId); | ||||
|           if (foundItem) { | ||||
|             foundItem.productInvoice = data.productInvoice | ||||
|             foundItem.productInvoiceItem = data.productInvoiceItems | ||||
|             foundItem.serviceInvoice = data.serviceFeeInvoice | ||||
|             foundItem.serviceInvoiceItem = data.serviceFeeInvoiceItems | ||||
|           } | ||||
|           }  | ||||
|         } | ||||
|       emit('update:handleType', 0) | ||||
|          | ||||
|         // formData.value = business | ||||
|       // } | ||||
|     } finally { | ||||
|       formLoading.value = false | ||||
|     } | ||||
|   }, | ||||
|   // { immediate: true } | ||||
|   { immediate: true } | ||||
| ) | ||||
| // 监听合同产品变化,计算合同产品总价 | ||||
| watch( | ||||
|  | @ -260,15 +277,16 @@ watch( | |||
| 
 | ||||
| watch( | ||||
|   () => props.products, | ||||
|   (val) => { | ||||
|   async (val) => { | ||||
|     if (!val || val.length === 0) { | ||||
|       return; | ||||
|     } | ||||
|     nextTick(() => { | ||||
|     await nextTick(() => { | ||||
|       formData.value = val | ||||
|     }) | ||||
|   }, | ||||
|   { immediate: true } | ||||
|   { immediate: true }, | ||||
| 
 | ||||
| 
 | ||||
| ); | ||||
| /** 新增按钮操作 */ | ||||
|  |  | |||
|  | @ -290,10 +290,10 @@ const handleTabClick = (tab: TabsPaneContext) => { | |||
| const formRef = ref() | ||||
| const openFormEdit =  (row: Object) => { | ||||
|    | ||||
|   push({ name: 'QuotationEdit', query: { id: row.id} }) | ||||
|   router.push({ name: 'QuotationEdit', query: { id: row.id} }) | ||||
| } | ||||
| const openFormAdd =  () => { | ||||
|   push({ name: 'QuotationAdd' }) | ||||
|   router.push({ name: 'QuotationAdd' }) | ||||
| } | ||||
| 
 | ||||
| const openFormDetail = (row: Object) => { | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 zy
						zy