index.vue 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. <template>
  2. <div style="width: 100%">
  3. <!-- <el-form-item label="客户来源:" prop="sourceName" required :rules="sourceRule" size="small"> -->
  4. <template v-if="editStatus">
  5. <table style="border-spacing: 0; width: 100%">
  6. <tr>
  7. <td>
  8. <el-select
  9. style="width: 100%"
  10. v-model.trim="sourceCategoryId"
  11. placeholder="客户来源分类"
  12. size="small"
  13. @change="handlerChangeCategory"
  14. >
  15. <el-option
  16. v-for="item in sourceCategories"
  17. :key="item.id"
  18. :label="item.title"
  19. :value="item.id"
  20. />
  21. </el-select>
  22. </td>
  23. <td>
  24. <el-autocomplete
  25. :fetch-suggestions="querySearchAsync"
  26. :disabled="
  27. !sourceCategoryId || currentSource.referrerDataSource === ''
  28. "
  29. :trigger-on-focus="true"
  30. style="width: 100%"
  31. v-model="formData.sourceName"
  32. placeholder="请先选择左侧"
  33. popper-class="my-autocomplete"
  34. @select="handleSelectEmployee"
  35. >
  36. <template #default="{ item }">
  37. <div
  38. style="
  39. display: flex;
  40. flex-direction: row;
  41. justify-content: space-between;
  42. "
  43. v-if="currentSource.referrerDataSource === 'channel'"
  44. >
  45. <div class="name" style="font-size: 12px">
  46. {{ item.name }}
  47. </div>
  48. </div>
  49. <div
  50. style="
  51. display: flex;
  52. flex-direction: row;
  53. justify-content: space-between;
  54. "
  55. v-if="currentSource.referrerDataSource === 'company'"
  56. >
  57. <div class="name" style="font-size: 12px">
  58. {{ item.name }}
  59. </div>
  60. <span class="code" style="font-size: 10px; color: darkgrey">{{
  61. item.shortName
  62. }}</span>
  63. </div>
  64. <div
  65. style="
  66. display: flex;
  67. flex-direction: row;
  68. justify-content: space-between;
  69. "
  70. v-if="currentSource.referrerDataSource === 'employee'"
  71. >
  72. <div class="name" style="font-size: 12px">
  73. {{ item.nickName }}
  74. </div>
  75. <span class="code" style="font-size: 10px; color: darkgrey">{{
  76. item.userName
  77. }}</span>
  78. </div>
  79. </template>
  80. </el-autocomplete>
  81. </td>
  82. </tr>
  83. </table>
  84. </template>
  85. <span v-else>{{
  86. (formData.sourceCategoryName ? formData.sourceCategoryName : "") +
  87. " - " +
  88. (formData.sourceName ? formData.sourceName : "")
  89. }}</span>
  90. <!-- </el-form-item> -->
  91. <DialogEmployeeChoice
  92. ref="DialogEmployeeChoiceRef"
  93. :multiple="false"
  94. :width="'800px'"
  95. @choice="simpleSelectedEmployee"
  96. />
  97. <DialogCustomerChoice
  98. ref="DialogCustomerChoiceRef"
  99. :multiple="false"
  100. :width="'800px'"
  101. @choice="simpleSelectedCustomer"
  102. />
  103. <DialogChannelChoice
  104. ref="DialogChannelChoiceRef"
  105. :multiple="false"
  106. :width="'800px'"
  107. @choice="simpleSelectedChannel"
  108. />
  109. </div>
  110. </template>
  111. <script setup>
  112. import { toRef } from "vue";
  113. import { listUser } from "@/api/system/user";
  114. import { listChannel } from "@/api/business/channel";
  115. import { listCompany } from "@/api/business/crm/company";
  116. import { listSource } from "@/api/settings/source";
  117. import DialogEmployeeChoice from "@/views/dialog/DialogEmployeeChoice.vue";
  118. import DialogCustomerChoice from "@/views/dialog/DialogCustomerChoice.vue";
  119. import DialogChannelChoice from "@/views/dialog/DialogChannelChoice.vue";
  120. const { proxy } = getCurrentInstance();
  121. const props = defineProps({
  122. editStatus: {
  123. type: Boolean,
  124. default: () => {},
  125. },
  126. formData: {
  127. type: Object,
  128. default: () => {},
  129. },
  130. sourceCategories: {
  131. type: Array,
  132. default: () => [],
  133. },
  134. });
  135. const sourceRule = ref({
  136. sourceName: [{ validate: sourceValidator, trigger: "blur" }],
  137. });
  138. function sourceValidator(rule, value, callback) {
  139. if (formData.value.sourceCategoryName === "") {
  140. callback(new Error("来源类型不能为空"));
  141. return;
  142. }
  143. if (
  144. formData.value.referrerDataSource !== "" &&
  145. formData.value.sourceName === ""
  146. ) {
  147. callback(new Error("来源不能为空"));
  148. return;
  149. }
  150. return callback();
  151. }
  152. const DialogCustomerChoiceRef = ref(null);
  153. const DialogChannelChoiceRef = ref(null);
  154. const DialogEmployeeChoiceRef = ref(null);
  155. const { editStatus, formData, sourceCategories } = toRefs(props);
  156. const data = reactive({
  157. placeholderValue: "请先选择左侧",
  158. sourceCategoryId: "",
  159. sourceName: "",
  160. currentSource: {},
  161. });
  162. const { placeholderValue, sourceCategoryId, sourceName, currentSource } =
  163. toRefs(data);
  164. watch(
  165. () => formData.value.sourceCategoryId,
  166. (val) => {
  167. // console.log(formData.value.sourceCategoryId)
  168. sourceCategoryId.value = val;
  169. // formData.value.sourceId = null
  170. // formData.value.sourceName = ''
  171. handlerSelectCategory();
  172. }
  173. );
  174. watch(
  175. () => formData.value.sourceName,
  176. (val) => {
  177. sourceName.value = val;
  178. // console.log(sourceName.value)
  179. }
  180. );
  181. function handleSelectEmployee(item) {
  182. // 根据选择id获取数据
  183. if (currentSource.value.referrerDataSource === "channel") {
  184. formData.value.sourceName = item.name;
  185. formData.value.sourceId = item.id;
  186. } else if (currentSource.value.referrerDataSource === "employee") {
  187. formData.value.sourceName = item.nickName;
  188. formData.value.sourceId = item.userId;
  189. } else if (currentSource.value.referrerDataSource === "company") {
  190. formData.value.sourceName = item.name;
  191. formData.value.sourceId = item.id;
  192. }
  193. }
  194. function handlerChangeCategory(value) {
  195. formData.value.sourceId = null;
  196. formData.value.sourceName = "";
  197. handlerSelectCategory();
  198. }
  199. function handlerSelectCategory() {
  200. formData.value.sourceCategoryId = sourceCategoryId.value;
  201. formData.value.referrerDataSource = currentSource.value.referrerDataSource;
  202. const index = sourceCategories.value.findIndex(
  203. (l) => l.id === sourceCategoryId.value
  204. );
  205. currentSource.value = index >= 0 ? sourceCategories.value[index] : {};
  206. var item = sourceCategories.value.find(
  207. (emp) => emp.id === sourceCategoryId.value
  208. );
  209. if (item) {
  210. formData.value.sourceCategoryName = item.title;
  211. formData.value.referrerDataSource = item.referrerDataSource;
  212. // placeholderValue.value = item.title + "名称";
  213. }
  214. // // 咋整都要清理 右侧
  215. // sourceName.value = "";
  216. }
  217. /** 输入框输出建议 */
  218. function querySearchAsync(queryString, cb) {
  219. console.log("输出建议", currentSource.value);
  220. // 根据选择id获取数据
  221. if (currentSource.value.referrerDataSource === "channel") {
  222. const query = { name: queryString };
  223. listChannel(query).then((res) => {
  224. cb(res.rows);
  225. });
  226. } else if (currentSource.value.referrerDataSource === "employee") {
  227. const query = { keyword: queryString };
  228. listUser(query).then((res) => {
  229. cb(res.rows);
  230. });
  231. } else if (currentSource.value.referrerDataSource === "company") {
  232. const query = { keyword: queryString };
  233. listCompany(query).then((res) => {
  234. cb(res.rows);
  235. });
  236. }
  237. }
  238. function handlerInputOpen() {
  239. // 根据选择id,打开对话框
  240. if (currentSource.value.referrerDataSource === "channel") {
  241. DialogChannelChoiceRef.value.open();
  242. } else if (currentSource.value.referrerDataSource === "employee") {
  243. DialogEmployeeChoiceRef.value.open();
  244. } else if (currentSource.value.referrerDataSource === "company") {
  245. DialogCustomerChoiceRef.value.open();
  246. }
  247. }
  248. function simpleSelectedEmployee(_info) {
  249. sourceName.value = _info.nickName;
  250. formData.value.sourceId = _info.userId;
  251. formData.value.sourceName = _info.nickName;
  252. // proxy.$refs.DialogEmployeeChoice.close()
  253. }
  254. function simpleSelectedCustomer(_info) {
  255. sourceName.value = _info.name;
  256. formData.value.sourceId = _info.id;
  257. formData.value.sourceName = _info.name;
  258. // proxy.$refs.DialogCustomerChoice.close()
  259. }
  260. function simpleSelectedChannel(_info) {
  261. sourceName.value = _info.name;
  262. formData.value.sourceId = _info.id;
  263. formData.value.sourceName = _info.name;
  264. // proxy.$refs.DialogChannelChoice.close()
  265. }
  266. function simpleSelectedDepart(_info) {
  267. sourceName.value = _info.employeeName;
  268. formData.value.sourceId = _info.employeeId;
  269. formData.value.sourceName = _info.employeeName;
  270. // proxy.$refs.DialogDepartmentEmployeeChoice.close()
  271. }
  272. function reset() {
  273. sourceCategoryId.value = null;
  274. sourceName.value = "";
  275. formData.value.sourceId = null;
  276. formData.value.sourceName = "";
  277. formData.value.sourceCategoryId = null;
  278. }
  279. function setForm(form) {
  280. formData.value = form;
  281. }
  282. function sourceable() {
  283. return currentSource.value.referrerDataSource !== "";
  284. }
  285. defineExpose({
  286. reset,
  287. setForm,
  288. });
  289. </script>