mixin.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531
  1. import {
  2. researcherList,
  3. telTypes,
  4. addActivity,
  5. editActivity,
  6. companyInfo
  7. } from '@/api/roadshow/index.js';
  8. import { getDefaultOption } from './common.js';
  9. import { validateForm } from '../utils/validate.js';
  10. import { areaList } from '../utils/area.js';
  11. const moment = require('../utils/_moment.js');
  12. moment.locale('zh-cn');
  13. export default {
  14. data() {
  15. return {
  16. edit_id: '',//编辑活动id
  17. edit_rs_id: '',//编辑人id
  18. formData: {
  19. activityType: '',
  20. activityClass: '', // 活动类别
  21. roadshowType: '', // 路演/会议 形式
  22. roadshowPlatform: '', // 路演/会议 平台
  23. roadshowCity: '', // 路演/会议城市
  24. companyId: 0, // 客户id
  25. companyName: '', // 客户名称
  26. meetingTheme: '', // 会议主题
  27. partnersName: '', // 合作方名称
  28. selectResearchers: [
  29. {
  30. researcherId: '',
  31. startTime: '',
  32. endTime: '',
  33. }
  34. ], // 选择的研究员
  35. },
  36. isActivityPicker: false, //活动类型弹窗
  37. isResearcherPicker: false, //研究员弹窗
  38. isTimePicker: false, //时间弹窗
  39. isAreaPicker: false, //地区弹窗
  40. isRoadshowTypePicker: false, //路演/会议形式弹窗
  41. isActivityClassPicker: false,//活动类别弹窗
  42. rs_picker: {
  43. firstindex:0,
  44. id:[],//选择研究员块级标识
  45. },
  46. pickerForm: {
  47. time: '',//时间默认
  48. area:'',//地区默认
  49. }, //picker的默认选中
  50. selectObj: {}, //选中的日期信息 下标
  51. selectRsIndex: '', //选中的研究员下标
  52. // weekMap: new Map([
  53. // ['1','周一'],
  54. // ['2','周二'],
  55. // ['3','周三'],
  56. // ['4','周四'],
  57. // ['5','周五'],
  58. // ['6','周六'],
  59. // ['7','周日']
  60. // ]),
  61. activiytyTypes: [],//活动类型
  62. researcherList: [],//研究员列表
  63. telTypeList: [],//电话会类别
  64. areaList,//地区数据
  65. companyInfo: null,//客户信息
  66. }
  67. },
  68. computed: {
  69. /* 动态前缀 路演/会议 */
  70. dynamic_prefix() {
  71. return this.formData.activityType === '路演' ? '路演' : '会议';
  72. },
  73. // 新增的研究员的索引数组
  74. addResearchersIdx() {
  75. return this.formData.selectResearchers.map((item, index) => index).slice(1);
  76. },
  77. },
  78. watch: {
  79. },
  80. methods: {
  81. /* 获取研究员列表 */
  82. async getResearcherList() {
  83. const res = await researcherList();
  84. if (res.code !== 200) return
  85. this.researcherList = res.data.map(group => ({
  86. ...group,
  87. text: group.GroupName,
  88. children: group.ResearcherList ? group.ResearcherList.map(child => ({
  89. ...child,
  90. text: child.RealName,
  91. id: child.AdminId
  92. })) : []
  93. }));
  94. },
  95. /* 获取客户信息 */
  96. async getCompanyInfo() {
  97. const res = await companyInfo({
  98. CompanyId: this.formData.companyId,
  99. EnglishCompany:this.formData.englishCompany
  100. })
  101. if(res.code !== 200) return
  102. this.companyInfo = res.data;
  103. this.formData.companyName = res.data.CompanyName;
  104. },
  105. /* 获取电话会类别 */
  106. async getTelType() {
  107. const { code,data } = await telTypes();
  108. if (code !== 200) return
  109. this.telTypeList = data[0].ChildList.map(_ => _.ActivityTypeName);
  110. },
  111. /* 新增活动成功后操作 */
  112. addActivityLink({text,content,link,query}) {
  113. uni.showModal({
  114. title:text,
  115. content,
  116. confirmText:'去查看',
  117. cancelColor: '#A9AFB8',
  118. confirmColor: '#3385FF',
  119. success: function(res) {
  120. if(res.confirm){
  121. uni.redirectTo({
  122. url:`${link}?type=${query.type}`,
  123. })
  124. }else {
  125. uni.navigateBack({
  126. delta:1
  127. })
  128. }
  129. }
  130. })
  131. },
  132. /* 提交表单 */
  133. async submitHandle() {
  134. console.log(this.formData)
  135. let isCheck = validateForm(this.formData.activityType,this.formData);
  136. console.log(isCheck)
  137. if(!isCheck) return
  138. let parmas;
  139. const param_research = ['公开会议', '路演'].includes(
  140. this.formData.activityType
  141. ) ?
  142. this.formData.selectResearchers.map((item) => ({
  143. ResearcherId: Number(item.researcherId),
  144. ResearcherName: this.findName(item.researcherId),
  145. StartDate: moment(item.startTime).format('YYYY-MM-DD'),
  146. EndDate: moment(item.endTime).format('YYYY-MM-DD'),
  147. StartTime: moment(item.startTime).format('HH:mm:ss'),
  148. EndTime: moment(item.endTime).format('HH:mm:ss'),
  149. StartWeek: moment(item.startTime).format('ddd'),
  150. EndWeek: moment(item.endTime).format('ddd'),
  151. })) :
  152. this.formData.selectResearchers[0].researcherId.map((item) => ({
  153. ResearcherId: Number(item),
  154. ResearcherName: item === 99 ? 'ficc全体' : this.findName(item),
  155. StartDate: moment(
  156. this.formData.selectResearchers[0].startTime
  157. ).format('YYYY-MM-DD'),
  158. EndDate: moment(
  159. this.formData.selectResearchers[0].endTime
  160. ).format('YYYY-MM-DD'),
  161. StartTime: moment(
  162. this.formData.selectResearchers[0].startTime
  163. ).format('HH:mm:ss'),
  164. EndTime: moment(
  165. this.formData.selectResearchers[0].endTime
  166. ).format('HH:mm:ss'),
  167. StartWeek: moment(this.formData.selectResearchers[0].startTime).format('ddd'),
  168. EndWeek: moment(this.formData.selectResearchers[0].endTime).format('ddd'),
  169. }));
  170. parmas = {
  171. ActivityType: this.formData.activityType,
  172. ActivityCategory: this.formData.activityClass,
  173. City: this.formData.roadshowCity[1],
  174. Province: this.formData.roadshowCity[0],
  175. CooperationName: this.formData.partnersName,
  176. Theme: this.formData.meetingTheme,
  177. RoadshowType: this.formData.roadshowType,
  178. RoadshowPlatform: this.formData.roadshowPlatform,
  179. CompanyId: this.formData.companyId || 0,
  180. CompanyName: this.formData.companyName || '',
  181. ResearcherList: param_research,
  182. EnglishCompany:this.formData.englishCompany
  183. };
  184. // console.log(parmas);
  185. const res = this.edit_id ?
  186. await editActivity({
  187. ...parmas,
  188. RsCalendarId: Number(this.edit_id),
  189. RsCalendarResearcherId: Number(this.edit_rs_id),
  190. EditType: ['公开会议', '路演'].includes(this.formData.activityType) ? 2 : 1
  191. }) : await addActivity(parmas);
  192. if (res.code !== 200) return;
  193. const { text,content,link,query } = this.setDynamicLink(this.formData.activityType);
  194. this.edit_id ? uni.showToast({
  195. title: '提交成功',
  196. icon: 'success'
  197. }) : this.addActivityLink({text,content,link,query});
  198. this.edit_id && setTimeout(() => {
  199. this.cancelHandle();
  200. },1500);
  201. },
  202. /* 添加研究员 */
  203. addResearcherHandle() {
  204. const {
  205. startTime,
  206. endTime
  207. } =
  208. this.formData.selectResearchers[0]; //默认添加时间同步
  209. this.formData.selectResearchers.push({
  210. researcherId: null,
  211. startTime,
  212. endTime,
  213. });
  214. },
  215. // 删除研究员
  216. delResearcherHandle(index) {
  217. this.formData.selectResearchers.splice(index, 1);
  218. },
  219. /* 取消 */
  220. cancelHandle() {
  221. uni.navigateBack({
  222. delta:1
  223. })
  224. },
  225. findName(id) {
  226. const flat_arr = JSON.parse(JSON.stringify(this.researcherList))
  227. .map((item) => item.ResearcherList || [])
  228. .flat(Infinity);
  229. return flat_arr.find((user) => user.AdminId === id)
  230. ? flat_arr.find((user) => user.AdminId === id).RealName
  231. : '';
  232. },
  233. /* 选择活动 */
  234. confirmActivityType({detail}) {
  235. this.formData.activityType = detail.value;
  236. this.initOtherForm();
  237. this.isActivityPicker = false;
  238. },
  239. /* 切换类型时重置部分表单 */
  240. initOtherForm() {
  241. const {
  242. RoleTypeCode
  243. } = JSON.parse(uni.getStorageSync('userInfo')) || null;
  244. const {
  245. defaultActivityType,
  246. activityTypeList,
  247. startTime,
  248. endTime
  249. } = getDefaultOption(RoleTypeCode, 2);
  250. this.formData.roadshowType = '';
  251. this.formData.roadshowPlatform = '';
  252. this.formData.roadshowCity = '';
  253. this.formData.companyId = 0;
  254. this.formData.companyName = '';
  255. this.formData.meetingTheme = '';
  256. this.formData.partnersName = '';
  257. this.formData.activityClass = '';
  258. this.companyInfo = '';
  259. // 选择研究员后进入的页面不重置默认研究员
  260. let pages = getCurrentPages();
  261. let route = pages[pages.length-1].route;
  262. if(route === 'pages-roadshow/addActivity/byCell') {
  263. this.formData.selectResearchers = ['内部会议','报告电话会'].includes(this.formData.activityType)
  264. ? [{
  265. researcherId: [ this.defaultResearcher[0].researcherId ],
  266. startTime: this.defaultResearcher[0].startTime,
  267. endTime: this.defaultResearcher[0].endTime
  268. }]
  269. : this.defaultResearcher;
  270. } else {
  271. this.formData.selectResearchers = [{
  272. researcherId: '',
  273. startTime: startTime,
  274. endTime: endTime,
  275. }];
  276. }
  277. },
  278. /* 选择活动类别 */
  279. confirmActivityClass({detail}) {
  280. this.formData.activityClass = detail.value;
  281. this.isActivityClassPicker = false;
  282. },
  283. /* 前往客户搜索 */
  284. goSearchCompany() {
  285. uni.navigateTo({
  286. url: `/pages-approve/search/index?type=roadshow`
  287. })
  288. },
  289. /* 选择研究员弹窗展开 */
  290. clickRsChoose(index,type='') {
  291. if((this.edit_id && ['路演','公开会议'].includes(this.formData.activityType)) || type) return;
  292. this.isResearcherPicker = true;
  293. console.log(this.formData.selectResearchers[index])
  294. // return
  295. this.selectRsIndex = index;
  296. this.rs_picker= {
  297. firstindex:0,
  298. id: this.formData.selectResearchers[index].researcherId ?
  299. (['路演','公开会议'].includes(this.formData.activityType) ?
  300. this.formData.selectResearchers[index].researcherId :
  301. this.formData.selectResearchers[index].researcherId.map(item => item))
  302. : []//选择研究员块级标识
  303. }
  304. },
  305. /* 选择研究员分组 */
  306. clickFirstHandle({detail}) {
  307. this.rs_picker.firstindex = detail.index;
  308. },
  309. /* 选择研究员项 路演 公开会议为单选 其余多选*/
  310. clickItemHandle({detail}) {
  311. const { activityType } = this.formData;
  312. if(['内部会议', '报告电话会'].includes(activityType)) {
  313. let index = this.rs_picker.id.indexOf(detail.AdminId);
  314. index > -1 ? this.rs_picker.id.splice(index, 1) : this.rs_picker.id.push(detail.AdminId);
  315. }else {
  316. this.rs_picker.id = detail.AdminId;
  317. }
  318. },
  319. /* 取消选择研究员 */
  320. cancelResearcher() {
  321. this.rs_picker = {
  322. firstindex: 0,
  323. id: []
  324. }
  325. this.isResearcherPicker = false;
  326. },
  327. /* 选择研究员确认 */
  328. confirmResearcher() {
  329. console.log('确认选择')
  330. this.formData.selectResearchers[this.selectRsIndex].researcherId = this.rs_picker.id;
  331. this.isResearcherPicker = false;
  332. },
  333. /* 研究员显示格式化为名字 */
  334. formatRsLable(arr) {
  335. if(!arr) return '';
  336. if( arr instanceof Array ) {
  337. return arr.map(item => {
  338. return this.findName(item)
  339. })
  340. }else {
  341. return this.findName(arr)
  342. }
  343. },
  344. /* 选择路演/会议形式 重置城市平台 */
  345. confirmRoadshowType({
  346. detail
  347. }) {
  348. this.formData.roadshowType = detail.value;
  349. this.formData.roadshowPlatform = '';
  350. this.formData.roadshowCity = '';
  351. this.isRoadshowTypePicker = false;
  352. },
  353. /* 选择地区弹窗 */
  354. clickAreaChoose() {
  355. const city = this.formData.roadshowCity.length ? this.formData.roadshowCity[1] : '';
  356. let cityCode = '';
  357. if(city) for(let i in this.areaList.city_list) {
  358. if(this.areaList.city_list[i] === city){
  359. cityCode = String(i);
  360. break;
  361. }
  362. }
  363. // console.log(cityCode)
  364. this.pickerForm.area = cityCode;
  365. this.isAreaPicker = true
  366. },
  367. /* 选择地区 */
  368. confirmArea({detail}) {
  369. const { values } = detail;
  370. this.formData.roadshowCity = values.map(item => item.name);
  371. this.isAreaPicker = false;
  372. },
  373. /* 点击选择时间 */
  374. clickTimeChoose(index, type) {
  375. console.log(this.formData.selectResearchers[index])
  376. this.pickerForm.time = type === 'start' ? this.formData.selectResearchers[index].startTime : this.formData.selectResearchers[index].endTime;
  377. this.selectObj = {
  378. index,
  379. type
  380. }
  381. setTimeout(() => {
  382. this.isTimePicker = true;
  383. })
  384. },
  385. /* 选择时间 */
  386. confirmTime({detail}) {
  387. // console.log(val)
  388. const {
  389. index,
  390. type
  391. } = this.selectObj;
  392. if (type === 'start') {
  393. this.formData.selectResearchers[index].startTime = detail;
  394. } else {
  395. this.formData.selectResearchers[index].endTime = detail;
  396. }
  397. this.isTimePicker = false;
  398. this.pickerForm.time = '';
  399. },
  400. /* 添加完成后 拼接动态内容 */
  401. setDynamicLink(type) {
  402. switch (type) {
  403. case '内部会议' : return {
  404. text: '添加成功,已加入研究员日历',
  405. content: `可前往【我的日历】-【${type}】查看`,
  406. link: '/pages-approve/activity/list',
  407. query: {
  408. type
  409. },
  410. }
  411. case '报告电话会' : return {
  412. text: '添加成功,已加入研究员日历',
  413. content: `可前往【我的日历】-【${type}】查看`,
  414. link: '/pages-approve/activity/list',
  415. query: {
  416. type
  417. },
  418. }
  419. case '路演' : return {
  420. text: '活动申请已提交,请等待研究员处理',
  421. content: `可前往【我的日历】-【活动申请】查看`,
  422. link: '/pages-approve/activity/list',
  423. query: {
  424. type: '活动申请'
  425. },
  426. }
  427. case '公开会议' : return {
  428. text: '活动申请已提交,请等待研究员处理',
  429. content: `可前往【我的日历】-【活动申请】查看`,
  430. link: '/pages-approve/activity/list',
  431. query: {
  432. type: '活动申请'
  433. },
  434. }
  435. }
  436. },
  437. /* 绑定input输入value */
  438. bindInputHandle(key,{detail}) {
  439. this.formData[key] = detail;
  440. },
  441. /* 格式化时间显示 */
  442. formatterLabelTime(val) {
  443. if(!val) return '';
  444. const date = moment(val).format('MM.DD(ddd) HH:mm');
  445. return date;
  446. },
  447. /* 格式化弹窗时间显示 */
  448. formatterPickerTime(type, val) {
  449. switch (type) {
  450. case 'year':
  451. return val + '年';
  452. case 'month':
  453. return val + '月';
  454. case 'day':
  455. return val + '日';
  456. case 'hour':
  457. return val + '时';
  458. case 'minute':
  459. return val + '分';
  460. }
  461. }
  462. }
  463. }