partyaForm.vue 18 KB

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