SelectCustomer.vue 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397
  1. <!--客户-->
  2. <template>
  3. <div class="dis-inline">
  4. <el-select
  5. :value="value"
  6. :placeholder="placeholder"
  7. :clearable="clearable"
  8. filterable
  9. remote
  10. :size="size"
  11. :multiple="multiple"
  12. :disabled="disabled"
  13. :remote-method="remoteMethod"
  14. :loading="loading"
  15. :style="{ width: `${Number(width) + 30}px` }"
  16. @change="selChange"
  17. @clear="clearChange"
  18. >
  19. <el-option
  20. v-for="(item, index) in customer_list"
  21. :key="index"
  22. :label="item.name"
  23. :value="item.name"
  24. ></el-option>
  25. </el-select>
  26. <span class="sel-btn" @click="openVisible">
  27. <i class="el-icon-search"></i>
  28. </span>
  29. <el-dialog
  30. title="客户列表"
  31. :visible="customer_show"
  32. width="60%"
  33. :modal="modal"
  34. :close-on-press-escape="false"
  35. :close-on-click-modal="false"
  36. @close="visibleCancel"
  37. >
  38. <el-form size="small" inline>
  39. <el-form-item>
  40. <el-input
  41. v-model="search_form.keyword"
  42. placeholder="客户名称/手机号"
  43. clearable
  44. @keyup.enter.native="pageChange(1)"
  45. @clear="pageChange(1)"
  46. >
  47. <el-button
  48. slot="append"
  49. icon="el-icon-search"
  50. @click="pageChange(1)"
  51. ></el-button>
  52. </el-input>
  53. </el-form-item>
  54. <!--<el-form-item label="区域">
  55. <RegionSelect
  56. v-model="region"
  57. size="small"
  58. clearable
  59. @change="regionChange"
  60. />
  61. </el-form-item>-->
  62. <el-form-item v-if="systemType === 1">
  63. <SelectShop
  64. v-model="search_form.shopId"
  65. :clearable="true"
  66. placeholder="选择商铺"
  67. @clear="shopClear"
  68. @change="selShop"
  69. />
  70. </el-form-item>
  71. <el-form-item>
  72. <el-select
  73. v-model="search_form.salesManId"
  74. clearable
  75. placeholder="选择业务员"
  76. @change="pageChange(1)"
  77. >
  78. <el-option
  79. v-for="(item, index) in options"
  80. :key="index"
  81. :label="item.staffName"
  82. :value="item.id"
  83. ></el-option>
  84. </el-select>
  85. </el-form-item>
  86. <el-form-item>
  87. <RegionSelect
  88. v-model="region"
  89. style="width: 200px"
  90. size="small"
  91. clearable
  92. check-strictly
  93. placeholder="所属区域"
  94. @change="regionChange"
  95. />
  96. </el-form-item>
  97. <!--<el-form-item label="部门">
  98. <DepartmentSel v-model="department" clearable @change="selBranch" />
  99. </el-form-item>-->
  100. </el-form>
  101. <el-table
  102. :data="customer_list"
  103. size="small"
  104. @row-dblclick="dbSelect"
  105. @selection-change="customerSel"
  106. >
  107. <el-table-column prop="name" label="客户名称"></el-table-column>
  108. <el-table-column prop="mobile" label="联系电话">
  109. <template slot-scope="scope">
  110. {{ scope.row.mobile }}
  111. </template>
  112. </el-table-column>
  113. <el-table-column prop="customerType" label="客户类型"></el-table-column>
  114. <el-table-column
  115. prop="shopName"
  116. label="所属商铺"
  117. show-overflow-tooltip
  118. ></el-table-column>
  119. <el-table-column width="100" label="选择">
  120. <template slot-scope="scope">
  121. <el-button
  122. icon="el-icon-check"
  123. size="mini"
  124. @click="dbSelect(scope.row)"
  125. ></el-button>
  126. </template>
  127. </el-table-column>
  128. </el-table>
  129. <FooterPage
  130. layout="prev, pager, next, jumper"
  131. :page-size="pre_page"
  132. :total-page.sync="total"
  133. :current-page.sync="page"
  134. @pageChange="pageChange"
  135. @sizeChange="sizeChange"
  136. ></FooterPage>
  137. </el-dialog>
  138. </div>
  139. </template>
  140. <script>
  141. import {
  142. getAllCustomer,
  143. searchCustomer,
  144. CustomerInitialsSearch,
  145. } from "@/api/Customer";
  146. import RegionSelect from "@/component/common/RegionSelectJSON";
  147. import DepartmentSel from "@/component/common/DepartmentSel";
  148. import SelectShop from "@/component/goods/SelectShop.vue";
  149. import { mapGetters } from "vuex";
  150. import { getAllStaff } from "@/api/Department";
  151. export default {
  152. name: "SelectCustomer",
  153. components: {
  154. RegionSelect,
  155. // DepartmentSel,
  156. SelectShop,
  157. },
  158. model: {
  159. prop: "value",
  160. event: "change",
  161. },
  162. props: {
  163. value: {
  164. type: [Number, String, Array],
  165. default: "",
  166. },
  167. placeholder: {
  168. type: String,
  169. default: "请选择客户",
  170. },
  171. size: {
  172. type: String,
  173. default: "",
  174. },
  175. width: {
  176. type: [Number, String],
  177. default: "150",
  178. },
  179. isDefault: {
  180. type: Boolean,
  181. default: false,
  182. },
  183. clearable: {
  184. type: Boolean,
  185. default: true,
  186. },
  187. disabled: {
  188. type: Boolean,
  189. default: false,
  190. },
  191. isCheck: {
  192. type: Boolean,
  193. default: true,
  194. },
  195. enable: {
  196. type: Boolean,
  197. default: false,
  198. },
  199. multiple: {
  200. type: Boolean,
  201. default: false,
  202. },
  203. modal: {
  204. type: Boolean,
  205. default: true,
  206. },
  207. },
  208. data() {
  209. return {
  210. batchSetting: {
  211. region: "",
  212. },
  213. options: [],
  214. saleman: "", //业务员
  215. UserType: [
  216. {
  217. value: "1",
  218. label: "客户类型",
  219. },
  220. ],
  221. customerLabel: [
  222. {
  223. value: "选项1",
  224. label: "客户标签",
  225. },
  226. ],
  227. customer_list: [],
  228. customer_show: false,
  229. loading: false,
  230. total: 0,
  231. page: 1,
  232. pre_page: 10,
  233. region: [],
  234. department: [],
  235. shopId: "",
  236. search_form: {
  237. keyword: "",
  238. provinceCode: "",
  239. cityCode: "",
  240. districtCode: "",
  241. departmentId: "",
  242. salesManId: "",
  243. },
  244. };
  245. },
  246. computed: {
  247. ...mapGetters({
  248. systemType: "MUser/systemType",
  249. storeData: "MUser/storeData",
  250. }),
  251. },
  252. created() {
  253. this.getList();
  254. this.getAllStaff();
  255. },
  256. mounted() {
  257. // if (this.systemType === 2) {
  258. // this.shopId = this.storeData.id;
  259. // }
  260. },
  261. methods: {
  262. async getAllStaff(departmentId) {
  263. const data = await getAllStaff({
  264. page: 1,
  265. pageSize: 50,
  266. departmentId: departmentId,
  267. });
  268. this.options = data.data;
  269. },
  270. remoteMethod(query) {
  271. if (query !== "") {
  272. this.CustomerInitialsSearch(query);
  273. } else {
  274. this.getList();
  275. }
  276. },
  277. async CustomerInitialsSearch(condition) {
  278. const { data } = await CustomerInitialsSearch({
  279. condition: condition || "",
  280. });
  281. this.customer_list = data;
  282. },
  283. // 选择区域
  284. regionChange(val) {
  285. this.search_form.provinceCode = val[0];
  286. this.search_form.cityCode = val[1];
  287. this.search_form.districtCode = val[2];
  288. this.pageChange(1);
  289. },
  290. // 选择商铺
  291. selShop(val, row) {
  292. this.pageChange(1);
  293. },
  294. shopClear() {
  295. this.search_form.shopId = "";
  296. this.pageChange(1);
  297. },
  298. // 选择部门
  299. selBranch(val) {
  300. this.search_form.departmentId = val[val.length - 1];
  301. this.pageChange(1);
  302. },
  303. clearChange() {
  304. this.$emit("clear");
  305. },
  306. selChange(val) {
  307. if (!val) return;
  308. let row = [];
  309. if (!this.multiple) {
  310. row = this.customer_list.filter((item) => item.name === val);
  311. } else {
  312. row = this.customer_list.filter((item) => val === item.name);
  313. }
  314. // console.log(row)
  315. this.$emit("change", val, row);
  316. },
  317. async getList() {
  318. const params = {
  319. page: this.page,
  320. pageSize: this.pre_page,
  321. enableStatus: 5,
  322. status: 2,
  323. shopId: this.search_form.shopId,
  324. keyword: this.search_form.keyword,
  325. salesManId: this.search_form.salesManId,
  326. provinceCode: this.search_form.provinceCode,
  327. cityCode: this.search_form.cityCode,
  328. districtCode: this.search_form.districtCode,
  329. };
  330. const data = await getAllCustomer(params);
  331. this.loading = false;
  332. this.customer_list = data.data;
  333. this.total = data.pageTotal;
  334. this.$emit("getAllCustomer", data.data);
  335. if (this.isDefault) {
  336. this.$emit("default", data.data[0].id, data.data[0]);
  337. }
  338. },
  339. dbSelect(row) {
  340. this.selChange(row.name);
  341. this.visibleCancel();
  342. },
  343. customerSel(row) {
  344. this.selChange(row[0].name);
  345. this.visibleCancel();
  346. },
  347. // 改变页数
  348. pageChange(val) {
  349. this.page = val;
  350. this.getList();
  351. },
  352. sizeChange(val) {
  353. this.pre_page = val;
  354. this.pageChange(1);
  355. },
  356. visibleCancel() {
  357. this.customer_show = false;
  358. },
  359. openVisible() {
  360. if (this.disabled) return;
  361. this.customer_show = true;
  362. this.sizeChange(10);
  363. },
  364. },
  365. };
  366. </script>
  367. <style>
  368. .dis-inline .el-input--suffix .el-input__inner {
  369. padding-right: 46px !important;
  370. }
  371. </style>
  372. <style scoped lang="scss">
  373. .dis-inline {
  374. position: relative;
  375. .sel-btn {
  376. display: block;
  377. width: 25px;
  378. line-height: 32px;
  379. text-align: center;
  380. position: absolute;
  381. right: 5px;
  382. top: 50%;
  383. transform: translateY(-50%);
  384. cursor: pointer;
  385. color: #c0c4cc;
  386. font-size: 13px;
  387. vertical-align: middle;
  388. }
  389. }
  390. .search-wrp {
  391. padding-bottom: 10px;
  392. }
  393. </style>