assignPage.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. <template>
  2. <div class="bgcolor assignPage">
  3. <div class="navBarTOP">
  4. <van-nav-bar class="navBar" left-arrow :title="title" @click-left="onClickLeft" />
  5. </div>
  6. <div class="lineGrey"></div>
  7. <div class="lineGrey"></div>
  8. <div class="lineGrey"></div>
  9. <div class="lineGrey"></div>
  10. <div class="lineGrey"></div>
  11. <!-- 客资详情 -->
  12. <assignAwaitDetail :infoData="infoData" :source="'assignPage'"></assignAwaitDetail>
  13. <!-- 选择分配组织 -->
  14. <div class="assign">
  15. <van-form validate-first @failed="onFailed" @submit="onSubmit" :show-error="false">
  16. <van-field
  17. readonly
  18. clickable
  19. name="picker"
  20. :value="assignTypeValue"
  21. label="客资类型"
  22. placeholder="点击选择客资类型"
  23. right-icon="arrow"
  24. :rules="[{ required: true, message: '请选择客资类型' }]"
  25. @click="showPicker = true" />
  26. <van-field
  27. v-if="activaAssignTypeItem && activaAssignTypeItem.dictValue != 1"
  28. readonly
  29. clickable
  30. name="picker"
  31. :value="assignUserPostValue"
  32. label="分配人员岗位"
  33. placeholder="点击选择分配人员岗位"
  34. right-icon="arrow"
  35. :rules="[{ required: true, message: '请选择分配人员岗位' }]"
  36. @click="assignUserPostShow = true" />
  37. <van-field
  38. readonly
  39. clickable
  40. name="picker"
  41. :value="assignUserValue"
  42. label="分配人员"
  43. placeholder="点击选择分配人员"
  44. right-icon="arrow"
  45. :rules="[{ required: true, message: '请选择分配人员' }]"
  46. @click="assignUserShow = true" />
  47. <div style="margin: 16px">
  48. <van-button round block type="info" native-type="submit">提交</van-button>
  49. </div>
  50. </van-form>
  51. </div>
  52. <!-- 类型选择 -->
  53. <van-popup v-model="showPicker" position="bottom">
  54. <van-picker
  55. show-toolbar
  56. value-key="dictLabel"
  57. :columns="assignTypeData"
  58. @confirm="onConfirm"
  59. @cancel="showPicker = false" />
  60. </van-popup>
  61. <!-- 分配人员岗位 -->
  62. <van-popup v-model="assignUserPostShow" position="bottom">
  63. <van-picker
  64. show-toolbar
  65. value-key="postName"
  66. :columns="assignUserPostData"
  67. @confirm="onConfirmAssignUserPost"
  68. @cancel="assignUserPost = false" />
  69. </van-popup>
  70. <!-- 分配人员选择 -->
  71. <van-popup v-model="assignUserShow" position="bottom">
  72. <van-picker
  73. show-toolbar
  74. value-key="nickName"
  75. :columns="assignUserData"
  76. @confirm="onConfirmAssignUser"
  77. @cancel="assignUserShow = false" />
  78. </van-popup>
  79. </div>
  80. </template>
  81. <script>
  82. import { getCustomerClueInfoById } from '@/api/clew';
  83. import { getDictOption } from '@/api/index';
  84. import assignAwaitDetail from './assignAwaitDetail.vue';
  85. import {
  86. selectUserListByCustomerType,
  87. selectUserListByPostName,
  88. allocationCustomer,
  89. } from '@/api/assignAwait';
  90. export default {
  91. name: 'assignPage',
  92. components: {
  93. assignAwaitDetail,
  94. },
  95. data() {
  96. return {
  97. id: '',
  98. infoData: {},
  99. collectionItemList: [],
  100. showPicker: false,
  101. assignUserPostShow: false,
  102. assignUserShow: false,
  103. columns: [],
  104. valueKey: '',
  105. assignTypeData: [], //客资类型下拉选数据
  106. activaAssignTypeItem: null, //客资类型当前选择的数据
  107. assignTypeValue: '', //客资类型选中value
  108. assignUserPostData: [], //分配人员岗位下拉选数据
  109. assignUserPostItem: null, //分配人员岗位当前选择的数据
  110. assignUserPostValue: '', //分配人员岗位选中value
  111. assignUserData: [], //分配人员下拉选数据
  112. assignUserItem: null, //分配人员当前选择的数据
  113. assignUserValue: '', //分配人员选中value
  114. title: '',
  115. };
  116. },
  117. watch: {
  118. 'activaAssignTypeItem.dictValue': {
  119. handler(val) {
  120. if (val) this.getSelectUserListByCustomerType();
  121. },
  122. },
  123. 'assignUserPostItem.postName': {
  124. handler(val) {
  125. if (val) this.getSelectUserListByPostName();
  126. },
  127. deep: true,
  128. },
  129. },
  130. activated() {
  131. this.id = this.$route.query.id;
  132. this.getCustomerClueInfoById();
  133. },
  134. methods: {
  135. async getDictOptionFun() {
  136. // 获取字典(jz_customer_type)参数对应的备注值,如果选择大型装企直接返回用户表列表
  137. let customer = await getDictOption({}, 'jz_customer_type');
  138. if (customer.data && customer.data.length) {
  139. this.assignTypeData = customer.data;
  140. this.activaAssignTypeItem = this.assignTypeData[0];
  141. this.assignTypeValue = this.activaAssignTypeItem.dictLabel;
  142. } else {
  143. this.assignTypeData = [];
  144. this.activaAssignTypeItem = null;
  145. this.assignTypeValue = '';
  146. }
  147. },
  148. getSelectUserListByCustomerType() {
  149. let params = JSON.parse(this.activaAssignTypeItem.remark);
  150. selectUserListByCustomerType(params).then((res) => {
  151. if (res.code == 200) {
  152. // 如果选择大型装企直接返回用户表列表
  153. if (this.activaAssignTypeItem.dictValue == 1) {
  154. if (res.data && res.data.userList.length) {
  155. let userList = res.data.userList;
  156. if (this.assignTypeValue != '大型装企') {
  157. let userListFilter = userList.filter(
  158. (item) => item.nickName.indexOf(this.infoData.companyName) != -1
  159. );
  160. this.assignUserData = userListFilter || [];
  161. } else {
  162. this.assignUserData = userList;
  163. }
  164. if (this.assignUserData.length) {
  165. this.assignUserItem = this.assignUserData[0];
  166. this.assignUserValue = this.assignUserItem.nickName;
  167. } else {
  168. this.assignUserData = [];
  169. this.assignUserItem = null;
  170. this.assignUserValue = '';
  171. }
  172. } else {
  173. this.assignUserData = [];
  174. this.assignUserItem = null;
  175. this.assignUserValue = '';
  176. }
  177. } else {
  178. if (res.data && res.data.postList.length) {
  179. let resData = [];
  180. res.data.postList.forEach((val) => {
  181. resData.push({
  182. postName: val,
  183. });
  184. });
  185. this.assignUserPostData = resData;
  186. this.assignUserPostItem = this.assignUserPostData[0];
  187. this.assignUserPostValue = this.assignUserPostItem.postName;
  188. } else {
  189. this.assignUserPostData = [];
  190. this.assignUserPostItem = null;
  191. this.assignUserPostValue = '';
  192. }
  193. }
  194. } else {
  195. this.$toast(res.msg);
  196. }
  197. });
  198. },
  199. getSelectUserListByPostName() {
  200. selectUserListByPostName({ postName: this.assignUserPostValue }).then((res) => {
  201. if (res.code == 200) {
  202. if (res.data && res.data.userList.length) {
  203. let userList = res.data.userList;
  204. if (this.assignTypeValue != '大型装企') {
  205. let userListFilter = userList.filter(
  206. (item) => item.nickName.indexOf(this.infoData.companyName) != -1
  207. );
  208. this.assignUserData = userListFilter || [];
  209. } else {
  210. this.assignUserData = userList;
  211. }
  212. if (this.assignUserData.length) {
  213. this.assignUserItem = this.assignUserData[0];
  214. this.assignUserValue = this.assignUserItem.nickName;
  215. } else {
  216. this.assignUserData = [];
  217. this.assignUserItem = null;
  218. this.assignUserValue = '';
  219. }
  220. } else {
  221. this.assignUserData = [];
  222. this.assignUserItem = null;
  223. this.assignUserValue = '';
  224. }
  225. } else {
  226. this.$toast(res.msg);
  227. }
  228. });
  229. },
  230. getCustomerClueInfoById() {
  231. this.id = this.$route.query.id;
  232. this.collectionAnswerlisd = [];
  233. this.collectionItemList = [];
  234. getCustomerClueInfoById({ customerClueInfoId: this.id }).then((response) => {
  235. if (response.code == 200) {
  236. this.infoData = response.data;
  237. this.title = response.data.name;
  238. if (response.data.customerClue != null) {
  239. this.collectionItemList = response.data.customerClue.customerClueItemList;
  240. } else {
  241. this.collectionItemList = [];
  242. }
  243. // 当前客资是否已经被分配
  244. if (this.infoData.allocationStatus == 1) {
  245. this.$dialog
  246. .confirm({
  247. title: '提示',
  248. message: '该客资已经被分配',
  249. showCancelButton: false,
  250. })
  251. .then(() => {
  252. window.location.replace(window.location.origin + '/mobile/assignAwait');
  253. });
  254. }
  255. this.getDictOptionFun();
  256. } else {
  257. this.$toast(res.msg);
  258. }
  259. });
  260. },
  261. onSubmit() {
  262. this.toastLoading(0, '加载中...', true);
  263. allocationCustomer({
  264. userId: this.assignUserItem.userId || '', // string 用户ID
  265. customerClueInfoId: this.id, // string 客资主键ID
  266. customerClassify: this.activaAssignTypeItem.dictValue || '', // string 客资类型,(取值页面字典选择的值 jz_customer_type)
  267. }).then((res) => {
  268. this.toastLoading().clear();
  269. if (res.code == 200) {
  270. this.$toast(res.msg);
  271. window.location.replace(window.location.origin + '/mobile/assignAwait');
  272. } else {
  273. this.$toast(res.msg);
  274. }
  275. });
  276. },
  277. // 校验错误返回信息
  278. onFailed(errorInfo) {
  279. console.log('failed', errorInfo);
  280. },
  281. onConfirm(value) {
  282. this.activaAssignTypeItem = value;
  283. this.assignTypeValue = this.activaAssignTypeItem.dictLabel;
  284. this.showPicker = false;
  285. },
  286. onConfirmAssignUserPost(value) {
  287. this.assignUserPostItem = value;
  288. this.assignUserPostValue = this.assignUserPostItem.postName;
  289. this.assignUserPostShow = false;
  290. },
  291. onConfirmAssignUser(value) {
  292. this.assignUserItem = value;
  293. this.assignUserValue = this.assignUserItem.nickName;
  294. this.assignUserShow = false;
  295. },
  296. onClickLeft() {
  297. this.$router.go(-1);
  298. },
  299. },
  300. };
  301. </script>
  302. <style scoped lang="scss">
  303. .assignPage {
  304. }
  305. </style>
  306. <style lang="scss">
  307. .assignPage {
  308. .van-field__label {
  309. width: 100px;
  310. &::before {
  311. content: '*';
  312. color: red;
  313. }
  314. }
  315. }
  316. </style>