From 6887629cbd7c09407d25a6199d8ddd878d17da4f Mon Sep 17 00:00:00 2001 From: haoxuan <haoxuan> Date: 星期二, 24 十月 2023 17:50:11 +0800 Subject: [PATCH] 客户管理,跟进记录,线索,发票,合同管理,总单,报价单,退款单,明细单,机会,退货单,子单,客户服务单,服务合同,服务回访单连天 --- src/views/client/followupRecords/AddFollowupRecordsDialog.vue | 441 ++++++++++++++++++++++++++++++++---------------------- 1 files changed, 262 insertions(+), 179 deletions(-) diff --git a/src/views/client/followupRecords/AddFollowupRecordsDialog.vue b/src/views/client/followupRecords/AddFollowupRecordsDialog.vue index 65dcd1e..5758864 100644 --- a/src/views/client/followupRecords/AddFollowupRecordsDialog.vue +++ b/src/views/client/followupRecords/AddFollowupRecordsDialog.vue @@ -24,7 +24,22 @@ <el-row> <el-col :span="12" v-if="isUnflod"> <el-form-item label="璺熻繘璁板綍缂栧彿" prop="number"> - <WordInput + <el-input + v-if=" + editConfig.title == '缂栬緫' || + (editConfig.title == '鏂板缓' && + codenumer && + (explain != '' || isIdDisabled)) + " + :disabled="editConfig.title == '缂栬緫'" + v-model="editConfig.infomation.number" + placeholder="璇疯緭鍏ョ紪鐮�" + > + </el-input> + <span v-else-if="editConfig.title == '鏂板缓'" style="color: #f56c6c" + >璇蜂紭鍏堥厤缃紪鐮佽鑼� <el-button type="text" @click="numberClick"> 閰嶇疆瑙勮寖 </el-button></span + > + <!-- <WordInput v-if="codenumer && (explain != '' || isIdDisabled) && method == 0" :codenumer="codenumer" :sum="sum" @@ -35,7 +50,7 @@ <span v-else-if="method == 0" style="color: #f56c6c" >璇蜂紭鍏堥厤缃紪鐮佽鑼� <el-button type="text" @click="numberClick"> 閰嶇疆瑙勮寖 </el-button></span > - <span v-else>鑷姩鐢熸垚</span> + <span v-else>鑷姩鐢熸垚</span> --> </el-form-item> </el-col> <el-col :span="12"> @@ -45,18 +60,24 @@ v-model="editConfig.infomation.client_name" :fetch-suggestions=" (queryString, callback) => { - querySearchAsync(queryString, callback, 'client') + querySearchAsync(queryString, callback, 'client'); } " value-key="name" @select="handleSelectClient('client', $event)" style="width: 100%" ></el-autocomplete> - <div class="common-select-btn" @click="selClientClick('client')"> + <div + class="common-select-btn" + @click="selClientClick('client')" + > <i class="el-icon-circle-plus-outline" title="閫夋嫨"></i> </div> <div - v-if="editConfig.infomation.client_name && editConfig.infomation.client_name.length > 0" + v-if=" + editConfig.infomation.client_name && + editConfig.infomation.client_name.length > 0 + " class="common-select-btn" @click="clearupClient('client')" > @@ -75,7 +96,12 @@ size="mini" style="width: 100%" > - <el-option v-for="item in clientStatusOptions" :key="item.id" :label="item.name" :value="item.id"> + <el-option + v-for="item in clientStatusOptions" + :key="item.id" + :label="item.name" + :value="item.id" + > </el-option> </el-select> <!-- <div class="common-select-btn"><i class="el-icon-setting"></i></div> --> @@ -89,18 +115,24 @@ v-model="editConfig.infomation.contact_name" :fetch-suggestions=" (queryString, callback) => { - querySearchAsync(queryString, callback, 'contact') + querySearchAsync(queryString, callback, 'contact'); } " value-key="name" @select="handleSelectClient('contact', $event)" style="width: 100%" ></el-autocomplete> - <div class="common-select-btn" @click="selClientClick('contact')"> + <div + class="common-select-btn" + @click="selClientClick('contact')" + > <i class="el-icon-circle-plus-outline" title="閫夋嫨"></i> </div> <div - v-if="editConfig.infomation.contact_name && editConfig.infomation.contact_name.length > 0" + v-if=" + editConfig.infomation.contact_name && + editConfig.infomation.contact_name.length > 0 + " class="common-select-btn" @click="clearupClient('contact')" > @@ -117,7 +149,12 @@ size="mini" style="width: 100%" > - <el-option v-for="item in memberOptions" :key="item.id" :label="item.username" :value="item.id"> + <el-option + v-for="item in memberOptions" + :key="item.id" + :label="item.username" + :value="item.id" + > </el-option> </el-select> </el-form-item> @@ -141,7 +178,12 @@ size="mini" style="width: 100%" > - <el-option v-for="item in contactInfoOptions" :key="item.id" :label="item.name" :value="item.id"> + <el-option + v-for="item in contactInfoOptions" + :key="item.id" + :label="item.name" + :value="item.id" + > </el-option> </el-select> </el-form-item> @@ -153,7 +195,7 @@ v-model="editConfig.infomation.sale_chance_name" :fetch-suggestions=" (queryString, callback) => { - querySearchAsync(queryString, callback, 'chance') + querySearchAsync(queryString, callback, 'chance'); } " value-key="name" @@ -162,7 +204,11 @@ placeholder="璇峰厛閫夋嫨瀹㈡埛鍚嶇О" :disabled="isChance" ></el-autocomplete> - <div v-if="!isChance" class="common-select-btn" @click="selClientClick('chance')"> + <div + v-if="!isChance" + class="common-select-btn" + @click="selClientClick('chance')" + > <i class="el-icon-circle-plus-outline"></i> </div> <div @@ -187,18 +233,24 @@ v-model="editConfig.infomation.sales_leads_name" :fetch-suggestions=" (queryString, callback) => { - querySearchAsync(queryString, callback, 'lead') + querySearchAsync(queryString, callback, 'lead'); } " value-key="name" @select="handleSelectClient('lead', $event)" style="width: 100%" ></el-autocomplete> - <div class="common-select-btn" @click="selClientClick('lead')"> + <div + class="common-select-btn" + @click="selClientClick('lead')" + > <i class="el-icon-circle-plus-outline"></i> </div> <div - v-if="editConfig.infomation.sales_leads_name && editConfig.infomation.sales_leads_name.length > 0" + v-if=" + editConfig.infomation.sales_leads_name && + editConfig.infomation.sales_leads_name.length > 0 + " class="common-select-btn" @click="clearupClient('lead')" > @@ -296,15 +348,23 @@ </div> --> </div> <!-- 灞曞紑鏀惰捣 --> - <div v-if="editConfig.title === '鏂板缓'" class="unflod-collapse" @click="unflodCollapseClick"> + <div + v-if="editConfig.title === '鏂板缓'" + class="unflod-collapse" + @click="unflodCollapseClick" + > <div>{{ unflodCollapseStr }}</div> <div v-if="isUnflod"><i class="el-icon-arrow-up"></i></div> <div v-else><i class="el-icon-arrow-down"></i></div> </div> </el-form> <div slot="footer" class="dialog-footer"> - <el-button type="primary" size="small" @click="saveClick('form')">淇� 瀛�</el-button> - <el-button size="small" @click="editConfig.visible = false">鍙� 娑�</el-button> + <el-button type="primary" size="small" @click="saveClick('form')" + >淇� 瀛�</el-button + > + <el-button size="small" @click="editConfig.visible = false" + >鍙� 娑�</el-button + > </div> <!-- 閫夋嫨瀹㈡埛 --> <SelectClientDialog @@ -335,17 +395,21 @@ </template> <script> -import { getAllData } from "@/api/client/client" -import { getAddFollowRecord, getUpdateFollowRecord, getContactInfoList } from "@/api/client/followupRecords" -import SelectClientDialog from "@/views/other/commonDialog/SelectClientDialog" -import SelectContactDialog from "@/views/other/commonDialog/SelectContactDialog" -import SelectChanceDialog from "@/views/other/commonDialog/SelectChanceDialog" -import SelectLeadDialog from "@/views/other/commonDialog/SelectLeadDialog" -import codeMixin from "./mixin/codeMixin" -import { getContactList } from "@/api/client/contacts" -import { mapActions } from "vuex" -import { getSaleChanceList } from "@/api/sales/salesOpportunity" -import { getSalesLeadsList } from "@/api/client/salesLead" +import { getAllData } from "@/api/client/client"; +import { + getAddFollowRecord, + getUpdateFollowRecord, + getContactInfoList, +} from "@/api/client/followupRecords"; +import SelectClientDialog from "@/views/other/commonDialog/SelectClientDialog"; +import SelectContactDialog from "@/views/other/commonDialog/SelectContactDialog"; +import SelectChanceDialog from "@/views/other/commonDialog/SelectChanceDialog"; +import SelectLeadDialog from "@/views/other/commonDialog/SelectLeadDialog"; +import codeMixin from "@/components/makepager/mixin/codeMixin"; +import { getContactList } from "@/api/client/contacts"; +import { mapActions } from "vuex"; +import { getSaleChanceList } from "@/api/sales/salesOpportunity"; +import { getSalesLeadsList } from "@/api/client/salesLead"; export default { name: "AddFollowupRecordsDialog", @@ -357,28 +421,28 @@ return { visible: false, title: "鏂板缓", - infomation: {} - } - } + infomation: {}, + }; + }, }, isDetail: { type: Boolean, - default: false - } + default: false, + }, }, components: { SelectClientDialog, SelectContactDialog, SelectChanceDialog, - SelectLeadDialog + SelectLeadDialog, }, computed: { searchCommonHeight() { - return this.$refs.searchCommonView.offsetHeight + return this.$refs.searchCommonView.offsetHeight; }, clientList() { - return this.$store.state.getClientName.clientList - } + return this.$store.state.getClientName.clientList; + }, // contactNamelist() { // return this.$store.state.getClientName.contactNamelist // }, @@ -394,27 +458,38 @@ dialogWidth: "50%", editConfig: this.editContactsConfig, rules: { - number: [{ required: true, message: "璇疯緭鍏ヨ窡杩涜褰曠紪鍙�", trigger: "blur" }], - member_id: [{ required: true, message: "璇烽�夋嫨璐熻矗浜�", trigger: "change" }], - record: [{ required: true, message: "璇疯緭鍏ヨ窡杩涜褰�", trigger: "blur" }], - client_name: [{ required: true, validator: this.checkClient, trigger: "change" }], - contact_name: [{ required: true, message: "璇烽�夋嫨鑱旂郴浜哄鍚�", trigger: "change" }], + number: [ + { required: true, validator: this.validateCheckCode, trigger: ["blur",'change'] }, + ], + member_id: [ + { required: true, message: "璇烽�夋嫨璐熻矗浜�", trigger: "change" }, + ], + record: [ + { required: true, message: "璇疯緭鍏ヨ窡杩涜褰�", trigger: "blur" }, + ], + client_name: [ + { required: true, validator: this.checkClient, trigger: "change" }, + ], + contact_name: [ + { required: true, message: "璇烽�夋嫨鑱旂郴浜哄鍚�", trigger: "change" }, + ], topic: [{ required: true, message: "璇疯緭鍏ヤ富棰�", trigger: "blur" }], // content: [{ required: true, message: "璇疯緭鍏ュ唴瀹�", trigger: "blur" }], phoneNumber: [ { required: false, message: "", trigger: "blur" }, { len: 11, message: "闀垮害鍦�11涓瓧绗�", trigger: "blur" }, { - pattern: /^1(3\d|4[5-9]|5[0-35-9]|6[2567]|7[0-8]|8\d|9[0-35-9])\d{8}$/, + pattern: + /^1(3\d|4[5-9]|5[0-35-9]|6[2567]|7[0-8]|8\d|9[0-35-9])\d{8}$/, message: "璇疯緭鍏ユ纭殑鎵嬫満鍙�", - trigger: "blur" - } - ] + trigger: "blur", + }, + ], }, pickerOptions: { disabledDate: (time) => { - return time.getTime() > Date.now() - } + return time.getTime() > Date.now(); + }, }, clientStatusOptions: [], // 瀹㈡埛鐘舵�� contactInfoOptions: [], // 鑱旂郴鏂瑰紡 @@ -424,123 +499,120 @@ editSelectClientConfig: { editVisible: false, title: "", - infomation: {} + infomation: {}, }, editSelectContactConfig: { editVisible: false, title: "", infomation: {}, - search_map: {} + search_map: {}, }, editSelectChanceConfig: { editVisible: false, title: "", infomation: {}, - search_map: {} + search_map: {}, }, editSelectLeadConfig: { editVisible: false, title: "", infomation: {}, - search_map: {} + search_map: {}, }, clientId: this.editContactsConfig.infomation.client_id, contactId: this.editContactsConfig.infomation.contact_id, saleChanceId: this.editContactsConfig.infomation.sale_chance_id, saleLeadId: this.editContactsConfig.infomation.sales_leads_id, saleChancelist: [], - isChance: true - } + isChance: true, + }; }, created() { - this.$store.dispatch("geClient") + this.$store.dispatch("geClient"); // this.$store.dispatch("geContact") // this.$store.dispatch("geChance") // this.$store.dispatch("geLead") - this.getCommonData() - this.getContactInfoList() - this.formInfo() + this.getCommonData(); + this.getContactInfoList(); + this.formInfo(); }, watch: { "editContactsConfig.visible"(val) { if (val) { - this.formInfo() + this.formInfo(); } }, - "editContactsConfig.infomation.codeStandID"() { - this.formInfo() - } }, methods: { ...mapActions(["getContactFilter", "getLeadFilter"]), formInfo() { - this.objCode.type = "璺熻繘璁板綍缂栫爜" - this.objCode.codeStandID = "" + this.objCode.type = "璺熻繘璁板綍缂栫爜"; + this.objCode.codeStandID = ""; if (this.editConfig.infomation.codeStandID) { - this.objCode.codeStandID = this.editConfig.infomation.codeStandID + this.objCode.codeStandID = this.editConfig.infomation.codeStandID; } - this.getRCodeStandardList() + this.getRCodeStandardList(); }, getCommonData() { getAllData().then((res) => { - console.log(res) - this.clientStatusOptions = res.data.client_status - this.memberOptions = res.data.member + console.log(res); + this.clientStatusOptions = res.data.client_status; + this.memberOptions = res.data.member; // this.dataProcess() - }) + }); }, async getContactInfoList() { await getContactInfoList().then((res) => { if (res.code === 200) { - this.contactInfoOptions = res.data.list + this.contactInfoOptions = res.data.list; } - }) + }); }, dataProcess() { this.saleChancelist.map((item) => { if (this.saleChanceId === item.id) { - this.editConfig.infomation.sale_chance_name = item.name + this.editConfig.infomation.sale_chance_name = item.name; } - }) + }); this.saleLeadlist.map((item) => { if (this.saleLeadId === item.id) { - this.editConfig.infomation.sales_leads_name = item.name + this.editConfig.infomation.sales_leads_name = item.name; } - }) + }); }, handleClose() { - this.editConfig.visible = false + this.editConfig.visible = false; }, // 淇濆瓨 saveClick(formName) { this.$refs[formName].validate((valid) => { if (valid) { - const params = this.saveParams() + const params = this.saveParams(); if (this.editConfig.title === "鏂板缓") { getAddFollowRecord(params).then((res) => { - this.editConfig.visible = false + this.editConfig.visible = false; if (res.code === 200) { - this.$message.success("娣诲姞鎴愬姛") - this.$parent.getData() + this.$message.success("娣诲姞鎴愬姛"); + this.$parent.getData(); } - }) + }); } else { getUpdateFollowRecord(params).then((res) => { - this.editConfig.visible = false + this.editConfig.visible = false; if (res.code === 200) { - this.$message.success("缂栬緫鎴愬姛") - this.$parent.getData() + this.$message.success("缂栬緫鎴愬姛"); + this.$parent.getData(); } - }) + }); } } else { - console.log("error submit") - return false + console.log("error submit"); + return false; } - }) + }); }, saveParams() { - let data = this.editConfig.infomation + let data = this.editConfig.infomation; let follow_record = { follow_record: { client_id: this.clientId || 0, @@ -558,16 +630,15 @@ sales_leads_id: this.saleLeadId || 0, topic: data.topic || "", codeStandID: data.ID, - codeRule: this.codeRule - } - } - let params = {} + }, + }; + let params = {}; if (this.editConfig.title === "鏂板缓") { - params = { ...follow_record } + params = { ...follow_record }; } else { - params = { ...follow_record, id: data.id || 0 } + params = { ...follow_record, id: data.id || 0 }; } - return params + return params; }, // 鑾峰彇閿�鍞満浼� getChanceList(id) { @@ -575,136 +646,145 @@ page: 1, pageSize: 15, search_map: { - client_id: id - } + client_id: id, + }, }).then((res) => { if (res.code == 200) { - this.saleChancelist = res.data.list + this.saleChancelist = res.data.list; } - }) + }); }, // 閫夋嫨瀹㈡埛鐩稿叧鏂规硶 querySearchAsync(queryString, cb, value) { - var restaurants = [] + var restaurants = []; if (value === "client") { - restaurants = this.clientList + restaurants = this.clientList; } else if (value === "contact") { - restaurants = this.contactNamelist + restaurants = this.contactNamelist; } else if (value === "chance") { - restaurants = this.saleChancelist + restaurants = this.saleChancelist; } else { - restaurants = this.saleLeadlist + restaurants = this.saleLeadlist; } - var results = queryString ? restaurants.filter(this.createStateFilter(queryString)) : restaurants - cb(results) + var results = queryString + ? restaurants.filter(this.createStateFilter(queryString)) + : restaurants; + cb(results); }, createStateFilter(queryString) { return (state) => { - return state.name.toLowerCase().indexOf(queryString.toLowerCase()) === 0 - } + return ( + state.name.toLowerCase().indexOf(queryString.toLowerCase()) === 0 + ); + }; }, // 鑱旂郴浜哄垪琛� async getContactList(item) { await getContactList({ search_map: { - client_id: item.id + client_id: item.id, }, page: 1, - pageSize: 15 + pageSize: 15, }).then((res) => { if (res.code === 200) { - this.contactNamelist = res.data.list + this.contactNamelist = res.data.list; } - }) + }); }, // 閿�鍞嚎绱� async getSalesLeadsList(item) { await getSalesLeadsList({ search_map: { - name: item.name - } + name: item.name, + }, }).then((res) => { if (res.code === 200) { - this.saleLeadlist = res.data.list + this.saleLeadlist = res.data.list; } - }) + }); }, async handleSelectClient(value, item) { if (value === "client") { - console.log(item, "item") - this.editSelectContactConfig.search_map.client_id = item.id - this.editSelectChanceConfig.search_map.client_id = item.id - this.editSelectLeadConfig.search_map.name = item.name - this.getContactList(item) - this.getSalesLeadsList(item) - this.clientId = item.id - this.editConfig.infomation.client_name = item.name - this.isChance = false - this.getChanceList(item.id) + this.editConfig.infomation.contact_name = ""; + this.editConfig.infomation.sales_leads_name = ""; + this.editConfig.infomation.sale_chance_name = ""; + this.editSelectContactConfig.search_map.client_id = item.id; + this.editSelectChanceConfig.search_map.client_id = item.id; + this.editSelectLeadConfig.search_map.name = item.name; + this.getContactList(item); + this.getSalesLeadsList(item); + this.clientId = item.id; + this.editConfig.infomation.client_name = item.name; + this.isChance = false; + this.getChanceList(item.id); } else if (value === "contact") { - this.contactId = item.id - this.editConfig.infomation.contact_name = item.name + this.contactId = item.id; + this.editConfig.infomation.contact_name = item.name; } else if (value === "chance") { - this.saleChanceId = item.id - this.editConfig.infomation.sale_chance_name = item.name + this.saleChanceId = item.id; + this.editConfig.infomation.sale_chance_name = item.name; } else { - this.saleLeadId = item.id - this.editConfig.infomation.sales_leads_name = item.name + this.saleLeadId = item.id; + this.editConfig.infomation.sales_leads_name = item.name; } }, selClientClick(value) { if (value === "client") { - this.editSelectClientConfig.editVisible = true + this.editSelectClientConfig.editVisible = true; } else if (value === "contact") { - this.editSelectContactConfig.editVisible = true + this.editSelectContactConfig.editVisible = true; } else if (value === "chance") { - this.editSelectChanceConfig.editVisible = true + this.editSelectChanceConfig.editVisible = true; } else { - this.editSelectLeadConfig.editVisible = true + this.editSelectLeadConfig.editVisible = true; } }, selClient(row, value) { if (value === "contact") { - this.editConfig.infomation.contact_name = row.name - this.contactId = row.id + this.editConfig.infomation.contact_name = row.name; + this.contactId = row.id; } else if (value === "client") { - // this.editConfig.infomation.client_name = row.name; - // this.clientId = row.id; - // this.isChance = false; - this.editSelectContactConfig.search_map.client_id = row.id - this.editSelectChanceConfig.search_map.client_id = row.id - this.editSelectLeadConfig.search_map.name = row.name - this.getContactList(row) - this.getSalesLeadsList(row) - this.clientId = row.id - this.editConfig.infomation.client_name = row.name - this.isChance = false - this.getChanceList(row.id) + this.editConfig.infomation.contact_name = ""; + this.editConfig.infomation.sales_leads_name = ""; + this.editConfig.infomation.sale_chance_name = ""; + this.editSelectContactConfig.search_map.client_id = row.id; + this.editSelectChanceConfig.search_map.client_id = row.id; + this.editSelectLeadConfig.search_map.name = row.name; + this.getContactList(row); + this.getSalesLeadsList(row); + this.clientId = row.id; + this.editConfig.infomation.client_name = row.name; + this.isChance = false; + this.getChanceList(row.id); } else if (value === "chance") { - this.editConfig.infomation.sale_chance_name = row.name - this.saleChanceId = row.id + this.editConfig.infomation.sale_chance_name = row.name; + this.saleChanceId = row.id; } else { - this.editConfig.infomation.sales_leads_name = row.name - this.saleLeadId = row.id + this.editConfig.infomation.sales_leads_name = row.name; + this.saleLeadId = row.id; } }, // 娓呴櫎宸查�夋嫨鐢ㄦ埛 clearupClient(value) { if (value === "client") { - this.editConfig.infomation.client_name = "" - this.clientId = 0 - this.isChance = true - this.editConfig.infomation.sale_chance_name = "" - this.saleChanceId = 0 + this.editConfig.infomation.contact_name = ""; + this.editConfig.infomation.sales_leads_name = ""; + this.editConfig.infomation.sale_chance_name = ""; + this.editConfig.infomation.client_name = ""; + this.clientId = 0; + this.isChance = true; + this.editConfig.infomation.sale_chance_name = ""; + this.saleChanceId = 0; } else if (value === "contact") { - this.editConfig.infomation.contact_name = "" - this.contactId = 0 + this.editConfig.infomation.contact_name = ""; + this.contactId = 0; } else if (value === "chance") { - this.editConfig.infomation.sale_chance_name = "" - this.saleChanceId = 0 + this.editConfig.infomation.sale_chance_name = ""; + this.saleChanceId = 0; } else { - this.editConfig.infomation.sales_leads_name = "" - this.saleLeadId = 0 + this.editConfig.infomation.sales_leads_name = ""; + this.saleLeadId = 0; } }, // 娣诲姞闄勪欢 @@ -714,23 +794,26 @@ // 灞曞紑鏀惰捣 unflodCollapseClick() { if (this.unflodCollapseStr === "鏀惰捣") { - this.unflodCollapseStr = "灞曞紑鏇村鏍忕洰" - this.isUnflod = false + this.unflodCollapseStr = "灞曞紑鏇村鏍忕洰"; + this.isUnflod = false; } else { - this.unflodCollapseStr = "鏀惰捣" - this.isUnflod = true + this.unflodCollapseStr = "鏀惰捣"; + this.isUnflod = true; } }, // 瀹㈡埛鍚嶇О鍗曠嫭鏍¢獙 checkClient(rule, value, callback) { - if (this.editConfig.infomation.client_name && this.editConfig.infomation.client_name.length > 0) { - callback() + if ( + this.editConfig.infomation.client_name && + this.editConfig.infomation.client_name.length > 0 + ) { + callback(); } else { - callback(new Error("璇烽�夋嫨瀹㈡埛鍚嶇О")) + callback(new Error("璇烽�夋嫨瀹㈡埛鍚嶇О")); } - } - } -} + }, + }, +}; </script> <!-- Add "scoped" attribute to limit CSS to this component only --> -- Gitblit v1.8.0