mbos_请假单.js 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808
  1. _this.pageinit = function () {
  2. newPageInit(_this)
  3. _this.entryleaveDay={};
  4. }
  5. // 在页面初始化加载之后
  6. mbos('page').bind('afterLoad', function () {
  7. _this.bfTypeValue = "8r0AAAAMhrv9LVKY"; // "8r0AAAA09p9IT3K3"
  8. _this.customeBf = "8r0AAAA09p9IT3K3";
  9. _this.path = mbos.pageInfo.path// 轻应用的路径编码 例如 trip880
  10. _this.detailPageCode = mbos.pageInfo.name.replace('Add', 'View') // 详情页面的编码 (个别页面可特殊处理直接写入) 例如 tripView.editui
  11. _this.operateState = mbos.getRequestParams().operateState // 'ADDNEW' 'EDIT' 'VIEW'
  12. // 初始化审批流
  13. //mbos('nextperson1').checkParticipantPerson({
  14. // "callback": function () { }
  15. //});
  16. // 单据说明
  17. mbos('description').bind('click', function () {
  18. handleClickDesc()
  19. })
  20. })
  21. // 【请假类型】F7过滤, _this.holidayIdList是接口返回的过滤数据,再依据这个过滤F7
  22. function filterLeaveTypeF7(index) {
  23. var filterStr = _this.holidayIdList.join('\',\'')
  24. mbos('entries_sourceHolidayType', index).attr('dynamicFilter', 'id in (\'' + filterStr + '\')'); // 动态添加过滤
  25. }
  26. // 哺乳假F7
  27. function filterBreastTypeF7(index) {
  28. mbos('entries.bfType', index).attr('dynamicFilter', 'state = 1'); // 动态添加过滤
  29. }
  30. // 分录渲染后
  31. mbos('entries').bind('afterRendered', function (e) {
  32. _this.leaveLengthTitle = mbos('entries_leaveLength_0').attr('title').split('(')[0] // 获取请假时长的标题
  33. _this.bindDateChange(e.index)
  34. _this.getAllDayField(e.index)
  35. getHolidayType(e)
  36. multiLangField(e.index)// 兼容多语言字段回显的问题
  37. //20260507 出差地必填
  38. _this.controlPlaceRequired(e.index);
  39. })
  40. //兼容是否有整天请假字段,并根据分录数据的整天请假的值设置时间格式
  41. _this.getAllDayField = function (index) {
  42. var setAllDayTime = function () {
  43. if(_this.hasAllDayField === 'noAllDayField'){
  44. mbos('entries_isAllDay',index).hide()
  45. mbos('entries_isAllDay',index).value(false)
  46. }else {
  47. mbos('entries_isAllDay',index).show()
  48. _this.setTimeVisiable(index)
  49. }
  50. }
  51. if(!_this.hasAllDayField){
  52. var callback = function (res) {
  53. _this.hasAllDayField = res.data.isAllDay ? 'hasAllDayField' : 'noAllDayField';
  54. setAllDayTime()
  55. }
  56. baseInterface('getDecimalPlace', callback)
  57. }else{
  58. setAllDayTime()
  59. }
  60. }
  61. // 保存按钮
  62. _this.save = function (event) {
  63. // ====================== 在这里加开始 20260507 ======================
  64. if(!_this.validatePlaceRequired()){
  65. return; // 校验不通过,直接拦截,不往下执行
  66. }
  67. // ====================== 在这里加结束 ======================
  68. var params = getModel(-1, 'save') // 封装model,不走common的封装
  69. if(params.entries.length > 1){
  70. params.billSourceType = '2'
  71. }
  72. baseInterface('save', toView, -1, params) // 调用保存接口
  73. }
  74. // 提交按钮
  75. _this.submit = function (event) {
  76. // ====================== 在这里加开始 20260507 ======================
  77. if(!_this.validatePlaceRequired()){
  78. return; // 校验不通过,直接拦截,不往下执行
  79. }
  80. // ====================== 在这里加结束 ======================
  81. // 确认提交 弹框
  82. mbos.ui.showConfirm({
  83. title: localeResource.confirmSubmit,
  84. iconclass: "kdfont kdfont-zhuangtai_jingshi the_info",
  85. callback: function (data) {
  86. mbos('nextperson1').checkParticipantPerson({
  87. "editdata":getModel(-1, 'submit'),
  88. "callback": function () {
  89. if (data == 0) {
  90. var params = getModel(-1, 'submit') // 封装model,不走common的封装
  91. baseInterface('submit', toView, -1, params) // 调用提交接口
  92. }
  93. }
  94. });
  95. }
  96. });
  97. }
  98. // 点击“保存、提交” 跳转页面
  99. function toView(res) {
  100. // 提交接口 返回的res.data为数组,取第一条数据
  101. if (res.data.keyValue || (res.data.length > 0 && res.data[0].keyValue)) {
  102. // 操作成功 提示弹框
  103. mbos.ui.showInfo({
  104. title: localeResource.succeed,
  105. iconclass: "kdfont kdfont-zhuangtai_wancheng the_success",
  106. callback: function () {
  107. openPage(_this.path, _this.detailPageCode, { billID: res.data.keyValue || res.data[0].keyValue })
  108. }
  109. });
  110. }
  111. }
  112. // 给隐藏的model赋值
  113. function setModel() {
  114. if (typeof _this.operateState != "undefined" && (_this.operateState === "ADDNEW" || _this.operateState === "EDIT")) {
  115. var entries = _.cloneDeep(mbos('entity').data.entries) // lodash 深拷贝
  116. entries.map(function (entry, i) {
  117. entry.person = easContext.person
  118. // position和adminOrgUnit取后端默认值,前端取的是人事档案的不是正确的值
  119. // entry.position = easContext.position.id
  120. // entry.adminOrgUnit = easContext.position.adminOrgUnit.id
  121. getEntries(entry, i) // 各单据处理分录数据
  122. })
  123. return entries
  124. }
  125. }
  126. //哺乳假 是自定义还是非自定义
  127. _this.isCustomBr = function(index){
  128. var htype = mbos("entries.sourceHolidayType",index).value() ? mbos("entries.sourceHolidayType",index).value().id : ''
  129. var bfType = mbos("entries.bfType",index).value() ? mbos("entries.bfType",index).value().id : ''
  130. if(htype && bfType && htype===_this.bfTypeValue && bfType!== _this.customeBf){
  131. return 'noCustomBf';
  132. }else if(htype && bfType && htype===_this.bfTypeValue && bfType === _this.customeBf){
  133. return 'isCustomBf';
  134. }
  135. }
  136. function getModel(index, method) {
  137. var entries = setModel()
  138. var obj = mbos('entity').data
  139. if (method === "save" || method === "submit"){ // 只在保存喝提交时修改枚举字段的存储,不然会清空表头的枚举字段
  140. Object.keys(obj).map(function(key){
  141. if (obj[key] && obj[key].isenum) {// 遍历枚举字段 依据后端需要 传参只传value
  142. obj[key] = obj[key].value
  143. }
  144. })
  145. console.log(obj)
  146. }
  147. for(var i=0; i<entries.length;i++){
  148. var item = entries[i];
  149. var formate = 'YYYY-MM-DD HH:mm:ss'
  150. if(item.beginTime){
  151. item.beginTime = moment(item.beginTime).format(formate)
  152. }
  153. if(item.endTime){
  154. item.endTime = moment(item.endTime).format(formate)
  155. }
  156. if (method === "save" || method === "submit"){
  157. if(!item.beginYMD){
  158. item.beginYMD = item.beginTime ? item.beginTime.split(" ")[0] : '';
  159. }
  160. if(!item.endYMD){
  161. item.endYMD = item.endTime ? item.endTime.split(" ")[0] : '';
  162. }
  163. if(_this.isCustomBr(i) === 'noCustomBf' && new Date(item.beginTime.split(" ")[0]) <= new Date(item.mLEndTime)){
  164. mbos.msgBox.showError(localeResource.prMsg);
  165. throw new Error(localeResource.prMsg)
  166. }
  167. if(item.leaveLength > _this.entryleaveDay[i]){
  168. mbos.msgBox.showError(localeResource.detialNo+(i+1)+localeResource.leaveDaysMsg);
  169. throw new Error(localeResource.prMsg)
  170. }
  171. }
  172. }
  173. // var model = {
  174. // ...obj,
  175. // entries: entries,
  176. //}
  177. var model = $.extend({},obj,{entries: entries})
  178. if (index >= 0) { // index 为-1 时代表取所有明细
  179. model.entries = [entries[index]]
  180. }
  181. if ((method === "save" || method === "submit") && mbos.getRequestParams().abnormalId) {
  182. model.abnormalId = mbos.getRequestParams().abnormalId
  183. }
  184. var personList = mbos('personSelector1').$element ? mbos('personSelector1').getpersonList() : []; // 抄送人列表
  185. model.ccPersonIds = personList.map(function (i) { return (i.personid || i.id) }).join(',')
  186. model.ccPerson = personList.map(function (i) { return (i.personid || i.id) }).join(',')
  187. return model
  188. }
  189. // 各单据处理分录数据的函数
  190. function getEntries(entry, i) {
  191. if (!entry.bfType) entry.bfType = ''
  192. var halfData = _this['isHalf' + i]
  193. var beginHalf = mbos('beginHalf', i).value() ? mbos('beginHalf', i).value().value : ''
  194. if (halfData && entry.beginTime && !entry.beginTime.split(' ')[1] && beginHalf) {
  195. // 页面显示的是上午下午,但是传参得拼接上时分 格式为年月日时分
  196. //entry.beginTime = entry.beginTime + ' ' + (mbos('beginHalf', i).value().value === 'am' ? halfData.amBeginTime : halfData.pmBeginTime)
  197. //entry.endTime = entry.endTime + ' ' + (mbos('endHalf', i).value().value === 'am' ? halfData.amEndTime : halfData.pmEndTime)
  198. entry.beginTime = entry.beginTime.split(" ")[0] + ' ' + halfData[mbos('beginHalf', i).value().value]
  199. entry.endTime = entry.endTime.split(" ")[0] + ' ' + halfData[mbos('endHalf', i).value().value]
  200. }
  201. // 如果是哺乳假 非自定义的类型 结束时间需要拼接时分为23:59
  202. var _holidayType = mbos('entries_sourceHolidayType', i).value()
  203. var _bfType = mbos('entries_bfType', i).value()
  204. if (_holidayType && _holidayType.name == localeResource.bf_holiday && _bfType && _bfType.name !== localeResource.Customized){
  205. entry.beginTime = entry.beginTime.split(" ")[0] + ' 00:00'
  206. entry.endTime = entry.endTime.split(" ")[0] + ' 23:59'
  207. }
  208. if(_holidayType && _holidayType.name !== localeResource.bf_holiday && entry.isAllDay){
  209. if(_this['fullBeginTime_'+i]){
  210. entry.beginTime = _this['fullBeginTime_'+i];
  211. entry.endTime = _this['fullEndTime_'+i];
  212. } else {
  213. var beginHMS = _this['beginHMS_'+i] ? _this['beginHMS_'+i] : '00:00';
  214. var endHMS = _this['endHMS_'+i] ? _this['endHMS_'+i] : '23:59';
  215. entry.beginTime = (entry.beginYMD || '') + " " + beginHMS;
  216. entry.endTime = (entry.endYMD || '') + " " + endHMS;
  217. }
  218. }
  219. }
  220. // 获取请假类型
  221. var getHolidayType = _.debounce(function (e) {
  222. var callback = function (res) {
  223. var list = res.data
  224. _this.holidayIdList = res.data.map(function(item){return item.holidayTypeId.id}) // 存储过滤后的请假类型F7数据
  225. filterLeaveTypeF7(e.index)
  226. filterBreastTypeF7(e.index)
  227. // 请假类型数组
  228. _this.holidayType = {}
  229. for (var i = 0; i < list.length; i++) {
  230. var typeId = list[i].holidayTypeId.id
  231. _this.holidayType[typeId] = {
  232. holidayPolicyId: list[i].holidayPolicyInfo.id,
  233. sourceUnit: list[i].unit,
  234. sourceHolidayType: list[i].holidayTypeId,
  235. description: list[i].description
  236. }
  237. }
  238. if (mbos.getRequestParams().type && mbos.getRequestParams().holidayTypeId){
  239. // 从我的假期页面跳转过来,携带赋值假期类型
  240. mbos('entries_sourceHolidayType', e.index).value({
  241. id: decodeURIComponent(mbos.getRequestParams().holidayTypeId),
  242. name: mbos.getRequestParams().type
  243. })
  244. }
  245. if (mbos('entries_sourceHolidayType', e.index).value()) {
  246. _this.typeChange({
  247. index: e.index,
  248. new_value: mbos('entries_sourceHolidayType', e.index).value(),
  249. old_value: ''
  250. })
  251. }
  252. }
  253. var date = mbos.getRequestParams().date || new Date()
  254. // 需要传参时间,默认为当天 或其他页面带过来的参数
  255. var today = moment(date).format('YYYY-MM-DD')
  256. if (!mbos('entries_beginTime', e.index).value()) {
  257. mbos('entries_beginTime', e.index).value(today + ' 00:00')
  258. mbos('entries_beginYMD', e.index).value(today)
  259. }
  260. if (!mbos('entries_endTime', e.index).value()) {
  261. mbos('entries_endTime', e.index).value(today + ' 23:59')
  262. mbos('entries_endYMD', e.index).value(today)
  263. }
  264. setModel()
  265. baseInterface('getHolidayTypeByPerson', callback, e.index)
  266. }, 0)
  267. // 接口计算请假时长
  268. var getTimeLength = _.debounce(function (index) {
  269. var callback = function (res) {
  270. mbos('entries_leaveLength', index).value(res.data.leaveBillDays)
  271. _this.entryleaveDay[index] = res.data.leaveBillDays
  272. }
  273. var addDayCallback = function (res) {
  274. var isHalf = _this['isHalf' + index];
  275. mbos('entries_leaveLength', index).value(res.data.leaveLength);
  276. _this.entryleaveDay[index] = res.data.leaveBillDays
  277. if(isHalf){
  278. _this['beginHMS_'+index] = res.data.amStartWorkTime
  279. _this['endHMS_'+index] = res.data.pmEndWorkTime
  280. }else{
  281. _this['beginHMS_'+index] = res.data.beginHMS
  282. _this['endHMS_'+index] = res.data.endHMS
  283. }
  284. var beginHMS = isHalf ? res.data.amStartWorkTime : res.data.beginHMS;
  285. var endHMS = isHalf ? res.data.pmEndWorkTime : res.data.endHMS;
  286. _this['fullBeginTime_'+index] = res.data.beginYMD.split(" ")[0] + " " + beginHMS;
  287. _this['fullEndTime_'+index] = res.data.endYMD.split(" ")[0] + " " + endHMS;
  288. _this.changeTime = true
  289. mbos("entries_beginTime_"+index).value(res.data.beginYMD);
  290. mbos("entries_endTime_"+index).value(res.data.endYMD);
  291. setTimeout(function(){
  292. _this.changeTime = false
  293. $("#entries_beginTime_"+index+" .ng-pristine").val(_this['fullBeginTime_'+index])
  294. $("#entries_endTime_"+index+" .ng-pristine").val(_this['fullEndTime_'+index])
  295. })
  296. }
  297. var params = getModel(index,'changeLeaveBillTime') // 封装model,不走common的封装
  298. var entry = mbos('entity').data.entries[index]
  299. if (entry.beginTime && entry.endTime && entry.sourceHolidayType) {
  300. //整天请假
  301. var holidayTypeId = entry.sourceHolidayType.id;
  302. if(entry.isAllDay && holidayTypeId !== _this.bfTypeValue){
  303. var param = _.cloneDeep(params);
  304. param.entries[0].beginTime =entry.beginYMD ||entry.beginTime.split(" ")[0];
  305. param.entries[0].endTime = entry.endYMD || entry.endTime.split(" ")[0];
  306. param.entries[0].holidayTypeId = holidayTypeId
  307. param.entries[0].personId = params.entries[0].person.id;
  308. baseInterface('changeLeaveBillTime',addDayCallback, index, param)
  309. //非整体请假
  310. }
  311. baseInterface('getBillLength', callback, index, params)
  312. }
  313. }, 500)
  314. // 获取假期剩余额度单位
  315. var getRemainLength = _.debounce(function (event) {
  316. var index = event.index
  317. var entry = mbos('entity').data.entries[index]
  318. delete entry.SourceHolidayType
  319. if (entry.beginTime && entry.endTime && entry.sourceHolidayType) {
  320. var callback = function (res) {
  321. if (!res.data) {
  322. $('#remainCard_' + index).css('display', 'none')
  323. return
  324. }
  325. if (res && res.data) {
  326. var type = _this.holidayType[mbos('entries_sourceHolidayType', index).value().id]
  327. $('#remainCard_' + index).css('display', 'flex')
  328. //document.getElementById('remainCard_' + index).innerText = `${type.sourceHolidayType.name} ${localeResource.remained}${res.data.remainLimitVal}${type.sourceUnit.alias} ${localeResource.remainedDays}`
  329. document.getElementById('remainCard_' + index).innerText = type.sourceHolidayType.name+' '+localeResource.remained+res.data.remainLimitVal+type.sourceUnit.alias+localeResource.remainedDays
  330. }
  331. }
  332. setModel()
  333. baseInterface('getHolidayLimitByHolidayType', callback, index)
  334. }
  335. }, 200)
  336. // 根据时间判断 是否展示弹性算时长字段
  337. var isElastic = _.debounce(function (index) {
  338. var callback = function (res) {
  339. if (res.data) {
  340. mbos('entries_isElasticCalLen', index).show()
  341. } else {
  342. mbos('entries_isElasticCalLen', index).hide()
  343. }
  344. }
  345. // TODO holidayPolicyId待添加
  346. setModel(index)
  347. var entry = mbos('entity').data.entries[index]
  348. if (entry.beginTime && entry.endTime) {
  349. baseInterface('showIsElasticCalCtrl', callback, index)
  350. }
  351. }, 500)
  352. /**
  353. * 修改开始结束时间的格式
  354. * YYYY-MM-DD : 非【自定义】的所有哺乳假类型
  355. * YYYY-MM-DD HH:mm:未启用半天假的非哺乳假;【自定义】的哺乳假类型且未启用半天假;
  356. * YYYY-MM-DD AM/PM:启用半天假的非哺乳假、【自定义】的哺乳假类型且启用半天假
  357. */
  358. function beginEndFormat(format, index) {
  359. mbos('entries.beginTime', index).timeFormat(format);
  360. mbos('entries.endTime', index).timeFormat(format);
  361. }
  362. // 是否开启半天假
  363. function isHalfHoliday(index, timeFormat) {
  364. var callback = function (res) {
  365. if (res.data && res.data.isHalfDayOff) {
  366. // 先赋值 在设置半天假 最后格式化时间,顺序不能变
  367. _this['isHalf' + index] = res.data
  368. // setHalfDay(index)// 设置开启半天假的样式
  369. // beginEndFormat('YYYY-MM-DD', index)
  370. } else {
  371. _this['isHalf' + index] = false
  372. // hideHalfDay(index)// 隐藏半天假
  373. // beginEndFormat(timeFormat ? timeFormat : 'YYYY-MM-DD HH:mm', index)
  374. }
  375. _this.setTimeVisiable(index);
  376. }
  377. setModel()
  378. baseInterface('getSetIsCtrlHalfDayOff', callback, index)
  379. }
  380. // 设置开启半天假的样式
  381. function setHalfDay1(index) {
  382. $('#entries_beginTime_' + index).removeClass('col-xs-12').addClass('col-xs-9')
  383. $('#entries_endTime_' + index).removeClass('col-xs-12').addClass('col-xs-9')
  384. // mbos('beginHalf', index).show()
  385. // mbos('endHalf', index).show()
  386. $('#beginHalf_' + index).css("display", "block")
  387. $('#endHalf_' + index).css("display", "block")
  388. var half = {
  389. am: { alias: localeResource.AM, value: "am" },
  390. pm: { alias: localeResource.PM, value: "pm" },
  391. }
  392. var halfData = _this['isHalf' + index] // 半天假及时间字段
  393. // 编辑时 根据时间判断
  394. var startHM = halfData.pmBeginTime === mbos('entries_beginTime', index).value().split(' ')[1] ? half.pm : half.am
  395. var endHM = halfData.amEndTime === mbos('entries_endTime', index).value().split(' ')[1] ? half.am : half.pm
  396. //mbos('beginHalf', index).value(startHM)
  397. //mbos('endHalf', index).value(endHM)
  398. if(!mbos('beginHalf', index).value()){
  399. mbos('beginHalf', index).value(startHM)
  400. }
  401. if(!mbos('endHalf', index).value()){
  402. mbos('endHalf', index).value(endHM)
  403. }
  404. }
  405. // 设置开启半天假的样式
  406. function setHalfDay(index) {
  407. // 样式变动
  408. $('#entries_beginTime_' + index).removeClass('col-xs-12').addClass('col-xs-8')
  409. $('#entries_endTime_' + index).removeClass('col-xs-12').addClass('col-xs-8')
  410. $('#beginHalf_' + index).css("display", "block")
  411. $('#endHalf_' + index).css("display", "block")
  412. halfClick(index) // 半天枚举控件的点击事件
  413. var halfData = _this['isHalf' + index] // 半天假及时间字段
  414. var half = {}
  415. half[halfData.amBeginTime] = { alias: localeResource.AM + ' ' + halfData.amBeginTime, value: "amBeginTime" }
  416. half[halfData.amEndTime] = { alias: localeResource.AM + ' ' + halfData.amEndTime, value: "amEndTime" }
  417. half[halfData.pmBeginTime] = { alias: localeResource.PM + ' ' + halfData.pmBeginTime, value: "pmBeginTime" }
  418. half[halfData.pmEndTime] = { alias: localeResource.PM + ' ' + halfData.pmEndTime, value: "pmEndTime" }
  419. _this.halfEnum = half
  420. // 编辑时 根据时间判断
  421. var sTime = mbos('entries_beginTime', index).value().split(' ')[1]
  422. var eTime = mbos('entries_endTime', index).value().split(' ')[1]
  423. var startHM = half[sTime] || half[halfData.amBeginTime]
  424. var endHM = half[eTime] || half[halfData.pmEndTime]
  425. mbos('beginHalf', index).value(startHM)
  426. mbos('endHalf', index).value(endHM)
  427. }
  428. // 半天控件的点击事件 给枚举选项拼接时分
  429. function halfClick(index){
  430. var list = ["amBeginTime","amEndTime","pmBeginTime","pmEndTime"]
  431. $('#beginHalf_'+index).click(function () {
  432. setTimeout(function(){
  433. var enumList = $('.seldiv .ng-binding')
  434. for (var i = 0; i < enumList.length; i++) {
  435. if(i == 1 || i == 3){
  436. enumList.eq(i).closest('li').hide();
  437. }
  438. enumList[i].innerHTML = enumList[i].innerHTML.split(' ')[0] + ' ' + _this['isHalf' + index][list[i]]
  439. }
  440. }, 0)
  441. })
  442. $('#endHalf_'+index).click(function () {
  443. setTimeout(function(){
  444. var enumList = $('.seldiv .ng-binding')
  445. for (var i = 0; i < enumList.length; i++) {
  446. enumList.eq(i).closest('li').show();
  447. if(i == 0 || i == 2){
  448. enumList.eq(i).closest('li').hide();
  449. }
  450. enumList[i].innerHTML = enumList[i].innerHTML.split(' ')[0] + ' ' + _this['isHalf' + index][list[i]]
  451. }
  452. }, 0)
  453. })
  454. }
  455. // 隐藏半天假
  456. function hideHalfDay(index) {
  457. $('#entries_beginTime_' + index).removeClass('col-xs-8').addClass('col-xs-12')
  458. $('#entries_endTime_' + index).removeClass('col-xs-8').addClass('col-xs-12')
  459. mbos('beginHalf', index).hide()
  460. mbos('endHalf', index).hide()
  461. }
  462. // 监听请假类型
  463. _this.typeChange = function (event) {
  464. var index = event.index
  465. var entry = mbos('entity').data.entries[index]
  466. if (!event.new_value) return //清空
  467. var type = _this.holidayType && _this.holidayType[event.new_value.id]
  468. if (type) {
  469. entry.sourceUnit = type.sourceUnit // 1是天 2是小时
  470. entry.holidayPolicyId = type.holidayPolicyId
  471. entry.SourceHolidayType = type.sourceHolidayType.id
  472. }
  473. // 是否是哺乳假
  474. var sourceHolidayTypeValue = mbos('entries_sourceHolidayType', index).value();
  475. if (sourceHolidayTypeValue && (sourceHolidayTypeValue.id == _this.bfTypeValue || sourceHolidayTypeValue.name == localeResource.bf_holiday)) {
  476. mbos('entries.isAllDay', index).hide()
  477. mbos('entries_isAllDay',index).value(false)
  478. // 请假类型为【哺乳假】则显示 哺乳假类型、子女出生日期、产假结束日期
  479. mbos('entries.bfType', index).show()
  480. var format = 'YYYY-MM-DD'
  481. if (mbos('entries_bfType', index).value()) {
  482. if(mbos('entries_bfType', index).value().name == localeResource.Customized){
  483. format = 'YYYY-MM-DD HH:mm'
  484. } else {
  485. mbos('entries.childbirthday', index).show()
  486. mbos('entries.mLEndTime', index).show()
  487. }
  488. } else {
  489. // 如果哺乳假类型不存在则默认为自定义
  490. mbos('entries_bfType', index).value({id: _this.customeBf, name: localeResource.Customized})
  491. format = 'YYYY-MM-DD HH:mm'
  492. }
  493. isHalfHoliday(index, format) // 判断是否启用半天假
  494. } else {// 非哺乳假时间格式只有两种:【年月日时分】、【年月日 上/下午】。启用半天假时为【年月日 上/下午】,其他的都是【年月日时分】;
  495. // 其他类型则隐藏
  496. mbos('entries.bfType', index).hide()
  497. mbos('entries_bfType', index).value('')
  498. mbos('entries.childbirthday', index).hide()
  499. mbos('entries.childbirthday', index).value('')
  500. mbos('entries.mLEndTime', index).hide()
  501. mbos('entries.mLEndTime', index).value('')
  502. if(_this.hasAllDayField === 'hasAllDayField'){
  503. mbos('entries.isAllDay', index).show()
  504. }
  505. isHalfHoliday(index) // 判断是否启用半天假
  506. }
  507. if (entry.sourceUnit) {
  508. mbos('entries_leaveLength', index).attr('title', _this.leaveLengthTitle +`(${entry.sourceUnit.alias})`);
  509. }
  510. getTimeLength(index)
  511. getRemainLength(event)
  512. getExplain(index)
  513. }
  514. // 监听 开始时间
  515. _this.calTime1 = function (event) {
  516. if(_this.changeTime) return;
  517. var beginalue = mbos('entries.beginTime',event.index).value();
  518. var endValue = mbos('entries.endTime',event.index).value();
  519. var newEndValue = endValue;
  520. if(new Date(beginalue).getTime() > new Date(endValue).getTime()){
  521. if(endValue && endValue.split(' ').length >= 2){
  522. newEndValue = beginalue.split(' ')[0] + ' ' + endValue.split(' ')[1];
  523. mbos('entries.endTime',event.index).value(newEndValue.split(' ')[0]+" 23:59");
  524. }else{
  525. newEndValue = beginalue;
  526. mbos('entries.endTime',event.index).value(newEndValue);
  527. }
  528. mbos("entries.endYMD",event.index).value(newEndValue);
  529. }
  530. getHolidayType(event)
  531. getTimeLength(event.index)
  532. isElastic(event.index)
  533. getRemainLength(event)
  534. }
  535. // 监听 结束时间
  536. _this.calTime2 = function (event) {
  537. if(_this.changeTime) return;
  538. var beginalue = mbos('entries.beginTime',event.index).value();
  539. var endValue = mbos('entries.endTime',event.index).value();
  540. var newBeginValue = beginalue;
  541. if(new Date(beginalue).getTime() > new Date(endValue).getTime()){
  542. if(beginalue && beginalue.split(' ').length >= 2){
  543. newBeginValue = endValue.split(' ')[0] + ' ' + endValue.split(' ')[1];
  544. mbos('entries.beginTime',event.index).value(newBeginValue.split(' ')[0]+" 00:00");
  545. }else{
  546. newBeginValue = endValue;
  547. mbos('entries.beginTime',event.index).value(newBeginValue);
  548. }
  549. mbos("entries.beginYMD",event.index).value(newBeginValue);
  550. }
  551. getHolidayType(event)
  552. getTimeLength(event.index)
  553. isElastic(event.index)
  554. getRemainLength(event)
  555. }
  556. // 监听 子女出生日期
  557. _this.birthdayChange = function (event) {
  558. // 请假开始时间默认值:产假结束日期,再加1天;
  559. if (event.new_value) {
  560. var value = moment(mbos('entries_childbirthday', event.index).value()).add(1, 'years').format('YYYY-MM-DD')
  561. value = moment(value).subtract(1, 'days').format('YYYY-MM-DD')
  562. mbos('entries.endTime', event.index).value(value)
  563. }
  564. }
  565. // 监听 产假结束日期
  566. _this.mlEndChange = function (event) {
  567. // 请假结束时间默认值:子女出生日期延后一年,再减1天;
  568. if (event.new_value) {
  569. var value = moment(mbos('entries_mLEndTime', event.index).value()).add(1, 'days').format('YYYY-MM-DD')
  570. mbos('entries.beginTime', event.index).value(value)
  571. }
  572. }
  573. // 监听 哺乳假类型
  574. _this.bfTypeChange = function (event) {
  575. var index = event.index
  576. // 哺乳假类型是否为【自定义】
  577. if (!mbos('entries_bfType', index).value()){
  578. // 如果哺乳假类型不存在则默认为自定义
  579. setTimeout(function(){
  580. mbos('entries_bfType', index).value({id: _this.customeBf, name: localeResource.Customized})
  581. }, 0)
  582. }
  583. if (mbos('entries_bfType', index).value() && (mbos('entries_bfType', index).value().id == _this.customeBf || mbos('entries_bfType', index).value().name == localeResource.Customized)) {
  584. // 【自定义】: 则不展示【子女出生日期、产假结束日期】
  585. mbos('entries.childbirthday', index).value('')
  586. mbos('entries.childbirthday', index).hide()
  587. mbos('entries.mLEndTime', index).value('')
  588. mbos('entries.mLEndTime', index).hide()
  589. // 哺乳假类型为【自定义】时,启用半天假时为【年月日 上/下午】,其他的都是【年月日 时分】
  590. isHalfHoliday(index) // 判断是否启用半天假
  591. } else {
  592. // 非【自定义】的所有哺乳假类型 日期格式为年月日
  593. beginEndFormat('YYYY-MM-DD', index)
  594. mbos('entries.childbirthday', index).show()
  595. mbos('entries.mLEndTime', index).show()
  596. }
  597. getTimeLength(event.index)
  598. }
  599. // 监听是否是弹性算时长
  600. _this.isElasticChange = function (event) {
  601. getTimeLength(event.index)
  602. }
  603. // 更改半天假开始
  604. _this.calTime3 = function (event) {
  605. if (event.new_value.alias.split(' ').length === 1 ){
  606. event.new_value.alias += ' '+ _this['isHalf' + event.index][event.new_value.value]
  607. }
  608. getTimeLength(event.index)
  609. }
  610. // 更改半天假结束
  611. _this.calTime4 = function (event) {
  612. if (event.new_value.alias.split(' ').length === 1 ){
  613. event.new_value.alias += ' '+ _this['isHalf' + event.index][event.new_value.value]
  614. }
  615. getTimeLength(event.index)
  616. }
  617. // 时长更改时 做校验
  618. _this.lengthChange = function(event){
  619. var value = event.new_value
  620. // 判断是否等于小于0
  621. if (!isNaN(parseFloat(value)) && value <= 0) {
  622. mbos.msgBox.showError(localeResource.lengthValid);
  623. setTimeout(function(){
  624. mbos('entries_leaveLength',event.index).value('')
  625. })
  626. return
  627. }
  628. }
  629. //更新整体请假
  630. _this.isAllDayChange = function(event){
  631. var index = event.index
  632. _this.setTimeVisiable(index);
  633. getTimeLength(index)
  634. }
  635. //设置半天假的上午下午选择框可见不可见
  636. _this.setTimeVisiable = function(index){
  637. var isAllDay = mbos("entries_isAllDay",index).value();
  638. var isHalf = _this['isHalf' + index] ? _this['isHalf' + index].isHalfDayOff : false;
  639. if(isAllDay){
  640. if(isHalf){
  641. hideHalfDay(index)
  642. }
  643. _this.changeTime = true
  644. beginEndFormat('YYYY-MM-DD', index)
  645. setTimeout(()=>{
  646. _this.changeTime = false
  647. })
  648. }else{
  649. if(isHalf){
  650. //半天假时 整天请假需要显示时间点,切换为非整天请假时需要将时间点去掉
  651. var beginTime = $("#entries_beginTime_"+index+" .ng-pristine").val();
  652. var endTime = $("#entries_endTime_"+index+" .ng-pristine").val()
  653. $("#entries_beginTime_"+index+" .ng-pristine").val(beginTime ? beginTime.split(" ")[0]:'')
  654. $("#entries_endTime_"+index+" .ng-pristine").val(endTime ? endTime.split(" ")[0]:'')
  655. setHalfDay(index)
  656. }else{
  657. hideHalfDay(index)
  658. }
  659. _this.changeTime = true
  660. //半天假和非自定义哺乳假
  661. if(isHalf || _this.isCustomBr(index)==="noCustomBf"){
  662. beginEndFormat('YYYY-MM-DD', index)
  663. }else{
  664. _this.setTimeYMDHM('YYYY-MM-DD HH:mm', index)
  665. }
  666. setTimeout(()=>{
  667. _this.changeTime = false
  668. })
  669. }
  670. }
  671. _this.setTimeYMDHM = function(format, index){
  672. mbos('entries.beginTime', index).timeFormat(format);
  673. mbos('entries.endTime', index).timeFormat(format);
  674. var startTimeValue = mbos('entries.beginTime', index).value();
  675. var endTimeValue = mbos('entries.endTime', index).value();
  676. var isAllDay = mbos('entries.isAllDay', index).value();
  677. var endDate = endTimeValue ? endTimeValue.split(" ")[0] : '';
  678. var endTime = endTimeValue && endTimeValue.split(" ").length == 2 ? endTimeValue.split(" ")[1] : '';
  679. var startDate = startTimeValue ? startTimeValue.split(" ")[0] : '';
  680. var startTime = startTimeValue && startTimeValue.split(" ").length == 2 ? startTimeValue.split(" ")[1] : '';
  681. if(!isAllDay && endTime.indexOf('00:00')!== -1 && startDate===endDate){
  682. var endDate = endTimeValue.split(" ")[0];
  683. mbos('entries.endTime', index).value(endDate+" 23:59")
  684. }
  685. },
  686. _this.bindDateChange = function(index){
  687. $("#entries_beginTime_"+index+" .mobInput").bind('change',function(){
  688. var value = mbos("entries_beginTime_"+index).value();
  689. value = value ? value.split(" ")[0] : '';
  690. mbos("entries_beginYMD_"+index).value(value);
  691. //当开始日期大于于用户选的结束日期时将结束时间设置为开始日期
  692. var endYMD = mbos("entries_endYMD_"+index).value();
  693. if(new Date(endYMD).getTime() < new Date(value).getTime()){
  694. mbos("entries_endYMD_"+index).value(value);
  695. }
  696. })
  697. $("#entries_endTime_"+index+" .mobInput").bind('change',function(){
  698. var value = mbos("entries_endTime_"+index).value();
  699. value = value ? value.split(" ")[0] : '';
  700. mbos("entries_endYMD_"+index).value(value);
  701. //当结束日期小于用户选的开始日期时将开始时间设置为结束日期
  702. var beginYMD = mbos("entries_beginYMD_"+index).value();
  703. if(new Date(beginYMD).getTime() > new Date(value).getTime()){
  704. mbos("entries_beginYMD_"+index).value(value);
  705. }
  706. })
  707. // 工作流根据请假类型匹配不同的流程定义,请假类型改变后要刷新下一步参与人控件
  708. mbos("entries.sourceHolidayType",index).bind("change",function(newF7Value) {
  709. var model = mbos('entity').value();
  710. var param = $.extend(true, {}, model);
  711. var entries = param.entries;
  712. if(entries && entries.length>0){
  713. entries[index].sourceHolidayType = newF7Value;
  714. // 这几个字段导致model转单据实体失败,先去掉待shr排查!
  715. delete entries[index].beginTime;
  716. delete entries[index].beginYMD;
  717. delete entries[index].endTime;
  718. delete entries[index].endYMD;
  719. }
  720. mbos('nextperson1').getNextPerson(param,null);
  721. });
  722. }
  723. _this.sflsChange = function(event){
  724. var index = event.index;
  725. _this.controlPlaceRequired(index);
  726. }
  727. _this.sfcgjChange = function(event){
  728. var index = event.index;
  729. _this.controlPlaceRequired(index);
  730. }
  731. // 核心:控制目的地必填 + 前端标红 20260507
  732. _this.controlPlaceRequired = function(index){
  733. // 替换成你自己两个布尔字段编码、目的地字段编码
  734. var b1 = mbos('entries_sfls', index).value();
  735. var b2 = mbos('entries_sfcgj', index).value();
  736. var needReq = b1 || b2;
  737. // 1. 设置 MBOS 内部必录属性(给后台校验用)
  738. mbos('entries_place', index).attr('mustinput', needReq);
  739. // 2. 找到目的地的 label 标签
  740. var $fieldContainer = $('#entries_place_' + index);
  741. var $label = $fieldContainer.find('label.lclabel');
  742. if (!$label.length) return;
  743. // 3. 先移除旧的红星(防止重复添加)
  744. $label.find('i.mustinput').remove();
  745. // 4. 需要必填时,添加 MBOS 原生红星 <i class="mustinput">*</i>
  746. if (needReq) {
  747. $label.append('<i class="mustinput">*</i>');
  748. }
  749. }
  750. // ====================== 多分录目的地必填校验(通用方法)======================
  751. _this.validatePlaceRequired = function(){
  752. // 1. 获取所有分录行数
  753. var entries = mbos('entity').data.entries;
  754. if(!entries || entries.length === 0) return true;
  755. // 2. 遍历每一行进行校验
  756. for(var i = 0; i < entries.length; i++){
  757. var sfls = mbos('entries_sfls', i).value() || false;
  758. var sfcgj = mbos('entries_sfcgj', i).value() || false;
  759. var place = mbos('entries_place', i).value();
  760. // 3. 判断:任一勾选,但目的地为空
  761. if((sfls || sfcgj) && (!place || !place.trim())){
  762. // 4. 提示具体是第几行
  763. mbos.msgBox.showError('第' + (i+1) + '行:勾选了【是否离深】或【是否出国境】时,请填写目的地!');
  764. return false; // 校验不通过,返回 false
  765. }
  766. }
  767. return true; // 所有行都校验通过,返回 true
  768. };