LeaveApplyService.java 154 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950
  1. /**
  2. * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
  3. */
  4. package com.jeeplus.modules.leaveapply.service;
  5. import java.text.DateFormat;
  6. import java.text.ParseException;
  7. import java.text.SimpleDateFormat;
  8. import java.util.*;
  9. import com.google.common.collect.Maps;
  10. import com.jeeplus.common.json.AjaxJson;
  11. import com.jeeplus.common.utils.DateUtils;
  12. import com.jeeplus.common.utils.MenuStatusEnum;
  13. import com.jeeplus.common.utils.StringUtils;
  14. import com.jeeplus.modules.act.service.ActTaskService;
  15. import com.jeeplus.modules.leaveapply.dao.LeaveCountDao;
  16. import com.jeeplus.modules.leaveapply.dao.LeaveDetailDao;
  17. import com.jeeplus.modules.leaveapply.entity.LeaveCount;
  18. import com.jeeplus.modules.leaveapply.entity.LeaveDetail;
  19. import com.jeeplus.modules.leavetype.dao.LeaveTypeDao;
  20. import com.jeeplus.modules.leavetype.entity.LeaveType;
  21. import com.jeeplus.modules.serialnum.service.SerialNumTplService;
  22. import com.jeeplus.modules.sys.dao.OfficeDao;
  23. import com.jeeplus.modules.sys.dao.UserDao;
  24. import com.jeeplus.modules.sys.entity.Office;
  25. import com.jeeplus.modules.sys.entity.User;
  26. import com.jeeplus.modules.sys.utils.UserUtils;
  27. import com.jeeplus.modules.utils.ErrorCode;
  28. import com.jeeplus.modules.workactivity.dao.WorkActivityProcessDao;
  29. import com.jeeplus.modules.workactivity.entity.Activity;
  30. import com.jeeplus.modules.workactivity.entity.WorkActivityProcess;
  31. import com.jeeplus.modules.workactivity.service.ActivityService;
  32. import com.jeeplus.modules.workactivity.service.WorkActivityProcessService;
  33. import com.jeeplus.modules.workactivitymenu.entity.WorkActivityMenu;
  34. import com.jeeplus.modules.workactivitymenu.service.WorkActivityMenuService;
  35. import com.jeeplus.modules.workattendance.dao.WorkAttendanceInfoDao;
  36. import com.jeeplus.modules.workattendance.entity.WorkAttendanceInfo;
  37. import com.jeeplus.modules.workattendance.entity.WorkAttendanceMonth;
  38. import com.jeeplus.modules.workattendance.entity.WorkAttendanceRule;
  39. import com.jeeplus.modules.workattendance.service.WorkAttendanceInfoService;
  40. import com.jeeplus.modules.workattendance.service.WorkAttendanceRuleService;
  41. import com.jeeplus.modules.workborrowmangement.entity.WorkBorrowMangement;
  42. import com.jeeplus.modules.workcalendar.service.WorkCalendarService;
  43. import com.jeeplus.modules.workclientinfo.dao.WorkClientAttachmentDao;
  44. import com.jeeplus.modules.workclientinfo.entity.WorkClientAttachment;
  45. import com.jeeplus.modules.workitem.entity.WorkItem;
  46. import com.jeeplus.modules.workitemcollar.entity.WorkItemCollar;
  47. import com.jeeplus.modules.workitemcollar.entity.WorkItemCollarCatalog;
  48. import com.jeeplus.modules.workprojectnotify.entity.WorkProjectNotify;
  49. import com.jeeplus.modules.workprojectnotify.service.WorkProjectNotifyService;
  50. import com.jeeplus.modules.workprojectnotify.util.UtilNotify;
  51. import com.jeeplus.modules.workstaff.dao.WorkStaffAchivesDao;
  52. import com.jeeplus.modules.workstaff.entity.WorkStaffBasicInfo;
  53. import org.activiti.engine.HistoryService;
  54. import org.activiti.engine.IdentityService;
  55. import org.activiti.engine.RuntimeService;
  56. import org.activiti.engine.runtime.ProcessInstance;
  57. import org.apache.commons.lang3.time.DateFormatUtils;
  58. import org.springframework.beans.factory.annotation.Autowired;
  59. import org.springframework.context.annotation.Lazy;
  60. import org.springframework.stereotype.Service;
  61. import org.springframework.transaction.annotation.Transactional;
  62. import com.jeeplus.common.persistence.Page;
  63. import com.jeeplus.common.service.CrudService;
  64. import com.jeeplus.modules.leaveapply.entity.LeaveApply;
  65. import com.jeeplus.modules.leaveapply.dao.LeaveApplyDao;
  66. import org.springframework.ui.Model;
  67. import org.springframework.web.bind.annotation.RequestMapping;
  68. import org.springframework.web.bind.annotation.RequestMethod;
  69. import org.springframework.web.bind.annotation.ResponseBody;
  70. import javax.servlet.http.HttpServletRequest;
  71. import javax.servlet.http.HttpServletResponse;
  72. /**
  73. * 请假申请Service
  74. * @author ssrh
  75. * @version 2018-09-10
  76. */
  77. @Service
  78. @Transactional(readOnly = true)
  79. public class LeaveApplyService extends CrudService<LeaveApplyDao, LeaveApply> {
  80. @Autowired
  81. private WorkStaffAchivesDao workStaffAchivesDao;
  82. @Autowired
  83. private LeaveDetailDao leaveDetailDao;
  84. @Autowired
  85. private WorkProjectNotifyService workProjectNotifyService;
  86. @Autowired
  87. private IdentityService identityService;
  88. @Autowired
  89. private ActTaskService actTaskService;
  90. @Autowired
  91. private WorkActivityMenuService workActivityMenuService;
  92. @Autowired
  93. private RuntimeService runtimeService;
  94. @Autowired
  95. private WorkActivityProcessService workActivityProcessService;
  96. @Autowired
  97. private ActivityService activityService;
  98. @Autowired
  99. protected HistoryService historyService;
  100. @Autowired
  101. private WorkActivityProcessDao workActivityProcessDao;
  102. @Autowired
  103. private SerialNumTplService serialNumTplService;
  104. @Autowired
  105. private UserDao userDao;
  106. @Autowired
  107. private WorkCalendarService workCalendarService;
  108. @Autowired
  109. private OfficeDao officeDao;
  110. @Autowired
  111. @Lazy
  112. private WorkAttendanceInfoService workAttendanceInfoService;
  113. @Autowired
  114. @Lazy
  115. private WorkAttendanceRuleService workAttendanceRuleService;
  116. @Autowired
  117. private WorkClientAttachmentDao workClientAttachmentDao;
  118. @Autowired
  119. private WorkAttendanceInfoDao workAttendanceInfoDao;
  120. @Autowired
  121. private LeaveCountService leaveCountService;
  122. @Autowired
  123. private LeaveCountDao leaveCountDao;
  124. @Autowired
  125. private LeaveTypeDao leaveTypeDao;
  126. public LeaveApply get(String id) {
  127. LeaveApply leaveApply = super.get(id);
  128. if(leaveApply!=null){
  129. //附件
  130. WorkClientAttachment workClientAttachment = new WorkClientAttachment();
  131. workClientAttachment.setAttachmentId(id);
  132. workClientAttachment.setAttachmentFlag("114");
  133. leaveApply.setWorkAttachments(workClientAttachmentDao.findList(workClientAttachment));
  134. }
  135. return leaveApply;
  136. }
  137. public List<LeaveApply> findList(LeaveApply leaveApply) {
  138. // leaveApply.setCreateBy(UserUtils.getUser());
  139. leaveApply.getSqlMap().put("dsf", dataScopeFilter(leaveApply.getCurrentUser(), "o", "u","s", MenuStatusEnum.WORK_LEAVE.getValue()));
  140. return super.findList(leaveApply);
  141. }
  142. public LeaveApply getByStaffIdAndTime(String staffId, String time) {
  143. LeaveApply leaveApply = dao.getByStaffIdAndTime(staffId, time);
  144. return leaveApply;
  145. }
  146. public Page<LeaveApply> findPage(Page<LeaveApply> page, LeaveApply leaveApply) {
  147. leaveApply.setPage(page);
  148. page.setList(findList(leaveApply));
  149. return page;
  150. }
  151. public List<LeaveApply> getCount() {
  152. WorkStaffBasicInfo workStaffBasicInfo = this.getBasicInfo();
  153. LeaveApply leaveApply = new LeaveApply();
  154. leaveApply.setBasicInfo(workStaffBasicInfo);
  155. List<LeaveApply> list = dao.getCount(leaveApply);
  156. return list;
  157. }
  158. //当前登录人档案
  159. public WorkStaffBasicInfo getBasicInfo() {
  160. WorkStaffBasicInfo w = new WorkStaffBasicInfo();
  161. w.setUserId(UserUtils.getUser().getId());
  162. w.setCompany(UserUtils.getSelectCompany());
  163. WorkStaffBasicInfo workStaffBasicInfo = workStaffAchivesDao.getBasicInfo(w);
  164. return workStaffBasicInfo;
  165. }
  166. //获取最后一次请假结束时间
  167. public String getMaxTime(String staffId,String id) {
  168. return dao.getMaxTime(staffId,id);
  169. }
  170. //请假
  171. @Transactional(readOnly = false)
  172. public void save(LeaveApply leaveApply) {
  173. super.save(leaveApply);
  174. updateLeaveDetail(leaveApply);
  175. updateFile(leaveApply);
  176. }
  177. //续假
  178. @Transactional(readOnly = false)
  179. public void saveExtend(LeaveApply leaveApply) {
  180. super.save(leaveApply);
  181. updateExtendDetail(leaveApply);
  182. updateFile(leaveApply);
  183. }
  184. @Transactional(readOnly = false)
  185. public void updateFile(LeaveApply leaveApply) {
  186. //附件信息
  187. for (WorkClientAttachment workClientAttachment : leaveApply.getWorkAttachments()) {
  188. if (workClientAttachment.getId() == null) {
  189. continue;
  190. }
  191. if (WorkClientAttachment.DEL_FLAG_NORMAL.equals(workClientAttachment.getDelFlag())) {
  192. workClientAttachment.setAttachmentId(leaveApply.getId());
  193. workClientAttachment.setAttachmentFlag("114");
  194. workClientAttachment.setAttachmentUser(UserUtils.getUser().getId());
  195. if (StringUtils.isBlank(workClientAttachment.getId()) || "null".equals(workClientAttachment.getId())) {
  196. workClientAttachment.preInsert();
  197. workClientAttachmentDao.insert(workClientAttachment);
  198. } else {
  199. workClientAttachment.preUpdate();
  200. workClientAttachmentDao.update(workClientAttachment);
  201. }
  202. } else {
  203. workClientAttachmentDao.delete(workClientAttachment);
  204. }
  205. }
  206. }
  207. @Transactional(readOnly = false)
  208. public void updateLeaveDetail(LeaveApply leaveApply) {
  209. if (leaveApply.getLeaveDetailList() != null && leaveApply.getLeaveDetailList().size() > 0) {
  210. for (LeaveDetail leaveDetail : leaveApply.getLeaveDetailList()) {
  211. if (StringUtils.isBlank(leaveDetail.getId())) {
  212. leaveDetail.preInsert();
  213. leaveDetail.setLeaveId(leaveApply.getId());
  214. leaveDetail.setFlat("1");//请假
  215. leaveDetail.setState("0");//请假
  216. leaveDetail.setIsUse("0");//有效
  217. leaveDetail.setRealDays(leaveDetail.getDays());
  218. leaveDetail.setRealEndTime(leaveDetail.getEndTime());
  219. leaveDetail.setRealEndType(leaveDetail.getEndType());
  220. if (StringUtils.isNotBlank(leaveApply.getId())) {
  221. leaveDetailDao.insert(leaveDetail);
  222. }
  223. } else {
  224. if("1".equals(leaveDetail.getStartType())||"2".equals(leaveDetail.getStartType())){
  225. leaveDetail.preUpdate();
  226. leaveDetail.setLeaveId(leaveApply.getId());
  227. if (StringUtils.isNotBlank(leaveApply.getId())) {
  228. leaveDetailDao.update(leaveDetail);
  229. }
  230. }
  231. }
  232. }
  233. }
  234. }
  235. @Transactional(readOnly = false)
  236. public void updateExtendDetail(LeaveApply leaveApply) {
  237. if (leaveApply.getLeaveDetailList() != null && leaveApply.getLeaveDetailList().size() > 0) {
  238. for (LeaveDetail leaveDetail : leaveApply.getLeaveDetailList()) {
  239. if (StringUtils.isBlank(leaveDetail.getId())) {
  240. leaveDetail.preInsert();
  241. leaveDetail.setFlat("2");//续假
  242. leaveDetail.setState("1");//
  243. leaveDetail.setIsUse("0");//有效
  244. leaveDetail.setRealDays(leaveDetail.getDays());
  245. leaveDetail.setRealEndTime(leaveDetail.getEndTime());
  246. leaveDetail.setRealEndType(leaveDetail.getEndType());
  247. leaveDetail.setLeaveId(leaveApply.getId());
  248. if (StringUtils.isNotBlank(leaveApply.getId())) {
  249. leaveDetailDao.insert(leaveDetail);
  250. }
  251. } else {
  252. if("1".equals(leaveDetail.getStartType())||"2".equals(leaveDetail.getStartType())){
  253. leaveDetail.preUpdate();
  254. leaveDetail.setLeaveId(leaveApply.getId());
  255. if (StringUtils.isNotBlank(leaveApply.getId())) {
  256. leaveDetailDao.update(leaveDetail);
  257. }
  258. }
  259. }
  260. }
  261. }
  262. }
  263. @Transactional(readOnly = false)
  264. public void delete(LeaveApply leaveApply) {
  265. super.delete(leaveApply);
  266. //删除子表数据
  267. if (leaveApply.getLeaveDetailList() != null && leaveApply.getLeaveDetailList().size() > 0) {
  268. for (LeaveDetail leaveDetail : leaveApply.getLeaveDetailList()) {
  269. leaveDetailDao.delete(leaveDetail);
  270. }
  271. }
  272. WorkProjectNotify notify = new WorkProjectNotify();
  273. notify.setNotifyId(leaveApply.getId());
  274. List<User> users = workProjectNotifyService.readByNotifyId(notify);
  275. if (users != null && users.size() != 0) {
  276. for (User user : users) {
  277. UserUtils.pushMeIm(user.getId());
  278. }
  279. }
  280. }
  281. @Transactional(readOnly = false)
  282. public String saveBorrow(LeaveApply leaveApply) {
  283. if (StringUtils.isBlank(leaveApply.getNo())) {
  284. leaveApply.setNo(serialNumTplService.genSerialNum(UserUtils.getUser().getCompany(), "30"));
  285. }
  286. if (StringUtils.isBlank(leaveApply.getOfficeId())) {
  287. leaveApply.setOfficeId(UserUtils.getSelectOffice().getId());
  288. }
  289. if (leaveApply.getCompanyId() == null || StringUtils.isBlank(leaveApply.getCompanyId())) {
  290. leaveApply.setCompanyId(UserUtils.getSelectCompany().getId());
  291. }
  292. this.save(leaveApply);
  293. return this.startAudit(leaveApply, leaveApply.getProcessInstanceId());
  294. }
  295. /**
  296. * 请假启动审批流程
  297. */
  298. @Transactional(readOnly = false)
  299. public String startAudit(LeaveApply leaveApply, String processInstanceId) {
  300. try {
  301. Map<String, Object> variables = new HashMap<String, Object>();
  302. identityService.setAuthenticatedUserId(leaveApply.getCurrentUser().getId());
  303. User createUser = UserUtils.getUser();
  304. String contentStr = "请假编号:" + leaveApply.getNo() + ",请假日期:" + DateUtils.formatDate(leaveApply.getApplyTime());
  305. String titleStr = "请假人:" + userDao.get(leaveApply.getApplyer()).getName();
  306. String businessKey = leaveApply.getId();
  307. Office office = UserUtils.getSelectOffice();
  308. WorkActivityMenu workActivityMenu = workActivityMenuService.findByParentAndOffice("zzsql3125f1f194c8lz88a9miiii75090455", office);
  309. // 启动流程
  310. String processType = workActivityMenu.getProcessType();
  311. StringBuffer buffer = new StringBuffer();
  312. Activity activity = new Activity();
  313. WorkProjectNotify workProjectNotify = UtilNotify
  314. .saveNotify(leaveApply.getId(), null, leaveApply.getCompanyId(), titleStr, contentStr, "80", "0", "待审批", "");
  315. List<User> users = new ArrayList<>();
  316. // 部门责任人
  317. List<User> bmzrList = UserUtils.getByRoleActivityEnname("bmzr", 2, office.getId(), "25", leaveApply.getCreateBy());
  318. // 分管领导
  319. List<User> fgldList = UserUtils.getByRoleActivityEnname("fgld", 2, office.getId(), "25", leaveApply.getCreateBy());
  320. // 总经理
  321. List<User> zjlList = UserUtils.getByRoleActivityEnname("zjl", 3, office.getId(), "25", leaveApply.getCreateBy());
  322. if (StringUtils.isNotBlank(workActivityMenu.getId())) {
  323. workProjectNotify.setNotifyRole("");
  324. workActivityMenu = workActivityMenuService.get(workActivityMenu.getId());
  325. List<Activity> activities = workActivityMenu.getActivities();
  326. for (Activity a : activities) {
  327. String encount = a.getEncount();
  328. String enlist = a.getEnlist();
  329. if (a.getRole() != null && StringUtils.isNotBlank(a.getRole().getEnname())) {
  330. List enusers = UserUtils.getByRoleActivityEnnames(a.getRole().getEnname(), office.getId(), "25", leaveApply.getCreateBy());
  331. if (enusers.size() == 0) {
  332. leaveApply.setStatus("1");
  333. this.save(leaveApply);
  334. return "流程审批人不能为空,角色" + a.getRole().getName() + "下无用户,请联系管理员!";
  335. }
  336. variables.put(enlist, enusers);
  337. variables.put(encount, enusers.size());
  338. }
  339. if (a.getDelFlag().equals("0") && a.getCount() == 1) {
  340. activity = a;
  341. }
  342. }
  343. buffer.append(activity.getRole().getEnname());
  344. if (activity != null && StringUtils.isNotBlank(activity.getId())) {
  345. //角色审批
  346. if (StringUtils.isNotBlank(activity.getRole().getEnname())) {
  347. users = UserUtils.getByRoleActivityEnnames(activity.getRole().getEnname(), office.getId(), "25", leaveApply.getCreateBy());
  348. }
  349. //人员审批
  350. if (StringUtils.isNotBlank(activity.getUser().getId())) {
  351. users.add(activity.getUser());
  352. }
  353. }
  354. workProjectNotify.setId("");
  355. } else {
  356. variables.put("bmzrList", bmzrList);
  357. if (bmzrList.size() == 0) {
  358. leaveApply.setStatus("1");
  359. this.save(leaveApply);
  360. }
  361. if (bmzrList.size() == 0) {
  362. return "流程审批人不能为空,角色业务部负责人下无用户,请联系管理员!";
  363. }
  364. variables.put("bmzrCount", bmzrList.size());
  365. processType = "leaveApply";
  366. users.addAll(bmzrList);
  367. }
  368. // 向每个部门负责人发送审批通知
  369. List<String> userIds = new ArrayList<>(users.size());
  370. for (User u : users) {
  371. userIds.add(u.getId());
  372. workProjectNotify.setUser(u);
  373. workProjectNotify.setId("");
  374. workProjectNotify.setNotifyRole("业务部负责人审批");
  375. workProjectNotifyService.save(workProjectNotify);
  376. Map<String, Object> extras = new HashMap<>();
  377. extras.put("type", "7002");
  378. extras.put("procDefKey", "80");
  379. extras.put("id", workProjectNotify.getId());
  380. UserUtils.pushInfoToApp(titleStr, contentStr, extras, u.getId());
  381. }
  382. UserUtils.pushIm(userIds, contentStr);
  383. variables.put("busId", businessKey);
  384. variables.put("type", processType);
  385. variables.put("title", "审批单:" + leaveApply.getNo());//设置标题;
  386. ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processType, businessKey, variables);
  387. if (org.apache.commons.lang3.StringUtils.isNotBlank(processInstanceId)) {
  388. workActivityProcessService.updateProcessInstanceId(processInstance.getId(), processInstanceId);
  389. workActivityProcessService.deleteProcessInstanceId(processInstanceId);
  390. workActivityProcessService.deleteProcessIdAuditUsers(processInstanceId);
  391. }
  392. List<Activity> list = workActivityMenu.getActivities();
  393. if (list != null && list.size() != 0) {
  394. workActivityProcessService.saveList(list, processInstance.getId());
  395. } else {
  396. WorkActivityProcess workActivityProcess = new WorkActivityProcess();
  397. workActivityProcess.setProcessKey(processType);
  398. workActivityProcess.setProcessInstanceId(processInstance.getId());
  399. workActivityProcess.setCount(1);
  400. workActivityProcess.setIsApproval("0");
  401. workActivityProcessService.insert(workActivityProcess);
  402. workActivityProcessService.insertAuditsByType(bmzrList, processInstance.getId(), 1, 1);
  403. double days=Double.parseDouble(leaveApply.getLongTime());
  404. if(days>1){
  405. workActivityProcess.setCount(2);
  406. workActivityProcess.setId("");
  407. workActivityProcessService.save(workActivityProcess);
  408. workActivityProcessService.insertAuditsByType(fgldList,processInstance.getId(),2,0);
  409. }
  410. if(days>3){
  411. workActivityProcess.setCount(3);
  412. workActivityProcess.setId("");
  413. workActivityProcessService.save(workActivityProcess);
  414. workActivityProcessService.insertAuditsByType(zjlList,processInstance.getId(),3,0);
  415. }
  416. }
  417. leaveApply.setProcessInstanceId(processInstance.getId());
  418. leaveApply.setStatus("2");
  419. this.save(leaveApply);
  420. } catch (Exception e) {
  421. logger.error("启动审批流程异常:", e);
  422. return "启动审批流程异常:" + e.getMessage();
  423. }
  424. return "";
  425. }
  426. /**
  427. * 审核流程
  428. */
  429. @Transactional(readOnly = false)
  430. public String auditSave(LeaveApply leaveApply, List<User> auditUsers) {
  431. double days=Double.parseDouble(leaveApply.getLongTime());//请假天数
  432. // 对不同环节的业务逻辑进行操作
  433. String taskDefKey = leaveApply.getAct().getTaskDefKey();
  434. if (!"modifyApply".equals(taskDefKey) && !taskDefKey.contains("audit")) {
  435. actTaskService.claim(leaveApply.getAct().getTaskId(), UserUtils.getUser().getId());
  436. } else {
  437. leaveApply.getAct().setFlag("yes");
  438. updateLeaveDetail(leaveApply);
  439. updateFile(leaveApply);
  440. }
  441. String comment = "";
  442. if ("4".equals(leaveApply.getStatus())) {
  443. comment = ("yes".equals(leaveApply.getAct().getFlag()) ? "[重新申请] " : "[已撤销] ");
  444. } else {
  445. comment = ("yes".equals(leaveApply.getAct().getFlag()) ? "[同意] " : "[驳回] ") + leaveApply.getAct().getComment();
  446. }
  447. //yes 的时候状态为审核通过 否则为未通过
  448. //1 审核中 2 未通过
  449. leaveApply.setStatus(("yes".equals(leaveApply.getAct().getFlag()) ? "2" : "4"));
  450. Map<String, Object> vars = Maps.newHashMap();
  451. //业务逻辑对应的条件表达式
  452. String exp = "";
  453. String taskCount = "";
  454. String notifyRole = "";
  455. int key = 0;
  456. String enname = "";
  457. String str = "请假编号:" + leaveApply.getNo() + ",请假日期:" + DateUtils.formatDate(leaveApply.getApplyTime());
  458. User createUser = userDao.get(leaveApply.getCurrentUser());
  459. String notifyTitle = "请假人:" + userDao.get(leaveApply.getApplyer()).getName();
  460. List<Activity> activitieList = activityService.getByProcessInstanceId(leaveApply.getProcessInstanceId());
  461. WorkActivityMenu workActivityMenu = new WorkActivityMenu();
  462. if (activitieList != null && activitieList.size() != 0) {
  463. workActivityMenu.setProcessType(activitieList.get(0).getProcessKey());
  464. workActivityMenu.setActivities(activitieList);
  465. }
  466. WorkActivityProcess workActivityProcess = new WorkActivityProcess();
  467. WorkActivityProcess selectProcess = new WorkActivityProcess();
  468. selectProcess.setProcessInstanceId(leaveApply.getProcessInstanceId());
  469. List<WorkActivityProcess> workActivityProcesses = workActivityProcessService.findList(selectProcess);
  470. List<Activity> activities = workActivityMenu.getActivities();
  471. if (StringUtils.isNotBlank(workActivityMenu.getProcessType()) && !workActivityMenu.getProcessType().equals("leaveApply")) {
  472. key = 1;
  473. for (int i = 0; i < workActivityProcesses.size(); i++) {
  474. WorkActivityProcess activityProcess = workActivityProcesses.get(i);
  475. if (taskDefKey.equals(activityProcess.getActivityTask()) && !taskDefKey.equals("modifyApply")) {
  476. taskCount = activityProcess.getCount() + "";
  477. workActivityProcess = activityProcess;
  478. if (!workActivityProcess.getIsApproval().equals("0")) {
  479. workActivityProcess.setId("");
  480. }
  481. exp = "pass";
  482. if (!"yes".equals(leaveApply.getAct().getFlag())) {
  483. leaveApply.setStatus("4");
  484. workActivityProcess.setIsApproval("2");
  485. String returnBack = "-1";
  486. for (Activity activity : activities) {
  487. if (activity.getCount() == activityProcess.getCount()) {
  488. notifyRole = activity.getName();
  489. returnBack = activity.getReturnBack();
  490. break;
  491. }
  492. }
  493. if (returnBack.equals("0")) {
  494. workActivityProcess.setId("");
  495. }
  496. } else {
  497. workActivityProcess.setIsApproval("1");
  498. }
  499. } else if (taskDefKey.equals("modifyApply")) {
  500. notifyRole = "调整请假信息";
  501. taskCount = "0";
  502. exp = "pass";
  503. workActivityProcess.setId("");
  504. workActivityProcess.setCount(0);
  505. if (!"yes".equals(leaveApply.getAct().getFlag())) {
  506. leaveApply.setStatus("3");
  507. workActivityProcess.setIsApproval("2");
  508. } else {
  509. workActivityProcess.setIsApproval("1");
  510. }
  511. break;
  512. }
  513. }
  514. } else {
  515. workActivityMenu.setProcessType("leaveApply");
  516. for (int i = 0; i < workActivityProcesses.size(); i++) {
  517. WorkActivityProcess activityProcess = workActivityProcesses.get(i);
  518. String count = activityProcess.getCount() + "";
  519. workActivityProcess = activityProcess;
  520. if (!workActivityProcess.getIsApproval().equals("0")) {
  521. workActivityProcess.setId("");
  522. }
  523. // 审核环节
  524. if ("bmzr".equals(taskDefKey) && count.contains("1")) {
  525. taskCount = "1";
  526. exp = "pass";
  527. if ("yes".equals(leaveApply.getAct().getFlag())) {
  528. leaveApply.getAct().setFlag("end");
  529. notifyRole = "审批通过";
  530. workActivityProcess.setIsApproval("1");
  531. if(days>1){
  532. leaveApply.getAct().setFlag("yes");
  533. vars.put("fgldList", auditUsers);
  534. vars.put("fgldCount",auditUsers.size());
  535. workActivityProcessService.insertAuditsByType(auditUsers,leaveApply.getProcessInstanceId(),2,1);
  536. notifyRole = "分管领导审核";
  537. enname = "fgld";
  538. }
  539. } else {
  540. notifyRole = "调整请假信息";
  541. workActivityProcess.setIsApproval("2");
  542. }
  543. break;
  544. } else if ("fgld".equals(taskDefKey) && count.contains("2")) {
  545. taskCount = "2";
  546. exp = "pass";
  547. if ("yes".equals(leaveApply.getAct().getFlag())) {
  548. leaveApply.getAct().setFlag("end");
  549. notifyRole = "审批通过";
  550. workActivityProcess.setIsApproval("1");
  551. if(days>3){
  552. leaveApply.getAct().setFlag("yes");
  553. vars.put("zjlList", auditUsers);
  554. vars.put("zjlCount",auditUsers.size());
  555. workActivityProcessService.insertAuditsByType(auditUsers,leaveApply.getProcessInstanceId(),3,1);
  556. notifyRole = "总经理审核";
  557. enname = "zjl";
  558. }
  559. } else {
  560. notifyRole = "调整请假信息";
  561. workActivityProcess.setIsApproval("2");
  562. }
  563. break;
  564. } else if ("zjl".equals(taskDefKey) && count.contains("3")) {
  565. taskCount = "3";
  566. exp = "pass";
  567. if ("yes".equals(leaveApply.getAct().getFlag())) {
  568. notifyRole = "审批通过";
  569. workActivityProcess.setIsApproval("1");
  570. } else {
  571. notifyRole = "调整请假信息";
  572. workActivityProcess.setIsApproval("2");
  573. }
  574. break;
  575. }else if ("modifyApply".equals(taskDefKey) && count.contains("0")) {
  576. notifyRole = "业务部负责人审批";
  577. taskCount = "0";
  578. exp = "pass";
  579. workActivityProcess.setCount(0);
  580. enname = "bmzr";
  581. Office office = UserUtils.getSelectOffice();
  582. List<User> bmzrList = UserUtils.getByRoleActivityEnname("bmzr", 2, office.getId(), "25", leaveApply.getCreateBy());
  583. List<User> fgldList = UserUtils.getByRoleActivityEnname("fgld", 2, office.getId(), "25", leaveApply.getCreateBy());
  584. List<User> zjlList = UserUtils.getByRoleActivityEnname("zjl", 3, office.getId(), "25", leaveApply.getCreateBy());
  585. WorkActivityProcess workActivityProcess1 = new WorkActivityProcess();
  586. workActivityProcess1.setProcessKey("leaveApply");
  587. workActivityProcess1.setProcessInstanceId(leaveApply.getProcessInstanceId());
  588. workActivityProcess1.setCount(1);
  589. workActivityProcess1.setIsApproval("0");
  590. workActivityProcessService.insert(workActivityProcess1);
  591. workActivityProcessService.insertAuditsByType(bmzrList,leaveApply.getProcessInstanceId(), 1, 1);
  592. if(days>1){
  593. workActivityProcess1.setCount(2);
  594. workActivityProcess1.setId("");
  595. workActivityProcessService.save(workActivityProcess1);
  596. workActivityProcessService.insertAuditsByType(fgldList,leaveApply.getProcessInstanceId(),2,0);
  597. }
  598. if(days>3){
  599. workActivityProcess1.setCount(3);
  600. workActivityProcess1.setId("");
  601. workActivityProcessService.save(workActivityProcess1);
  602. workActivityProcessService.insertAuditsByType(zjlList,leaveApply.getProcessInstanceId(),3,0);
  603. }
  604. if (!"yes".equals(leaveApply.getAct().getFlag())) {
  605. leaveApply.setStatus("3");
  606. }
  607. break;
  608. }
  609. }
  610. }
  611. // 设置意见
  612. leaveApply.getAct().setComment(("yes".equals(leaveApply.getAct().getFlag()) ? "[同意] " : "[驳回] ") + leaveApply.getAct().getComment());
  613. leaveApply.preUpdate();
  614. // 提交流程任务
  615. vars.put(exp, leaveApply.getAct().getFlag());
  616. vars.put("passs", true);
  617. if("end".equals(leaveApply.getAct().getFlag())){
  618. leaveApply.getAct().setFlag("yes");
  619. }
  620. workActivityProcessService.updateProcess(workActivityProcess, workActivityMenu, key, taskCount, leaveApply.getProcessInstanceId(), taskDefKey, "modifyApply", leaveApply.getAct().getFlag(), comment, activities);
  621. if("no".equals(leaveApply.getAct().getFlag())){
  622. this.reject(leaveApply);
  623. }
  624. // 提交流程任务
  625. actTaskService.complete(leaveApply.getAct().getTaskId(), leaveApply.getAct().getProcInsId(), leaveApply.getAct().getComment(), vars);
  626. boolean state = actTaskService.isProcessEnd(leaveApply.getAct().getProcInsId());
  627. List<User> users = new ArrayList<>();
  628. List<User> userList = new ArrayList<>();
  629. if (!state) {
  630. users.add(leaveApply.getCreateBy());
  631. if ("yes".equals(leaveApply.getAct().getFlag())||"end".equals(leaveApply.getAct().getFlag())) {
  632. leaveApply.setStatus("5");
  633. WorkProjectNotify notify = new WorkProjectNotify();
  634. notify.setNotifyId(leaveApply.getId());
  635. userList = workProjectNotifyService.readByNotifyId(notify);
  636. workProjectNotifyService
  637. .save(UtilNotify
  638. .saveNotify(leaveApply.getId(),
  639. leaveApply.getCreateBy(),
  640. leaveApply.getCompanyId(),
  641. notifyTitle,
  642. str,
  643. "80",
  644. "0",
  645. "待通知",
  646. notifyRole));
  647. LeaveDetail detail=new LeaveDetail();
  648. detail.setLeaveId(leaveApply.getId());
  649. List<LeaveDetail> leaveDetails = leaveDetailDao.findList(detail);
  650. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  651. Office company = UserUtils.getSelectCompany();
  652. User user = UserUtils.getByCompanyAndUserId(leaveApply.getApplyer(),company.getId());
  653. WorkStaffBasicInfo workStaffBasicInfo = new WorkStaffBasicInfo();
  654. workStaffBasicInfo.setUserId(leaveApply.getApplyer());
  655. workStaffBasicInfo.setCompany(company);
  656. List<WorkStaffBasicInfo> workStaffAchives = workStaffAchivesDao.getByCompanyInfo(workStaffBasicInfo);
  657. WorkStaffBasicInfo workStaffAchive = new WorkStaffBasicInfo();
  658. WorkAttendanceRule oaRule = new WorkAttendanceRule();
  659. if (workStaffAchives!=null && workStaffAchives.size()!=0) {
  660. workStaffAchive = workStaffAchives.get(0);
  661. //依据公司和规则编号查询规则
  662. oaRule = workAttendanceRuleService.findAttendanceRuleByCompany(workStaffAchive.getCompany().getId(), workStaffAchive.getUserId(), "");
  663. if (oaRule == null || StringUtils.isBlank(oaRule.getId())) {
  664. oaRule = workAttendanceRuleService.findAttendanceRuleByCompany(workStaffAchive.getCompany().getId(), "", workStaffAchive.getOffice().getId());
  665. }
  666. if (oaRule == null) {
  667. oaRule = new WorkAttendanceRule();
  668. oaRule.setType("3");
  669. }
  670. }
  671. Boolean status = false;
  672. SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyMMdd");
  673. if (StringUtils.isNotBlank(oaRule.getId()) && StringUtils.isNotBlank(workStaffAchive.getId()) && leaveDetails!=null && leaveDetails.size()!=0){
  674. for (LeaveDetail leaveDetail :leaveDetails){
  675. Date stateTime = leaveDetail.getStartTime();
  676. Date endTime = leaveDetail.getEndTime();
  677. String startType = leaveDetail.getStartType();
  678. String endType = leaveDetail.getEndType();
  679. LeaveType leaveType = leaveDetail.getLeaveType();
  680. /* int stateMonth = Integer.parseInt(stateTime.substring(5,7));
  681. int endMonth = Integer.parseInt(endTime.substring(5,7));*/
  682. List<Date> dates = findDates(stateTime,endTime);
  683. for (Date date:dates) {
  684. String time = sdf.format(date);
  685. int iholidays = workAttendanceInfoService.isHolidays(time);
  686. if (iholidays == 0 ||(iholidays != 0 && "1".equals(leaveType.getModel()))) {
  687. Integer dateInt = Integer.parseInt(sdf1.format(date));
  688. int count = 3;
  689. if (sdf.format(date).equals(sdf.format(stateTime))) {
  690. if (startType.equals("2")) {
  691. count = 2;
  692. }
  693. }
  694. if (sdf.format(date).equals(sdf.format(endTime))) {
  695. if (endType.equals("1")) {
  696. count = 1;
  697. }
  698. }
  699. if (workStaffAchive.getWorkEndDate() != null) {
  700. String end = sdf1.format(workStaffAchive.getWorkEndDate());
  701. if (Integer.parseInt(end) >= dateInt) {
  702. status = true;
  703. }
  704. } else {
  705. status = true;
  706. }
  707. int holidays = 0;
  708. if (status) {
  709. WorkAttendanceInfo workAttendanceInfo1 = new WorkAttendanceInfo();
  710. WorkAttendanceInfo workAttendanceInfo2 = new WorkAttendanceInfo();
  711. WorkAttendanceInfo workAttendanceInfo = new WorkAttendanceInfo();
  712. workAttendanceInfo.setStaffId(workStaffAchive.getId());
  713. workAttendanceInfo.setAttendanceDate(date);
  714. List<WorkAttendanceInfo> workAttendanceInfos = workAttendanceInfoService.findList(workAttendanceInfo);
  715. if (workAttendanceInfos != null && workAttendanceInfos.size() != 0) {
  716. if (workAttendanceInfos.size() == 1) {
  717. if (workAttendanceInfos.get(0).getMorningAfternoon().equals("1")) {
  718. workAttendanceInfo1 = workAttendanceInfos.get(0);
  719. } else {
  720. workAttendanceInfo2 = workAttendanceInfos.get(0);
  721. }
  722. } else {
  723. if (workAttendanceInfos.get(0).getMorningAfternoon().equals("1")) {
  724. workAttendanceInfo2 = workAttendanceInfos.get(1);
  725. workAttendanceInfo1 = workAttendanceInfos.get(0);
  726. } else {
  727. workAttendanceInfo1 = workAttendanceInfos.get(1);
  728. workAttendanceInfo2 = workAttendanceInfos.get(0);
  729. }
  730. }
  731. }
  732. workAttendanceInfoService.saveInfo(oaRule, oaRule.getType(), workStaffAchive.getId(), user, date, time, null, "", "", "",
  733. "4", "4", "", holidays, null,
  734. "", leaveType.getIsAttendance(), leaveType.getIsSubsidized(),
  735. "", "", null, "", count, workAttendanceInfo1.getId(), workAttendanceInfo2.getId());
  736. }
  737. }
  738. }
  739. }
  740. }
  741. } else {
  742. WorkProjectNotify notify = new WorkProjectNotify();
  743. notify.setNotifyId(leaveApply.getId());
  744. userList = workProjectNotifyService.readByNotifyId(notify);
  745. if (!"3".equals(leaveApply.getStatus())) {
  746. leaveApply.setStatus("4");
  747. workProjectNotifyService
  748. .save(UtilNotify
  749. .saveNotify(leaveApply.getId(),
  750. leaveApply.getCreateBy(),
  751. leaveApply.getCompanyId(),
  752. notifyTitle,
  753. str,
  754. "80",
  755. "0",
  756. "待通知",
  757. notifyRole));
  758. }
  759. }
  760. workActivityProcessService.deleteProcessIdAuditUsers(leaveApply.getProcessInstanceId());
  761. } else {
  762. if (StringUtils.isNotBlank(workActivityMenu.getProcessType()) && !workActivityMenu.getProcessType().equals("leaveApply")) {
  763. WorkProjectNotify notify = new WorkProjectNotify();
  764. notify.setNotifyId(leaveApply.getId());
  765. userList = workProjectNotifyService.readByNotifyId(notify);
  766. //users.addAll(userList);
  767. WorkProjectNotify workProjectNotify = UtilNotify
  768. .saveNotify(leaveApply.getId(),
  769. new User(),
  770. leaveApply.getCompanyId(),
  771. notifyTitle,
  772. str,
  773. "80",
  774. "0",
  775. "待审批",
  776. notifyRole);
  777. List<WorkProjectNotify> workProjectNotifys = activityService.getByFlagAndTaskDefKeyList(
  778. activities,
  779. workProjectNotify,
  780. taskDefKey,
  781. leaveApply.getAct().getFlag(),
  782. taskCount,
  783. leaveApply.getCreateBy(),
  784. leaveApply.getOfficeId(),
  785. "80");
  786. for (WorkProjectNotify workProjectNotify1 : workProjectNotifys) {
  787. users.add(workProjectNotify1.getUser());
  788. workProjectNotify1.setId("");
  789. workProjectNotify1.setIsNewRecord(false);
  790. workProjectNotifyService
  791. .save(workProjectNotify1);
  792. }
  793. } else {
  794. if (!"yes".equals(leaveApply.getAct().getFlag())) {
  795. WorkProjectNotify notify = new WorkProjectNotify();
  796. notify.setNotifyId(leaveApply.getId());
  797. userList = workProjectNotifyService.readByNotifyId(notify);
  798. workProjectNotifyService
  799. .save(UtilNotify
  800. .saveNotify(leaveApply.getId(),
  801. leaveApply.getCreateBy(),
  802. leaveApply.getCompanyId(),
  803. notifyTitle,
  804. str,
  805. "80",
  806. "0",
  807. "重新申请",
  808. notifyRole));
  809. users.add(leaveApply.getCreateBy());
  810. } else {
  811. if (StringUtils.isNotBlank(enname)) {
  812. WorkProjectNotify notify = new WorkProjectNotify();
  813. notify.setNotifyId(leaveApply.getId());
  814. userList = workProjectNotifyService.readByNotifyId(notify);
  815. //users.addAll(userList1);
  816. WorkProjectNotify workProjectNotify = UtilNotify
  817. .saveNotify(leaveApply.getId(),
  818. new User(),
  819. leaveApply.getCompanyId(),
  820. notifyTitle,
  821. str,
  822. "80",
  823. "0",
  824. "待审批",
  825. notifyRole);
  826. users.addAll(auditUsers);
  827. for (User user1 : auditUsers) {
  828. workProjectNotify.setUser(user1);
  829. workProjectNotify.setId("");
  830. workProjectNotify.setIsNewRecord(false);
  831. workProjectNotifyService.save(workProjectNotify);
  832. Map<String, Object> extras = new HashMap<>();
  833. extras.put("type", "7002");
  834. extras.put("procDefKey", "80");
  835. extras.put("id", workProjectNotify.getId());
  836. UserUtils.pushInfoToApp(notifyTitle, str, extras, user1.getId());
  837. }
  838. } else {
  839. WorkProjectNotify notify = new WorkProjectNotify();
  840. notify.setNotifyId(leaveApply.getId());
  841. userList = workProjectNotifyService.readByNotifyId(notify);
  842. users.addAll(userList);
  843. users.add(leaveApply.getCreateBy());
  844. workProjectNotifyService
  845. .save(UtilNotify
  846. .saveNotify(leaveApply.getId(),
  847. leaveApply.getCreateBy(),
  848. leaveApply.getCompanyId(),
  849. notifyTitle,
  850. str,
  851. "80",
  852. "0",
  853. "重新申请",
  854. notifyRole));
  855. }
  856. }
  857. }
  858. }
  859. if (users != null && users.size() != 0) {
  860. for (User u : users) {
  861. UserUtils.pushIm(u.getId(), str);
  862. }
  863. }
  864. if (userList != null && userList.size() != 0) {
  865. for (User u : userList) {
  866. UserUtils.pushMeIm(u.getId());
  867. }
  868. }
  869. dao.update(leaveApply);
  870. return "保存审核意见成功!";
  871. }
  872. @Transactional(readOnly = false)
  873. public void cancelProcess(String id) throws Exception {
  874. LeaveApply leaveApply = this.get(id);
  875. WorkActivityProcess process = new WorkActivityProcess();
  876. process.setProcessInstanceId(leaveApply.getProcessInstanceId());
  877. process.setIsApproval("0");
  878. //List<WorkActivityProcess> processList1 = workActivityProcessService.findByProcInsId(process);
  879. WorkActivityProcess workActivityProcess = new WorkActivityProcess();
  880. workActivityProcess.setProcessInstanceId(leaveApply.getProcessInstanceId());
  881. List<WorkActivityProcess> processList = workActivityProcessService.findList(workActivityProcess);
  882. WorkProjectNotify notify = new WorkProjectNotify();
  883. notify.setNotifyId(leaveApply.getId());
  884. List<User> userList = workProjectNotifyService.readByNotifyId(notify);
  885. if (userList != null && userList.size() != 0) {
  886. for (User u : userList) {
  887. User user = UserUtils.get(u.getId());
  888. UserUtils.pushIm(u.getId(), "请假人:" + user.getName() + ",请假编号:" + leaveApply.getNo() + " 强制撤销!");
  889. }
  890. }
  891. if (processList != null && processList.size() > 0) {
  892. for (int i = 0; i < processList.size(); i++) {
  893. WorkActivityProcess p = processList.get(i);
  894. if (StringUtils.isNotBlank(p.getIsApproval()) && "0".equals(p.getIsApproval())) {
  895. p.setIsApproval("-1");
  896. p.setDelFlag("1");
  897. workActivityProcessDao.updateDelFlagAndIsApproval(p);
  898. }
  899. }
  900. WorkActivityProcess pro = new WorkActivityProcess();
  901. pro.setId("");
  902. pro.setDelFlag("0");
  903. pro.preInsert();
  904. pro.setRemarks("[强制撤销]");
  905. pro.setProcessKey(processList.get(0).getProcessKey());
  906. pro.setIsApproval("1");
  907. pro.setProcessInstanceId(processList.get(0).getProcessInstanceId());
  908. pro.setCount(0);
  909. workActivityProcessDao.insert(pro);
  910. //结束该流程,设为"撤销"状态月
  911. LeaveApply leave = new LeaveApply();
  912. leave.setId(id);
  913. leave.setStatus("3");
  914. leave.setProcessInstanceId(leaveApply.getProcessInstanceId());
  915. leave.preUpdate();
  916. this.updateStateById(leave);
  917. actTaskService.endProcessInstance(leaveApply.getProcessInstanceId(), "请假申请-撤回");
  918. }
  919. }
  920. private void updateStateById(LeaveApply leaveApply) {
  921. dao.updateProcessIdAndStatus(leaveApply);
  922. }
  923. @Transactional(readOnly = false)
  924. public String saveBack(LeaveApply leaveApply) {
  925. this.save(leaveApply);
  926. return this.startBack(leaveApply, leaveApply.getProcessInstanceId());
  927. }
  928. @Transactional(readOnly = false)
  929. public String extendSave(LeaveApply leaveApply) {
  930. this.saveExtend(leaveApply);
  931. return this.extendSave(leaveApply, leaveApply.getProcessInstanceId());
  932. }
  933. /**
  934. * 启动审批流程
  935. */
  936. @Transactional(readOnly = false)
  937. public String startBack(LeaveApply leaveApply, String processInstanceId) {
  938. try {
  939. Map<String, Object> variables = new HashMap<String, Object>();
  940. identityService.setAuthenticatedUserId(leaveApply.getCurrentUser().getId());
  941. User createUser = UserUtils.getUser();
  942. String contentStr = "请假编号:" + leaveApply.getNo() + ",请假日期:" + DateUtils.formatDate(leaveApply.getApplyTime());
  943. userDao.get(leaveApply.getApplyer()).getName();
  944. String titleStr = "销假人:" + userDao.get(leaveApply.getApplyer()).getName();
  945. String businessKey = leaveApply.getId();
  946. Office office = UserUtils.getSelectOffice();
  947. WorkActivityMenu workActivityMenu = workActivityMenuService.findByParentAndOffice("zzsql3125f1f194c8lz88a9miiii75090477", office);
  948. // 启动流程
  949. String processType = workActivityMenu.getProcessType();
  950. StringBuffer buffer = new StringBuffer();
  951. Activity activity = new Activity();
  952. WorkProjectNotify workProjectNotify = UtilNotify
  953. .saveNotify(leaveApply.getId(), null, leaveApply.getCompanyId(), titleStr, contentStr, "81", "0", "待审批", ""
  954. );
  955. List<User> users = new ArrayList<>();
  956. List<User> bmzrList = UserUtils.getByRoleActivityEnname("bmzr", 2, office.getId(), "25", leaveApply.getCreateBy());
  957. if (StringUtils.isNotBlank(workActivityMenu.getId())) {
  958. workProjectNotify.setNotifyRole("");
  959. workActivityMenu = workActivityMenuService.get(workActivityMenu.getId());
  960. List<Activity> activities = workActivityMenu.getActivities();
  961. for (Activity a : activities) {
  962. String encount = a.getEncount();
  963. String enlist = a.getEnlist();
  964. if (a.getRole() != null && StringUtils.isNotBlank(a.getRole().getEnname())) {
  965. List enusers = UserUtils.getByRoleActivityEnnames(a.getRole().getEnname(), office.getId(), "25", leaveApply.getCreateBy());
  966. if (enusers.size() == 0) {
  967. leaveApply.setStatus("5");
  968. this.save(leaveApply);
  969. return "流程审批人不能为空,角色" + a.getRole().getName() + "下无用户,请联系管理员!";
  970. }
  971. variables.put(enlist, enusers);
  972. variables.put(encount, enusers.size());
  973. }
  974. if (a.getDelFlag().equals("0") && a.getCount() == 1) {
  975. activity = a;
  976. }
  977. }
  978. buffer.append(activity.getRole().getEnname());
  979. if (activity != null && StringUtils.isNotBlank(activity.getId())) {
  980. //角色审批
  981. if (StringUtils.isNotBlank(activity.getRole().getEnname())) {
  982. users = UserUtils.getByRoleActivityEnnames(activity.getRole().getEnname(), office.getId(), "25", leaveApply.getCreateBy());
  983. }
  984. //人员审批
  985. if (StringUtils.isNotBlank(activity.getUser().getId())) {
  986. users.add(activity.getUser());
  987. }
  988. }
  989. workProjectNotify.setId("");
  990. } else {
  991. variables.put("bmzrList", bmzrList);
  992. if (bmzrList.size() == 0) {
  993. leaveApply.setStatus("5");
  994. this.save(leaveApply);
  995. }
  996. if (bmzrList.size() == 0) {
  997. return "流程审批人不能为空,角色业务部负责人下无用户,请联系管理员!";
  998. }
  999. variables.put("bmzrCount", bmzrList.size());
  1000. processType = "leaveBack";
  1001. users.addAll(bmzrList);
  1002. }
  1003. List<String> userIds = new ArrayList<>(users.size());
  1004. for (User u : users) {
  1005. userIds.add(u.getId());
  1006. workProjectNotify.setUser(u);
  1007. workProjectNotify.setId("");
  1008. workProjectNotify.setNotifyRole("业务部负责人审批");
  1009. workProjectNotifyService.save(workProjectNotify);
  1010. Map<String, Object> extras = new HashMap<>();
  1011. extras.put("type", "7002");
  1012. extras.put("procDefKey", "81");
  1013. extras.put("id", workProjectNotify.getId());
  1014. UserUtils.pushInfoToApp(titleStr, contentStr, extras, u.getId());
  1015. }
  1016. UserUtils.pushIm(userIds, contentStr);
  1017. variables.put("busId", businessKey);
  1018. variables.put("type", processType);
  1019. variables.put("title", "审批单:" + leaveApply.getNo());//设置标题;
  1020. ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processType, businessKey, variables);
  1021. if (org.apache.commons.lang3.StringUtils.isNotBlank(processInstanceId)) {
  1022. workActivityProcessService.updateProcessInstanceId(processInstance.getId(), processInstanceId);
  1023. workActivityProcessService.deleteProcessInstanceId(processInstanceId);
  1024. workActivityProcessService.deleteProcessIdAuditUsers(processInstanceId);
  1025. WorkActivityProcess pro = new WorkActivityProcess();
  1026. pro.setId("");
  1027. pro.setDelFlag("0");
  1028. pro.preInsert();
  1029. pro.setRemarks("销假申请");
  1030. pro.setProcessKey("leaveBack");
  1031. pro.setIsApproval("1");
  1032. pro.setProcessInstanceId(processInstance.getId());
  1033. pro.setCount(0);
  1034. workActivityProcessDao.insert(pro);
  1035. }
  1036. List<Activity> list = workActivityMenu.getActivities();
  1037. if (list != null && list.size() != 0) {
  1038. workActivityProcessService.saveList(list, processInstance.getId());
  1039. } else {
  1040. WorkActivityProcess workActivityProcess = new WorkActivityProcess();
  1041. workActivityProcess.setProcessKey(processType);
  1042. workActivityProcess.setProcessInstanceId(processInstance.getId());
  1043. workActivityProcess.setCount(1);
  1044. workActivityProcess.setIsApproval("0");
  1045. workActivityProcessService.insert(workActivityProcess);
  1046. workActivityProcessService.insertAuditsByType(bmzrList, processInstance.getId(), 1, 1);
  1047. }
  1048. leaveApply.setProcessInstanceId(processInstance.getId());
  1049. leaveApply.setStatus("6");
  1050. this.save(leaveApply);
  1051. workActivityProcessService.updateType(processInstance.getId(), "leaveBack");
  1052. } catch (Exception e) {
  1053. logger.error("启动审批流程异常:", e);
  1054. return "启动审批流程异常:" + e.getMessage();
  1055. }
  1056. return "";
  1057. }
  1058. /**
  1059. * 销假审核流程
  1060. */
  1061. @Transactional(readOnly = false)
  1062. public String auditBackSave(LeaveApply leaveApply, List<User> auditUsers) {
  1063. // 对不同环节的业务逻辑进行操作
  1064. String taskDefKey = leaveApply.getAct().getTaskDefKey();
  1065. if (!"modifyApply".equals(taskDefKey) && !taskDefKey.contains("audit")) {
  1066. actTaskService.claim(leaveApply.getAct().getTaskId(), UserUtils.getUser().getId());
  1067. } else {
  1068. leaveApply.getAct().setFlag("yes");
  1069. }
  1070. String comment = "";
  1071. if ("9".equals(leaveApply.getStatus())) {
  1072. comment = ("yes".equals(leaveApply.getAct().getFlag()) ? "[重新申请] " : "[已撤销] ");
  1073. } else {
  1074. comment = ("yes".equals(leaveApply.getAct().getFlag()) ? "[同意] " : "[驳回] ") + leaveApply.getAct().getComment();
  1075. }
  1076. //yes 的时候状态为审核通过 否则为未通过
  1077. //1 审核中 2 未通过
  1078. leaveApply.setStatus(("yes".equals(leaveApply.getAct().getFlag()) ? "6" : "9"));
  1079. Map<String, Object> vars = Maps.newHashMap();
  1080. //业务逻辑对应的条件表达式
  1081. String exp = "";
  1082. String taskCount = "";
  1083. String notifyRole = "";
  1084. int key = 0;
  1085. String enname = "";
  1086. String str = "请假编号:" + leaveApply.getNo() + ",请假日期:" + DateUtils.formatDate(leaveApply.getApplyTime());
  1087. User createUser = userDao.get(leaveApply.getCurrentUser());
  1088. String notifyTitle = "销假人:" + userDao.get(leaveApply.getApplyer()).getName();
  1089. List<Activity> activitieList = activityService.getByProcessInstanceId(leaveApply.getProcessInstanceId());
  1090. WorkActivityMenu workActivityMenu = new WorkActivityMenu();
  1091. if (activitieList != null && activitieList.size() != 0) {
  1092. workActivityMenu.setProcessType(activitieList.get(0).getProcessKey());
  1093. workActivityMenu.setActivities(activitieList);
  1094. }
  1095. WorkActivityProcess workActivityProcess = new WorkActivityProcess();
  1096. WorkActivityProcess selectProcess = new WorkActivityProcess();
  1097. selectProcess.setProcessInstanceId(leaveApply.getProcessInstanceId());
  1098. List<WorkActivityProcess> workActivityProcesses = workActivityProcessService.findList(selectProcess);
  1099. List<Activity> activities = workActivityMenu.getActivities();
  1100. if (StringUtils.isNotBlank(workActivityMenu.getProcessType()) && !workActivityMenu.getProcessType().equals("leaveBack")) {
  1101. key = 1;
  1102. for (int i = 0; i < workActivityProcesses.size(); i++) {
  1103. WorkActivityProcess activityProcess = workActivityProcesses.get(i);
  1104. if (taskDefKey.equals(activityProcess.getActivityTask()) && !taskDefKey.equals("modifyApply")) {
  1105. taskCount = activityProcess.getCount() + "";
  1106. workActivityProcess = activityProcess;
  1107. if (!workActivityProcess.getIsApproval().equals("0")) {
  1108. workActivityProcess.setId("");
  1109. }
  1110. exp = "pass";
  1111. if (!"yes".equals(leaveApply.getAct().getFlag())) {
  1112. leaveApply.setStatus("9");
  1113. workActivityProcess.setIsApproval("2");
  1114. String returnBack = "-1";
  1115. for (Activity activity : activities) {
  1116. if (activity.getCount() == activityProcess.getCount()) {
  1117. notifyRole = activity.getName();
  1118. returnBack = activity.getReturnBack();
  1119. break;
  1120. }
  1121. }
  1122. if (returnBack.equals("0")) {
  1123. workActivityProcess.setId("");
  1124. }
  1125. } else {
  1126. workActivityProcess.setIsApproval("1");
  1127. }
  1128. } else if (taskDefKey.equals("modifyApply")) {
  1129. notifyRole = "调整请假信息";
  1130. taskCount = "0";
  1131. exp = "pass";
  1132. workActivityProcess.setId("");
  1133. workActivityProcess.setCount(0);
  1134. if (!"yes".equals(leaveApply.getAct().getFlag())) {
  1135. leaveApply.setStatus("7");
  1136. workActivityProcess.setIsApproval("2");
  1137. } else {
  1138. workActivityProcess.setIsApproval("1");
  1139. }
  1140. break;
  1141. }
  1142. }
  1143. } else {
  1144. workActivityMenu.setProcessType("leaveBack");
  1145. for (int i = 0; i < workActivityProcesses.size(); i++) {
  1146. WorkActivityProcess activityProcess = workActivityProcesses.get(i);
  1147. String count = activityProcess.getCount() + "";
  1148. workActivityProcess = activityProcess;
  1149. if (!workActivityProcess.getIsApproval().equals("0")) {
  1150. workActivityProcess.setId("");
  1151. }
  1152. // 审核环节
  1153. if ("bmzr".equals(taskDefKey) && count.contains("1")) {
  1154. taskCount = "1";
  1155. exp = "pass";
  1156. if ("yes".equals(leaveApply.getAct().getFlag())) {
  1157. notifyRole = "审批通过";
  1158. workActivityProcess.setIsApproval("1");
  1159. } else {
  1160. notifyRole = "调整请假信息";
  1161. workActivityProcess.setIsApproval("2");
  1162. dao.updateBack(leaveApply);
  1163. }
  1164. break;
  1165. } else if ("modifyApply".equals(taskDefKey) && count.contains("0")) {
  1166. notifyRole = "业务部负责人审批";
  1167. taskCount = "0";
  1168. exp = "pass";
  1169. workActivityProcess.setCount(0);
  1170. enname = "bmzr";
  1171. if (!"yes".equals(leaveApply.getAct().getFlag())) {
  1172. leaveApply.setStatus("7");
  1173. }
  1174. break;
  1175. }
  1176. }
  1177. }
  1178. // 设置意见
  1179. leaveApply.getAct().setComment(("yes".equals(leaveApply.getAct().getFlag()) ? "[同意] " : "[驳回] ") + leaveApply.getAct().getComment());
  1180. leaveApply.preUpdate();
  1181. // 提交流程任务
  1182. vars.put(exp, "yes".equals(leaveApply.getAct().getFlag()) ? true : false);
  1183. vars.put("passs", true);
  1184. workActivityProcessService.updateProcess(workActivityProcess, workActivityMenu, key, taskCount, leaveApply.getProcessInstanceId(), taskDefKey, "modifyApply", leaveApply.getAct().getFlag(), comment, activities);
  1185. // 提交流程任务
  1186. actTaskService.complete(leaveApply.getAct().getTaskId(), leaveApply.getAct().getProcInsId(), leaveApply.getAct().getComment(), vars);
  1187. boolean state = actTaskService.isProcessEnd(leaveApply.getAct().getProcInsId());
  1188. List<User> users = new ArrayList<>();
  1189. List<User> userList = new ArrayList<>();
  1190. if (!state) {
  1191. users.add(leaveApply.getCreateBy());
  1192. if ("yes".equals(leaveApply.getAct().getFlag())) {
  1193. leaveApply.setStatus("8");
  1194. WorkProjectNotify notify = new WorkProjectNotify();
  1195. notify.setNotifyId(leaveApply.getId());
  1196. userList = workProjectNotifyService.readByNotifyId(notify);
  1197. workProjectNotifyService
  1198. .save(UtilNotify
  1199. .saveNotify(leaveApply.getId(),
  1200. leaveApply.getCreateBy(),
  1201. leaveApply.getCompanyId(),
  1202. notifyTitle,
  1203. str,
  1204. "81",
  1205. "0",
  1206. "待通知",
  1207. notifyRole));
  1208. LeaveDetail detail=new LeaveDetail();
  1209. detail.setLeaveId(leaveApply.getId());
  1210. List<LeaveDetail> leaveDetails = leaveDetailDao.findList(detail);
  1211. SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyMMdd");
  1212. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  1213. double back = Integer.parseInt(sdf1.format(leaveApply.getBackTime()));
  1214. if("2".equals(leaveApply.getBackStartType())){
  1215. back=back+0.5;
  1216. }
  1217. for (LeaveDetail leaveDetail : leaveDetails) {
  1218. Date stateTime = leaveDetail.getStartTime();
  1219. double start=Integer.parseInt(sdf1.format(stateTime));
  1220. Date endTime = leaveDetail.getEndTime();
  1221. double end=Integer.parseInt(sdf1.format(endTime));
  1222. String startType = leaveDetail.getStartType();
  1223. String endType = leaveDetail.getEndType();
  1224. if("2".equals(startType)){
  1225. start=start+0.5;
  1226. }
  1227. if("2".equals(endType)){
  1228. end=end+0.5;
  1229. }
  1230. if(back<=end&&back>=start){
  1231. //修改实际请假结束时间及請假時常
  1232. double d=0;
  1233. if("2".equals(leaveDetail.getLeaveType().getModel())){//工作日
  1234. d=this.holidays(sdf.format(leaveDetail.getStartTime()),
  1235. sdf.format(leaveApply.getBackTime()),
  1236. leaveDetail.getStartType(),
  1237. leaveApply.getBackStartType());
  1238. }else{
  1239. d=getDay(leaveDetail.getStartTime(),leaveApply.getBackTime(), leaveDetail.getStartType(),leaveApply.getBackStartType());
  1240. }
  1241. leaveDetailDao.updateRealEndDate(leaveDetail.getId(),sdf.format(leaveApply.getBackTime()),leaveApply.getBackStartType(),String.valueOf(d));
  1242. leaveDetail.setRealEndTime(leaveApply.getBackTime());
  1243. this.saveLeaveCount(leaveDetail,d,leaveApply.getBasicInfo().getId());
  1244. }else if(back<start){
  1245. //修改是否有效
  1246. leaveDetailDao.updateIsUse(leaveDetail.getId());
  1247. }else{
  1248. this.saveLeaveCount(leaveDetail,Double.parseDouble(leaveDetail.getDays()),leaveApply.getBasicInfo().getId());
  1249. }
  1250. }
  1251. Office company = UserUtils.getSelectCompany();
  1252. User user = UserUtils.getByCompanyAndUserId(leaveApply.getApplyer(),company.getId());
  1253. WorkStaffBasicInfo workStaffBasicInfo = new WorkStaffBasicInfo();
  1254. workStaffBasicInfo.setUserId(leaveApply.getApplyer());
  1255. workStaffBasicInfo.setCompany(company);
  1256. List<WorkStaffBasicInfo> workStaffAchives = workStaffAchivesDao.getByCompanyInfo(workStaffBasicInfo);
  1257. WorkStaffBasicInfo workStaffAchive = new WorkStaffBasicInfo();
  1258. WorkAttendanceRule oaRule = new WorkAttendanceRule();
  1259. if (workStaffAchives!=null && workStaffAchives.size()!=0) {
  1260. workStaffAchive = workStaffAchives.get(0);
  1261. //依据公司和规则编号查询规则
  1262. oaRule = workAttendanceRuleService.findAttendanceRuleByCompany(workStaffAchive.getCompany().getId(), workStaffAchive.getUserId(), "");
  1263. if (oaRule == null || StringUtils.isBlank(oaRule.getId())) {
  1264. oaRule = workAttendanceRuleService.findAttendanceRuleByCompany(workStaffAchive.getCompany().getId(), "", workStaffAchive.getOffice().getId());
  1265. }
  1266. if (oaRule == null) {
  1267. oaRule = new WorkAttendanceRule();
  1268. oaRule.setType("3");
  1269. }
  1270. }
  1271. Boolean status = false;
  1272. Integer backTime = Integer.parseInt(sdf1.format(leaveApply.getBackTime()));
  1273. if (StringUtils.isNotBlank(oaRule.getId()) && StringUtils.isNotBlank(workStaffAchive.getId()) && leaveDetails!=null && leaveDetails.size()!=0) {
  1274. for (LeaveDetail leaveDetail : leaveDetails) {
  1275. Date stateTime = leaveDetail.getStartTime();
  1276. Date endTime = leaveDetail.getEndTime();
  1277. String startType = leaveDetail.getStartType();
  1278. String endType = leaveDetail.getEndType();
  1279. LeaveType leaveType = leaveDetail.getLeaveType();
  1280. /* int stateMonth = Integer.parseInt(stateTime.substring(5,7));
  1281. int endMonth = Integer.parseInt(endTime.substring(5,7));*/
  1282. List<Date> dates = findDates(stateTime, endTime);
  1283. for (Date date : dates) {
  1284. String time = sdf.format(date);
  1285. int iholidays = workAttendanceInfoService.isHolidays(time);
  1286. Integer dateInt = Integer.parseInt(sdf1.format(date));
  1287. if (iholidays == 0 || (iholidays != 0 && "1".equals(leaveType.getModel()))) {
  1288. int count = 3;
  1289. if (sdf.format(date).equals(sdf.format(stateTime))) {
  1290. if (startType.equals("2")) {
  1291. count = 2;
  1292. }
  1293. }
  1294. if (sdf.format(date).equals(sdf.format(endTime))) {
  1295. if (endType.equals("1")) {
  1296. count = 1;
  1297. }
  1298. }
  1299. if (workStaffAchive.getWorkEndDate() != null) {
  1300. String end = sdf1.format(workStaffAchive.getWorkEndDate());
  1301. if (Integer.parseInt(end) >= dateInt) {
  1302. status = true;
  1303. }
  1304. } else {
  1305. status = true;
  1306. }
  1307. int holidays = 0;
  1308. if (status) {
  1309. WorkAttendanceInfo workAttendanceInfo1 = new WorkAttendanceInfo();
  1310. WorkAttendanceInfo workAttendanceInfo2 = new WorkAttendanceInfo();
  1311. WorkAttendanceInfo workAttendanceInfo = new WorkAttendanceInfo();
  1312. workAttendanceInfo.setStaffId(workStaffAchive.getId());
  1313. workAttendanceInfo.setAttendanceDate(date);
  1314. List<WorkAttendanceInfo> workAttendanceInfos = workAttendanceInfoService.findList(workAttendanceInfo);
  1315. if (workAttendanceInfos != null && workAttendanceInfos.size() != 0) {
  1316. if (workAttendanceInfos.size() == 1) {
  1317. if (workAttendanceInfos.get(0).getMorningAfternoon().equals("1")) {
  1318. workAttendanceInfo1 = workAttendanceInfos.get(0);
  1319. } else {
  1320. workAttendanceInfo2 = workAttendanceInfos.get(0);
  1321. }
  1322. } else {
  1323. if (workAttendanceInfos.get(0).getMorningAfternoon().equals("1")) {
  1324. workAttendanceInfo2 = workAttendanceInfos.get(1);
  1325. workAttendanceInfo1 = workAttendanceInfos.get(0);
  1326. } else {
  1327. workAttendanceInfo1 = workAttendanceInfos.get(1);
  1328. workAttendanceInfo2 = workAttendanceInfos.get(0);
  1329. }
  1330. }
  1331. }
  1332. if (dateInt>=backTime){
  1333. workAttendanceInfoService.saveInfo(oaRule, oaRule.getType(), workStaffAchive.getId(), user, date, time, null, "", "", "",
  1334. "4", "4", "", holidays, null,
  1335. "", leaveType.getIsAttendance(), leaveType.getIsSubsidized(),
  1336. "", "", null, "", count, workAttendanceInfo1.getId(), workAttendanceInfo2.getId());
  1337. }else {
  1338. workAttendanceInfoService.saveInfo(oaRule, oaRule.getType(), workStaffAchive.getId(), user, date, time, null, "", "", "",
  1339. "4", "4", "", holidays, null,
  1340. "", leaveType.getIsAttendance(), leaveType.getIsSubsidized(),
  1341. "", "", null, "", count, workAttendanceInfo1.getId(), workAttendanceInfo2.getId());
  1342. }
  1343. }
  1344. }
  1345. }
  1346. }
  1347. }
  1348. } else {
  1349. WorkProjectNotify notify = new WorkProjectNotify();
  1350. notify.setNotifyId(leaveApply.getId());
  1351. userList = workProjectNotifyService.readByNotifyId(notify);
  1352. if (!"7".equals(leaveApply.getStatus())) {
  1353. leaveApply.setStatus("9");
  1354. workProjectNotifyService
  1355. .save(UtilNotify
  1356. .saveNotify(leaveApply.getId(),
  1357. leaveApply.getCreateBy(),
  1358. leaveApply.getCompanyId(),
  1359. notifyTitle,
  1360. str,
  1361. "81",
  1362. "0",
  1363. "待通知",
  1364. notifyRole));
  1365. }
  1366. }
  1367. workActivityProcessService.deleteProcessIdAuditUsers(leaveApply.getProcessInstanceId());
  1368. } else {
  1369. if (StringUtils.isNotBlank(workActivityMenu.getProcessType()) && !workActivityMenu.getProcessType().equals("leaveBack")) {
  1370. WorkProjectNotify notify = new WorkProjectNotify();
  1371. notify.setNotifyId(leaveApply.getId());
  1372. userList = workProjectNotifyService.readByNotifyId(notify);
  1373. //users.addAll(userList);
  1374. WorkProjectNotify workProjectNotify = UtilNotify
  1375. .saveNotify(leaveApply.getId(),
  1376. new User(),
  1377. leaveApply.getCompanyId(),
  1378. notifyTitle,
  1379. str,
  1380. "81",
  1381. "0",
  1382. "待审批",
  1383. notifyRole);
  1384. List<WorkProjectNotify> workProjectNotifys = activityService.getByFlagAndTaskDefKeyList(
  1385. activities,
  1386. workProjectNotify,
  1387. taskDefKey,
  1388. leaveApply.getAct().getFlag(),
  1389. taskCount,
  1390. leaveApply.getCreateBy(),
  1391. leaveApply.getOfficeId(),
  1392. "81");
  1393. for (WorkProjectNotify workProjectNotify1 : workProjectNotifys) {
  1394. users.add(workProjectNotify1.getUser());
  1395. workProjectNotify1.setId("");
  1396. workProjectNotify1.setIsNewRecord(false);
  1397. workProjectNotifyService
  1398. .save(workProjectNotify1);
  1399. }
  1400. } else {
  1401. if (!"yes".equals(leaveApply.getAct().getFlag())) {
  1402. WorkProjectNotify notify = new WorkProjectNotify();
  1403. notify.setNotifyId(leaveApply.getId());
  1404. userList = workProjectNotifyService.readByNotifyId(notify);
  1405. workProjectNotifyService
  1406. .save(UtilNotify
  1407. .saveNotify(leaveApply.getId(),
  1408. leaveApply.getCreateBy(),
  1409. leaveApply.getCompanyId(),
  1410. notifyTitle,
  1411. str,
  1412. "81",
  1413. "0",
  1414. "重新申请",
  1415. notifyRole));
  1416. users.add(leaveApply.getCreateBy());
  1417. } else {
  1418. if (StringUtils.isNotBlank(enname)) {
  1419. WorkProjectNotify notify = new WorkProjectNotify();
  1420. notify.setNotifyId(leaveApply.getId());
  1421. userList = workProjectNotifyService.readByNotifyId(notify);
  1422. //users.addAll(userList1);
  1423. WorkProjectNotify workProjectNotify = UtilNotify
  1424. .saveNotify(leaveApply.getId(),
  1425. new User(),
  1426. leaveApply.getCompanyId(),
  1427. notifyTitle,
  1428. str,
  1429. "81",
  1430. "0",
  1431. "待审批",
  1432. notifyRole);
  1433. users.addAll(auditUsers);
  1434. for (User user1 : auditUsers) {
  1435. workProjectNotify.setUser(user1);
  1436. workProjectNotify.setId("");
  1437. workProjectNotify.setIsNewRecord(false);
  1438. workProjectNotifyService.save(workProjectNotify);
  1439. Map<String, Object> extras = new HashMap<>();
  1440. extras.put("type", "7002");
  1441. extras.put("procDefKey", "81");
  1442. extras.put("id", workProjectNotify.getId());
  1443. UserUtils.pushInfoToApp(notifyTitle, str, extras, user1.getId());
  1444. }
  1445. } else {
  1446. WorkProjectNotify notify = new WorkProjectNotify();
  1447. notify.setNotifyId(leaveApply.getId());
  1448. userList = workProjectNotifyService.readByNotifyId(notify);
  1449. users.addAll(userList);
  1450. users.add(leaveApply.getCreateBy());
  1451. workProjectNotifyService
  1452. .save(UtilNotify
  1453. .saveNotify(leaveApply.getId(),
  1454. leaveApply.getCreateBy(),
  1455. leaveApply.getCompanyId(),
  1456. notifyTitle,
  1457. str,
  1458. "81",
  1459. "0",
  1460. "重新申请",
  1461. notifyRole));
  1462. }
  1463. }
  1464. }
  1465. }
  1466. if (users != null && users.size() != 0) {
  1467. for (User u : users) {
  1468. UserUtils.pushIm(u.getId(), str);
  1469. }
  1470. }
  1471. if (userList != null && userList.size() != 0) {
  1472. for (User u : userList) {
  1473. UserUtils.pushMeIm(u.getId());
  1474. }
  1475. }
  1476. dao.update(leaveApply);
  1477. return "保存审核意见成功!";
  1478. }
  1479. @Transactional(readOnly = false)
  1480. public void cancelProcessBack(String id) throws Exception {
  1481. LeaveApply leaveApply = this.get(id);
  1482. WorkActivityProcess process = new WorkActivityProcess();
  1483. process.setProcessInstanceId(leaveApply.getProcessInstanceId());
  1484. process.setIsApproval("0");
  1485. //List<WorkActivityProcess> processList1 = workActivityProcessService.findByProcInsId(process);
  1486. WorkActivityProcess workActivityProcess = new WorkActivityProcess();
  1487. workActivityProcess.setProcessInstanceId(leaveApply.getProcessInstanceId());
  1488. List<WorkActivityProcess> processList = workActivityProcessService.findList(workActivityProcess);
  1489. WorkProjectNotify notify = new WorkProjectNotify();
  1490. notify.setNotifyId(leaveApply.getId());
  1491. List<User> userList = workProjectNotifyService.readByNotifyId(notify);
  1492. if (userList != null && userList.size() != 0) {
  1493. for (User u : userList) {
  1494. User user = UserUtils.get(u.getId());
  1495. UserUtils.pushIm(u.getId(), "销假人:" + user.getName() + ",请假编号:" + leaveApply.getNo() + " 强制撤销!");
  1496. }
  1497. }
  1498. if (processList != null && processList.size() > 0) {
  1499. for (int i = 0; i < processList.size(); i++) {
  1500. WorkActivityProcess p = processList.get(i);
  1501. if (StringUtils.isNotBlank(p.getIsApproval()) && "0".equals(p.getIsApproval())) {
  1502. p.setIsApproval("-1");
  1503. p.setDelFlag("1");
  1504. workActivityProcessDao.updateDelFlagAndIsApproval(p);
  1505. }
  1506. }
  1507. WorkActivityProcess pro = new WorkActivityProcess();
  1508. pro.setId("");
  1509. pro.setDelFlag("0");
  1510. pro.preInsert();
  1511. pro.setRemarks("[强制撤销]");
  1512. pro.setProcessKey(processList.get(0).getProcessKey());
  1513. pro.setIsApproval("1");
  1514. pro.setProcessInstanceId(processList.get(0).getProcessInstanceId());
  1515. pro.setCount(0);
  1516. workActivityProcessDao.insert(pro);
  1517. //结束该流程,设为"撤销"状态月
  1518. LeaveApply leave = new LeaveApply();
  1519. leave.setId(id);
  1520. leave.setStatus("7");
  1521. leave.setProcessInstanceId(leaveApply.getProcessInstanceId());
  1522. leave.preUpdate();
  1523. this.updateStateById(leave);
  1524. actTaskService.endProcessInstance(leaveApply.getProcessInstanceId(), "销假申请-撤回");
  1525. dao.updateBack(leaveApply);
  1526. }
  1527. }
  1528. @Transactional(readOnly = false)
  1529. public void cancelProcessExtend(String id) throws Exception {
  1530. LeaveApply leaveApply = this.get(id);
  1531. WorkActivityProcess process = new WorkActivityProcess();
  1532. process.setProcessInstanceId(leaveApply.getProcessInstanceId());
  1533. process.setIsApproval("0");
  1534. //List<WorkActivityProcess> processList1 = workActivityProcessService.findByProcInsId(process);
  1535. WorkActivityProcess workActivityProcess = new WorkActivityProcess();
  1536. workActivityProcess.setProcessInstanceId(leaveApply.getProcessInstanceId());
  1537. List<WorkActivityProcess> processList = workActivityProcessService.findList(workActivityProcess);
  1538. WorkProjectNotify notify = new WorkProjectNotify();
  1539. notify.setNotifyId(leaveApply.getId());
  1540. List<User> userList = workProjectNotifyService.readByNotifyId(notify);
  1541. if (userList != null && userList.size() != 0) {
  1542. for (User u : userList) {
  1543. User user = UserUtils.get(u.getId());
  1544. UserUtils.pushIm(u.getId(), "请假人:" + user.getName() + ",请假编号:" + leaveApply.getNo() + " 强制撤销!");
  1545. }
  1546. }
  1547. if (processList != null && processList.size() > 0) {
  1548. for (int i = 0; i < processList.size(); i++) {
  1549. WorkActivityProcess p = processList.get(i);
  1550. if (StringUtils.isNotBlank(p.getIsApproval()) && "0".equals(p.getIsApproval())) {
  1551. p.setIsApproval("-1");
  1552. p.setDelFlag("1");
  1553. workActivityProcessDao.updateDelFlagAndIsApproval(p);
  1554. }
  1555. }
  1556. WorkActivityProcess pro = new WorkActivityProcess();
  1557. pro.setId("");
  1558. pro.setDelFlag("0");
  1559. pro.preInsert();
  1560. pro.setRemarks("[强制撤销]");
  1561. pro.setProcessKey(processList.get(0).getProcessKey());
  1562. pro.setIsApproval("1");
  1563. pro.setProcessInstanceId(processList.get(0).getProcessInstanceId());
  1564. pro.setCount(0);
  1565. workActivityProcessDao.insert(pro);
  1566. //结束该流程,设为"撤销"状态月
  1567. LeaveApply leave = new LeaveApply();
  1568. leave.setId(id);
  1569. leave.setStatus("11");
  1570. leave.setProcessInstanceId(leaveApply.getProcessInstanceId());
  1571. leave.preUpdate();
  1572. this.updateStateById(leave);
  1573. actTaskService.endProcessInstance(leaveApply.getProcessInstanceId(), "请假申请-撤回");
  1574. dao.updateLongTime(leaveApply);
  1575. dao.deleteDetail(leaveApply);
  1576. }
  1577. }
  1578. @Transactional(readOnly = false)
  1579. public void reject(LeaveApply leaveApply){
  1580. WorkActivityProcess workActivityProcess = new WorkActivityProcess();
  1581. workActivityProcess.setProcessInstanceId(leaveApply.getProcessInstanceId());
  1582. List<WorkActivityProcess> processList = workActivityProcessService.findList(workActivityProcess);
  1583. if (processList != null && processList.size() > 0) {
  1584. for (int i = 0; i < processList.size(); i++) {
  1585. WorkActivityProcess p = processList.get(i);
  1586. if (StringUtils.isNotBlank(p.getIsApproval()) && "0".equals(p.getIsApproval())&&! "modifyApply".equals(p.getActivityTask())) {
  1587. workActivityProcessDao.delete(p);
  1588. }
  1589. }
  1590. }
  1591. workActivityProcessService.deleteProcessIdAuditUsers(leaveApply.getProcessInstanceId());
  1592. }
  1593. /**
  1594. * 启动审批流程
  1595. */
  1596. @Transactional(readOnly = false)
  1597. public String extendSave(LeaveApply leaveApply, String processInstanceId) {
  1598. try {
  1599. double days=Double.parseDouble(leaveApply.getLongTime());//请假天数
  1600. Map<String, Object> variables = new HashMap<String, Object>();
  1601. identityService.setAuthenticatedUserId(leaveApply.getCurrentUser().getId());
  1602. User createUser = UserUtils.getUser();
  1603. String contentStr = "请假编号:" + leaveApply.getNo() + ",请假日期:" + DateUtils.formatDate(leaveApply.getApplyTime());
  1604. userDao.get(leaveApply.getApplyer()).getName();
  1605. String titleStr = "请假人:" + userDao.get(leaveApply.getApplyer()).getName();
  1606. String businessKey = leaveApply.getId();
  1607. Office office = UserUtils.getSelectOffice();
  1608. WorkActivityMenu workActivityMenu = workActivityMenuService.findByParentAndOffice("zzsql3125f1f194c8lz88a9miiii75090499", office);
  1609. // 启动流程
  1610. String processType = workActivityMenu.getProcessType();
  1611. StringBuffer buffer = new StringBuffer();
  1612. Activity activity = new Activity();
  1613. WorkProjectNotify workProjectNotify = UtilNotify
  1614. .saveNotify(leaveApply.getId(), null, leaveApply.getCompanyId(), titleStr, contentStr, "82", "0", "待审批", ""
  1615. );
  1616. List<User> users = new ArrayList<>();
  1617. List<User> bmzrList = UserUtils.getByRoleActivityEnname("bmzr", 2, office.getId(), "25", leaveApply.getCreateBy());
  1618. List<User> fgldList = UserUtils.getByRoleActivityEnname("fgld", 2, office.getId(), "25", leaveApply.getCreateBy());
  1619. List<User> zjlList = UserUtils.getByRoleActivityEnname("zjl", 3, office.getId(), "25", leaveApply.getCreateBy());
  1620. if (StringUtils.isNotBlank(workActivityMenu.getId())) {
  1621. workProjectNotify.setNotifyRole("");
  1622. workActivityMenu = workActivityMenuService.get(workActivityMenu.getId());
  1623. List<Activity> activities = workActivityMenu.getActivities();
  1624. for (Activity a : activities) {
  1625. String encount = a.getEncount();
  1626. String enlist = a.getEnlist();
  1627. if (a.getRole() != null && StringUtils.isNotBlank(a.getRole().getEnname())) {
  1628. List enusers = UserUtils.getByRoleActivityEnnames(a.getRole().getEnname(), office.getId(), "25", leaveApply.getCreateBy());
  1629. if (enusers.size() == 0) {
  1630. leaveApply.setStatus("5");
  1631. this.saveExtend(leaveApply);
  1632. return "流程审批人不能为空,角色" + a.getRole().getName() + "下无用户,请联系管理员!";
  1633. }
  1634. variables.put(enlist, enusers);
  1635. variables.put(encount, enusers.size());
  1636. }
  1637. if (a.getDelFlag().equals("0") && a.getCount() == 1) {
  1638. activity = a;
  1639. }
  1640. }
  1641. buffer.append(activity.getRole().getEnname());
  1642. if (activity != null && StringUtils.isNotBlank(activity.getId())) {
  1643. //角色审批
  1644. if (StringUtils.isNotBlank(activity.getRole().getEnname())) {
  1645. users = UserUtils.getByRoleActivityEnnames(activity.getRole().getEnname(), office.getId(), "25", leaveApply.getCreateBy());
  1646. }
  1647. //人员审批
  1648. if (StringUtils.isNotBlank(activity.getUser().getId())) {
  1649. users.add(activity.getUser());
  1650. }
  1651. }
  1652. workProjectNotify.setId("");
  1653. } else {
  1654. variables.put("bmzrList", bmzrList);
  1655. if (bmzrList.size() == 0) {
  1656. leaveApply.setStatus("5");
  1657. this.saveExtend(leaveApply);
  1658. }
  1659. if (bmzrList.size() == 0) {
  1660. return "流程审批人不能为空,角色业务部负责人下无用户,请联系管理员!";
  1661. }
  1662. variables.put("bmzrCount", bmzrList.size());
  1663. processType = "leaveExtend";
  1664. users.addAll(bmzrList);
  1665. }
  1666. List<String> userIds = new ArrayList<>(users.size());
  1667. for (User u : users) {
  1668. userIds.add(u.getId());
  1669. workProjectNotify.setUser(u);
  1670. workProjectNotify.setId("");
  1671. workProjectNotify.setNotifyRole("业务部负责人审批");
  1672. workProjectNotifyService.save(workProjectNotify);
  1673. Map<String, Object> extras = new HashMap<>();
  1674. extras.put("type", "7002");
  1675. extras.put("procDefKey", "82");
  1676. extras.put("id", workProjectNotify.getId());
  1677. UserUtils.pushInfoToApp(titleStr, contentStr, extras, u.getId());
  1678. }
  1679. UserUtils.pushIm(userIds, contentStr);
  1680. variables.put("busId", businessKey);
  1681. variables.put("type", processType);
  1682. variables.put("title", "审批单:" + leaveApply.getNo());//设置标题;
  1683. ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processType, businessKey, variables);
  1684. if (org.apache.commons.lang3.StringUtils.isNotBlank(processInstanceId)) {
  1685. workActivityProcessService.updateProcessInstanceId(processInstance.getId(), processInstanceId);
  1686. workActivityProcessService.deleteProcessInstanceId(processInstanceId);
  1687. workActivityProcessService.deleteProcessIdAuditUsers(processInstanceId);
  1688. WorkActivityProcess pro = new WorkActivityProcess();
  1689. pro.setId("");
  1690. pro.setDelFlag("0");
  1691. pro.preInsert();
  1692. pro.setRemarks("续假申请");
  1693. pro.setProcessKey("leaveExtend");
  1694. pro.setIsApproval("1");
  1695. pro.setProcessInstanceId(processInstance.getId());
  1696. pro.setCount(0);
  1697. workActivityProcessDao.insert(pro);
  1698. }
  1699. List<Activity> list = workActivityMenu.getActivities();
  1700. if (list != null && list.size() != 0) {
  1701. workActivityProcessService.saveList(list, processInstance.getId());
  1702. } else {
  1703. WorkActivityProcess workActivityProcess = new WorkActivityProcess();
  1704. workActivityProcess.setProcessKey(processType);
  1705. workActivityProcess.setProcessInstanceId(processInstance.getId());
  1706. workActivityProcess.setCount(1);
  1707. workActivityProcess.setIsApproval("0");
  1708. workActivityProcessService.insert(workActivityProcess);
  1709. workActivityProcessService.insertAuditsByType(bmzrList, processInstance.getId(), 1, 1);
  1710. if(days>1){
  1711. workActivityProcess.setCount(2);
  1712. workActivityProcess.setId("");
  1713. workActivityProcessService.save(workActivityProcess);
  1714. workActivityProcessService.insertAuditsByType(fgldList,processInstance.getId(),2,0);
  1715. }
  1716. if(days>3){
  1717. workActivityProcess.setCount(3);
  1718. workActivityProcess.setId("");
  1719. workActivityProcessService.save(workActivityProcess);
  1720. workActivityProcessService.insertAuditsByType(zjlList,processInstance.getId(),3,0);
  1721. }
  1722. }
  1723. leaveApply.setProcessInstanceId(processInstance.getId());
  1724. leaveApply.setStatus("10");
  1725. this.saveExtend(leaveApply);
  1726. workActivityProcessService.updateType(processInstance.getId(), "leaveExtend");
  1727. } catch (Exception e) {
  1728. logger.error("启动审批流程异常:", e);
  1729. return "启动审批流程异常:" + e.getMessage();
  1730. }
  1731. return "";
  1732. }
  1733. /**
  1734. * 销假审核流程
  1735. */
  1736. @Transactional(readOnly = false)
  1737. public String auditExtendSave(LeaveApply leaveApply, List<User> auditUsers) {
  1738. // 对不同环节的业务逻辑进行操作
  1739. double days=Double.parseDouble(leaveApply.getLongTime());//请假天数
  1740. String taskDefKey = leaveApply.getAct().getTaskDefKey();
  1741. if (!"modifyApply".equals(taskDefKey) && !taskDefKey.contains("audit")) {
  1742. actTaskService.claim(leaveApply.getAct().getTaskId(), UserUtils.getUser().getId());
  1743. } else {
  1744. leaveApply.getAct().setFlag("yes");
  1745. updateExtendDetail(leaveApply);
  1746. updateFile(leaveApply);
  1747. }
  1748. String comment = "";
  1749. if ("12".equals(leaveApply.getStatus())) {
  1750. comment = ("yes".equals(leaveApply.getAct().getFlag()) ? "[重新申请] " : "[已撤销] ");
  1751. } else {
  1752. comment = ("yes".equals(leaveApply.getAct().getFlag()) ? "[同意] " : "[驳回] ") + leaveApply.getAct().getComment();
  1753. }
  1754. //yes 的时候状态为审核通过 否则为未通过
  1755. //1 审核中 2 未通过
  1756. leaveApply.setStatus(("yes".equals(leaveApply.getAct().getFlag()) ? "10" : "12"));
  1757. Map<String, Object> vars = Maps.newHashMap();
  1758. //业务逻辑对应的条件表达式
  1759. String exp = "";
  1760. String taskCount = "";
  1761. String notifyRole = "";
  1762. int key = 0;
  1763. String enname = "";
  1764. String str = "请假编号:" + leaveApply.getNo() + ",请假日期:" + DateUtils.formatDate(leaveApply.getApplyTime());
  1765. User createUser = userDao.get(leaveApply.getCurrentUser());
  1766. String notifyTitle = "请假人:" + userDao.get(leaveApply.getApplyer()).getName();
  1767. List<Activity> activitieList = activityService.getByProcessInstanceId(leaveApply.getProcessInstanceId());
  1768. WorkActivityMenu workActivityMenu = new WorkActivityMenu();
  1769. if (activitieList != null && activitieList.size() != 0) {
  1770. workActivityMenu.setProcessType(activitieList.get(0).getProcessKey());
  1771. workActivityMenu.setActivities(activitieList);
  1772. }
  1773. WorkActivityProcess workActivityProcess = new WorkActivityProcess();
  1774. WorkActivityProcess selectProcess = new WorkActivityProcess();
  1775. selectProcess.setProcessInstanceId(leaveApply.getProcessInstanceId());
  1776. List<WorkActivityProcess> workActivityProcesses = workActivityProcessService.findList(selectProcess);
  1777. List<Activity> activities = workActivityMenu.getActivities();
  1778. if (StringUtils.isNotBlank(workActivityMenu.getProcessType()) && !workActivityMenu.getProcessType().equals("leaveExtend")) {
  1779. key = 1;
  1780. for (int i = 0; i < workActivityProcesses.size(); i++) {
  1781. WorkActivityProcess activityProcess = workActivityProcesses.get(i);
  1782. if (taskDefKey.equals(activityProcess.getActivityTask()) && !taskDefKey.equals("modifyApply")) {
  1783. taskCount = activityProcess.getCount() + "";
  1784. workActivityProcess = activityProcess;
  1785. if (!workActivityProcess.getIsApproval().equals("0")) {
  1786. workActivityProcess.setId("");
  1787. }
  1788. exp = "pass";
  1789. if (!"yes".equals(leaveApply.getAct().getFlag())) {
  1790. leaveApply.setStatus("12");
  1791. workActivityProcess.setIsApproval("2");
  1792. String returnBack = "-1";
  1793. for (Activity activity : activities) {
  1794. if (activity.getCount() == activityProcess.getCount()) {
  1795. notifyRole = activity.getName();
  1796. returnBack = activity.getReturnBack();
  1797. break;
  1798. }
  1799. }
  1800. if (returnBack.equals("0")) {
  1801. workActivityProcess.setId("");
  1802. }
  1803. } else {
  1804. workActivityProcess.setIsApproval("1");
  1805. }
  1806. } else if (taskDefKey.equals("modifyApply")) {
  1807. notifyRole = "调整请假信息";
  1808. taskCount = "0";
  1809. exp = "pass";
  1810. workActivityProcess.setId("");
  1811. workActivityProcess.setCount(0);
  1812. if (!"yes".equals(leaveApply.getAct().getFlag())) {
  1813. leaveApply.setStatus("11");
  1814. workActivityProcess.setIsApproval("2");
  1815. } else {
  1816. workActivityProcess.setIsApproval("1");
  1817. }
  1818. break;
  1819. }
  1820. }
  1821. } else {
  1822. workActivityMenu.setProcessType("leaveExtend");
  1823. for (int i = 0; i < workActivityProcesses.size(); i++) {
  1824. WorkActivityProcess activityProcess = workActivityProcesses.get(i);
  1825. String count = activityProcess.getCount() + "";
  1826. workActivityProcess = activityProcess;
  1827. if (!workActivityProcess.getIsApproval().equals("0")) {
  1828. workActivityProcess.setId("");
  1829. }
  1830. // 审核环节
  1831. if ("bmzr".equals(taskDefKey) && count.contains("1")) {
  1832. taskCount = "1";
  1833. exp = "pass";
  1834. if ("yes".equals(leaveApply.getAct().getFlag())) {
  1835. leaveApply.getAct().setFlag("end");
  1836. notifyRole = "审批通过";
  1837. workActivityProcess.setIsApproval("1");
  1838. if(days>1){
  1839. leaveApply.getAct().setFlag("yes");
  1840. vars.put("fgldList", auditUsers);
  1841. vars.put("fgldCount",auditUsers.size());
  1842. workActivityProcessService.insertAuditsByType(auditUsers,leaveApply.getProcessInstanceId(),2,1);
  1843. notifyRole = "分管领导审核";
  1844. enname = "fgld";
  1845. }
  1846. } else {
  1847. notifyRole = "调整请假信息";
  1848. workActivityProcess.setIsApproval("2");
  1849. dao.updateLongTime(leaveApply);
  1850. dao.deleteDetail(leaveApply);
  1851. }
  1852. break;
  1853. } else if ("fgld".equals(taskDefKey) && count.contains("2")) {
  1854. taskCount = "2";
  1855. exp = "pass";
  1856. if ("yes".equals(leaveApply.getAct().getFlag())) {
  1857. leaveApply.getAct().setFlag("end");
  1858. notifyRole = "审批通过";
  1859. workActivityProcess.setIsApproval("1");
  1860. if(days>3){
  1861. leaveApply.getAct().setFlag("yes");
  1862. vars.put("zjlList", auditUsers);
  1863. vars.put("zjlCount",auditUsers.size());
  1864. workActivityProcessService.insertAuditsByType(auditUsers,leaveApply.getProcessInstanceId(),3,1);
  1865. notifyRole = "总经理审核";
  1866. enname = "zjl";
  1867. }
  1868. } else {
  1869. notifyRole = "调整请假信息";
  1870. workActivityProcess.setIsApproval("2");
  1871. dao.updateLongTime(leaveApply);
  1872. dao.deleteDetail(leaveApply);
  1873. }
  1874. break;
  1875. } else if ("zjl".equals(taskDefKey) && count.contains("3")) {
  1876. taskCount = "3";
  1877. exp = "pass";
  1878. if ("yes".equals(leaveApply.getAct().getFlag())) {
  1879. notifyRole = "审批通过";
  1880. workActivityProcess.setIsApproval("1");
  1881. } else {
  1882. notifyRole = "调整请假信息";
  1883. workActivityProcess.setIsApproval("2");
  1884. dao.updateLongTime(leaveApply);
  1885. dao.deleteDetail(leaveApply);
  1886. }
  1887. break;
  1888. }else if ("modifyApply".equals(taskDefKey) && count.contains("0")) {
  1889. notifyRole = "业务部负责人审批";
  1890. taskCount = "0";
  1891. exp = "pass";
  1892. workActivityProcess.setCount(0);
  1893. enname = "bmzr";
  1894. Office office = UserUtils.getSelectOffice();
  1895. List<User> bmzrList = UserUtils.getByRoleActivityEnname("bmzr", 2, office.getId(), "25", leaveApply.getCreateBy());
  1896. List<User> fgldList = UserUtils.getByRoleActivityEnname("fgld", 2, office.getId(), "25", leaveApply.getCreateBy());
  1897. List<User> zjlList = UserUtils.getByRoleActivityEnname("zjl", 3, office.getId(), "25", leaveApply.getCreateBy());
  1898. WorkActivityProcess workActivityProcess1 = new WorkActivityProcess();
  1899. workActivityProcess1.setProcessKey("leaveApply");
  1900. workActivityProcess1.setProcessInstanceId(leaveApply.getProcessInstanceId());
  1901. workActivityProcess1.setCount(1);
  1902. workActivityProcess1.setIsApproval("0");
  1903. workActivityProcessService.insert(workActivityProcess1);
  1904. workActivityProcessService.insertAuditsByType(bmzrList,leaveApply.getProcessInstanceId(), 1, 1);
  1905. if(days>1){
  1906. workActivityProcess1.setCount(2);
  1907. workActivityProcess1.setId("");
  1908. workActivityProcessService.save(workActivityProcess1);
  1909. workActivityProcessService.insertAuditsByType(fgldList,leaveApply.getProcessInstanceId(),2,0);
  1910. }
  1911. if(days>3){
  1912. workActivityProcess1.setCount(3);
  1913. workActivityProcess1.setId("");
  1914. workActivityProcessService.save(workActivityProcess1);
  1915. workActivityProcessService.insertAuditsByType(zjlList,leaveApply.getProcessInstanceId(),3,0);
  1916. }
  1917. if (!"yes".equals(leaveApply.getAct().getFlag())) {
  1918. leaveApply.setStatus("11");
  1919. }
  1920. break;
  1921. }
  1922. }
  1923. }
  1924. // 设置意见
  1925. leaveApply.getAct().setComment(("yes".equals(leaveApply.getAct().getFlag()) ? "[同意] " : "[驳回] ") + leaveApply.getAct().getComment());
  1926. leaveApply.preUpdate();
  1927. // 提交流程任务
  1928. vars.put(exp, leaveApply.getAct().getFlag());
  1929. vars.put("passs", true);
  1930. if("end".equals(leaveApply.getAct().getFlag())){
  1931. leaveApply.getAct().setFlag("yes");
  1932. }
  1933. workActivityProcessService.updateProcess(workActivityProcess, workActivityMenu, key, taskCount, leaveApply.getProcessInstanceId(), taskDefKey, "modifyApply", leaveApply.getAct().getFlag(), comment, activities);
  1934. // 提交流程任务
  1935. if("no".equals(leaveApply.getAct().getFlag())){
  1936. this.reject(leaveApply);
  1937. }
  1938. actTaskService.complete(leaveApply.getAct().getTaskId(), leaveApply.getAct().getProcInsId(), leaveApply.getAct().getComment(), vars);
  1939. boolean state = actTaskService.isProcessEnd(leaveApply.getAct().getProcInsId());
  1940. List<User> users = new ArrayList<>();
  1941. List<User> userList = new ArrayList<>();
  1942. if (!state) {
  1943. users.add(leaveApply.getCreateBy());
  1944. if ("yes".equals(leaveApply.getAct().getFlag())||"end".equals(leaveApply.getAct().getFlag())) {
  1945. leaveApply.setStatus("5");
  1946. WorkProjectNotify notify = new WorkProjectNotify();
  1947. notify.setNotifyId(leaveApply.getId());
  1948. userList = workProjectNotifyService.readByNotifyId(notify);
  1949. workProjectNotifyService
  1950. .save(UtilNotify
  1951. .saveNotify(leaveApply.getId(),
  1952. leaveApply.getCreateBy(),
  1953. leaveApply.getCompanyId(),
  1954. notifyTitle,
  1955. str,
  1956. "82",
  1957. "0",
  1958. "待通知",
  1959. notifyRole));
  1960. LeaveDetail detail=new LeaveDetail();
  1961. detail.setLeaveId(leaveApply.getId());
  1962. List<LeaveDetail> leaveDetails = leaveDetailDao.findList(detail);
  1963. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  1964. Office company = UserUtils.getSelectCompany();
  1965. User user = UserUtils.getByCompanyAndUserId(leaveApply.getApplyer(),company.getId());
  1966. WorkStaffBasicInfo workStaffBasicInfo = new WorkStaffBasicInfo();
  1967. workStaffBasicInfo.setUserId(leaveApply.getApplyer());
  1968. workStaffBasicInfo.setCompany(company);
  1969. List<WorkStaffBasicInfo> workStaffAchives = workStaffAchivesDao.getByCompanyInfo(workStaffBasicInfo);
  1970. WorkStaffBasicInfo workStaffAchive = new WorkStaffBasicInfo();
  1971. WorkAttendanceRule oaRule = new WorkAttendanceRule();
  1972. if (workStaffAchives!=null && workStaffAchives.size()!=0) {
  1973. workStaffAchive = workStaffAchives.get(0);
  1974. //依据公司和规则编号查询规则
  1975. oaRule = workAttendanceRuleService.findAttendanceRuleByCompany(workStaffAchive.getCompany().getId(), workStaffAchive.getUserId(), "");
  1976. if (oaRule == null || StringUtils.isBlank(oaRule.getId())) {
  1977. oaRule = workAttendanceRuleService.findAttendanceRuleByCompany(workStaffAchive.getCompany().getId(), "", workStaffAchive.getOffice().getId());
  1978. }
  1979. if (oaRule == null) {
  1980. oaRule = new WorkAttendanceRule();
  1981. oaRule.setType("3");
  1982. }
  1983. }
  1984. Boolean status = false;
  1985. SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyMMdd");
  1986. if (StringUtils.isNotBlank(oaRule.getId()) && StringUtils.isNotBlank(workStaffAchive.getId()) && leaveDetails!=null && leaveDetails.size()!=0) {
  1987. for (LeaveDetail leaveDetail : leaveDetails) {
  1988. if (leaveDetail.getFlat().equals("2")) {
  1989. Date stateTime = leaveDetail.getStartTime();
  1990. Date endTime = leaveDetail.getEndTime();
  1991. String startType = leaveDetail.getStartType();
  1992. String endType = leaveDetail.getEndType();
  1993. LeaveType leaveType = leaveDetail.getLeaveType();
  1994. /* int stateMonth = Integer.parseInt(stateTime.substring(5,7));
  1995. int endMonth = Integer.parseInt(endTime.substring(5,7));*/
  1996. List<Date> dates = findDates(stateTime, endTime);
  1997. for (Date date : dates) {
  1998. String time = sdf.format(date);
  1999. int iholidays = workAttendanceInfoService.isHolidays(time);
  2000. if (iholidays == 0 || (iholidays != 0 && "1".equals(leaveType.getModel()))) {
  2001. Integer dateInt = Integer.parseInt(sdf1.format(date));
  2002. int count = 3;
  2003. if (sdf.format(date).equals(sdf.format(stateTime))) {
  2004. if (startType.equals("2")) {
  2005. count = 2;
  2006. }
  2007. }
  2008. if (sdf.format(date).equals(sdf.format(endTime))) {
  2009. if (endType.equals("1")) {
  2010. count = 1;
  2011. }
  2012. }
  2013. if (workStaffAchive.getWorkEndDate() != null) {
  2014. String end = sdf1.format(workStaffAchive.getWorkEndDate());
  2015. if (Integer.parseInt(end) >= dateInt) {
  2016. status = true;
  2017. }
  2018. } else {
  2019. status = true;
  2020. }
  2021. int holidays = 0;
  2022. if (status) {
  2023. WorkAttendanceInfo workAttendanceInfo1 = new WorkAttendanceInfo();
  2024. WorkAttendanceInfo workAttendanceInfo2 = new WorkAttendanceInfo();
  2025. WorkAttendanceInfo workAttendanceInfo = new WorkAttendanceInfo();
  2026. workAttendanceInfo.setStaffId(workStaffAchive.getId());
  2027. workAttendanceInfo.setAttendanceDate(date);
  2028. List<WorkAttendanceInfo> workAttendanceInfos = workAttendanceInfoService.findList(workAttendanceInfo);
  2029. if (workAttendanceInfos != null && workAttendanceInfos.size() != 0) {
  2030. if (workAttendanceInfos.size() == 1) {
  2031. if (workAttendanceInfos.get(0).getMorningAfternoon().equals("1")) {
  2032. workAttendanceInfo1 = workAttendanceInfos.get(0);
  2033. } else {
  2034. workAttendanceInfo2 = workAttendanceInfos.get(0);
  2035. }
  2036. } else {
  2037. if (workAttendanceInfos.get(0).getMorningAfternoon().equals("1")) {
  2038. workAttendanceInfo2 = workAttendanceInfos.get(1);
  2039. workAttendanceInfo1 = workAttendanceInfos.get(0);
  2040. } else {
  2041. workAttendanceInfo1 = workAttendanceInfos.get(1);
  2042. workAttendanceInfo2 = workAttendanceInfos.get(0);
  2043. }
  2044. }
  2045. }
  2046. workAttendanceInfoService.saveInfo(oaRule, oaRule.getType(), workStaffAchive.getId(), user, date, time, null, "", "", "",
  2047. "4", "4", "", holidays, null,
  2048. "", leaveType.getIsAttendance(), leaveType.getIsSubsidized(),
  2049. "", "", null, "", count, workAttendanceInfo1.getId(), workAttendanceInfo2.getId());
  2050. }
  2051. }
  2052. }
  2053. }
  2054. }
  2055. }
  2056. //修改明细flat
  2057. dao.updateDetailFlat(leaveApply);
  2058. } else {
  2059. WorkProjectNotify notify = new WorkProjectNotify();
  2060. notify.setNotifyId(leaveApply.getId());
  2061. userList = workProjectNotifyService.readByNotifyId(notify);
  2062. if (!"11".equals(leaveApply.getStatus())) {
  2063. leaveApply.setStatus("12");
  2064. workProjectNotifyService
  2065. .save(UtilNotify
  2066. .saveNotify(leaveApply.getId(),
  2067. leaveApply.getCreateBy(),
  2068. leaveApply.getCompanyId(),
  2069. notifyTitle,
  2070. str,
  2071. "82",
  2072. "0",
  2073. "待通知",
  2074. notifyRole));
  2075. }
  2076. }
  2077. workActivityProcessService.deleteProcessIdAuditUsers(leaveApply.getProcessInstanceId());
  2078. } else {
  2079. if (StringUtils.isNotBlank(workActivityMenu.getProcessType()) && !workActivityMenu.getProcessType().equals("leaveExtend")) {
  2080. WorkProjectNotify notify = new WorkProjectNotify();
  2081. notify.setNotifyId(leaveApply.getId());
  2082. userList = workProjectNotifyService.readByNotifyId(notify);
  2083. //users.addAll(userList);
  2084. WorkProjectNotify workProjectNotify = UtilNotify
  2085. .saveNotify(leaveApply.getId(),
  2086. new User(),
  2087. leaveApply.getCompanyId(),
  2088. notifyTitle,
  2089. str,
  2090. "82",
  2091. "0",
  2092. "待审批",
  2093. notifyRole);
  2094. List<WorkProjectNotify> workProjectNotifys = activityService.getByFlagAndTaskDefKeyList(
  2095. activities,
  2096. workProjectNotify,
  2097. taskDefKey,
  2098. leaveApply.getAct().getFlag(),
  2099. taskCount,
  2100. leaveApply.getCreateBy(),
  2101. leaveApply.getOfficeId(),
  2102. "82");
  2103. for (WorkProjectNotify workProjectNotify1 : workProjectNotifys) {
  2104. users.add(workProjectNotify1.getUser());
  2105. workProjectNotify1.setId("");
  2106. workProjectNotify1.setIsNewRecord(false);
  2107. workProjectNotifyService
  2108. .save(workProjectNotify1);
  2109. }
  2110. } else {
  2111. if (!"yes".equals(leaveApply.getAct().getFlag())) {
  2112. WorkProjectNotify notify = new WorkProjectNotify();
  2113. notify.setNotifyId(leaveApply.getId());
  2114. userList = workProjectNotifyService.readByNotifyId(notify);
  2115. workProjectNotifyService
  2116. .save(UtilNotify
  2117. .saveNotify(leaveApply.getId(),
  2118. leaveApply.getCreateBy(),
  2119. leaveApply.getCompanyId(),
  2120. notifyTitle,
  2121. str,
  2122. "82",
  2123. "0",
  2124. "重新申请",
  2125. notifyRole));
  2126. users.add(leaveApply.getCreateBy());
  2127. } else {
  2128. if (StringUtils.isNotBlank(enname)) {
  2129. WorkProjectNotify notify = new WorkProjectNotify();
  2130. notify.setNotifyId(leaveApply.getId());
  2131. userList = workProjectNotifyService.readByNotifyId(notify);
  2132. //users.addAll(userList1);
  2133. WorkProjectNotify workProjectNotify = UtilNotify
  2134. .saveNotify(leaveApply.getId(),
  2135. new User(),
  2136. leaveApply.getCompanyId(),
  2137. notifyTitle,
  2138. str,
  2139. "82",
  2140. "0",
  2141. "待审批",
  2142. notifyRole);
  2143. users.addAll(auditUsers);
  2144. for (User user1 : auditUsers) {
  2145. workProjectNotify.setUser(user1);
  2146. workProjectNotify.setId("");
  2147. workProjectNotify.setIsNewRecord(false);
  2148. workProjectNotifyService.save(workProjectNotify);
  2149. Map<String, Object> extras = new HashMap<>();
  2150. extras.put("type", "7002");
  2151. extras.put("procDefKey", "82");
  2152. extras.put("id", workProjectNotify.getId());
  2153. UserUtils.pushInfoToApp(notifyTitle, str, extras, user1.getId());
  2154. }
  2155. } else {
  2156. WorkProjectNotify notify = new WorkProjectNotify();
  2157. notify.setNotifyId(leaveApply.getId());
  2158. userList = workProjectNotifyService.readByNotifyId(notify);
  2159. users.addAll(userList);
  2160. users.add(leaveApply.getCreateBy());
  2161. workProjectNotifyService
  2162. .save(UtilNotify
  2163. .saveNotify(leaveApply.getId(),
  2164. leaveApply.getCreateBy(),
  2165. leaveApply.getCompanyId(),
  2166. notifyTitle,
  2167. str,
  2168. "82",
  2169. "0",
  2170. "重新申请",
  2171. notifyRole));
  2172. }
  2173. }
  2174. }
  2175. }
  2176. if (users != null && users.size() != 0) {
  2177. for (User u : users) {
  2178. UserUtils.pushIm(u.getId(), str);
  2179. }
  2180. }
  2181. if (userList != null && userList.size() != 0) {
  2182. for (User u : userList) {
  2183. UserUtils.pushMeIm(u.getId());
  2184. }
  2185. }
  2186. this.saveExtend(leaveApply);
  2187. dao.update(leaveApply);
  2188. return "保存审核意见成功!";
  2189. }
  2190. @Transactional(readOnly = false)
  2191. public int startMonthTask(String firstDay, String lastDay) {
  2192. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  2193. SimpleDateFormat sf = new SimpleDateFormat("yyyyMMdd");
  2194. Date dBegin = null;
  2195. Date dEnd=null;
  2196. String year=lastDay.substring(0,4);
  2197. AjaxJson ajaxJson = new AjaxJson();
  2198. workCalendarService.queryHoliday(year, ajaxJson);
  2199. Map<String, String> map = ajaxJson.getBody();
  2200. String holidays = map.get("holidays");
  2201. if(holidays==null||"".equals(holidays)){
  2202. return -1;//未发布法定节假日
  2203. }
  2204. String workdays = map.get("workdays");
  2205. int count = 0;
  2206. try {
  2207. dBegin = sdf.parse(firstDay);
  2208. dEnd = sdf.parse(lastDay);
  2209. } catch (ParseException e) {
  2210. e.printStackTrace();
  2211. }
  2212. List<Date> lDate = findDates(dBegin, dEnd);
  2213. for (Date d : lDate) {
  2214. System.out.println(sf.format(d));
  2215. if (holidays.contains(sf.format(d))) {
  2216. continue;
  2217. } else if (workdays.contains(sf.format(d))) {
  2218. count++;
  2219. } else if (!this.isWeek(sf.format(d))) {
  2220. count++;
  2221. }
  2222. }
  2223. return count;
  2224. }
  2225. public static Boolean isWeek(String day) {
  2226. SimpleDateFormat sdfDay = new SimpleDateFormat("yyyyMMdd");
  2227. Date date= null;//取时间
  2228. try {
  2229. date = sdfDay.parse(day);
  2230. Calendar calendar = new GregorianCalendar();
  2231. calendar.setTime(date);
  2232. int week = calendar.get(Calendar.DAY_OF_WEEK)-1;
  2233. if (week==0 || week==6){
  2234. return true;
  2235. }else {
  2236. return false;
  2237. }
  2238. } catch (ParseException e) {
  2239. e.printStackTrace();
  2240. }
  2241. return false;
  2242. }
  2243. public static List<Date> findDates(Date dBegin, Date dEnd) {
  2244. List lDate = new ArrayList();
  2245. lDate.add(dBegin);
  2246. Calendar calBegin = Calendar.getInstance();
  2247. // 使用给定的 Date 设置此 Calendar 的时间
  2248. calBegin.setTime(dBegin);
  2249. Calendar calEnd = Calendar.getInstance();
  2250. // 使用给定的 Date 设置此 Calendar 的时间
  2251. calEnd.setTime(dEnd);
  2252. // 测试此日期是否在指定日期之后
  2253. while (dEnd.after(calBegin.getTime())) {
  2254. // 根据日历的规则,为给定的日历字段添加或减去指定的时间量
  2255. calBegin.add(Calendar.DAY_OF_MONTH, 1);
  2256. lDate.add(calBegin.getTime());
  2257. }
  2258. return lDate;
  2259. }
  2260. public int findHisTime(LeaveApply leaveApply){
  2261. return dao.findHisTime(leaveApply);
  2262. }
  2263. public int findHisDate(LeaveApply leaveApply){
  2264. return dao.findHisDate(leaveApply);
  2265. }
  2266. public Page<LeaveApply> getMangePage(Page<LeaveApply> page, LeaveApply leaveApply) {
  2267. leaveApply.setPage(page);
  2268. List newList=new ArrayList();
  2269. List<LeaveApply> list=dao.getMange(leaveApply);
  2270. if(list!=null&&list.size()>0){
  2271. for(LeaveApply leaveApply1:list){
  2272. LeaveApply leaveApply2=dao.getSumDays(leaveApply1.getStaffId());
  2273. leaveApply1.setSumDays(leaveApply2.getSumDays());
  2274. int count=dao.getResetState(leaveApply1.getStaffId());
  2275. if(count==0){
  2276. leaveApply1.setState("1");
  2277. }else{
  2278. leaveApply1.setState("0");//0未重置,1已重置
  2279. }
  2280. newList.add(leaveApply1);
  2281. }
  2282. }
  2283. page.setList(newList);
  2284. return page;
  2285. }
  2286. @Transactional(readOnly = false)
  2287. public void reset(String basicInfoId) {
  2288. LeaveCount leaveCount=new LeaveCount();
  2289. leaveCount.setStaffId(basicInfoId);
  2290. List<LeaveCount> list= leaveCountDao.findList(leaveCount);
  2291. if(list!=null&&list.size()>0){
  2292. for(LeaveCount leaveCount1:list){
  2293. if("1".equals(leaveCount1.getLeaveType().getMethod())){
  2294. leaveCountDao.updateReset(leaveCount1.getId());
  2295. }else{
  2296. leaveCountDao.delete(leaveCount1);
  2297. }
  2298. }
  2299. }
  2300. }
  2301. //时间验证
  2302. @Transactional(readOnly = false)
  2303. public String validate(LeaveApply leaveApply){
  2304. SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyMMdd");
  2305. WorkStaffBasicInfo workStaffBasicInfo=this.getBasicInfo();
  2306. List<LeaveDetail> leaveDetails=leaveDetailDao.findHisList(workStaffBasicInfo.getId());
  2307. if(leaveApply.getLeaveDetailList()!=null&&leaveApply.getLeaveDetailList().size()>0){
  2308. List<LeaveDetail> list=leaveApply.getLeaveDetailList();
  2309. leaveDetails.addAll(list);
  2310. for(int j=0;j<list.size();j++){
  2311. LeaveDetail leaveDetail=list.get(j);
  2312. if(leaveDetail.getLeaveType()!=null&&!"1".equals(leaveDetail.getDelFlag())){
  2313. leaveDetail.setRealEndTime(leaveDetail.getEndTime());
  2314. leaveDetail.setRealEndType(leaveDetail.getEndType());
  2315. Date stateTime = leaveDetail.getStartTime();
  2316. double start=Integer.parseInt(sdf1.format(stateTime));
  2317. Date realEndTime = leaveDetail.getRealEndTime();
  2318. double realEnd=Integer.parseInt(sdf1.format(realEndTime));
  2319. String startType = leaveDetail.getStartType();
  2320. String realEndType = leaveDetail.getRealEndType();
  2321. if("2".equals(startType)){
  2322. start=start+0.5;
  2323. }
  2324. if("2".equals(realEndType)){
  2325. realEnd=realEnd+0.5;
  2326. }
  2327. for(int i=0;i<leaveDetails.size();i++){
  2328. LeaveDetail detail=leaveDetails.get(i);
  2329. if(detail.getLeaveType()!=null&&!"1".equals(detail.getDelFlag())){
  2330. Date stateTime1 = detail.getStartTime();
  2331. double start1=Integer.parseInt(sdf1.format(stateTime1));
  2332. Date realEndTime1 = detail.getRealEndTime();
  2333. if(realEndTime1==null){
  2334. realEndTime1=detail.getEndTime();
  2335. }
  2336. double realEnd1=Integer.parseInt(sdf1.format(realEndTime1));
  2337. String startType1 = detail.getStartType();
  2338. String realEndType1 = detail.getRealEndType();
  2339. if(realEndType1==null){
  2340. realEndType1=detail.getEndType();
  2341. }
  2342. if("2".equals(startType1)){
  2343. start1=start1+0.5;
  2344. }
  2345. if("2".equals(realEndType1)){
  2346. realEnd1=realEnd1+0.5;
  2347. }
  2348. if(detail.getId()!=null&&leaveDetail.getId()!=null){
  2349. if(!detail.getId().equals(leaveDetail.getId())){
  2350. if((start>=start1&&start<=realEnd1)||(realEnd>=start1&&realEnd<=realEnd1)
  2351. ||(start1>=start&&start1<=realEnd)||(realEnd1>=start&&realEnd1<=realEnd)){
  2352. return "请假时间存在重叠情况!";
  2353. }
  2354. }
  2355. }
  2356. }
  2357. }
  2358. }
  2359. }
  2360. /*for(LeaveDetail leaveDetail:leaveApply.getLeaveDetailList()){
  2361. LeaveApply apply=new LeaveApply();
  2362. if(leaveApply.getId()!=null&&!"".equals(leaveApply.getId())){
  2363. apply.setId(leaveApply.getId());
  2364. }
  2365. apply.setStartTime(leaveDetail.getStartTime());
  2366. apply.setEndTime(leaveDetail.getEndTime());
  2367. apply.setStaffId(workStaffBasicInfo.getId());
  2368. int count =this.findHisTime(apply);
  2369. if(count>0){
  2370. if(leaveApply.getStatus()==null||"1".equals(leaveApply.getStatus())||"5".equals(leaveApply.getStatus())){
  2371. if("1".equals(type)){
  2372. leaveApply.setStatus("1");
  2373. this.save(leaveApply);
  2374. }else if("2".equals(type)){
  2375. leaveApply.setStatus("5");
  2376. this.saveExtend(leaveApply);
  2377. }
  2378. }
  2379. return "请假时间与历史请假时间存在重叠情况!";
  2380. }
  2381. apply.setStartType(leaveDetail.getStartType());
  2382. apply.setEndType(leaveDetail.getEndType());
  2383. int count1 =this.findHisDate(apply);
  2384. if(count1>0){
  2385. if(leaveApply.getStatus()==null||"1".equals(leaveApply.getStatus())||"5".equals(leaveApply.getStatus())){
  2386. if("1".equals(type)){
  2387. leaveApply.setStatus("1");
  2388. this.save(leaveApply);
  2389. }else if("2".equals(type)){
  2390. leaveApply.setStatus("5");
  2391. this.saveExtend(leaveApply);
  2392. }
  2393. }
  2394. return "请假时间与历史请假时间存在重叠情况!";
  2395. }
  2396. }*/
  2397. }
  2398. return "";
  2399. }
  2400. //时间验证
  2401. @Transactional(readOnly = false)
  2402. public String validateTime(Date startTime,String startType,Date endTime,String endType){
  2403. SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyMMdd");
  2404. WorkStaffBasicInfo workStaffBasicInfo=this.getBasicInfo();
  2405. List<LeaveDetail> leaveDetails=leaveDetailDao.findListValidateTime(workStaffBasicInfo.getId());
  2406. double start=Integer.parseInt(sdf1.format(startTime));
  2407. double end=Integer.parseInt(sdf1.format(endTime));
  2408. if("2".equals(startType)){
  2409. start=start+0.5;
  2410. }
  2411. if("2".equals(endType)){
  2412. end=end+0.5;
  2413. }
  2414. for(int i=0;i<leaveDetails.size();i++){
  2415. LeaveDetail detail=leaveDetails.get(i);
  2416. Date stateTime1 = detail.getStartTime();
  2417. double start1=Integer.parseInt(sdf1.format(stateTime1));
  2418. Date realEndTime1 = detail.getRealEndTime();
  2419. if(realEndTime1==null){
  2420. realEndTime1=detail.getEndTime();
  2421. }
  2422. double realEnd1=Integer.parseInt(sdf1.format(realEndTime1));
  2423. String startType1 = detail.getStartType();
  2424. String realEndType1 = detail.getRealEndType();
  2425. if(realEndType1==null){
  2426. realEndType1=detail.getEndType();
  2427. }
  2428. if("2".equals(startType1)){
  2429. start1=start1+0.5;
  2430. }
  2431. if("2".equals(realEndType1)){
  2432. realEnd1=realEnd1+0.5;
  2433. }
  2434. if((start>=start1&&start<=realEnd1)||(end>=start1&&end<=realEnd1)
  2435. ||(start1>=start&&start1<=end)||(realEnd1>=start&&realEnd1<=end)){
  2436. return "请假时间存在重叠情况!";
  2437. }
  2438. }
  2439. return "";
  2440. }
  2441. public double holidays(String startDate, String endDate, String startType,String endType) {
  2442. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  2443. SimpleDateFormat sf = new SimpleDateFormat("yyyyMMdd");
  2444. Date dBegin = null;
  2445. Date dEnd=null;
  2446. String year=endDate.substring(0,4);
  2447. AjaxJson ajaxJson = new AjaxJson();
  2448. workCalendarService.queryHoliday(year, ajaxJson);
  2449. Map<String, String> map = ajaxJson.getBody();
  2450. String holidays = map.get("holidays");
  2451. String workdays = map.get("workdays");
  2452. int count = 0;
  2453. try {
  2454. dBegin = sdf.parse(startDate);
  2455. dEnd = sdf.parse(endDate);
  2456. } catch (ParseException e) {
  2457. e.printStackTrace();
  2458. }
  2459. List<Date> lDate = DateUtils.findDates(dBegin, dEnd);
  2460. for (Date d : lDate) {
  2461. System.out.println(sf.format(d));
  2462. if (holidays.contains(sf.format(d))) {
  2463. continue;
  2464. } else if (workdays.contains(sf.format(d))) {
  2465. count++;
  2466. } else if (!DateUtils.isWeek(sf.format(d))) {
  2467. count++;
  2468. }
  2469. }
  2470. double c=count-1;
  2471. if(count!=0){
  2472. if("1".equals(startType) && "1".equals(endType) ){
  2473. c=c+0.5;
  2474. }else if("1".equals(startType) && "2".equals(endType)){
  2475. c=c+1;
  2476. }else if("2".equals(startType) && "2".equals(endType)){
  2477. c=c+0.5;
  2478. } else if("2".equals(startType) && "1".equals(endType)){
  2479. c=c;
  2480. }
  2481. }else{
  2482. c=0;
  2483. }
  2484. return c;
  2485. }
  2486. public static double getDay(Date satrtDate,Date endDate,String startType,String endType) {
  2487. double days = (double) ((endDate.getTime() - satrtDate.getTime()) / (1000*3600*24));
  2488. if("1".equals(startType) && "1".equals(endType)){
  2489. days=days+0.5;
  2490. }else if("1".equals(startType) && "2".equals(endType)){
  2491. days=days+1;
  2492. }else if("2".equals(startType) && "2".equals(endType)){
  2493. days=days+0.5;
  2494. } else if("2".equals(startType) && "1".equals(endType)){
  2495. days=days;
  2496. }
  2497. return days;
  2498. }
  2499. public String getYear(int i){//获取上一年
  2500. Date date = new Date();
  2501. SimpleDateFormat sdfYear = new SimpleDateFormat("yyyy");
  2502. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  2503. Calendar cal = Calendar.getInstance();
  2504. cal.setTime(date);//设置起时间
  2505. cal.add(Calendar.YEAR, i);//增加一年
  2506. return sdfYear.format(cal.getTime());
  2507. }
  2508. public String getNextDay(String time){//获取下一天
  2509. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  2510. Date date = null;
  2511. try {
  2512. date = sdf.parse(time);
  2513. } catch (ParseException e) {
  2514. e.printStackTrace();
  2515. }
  2516. Calendar cal = Calendar.getInstance();
  2517. cal.setTime(date);//设置起时间
  2518. cal.add(Calendar.DATE, 1);//增加一天
  2519. return sdf.format(cal.getTime());
  2520. }
  2521. public static void main(String[] args) {
  2522. /* Date date = new Date();
  2523. SimpleDateFormat sdfYear = new SimpleDateFormat("yyyy");
  2524. Calendar cal = Calendar.getInstance();
  2525. cal.setTime(date);//设置起时间
  2526. cal.add(Calendar.YEAR, -1);//增加一年
  2527. System.out.println("输出::"+sdfYear.format(cal.getTime()));*/
  2528. }
  2529. //时间验证
  2530. @Transactional(readOnly = false)
  2531. public void saveLeaveCount(LeaveDetail leaveDetail,double days,String staffId){
  2532. //请假统计详情
  2533. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  2534. SimpleDateFormat sdf2 = new SimpleDateFormat("MMdd");
  2535. SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyMMdd");
  2536. Date nowDate=new Date();
  2537. String now=sdf2.format(nowDate);
  2538. String start=sdf2.format(leaveDetail.getStartTime());
  2539. double d=Integer.parseInt(now);
  2540. double s=Integer.parseInt(start);
  2541. //获取系统参数
  2542. SimpleDateFormat sdfYear = new SimpleDateFormat("yyyy");
  2543. String time= UserUtils.getSysParam("reset",UserUtils.getUser());
  2544. String m="";
  2545. String n="";
  2546. String lastYear="";
  2547. if(time!=null&&!"".equals(time)) {
  2548. lastYear=this.getYear(-1)+"12"+time;
  2549. m=sdfYear.format(nowDate)+"12"+time;
  2550. n=sdfYear.format(nowDate)+"-12-"+time;
  2551. }else{
  2552. lastYear=this.getYear(-1)+"1231";
  2553. m=sdfYear.format(nowDate)+"1231";
  2554. n=sdfYear.format(nowDate)+"-12-31";
  2555. }
  2556. String year="";
  2557. double nextDays=0;
  2558. year=sdfYear.format(nowDate);
  2559. double start1=Integer.parseInt(sdf1.format(leaveDetail.getStartTime()));
  2560. Date realEndTime1 = leaveDetail.getRealEndTime();
  2561. if(realEndTime1==null){
  2562. realEndTime1=leaveDetail.getEndTime();
  2563. }
  2564. double realEnd1=Integer.parseInt(sdf1.format(realEndTime1));
  2565. String startType1 = leaveDetail.getStartType();
  2566. String realEndType1 = leaveDetail.getRealEndType();
  2567. if(realEndType1==null){
  2568. realEndType1=leaveDetail.getEndType();
  2569. }
  2570. if("2".equals(startType1)){
  2571. start1=start1+0.5;
  2572. }
  2573. if("2".equals(realEndType1)){
  2574. realEnd1=realEnd1+0.5;
  2575. }
  2576. double resetTime=Integer.parseInt(m)+0.5;
  2577. double lastResetTime=Integer.parseInt(lastYear)+0.5;
  2578. if(start1<=resetTime&&start1>lastResetTime){
  2579. if(resetTime>start1&&start1<realEnd1){
  2580. if("2".equals(leaveDetail.getLeaveType().getModel())){//工作日
  2581. days=this.holidays(sdf.format(leaveDetail.getStartTime()),
  2582. n,
  2583. leaveDetail.getStartType(),
  2584. "2");
  2585. nextDays=this.holidays(this.getNextDay(n),
  2586. sdf.format(realEndTime1),
  2587. "1",
  2588. realEndType1);
  2589. }else{
  2590. try {
  2591. days=getDay(leaveDetail.getStartTime(),sdf.parse(n), leaveDetail.getStartType(),"2");
  2592. nextDays=getDay(sdf.parse(this.getNextDay(n)),realEndTime1, "1",realEndType1);
  2593. } catch (ParseException e) {
  2594. e.printStackTrace();
  2595. }
  2596. }
  2597. }
  2598. LeaveCount leaveCount=new LeaveCount();
  2599. leaveCount.setStaffId(staffId);
  2600. leaveCount.setLeaveTypeId(leaveDetail.getLeaveTypeId());
  2601. leaveCount.setYear(year);
  2602. List<LeaveCount> leaveCounts=leaveCountService.findList(leaveCount);
  2603. if(leaveCounts!=null&&leaveCounts.size()>0){
  2604. LeaveCount leaveCount1=leaveCounts.get(0);
  2605. double sum=Double.parseDouble(leaveCount1.getSums());
  2606. int count=Integer.parseInt(leaveCount1.getCounts());
  2607. leaveCount1.setCounts(String.valueOf(count+1));
  2608. leaveCount1.setSums(String.valueOf(sum+days));
  2609. leaveCount1.setUpdateDate(new Date());
  2610. leaveCount1.setResetState("0");
  2611. leaveCountDao.update(leaveCount1);
  2612. }else{
  2613. LeaveCount leaveCount2=new LeaveCount();
  2614. leaveCount2.preInsert();
  2615. leaveCount2.setCreateBy(UserUtils.getUser());
  2616. leaveCount2.setUpdateDate(new Date());
  2617. leaveCount2.setCreateDate(new Date());
  2618. leaveCount2.setUpdateBy(UserUtils.getUser());
  2619. leaveCount2.setDelFlag("0");
  2620. leaveCount2.setStaffId(staffId);
  2621. leaveCount2.setSums(String.valueOf(days));
  2622. leaveCount2.setCounts("1");
  2623. leaveCount2.setResetState("0");//未重置
  2624. leaveCount2.setLeaveTypeId(leaveDetail.getLeaveTypeId());
  2625. leaveCount2.setYear(year);
  2626. leaveCountDao.insert(leaveCount2);
  2627. }
  2628. }
  2629. }
  2630. //请假管理重置定时方法
  2631. @Transactional(readOnly = false)
  2632. public void resetTask() {
  2633. SimpleDateFormat sdfYear = new SimpleDateFormat("yyyy");
  2634. String date=DateFormatUtils.format(new Date(), "yyyy-MM-dd");
  2635. Date nowDate=new Date();
  2636. String nowYear=sdfYear.format(nowDate);
  2637. LeaveCount l=new LeaveCount();
  2638. l.setYear(nowYear);
  2639. l.setResetState("0");
  2640. List<LeaveCount> leaveCounts= leaveCountDao.findList(l);
  2641. if(leaveCounts!=null&&leaveCounts.size()>0){
  2642. for(LeaveCount leaveCount:leaveCounts){
  2643. WorkStaffBasicInfo workStaffBasicInfo = workStaffAchivesDao.get(leaveCount.getStaffId());
  2644. User u=userDao.get(workStaffBasicInfo.getUserId());
  2645. String time= UserUtils.getSysParam("reset",u);
  2646. if(time==null||"".equals(time)) {
  2647. time=nowYear+"-12-31";
  2648. }else{
  2649. time=nowYear+"-12-"+time;
  2650. }
  2651. if(date.equals(time)){
  2652. if(Double.parseDouble(leaveCount.getLeaveType().getZero())>=Double.parseDouble(leaveCount.getSums())
  2653. ||"0".equals(leaveCount.getLeaveType().getZero())){
  2654. //统计下一年已经请假的天数
  2655. LeaveCount leaveCount2=new LeaveCount();
  2656. leaveCount2.preInsert();
  2657. leaveCount2.setCreateBy(u);
  2658. leaveCount2.setUpdateDate(new Date());
  2659. leaveCount2.setCreateDate(new Date());
  2660. leaveCount2.setUpdateBy(u);
  2661. leaveCount2.setDelFlag("0");
  2662. leaveCount2.setStaffId(leaveCount.getStaffId());
  2663. leaveCount2.setSums(String.valueOf(0));
  2664. leaveCount2.setCounts("1");
  2665. leaveCount2.setResetState("0");//未重置
  2666. leaveCount2.setLeaveTypeId(leaveCount.getLeaveTypeId());
  2667. leaveCount2.setYear(this.getYear(1));
  2668. leaveCountDao.insert(leaveCount2);
  2669. /* if("1".equals(leaveCount1.getLeaveType().getMethod())){
  2670. leaveCountDao.updateReset(leaveCount1.getId());
  2671. }else{
  2672. leaveCountDao.delete(leaveCount1);
  2673. }*/
  2674. }
  2675. }
  2676. }
  2677. }
  2678. }
  2679. //请假管理重置定时方法
  2680. @Transactional(readOnly = false)
  2681. public void backTask() {
  2682. List<LeaveApply> leaveApplyList=dao.getBackTaskList();
  2683. if(leaveApplyList!=null&&leaveApplyList.size()>0){
  2684. for(LeaveApply leaveApply:leaveApplyList){
  2685. User applyer=userDao.get(leaveApply.getApplyer());
  2686. String param=UserUtils.getSysParam("backState",applyer);
  2687. if("是".equals(param)){
  2688. LeaveDetail detail=new LeaveDetail();
  2689. detail.setLeaveId(leaveApply.getId());
  2690. List<LeaveDetail> leaveDetails = leaveDetailDao.findList(detail);
  2691. leaveApply.setLeaveDetailList(leaveDetails);
  2692. leaveApply.setBackTime(new Date());
  2693. leaveApply.setBackStartType("2");
  2694. String processInstanceId=leaveApply.getProcessInstanceId();
  2695. try {
  2696. Map<String, Object> variables = new HashMap<String, Object>();
  2697. identityService.setAuthenticatedUserId(leaveApply.getApplyer());
  2698. String contentStr = "请假编号:" + leaveApply.getNo() + ",请假日期:" + DateUtils.formatDate(leaveApply.getApplyTime());
  2699. String titleStr = "销假人:" + applyer.getName();
  2700. String businessKey = leaveApply.getId();
  2701. Office office = officeDao.get(leaveApply.getOfficeId());
  2702. WorkActivityMenu workActivityMenu = workActivityMenuService.findByParentAndOffice("zzsql3125f1f194c8lz88a9miiii75090477", office);
  2703. // 启动流程
  2704. String processType = workActivityMenu.getProcessType();
  2705. StringBuffer buffer = new StringBuffer();
  2706. Activity activity = new Activity();
  2707. WorkProjectNotify workProjectNotify = UtilNotify
  2708. .saveNotify(leaveApply.getId(), null, leaveApply.getCompanyId(), titleStr, contentStr, "81", "0", "待审批", ""
  2709. );
  2710. List<User> users = new ArrayList<>();
  2711. List<User> bmzrList = UserUtils.getByRoleActivityEnnameTask("bmzr", 2, office.getId(), "25", applyer);
  2712. if (StringUtils.isNotBlank(workActivityMenu.getId())) {
  2713. workProjectNotify.setNotifyRole("");
  2714. workActivityMenu = workActivityMenuService.get(workActivityMenu.getId());
  2715. List<Activity> activities = workActivityMenu.getActivities();
  2716. for (Activity a : activities) {
  2717. String encount = a.getEncount();
  2718. String enlist = a.getEnlist();
  2719. if (a.getRole() != null && StringUtils.isNotBlank(a.getRole().getEnname())) {
  2720. List enusers = UserUtils.getByRoleActivityEnnames(a.getRole().getEnname(), office.getId(), "25", leaveApply.getCreateBy());
  2721. if (enusers.size() == 0) {
  2722. leaveApply.setStatus("5");
  2723. this.save(leaveApply);
  2724. }
  2725. variables.put(enlist, enusers);
  2726. variables.put(encount, enusers.size());
  2727. }
  2728. if (a.getDelFlag().equals("0") && a.getCount() == 1) {
  2729. activity = a;
  2730. }
  2731. }
  2732. buffer.append(activity.getRole().getEnname());
  2733. if (activity != null && StringUtils.isNotBlank(activity.getId())) {
  2734. //角色审批
  2735. if (StringUtils.isNotBlank(activity.getRole().getEnname())) {
  2736. users = UserUtils.getByRoleActivityEnnames(activity.getRole().getEnname(), office.getId(), "25", leaveApply.getCreateBy());
  2737. }
  2738. //人员审批
  2739. if (StringUtils.isNotBlank(activity.getUser().getId())) {
  2740. users.add(activity.getUser());
  2741. }
  2742. }
  2743. workProjectNotify.setId("");
  2744. } else {
  2745. variables.put("bmzrList", bmzrList);
  2746. if (bmzrList.size() == 0) {
  2747. leaveApply.setStatus("5");
  2748. this.save(leaveApply);
  2749. }
  2750. if (bmzrList.size() == 0) {
  2751. System.out.println("系统自动发起销假:流程审批人不能为空,角色业务部负责人下无用户,请联系管理员!");
  2752. }
  2753. variables.put("bmzrCount", bmzrList.size());
  2754. processType = "leaveBack";
  2755. users.addAll(bmzrList);
  2756. }
  2757. List<String> userIds = new ArrayList<>(users.size());
  2758. for (User u : users) {
  2759. userIds.add(u.getId());
  2760. workProjectNotify.setUser(u);
  2761. workProjectNotify.setCreateBy(u);
  2762. workProjectNotify.setUpdateBy(u);
  2763. workProjectNotify.setId("");
  2764. workProjectNotify.setNotifyRole("业务部负责人审批");
  2765. workProjectNotifyService.save(workProjectNotify);
  2766. Map<String, Object> extras = new HashMap<>();
  2767. extras.put("type", "7002");
  2768. extras.put("procDefKey", "81");
  2769. extras.put("id", workProjectNotify.getId());
  2770. UserUtils.pushInfoToApp(titleStr, contentStr, extras, u.getId());
  2771. }
  2772. UserUtils.pushIm(userIds, contentStr);
  2773. variables.put("busId", businessKey);
  2774. variables.put("type", processType);
  2775. variables.put("title", "审批单:" + leaveApply.getNo());//设置标题;
  2776. ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processType, businessKey, variables);
  2777. if (org.apache.commons.lang3.StringUtils.isNotBlank(processInstanceId)) {
  2778. workActivityProcessService.updateProcessInstanceId(processInstance.getId(), processInstanceId);
  2779. workActivityProcessService.deleteProcessInstanceId(processInstanceId);
  2780. workActivityProcessService.deleteProcessIdAuditUsers(processInstanceId);
  2781. WorkActivityProcess pro = new WorkActivityProcess();
  2782. pro.setId("");
  2783. pro.setDelFlag("0");
  2784. pro.preInsert();
  2785. pro.setRemarks("销假申请");
  2786. pro.setProcessKey("leaveBack");
  2787. pro.setIsApproval("1");
  2788. pro.setCreateBy(applyer);
  2789. pro.setUpdateBy(applyer);
  2790. pro.setProcessInstanceId(processInstance.getId());
  2791. pro.setCount(0);
  2792. workActivityProcessDao.insert(pro);
  2793. }
  2794. List<Activity> list = workActivityMenu.getActivities();
  2795. if (list != null && list.size() != 0) {
  2796. workActivityProcessService.saveList(list, processInstance.getId());
  2797. } else {
  2798. WorkActivityProcess workActivityProcess = new WorkActivityProcess();
  2799. workActivityProcess.setProcessKey(processType);
  2800. workActivityProcess.setProcessInstanceId(processInstance.getId());
  2801. workActivityProcess.setCreateBy(applyer);
  2802. workActivityProcess.setUpdateBy(applyer);
  2803. workActivityProcess.setCount(1);
  2804. workActivityProcess.setIsApproval("0");
  2805. workActivityProcessService.insert(workActivityProcess);
  2806. workActivityProcessService.insertAuditsByType(bmzrList, processInstance.getId(), 1, 1);
  2807. }
  2808. leaveApply.setProcessInstanceId(processInstance.getId());
  2809. leaveApply.setStatus("6");
  2810. this.save(leaveApply);
  2811. workActivityProcessService.updateType(processInstance.getId(), "leaveBack");
  2812. } catch (Exception e) {
  2813. logger.error("启动审批流程异常:", e);
  2814. }
  2815. }
  2816. }
  2817. }
  2818. }
  2819. //验证上限天数
  2820. @Transactional(readOnly = false)
  2821. public String validateSumDays(LeaveApply leaveApply){
  2822. if(leaveApply.getLeaveDetailList()!=null&&leaveApply.getLeaveDetailList().size()>0){
  2823. List<LeaveDetail> list=leaveApply.getLeaveDetailList();
  2824. Map<String,String> map=new HashMap<String,String>();
  2825. for(int j=0;j<list.size();j++){
  2826. LeaveDetail leaveDetail=list.get(j);
  2827. if(leaveDetail.getLeaveType()!=null&&!"1".equals(leaveDetail.getDelFlag())){
  2828. String typeId=leaveDetail.getLeaveType().getId();
  2829. if(map.containsKey(typeId)){
  2830. double day= Double.parseDouble(map.get(typeId).toString())+Double.parseDouble(leaveDetail.getDays());
  2831. map.put(typeId,String.valueOf(day));
  2832. }else{
  2833. map.put(typeId,leaveDetail.getDays());
  2834. }
  2835. }
  2836. }
  2837. for(String key : map.keySet()){
  2838. String value = map.get(key);
  2839. LeaveType leaveType=leaveTypeDao.get(key);
  2840. if("1".equals(leaveType.getMaxDays())){//无上限
  2841. continue;
  2842. }
  2843. //单次或一次性
  2844. if("3".equals(leaveType.getMethod())||"4".equals(leaveType.getMethod())){
  2845. if(Double.parseDouble(leaveType.getSetDays())<Double.parseDouble(value)){
  2846. return leaveType.getName()+":超过上限天数!";
  2847. }
  2848. }else if("2".equals(leaveType.getMethod())){//单次累计
  2849. // 查询历史天数
  2850. String sumDay=leaveDetailDao.sumday(key,leaveApply.getId());
  2851. double d=Double.parseDouble(sumDay)+Double.parseDouble(value);
  2852. if(Double.parseDouble(leaveType.getSetDays())<d){
  2853. return leaveType.getName()+":超过上限天数!";
  2854. }
  2855. }else if("1".equals(leaveType.getMethod())){//年度累计
  2856. // 查询历史天数
  2857. //待定。。。。。。。。。。。。。
  2858. //。。。。。。。。。。。。。
  2859. }
  2860. }
  2861. }
  2862. return "";
  2863. }
  2864. }