jk_B.js 18 KB

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