qingjiadan.js 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471
  1. _this.pageinit = function () {
  2. newPageInit()
  3. }
  4. // 在页面初始化加载之后
  5. mbos('page').bind('afterLoad', function () {
  6. _this.path = mbos.pageInfo.path// 轻应用的路径编码 例如 trip880
  7. _this.detailPageCode = mbos.pageInfo.name.replace('Add', 'View') // 详情页面的编码 (个别页面可特殊处理直接写入) 例如 tripView.editui
  8. _this.operateState = mbos.getRequestParams().operateState // 'ADDNEW' 'EDIT' 'VIEW'
  9. // 初始化审批流
  10. // mbos('nextperson1').checkParticipantPerson({
  11. // "callback": function () { }
  12. // });
  13. // 单据说明
  14. mbos('description').bind('click', function () {
  15. handleClickDesc()
  16. })
  17. })
  18. // 【请假类型】F7过滤, _this.holidayIdList是接口返回的过滤数据,再依据这个过滤F7
  19. function filterLeaveTypeF7(index) {
  20. var filterStr = _this.holidayIdList.join('\',\'')
  21. mbos('entries_sourceHolidayType', index).attr('dynamicFilter', 'id in (\'' + filterStr + '\')'); // 动态添加过滤
  22. }
  23. // 哺乳假F7
  24. function filterBreastTypeF7(index) {
  25. mbos('entries.bfType', index).attr('dynamicFilter', 'state = 1'); // 动态添加过滤
  26. }
  27. // 分录渲染后
  28. mbos('entries').bind('afterRendered', function (e) {
  29. _this.leaveLengthTitle = mbos('entries_leaveLength_0').attr('title').split('(')[0] // 获取请假时长的标题
  30. getHolidayType(e)
  31. multiLangField(e.index)// 兼容多语言字段回显的问题
  32. // 初始化审批流
  33. _this.getNextPerson();
  34. })
  35. // 初始化审批流
  36. _this.getNextPerson = function(){
  37. var entries = setModel('getNextPerson');
  38. var data = JSON.parse(JSON.stringify(mbos('entity').value()));
  39. data.entries = JSON.parse(JSON.stringify(entries));
  40. var date = mbos.getRequestParams().date || new Date()
  41. var today = moment(date).format('YYYY-MM-DD')
  42. var beginTime = today + ' 00:00';
  43. var endTime = today + ' 23:59';
  44. mbos.eas.invokeScript({
  45. name: "getHROrgUnit",
  46. param: [{'beginTime': beginTime, 'endTime':endTime}],
  47. success: function (res) {
  48. console.log(res)
  49. if(res.hrOrgUnitId){
  50. data.hrOrgUnit = res.hrOrgUnitId
  51. }
  52. mbos('nextperson1').checkParticipantPerson({
  53. 'editdata': data,
  54. "callback": function () { }
  55. });
  56. }
  57. })
  58. }
  59. // 提交前增加校验,R20240625-5062 计算时长为0、手动修改为大于0时,增加不允许提交校验
  60. _this.verify = function(action){
  61. var flag = true;
  62. var params = getModel(-1, action);
  63. $.each(params.entries, function(i,item){
  64. if(item.leaveLength > item.realLeaveLength){
  65. mbos.ui.showInfo('请假长度只能改小,不能改大。');
  66. flag = false;
  67. return false;
  68. }
  69. })
  70. return flag;
  71. }
  72. // 保存按钮
  73. _this.save = function (event) {
  74. // R20240625-5062 计算时长为0、手动修改为大于0时,增加不允许提交校验
  75. if(!_this.verify('save')){
  76. return false;
  77. }
  78. var params = getModel(-1, 'save') // 封装model,不走common的封装
  79. baseInterface('save', toView, -1, params) // 调用保存接口
  80. }
  81. // 提交按钮
  82. _this.submit = function (event) {
  83. // R20240625-5062 计算时长为0、手动修改为大于0时,增加不允许提交校验
  84. if(!_this.verify('submit')){
  85. return false;
  86. }
  87. // 确认提交 弹框
  88. mbos.ui.showConfirm({
  89. title: localeResource.confirmSubmit,
  90. iconclass: "kdfont kdfont-zhuangtai_jingshi the_info",
  91. callback: function (data) {
  92. if (data == 0) {
  93. var params = getModel(-1, 'submit') // 封装model,不走common的封装
  94. baseInterface('submit', toView, -1, params) // 调用提交接口
  95. }
  96. }
  97. });
  98. }
  99. // 点击“保存、提交” 跳转页面
  100. function toView(res) {
  101. // 提交接口 返回的res.data为数组,取第一条数据
  102. if (res.data.keyValue || (res.data.length > 0 && res.data[0].keyValue)) {
  103. // 操作成功 提示弹框
  104. mbos.ui.showInfo({
  105. title: localeResource.succeed,
  106. iconclass: "kdfont kdfont-zhuangtai_wancheng the_success",
  107. callback: function () {
  108. openPage(_this.path, _this.detailPageCode, { billID: res.data.keyValue || res.data[0].keyValue })
  109. }
  110. });
  111. }
  112. }
  113. // 给隐藏的model赋值
  114. // method: getNextPerson,获取审批人数据
  115. function setModel(method) {
  116. if (typeof _this.operateState != "undefined" && (_this.operateState === "ADDNEW" || _this.operateState === "EDIT")) {
  117. var entries = _.cloneDeep(mbos('entity').data.entries) // lodash 深拷贝
  118. entries.map(function (entry, i) {
  119. entry.person = easContext.person
  120. // position和adminOrgUnit取后端默认值,前端取的是人事档案的不是正确的值
  121. // entry.position = easContext.position.id
  122. // entry.adminOrgUnit = easContext.position.adminOrgUnit.id
  123. getEntries(entry, i, method) // 各单据处理分录数据
  124. })
  125. return entries
  126. }
  127. }
  128. function getModel(index, method) {
  129. var entries = setModel()
  130. var obj = mbos('entity').data
  131. if (method === "save" || method === "submit"){ // 只在保存喝提交时修改枚举字段的存储,不然会清空表头的枚举字段
  132. Object.keys(obj).map(key => {
  133. if (obj[key] && obj[key].isenum) {// 遍历枚举字段 依据后端需要 传参只传value
  134. obj[key] = obj[key].value
  135. }
  136. })
  137. console.log(obj)
  138. }
  139. var model = {
  140. ...obj,
  141. entries: entries,
  142. }
  143. if (index >= 0) { // index 为-1 时代表取所有明细
  144. model.entries = [entries[index]]
  145. }
  146. if ((method === "save" || method === "submit") && mbos.getRequestParams().abnormalId) {
  147. model.abnormalId = mbos.getRequestParams().abnormalId
  148. }
  149. var personList = mbos('personSelector1').$element ? mbos('personSelector1').getpersonList() : []; // 抄送人列表
  150. model.ccPersonIds = personList.map(function (i) { return (i.personid || i.id) }).join(',')
  151. model.ccPerson = personList.map(function (i) { return (i.personid || i.id) }).join(',')
  152. return model
  153. }
  154. // 各单据处理分录数据的函数
  155. // method: getNextPerson,获取审批人数据
  156. function getEntries(entry, i, method) {
  157. if (!entry.bfType) entry.bfType = ''
  158. var halfData = _this['isHalf' + i]
  159. if (halfData && entry.beginTime && !entry.beginTime.split(' ')[1] && mbos('beginHalf', i).value().value) {
  160. // 页面显示的是上午下午,但是传参得拼接上时分 格式为年月日时分
  161. entry.beginTime = entry.beginTime + ' ' + (mbos('beginHalf', i).value().value === 'am' ? halfData.amBeginTime : halfData.pmBeginTime)
  162. entry.endTime = entry.endTime + ' ' + (mbos('endHalf', i).value().value === 'am' ? halfData.amEndTime : halfData.pmEndTime)
  163. }
  164. // 如果是哺乳假 非自定义的类型 结束时间需要拼接时分为23:59
  165. var _holidayType = mbos('entries_sourceHolidayType', i).value()
  166. var _bfType = mbos('entries_bfType', i).value()
  167. if (_holidayType && _holidayType.name == localeResource.bf_holiday && _bfType && _bfType.name !== localeResource.Customized){
  168. entry.beginTime += ' 00:00'
  169. entry.endTime += ' 23:59'
  170. }
  171. if(method == 'getNextPerson'){
  172. entry.position = easContext.position;
  173. entry.adminOrgUnit = easContext.position.adminOrgUnit;
  174. if(entry.beginTime){
  175. entry.beginTime = moment(entry.beginTime).format('YYYY-MM-DD HH:mm:ss');
  176. }
  177. if(entry.endTime){
  178. entry.endTime = moment(entry.endTime).format('YYYY-MM-DD HH:mm:ss');
  179. }
  180. }else{
  181. delete entry.position;
  182. delete entry.adminOrgUnit;
  183. }
  184. }
  185. // 获取请假类型
  186. var getHolidayType = _.debounce(function (e) {
  187. var callback = function (res) {
  188. var list = res.data
  189. _this.holidayIdList = res.data.map(item => item.holidayTypeId.id) // 存储过滤后的请假类型F7数据
  190. filterLeaveTypeF7(e.index)
  191. filterBreastTypeF7(e.index)
  192. // 请假类型数组
  193. _this.holidayType = {}
  194. for (var i = 0; i < list.length; i++) {
  195. var typeId = list[i].holidayTypeId.id
  196. _this.holidayType[typeId] = {
  197. holidayPolicyId: list[i].holidayPolicyInfo.id,
  198. sourceUnit: list[i].unit,
  199. sourceHolidayType: list[i].holidayTypeId,
  200. description: list[i].description
  201. }
  202. }
  203. if (mbos.getRequestParams().type && mbos.getRequestParams().holidayTypeId){
  204. // 从我的假期页面跳转过来,携带赋值假期类型
  205. mbos('entries_sourceHolidayType', e.index).value({
  206. id: decodeURIComponent(mbos.getRequestParams().holidayTypeId),
  207. name: mbos.getRequestParams().type
  208. })
  209. }
  210. if (mbos('entries_sourceHolidayType', e.index).value()) {
  211. _this.typeChange({
  212. index: e.index,
  213. new_value: mbos('entries_sourceHolidayType', e.index).value(),
  214. old_value: ''
  215. })
  216. }
  217. }
  218. var date = mbos.getRequestParams().date || new Date()
  219. // 需要传参时间,默认为当天 或其他页面带过来的参数
  220. var today = moment(date).format('YYYY-MM-DD')
  221. if (!mbos('entries_beginTime', e.index).value()) {
  222. mbos('entries_beginTime', e.index).value(today + ' 00:00')
  223. }
  224. if (!mbos('entries_endTime', e.index).value()) {
  225. mbos('entries_endTime', e.index).value(today + ' 23:59')
  226. }
  227. setModel()
  228. baseInterface('getHolidayTypeByPerson', callback, e.index)
  229. }, 0)
  230. // 接口计算请假时长
  231. var getTimeLength = _.debounce(function (index) {
  232. var callback = function (res) {
  233. mbos('entries_leaveLength', index).value(res.data.leaveBillDays)
  234. // R20240625-5062 计算时长为0、手动修改为大于0时,增加不允许提交校验
  235. mbos('entries_realLeaveLength', index).value(res.data.leaveBillDays)
  236. }
  237. var params = getModel(index) // 封装model,不走common的封装
  238. var entry = mbos('entity').data.entries[index]
  239. if (entry.beginTime && entry.endTime && entry.sourceHolidayType) {
  240. baseInterface('getBillLength', callback, index, params)
  241. }
  242. }, 500)
  243. // 获取假期剩余额度单位
  244. var getRemainLength = _.debounce(function (event) {
  245. var index = event.index
  246. var entry = mbos('entity').data.entries[index]
  247. delete entry.SourceHolidayType
  248. if (entry.beginTime && entry.endTime && entry.sourceHolidayType) {
  249. var callback = function (res) {
  250. if (!res.data) {
  251. $('#remainCard_' + index).css('display', 'none')
  252. return
  253. }
  254. if (res && res.data) {
  255. var type = _this.holidayType[mbos('entries_sourceHolidayType', index).value().id]
  256. $('#remainCard_' + index).css('display', 'flex')
  257. var sourceTypeName = type.sourceHolidayType.name == "年假" ? "本年度全年年假" : type.sourceHolidayType.name;
  258. document.getElementById('remainCard_' + index).innerText = `${sourceTypeName} ${localeResource.remained}${res.data.remainLimitVal}${type.sourceUnit.alias} ${localeResource.remainedDays}`
  259. }
  260. }
  261. setModel()
  262. baseInterface('getHolidayLimitByHolidayType', callback, index)
  263. }
  264. }, 200)
  265. // 根据时间判断 是否展示弹性算时长字段
  266. var isElastic = _.debounce(function (index) {
  267. var callback = function (res) {
  268. if (res.data) {
  269. mbos('entries_isElasticCalLen', index).show()
  270. } else {
  271. mbos('entries_isElasticCalLen', index).hide()
  272. }
  273. }
  274. // TODO holidayPolicyId待添加
  275. setModel(index)
  276. var entry = mbos('entity').data.entries[index]
  277. if (entry.beginTime && entry.endTime) {
  278. baseInterface('showIsElasticCalCtrl', callback, index)
  279. }
  280. }, 500)
  281. /**
  282. * 修改开始结束时间的格式
  283. * YYYY-MM-DD : 非【自定义】的所有哺乳假类型
  284. * YYYY-MM-DD HH:mm:未启用半天假的非哺乳假;【自定义】的哺乳假类型且未启用半天假;
  285. * YYYY-MM-DD AM/PM:启用半天假的非哺乳假、【自定义】的哺乳假类型且启用半天假
  286. */
  287. function beginEndFormat(format, index) {
  288. mbos('entries.beginTime', index).timeFormat(format)
  289. mbos('entries.endTime', index).timeFormat(format)
  290. }
  291. // 是否开启半天假
  292. function isHalfHoliday(index, timeFormat) {
  293. var callback = function (res) {
  294. if (res.data && res.data.isHalfDayOff) {
  295. // 先赋值 在设置半天假 最后格式化时间,顺序不能变
  296. _this['isHalf' + index] = res.data
  297. setHalfDay(index)// 设置开启半天假的样式
  298. beginEndFormat('YYYY-MM-DD', index)
  299. } else {
  300. _this['isHalf' + index] = false
  301. hideHalfDay(index)// 隐藏半天假
  302. beginEndFormat(timeFormat ? timeFormat : 'YYYY-MM-DD HH:mm', index)
  303. }
  304. }
  305. setModel()
  306. baseInterface('getSetIsCtrlHalfDayOff', callback, index)
  307. }
  308. // 设置开启半天假的样式
  309. function setHalfDay(index) {
  310. $('#entries_beginTime_' + index).removeClass('col-xs-12').addClass('col-xs-9')
  311. $('#entries_endTime_' + index).removeClass('col-xs-12').addClass('col-xs-9')
  312. // mbos('beginHalf', index).show()
  313. // mbos('endHalf', index).show()
  314. $('#beginHalf_' + index).css("display", "block")
  315. $('#endHalf_' + index).css("display", "block")
  316. var half = {
  317. am: { alias: localeResource.AM, value: "am" },
  318. pm: { alias: localeResource.PM, value: "pm" },
  319. }
  320. var halfData = _this['isHalf' + index] // 半天假及时间字段
  321. // 编辑时 根据时间判断
  322. var startHM = halfData.pmBeginTime === mbos('entries_beginTime', index).value().split(' ')[1] ? half.pm : half.am
  323. var endHM = halfData.amEndTime === mbos('entries_endTime', index).value().split(' ')[1] ? half.am : half.pm
  324. mbos('beginHalf', index).value(startHM)
  325. mbos('endHalf', index).value(endHM)
  326. }
  327. // 隐藏半天假
  328. function hideHalfDay(index) {
  329. $('#entries_beginTime_' + index).removeClass('col-xs-9').addClass('col-xs-12')
  330. $('#entries_endTime_' + index).removeClass('col-xs-9').addClass('col-xs-12')
  331. mbos('beginHalf', index).hide()
  332. mbos('endHalf', index).hide()
  333. }
  334. // 监听请假类型
  335. _this.typeChange = function (event) {
  336. var index = event.index
  337. var entry = mbos('entity').data.entries[index]
  338. if (!event.new_value) return //清空
  339. var type = _this.holidayType && _this.holidayType[event.new_value.id]
  340. if (type) {
  341. entry.sourceUnit = type.sourceUnit // 1是天 2是小时
  342. entry.holidayPolicyId = type.holidayPolicyId
  343. entry.SourceHolidayType = type.sourceHolidayType.id
  344. }
  345. // 是否是哺乳假
  346. if (mbos('entries_sourceHolidayType', index).value() && (mbos('entries_sourceHolidayType', index).value().id == "8r0AAAAMhrv9LVKY" || mbos('entries_sourceHolidayType', index).value().name == localeResource.bf_holiday)) {
  347. // 请假类型为【哺乳假】则显示 哺乳假类型、子女出生日期、产假结束日期
  348. mbos('entries.bfType', index).show()
  349. var format = 'YYYY-MM-DD'
  350. if (mbos('entries_bfType', index).value()) {
  351. if(mbos('entries_bfType', index).value().name == localeResource.Customized){
  352. format = 'YYYY-MM-DD HH:mm'
  353. } else {
  354. mbos('entries.childbirthday', index).show()
  355. mbos('entries.mLEndTime', index).show()
  356. }
  357. } else {
  358. // 如果哺乳假类型不存在则默认为自定义
  359. mbos('entries_bfType', index).value({id: "8r0AAAA09p9IT3K3", name: localeResource.Customized})
  360. format = 'YYYY-MM-DD HH:mm'
  361. }
  362. isHalfHoliday(index, format) // 判断是否启用半天假
  363. } else {// 非哺乳假时间格式只有两种:【年月日时分】、【年月日 上/下午】。启用半天假时为【年月日 上/下午】,其他的都是【年月日时分】;
  364. // 其他类型则隐藏
  365. mbos('entries.bfType', index).hide()
  366. mbos('entries_bfType', index).value('')
  367. mbos('entries.childbirthday', index).hide()
  368. mbos('entries.childbirthday', index).value('')
  369. mbos('entries.mLEndTime', index).hide()
  370. mbos('entries.mLEndTime', index).value('')
  371. isHalfHoliday(index) // 判断是否启用半天假
  372. }
  373. if (entry.sourceUnit) {
  374. mbos('entries_leaveLength', index).attr('title', _this.leaveLengthTitle + `(${entry.sourceUnit.alias})`);
  375. }
  376. getTimeLength(index)
  377. getRemainLength(event)
  378. }
  379. // 监听 开始时间
  380. _this.calTime1 = function (event) {
  381. getHolidayType(event)
  382. getTimeLength(event.index)
  383. isElastic(event.index)
  384. getRemainLength(event)
  385. }
  386. // 监听 结束时间
  387. _this.calTime2 = function (event) {
  388. getHolidayType(event)
  389. getTimeLength(event.index)
  390. isElastic(event.index)
  391. getRemainLength(event)
  392. }
  393. // 监听 子女出生日期
  394. _this.birthdayChange = function (event) {
  395. // 请假开始时间默认值:产假结束日期,再加1天;
  396. if (event.new_value) {
  397. var value = moment(mbos('entries_childbirthday', event.index).value()).add(1, 'years').format('YYYY-MM-DD')
  398. mbos('entries.endTime', event.index).value(value)
  399. }
  400. }
  401. // 监听 产假结束日期
  402. _this.mlEndChange = function (event) {
  403. // 请假结束时间默认值:子女出生日期延后一年,再减1天;
  404. if (event.new_value) {
  405. var value = moment(mbos('entries_mLEndTime', event.index).value()).add(1, 'days').format('YYYY-MM-DD')
  406. mbos('entries.beginTime', event.index).value(value)
  407. }
  408. }
  409. // 监听 哺乳假类型
  410. _this.bfTypeChange = function (event) {
  411. var index = event.index
  412. // 哺乳假类型是否为【自定义】
  413. if (!mbos('entries_bfType', index).value()){
  414. // 如果哺乳假类型不存在则默认为自定义
  415. setTimeout(()=>{
  416. mbos('entries_bfType', index).value({id: "8r0AAAA09p9IT3K3", name: localeResource.Customized})
  417. }, 0)
  418. }
  419. if (mbos('entries_bfType', index).value() && (mbos('entries_bfType', index).value().id == "8r0AAAA09p9IT3K3" || mbos('entries_bfType', index).value().name == localeResource.Customized)) {
  420. // 【自定义】: 则不展示【子女出生日期、产假结束日期】
  421. mbos('entries.childbirthday', index).value('')
  422. mbos('entries.childbirthday', index).hide()
  423. mbos('entries.mLEndTime', index).value('')
  424. mbos('entries.mLEndTime', index).hide()
  425. // 哺乳假类型为【自定义】时,启用半天假时为【年月日 上/下午】,其他的都是【年月日 时分】
  426. isHalfHoliday(index) // 判断是否启用半天假
  427. } else {
  428. // 非【自定义】的所有哺乳假类型 日期格式为年月日
  429. beginEndFormat('YYYY-MM-DD', index)
  430. mbos('entries.childbirthday', index).show()
  431. mbos('entries.mLEndTime', index).show()
  432. }
  433. getTimeLength(event.index)
  434. }
  435. // 监听是否是弹性算时长
  436. _this.isElasticChange = function (event) {
  437. getTimeLength(event.index)
  438. }
  439. // 更改半天假开始
  440. _this.calTime3 = function (event) {
  441. getTimeLength(event.index)
  442. }
  443. // 更改半天假结束
  444. _this.calTime4 = function (event) {
  445. getTimeLength(event.index)
  446. }
  447. // 时长更改时 做校验
  448. _this.lengthChange = function(event){
  449. var value = event.new_value
  450. // 判断是否等于小于0
  451. if (!isNaN(parseFloat(value)) && value <= 0) {
  452. mbos.msgBox.showError(localeResource.lengthValid);
  453. setTimeout(()=>{
  454. mbos('entries_leaveLength',event.index).value('')
  455. })
  456. return
  457. }
  458. }