form.vue 64 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887
  1. <template>
  2. <!-- 添加或修改项目信息对话框 -->
  3. <div class="el-drawer__wrapper company-list">
  4. <el-drawer :title="title" v-model="visible" direction="rtl" size="100%">
  5. <div class="page-container form-container">
  6. <!-- 功能按钮区域 -->
  7. <div class="form-btns-container">
  8. <span class="title-label"
  9. ><el-icon>
  10. <Document />
  11. </el-icon>
  12. 客户表单</span
  13. >
  14. <el-button
  15. v-if="editStatus"
  16. type="primary"
  17. size="small"
  18. icon="Finished"
  19. @click="submitForm"
  20. >保存</el-button
  21. >
  22. <template v-else>
  23. <el-button
  24. v-hasPermi="['business:company:edit']"
  25. type="warning"
  26. size="small"
  27. icon="Edit"
  28. @click="editStatus = true"
  29. >修改</el-button
  30. >
  31. </template>
  32. <el-button
  33. v-if="form.id && editStatus"
  34. type="info"
  35. size="small"
  36. icon="Close"
  37. @click="
  38. () => {
  39. editStatus = false;
  40. getForm();
  41. }
  42. "
  43. >取消修改</el-button
  44. >
  45. <el-button
  46. v-if="form.id"
  47. type="success"
  48. size="small"
  49. icon="refresh"
  50. @click="getForm"
  51. >
  52. 刷新</el-button
  53. >
  54. <div class="screen-btn" @click="handleScreen">
  55. <template v-if="!isFullscreen">
  56. <i class="fa fa-window-maximize" aria-hidden="true" />
  57. <!-- <span>全屏</span> -->
  58. </template>
  59. <template v-else>
  60. <i class="fa fa-window-restore" aria-hidden="true" />
  61. <!-- <span>还原</span> -->
  62. </template>
  63. </div>
  64. <div class="close-btn" @click="cancel">
  65. <i class="fa fa-times" aria-hidden="true" />
  66. <!-- <span>关闭</span> -->
  67. </div>
  68. </div>
  69. <div
  70. class="Y-scrollbar"
  71. style="
  72. position: absolute;
  73. top: 32px;
  74. bottom: 0;
  75. width: 100%;
  76. overflow: auto;
  77. "
  78. >
  79. <!-- 主表 -->
  80. <el-form
  81. ref="companyRef"
  82. class="master-container"
  83. size="small"
  84. :model="form"
  85. :rules="rules"
  86. label-width="120px"
  87. >
  88. <div class="radio-scroll">
  89. <el-radio-group
  90. v-model="queryRadio"
  91. style="margin-left: 20px"
  92. size="small"
  93. @change="scrollTargetTo"
  94. >
  95. <el-radio-button label="base-form">基本信息</el-radio-button>
  96. <el-radio-button label="business-form"
  97. >工商信息</el-radio-button
  98. >
  99. <el-radio-button label="tax-form">税务信息</el-radio-button>
  100. <el-radio-button label="linkman-form">联系人</el-radio-button>
  101. <el-radio-button v-if="form.id" label="follow-form"
  102. >跟进动态</el-radio-button
  103. >
  104. </el-radio-group>
  105. </div>
  106. <div
  107. class="scroll-view"
  108. style="
  109. position: absolute;
  110. top: 50px;
  111. bottom: 20px;
  112. right: 0px;
  113. left: 0px;
  114. overflow: auto;
  115. "
  116. >
  117. <div class="details-container" style="margin-top: 8px">
  118. <div id="base-form" class="details-head">
  119. <div class="title">
  120. <i class="fa fa-th-list" aria-hidden="true" /> 基本信息
  121. </div>
  122. </div>
  123. <el-row :gutter="30" style="margin-top: 10px">
  124. <el-col :span="12">
  125. <el-form-item label="客户编码:" prop="code">
  126. <el-input
  127. v-if="editStatus"
  128. v-model.trim="form.code"
  129. size="small"
  130. type="text"
  131. style="width: 100%"
  132. placeholder="客户编码"
  133. :clearable="true"
  134. />
  135. <span v-else>{{ form.code }}</span>
  136. </el-form-item>
  137. </el-col>
  138. <el-col :span="6">
  139. <el-form-item label="客户名称:" required prop="name">
  140. <el-input
  141. v-if="editStatus"
  142. v-model.trim="form.name"
  143. size="small"
  144. type="text"
  145. placeholder="客户名称"
  146. :clearable="true"
  147. />
  148. <span v-else>{{ form.name }}</span>
  149. </el-form-item>
  150. </el-col>
  151. <el-col :span="6">
  152. <el-form-item label="简称:" prop="shortName">
  153. <el-input
  154. v-if="editStatus"
  155. v-model.trim="form.shortName"
  156. size="small"
  157. type="text"
  158. placeholder="简称"
  159. :clearable="true"
  160. />
  161. <span v-else>{{ form.shortName }}</span>
  162. </el-form-item>
  163. </el-col>
  164. <el-col :span="12" style="width: 100%">
  165. <el-form-item label="客户来源:" prop="sourceCategoryName">
  166. <CustomerFormCom
  167. ref="CustomerFormComRef"
  168. :edit-status="editStatus"
  169. :form-data="form"
  170. :source-categories="sourceCategories"
  171. />
  172. </el-form-item>
  173. </el-col>
  174. <el-col :span="6" >
  175. <el-form-item label="客户标签:" prop="customerLabelId" >
  176. <el-select v-model="form.customerLabelId" style="width:100%"
  177. v-if="editStatus"
  178. >
  179. <el-option
  180. v-for="item in options"
  181. :key="item.id"
  182. :label="item.lable"
  183. :value="item.id"
  184. />
  185. </el-select>
  186. <span v-else>{{ selectedOptionLabel }}</span>
  187. </el-form-item>
  188. </el-col>
  189. <el-col :span="6" >
  190. <el-form-item label="历史使用名:" prop="oldName" >
  191. <span>{{ form.oldName }}</span>
  192. </el-form-item>
  193. </el-col>
  194. <el-col :span="12">
  195. <el-form-item label="备注:">
  196. <el-input
  197. v-if="editStatus"
  198. v-model.trim="form.remark"
  199. type="text"
  200. width="100%"
  201. size="small"
  202. placeholder="备注"
  203. :clearable="true"
  204. />
  205. <span v-else>{{ form.remark }}</span>
  206. </el-form-item>
  207. </el-col>
  208. </el-row>
  209. <br />
  210. <div id="business-form" class="details-head">
  211. <div class="title">
  212. <i class="fa fa-th-list" aria-hidden="true" /> 工商信息
  213. </div>
  214. </div>
  215. <el-row :gutter="30" style="margin-top: 10px">
  216. <el-col :span="8">
  217. <el-form-item
  218. label="税号:"
  219. prop="socialCreditCode"
  220. >
  221. <el-input
  222. v-if="editStatus"
  223. v-model.trim="form.socialCreditCode"
  224. size="small"
  225. type="text"
  226. placeholder="税号"
  227. :clearable="true"
  228. />
  229. <span v-else>{{ form.socialCreditCode }}</span>
  230. </el-form-item>
  231. </el-col>
  232. <el-col :span="8">
  233. <el-form-item label="主营行业:">
  234. <el-input
  235. v-if="editStatus"
  236. v-model.trim="form.mainBusiness"
  237. size="small"
  238. type="text"
  239. placeholder="主营行业"
  240. :clearable="true"
  241. />
  242. <span v-else>{{ form.mainBusiness }}</span>
  243. </el-form-item>
  244. </el-col>
  245. <el-col :span="8">
  246. <el-form-item label="企业类型:">
  247. <el-input
  248. v-if="editStatus"
  249. v-model.trim="form.type"
  250. size="small"
  251. type="text"
  252. placeholder="企业类型"
  253. :clearable="true"
  254. />
  255. <span v-else>{{ form.type }}</span>
  256. </el-form-item>
  257. </el-col>
  258. <el-col :span="8">
  259. <el-form-item label="法定代表人:">
  260. <el-input
  261. v-if="editStatus"
  262. v-model.trim="form.legalRepresentative"
  263. size="small"
  264. type="text"
  265. placeholder="法定代表人"
  266. :clearable="true"
  267. />
  268. <span v-else>{{ form.legalRepresentative }}</span>
  269. </el-form-item>
  270. </el-col>
  271. <el-col :span="8">
  272. <el-form-item label="成立日期:">
  273. <el-date-picker
  274. v-if="editStatus"
  275. v-model.trim="form.foundationDate"
  276. size="small"
  277. :clearable="true"
  278. style="width: 100%"
  279. format="YYYY-MM-DD"
  280. value-format="YYYY-MM-DD"
  281. align="center"
  282. type="date"
  283. placeholder="成立日期"
  284. />
  285. <span v-else>{{ form.foundationDate }}</span>
  286. </el-form-item>
  287. </el-col>
  288. <el-col :span="8">
  289. <el-form-item label="出执照日期:">
  290. <el-date-picker
  291. v-if="editStatus"
  292. v-model.trim="form.licenceDate"
  293. size="small"
  294. :clearable="true"
  295. style="width: 100%"
  296. format="YYYY-MM-DD"
  297. value-format="YYYY-MM-DD"
  298. align="center"
  299. type="date"
  300. placeholder="出执照日期"
  301. />
  302. <span v-else>{{ form.licenceDate }}</span>
  303. </el-form-item>
  304. </el-col>
  305. <el-col :span="8">
  306. <el-form-item
  307. label="营业开始日期:"
  308. prop="createTime"
  309. class="date-layout"
  310. >
  311. <template v-if="editStatus">
  312. <el-date-picker
  313. v-model="form.businessStartDate"
  314. size="small"
  315. :clearable="true"
  316. style="width: 100%"
  317. format="YYYY-MM-DD"
  318. value-format="YYYY-MM-DD"
  319. align="center"
  320. type="date"
  321. placeholder="开始日期"
  322. />
  323. </template>
  324. <span v-else>
  325. {{
  326. form.businessStartDate == null
  327. ? ""
  328. : form.businessStartDate
  329. }}</span
  330. >
  331. </el-form-item>
  332. </el-col>
  333. <el-col :span="8">
  334. <el-form-item
  335. label="营业截止日期:"
  336. prop="createTime"
  337. class="date-layout"
  338. >
  339. <template v-if="editStatus">
  340. <el-date-picker
  341. v-model="form.businessEndDate"
  342. size="small"
  343. :clearable="true"
  344. style="width: 100%"
  345. format="YYYY-MM-DD"
  346. value-format="YYYY-MM-DD"
  347. :disabled="PermanentlyEffective"
  348. align="center"
  349. type="date"
  350. placeholder="结束日期"
  351. />
  352. </template>
  353. <span v-else-if="form.isPermanentlyEffective == 0">
  354. {{
  355. form.businessEndDate == null
  356. ? ""
  357. : form.businessEndDate
  358. }}
  359. </span>
  360. <span v-else-if="form.isPermanentlyEffective == 1">
  361. {{ "无固定期限" }}
  362. </span>
  363. </el-form-item>
  364. </el-col>
  365. <el-col :span="8">
  366. <div
  367. style="display: inline; height: 28pxs; margin-left: -70px"
  368. >
  369. <el-form-item>
  370. <template v-if="editStatus">
  371. <span
  372. style="
  373. font-size: 12px;
  374. margin-left: -16px;
  375. margin-right: 8px;
  376. "
  377. >无固定期限</span
  378. >
  379. <el-checkbox v-model="PermanentlyEffective" />
  380. </template>
  381. </el-form-item>
  382. </div>
  383. </el-col>
  384. <el-col :span="8">
  385. <el-form-item label="注册资金:">
  386. <el-input
  387. v-if="editStatus"
  388. v-model.number="form.registerMoney"
  389. number
  390. size="small"
  391. id="inputField"
  392. min="0"
  393. placeholder="注册资金"
  394. :clearable="true"
  395. controls-position="right"
  396. style="width: 100%"
  397. @input="handleInput"
  398. @change="handleCompute"
  399. >
  400. <template #append>万元</template>
  401. </el-input>
  402. <span v-else
  403. >{{ rowNum(form.registerMoney) }}{{ "万元" }}
  404. </span>
  405. </el-form-item>
  406. </el-col>
  407. <el-col :span="16">
  408. <el-form-item
  409. label="注册省市区:"
  410. prop="provinceCode"
  411. >
  412. <template v-if="editStatus">
  413. <el-select
  414. v-model="form.provinceCode"
  415. placeholder="省份"
  416. style="width: 33.33%"
  417. @change="handleSelectProvince"
  418. >
  419. <el-option
  420. v-for="item in provinces"
  421. :key="item.code"
  422. :label="item.name"
  423. :value="item.code"
  424. />
  425. </el-select>
  426. <el-select
  427. v-model="form.cityCode"
  428. placeholder="城市"
  429. style="width: 33.33%"
  430. @change="handleSelectCity"
  431. >
  432. <el-option
  433. v-for="item in cities"
  434. :key="item.code"
  435. :label="item.name"
  436. :value="item.code"
  437. />
  438. </el-select>
  439. <el-select
  440. v-model="form.districtCode"
  441. placeholder="行政区"
  442. style="width: 33.33%"
  443. @change="handleSelectDistrict"
  444. >
  445. <el-option
  446. v-for="item in districts"
  447. :key="item.code"
  448. :label="item.name"
  449. :value="item.code"
  450. />
  451. </el-select>
  452. <!-- <EluiChinaAreaDht v-model="area" @change="handleAreaChange" /> -->
  453. </template>
  454. <span v-else>{{
  455. form.province +
  456. (form.city ? " - " + form.city : "") +
  457. (form.district ? " - " + form.district : "")
  458. }}</span>
  459. </el-form-item>
  460. </el-col>
  461. <el-col :span="16">
  462. <el-form-item label="详细地址:">
  463. <el-input
  464. v-if="editStatus"
  465. v-model.trim="form.address"
  466. size="small"
  467. type="text"
  468. placeholder="详细地址:"
  469. :clearable="true"
  470. />
  471. <div
  472. v-else
  473. style="
  474. display: flex;
  475. align-items: center;
  476. height: 28px;
  477. line-height: normal;
  478. "
  479. >
  480. <span>{{ form.address }}</span>
  481. </div>
  482. </el-form-item>
  483. </el-col>
  484. <el-col :span="24" style="height: auto; min-height: 60px">
  485. <el-form-item label="经营范围:">
  486. <el-input
  487. v-if="editStatus"
  488. v-model.trim="form.businessField"
  489. maxlength="200"
  490. type="textarea"
  491. :rows="5"
  492. width="100%"
  493. size="small"
  494. placeholder="经营范围"
  495. show-word-limit
  496. :clearable="true"
  497. />
  498. <span v-else>{{ form.businessField }}</span>
  499. </el-form-item>
  500. </el-col>
  501. </el-row>
  502. <br />
  503. <div id="tax-form" class="details-head">
  504. <div class="title">
  505. <i class="fa fa-th-list" aria-hidden="true" /> 税务信息
  506. </div>
  507. </div>
  508. <el-row :gutter="30" style="margin-top: 10px">
  509. <el-col :span="6">
  510. <el-form-item label="纳税性质:" prop="taxType">
  511. <el-select
  512. v-if="editStatus"
  513. v-model="form.taxType"
  514. placeholder="请选择纳税性质"
  515. size="small"
  516. :clearable="true"
  517. @change="taxTypeChange"
  518. >
  519. <el-option
  520. v-for="item in taxTypes"
  521. :key="item.label"
  522. :label="item.label"
  523. :value="item.value"
  524. />
  525. </el-select>
  526. <span v-else>{{ form.taxType }} </span>
  527. </el-form-item>
  528. </el-col>
  529. <el-col v-if="form.taxType === '个体工商户'" :span="6">
  530. <el-form-item label="征收方式:" required>
  531. <el-select
  532. v-if="editStatus"
  533. v-model="form.collectionMethod"
  534. placeholder="请选择征收方式"
  535. size="small"
  536. :clearable="true"
  537. >
  538. <el-option
  539. v-for="item in collectionMethods"
  540. :key="item.label"
  541. :label="item.label"
  542. :value="item.value"
  543. />
  544. </el-select>
  545. <span v-else>{{ form.collectionMethod }}</span>
  546. </el-form-item>
  547. </el-col>
  548. <el-col v-if="form.collectionMethod === '定期定额'" :span="6">
  549. <el-form-item label="定额金额:" required>
  550. <el-input-number
  551. v-if="editStatus"
  552. v-model="form.quotaAmount"
  553. placeholder="请输入定额金额"
  554. :min="0"
  555. :precision="2"
  556. controls-position="right"
  557. :controls="false"
  558. size="small"
  559. />
  560. <span v-else>{{ form.quotationAmount }}</span>
  561. </el-form-item>
  562. </el-col>
  563. <el-col :span="6">
  564. <el-form-item label="是否零申报:">
  565. <el-select
  566. v-if="editStatus"
  567. v-model="form.isZero"
  568. placeholder="请选择"
  569. style="width: 100%"
  570. >
  571. <el-option
  572. v-for="item in yesOrNo"
  573. :key="item.label"
  574. :label="item.label"
  575. :value="item.value"
  576. />
  577. </el-select>
  578. <span v-else>{{
  579. form.isZero === 1 ? "是" : form.isZero === 0 ? "否" : ""
  580. }}</span>
  581. </el-form-item>
  582. </el-col>
  583. <el-col :span="6">
  584. <el-form-item label="主管税务机关:">
  585. <el-input
  586. v-if="editStatus"
  587. v-model.trim="form.competentTaxAuthority"
  588. size="small"
  589. type="text"
  590. placeholder="主管税务机关"
  591. :clearable="true"
  592. />
  593. <span v-else>{{ form.competentTaxAuthority }}</span>
  594. </el-form-item>
  595. </el-col>
  596. <el-col :span="6">
  597. <el-form-item label="税务专管员">
  598. <el-input
  599. v-if="editStatus"
  600. v-model.trim="form.taxCollectorName"
  601. size="small"
  602. type="text"
  603. placeholder="税务专管员"
  604. :clearable="true"
  605. />
  606. <span v-else>{{ form.taxCollectorName }}</span>
  607. </el-form-item>
  608. </el-col>
  609. <el-col :span="6">
  610. <el-form-item label="专管员电话:">
  611. <el-input
  612. v-if="editStatus"
  613. v-model.trim="form.taxCollectorPhone"
  614. size="small"
  615. type="text"
  616. placeholder="专管员电话"
  617. minlength="1"
  618. maxlength="11"
  619. oninput="value=value.replace(/[^\d]/g, '')"
  620. :clearable="true"
  621. />
  622. <span v-else>{{ form.taxCollectorPhone }}</span>
  623. </el-form-item>
  624. </el-col>
  625. <el-col :span="6">
  626. <el-form-item label="核税月份:">
  627. <el-date-picker
  628. v-if="editStatus"
  629. v-model.trim="form.taxMonth"
  630. size="small"
  631. :clearable="true"
  632. format="YYYY-MM"
  633. value-format="YYYY-MM-DD HH:mm:ss"
  634. align="center"
  635. type="month"
  636. placeholder="核税月份"
  637. />
  638. <span v-else> {{ form.taxMonth }}</span>
  639. </el-form-item>
  640. </el-col>
  641. <el-col :span="6">
  642. <el-form-item label="年收入:" prop="annualIncome">
  643. <el-select
  644. style="width: 100%"
  645. v-if="editStatus"
  646. v-model="form.annualIncome"
  647. placeholder="请选择年收入"
  648. >
  649. <el-option
  650. v-for="item in incomeDefault"
  651. :key="item.value"
  652. :label="item.label"
  653. :value="item.value"
  654. />
  655. </el-select>
  656. <span v-else>{{ form.annualIncome }} </span>
  657. </el-form-item>
  658. </el-col>
  659. </el-row>
  660. <br />
  661. <div id="linkman-form" class="details-head">
  662. <div class="title">
  663. <i class="fa fa-th-list" aria-hidden="true" /> 联系人
  664. </div>
  665. <div v-if="editStatus" class="details-btns-container">
  666. <el-button
  667. type="primary"
  668. size="small"
  669. icon="Plus"
  670. @click="handleAddContactor"
  671. >
  672. 添加联系人</el-button
  673. >
  674. </div>
  675. </div>
  676. <el-row :gutter="10" style="height: 200px">
  677. <el-col :span="24">
  678. <div class="details-body">
  679. <el-table
  680. ref="contactorsable"
  681. :data="form.contactors"
  682. size="small"
  683. border
  684. header-row-class-name="list-header-row"
  685. max-height="200"
  686. >
  687. <el-table-column
  688. type="index"
  689. label="序号"
  690. width="47"
  691. align="center"
  692. />
  693. <el-table-column label="姓名" width="70" align="center">
  694. <template #default="scope">
  695. <div v-if="editStatus">
  696. <el-input
  697. v-model="scope.row.name"
  698. size="small"
  699. placeholder="姓名"
  700. />
  701. <span class="required">*</span>
  702. </div>
  703. <div v-else>
  704. {{ scope.row.name }}
  705. <span class="required">*</span>
  706. </div>
  707. </template>
  708. </el-table-column>
  709. <el-table-column
  710. label="角色"
  711. width="130"
  712. align="center"
  713. >
  714. <template #default="scope">
  715. <div v-if="editStatus">
  716. <el-select
  717. v-model="scope.row.position"
  718. size="small"
  719. placeholder="角色"
  720. >
  721. <el-option
  722. v-for="(item, index) in contact_role"
  723. :key="index"
  724. :label="item.label"
  725. :value="item.label"
  726. />
  727. </el-select>
  728. </div>
  729. <div v-else>
  730. {{ scope.row.position }}
  731. </div>
  732. </template>
  733. </el-table-column>
  734. <el-table-column
  735. label="联系电话"
  736. width="100"
  737. align="center"
  738. >
  739. <template #default="scope">
  740. <div v-if="editStatus">
  741. <el-input
  742. v-model="scope.row.phone"
  743. size="small"
  744. minlength="1"
  745. maxlength="11"
  746. placeholder="联系电话"
  747. oninput="value=value.replace(/[^\d]/g, '')"
  748. />
  749. </div>
  750. <div v-else>{{ scope.row.phone }}</div>
  751. </template>
  752. </el-table-column>
  753. <el-table-column
  754. label="主联系人"
  755. width="100"
  756. align="center"
  757. >
  758. <template #default="scope">
  759. <div v-if="editStatus">
  760. <el-select
  761. v-model="scope.row.isMain"
  762. class="txtC"
  763. size="small"
  764. placeholder="请选择"
  765. >
  766. <el-option
  767. v-for="(item, index) in confirmDefaultRef"
  768. :key="index"
  769. :label="item.label"
  770. :value="item.label"
  771. />
  772. </el-select>
  773. </div>
  774. <div v-else>
  775. {{ scope.row.isMain }}
  776. </div>
  777. </template>
  778. </el-table-column>
  779. <el-table-column
  780. label="备注"
  781. prop="remark"
  782. header-align="center"
  783. >
  784. <template #default="scope">
  785. <div v-if="editStatus">
  786. <el-input
  787. v-model="scope.row.remark"
  788. size="small"
  789. placeholder="备注"
  790. />
  791. </div>
  792. <div v-else>{{ scope.row.remark }}</div>
  793. </template>
  794. </el-table-column>
  795. <el-table-column label="操作" width="50" align="center">
  796. <template #default="scope">
  797. <div>
  798. <el-button
  799. v-if="editStatus"
  800. size="small"
  801. link
  802. type="danger"
  803. @click="handleDelContactor(scope.$index)"
  804. >删除</el-button
  805. >
  806. <span v-else>-</span>
  807. </div>
  808. </template>
  809. </el-table-column>
  810. </el-table>
  811. </div>
  812. </el-col>
  813. </el-row>
  814. <br />
  815. <div v-if="form.id" id="follow-form" class="details-head">
  816. <div class="title">
  817. <i class="fa fa-th-list" aria-hidden="true" /> 跟进动态
  818. </div>
  819. </div>
  820. <el-row v-if="form.id" :gutter="30" style="margin-top: 10px">
  821. <el-col :span="6">
  822. <el-form-item label="跟进方式:" required>
  823. <el-select
  824. v-model.trim="followData.followTypeId"
  825. placeholder="跟进方式"
  826. size="small"
  827. :clearable="true"
  828. >
  829. <el-option
  830. v-for="item in follow_modes"
  831. :key="item.label"
  832. :label="item.label"
  833. :value="item.id"
  834. />
  835. </el-select>
  836. </el-form-item>
  837. </el-col>
  838. <el-col :span="6">
  839. <el-form-item label="跟进类型:" required>
  840. <el-select
  841. v-model.trim="followData.followCategoryId"
  842. placeholder="跟进类型"
  843. size="small"
  844. :clearable="true"
  845. >
  846. <el-option
  847. v-for="item in follow_categories"
  848. :key="item.label"
  849. :label="item.label"
  850. :value="item.id"
  851. />
  852. </el-select>
  853. </el-form-item>
  854. </el-col>
  855. <el-col :span="6">
  856. <el-form-item label="跟进时间:" required>
  857. <el-date-picker
  858. v-model="followData.followDate"
  859. style="width: 100%"
  860. size="small"
  861. format="YYYY-MM-DD HH:mm"
  862. type="datetime"
  863. placeholder="选择日期"
  864. value-format="YYYY-MM-DD HH:mm"
  865. />
  866. </el-form-item>
  867. </el-col>
  868. <el-col :span="6">
  869. <el-form-item label="下次跟进时间">
  870. <el-date-picker
  871. v-model="followData.nextFollowDate"
  872. :disabled-date="nextFollowDateDisable"
  873. style="width: 100%"
  874. size="small"
  875. format="YYYY-MM-DD HH:mm"
  876. type="datetime"
  877. placeholder="选择日期"
  878. value-format="YYYY-MM-DD HH:mm"
  879. />
  880. </el-form-item>
  881. </el-col>
  882. <el-col :span="24" style="height: auto; min-height: 24px">
  883. <el-form-item label="跟进内容:" required>
  884. <el-input
  885. v-model.trim="followData.content"
  886. maxlength="200"
  887. type="textarea"
  888. :rows="2"
  889. width="100%"
  890. size="small"
  891. placeholder="请填写跟进内容"
  892. :clearable="true"
  893. show-word-limit
  894. />
  895. </el-form-item>
  896. </el-col>
  897. <el-col :span="24" style="padding: 15px 15px 16px 15px">
  898. <div class="details-btns-container">
  899. <el-form-item label="上传附件" required>
  900. <el-upload
  901. action="#"
  902. :http-request="upload"
  903. :with-credentials="true"
  904. :show-file-list="false"
  905. multiple
  906. >
  907. <el-button size="small" type="primary" icon="Upload"
  908. >点击上传</el-button
  909. >
  910. </el-upload>
  911. </el-form-item>
  912. </div>
  913. <div class="details-body" style="height: 100px">
  914. <el-table
  915. ref="filesTable"
  916. :data="fileList"
  917. size="small"
  918. height="100%"
  919. border
  920. header-row-class-name="list-header-row"
  921. >
  922. <el-table-column
  923. label="文件名"
  924. prop="fileName"
  925. align="center"
  926. >
  927. <template #default="scope">
  928. <el-link
  929. :href="`${baseUrl}${scope.row.fileUrl}`"
  930. :underline="false"
  931. target="_blank"
  932. type="primary"
  933. >
  934. {{ scope.row.fileName }}
  935. </el-link>
  936. </template>
  937. </el-table-column>
  938. <el-table-column
  939. label="文件类型"
  940. prop="fileType"
  941. width="90"
  942. align="center"
  943. >
  944. <template #default="scope">
  945. <el-link :underline="false" target="_blank">
  946. {{ scope.row.fileType }}
  947. </el-link>
  948. </template>
  949. </el-table-column>
  950. <el-table-column label="操作" width="60" align="center">
  951. <template #default="scope">
  952. <el-button
  953. link
  954. size="small"
  955. type="danger"
  956. @click="handleDelFile(scope.$index)"
  957. >删除</el-button
  958. >
  959. </template>
  960. </el-table-column>
  961. </el-table>
  962. </div>
  963. </el-col>
  964. <el-col
  965. :span="24"
  966. style="
  967. text-align: center;
  968. display: flex;
  969. flex-direction: row;
  970. justify-content: center;
  971. "
  972. >
  973. <el-button
  974. size="small"
  975. type="primary"
  976. style="width: 160px"
  977. @click="followSaveHandler"
  978. >发 布</el-button
  979. >
  980. </el-col>
  981. <br />
  982. <el-col :span="24">
  983. <br />
  984. <div class="details-head">
  985. <div class="title">
  986. <i class="fa fa-th-list" aria-hidden="true" /> 跟进记录
  987. </div>
  988. <div class="details-btns-container" style="display: flex">
  989. <el-switch
  990. v-model="followQuery.asc"
  991. style="display: inline-block height:28px; line-height:28px;"
  992. active-color="#13ce66"
  993. inactive-color="#ff4949"
  994. active-text="正序"
  995. inactive-text="倒序"
  996. size="small"
  997. />
  998. </div>
  999. </div>
  1000. <div class="details-body" style="height: 200px">
  1001. <el-table
  1002. ref="filesTable"
  1003. :data="form.followDetails"
  1004. size="small"
  1005. height="100%"
  1006. border
  1007. header-row-class-name="list-header-row"
  1008. >
  1009. <el-table-column
  1010. type="index"
  1011. label="序号"
  1012. width="47"
  1013. align="center"
  1014. />
  1015. <el-table-column
  1016. label="跟进方式"
  1017. prop="followMode"
  1018. align="center"
  1019. width="120"
  1020. />
  1021. <el-table-column
  1022. label="跟进类型"
  1023. prop="followCategory"
  1024. align="center"
  1025. width="120"
  1026. />
  1027. <el-table-column
  1028. label="跟进时间"
  1029. prop="followDate"
  1030. align="center"
  1031. width="140"
  1032. />
  1033. <el-table-column
  1034. label="跟进内容"
  1035. prop="content"
  1036. align="center"
  1037. />
  1038. <el-table-column
  1039. label="下次跟进时间"
  1040. prop="nextFollowDate"
  1041. align="center"
  1042. width="140"
  1043. />
  1044. <el-table-column label="操作" align="center">
  1045. <template #default="scope">
  1046. <el-button
  1047. link
  1048. size="small"
  1049. type="primary"
  1050. @click="handleImageView(scope.row)"
  1051. >查看</el-button
  1052. >
  1053. <el-button
  1054. link
  1055. size="small"
  1056. type="danger"
  1057. @click="handleDelFollow(scope.row)"
  1058. >删除</el-button
  1059. >
  1060. </template>
  1061. </el-table-column>
  1062. </el-table>
  1063. </div>
  1064. <br />
  1065. </el-col>
  1066. </el-row>
  1067. </div>
  1068. </div>
  1069. </el-form>
  1070. </div>
  1071. </div>
  1072. </el-drawer>
  1073. <!-- 图片预览 -->
  1074. <el-image-viewer
  1075. v-if="showViewer"
  1076. :url-list="currentFileList"
  1077. @close="closeImages"
  1078. :initial-index="showIndex"
  1079. />
  1080. <fileDialog ref="fileDialogRef" />
  1081. </div>
  1082. </template>
  1083. <script setup>
  1084. import { getToken } from "@/utils/auth";
  1085. import { EluiChinaAreaDht } from "elui-china-area-dht";
  1086. import {
  1087. addFollow,
  1088. listFollow,
  1089. delFollow,
  1090. } from "@/api/business/crm/companyFollowDetail";
  1091. import { regionData, codeToText } from "element-china-area-data";
  1092. import CustomerFormCom from "@/components/CustomerFormCom";
  1093. import fileDialog from "@/views/dialog/fileDialog.vue";
  1094. import {
  1095. getCompany,
  1096. addCompany,
  1097. updateCompany,
  1098. } from "@/api/business/crm/company";
  1099. import useUserStore from "@/store/modules/user";
  1100. import { listSource } from "@/api/settings/source";
  1101. import { deepClone } from "@/utils";
  1102. import { rowNum } from "@/utils/index";
  1103. import { uploadFile } from "@/api/tool/file";
  1104. import { ref } from "vue";
  1105. import {
  1106. incomeDefault,
  1107. taxTypes,
  1108. confirmDefault,
  1109. collectionMethods,
  1110. yesOrNo,
  1111. } from "@/utils/default";
  1112. const { proxy } = getCurrentInstance();
  1113. /** 父组件传参 */
  1114. const props = defineProps({
  1115. getList: {
  1116. type: Function,
  1117. default: () => {},
  1118. },
  1119. });
  1120. const registerMoneyUnits = ref([]);
  1121. const mainBusinesses = ref([]);
  1122. const taxDishes = ref([]);
  1123. const { getList } = toRefs(props);
  1124. const options = ref([]);
  1125. /** 字典数组区 */
  1126. const { develop_type } = proxy.useDict("develop_type");
  1127. const { follow_categories } = proxy.useDict("follow_categories");
  1128. const { contact_role } = proxy.useDict("contact_role");
  1129. const { follow_modes } = proxy.useDict("follow_modes");
  1130. const confirmDefaultRef = ref(confirmDefault);
  1131. import { listLableNoPage } from "@/api/business/lable";
  1132. const CustomerFormComRef = ref(null);
  1133. /** 表单抽屉 页变量 */
  1134. const title = ref("");
  1135. const loading = ref(false);
  1136. const multiple = ref(true);
  1137. const visible = ref(false);
  1138. const editStatus = ref(false);
  1139. const isFullscreen = ref(false);
  1140. const addDetailNum = ref(1);
  1141. const currentMember = {};
  1142. const provinces = ref(proxy.region.getProvinces());
  1143. provinces.value.unshift({ code: "", name: "全部" });
  1144. const cities = ref([]);
  1145. const fileDialogRef = ref(null);
  1146. const districts = ref([]);
  1147. const sourceCategories = ref([]);
  1148. const area = ref([]);
  1149. const fileList = ref([]);
  1150. const PermanentlyEffective = ref(false);
  1151. const showViewer = ref(false);
  1152. const currentFileList = ref([]);
  1153. const showIndex = ref(0);
  1154. const types = ref([]);
  1155. const taxDeclarationCategories = ref([]);
  1156. const baseUrl = ref(import.meta.env.VITE_APP_BASE_API);
  1157. const webHost = import.meta.env.VITE_APP_BASE_API;
  1158. const setHeaders = {
  1159. Authorization: getToken(),
  1160. };
  1161. const data = reactive({
  1162. form: {},
  1163. followData: {},
  1164. followQuery: {
  1165. isAsc: "asc",
  1166. },
  1167. rules: {
  1168. name: [{ required: true, message: "客户名称不能为空", trigger: "blur" }],
  1169. // socialCreditCode: [
  1170. // { max: 18, min: 18, message: "税号为18位", trigger: "blur" },
  1171. // ],
  1172. // provinceCode: [{ validator: areaValidator, trigger: "blur" }],
  1173. taxType: [{ require: true, message: "纳税性质不能为空", trigger: "blur" }],
  1174. sourceCategoryName: [
  1175. { validator: sourceValidator, trigger: "change" },
  1176. { required: true, message: "客户来源不能为空", trigger: "change" },
  1177. ],
  1178. },
  1179. });
  1180. const { form, rules, followData, followQuery } = toRefs(data);
  1181. watch(
  1182. followQuery,
  1183. () => {
  1184. if (followQuery.value.asc) {
  1185. followQuery.value.isAsc = "asc";
  1186. } else {
  1187. followQuery.value.isAsc = "desc";
  1188. }
  1189. loadFollow();
  1190. },
  1191. { deep: true }
  1192. );
  1193. const contactorEmptyData = {
  1194. id: null,
  1195. name: "",
  1196. position: "",
  1197. gender: "男",
  1198. phone: "",
  1199. email: "",
  1200. isMain: "是",
  1201. remark: "",
  1202. };
  1203. const companyEmptyData = {
  1204. id: null,
  1205. code: "",
  1206. name: "",
  1207. oldName: "",
  1208. shortName: "",
  1209. ownerId: "",
  1210. ownerName: "",
  1211. sourceCategoryId: "",
  1212. sourceCategoryName: "",
  1213. sourceId: "",
  1214. sourceName: "",
  1215. stageId: "",
  1216. stageName: "",
  1217. phone: "",
  1218. email: "",
  1219. contactAddress: "",
  1220. remark: "",
  1221. socialCreditCode: "",
  1222. mainBusinessId: "",
  1223. mainBusinessName: "",
  1224. typeId: "",
  1225. typeName: "",
  1226. legalRepresentative: "",
  1227. foundationDate: "",
  1228. licenceDate: "",
  1229. businessStartDate: "",
  1230. collectionMethod: "",
  1231. businessEndDate: "",
  1232. isPermanentlyEffective: "",
  1233. registerMoney: "",
  1234. registerMoneyUnitId: "",
  1235. registerMoneyUnitName: "",
  1236. provinceCode: "",
  1237. province: "",
  1238. cityCode: "",
  1239. city: "",
  1240. districtCode: "",
  1241. district: "",
  1242. address: "",
  1243. businessField: "",
  1244. taxTypeId: "",
  1245. taxTypeName: "",
  1246. taxDeclarationCategoryId: "",
  1247. taxDeclarationCategoryName: "",
  1248. isZero: "",
  1249. taxDishId: "",
  1250. taxDishName: "",
  1251. competentTaxAuthority: "",
  1252. annualIncome: "",
  1253. taxType: "",
  1254. taxCollectorName: "",
  1255. taxCollectorPhone: "",
  1256. taxMonth: "",
  1257. openingBank: "",
  1258. bankAccount: "",
  1259. companyTags: [],
  1260. companyTagIds: [],
  1261. contactors: [],
  1262. serviceTeams: [],
  1263. companyFiles: [],
  1264. stores: [],
  1265. creatorId: useUserStore().user.id,
  1266. };
  1267. const queryRadio = ref("base-form");
  1268. const defaultIsZero = ref(0);
  1269. /*********************** 表单页方法 ****************************/
  1270. function sourceValidator(rule, value, callback) {
  1271. if (form.value.sourceCategoryName === "") {
  1272. callback(new Error("来源类型不能为空"));
  1273. return;
  1274. }
  1275. if (
  1276. form.value.referrerDataSource !== "" &&
  1277. form.value.referrerDataSource != null &&
  1278. (form.value.sourceName === "" || form.value.sourceName == null)
  1279. ) {
  1280. callback(new Error("来源不能为空"));
  1281. return;
  1282. }
  1283. return callback();
  1284. }
  1285. /** 抽屉打开 */
  1286. function open(id, position) {
  1287. reset();
  1288. visible.value = true;
  1289. if (id) {
  1290. getCompany(id).then((response) => {
  1291. form.value = response.data;
  1292. defaultIsZero.value = Number(response.data.isZero);
  1293. initRegion();
  1294. editStatus.value = false;
  1295. title.value = "修改客户";
  1296. nextTick((_) => {
  1297. if (position) {
  1298. scrollTargetTo(position);
  1299. } else {
  1300. scrollTargetTo("base-form");
  1301. }
  1302. });
  1303. });
  1304. } else {
  1305. editStatus.value = true;
  1306. title.value = "添加客户";
  1307. }
  1308. getOption()
  1309. console.log("字典", contact_role.value);
  1310. }
  1311. function getOption(){
  1312. listLableNoPage().then(res =>{
  1313. options.value = res.data
  1314. })
  1315. }
  1316. const selectedOptionLabel = computed(() => {
  1317. const selectedOption = options.value.find(option => option.id === form.value.customerLabelId);
  1318. return selectedOption ? selectedOption.lable : '';
  1319. });
  1320. /** 注册资金限制 */
  1321. function handleInput(event) {
  1322. if (event) {
  1323. var str = event;
  1324. var len1 = str.substr(0, 1);
  1325. var len2 = str.substr(1, 1);
  1326. //如果第一位是0,第二位不是点,就用数字把点替换掉
  1327. if (str.length > 1 && len1 == 0 && len2 != ".") {
  1328. str = str.substr(1, 1);
  1329. }
  1330. //第一位不能是.
  1331. if (len1 == ".") {
  1332. str = "";
  1333. }
  1334. //限制只能输入一个小数点
  1335. if (str.indexOf(".") != -1) {
  1336. var str_ = str.substr(str.indexOf(".") + 1);
  1337. if (str_.indexOf(".") != -1) {
  1338. str = str.substr(0, str.indexOf(".") + str_.indexOf(".") + 1);
  1339. }
  1340. }
  1341. //正则替换,保留数字和小数点
  1342. str = str.replace(/[^\d^\.]+/g, "");
  1343. form.value.registerMoney = str;
  1344. }
  1345. }
  1346. /** 注册资金计算保留两位小数 */
  1347. function handleCompute() {
  1348. form.value.registerMoney = Math.round(form.value.registerMoney * 100) / 100;
  1349. }
  1350. function init() {
  1351. listSource()
  1352. .then((res) => {
  1353. sourceCategories.value = res.rows;
  1354. })
  1355. .catch((err) => {
  1356. console.log(err);
  1357. });
  1358. }
  1359. /** 取消按钮 */
  1360. function cancel() {
  1361. visible.value = false;
  1362. reset();
  1363. }
  1364. /** 表单重置 */
  1365. function reset() {
  1366. form.value = deepClone(companyEmptyData);
  1367. if (CustomerFormComRef.value) CustomerFormComRef.value.reset();
  1368. followData.value = {};
  1369. proxy.resetForm("companyRef");
  1370. }
  1371. /** 上传后方法处理 */
  1372. function uploadSuccess(res) {
  1373. if (res.code == 200) {
  1374. const newAttach = {
  1375. name: res.data.name,
  1376. url: res.data.url,
  1377. };
  1378. form.value.attaches.push(newAttach);
  1379. } else {
  1380. proxy.$modal.msgError("上传失败" + res.msg);
  1381. }
  1382. }
  1383. function handleDownLoad(url) {
  1384. window.open(webHost + url);
  1385. }
  1386. // 全屏缩放
  1387. function handleScreen() {
  1388. const dom = document.querySelector(
  1389. ".list-container > .el-drawer__wrapper > .el-overlay"
  1390. );
  1391. isFullscreen.value = !isFullscreen.value;
  1392. dom.style.position = isFullscreen.value ? "fixed" : "absolute";
  1393. }
  1394. function getForm() {
  1395. loading.value = true;
  1396. getCompany(form.value.id).then((response) => {
  1397. reset();
  1398. loading.value = false;
  1399. form.value = response.data;
  1400. PermanentlyEffective.value = form.value.isPermanentlyEffective == 1;
  1401. // CustomerFormCom.value.setForm(form.value);
  1402. console.log("刷新表单", form.value);
  1403. });
  1404. }
  1405. function checkZero() {
  1406. if (defaultIsZero.value === 1) {
  1407. return true;
  1408. } else if (
  1409. defaultIsZero.value != form.value.isZero &&
  1410. form.value.isZero === 1
  1411. ) {
  1412. proxy.$modal.msgError("不可将非零申报客户改为零申报");
  1413. return false;
  1414. } else {
  1415. return true;
  1416. }
  1417. }
  1418. /** 提交保存 */
  1419. function submitForm() {
  1420. console.log("提交表单", form.value);
  1421. form.value.isPermanentlyEffective = PermanentlyEffective.value ? 1 : 0;
  1422. proxy.$refs["companyRef"].validate((valid) => {
  1423. if (valid && validDetails() && checkZero()) {
  1424. if (form.value.id) {
  1425. updateCompany(form.value).then((response) => {
  1426. proxy.$modal.msgSuccess("保存成功!");
  1427. editStatus.value = false;
  1428. form.value = response.data;
  1429. defaultIsZero.value = Number(response.data.isZero);
  1430. getList.value();
  1431. });
  1432. } else {
  1433. addCompany(form.value).then((res) => {
  1434. proxy.$modal.msgSuccess("保存成功!");
  1435. editStatus.value = false;
  1436. form.value = response.data;
  1437. defaultIsZero.value = Number(response.data.isZero);
  1438. getList.value();
  1439. });
  1440. }
  1441. }
  1442. });
  1443. }
  1444. /** 添加从表 */
  1445. function handleAdd() {
  1446. for (var i = 0; i < addDetailNum.value; i++) {
  1447. form.value.members.push({});
  1448. }
  1449. }
  1450. /** 删除从表 */
  1451. function handleDel(index) {
  1452. proxy.$modal
  1453. .confirm("确定删除?")
  1454. .then(() => {
  1455. form.value.members.splice(index, 1);
  1456. })
  1457. .catch(() => {
  1458. proxy.$modal.msg("已取消删除");
  1459. });
  1460. }
  1461. function handleDelAttach(index) {
  1462. proxy.$modal
  1463. .confirm("确定删除?")
  1464. .then(() => {
  1465. form.value.attaches.splice(index, 1);
  1466. })
  1467. .catch(() => {
  1468. proxy.$modal.msg("已取消删除");
  1469. });
  1470. }
  1471. /** 单选添加 */
  1472. function handleDialogOpen(person) {
  1473. multiple.value = false;
  1474. currentMember.value = person;
  1475. proxy.$refs.personRef.open();
  1476. }
  1477. /** 多选添加 */
  1478. function handleAddBatch() {
  1479. multiple.value = true;
  1480. proxy.$refs.personRef.open();
  1481. }
  1482. function handleSingleSelected(person) {
  1483. if (
  1484. form.value.members.findIndex((item) => item.personId === person.id) === -1
  1485. ) {
  1486. currentMember.value.personId = person.id;
  1487. currentMember.value.name = person.name;
  1488. currentMember.value.code = person.code;
  1489. currentMember.value.gender = person.gender;
  1490. currentMember.value.age = person.age;
  1491. currentMember.value.phone = person.phone;
  1492. } else {
  1493. proxy.$modal.msgError(person.name + "已存在,请勿重复添加!");
  1494. }
  1495. }
  1496. function handleMultipleSelected(selection) {
  1497. for (var i = 0; i < selection.length; ++i) {
  1498. const newPerson = {};
  1499. if (
  1500. form.value.members.findIndex(
  1501. (item) => item.personId === selection[i].id
  1502. ) === -1
  1503. ) {
  1504. newPerson.personId = selection[i].id;
  1505. newPerson.name = selection[i].name;
  1506. newPerson.code = selection[i].code;
  1507. newPerson.gender = selection[i].gender;
  1508. newPerson.age = selection[i].age;
  1509. newPerson.phone = selection[i].phone;
  1510. form.value.members.push(newPerson);
  1511. } else {
  1512. proxy.$modal.msgError(selection[i].name + "已存在,请勿重复添加!");
  1513. }
  1514. }
  1515. }
  1516. function scrollTargetTo(target) {
  1517. const targetElement = document.getElementById(target);
  1518. if (targetElement) {
  1519. targetElement.scrollIntoView();
  1520. }
  1521. }
  1522. async function followSaveHandler() {
  1523. if (
  1524. followData.value.followTypeId === null ||
  1525. followData.value.followTypeId === "0"
  1526. ) {
  1527. proxy.$modal.msgWarning("请选择跟进方式");
  1528. return;
  1529. }
  1530. if (
  1531. followData.value.followCategoryId === null ||
  1532. followData.value.followCategoryId === "0"
  1533. ) {
  1534. proxy.$modal.msgWarning("请选择跟进类型");
  1535. return;
  1536. }
  1537. if (followData.value.content == null || followData.value.content === "") {
  1538. proxy.$modal.msgWarning("请输入跟进内容");
  1539. return;
  1540. }
  1541. followData.value.companyId = form.value.id;
  1542. followData.value.files = fileList.value;
  1543. const res = await addFollow(followData.value);
  1544. if (res.code === 200) {
  1545. editStatus.value = false;
  1546. getForm(form.value.id);
  1547. getList.value();
  1548. followData.value = {};
  1549. fileList.value = [];
  1550. proxy.$modal.msgSuccess("发布成功");
  1551. } else {
  1552. proxy.$modal.msgError(res.message);
  1553. }
  1554. }
  1555. function handleAddContactor() {
  1556. const contactor = JSON.parse(JSON.stringify(contactorEmptyData));
  1557. form.value.contactors.push(contactor);
  1558. return;
  1559. }
  1560. // function areaValidator(rule, value, callback) {
  1561. // console.log("省份验证");
  1562. // if (form.value.provinceCode === "") {
  1563. // callback(new Error("省份不能为空"));
  1564. // return;
  1565. // }
  1566. // if (form.value.cityCode === "") {
  1567. // callback(new Error("城市不能为空"));
  1568. // return;
  1569. // }
  1570. // if (form.value.districtCode === "") {
  1571. // callback(new Error("行政区不能为空"));
  1572. // return;
  1573. // }
  1574. // return callback();
  1575. // }
  1576. function handleSelectProvince() {
  1577. const _provinceCode = form.value.provinceCode;
  1578. const _province = provinces.value.find(function (item) {
  1579. return item.code === _provinceCode;
  1580. });
  1581. form.value.province = _province.name;
  1582. cities.value = proxy.region.getCities(_provinceCode);
  1583. if (cities.value.length === 0) {
  1584. // 清空城市数据
  1585. form.value.cityCode = "";
  1586. form.value.city = "";
  1587. cities.value = [{ code: "", name: "全部" }];
  1588. // 清空行政区数据
  1589. form.value.districtCode = "";
  1590. form.value.district = "";
  1591. districts.value = [];
  1592. } else {
  1593. cities.value.unshift({ code: "", name: "全部" });
  1594. form.value.cityCode = cities.value[0].code;
  1595. form.value.city = cities.value[0].name;
  1596. handleSelectCity();
  1597. }
  1598. }
  1599. function handleSelectCity() {
  1600. console.log("市");
  1601. const _cityCode = form.value.cityCode;
  1602. const _city = cities.value.find(function (item) {
  1603. return item.code === _cityCode;
  1604. });
  1605. form.value.city = _city.name;
  1606. districts.value = proxy.region.getDistricts(_cityCode);
  1607. if (districts.value.length === 0) {
  1608. // 清空行政区数据
  1609. form.value.districtCode = "";
  1610. form.value.district = "";
  1611. districts.value = [{ code: "", name: "全部" }];
  1612. } else {
  1613. districts.value.unshift({ code: "", name: "全部" });
  1614. form.value.districtCode = districts.value[0].code;
  1615. form.value.district = districts.value[0].name;
  1616. }
  1617. }
  1618. function handleSelectDistrict() {
  1619. console.log("区");
  1620. const _districtCode = form.value.districtCode;
  1621. const _district = districts.value.find(function (item) {
  1622. return item.code === _districtCode;
  1623. });
  1624. form.value.district = _district.name;
  1625. }
  1626. function validDetails() {
  1627. const contactors = form.value.contactors;
  1628. if (contactors.length === 0) {
  1629. return true;
  1630. }
  1631. form.value.contactors.forEach(function (val, index) {
  1632. if (val.name === "") {
  1633. proxy.$modal.msgError(`第 ${index + 1} 行联系人的姓名不能为空`);
  1634. _isNull = true;
  1635. return false;
  1636. } else if (val.position === "") {
  1637. proxy.$modal.msgError(`第 ${index + 1} 行联系人的角色不能为空`);
  1638. _isNull = true;
  1639. return false;
  1640. }
  1641. });
  1642. return true;
  1643. }
  1644. function handleDelContactor(index) {
  1645. proxy.$modal.confirm("是否确认删除选中的数据项?").then(() => {
  1646. form.value.contactors.splice(index, 1);
  1647. });
  1648. }
  1649. function handleAreaChange(arg) {
  1650. if (arg != null && arg.length === 3) {
  1651. form.value.provinceCode = arg[0];
  1652. form.value.cityCode = arg[1];
  1653. form.value.districtCode = arg[2];
  1654. form.value.province = codeToText[arg[0]];
  1655. form.value.city = codeToText[arg[1]];
  1656. form.value.district = codeToText[arg[2]];
  1657. }
  1658. }
  1659. function upload(param) {
  1660. const formData = new FormData();
  1661. formData.append("file", param.file);
  1662. uploadFile(formData).then((res) => {
  1663. if (res.code === 200) {
  1664. const file = {};
  1665. file.fileName = res.originalFilename;
  1666. file.fileType =
  1667. res.newFileName.split(".")[res.newFileName.split(".").length - 1];
  1668. file.url = res.url;
  1669. file.originalFileName = res.originalFilename;
  1670. file.fileUrl = res.fileName;
  1671. fileList.value.push(file);
  1672. }
  1673. });
  1674. }
  1675. function uploadFollowRemove(index) {
  1676. fileList.value.splice(index, 1);
  1677. }
  1678. function openFollowFile(arg) {
  1679. const attach = arg;
  1680. window.open(`${arg.url}`, arg.fileName);
  1681. }
  1682. function nextFollowDateDisable(date) {
  1683. const follow = proxy.moment(followData.value.followDate);
  1684. if (proxy.moment(date).isBefore(follow)) {
  1685. return true;
  1686. } else return false;
  1687. }
  1688. function loadFollow() {
  1689. followQuery.value.companyId = form.value.id;
  1690. listFollow(followQuery.value).then((res) => {
  1691. form.value.followDetails = res.rows;
  1692. });
  1693. }
  1694. function handleDelFollow(row) {
  1695. const _ids = row.id;
  1696. proxy.$modal
  1697. .confirm("是否确认删除选中的数据项?")
  1698. .then(function () {
  1699. return delFollow(_ids);
  1700. })
  1701. .then(() => {
  1702. loadFollow();
  1703. proxy.$modal.msgSuccess("删除成功!");
  1704. })
  1705. .catch(() => {});
  1706. }
  1707. /** 查看按钮事件 */
  1708. function handleImageView(row) {
  1709. // let imgUrl = [];
  1710. // let txtUrl = [];
  1711. // row.files.forEach((l) => {
  1712. // var res = l.fileUrl.split(".")[l.fileUrl.split(".").length - 1];
  1713. // if (
  1714. // res === "jpg" ||
  1715. // res === "png" ||
  1716. // res === "psd" ||
  1717. // res === "pdf" ||
  1718. // res === "gif" ||
  1719. // res === "bmp"
  1720. // ) {
  1721. // imgUrl.push(`${baseUrl.value}${l.fileUrl}`);
  1722. // } else {
  1723. // txtUrl.push(`${baseUrl.value}${l.fileUrl}`);
  1724. // }
  1725. // });
  1726. // if (imgUrl.length > 0) {
  1727. // currentFileList.value = imgUrl;
  1728. // showViewer.value = true;
  1729. // }
  1730. // if (txtUrl.length > 0) {
  1731. // txtUrl.forEach((l) => {
  1732. // downloadFile(l);
  1733. // });
  1734. // }
  1735. fileDialogRef.value.open({
  1736. masterTableName: "biz_company_follow_detail",
  1737. masterId: row.id,
  1738. });
  1739. }
  1740. /** 下载事件 */
  1741. function downloadFile(url) {
  1742. const iframe = document.createElement("iframe");
  1743. iframe.style.display = "none"; // 防止影响页面
  1744. iframe.style.height = 0; // 防止影响页面
  1745. iframe.src = url;
  1746. document.body.appendChild(iframe); // 这一行必须,iframe挂在到dom树上才会发请求
  1747. // 5分钟之后删除
  1748. setTimeout(() => {
  1749. iframe.remove();
  1750. }, 5 * 60 * 1000);
  1751. }
  1752. function closeImages() {
  1753. showViewer.value = false;
  1754. }
  1755. function taxTypeChange(item) {
  1756. if (item !== "个体工商户") {
  1757. form.value.collectionMethod = "";
  1758. }
  1759. }
  1760. function initRegion() {
  1761. console.log("省市区", form.value);
  1762. cities.value = proxy.region.getCities(form.value.provinceCode);
  1763. cities.value.unshift({ code: "", name: "全部" });
  1764. districts.value = proxy.region.getDistricts(form.value.cityCode);
  1765. districts.value.unshift({ code: "", name: "全部" });
  1766. console.log("省市区", cities.value, districts.value);
  1767. }
  1768. function handleDelFile(index) {
  1769. proxy.$modal
  1770. .confirm("是否确认删除选中的数据项?")
  1771. .then(function () {
  1772. fileList.value.splice(index, 1);
  1773. })
  1774. .then(() => {
  1775. proxy.$modal.msgSuccess("删除成功!");
  1776. })
  1777. .catch(() => {});
  1778. }
  1779. init();
  1780. // 暴露给父组件的方法
  1781. defineExpose({
  1782. open,
  1783. });
  1784. </script>
  1785. <style>
  1786. .radio-scroll .el-radio-button__orig-radio:checked + .el-radio-button__inner {
  1787. color: rgb(64, 158, 255);
  1788. background-color: rgba(0, 0, 0, 0);
  1789. border-color: rgba(0, 0, 0, 0) rgba(0, 0, 0, 0) rgb(64, 158, 255)
  1790. rgba(0, 0, 0, 0);
  1791. border-style: none none solid none;
  1792. border-width: 0 0 3px 0;
  1793. box-shadow: none;
  1794. }
  1795. .radio-scroll .el-radio-button__inner {
  1796. border: none;
  1797. background-color: rgba(0, 0, 0, 0);
  1798. border-color: rgba(0, 0, 0, 0);
  1799. border-style: none none solid none;
  1800. border-width: 0 0 3px 0;
  1801. box-shadow: none;
  1802. }
  1803. .radio-scroll .el-radio-button:first-child .el-radio-button__inner {
  1804. border-left: none;
  1805. border-radius: 0 0 0 0;
  1806. }
  1807. .radio-scroll .el-radio-button:last-child .el-radio-button__inner {
  1808. border-radius: 0 0 0 0;
  1809. }
  1810. /* .company-list .detail-head {
  1811. margin-bottom: 10px;
  1812. } */
  1813. </style>
  1814. <script>
  1815. var inputField = document.getElementById("inputField");
  1816. if (inputField) {
  1817. console.log("事件监听");
  1818. inputField.addEventListener("input", function () {});
  1819. }
  1820. </script>