partyaForm.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613
  1. <template>
  2. <div>
  3. <h3>甲方客户信息 <span
  4. style="color: #f00;font-size: 16px;font-weight: 400;
  5. padding-left: 20px;"
  6. >甲方客户名称要求与工商注册的公司名称一致</span></h3>
  7. <el-divider />
  8. <el-form :disabled="isDetail">
  9. <div class="diy-table-1">
  10. <el-row :gutter="0">
  11. <el-col :xs="24" :sm="8" :lg="8" class="item">
  12. <div class="label">*甲方客户名称</div>
  13. <div class="value">
  14. <el-input v-model="formData.name" placeholder="请输入甲方客户名称" size="mini" clearable />
  15. </div>
  16. </el-col>
  17. <el-col :xs="24" :sm="8" :lg="8" class="item">
  18. <div class="label">*上级客户</div>
  19. <div class="value">
  20. <el-input v-model="formData.parentName" disabled placeholder="请输入上级客户" size="mini" clearable />
  21. </div>
  22. </el-col>
  23. <el-col :xs="24" :sm="8" :lg="8" class="item">
  24. <div class="label">*客户规模</div>
  25. <div class="value">
  26. <el-select
  27. v-model="formData.scale"
  28. placeholder="请选择客户规模"
  29. clearable
  30. filterable
  31. class="my-width"
  32. >
  33. <el-option v-for="item in scaleTypeList" :key="item.value" :label="item.label" :value="item.label" />
  34. </el-select>
  35. </div>
  36. </el-col>
  37. <el-col :xs="24" :sm="8" :lg="8" class="item">
  38. <div class="label">*客户类型</div>
  39. <div class="value">
  40. <el-select
  41. v-model="formData.type"
  42. placeholder="请选择客户类型"
  43. clearable
  44. filterable
  45. class="my-width"
  46. >
  47. <el-option v-for="item in typeList" :key="item.value" :label="item.label" :value="item.label" />
  48. </el-select>
  49. </div>
  50. </el-col>
  51. <el-col :xs="24" :sm="8" :lg="8" class="item">
  52. <div class="label">*行业大类</div>
  53. <div class="value">
  54. <el-select
  55. v-model="formData.tradeParentId"
  56. placeholder="请选择行业大类"
  57. clearable
  58. filterable
  59. class="my-width"
  60. @change="handleTradeParent"
  61. >
  62. <el-option v-for="item in tradeParentList" :key="item.id" :label="item.name" :value="item.id" />
  63. </el-select>
  64. </div>
  65. </el-col>
  66. <el-col :xs="24" :sm="8" :lg="8" class="item">
  67. <div class="label">*行业小类</div>
  68. <div class="value">
  69. <el-select v-model="formData.tradeId" placeholder="请选择行业小类" clearable filterable class="my-width" @change="handleTrade">
  70. <el-option v-for="item in tradeList" :key="item.id" :label="item.name" :value="item.id" />
  71. </el-select>
  72. </div>
  73. </el-col>
  74. <el-col :xs="24" :sm="8" :lg="8" class="item">
  75. <div class="label">*客户地址</div>
  76. <div class="value">
  77. <el-select
  78. v-model="formData.provinceRegionId"
  79. placeholder="请选择省"
  80. class="my-width"
  81. @change="changeProvince"
  82. >
  83. <el-option v-for="item in provinceList" :key="item.id" :label="item.name" :value="item.id" />
  84. </el-select>
  85. <el-select v-model="formData.cityRegionId" placeholder="请选择市" class="my-width" @change="changeCity">
  86. <el-option v-for="item in cityList" :key="item.id" :label="item.name" :value="item.id" />
  87. </el-select>
  88. <el-select v-model="formData.areaId" placeholder="请选择区" class="my-width">
  89. <el-option v-for="item in areaList" :key="item.id" :label="item.name" :value="item.id" />
  90. </el-select>
  91. <!-- <el-select v-model="formData.streetId" placeholder="请选择街道" class="my-width" @change="changeStreet">
  92. <el-option v-for="item in streetList" :key="item.id" :label="item.name" :value="item.id" />
  93. </el-select> -->
  94. </div>
  95. </el-col>
  96. <el-col :xs="24" :sm="16" :lg="16" class="item">
  97. <div class="label">*详细地址</div>
  98. <div class="value">
  99. <el-input v-model="formData.address" placeholder="请输入详细地址" size="mini" clearable />
  100. </div>
  101. </el-col>
  102. <el-col :xs="24" :sm="8" :lg="8" class="item">
  103. <div class="label">*客户关系</div>
  104. <div class="value">
  105. <el-select v-model="formData.rela" placeholder="请选择客户关系" clearable filterable class="my-width">
  106. <el-option v-for="item in relaTypeList" :key="item.value" :label="item.label" :value="item.label" />
  107. </el-select>
  108. </div>
  109. </el-col>
  110. <el-col :xs="24" :sm="8" :lg="8" class="item">
  111. <div class="label">*客户来源</div>
  112. <div class="value">
  113. <el-select v-model="formData.resource" placeholder="请选择客户来源" clearable filterable class="my-width">
  114. <el-option v-for="item in resourceTypeList" :key="item.value" :label="item.label" :value="item.label" />
  115. </el-select>
  116. </div>
  117. </el-col>
  118. <el-col :xs="24" :sm="8" :lg="8" class="item">
  119. <div class="label" />
  120. <div class="value" />
  121. </el-col>
  122. </el-row>
  123. </div>
  124. <h3>联系人信息</h3>
  125. <el-divider />
  126. <div class="diy-table-1">
  127. <el-row :gutter="0">
  128. <el-col :xs="24" :sm="8" :lg="8" class="item">
  129. <div class="label">*联系人名称</div>
  130. <div class="value">
  131. <el-input v-model="formData.linkName" placeholder="请输入联系人名称" size="mini" clearable />
  132. </div>
  133. </el-col>
  134. <el-col :xs="24" :sm="8" :lg="8" class="item">
  135. <div class="label">联系人职务</div>
  136. <div class="value">
  137. <el-input v-model="formData.linkJob" placeholder="请输入联系人职务" size="mini" clearable />
  138. </div>
  139. </el-col>
  140. <el-col :xs="24" :sm="8" :lg="8" class="item">
  141. <div class="label">联系人部门</div>
  142. <div class="value">
  143. <el-input v-model="formData.linkDepartment" placeholder="请输入联系人部门" size="mini" clearable />
  144. </div>
  145. </el-col>
  146. <el-col :xs="24" :sm="8" :lg="8" class="item">
  147. <div class="label">微信</div>
  148. <div class="value"><el-input v-model="formData.weXin" placeholder="请输入微信" size="mini" clearable /></div>
  149. </el-col>
  150. <el-col :xs="24" :sm="8" :lg="8" class="item">
  151. <div class="label">联系人角色</div>
  152. <div class="value">
  153. <el-input v-model="formData.linkRole" placeholder="请输入联系人角色" size="mini" clearable />
  154. </div>
  155. </el-col>
  156. <el-col :xs="24" :sm="8" :lg="8" class="item">
  157. <div class="label">邮箱</div>
  158. <div class="value">
  159. <el-input v-model="formData.email" type="email" placeholder="请输入邮箱" size="mini" clearable />
  160. </div>
  161. </el-col>
  162. <el-col :xs="24" :sm="8" :lg="8" class="item">
  163. <div class="label">QQ</div>
  164. <div class="value"><el-input v-model="formData.qq" placeholder="请输入QQ" size="mini" clearable /></div>
  165. </el-col>
  166. <el-col :xs="24" :sm="8" :lg="8" class="item">
  167. <div class="label" />
  168. <div class="value" />
  169. </el-col>
  170. <el-col :xs="24" :sm="8" :lg="8" class="item">
  171. <div class="label" />
  172. <div class="value" />
  173. </el-col>
  174. </el-row>
  175. </div>
  176. </el-form>
  177. <div v-if="!isDetail" style="margin: 20px 0">
  178. <el-button type="primary" size="small" @click="onSbumit">保存</el-button>
  179. <el-button size="small" @click="onReset">重置</el-button>
  180. </div>
  181. </div>
  182. </template>
  183. <script>
  184. import { findElem } from '@/utils/util'
  185. import { getRegion } from '@/api/sales'
  186. import { getTradeConfigList } from '@/api/basic_data/sectorAllocation'
  187. import {
  188. editFirstPartyCustomerManagement,
  189. addFirstPartyCustomerManagement,
  190. getFirstPartyCustomerManagementDetail
  191. } from '@/api/basic_data/partya'
  192. export default {
  193. props: {
  194. detailId: {
  195. type: String,
  196. default: ''
  197. },
  198. isDetail: {
  199. type: Boolean,
  200. default: false
  201. }
  202. },
  203. data() {
  204. return {
  205. formData: {
  206. address: '',
  207. areaId: '',
  208. cityRegionId: '',
  209. email: '',
  210. linkDepartment: '',
  211. linkJob: '',
  212. linkName: '',
  213. linkRole: '',
  214. name: '',
  215. parentName: '韶关弘格贸易有限公司',
  216. provinceRegionId: '',
  217. qq: '',
  218. rela: '',
  219. resource: '',
  220. scale: '',
  221. tradeId: '',
  222. tradeParentId: '',
  223. type: '',
  224. weXin: ''
  225. },
  226. provinceList: [],
  227. cityList: [],
  228. areaList: [],
  229. streetList: [],
  230. typeList: [
  231. {
  232. label: '客户',
  233. value: 1
  234. },
  235. {
  236. label: '供应商',
  237. value: 2
  238. },
  239. {
  240. label: '竞争对手',
  241. value: 3
  242. },
  243. {
  244. label: '投资者',
  245. value: 4
  246. },
  247. {
  248. label: '关系伙伴',
  249. value: 5
  250. },
  251. {
  252. label: '新闻界',
  253. value: 6
  254. },
  255. {
  256. label: '设计院',
  257. value: 7
  258. }, {
  259. label: '工程商',
  260. value: 8
  261. }, {
  262. label: '直签工程商',
  263. value: 9
  264. }
  265. ],
  266. scaleTypeList: [
  267. {
  268. label: '普通客户',
  269. value: 0
  270. },
  271. {
  272. label: '战略客户',
  273. value: 1
  274. }, {
  275. label: '中央、国企',
  276. value: 2
  277. }, {
  278. label: '省部级科研院所',
  279. value: 3
  280. }, {
  281. label: '地市级以上会展及文体场馆',
  282. value: 4
  283. }, {
  284. label: '地市级以上政府机构',
  285. value: 5
  286. }, {
  287. label: '博物馆',
  288. value: 6
  289. }, {
  290. label: '三甲医院',
  291. value: 7
  292. }, {
  293. label: '985/211/双一流大学及附属学校',
  294. value: 8
  295. }
  296. ],
  297. relaTypeList: [
  298. {
  299. label: '战略联盟',
  300. value: 1
  301. }, {
  302. label: '合作伙伴',
  303. value: 2
  304. }, {
  305. label: '供应关系',
  306. value: 3
  307. }, {
  308. label: '买卖关系',
  309. value: 4
  310. }
  311. ],
  312. resourceTypeList: [
  313. {
  314. label: '客户推荐',
  315. value: 1
  316. },
  317. {
  318. label: '供应商推荐',
  319. value: 2
  320. },
  321. {
  322. label: '会展',
  323. value: 3
  324. },
  325. {
  326. label: '外出拜访',
  327. value: 4
  328. },
  329. {
  330. label: '招投标网站',
  331. value: 5
  332. },
  333. {
  334. label: '设计院推广',
  335. value: 6
  336. },
  337. {
  338. label: '其他',
  339. value: 7
  340. }
  341. ],
  342. tradeParentList: [],
  343. tradeList: []
  344. }
  345. },
  346. created() {
  347. if (this.detailId) {
  348. this.getDetail()
  349. }
  350. this.getRegion()
  351. this.getTradeConfigList()
  352. },
  353. methods: {
  354. // 获取省市区街道
  355. getRegion(level = 0, id = 0) {
  356. getRegion({ pid: id }).then(res => {
  357. if (level === 0) {
  358. this.provinceList = res.data
  359. } else if (level === 1) {
  360. this.cityList = res.data
  361. } else if (level === 2) {
  362. this.areaList = res.data
  363. } else if (level === 3) {
  364. this.streetList = res.data
  365. }
  366. })
  367. },
  368. handleArea(value, type) {
  369. this.formData[type] = this[type + 'List'].find(k => k.id === value).name
  370. },
  371. // 切换省
  372. changeProvince(value) {
  373. this.formData.cityRegionId = ''
  374. this.formData.areaId = ''
  375. this.formData.streetId = ''
  376. this.cityList = []
  377. this.areaList = []
  378. this.streetList = []
  379. this.getRegion(1, value)
  380. this.handleArea(value, 'province')
  381. },
  382. // 切换市
  383. changeCity(value) {
  384. this.formData.areaId = ''
  385. this.formData.streetId = ''
  386. this.areaList = []
  387. this.streetList = []
  388. this.getRegion(2, value)
  389. this.handleArea(value, 'city')
  390. },
  391. // 切换区
  392. changeArea(value) {
  393. this.areaValue = value
  394. this.formData.streetId = ''
  395. this.streetList = []
  396. this.getRegion(3, value)
  397. this.handleArea(value, 'area')
  398. },
  399. // 切换街道
  400. changeStreet(value) {
  401. this.getRegion(3, this.areaValue)
  402. this.handleArea(value, 'street')
  403. },
  404. // 初始化省市区街道
  405. initRegion(level, item, id = 0) {
  406. const { province, city, area, street } = item
  407. let nextId = null
  408. getRegion({ pid: id }).then(res => {
  409. if (level === 0) {
  410. this.provinceList = res.data
  411. nextId = this.formData.provinceRegionId = this.provinceList[findElem(this.provinceList, 'name', province)].id
  412. } else if (level === 1) {
  413. this.cityList = res.data
  414. nextId = this.formData.cityRegionId = this.cityList[findElem(this.cityList, 'name', city)].id
  415. } else if (level === 2) {
  416. this.areaList = res.data
  417. nextId = this.formData.areaId = this.areaList[findElem(this.areaList, 'name', area)].id
  418. } else if (level === 3) {
  419. this.streetList = res.data
  420. nextId = this.formData.streetId = this.streetList[findElem(this.streetList, 'name', street)].id
  421. }
  422. if (level < 3) {
  423. level = level + 1
  424. this.initRegion(level, item, nextId)
  425. }
  426. })
  427. },
  428. handleTradeParent(e) {
  429. if (e) {
  430. const item = this.tradeParentList.find(k => k.id === e)
  431. this.formData.tradeParentName = item.name
  432. this.tradeList = item.childList
  433. return
  434. }
  435. this.formData.tradeId = ''
  436. },
  437. handleTrade(e) {
  438. if (e) {
  439. const item = this.tradeList.find(k => k.id === e)
  440. this.formData.tradeName = item.name
  441. } else {
  442. this.formData.tradeId = ''
  443. this.formData.tradeName = ''
  444. }
  445. },
  446. getTradeConfigList(parentId = '') {
  447. getTradeConfigList({
  448. pageNum: 1,
  449. pageSize: -1,
  450. parentId: parentId
  451. }).then(res => {
  452. if (parentId) {
  453. this.tradeList = res.data.records
  454. return
  455. }
  456. this.tradeParentList = res.data
  457. if (this.detailId) {
  458. const item = this.tradeParentList.find(k => k.id === this.formData.tradeParentId)
  459. console.log(item, 999)
  460. if (item.childList && item.childList.length) {
  461. this.tradeList = item.childList
  462. }
  463. }
  464. })
  465. },
  466. getDetail() {
  467. getFirstPartyCustomerManagementDetail({ id: this.detailId }).then(res => {
  468. this.formData = {
  469. ...res.data
  470. }
  471. this.getRegion(1, this.formData.provinceRegionId)
  472. this.getRegion(2, this.formData.cityRegionId)
  473. })
  474. },
  475. onReset() {
  476. this.formData = {
  477. address: '',
  478. areaId: '',
  479. cityRegionId: '',
  480. email: '',
  481. linkDepartment: '',
  482. linkJob: '',
  483. linkName: '',
  484. linkRole: '',
  485. name: '',
  486. parentName: '',
  487. provinceRegionId: '',
  488. qq: '',
  489. rela: '',
  490. resource: '',
  491. scale: '',
  492. tradeId: '',
  493. tradeParentId: '',
  494. type: '',
  495. weXin: ''
  496. }
  497. },
  498. onSbumit() {
  499. const {
  500. address,
  501. areaId,
  502. cityRegionId,
  503. linkName,
  504. name,
  505. parentName,
  506. provinceRegionId,
  507. rela,
  508. resource,
  509. scale,
  510. tradeId,
  511. tradeParentId,
  512. type
  513. } = this.formData
  514. if (!name) {
  515. this.$errorMsg('甲方客户名称不能为空')
  516. return
  517. }
  518. if (!parentName) {
  519. this.$errorMsg('上级客户称不能为空')
  520. return
  521. }
  522. if (!scale) {
  523. this.$errorMsg('客户规模不能为空')
  524. return
  525. }
  526. if (!type) {
  527. this.$errorMsg('客户类型不能为空')
  528. return
  529. }
  530. if (!tradeParentId) {
  531. this.$errorMsg('行业大类不能为空')
  532. return
  533. }
  534. if (!tradeId) {
  535. this.$errorMsg('行业小类不能为空')
  536. return
  537. }
  538. if (!cityRegionId || !areaId || !provinceRegionId) {
  539. this.$errorMsg('客户地址不能为空')
  540. return
  541. }
  542. if (!address) {
  543. this.$errorMsg('详细地址称不能为空')
  544. return
  545. }
  546. if (!rela) {
  547. this.$errorMsg('客户关系不能为空')
  548. return
  549. }
  550. if (!resource) {
  551. this.$errorMsg('客户来源不能为空')
  552. return
  553. }
  554. if (!linkName) {
  555. this.$errorMsg('联系人名称不能为空')
  556. return
  557. }
  558. const params = {
  559. ...this.formData,
  560. provinceRegionId: '' + this.formData.provinceRegionId,
  561. areaId: '' + this.formData.areaId,
  562. cityRegionId: '' + this.formData.cityRegionId
  563. }
  564. if (this.detailId) {
  565. editFirstPartyCustomerManagement(params).then(res => {
  566. this.$successMsg('编辑成功')
  567. this.$emit('updateList')
  568. })
  569. } else {
  570. addFirstPartyCustomerManagement(params).then(res => {
  571. this.$successMsg('新增成功')
  572. this.$emit('updateList')
  573. })
  574. }
  575. }
  576. }
  577. }
  578. </script>
  579. <style lang="scss" scoped>
  580. .diy-table-1 .item .label {
  581. width: 150px;
  582. }
  583. ::v-deep .el-radio {
  584. margin-right: 120px;
  585. }
  586. .flex-box {
  587. display: flex;
  588. align-items: center;
  589. margin: 5px 20px;
  590. &-title {
  591. width: 100px;
  592. }
  593. }
  594. ::v-deep .my-input > input {
  595. padding-left: 10px !important;
  596. border: 1px solid #dcdfe6 !important;
  597. }
  598. .mg-b {
  599. margin: 10px 0;
  600. }
  601. .my-width {
  602. width: 100%;
  603. }
  604. </style>