我要请假.js 16 KB

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