mixin.js 13 KB

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