FollowUp.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339
  1. <template>
  2. <div>
  3. <el-dialog append-to-body :title="title" :visible.sync="visible" @close="close">
  4. <el-form ref="form" :model="form" :rules="rules">
  5. <el-row :gutter="20">
  6. <el-col :span="12">
  7. <el-form-item label="序号" prop="code">
  8. <el-input v-model="form.code" disabled :placeholder="form.code ? form.code : '自动生成无需填写'" />
  9. </el-form-item>
  10. </el-col>
  11. <el-col :span="12">
  12. <el-form-item label="日期时间" prop="consultTime">
  13. <el-date-picker
  14. v-model="form.consultTime"
  15. disabled
  16. format="yyyy-MM-dd HH:mm"
  17. placeholder="请选择发布日期"
  18. style="width: 100%"
  19. type="datetime"
  20. value-format="yyyy-MM-dd HH:mm" />
  21. </el-form-item>
  22. </el-col>
  23. <el-col :span="12">
  24. <el-form-item label="所在地区" required>
  25. <el-row :gutter="4" style="width: 100%; padding-top: 32px">
  26. <el-col :span="8">
  27. <el-select
  28. v-model="form.province"
  29. :disabled="areaEditDisable"
  30. placeholder="省"
  31. value-key="id"
  32. @change="provinceChange">
  33. <el-option v-for="item in provinceOptions" :key="item.id" :label="item.distName" :value="item" />
  34. </el-select>
  35. </el-col>
  36. <el-col :span="8">
  37. <el-select
  38. v-model="form.city"
  39. :disabled="areaEditDisable"
  40. placeholder="市"
  41. value-key="id"
  42. @change="cityChange">
  43. <el-option
  44. v-for="item in currentProvince ? currentProvince.children : []"
  45. :key="item.id"
  46. :label="item.distName"
  47. :value="item" />
  48. </el-select>
  49. </el-col>
  50. </el-row>
  51. </el-form-item>
  52. </el-col>
  53. <el-col :span="12">
  54. <el-form-item label="单位名称" prop="unit">
  55. <el-input v-model="form.unit" disabled placeholder="请输入单位名称" />
  56. </el-form-item>
  57. </el-col>
  58. </el-row>
  59. <el-row :gutter="20">
  60. <el-col :span="12">
  61. <el-form-item label="联系人" prop="name">
  62. <el-input v-model="form.name" disabled placeholder="请输入联系人" />
  63. </el-form-item>
  64. </el-col>
  65. <el-col :span="12">
  66. <el-form-item label="联系方式" prop="contact">
  67. <el-input v-model="form.contact" disabled placeholder="请输入联系方式" />
  68. </el-form-item>
  69. </el-col>
  70. <el-col :span="12">
  71. <el-form-item label="咨询产品" prop="product">
  72. <el-input v-model="form.product" disabled placeholder="请输入咨询产品" />
  73. </el-form-item>
  74. </el-col>
  75. <el-col :span="12">
  76. <el-form-item label="对接人" prop="inchargeName">
  77. <el-input v-model="form.inchargeName" disabled suffix-icon="el-icon-search" @focus="handleSelectSale" />
  78. </el-form-item>
  79. </el-col>
  80. </el-row>
  81. <el-form-item label="400电话内容" prop="content">
  82. <el-input
  83. v-model="form.content"
  84. disabled
  85. maxlength="500"
  86. resize="none"
  87. :rows="4"
  88. show-word-limit
  89. type="textarea" />
  90. </el-form-item>
  91. <el-row :gutter="20">
  92. <el-col :span="12">
  93. <el-form-item label="跟进沟通情况" prop="followCommunicateCase">
  94. <el-select
  95. v-model="form.followCommunicateCase"
  96. placeholder="请选择"
  97. style="width: 100%"
  98. @change="changeIsProject">
  99. <el-option label="信息有效,可继续跟进,转C类订单" value="10" />
  100. <el-option label="信息有效,可转为储备用户" value="20" />
  101. <el-option label="信息有效,可转为经销商" value="40" />
  102. <el-option label="信息无效,不再跟进" value="30" />
  103. </el-select>
  104. </el-form-item>
  105. </el-col>
  106. <el-col
  107. v-if="
  108. form.followCommunicateCase == '10' ||
  109. form.followCommunicateCase == '20' ||
  110. form.followCommunicateCase == '40'
  111. "
  112. :span="12">
  113. <el-form-item v-if="form.followCommunicateCase == '40'" label="关联经销商" prop="distributorName">
  114. <el-input
  115. v-model="form.distributorName"
  116. placeholder="请选择经销商"
  117. readonly
  118. suffix-icon="el-icon-search"
  119. @focus="openDistributor" />
  120. </el-form-item>
  121. <el-form-item v-else label="关联项目" prop="nboName">
  122. <el-input
  123. v-model="form.nboName"
  124. placeholder="请选择关联项目"
  125. readonly
  126. suffix-icon="el-icon-search"
  127. @focus="openProject" />
  128. </el-form-item>
  129. </el-col>
  130. </el-row>
  131. <el-form-item label="进展描述" prop="progress">
  132. <el-input v-model="form.progress" maxlength="500" resize="none" :rows="4" show-word-limit type="textarea" />
  133. </el-form-item>
  134. <el-form-item label="下一步计划" prop="nextPlan">
  135. <el-input v-model="form.nextPlan" maxlength="500" resize="none" :rows="4" show-word-limit type="textarea" />
  136. </el-form-item>
  137. </el-form>
  138. <span slot="footer">
  139. <el-button type="primary" @click="consultEdit">保存</el-button>
  140. <el-button @click="visible = false">取消</el-button>
  141. </span>
  142. </el-dialog>
  143. <!-- 选择销售工程师弹窗 -->
  144. <select-user ref="selectSales" :query-params="{ roles: ['SalesEngineer', 'SalesDirector'] }" @save="selectSales" />
  145. <!-- 客户 -->
  146. <select-customer ref="selectCustomer" @save="selectCustomer" />
  147. <!-- 选择项目 -->
  148. <select-business ref="project" :multiple="false" @save="getBusinessInfo" />
  149. <!-- 选择渠道弹窗 -->
  150. <select-distributor ref="selectDistributor" @save="selectDistributor" />
  151. </div>
  152. </template>
  153. <script>
  154. import to from 'await-to-js'
  155. import customerApi from '@/api/customer'
  156. import consultApi from '@/api/consult'
  157. import SelectUser from '@/components/select/SelectUser'
  158. import SelectCustomer from '@/components/select/SelectCustomer'
  159. import SelectBusiness from '@/components/select/SelectBusiness'
  160. import SelectDistributor from '@/components/select/SelectDistributor'
  161. export default {
  162. components: { SelectUser, SelectCustomer, SelectBusiness, SelectDistributor },
  163. data() {
  164. return {
  165. title: '',
  166. visible: false,
  167. areaEditDisable: true,
  168. provinceOptions: [],
  169. currentProvince: [],
  170. form: {
  171. id: 0,
  172. code: '', // 序号
  173. consultTime: null, // 日期时间
  174. provinceId: 0, // 所在省ID
  175. province: '', // 所在省
  176. cityId: 0, // 所在市ID
  177. city: '', // 所在市
  178. unit: '', // 单位名称
  179. name: '', // 联系人
  180. contact: '', // 联系方式
  181. product: '', // 咨询产品
  182. inchargeId: '', // 对接人ID
  183. inchargeName: '', // 对接人(销售工程师)
  184. content: '', // 内容
  185. progress: '', // 进展描述
  186. nextPlan: '', // 下一步计划
  187. custId: 0, // 客户ID
  188. custName: '', // 客户
  189. nboId: 0, // 关联项目
  190. nboName: '', // 项目名称,
  191. distributorId: 0, // 经销商
  192. distributorName: '', // 经销商
  193. followCommunicateCase: '', // 10、信息有效,可继续跟进,转C类订单;20、信息有效,可转为储备用户;30、信息无效,不再跟进。
  194. },
  195. rules: {
  196. followCommunicateCase: [{ required: true, trigger: ['blur', 'change'], message: '请选择跟进沟通情况' }],
  197. nboName: [{ required: true, trigger: ['blur', 'change'], message: '请选择项目' }],
  198. progress: [{ required: true, trigger: ['blur', 'change'], message: '不能为空' }],
  199. nextPlan: [{ required: true, trigger: ['blur', 'change'], message: '不能为空' }],
  200. distributorName: [{ required: true, trigger: ['blur', 'change'], message: '不能为空' }],
  201. },
  202. }
  203. },
  204. mounted() {
  205. Promise.all([customerApi.getProvinceDetail()])
  206. .then(([province]) => {
  207. this.provinceOptions = province.data.list || []
  208. })
  209. .catch((err) => console.log(err))
  210. },
  211. methods: {
  212. async init(id) {
  213. this.visible = true
  214. if (!id) {
  215. this.title = '新建跟进记录'
  216. return
  217. }
  218. this.title = '新建跟进记录' //'更新跟进记录'
  219. const [err, res] = await to(consultApi.get({ id: id }))
  220. if (err) return
  221. this.form = res.data
  222. },
  223. async consultEdit() {
  224. this.$refs.form.validate(async (valid) => {
  225. if (valid) {
  226. let params = { ...this.form }
  227. const [err, res] = await to(consultApi.followUp(params))
  228. if (err) return
  229. this.$message.success(res.msg)
  230. this.visible = false
  231. this.$emit(
  232. 'consultSave',
  233. this.form.followCommunicateCase == '10' || this.form.followCommunicateCase == '20'
  234. )
  235. }
  236. })
  237. },
  238. provinceChange(val) {
  239. this.currentProvince = val
  240. this.form.provinceId = val.id
  241. this.form.province = val.distName
  242. this.form.cityId = 0
  243. this.form.city = ''
  244. this.$forceUpdate()
  245. },
  246. cityChange(val) {
  247. this.form.cityId = val.id
  248. this.form.city = val.distName
  249. this.$forceUpdate()
  250. },
  251. selectSales(val) {
  252. if (val && val.length > 0) {
  253. this.form.inchargeId = val[0].id
  254. this.form.inchargeName = val.map((item) => item.nickName).join()
  255. }
  256. },
  257. handleSelectSale() {
  258. this.$refs.selectSales.open()
  259. },
  260. handleSelectCustomer() {
  261. this.$refs.selectCustomer.open()
  262. },
  263. selectCustomer(val) {
  264. this.form.custId = 0
  265. this.form.custName = ''
  266. if (val && val.length > 0) {
  267. this.form.custId = val[0].id
  268. this.form.custName = val.map((item) => item.custName).join()
  269. }
  270. },
  271. close() {
  272. this.form = {
  273. id: 0,
  274. code: '', // 序号
  275. consultTime: null, // 日期时间
  276. provinceId: 0, // 所在省ID
  277. province: '', // 所在省
  278. cityId: 0, // 所在市ID
  279. city: '', // 所在市
  280. unit: '', // 单位名称
  281. name: '', // 联系人
  282. contact: '', // 联系方式
  283. product: '', // 咨询产品
  284. inchargeId: '', // 对接人ID
  285. inchargeName: '', // 对接人(销售工程师)
  286. content: '', // 内容
  287. progress: '', // 进展描述
  288. nextPlan: '', // 下一步计划
  289. custId: 0, // 客户ID
  290. custName: '', // 客户
  291. nboId: 0, // 关联项目
  292. nboName: '', // 项目名称
  293. distributorId: 0, // 经销商
  294. distributorName: '', // 经销商
  295. followCommunicateCase: '', // 10、信息有效,可继续跟进,转C类订单;20、信息有效,可转为储备用户;30、信息无效,不再跟进。
  296. }
  297. this.$refs['form'].resetFields()
  298. },
  299. changeIsProject() {
  300. this.form.nboId = 0
  301. this.form.nboName = ''
  302. this.form.distributorId = 0
  303. this.form.distributorName = ''
  304. },
  305. // 打开选择项目
  306. openProject() {
  307. this.$refs.project.open()
  308. },
  309. openDistributor() {
  310. this.$refs.selectDistributor.open()
  311. },
  312. // 关闭选择项目获取项目信息
  313. getBusinessInfo(data) {
  314. this.form.nboId = 0
  315. this.form.nboName = ''
  316. let business = data[0] || null
  317. if (!business) return
  318. this.form.nboId = business.id
  319. this.form.nboName = business.nboName
  320. },
  321. selectDistributor(data) {
  322. this.form.distributorId = 0
  323. this.form.distributorName = ''
  324. let distributor = data[0] || null
  325. if (!distributor) return
  326. this.form.distributorId = distributor.id
  327. this.form.distributorName = distributor.distName
  328. },
  329. },
  330. }
  331. </script>
  332. <style></style>