jk_B.js 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732
  1. var app = getApp()
  2. var that;
  3. var animation;
  4. var setTime;
  5. Page({
  6. data: {
  7. users: [],
  8. items: [],
  9. animationInfo: '',
  10. isShowType: '',//是显示选择规则还是显示选择分类
  11. activeIndex: '',
  12. isArr: ['奖', '扣'],
  13. reviewerObj: [],//默认的审批人
  14. disabled: false,
  15. employeeList: [],//人员列表
  16. superior_list: [],//领导人员
  17. type: 'B',
  18. isGzType: 'BF',
  19. defaultRuleId: '',
  20. isCreator: false,//是否系统管理员
  21. popupCx: '',
  22. boxTop: 0,
  23. ruleOnoff: false,
  24. // 长连接结果
  25. results: [], //提交的返回结果集合
  26. isResult: false,
  27. percentage: 0,
  28. resultList: [],//要发送数据的集合
  29. resultIndex: 0,
  30. isShowError: false,
  31. errorList: [],
  32. isErrorShow: false,
  33. isBh:false,
  34. },
  35. onLoad(data) {
  36. that = this;
  37. this.cheakAx()
  38. this.setData({
  39. type: data.type,
  40. isGzType: data.type == "B" ? "BF" : "AF",
  41. isCreator: app.globalData.isCreator,
  42. items: [{//录入选项列表
  43. ticket_count:false,
  44. checked: true,//判断是否开启指定规则
  45. rule_id: '',//积分分类id
  46. rule_id2: '',
  47. rule_name: '',//积分分类名称
  48. item_id: 0,//积分细则id 不选可以为0
  49. point: '',//录入积分可为正负值,不能为0(细则)
  50. point2: '',//录入积分可为正负值,不能为0(分类)
  51. remark: '',//备注
  52. event_time: app.globalData.day,//事件时间
  53. pt_id: '',//积分种类id
  54. reviewer_id: '',//审核人ID
  55. revieweName: '',//审批人姓名(非传)
  56. files: '',//附件数组列表
  57. isArrindex: true,//奖扣索引(默认奖)(细则)
  58. isArrindex2: true,//奖扣索引(默认奖)(分类)
  59. selectRule: '',//选择的规则
  60. }],
  61. })
  62. if (data.type == "B") {
  63. dd.setNavigationBar({ title: "奖扣B分" });
  64. } else {
  65. dd.setNavigationBar({ title: "奖扣A分" });
  66. }
  67. },
  68. onPageScroll(e) {
  69. if (e.scrollTop != 0) {
  70. this.setData({
  71. boxTop: e.scrollTop
  72. })
  73. }
  74. },
  75. onShow() {
  76. animation = dd.createAnimation({
  77. duration: 200,
  78. timeFunction: "linear",
  79. });
  80. },
  81. // 页面被关闭
  82. onUnload() {
  83. app.globalData.socketApi.closewebsocket();
  84. },
  85. showText() {
  86. this.setData({ isBh: !this.data.isBh })
  87. },
  88. //显示图片
  89. showImg(e) {
  90. var index = e.target.dataset.index;
  91. var item = e.target.dataset.item
  92. dd.previewImage({
  93. current: index,
  94. urls: item
  95. });
  96. },
  97. //获取系统配置
  98. cheakAx() {
  99. app.$get("/api/integral/site/config").then((res) => {
  100. let data = res.data.data;
  101. if (data.specified_rule_item) {
  102. this.setData({
  103. ruleOnoff: data.specified_rule_item == 1 ? true : false
  104. })
  105. } else {
  106. this.setData({
  107. ruleOnoff: false
  108. })
  109. }
  110. })
  111. },
  112. //选择奖还是扣(细则)
  113. bindPickerChange(e) {
  114. var index = e.target.dataset.index;
  115. var isArrindex = `items[${index}].isArrindex`;
  116. var isTrue = that.data.items[index].isArrindex
  117. this.setData({
  118. [isArrindex]: !isTrue,
  119. });
  120. },
  121. //选择奖还是扣(分类)
  122. bindPickerChange2(e) {
  123. var index = e.target.dataset.index;
  124. var isArrindex2 = `items[${index}].isArrindex2`;
  125. var isTrue = that.data.items[index].isArrindex2
  126. this.setData({
  127. [isArrindex2]: !isTrue,
  128. });
  129. },
  130. //关闭规则
  131. onClose() {
  132. animation.translateY(1200).step();
  133. that.setData({
  134. isShowType: '',
  135. animationInfo: animation.export(),
  136. popupCx: '',
  137. });
  138. setTimeout(() => {
  139. dd.pageScrollTo({
  140. scrollTop: that.data.boxTop
  141. })
  142. }, 100)
  143. },
  144. //选择弹窗
  145. openSelect(e) {
  146. var num = e.target.dataset.num;
  147. var userData = this.data.users;
  148. var superior_list = this.data.superior_list;
  149. that.setData({ activeIndex: '', isShowType: '0' });
  150. if (num == 4) {
  151. if (userData.length == 0) {
  152. this.showToast('请先选择奖扣对象')
  153. return;
  154. }
  155. if (superior_list.length == 0) {
  156. this.showToast('你没有审批人,请联系管理员')
  157. return;
  158. }
  159. }
  160. if (e.target.dataset.ruleId) {
  161. that.setData({ defaultRuleId: e.target.dataset.ruleId });
  162. }
  163. if (e.target.dataset.item) {
  164. if (e.target.dataset.item.id) {
  165. that.setData({ reviewerObj: [e.target.dataset.item] });
  166. } else {
  167. that.setData({ reviewerObj: [] });
  168. }
  169. }
  170. animation.translateY(0).step();
  171. that.setData({
  172. isShowType: num,
  173. activeIndex: e.target.dataset.index,
  174. animationInfo: animation.export(),
  175. popupCx: 'container__mask',
  176. });
  177. },
  178. //删除图片
  179. deteleImg(e) {
  180. var { itemIndx, index } = e.target.dataset;
  181. var files = that.data.items[itemIndx].files;//获取itemS集合中对应的files
  182. var files_box = `items[${itemIndx}].files`;//
  183. app.globalData.arrRemoveObj(files, files[index]);
  184. that.setData({
  185. [files_box]: files
  186. });
  187. },
  188. // 清空内容
  189. deleteRemark(e) {
  190. var index2 = e.target.dataset.index;
  191. var remark = `items[${index2}].remark`;//
  192. that.setData({
  193. [remark]: ''
  194. });
  195. },
  196. //图片选择
  197. openImg(e) {
  198. var index2 = e.target.dataset.index;
  199. var files = that.data.items[index2].files;
  200. if (files.length >= 3) {
  201. app.globalData.showToast("只能上传三张");
  202. return false;
  203. }
  204. dd.chooseImage({
  205. count: 1,
  206. success: (res) => {
  207. that.postImg(res.filePaths[0], index2);
  208. },
  209. });
  210. },
  211. postImg(img_url, index) {
  212. var files_box = `items[${index}].files`;
  213. var files = this.data.items[index].files;
  214. dd.httpRequest({
  215. url: app.globalData.imgHttpUrl,
  216. method: 'POST',
  217. data: {
  218. md5: that.random_string(32),
  219. 'name': app.globalData.day
  220. },
  221. success: function (res) {
  222. if (app.globalData.userData.site_id) {
  223. var key = 'intesys/dd/' + app.globalData.userData.site_id + "/" + app.globalData.day + '/' + that.random_string(32) + '.png';
  224. } else {
  225. var key = 'intesys/dd/' + app.globalData.day + '/' + that.random_string(32) + '.png';
  226. }
  227. var obj = res.data.data;
  228. dd.uploadFile({
  229. url: app.globalData.ALIOSS_URL,
  230. fileType: 'image',
  231. fileName: 'file',
  232. filePath: img_url,
  233. formData: {
  234. key: key,
  235. policy: obj.policy,
  236. OSSAccessKeyId: obj.accessid,
  237. success_action_status: 200,
  238. signature: obj.signature
  239. },
  240. success: (res) => {
  241. if (res.statusCode == 200) {
  242. if (files.length > 0) {
  243. files.push('http://cdn.intesys.g107.com/' + key)
  244. } else {
  245. files = ['http://cdn.intesys.g107.com/' + key];
  246. }
  247. that.setData({
  248. [files_box]: files
  249. });
  250. app.globalData.showToast("已上传");
  251. }
  252. },
  253. fail: function (res) {
  254. app.globalData.showToast("上传失败");
  255. }
  256. });
  257. },
  258. fail: function (res) {
  259. app.globalData.showToast("上传失败");
  260. }
  261. })
  262. },
  263. random_string(len) {
  264. len = len || 32
  265. var chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678'
  266. var maxPos = chars.length
  267. var pwd = ''
  268. for (let i = 0; i < len; i++) {
  269. pwd += chars.charAt(Math.floor(Math.random() * maxPos))
  270. }
  271. return pwd
  272. },
  273. //备注输入
  274. bindTextAreaBlur: function (e) {
  275. var index = e.target.dataset.index;
  276. var remark = `items[${index}].remark`
  277. this.setData({
  278. [remark]: e.detail.value,
  279. });
  280. },
  281. //积分输入
  282. bindKeyInput(e) {
  283. var index = e.target.dataset.index;
  284. var point = `items[${index}].point`;
  285. var selectRule = this.data.items[index].selectRule;
  286. var isArrindex = this.data.items[index].isArrindex;
  287. // var strMin, strMax;
  288. // if (selectRule.min_point < 0) {
  289. // var min = selectRule.min_point.toString();
  290. // strMin = min.slice(1, min.length);
  291. // } else {
  292. // strMin = selectRule.min_point
  293. // }
  294. this.setData({
  295. [point]: e.detail.value,
  296. });
  297. return;
  298. //最小值
  299. var value;
  300. var showValue = e.detail.value
  301. if (isArrindex == true) {
  302. value = e.detail.value;
  303. } else {
  304. value = 0 - e.detail.value;
  305. }
  306. if (selectRule) {
  307. if (value < selectRule.min_point || value > selectRule.max_point) {
  308. app.globalData.showToast("已超出范围值")
  309. that.setData({
  310. [point]: Number(strMin)
  311. });
  312. } else {
  313. this.setData({
  314. [point]: showValue,
  315. });
  316. }
  317. } else {
  318. this.setData({
  319. [point]: showValue,
  320. });
  321. }
  322. },
  323. //选择规则分类
  324. bindKeyInput2(e) {
  325. var index = e.target.dataset.index;
  326. var point = `items[${index}].point2`;
  327. this.setData({
  328. [point]: e.detail.value,
  329. });
  330. },
  331. //删除一条
  332. deleteArr(e) {
  333. var index = e.target.dataset.index;
  334. var list = that.data.items;
  335. app.globalData.arrRemoveObj(list, list[index]);
  336. that.setData({
  337. items: list
  338. })
  339. },
  340. //添加一条
  341. addArr() {
  342. var list = that.data.items
  343. if (list.length >= 10) {
  344. this.showToast('一次只能添加10条奖扣')
  345. return;
  346. }
  347. var arr = {//录入选项列表.
  348. ticket_count:false,
  349. checked: true,
  350. rule_id: '',
  351. rule_id2: '',
  352. rule_name: '',
  353. item_id: 0,
  354. point: '',
  355. point2: '',
  356. remark: '',
  357. event_time: app.globalData.day,
  358. pt_id: '',
  359. reviewer_id: '',//审核人ID
  360. revieweName: '',//审批人姓名(非传)
  361. files: '',
  362. isArrindex: true,
  363. isArrindex2: true,
  364. selectRule: '',
  365. };
  366. list.push(arr);
  367. that.setData({
  368. items: list
  369. })
  370. },
  371. showToast(text) {
  372. app.globalData.showToast(text);
  373. },
  374. resubmit(){
  375. this.setData({
  376. resultList: this.data.errorList,
  377. resultIndex: 0,
  378. percentage: 0,
  379. results: [],
  380. isResult: true,
  381. isErrorShow: false,
  382. popupCx: 'container__mask',
  383. })
  384. this.opneWebSocket()
  385. },
  386. formSubmit() {
  387. // app.globalData.socketApi.sendData({type:'review'},(res)=>{
  388. // console.log(res)
  389. // })
  390. var items = this.data.items;
  391. var userData = this.data.users;
  392. var arr = [];
  393. var isTg = true;
  394. var pt_id = app.getTypesItem(this.data.isGzType).id
  395. if (userData.length == 0) {
  396. this.showToast('请选择奖扣对象')
  397. return;
  398. }
  399. for (var i = 0; i < items.length; i++) {
  400. var obj = {};
  401. var item = items[i];
  402. var num = item.checked ? item.point : item.point2
  403. var point;
  404. if (item.checked) {
  405. if (item.isArrindex != true) {
  406. point = 0 - num;
  407. } else {
  408. point = num;
  409. }
  410. if (point < item.selectRule.min_point || point > item.selectRule.max_point) {
  411. this.showToast(`第${i + 1}条,积分分值超出可输入范围`);
  412. isTg = false;
  413. }
  414. } else {
  415. if (item.isArrindex2 != true) {
  416. point = 0 - num;
  417. } else {
  418. point = num;
  419. }
  420. }
  421. if (item.checked) {
  422. if (!item.rule_id) {
  423. this.showToast(`第${i + 1}条请选择规则`);
  424. isTg = false;
  425. break;
  426. }
  427. } else {
  428. if (!item.rule_id2) {
  429. this.showToast(`第${i + 1}条请选择分类`);
  430. isTg = false;
  431. break;
  432. }
  433. }
  434. if (point == 0 || !point) {
  435. this.showToast(`第${i + 1}条积分分值不能为0或者为空`);
  436. isTg = false;
  437. break;
  438. }
  439. if (!item.remark) {
  440. this.showToast(`第${i + 1}条事件内容不能为空`);
  441. isTg = false;
  442. break;
  443. }
  444. obj.rule_id = item.checked ? item.rule_id : item.rule_id2;
  445. obj.item_id = item.checked ? item.item_id : 0;
  446. obj.item_name = item.item_name;
  447. obj.rule_name = item.rule_name;
  448. obj.point = point;
  449. obj.remark = item.remark;
  450. obj.event_time = item.event_time;
  451. obj.pt_id = pt_id;
  452. obj.reviewer_id = item.reviewer_id ? item.reviewer_id : 0;
  453. obj.files = item.files;
  454. obj.ticket_count=item.ticket_count? 1:0,
  455. arr.push(obj);
  456. }
  457. var userIds = []
  458. userData.map(item => {
  459. userIds.push(item.id)
  460. })
  461. if (isTg) {
  462. var data = { members: userIds, items: arr }
  463. // 走长连接
  464. this.webSocket(data)
  465. return false;
  466. this.setData({ disabled: true });
  467. var url = this.data.type == 'B' ? 'api/integral/point/entry' : 'api/integral/review/a/entry'
  468. app.$post(url, data).then((res) => {
  469. var is = true, msg;
  470. if (this.data.type == 'B') {
  471. res.data.data.list.forEach(item => {
  472. if (item.status != 1) {
  473. is = false;
  474. msg = item.msg;
  475. }
  476. })
  477. } else {
  478. res.data.data.list.forEach(item => {
  479. if (item.status != 1) {
  480. is = false;
  481. msg = item.rule_item;
  482. }
  483. })
  484. }
  485. if (is) {
  486. this.showToast('提交成功');
  487. setTimeout(() => {
  488. this.setData({ disabled: false });
  489. dd.navigateBack({ delta: 1 })
  490. }, 1000);
  491. } else {
  492. this.setData({ disabled: false });
  493. this.showToast(msg);
  494. }
  495. }).catch(err => {
  496. this.setData({ disabled: false });
  497. })
  498. }
  499. },
  500. webSocket(data) {
  501. let { members, items } = data;
  502. let arr = [];
  503. members.forEach(item => {
  504. items.forEach(item2 => {
  505. item2.type = this.data.type == 'B' ? 'peb' : 'pea';
  506. item2.employee_id = item;
  507. arr.push(JSON.parse(JSON.stringify(item2)))
  508. })
  509. })
  510. this.setData({
  511. resultList: arr,
  512. resultIndex: 0,
  513. percentage: 0,
  514. results: [],
  515. isResult: true,
  516. popupCx: 'container__mask',
  517. })
  518. this.opneWebSocket()
  519. },
  520. opneWebSocket() {
  521. let wsData = this.data.resultList;
  522. if (wsData[this.data.resultIndex]) {
  523. setTime = setTimeout(() => {
  524. let errorList = wsData.slice(this.data.resultIndex, wsData.length);
  525. errorList.forEach(item => {
  526. let obj = this.returnResult(Number(item.employee_id))[0]
  527. item.name = obj ? obj.name:'未知';
  528. })
  529. this.setData({
  530. isErrorShow: true,
  531. errorList: errorList
  532. })
  533. clearTimeout(setTime);
  534. app.globalData.socketApi.closewebsocket();
  535. }, 15000)
  536. app.globalData.socketApi.sendData(wsData[this.data.resultIndex],this.onmessageWS,true);
  537. } else {
  538. // console.log(this.data.results)
  539. }
  540. },
  541. onmessageWS(e) {
  542. // 因为作用域问题,这个函数不能使用this
  543. if (e.type == 'peb' || e.type == 'pea') {
  544. clearTimeout(setTime);
  545. let lng = that.data.resultList.length;// 进度条
  546. let results = that.data.results;//结果集
  547. results.unshift(e.result);
  548. that.setData({
  549. percentage: Math.floor(that.data.percentage += (100 / lng)),
  550. results: results,
  551. resultIndex: that.data.resultIndex + 1
  552. })
  553. that.opneWebSocket();
  554. if (lng == that.data.results.length) {
  555. that.setData({
  556. percentage: 100,
  557. })
  558. }
  559. }
  560. if (e.type == 'error') {
  561. clearTimeout(setTime);
  562. that.setData({
  563. isShowError: true,
  564. })
  565. }
  566. },
  567. closeTc() {
  568. this.setData({
  569. resultList: [],
  570. resultIndex: 0,
  571. percentage: 0,
  572. results: [],
  573. errorList:[],
  574. isErrorShow:false,
  575. isShowError: false,
  576. isResult: false,
  577. popupCx: '',
  578. })
  579. setTimeout(() => {
  580. dd.navigateBack({ delta: 1 })
  581. }, 1000);
  582. },
  583. returnResult(id) {
  584. console.log(id)
  585. return app.globalData.usersList.filter(item => {
  586. return item.id == id;
  587. })
  588. },
  589. switchChange(e) {
  590. var index = e.target.dataset.index;
  591. var item = `items[${index}].checked`;
  592. that.setData({
  593. [item]: e.detail.value
  594. })
  595. },
  596. switchChange2(e) {
  597. var index = e.target.dataset.index;
  598. var item = `items[${index}].ticket_count`;
  599. that.setData({
  600. [item]: e.detail.value
  601. })
  602. },
  603. //选择时间
  604. openDate(e) {
  605. var index = e.target.dataset.index;
  606. var item = `items[${index}].event_time`
  607. dd.datePicker({
  608. format: 'yyyy-MM-dd',
  609. currentDate: app.globalData.day,
  610. success: (res) => {
  611. that.setData({
  612. [item]: res.date
  613. })
  614. },
  615. });
  616. },
  617. //选择人
  618. onSelectUser(item) {
  619. //空数据
  620. this.data.items.forEach((obj, index) => {
  621. var reviewer_id = `items[${index}].reviewer_id`
  622. var revieweName = `items[${index}].revieweName`
  623. if (obj.reviewer_id) {
  624. that.setData({
  625. [reviewer_id]: '',
  626. [revieweName]: '',
  627. });
  628. }
  629. })
  630. this.setData({ superior_list: [] });
  631. if (item.length > 0) {
  632. that.setData({
  633. users: item.length > 0 ? item : [],
  634. superior_list: app.globalData.userData.employee_detail.superior_list
  635. })
  636. }
  637. },
  638. //选择人2
  639. onSelectUser2(item) {
  640. var elm = item.length > 0 ? item[0] : { id: '', name: '' };
  641. var index = this.data.activeIndex;
  642. var reviewer_id = `items[${index}].reviewer_id`
  643. var revieweName = `items[${index}].revieweName`
  644. var ticket_count = `items[${index}].ticket_count`
  645. var getTicket_count = this.data.items[index].ticket_count;
  646. that.setData({
  647. [reviewer_id]: elm.id,
  648. [revieweName]: elm.name,
  649. });
  650. if(elm.id){
  651. that.setData({
  652. [ticket_count]:false
  653. });
  654. if(getTicket_count){
  655. app.globalData.showToast("选择递交审批人时,发放奖票将失效,由审批上级来发放奖票");
  656. }
  657. }
  658. },
  659. //选择规则分类
  660. onSelectType(item) {
  661. var index = this.data.activeIndex;
  662. var rule_id2 = `items[${index}].rule_id2`;//分类ID
  663. var rule_name = `items[${index}].rule_name`;//分类名称
  664. this.setData({
  665. [rule_id2]: item.id,
  666. [rule_name]: item.name,
  667. });
  668. },
  669. //选择规则
  670. onSelectItem(item) {
  671. var index = this.data.activeIndex;
  672. var point = `items[${index}].point`
  673. var isArrindex = `items[${index}].isArrindex`
  674. var selectRule = `items[${index}].selectRule`
  675. var remark = `items[${index}].remark`
  676. var rule_id = `items[${index}].rule_id`;//分类ID
  677. var item_id = `items[${index}].item_id`;//分类ID
  678. var item_name = `items[${index}].item_name`;//分类ID
  679. var strMin;
  680. if (item.min_point < 0) {
  681. var min = item.min_point.toString();
  682. var strMin = min.slice(1, min.length);
  683. } else {
  684. strMin = item.min_point;
  685. }
  686. this.setData({
  687. [point]: Number(strMin),
  688. [isArrindex]: item.min_point > 0 ? true : false,
  689. [selectRule]: item,
  690. [remark]: item.remark,
  691. [item_name]: item.remark,
  692. [rule_id]: item.rule_id,
  693. [item_id]: item.id,
  694. });
  695. },
  696. //获取人员(上级人员)
  697. getEmployeeList(userIdArr, callBack) {
  698. app.$get("api/employee/superior", { employee_id: userIdArr, filter_applyor: 1 }).then((res) => {
  699. callBack(res.data.data.list)
  700. })
  701. },
  702. intersection(arr) {
  703. const arrSet = []
  704. const intersectionSet = new Set()
  705. arr.forEach(items => {
  706. arrSet.push(new Set(items.map(item => item.id)))
  707. items.forEach(item => intersectionSet.add(item.id))
  708. })
  709. return [...intersectionSet].filter(item => arrSet.every(set => set.has(item)))
  710. },
  711. });