Edit.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  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.key" :label="item.value" :value="item.key" />
  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-col :span="12">
  103. <el-form-item label="开票抬头" prop="invoiceHeader">
  104. <el-input v-model="editForm.invoiceHeader" placeholder="请输入详细地址" />
  105. </el-form-item>
  106. </el-col> -->
  107. </el-row>
  108. <el-form-item label="备注" prop="remark">
  109. <el-input
  110. v-model="editForm.remark"
  111. maxlength="500"
  112. placeholder="请输入备注"
  113. resize="none"
  114. :rows="5"
  115. show-word-limit
  116. type="textarea" />
  117. </el-form-item>
  118. </el-form>
  119. <span slot="footer">
  120. <el-button v-show="!editForm.id" type="primary" @click="customerSave">保存</el-button>
  121. <el-button v-show="editForm.id" type="primary" @click="customerEdit">保存</el-button>
  122. <el-button v-if="!editForm.id" @click="createContact">保存并新建联系人</el-button>
  123. <el-button @click="editVisible = false">取消</el-button>
  124. </span>
  125. </el-dialog>
  126. </template>
  127. <script>
  128. import to from 'await-to-js'
  129. import api from '@/api/customer'
  130. export default {
  131. data() {
  132. var checkCustName = async (rule, value, callback) => {
  133. if (!value) return callback('请输入客户名称')
  134. let params = {
  135. custName: value,
  136. id: this.editForm.id,
  137. }
  138. const [err, res] = await to(api.checkCustName(params))
  139. if (err) return callback('网络错误')
  140. if (res.data.list) {
  141. callback('客户名称重复')
  142. } else {
  143. callback()
  144. }
  145. }
  146. return {
  147. title: '新增客户信息',
  148. // 新增编辑客户弹窗
  149. editVisible: false,
  150. areaEditDisable: false,
  151. editForm: {
  152. custName: '', // 客户名称
  153. abbrName: '', // 助记名
  154. custLocation: '', // 所在地区
  155. custAddress: '', // 详细地址
  156. invoiceHeader: '', // 开票抬头
  157. custStatus: '', // 客户状态(10正常20)
  158. followUpDate: '', // 最后跟进时间
  159. custIndustry: '', // 客户类型 (没数据)
  160. custLevel: '', // 客户级别 (没数据)
  161. source: '', //客户来源
  162. province: {}, //省
  163. city: {}, //市
  164. region: {}, //区
  165. },
  166. editRules: {
  167. custName: [{ required: true, validator: checkCustName, trigger: 'blur' }],
  168. custIndustry: [{ required: true, trigger: 'change', message: '请选择客户类型' }],
  169. // custLevel: [{ required: true, trigger: 'change', message: '请选择客户级别' }],
  170. source: [{ required: true, trigger: 'change', message: '请选择客户来源' }],
  171. },
  172. provinceOptions: [],
  173. provinceDetail: [],
  174. industryOptions: [], //客户类型
  175. levelOptions: [], //客户级别
  176. sourceOptions: [], //客户来源
  177. }
  178. },
  179. mounted() {
  180. this.getOptions()
  181. },
  182. methods: {
  183. async init(ids) {
  184. if (!ids) {
  185. this.title = '新增客户信息'
  186. this.editVisible = true
  187. this.areaEditDisable = false
  188. return
  189. }
  190. this.title = '编辑客户'
  191. this.areaEditDisable = true
  192. const [err, res] = await to(api.getDetail({ ids }))
  193. if (err) return
  194. if (res.data.list[0]) this.editForm = res.data.list[0]
  195. else return
  196. this.editVisible = true
  197. this.showLocation()
  198. },
  199. getOptions() {
  200. Promise.all([
  201. api.getProvinceDetail(),
  202. this.getDicts('cust_level'),
  203. this.getDicts('cust_idy'),
  204. this.getDicts('cust_source'),
  205. ])
  206. .then(([province, level, industry, source]) => {
  207. this.provinceOptions = province.data.list || []
  208. this.levelOptions = level.data.values || []
  209. this.industryOptions = industry.data.values || []
  210. this.sourceOptions = source.data.values || []
  211. })
  212. .catch((err) => console.log(err))
  213. },
  214. // 保存客户
  215. async customerSave() {
  216. let params = { ...this.editForm }
  217. const [valid] = await to(this.$refs.editForm.validate())
  218. if (valid == false) return
  219. if (!params.province.id) return this.$message.warning('请选择所在省')
  220. if (!params.city.id) return this.$message.warning('请选择所在市')
  221. if (!params.region.id) return this.$message.warning('请选择所在区')
  222. let arr = []
  223. arr.push(params.province.distName)
  224. if (params.city.id) arr.push(params.city.distName)
  225. if (params.region.id) arr.push(params.region.distName)
  226. params.custLocation = arr.join('/')
  227. params.custProvinceId = params.province.id
  228. params.custProvince = params.province.distName
  229. params.custCityId = params.city.id
  230. params.custCity = params.city.distName
  231. params.custRegionId = params.region.id
  232. params.custRegion = params.region.distName
  233. if (!params.followUpDate) params.followUpDate = null
  234. const [err, res] = await to(api.createCustomer(params))
  235. if (err) return
  236. if (res.code == 200) this.$message.success(res.msg)
  237. else return
  238. this.editVisible = false
  239. this.$emit('customerSave')
  240. return {
  241. id: res.data.lastId,
  242. name: params.custName,
  243. }
  244. },
  245. // 编辑客户
  246. async customerEdit() {
  247. let params = { ...this.editForm }
  248. const [valid] = await to(this.$refs.editForm.validate())
  249. if (valid == false) return
  250. if (!params.province.id) return this.$message.warning('请选择所在省')
  251. if (!params.city.id) return this.$message.warning('请选择所在市')
  252. if (!params.region.id) return this.$message.warning('请选择所在区')
  253. let arr = []
  254. arr.push(params.province.distName)
  255. if (params.city.id) arr.push(params.city.distName)
  256. if (params.region.id) arr.push(params.region.distName)
  257. params.custLocation = arr.join('/')
  258. params.custProvinceId = params.province.id
  259. params.custProvince = params.province.distName
  260. params.custCityId = params.city.id
  261. params.custCity = params.city.distName
  262. params.custRegionId = params.region.id
  263. params.custRegion = params.region.distName
  264. if (!params.followUpDate) params.followUpDate = null
  265. const [err, res] = await to(api.updateCostomer(params))
  266. if (err) return
  267. if (res.code == 200) this.$message.success(res.msg)
  268. else return
  269. this.editVisible = false
  270. this.$emit('customerSave')
  271. },
  272. // 联系人弹窗
  273. async createContact() {
  274. const res = await this.customerSave()
  275. if (!res) return
  276. this.$emit('createContact', res)
  277. },
  278. // 省份改变
  279. async handleProvinceChange(val) {
  280. const [err, res] = await to(api.getProvinceDetail({ Id: val.id }))
  281. if (err) return
  282. this.provinceDetail = res.data.list || []
  283. },
  284. handleClose() {
  285. this.editForm = {
  286. custName: '', // 客户名称
  287. abbrName: '', // 助记名
  288. custLocation: '', // 所在地区
  289. custAddress: '', // 详细地址
  290. invoiceHeader: '', // 开票抬头
  291. custStatus: '', // 客户状态(10正常20)
  292. followUpDate: '', // 最后跟进时间
  293. custIndustry: '', // 客户类型 (没数据)
  294. custLevel: '', // 客户级别 (没数据)
  295. source: '', //客户来源
  296. province: {}, //省
  297. city: {}, //市
  298. region: {}, //区
  299. }
  300. this.$refs.editForm.resetFields()
  301. },
  302. showLocation() {
  303. this.editForm.province = this.provinceOptions.find((item) => item.distName == this.editForm.custProvince)
  304. this.editForm.city = this.editForm.province.children.find((item) => item.distName == this.editForm.custCity)
  305. this.editForm.region = this.editForm.city.children.find((item) => item.distName == this.editForm.custRegion)
  306. },
  307. provinceChange(val) {
  308. this.editForm.city = {}
  309. this.editForm.region = {}
  310. this.editForm.custDistCode = val.id
  311. this.$forceUpdate()
  312. },
  313. cityChange() {
  314. this.editForm.region = {}
  315. this.$forceUpdate()
  316. },
  317. },
  318. }
  319. </script>
  320. <style lang="scss" scoped></style>