Edit.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333
  1. <template>
  2. <el-dialog append-to-body :title="title" :visible.sync="editVisible" @close="handleClose">
  3. <el-form ref="editForm" :model="editForm" :rules="editRules">
  4. <el-row :gutter="20">
  5. <el-col :span="12">
  6. <el-form-item label="客户名称" prop="custName">
  7. <el-input v-model="editForm.custName" placeholder="请输入客户名称" />
  8. </el-form-item>
  9. </el-col>
  10. <el-col :span="12">
  11. <el-form-item label="助记名" prop="abbrName">
  12. <el-input v-model="editForm.abbrName" placeholder="请输入助记名" />
  13. </el-form-item>
  14. </el-col>
  15. </el-row>
  16. <el-row :gutter="20">
  17. <el-col :span="12">
  18. <el-form-item label="客户类型" prop="custIndustry">
  19. <el-select v-model="editForm.custIndustry" placeholder="请选择客户类型" style="width: 100%">
  20. <el-option v-for="item in industryOptions" :key="item.value" :label="item.value" :value="item.value" />
  21. </el-select>
  22. </el-form-item>
  23. </el-col>
  24. <!-- <el-col :span="12">
  25. <el-form-item label="客户级别" prop="custLevel">
  26. <el-select v-model="editForm.custLevel" placeholder="请选择客户级别" style="width: 100%">
  27. <el-option v-for="item in levelOptions" :key="item.value" :label="item.value" :value="item.value" />
  28. </el-select>
  29. </el-form-item>
  30. </el-col> -->
  31. <el-col :span="12">
  32. <el-form-item label="客户来源" prop="source">
  33. <el-select v-model="editForm.source" placeholder="请选择客户来源" style="width: 100%">
  34. <el-option v-for="item in sourceOptions" :key="item.value" :label="item.value" :value="item.value" />
  35. </el-select>
  36. </el-form-item>
  37. </el-col>
  38. </el-row>
  39. <el-row :gutter="20">
  40. <el-col :span="12">
  41. <el-form-item label="所在地区" required>
  42. <el-row :gutter="4" style="width: 100%; padding-top: 32px">
  43. <el-col :span="8">
  44. <el-select
  45. v-model="editForm.province"
  46. :disabled="areaEditDisable"
  47. placeholder="省"
  48. value-key="id"
  49. @change="provinceChange">
  50. <el-option v-for="item in provinceOptions" :key="item.id" :label="item.distName" :value="item" />
  51. </el-select>
  52. </el-col>
  53. <el-col :span="8">
  54. <el-select
  55. v-model="editForm.city"
  56. :disabled="areaEditDisable"
  57. placeholder="市"
  58. value-key="id"
  59. @change="cityChange">
  60. <el-option
  61. v-for="item in editForm.province ? editForm.province.children : []"
  62. :key="item.id"
  63. :label="item.distName"
  64. :value="item" />
  65. </el-select>
  66. </el-col>
  67. <el-col :span="8">
  68. <el-select
  69. v-model="editForm.region"
  70. :disabled="areaEditDisable"
  71. placeholder="区"
  72. value-key="id"
  73. @change="$forceUpdate()">
  74. <el-option
  75. v-for="item in editForm.city ? editForm.city.children : []"
  76. :key="item.id"
  77. :label="item.distName"
  78. :value="item" />
  79. </el-select>
  80. </el-col>
  81. </el-row>
  82. </el-form-item>
  83. </el-col>
  84. <el-col :span="12">
  85. <el-form-item label="详细地址" prop="custAddress">
  86. <el-input v-model="editForm.custAddress" placeholder="请输入详细地址" />
  87. </el-form-item>
  88. </el-col>
  89. </el-row>
  90. <el-row :gutter="20">
  91. <el-col :span="12">
  92. <el-form-item label="下次联系时间" prop="followUpDate">
  93. <el-date-picker
  94. v-model="editForm.followUpDate"
  95. format="yyyy-MM-dd HH:mm"
  96. placeholder="选择下次联系时间"
  97. style="width: 100%"
  98. type="datetime"
  99. value-format="yyyy-MM-dd HH:mm" />
  100. </el-form-item>
  101. </el-col>
  102. </el-row>
  103. <el-form-item label="备注" prop="remark">
  104. <el-input
  105. v-model="editForm.remark"
  106. maxlength="500"
  107. placeholder="请输入备注"
  108. resize="none"
  109. :rows="5"
  110. show-word-limit
  111. type="textarea" />
  112. </el-form-item>
  113. </el-form>
  114. <span slot="footer">
  115. <el-button v-show="!editForm.id" type="primary" @click="customerSave">保存</el-button>
  116. <el-button v-show="editForm.id" type="primary" @click="customerEdit">保存</el-button>
  117. <el-button v-if="!editForm.id" @click="createContact">保存并新建联系人</el-button>
  118. <el-button @click="editVisible = false">取消</el-button>
  119. </span>
  120. </el-dialog>
  121. </template>
  122. <script>
  123. import to from 'await-to-js'
  124. import api from '@/api/customer'
  125. export default {
  126. data() {
  127. var checkCustName = async (rule, value, callback) => {
  128. if (!value) return callback('请输入客户名称')
  129. let params = {
  130. custName: value,
  131. id: this.editForm.id,
  132. }
  133. const [err, res] = await to(api.checkCustName(params))
  134. if (err) return callback('网络错误')
  135. if (res.data.list) {
  136. callback('客户名称重复')
  137. } else {
  138. callback()
  139. }
  140. }
  141. return {
  142. title: '新增客户信息',
  143. // 新增编辑客户弹窗
  144. editVisible: false,
  145. areaEditDisable: false,
  146. editForm: {
  147. custName: '', // 客户名称
  148. abbrName: '', // 助记名
  149. custLocation: '', // 所在地区
  150. custAddress: '', // 详细地址
  151. custStatus: '', // 客户状态(10正常20)
  152. followUpDate: '', // 最后跟进时间
  153. custIndustry: '', // 客户类型 (没数据)
  154. custLevel: '', // 客户级别 (没数据)
  155. source: '', //客户来源
  156. province: {}, //省
  157. city: {}, //市
  158. region: {}, //区
  159. },
  160. editRules: {
  161. custName: [{ required: true, validator: checkCustName, trigger: 'blur' }],
  162. custIndustry: [{ required: true, trigger: 'change', message: '请选择客户类型' }],
  163. // custLevel: [{ required: true, trigger: 'change', message: '请选择客户级别' }],
  164. source: [{ required: true, trigger: 'change', message: '请选择客户来源' }],
  165. },
  166. provinceOptions: [],
  167. provinceDetail: [],
  168. industryOptions: [], //客户类型
  169. levelOptions: [], //客户级别
  170. sourceOptions: [], //客户来源
  171. }
  172. },
  173. mounted() {
  174. this.getOptions()
  175. },
  176. methods: {
  177. async init(ids) {
  178. if (!ids) {
  179. this.title = '新增客户信息'
  180. this.editVisible = true
  181. this.areaEditDisable = false
  182. return
  183. }
  184. this.title = '编辑客户'
  185. this.areaEditDisable = true
  186. const [err, res] = await to(api.getDetail({ ids }))
  187. if (err) return
  188. if (res.data.list[0]) this.editForm = res.data.list[0]
  189. else return
  190. this.editVisible = true
  191. this.showLocation()
  192. },
  193. getOptions() {
  194. Promise.all([
  195. api.getProvinceDetail(),
  196. this.getDicts('cust_level'),
  197. this.getDicts('cust_idy'),
  198. this.getDicts('cust_source'),
  199. ])
  200. .then(([province, level, industry, source]) => {
  201. this.provinceOptions = province.data.list || []
  202. this.levelOptions = level.data.values || []
  203. this.industryOptions = industry.data.values || []
  204. this.sourceOptions = source.data.values || []
  205. })
  206. .catch((err) => console.log(err))
  207. },
  208. // 保存客户
  209. async customerSave() {
  210. let params = { ...this.editForm }
  211. const [valid] = await to(this.$refs.editForm.validate())
  212. if (valid == false) return
  213. if (!params.province.id) return this.$message.warning('请选择所在省')
  214. if (!params.city.id) return this.$message.warning('请选择所在市')
  215. if (!params.region.id) return this.$message.warning('请选择所在区')
  216. let arr = []
  217. arr.push(params.province.distName)
  218. if (params.city.id) arr.push(params.city.distName)
  219. if (params.region.id) arr.push(params.region.distName)
  220. params.custLocation = arr.join('/')
  221. params.custProvinceId = params.province.id
  222. params.custProvince = params.province.distName
  223. params.custCityId = params.city.id
  224. params.custCity = params.city.distName
  225. params.custRegionId = params.region.id
  226. params.custRegion = params.region.distName
  227. this.industryOptions.forEach((i) => {
  228. if (params.custIndustry == i.value) {
  229. params.custIndustryCode = i.key
  230. }
  231. })
  232. if (!params.followUpDate) params.followUpDate = null
  233. const [err, res] = await to(api.createCustomer(params))
  234. if (err) return
  235. if (res.code == 200) this.$message.success(res.msg)
  236. else return
  237. this.editVisible = false
  238. this.$emit('customerSave')
  239. return {
  240. id: res.data.lastId,
  241. name: params.custName,
  242. }
  243. },
  244. // 编辑客户
  245. async customerEdit() {
  246. let params = { ...this.editForm }
  247. const [valid] = await to(this.$refs.editForm.validate())
  248. if (valid == false) return
  249. if (!params.province.id) return this.$message.warning('请选择所在省')
  250. if (!params.city.id) return this.$message.warning('请选择所在市')
  251. if (!params.region.id) return this.$message.warning('请选择所在区')
  252. let arr = []
  253. arr.push(params.province.distName)
  254. if (params.city.id) arr.push(params.city.distName)
  255. if (params.region.id) arr.push(params.region.distName)
  256. params.custLocation = arr.join('/')
  257. params.custProvinceId = params.province.id
  258. params.custProvince = params.province.distName
  259. params.custCityId = params.city.id
  260. params.custCity = params.city.distName
  261. params.custRegionId = params.region.id
  262. params.custRegion = params.region.distName
  263. if (!params.followUpDate) params.followUpDate = null
  264. const [err, res] = await to(api.updateCostomer(params))
  265. if (err) return
  266. if (res.code == 200) this.$message.success(res.msg)
  267. else return
  268. this.editVisible = false
  269. this.$emit('customerSave')
  270. },
  271. // 联系人弹窗
  272. async createContact() {
  273. const res = await this.customerSave()
  274. if (!res) return
  275. this.$emit('createContact', res)
  276. },
  277. // 省份改变
  278. async handleProvinceChange(val) {
  279. const [err, res] = await to(api.getProvinceDetail({ Id: val.id }))
  280. if (err) return
  281. this.provinceDetail = res.data.list || []
  282. },
  283. handleClose() {
  284. this.editForm = {
  285. custName: '', // 客户名称
  286. abbrName: '', // 助记名
  287. custLocation: '', // 所在地区
  288. custAddress: '', // 详细地址
  289. custStatus: '', // 客户状态(10正常20)
  290. followUpDate: '', // 最后跟进时间
  291. custIndustry: '', // 客户类型 (没数据)
  292. custLevel: '', // 客户级别 (没数据)
  293. source: '', //客户来源
  294. province: {}, //省
  295. city: {}, //市
  296. region: {}, //区
  297. }
  298. this.$refs.editForm.resetFields()
  299. },
  300. showLocation() {
  301. const arr = this.editForm.custLocation.split('/')
  302. if (!arr.length) return
  303. this.editForm.province = this.provinceOptions.find((item) => item.distName == arr[0])
  304. if (arr[1]) {
  305. this.editForm.city = this.editForm.province.children.find((item) => item.distName == arr[1])
  306. } else {
  307. this.editForm.city = {}
  308. }
  309. if (arr[2]) {
  310. this.editForm.region = this.editForm.city.children.find((item) => item.distName == arr[2])
  311. } else {
  312. this.editForm.region = {}
  313. }
  314. },
  315. provinceChange(val) {
  316. this.editForm.city = {}
  317. this.editForm.region = {}
  318. this.editForm.custDistCode = val.id
  319. this.$forceUpdate()
  320. },
  321. cityChange() {
  322. this.editForm.region = {}
  323. this.$forceUpdate()
  324. },
  325. },
  326. }
  327. </script>
  328. <style lang="scss" scoped></style>