ProvisionalPlanServiceImpl.java 41 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830
  1. package com.ozs.plan.service.impl;
  2. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  3. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  4. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  5. import com.github.pagehelper.PageInfo;
  6. import com.ozs.common.core.domain.AjaxResult;
  7. import com.ozs.common.core.domain.entity.SysDept;
  8. import com.ozs.common.core.domain.entity.SysUser;
  9. import com.ozs.common.core.domain.model.LoginUser;
  10. import com.ozs.common.enums.DataIsDelete;
  11. import com.ozs.common.enums.PmProjectStatus;
  12. import com.ozs.common.enums.ProjectStatus;
  13. import com.ozs.common.enums.SysFileRefEnum;
  14. import com.ozs.common.exception.ServiceException;
  15. import com.ozs.common.utils.DateUtils;
  16. import com.ozs.common.utils.PageUtils;
  17. import com.ozs.common.utils.SecurityUtils;
  18. import com.ozs.common.utils.StringUtils;
  19. import com.ozs.common.utils.bean.BeanUtils;
  20. import com.ozs.plan.doman.PlanQuarter;
  21. import com.ozs.plan.doman.PlanYears;
  22. import com.ozs.plan.doman.ProvisionalPlan;
  23. import com.ozs.plan.doman.vo.requestVo.PlanQuarterStandardVo;
  24. import com.ozs.plan.doman.vo.requestVo.PlanYearsStandardVo;
  25. import com.ozs.plan.doman.vo.requestVo.ProvisionalPlanVo;
  26. import com.ozs.plan.doman.vo.responseVo.ProvisionalPlanResVo;
  27. import com.ozs.plan.mapper.PlanYearsMapper;
  28. import com.ozs.plan.mapper.ProvisionalPlanMapper;
  29. import com.ozs.plan.service.PlanQuarterService;
  30. import com.ozs.plan.service.ProvisionalPlanService;
  31. import com.ozs.pm.doman.PmAuditDeptRef;
  32. import com.ozs.pm.doman.PmDemand;
  33. import com.ozs.pm.mapper.PmAuditDeptRefMapper;
  34. import com.ozs.pm.mapper.PmDemandMapper;
  35. import com.ozs.pm.service.IPmDemandService;
  36. import com.ozs.pm.service.PmAuditDeptRefService;
  37. import com.ozs.system.domain.SysDeptOrgan;
  38. import com.ozs.system.domain.SysFileInfo;
  39. import com.ozs.system.domain.SysFileRef;
  40. import com.ozs.system.domain.vo.responseVo.SysDeptResponseVo;
  41. import com.ozs.system.mapper.SysDeptMapper;
  42. import com.ozs.system.mapper.SysDeptOrganMapper;
  43. import com.ozs.system.mapper.SysFileRefMapper;
  44. import com.ozs.system.service.ISysDeptService;
  45. import com.ozs.system.service.ISysDictTypeService;
  46. import com.ozs.system.service.ISysUserService;
  47. import com.ozs.system.service.SysDeptOrganService;
  48. import com.ozs.system.service.SysFileService;
  49. import org.springframework.beans.factory.annotation.Autowired;
  50. import org.springframework.stereotype.Service;
  51. import org.springframework.transaction.annotation.Transactional;
  52. import org.springframework.util.ObjectUtils;
  53. import javax.servlet.http.HttpServletRequest;
  54. import java.math.BigDecimal;
  55. import java.text.ParseException;
  56. import java.text.SimpleDateFormat;
  57. import java.util.*;
  58. import java.util.stream.Collectors;
  59. @Service
  60. public class ProvisionalPlanServiceImpl extends ServiceImpl<ProvisionalPlanMapper, ProvisionalPlan> implements ProvisionalPlanService {
  61. @Autowired
  62. private SysDeptMapper deptMapper;
  63. @Autowired
  64. private SysFileService fileService;
  65. @Autowired
  66. private ISysUserService userService;
  67. @Autowired
  68. private ISysDeptService deptService;
  69. @Autowired
  70. private PmDemandMapper pmDemandMapper;
  71. @Autowired
  72. private IPmDemandService demandService;
  73. @Autowired
  74. private PlanYearsMapper planYearsMapper;
  75. @Autowired
  76. private PlanQuarterService quarterService;
  77. @Autowired
  78. private SysFileRefMapper sysFileRefMapper;
  79. @Autowired
  80. private ISysDictTypeService dictTypeService;
  81. @Autowired
  82. private SysDeptOrganMapper sysDeptOrganMapper;
  83. @Autowired
  84. private PmAuditDeptRefMapper pmAuditDeptRefMapper;
  85. @Autowired
  86. private PmAuditDeptRefService pmAuditDeptRefService;
  87. @Autowired
  88. private ProvisionalPlanMapper provisionalPlanMapper;
  89. @Override
  90. public int deleteProvisionalPlanById(Long planPracticalId) {
  91. return provisionalPlanMapper.deleteProvisionalPlanById(planPracticalId);
  92. }
  93. @Override
  94. @Transactional
  95. public int updateProvisionalPlanById(ProvisionalPlanVo provisionalPlan) {
  96. //默认未超额
  97. if (ObjectUtils.isEmpty(provisionalPlan.getIsExcess())) {
  98. provisionalPlan.setIsExcess("0");
  99. }
  100. List<SysFileRef> sysFileRefs = provisionalPlan.getSysFileRefs();
  101. if (!ObjectUtils.isEmpty(sysFileRefs)) {
  102. // 删关联
  103. LambdaQueryWrapper<SysFileRef> lw = new LambdaQueryWrapper<>();
  104. lw.eq(SysFileRef::getRedId, provisionalPlan.getPlanPracticalId());
  105. lw.eq(SysFileRef::getType, SysFileRefEnum.PLAN_TEMPORARY.getType());
  106. sysFileRefMapper.delete(lw);
  107. for (SysFileRef ref : sysFileRefs) {
  108. ref.setRedId(provisionalPlan.getPlanPracticalId());
  109. ref.setType(SysFileRefEnum.PLAN_TEMPORARY.getType());
  110. ref.setCreated(provisionalPlan.getCreated());
  111. ref.setCreateTime(new Date());
  112. ref.setUpdated(provisionalPlan.getCreated());
  113. ref.setUpdateTime(new Date());
  114. sysFileRefMapper.insert(ref);
  115. }
  116. }
  117. return provisionalPlanMapper.updateProvisionalPlanById(provisionalPlan);
  118. }
  119. @Override
  120. public String importProvisionalPlan(List<ProvisionalPlan> provisionalPlans, boolean updateSupport, LoginUser loginUser) {
  121. // 字典项
  122. HashMap<String, HashMap<String, String>> planEnums = dictTypeService.getAboutEnums();
  123. HashMap<String, String> projectTypesMap = planEnums.get("projectTypesAds");
  124. HashMap<String, String> projectAttributes = planEnums.get("projectAttributes");
  125. //预算科目
  126. HashMap<String, String> budgetAccountMap = planEnums.get("budgetAccount");
  127. int successNum = 0;
  128. int failureNum = 0;
  129. StringBuilder successMsg = new StringBuilder();
  130. StringBuilder failureMsg = new StringBuilder();
  131. for (ProvisionalPlan ofProvisionalPlan : provisionalPlans) {
  132. try {
  133. //将录入信息中的值更改为要保存的数据
  134. //采购单位
  135. SysDept info = deptMapper.checkDeptNameOnlyOne(ofProvisionalPlan.getPurchaseDeptName());
  136. if (StringUtils.isNotNull(info)) {
  137. ofProvisionalPlan.setPurchaseDeptId(String.valueOf(info.getDeptId()));
  138. }
  139. ofProvisionalPlan.setProjectType(projectTypesMap.get(ofProvisionalPlan.getProjectType()));
  140. ofProvisionalPlan.setProjectStatus(ProjectStatus.PLANWAITCOMMIT.getCode());
  141. //机关业务指导处是多选字段
  142. StringBuilder zBuilder = new StringBuilder();
  143. if (ofProvisionalPlan.getOrganDivision().contains(",")) {
  144. String[] split = ofProvisionalPlan.getOrganDivision().split(",");
  145. for (String s : split) {
  146. SysDeptOrgan infoTow = sysDeptOrganMapper.checkDeptOrganNameOnlyOne(s);
  147. //不是最后一位就加‘,’,是就直接结尾
  148. if (!ofProvisionalPlan.getOrganDivision().endsWith(s)) {
  149. if (!ObjectUtils.isEmpty(infoTow)) {
  150. zBuilder.append(infoTow.getId() + ",");
  151. } else {
  152. ++failureNum;
  153. failureMsg.append(failureNum + "、机关业务指导处(科)“" + ofProvisionalPlan.getOrganDivision() + "”不存在");
  154. }
  155. } else {
  156. if (!ObjectUtils.isEmpty(infoTow)) {
  157. zBuilder.append(infoTow.getId());
  158. } else {
  159. ++failureNum;
  160. failureMsg.append(failureNum + "、机关业务指导处(科)“" + ofProvisionalPlan.getOrganDivision() + "”不存在");
  161. }
  162. }
  163. }
  164. String zs = zBuilder.toString();
  165. if (zs.endsWith(",")) {
  166. zBuilder = null;
  167. zBuilder.append(zs.substring(0, zs.length() - 1));
  168. }
  169. } else {
  170. //没有多选
  171. SysDeptOrgan infoTow = sysDeptOrganMapper.checkDeptOrganNameOnlyOne(ofProvisionalPlan.getOrganDivision());
  172. if (!ObjectUtils.isEmpty(infoTow)) {
  173. zBuilder.append(infoTow.getId());
  174. } else {
  175. ++failureNum;
  176. failureMsg.append(failureNum + "、机关业务指导处(科)“" + ofProvisionalPlan.getOrganDivision() + "”不存在");
  177. }
  178. }
  179. ofProvisionalPlan.setOrganDivision(zBuilder.toString());
  180. ofProvisionalPlan.setBudgetAccount(budgetAccountMap.get(ofProvisionalPlan.getBudgetAccount()));
  181. //项目属性是多选字段
  182. StringBuilder builder = new StringBuilder();
  183. if (ofProvisionalPlan.getProjectAttr().contains(",")) {
  184. String[] split = ofProvisionalPlan.getProjectAttr().split(",");
  185. for (String s : split) {
  186. if (!ofProvisionalPlan.getProjectAttr().endsWith(s)) {
  187. builder.append(projectAttributes.get(s) + ",");
  188. } else {
  189. builder.append(projectAttributes.get(s));
  190. }
  191. }
  192. } else {
  193. builder.append(projectAttributes.get(ofProvisionalPlan.getProjectAttr()));
  194. }
  195. ofProvisionalPlan.setProjectAttr(builder.toString());
  196. //ofProvisionalPlan.setIsExcess(deptService.isExcessOrNo(ofProvisionalPlan.getProjectType(), ofProvisionalPlan.getEvaluation(), info.getDeptId()));
  197. ofProvisionalPlan.setCreated(String.valueOf(loginUser.getUserId()));
  198. ofProvisionalPlan.setCreateTime(new Date());
  199. ofProvisionalPlan.setPlanType("1");
  200. if (!ObjectUtils.isEmpty(ofProvisionalPlan.getPurchaseDeptId()) && !ObjectUtils.isEmpty(ofProvisionalPlan.getOrganDivision())) {
  201. provisionalPlanMapper.insert(ofProvisionalPlan);
  202. successNum++;
  203. successMsg.append(successNum + "、项目 " + ofProvisionalPlan.getProjectName() + " 导入成功!");
  204. }
  205. } catch (Exception exc) {
  206. String msg = successNum + "、项目 " + ofProvisionalPlan.getProjectName() + " 导入失败;";
  207. failureMsg.append(msg);
  208. log.error(msg, exc);
  209. }
  210. }
  211. if (failureNum > 0) {
  212. failureMsg.insert(0, "导入失败!共 " + failureNum + " 条数据格式不正确:");
  213. throw new ServiceException(failureMsg.toString());
  214. } else {
  215. successMsg.insert(0, "导入成功!共 " + successNum + " 条。");
  216. }
  217. return successMsg.toString();
  218. }
  219. @Override
  220. public List<ProvisionalPlanResVo> selectProvisionalPlanExport(ProvisionalPlanVo vo, LoginUser loginUser) {
  221. List<ProvisionalPlan> list = new ArrayList<>();
  222. List<ProvisionalPlanResVo> provisionalPlanList = new ArrayList<>();
  223. try {
  224. int num = 1;
  225. int size = 200;
  226. while (size == 200) {
  227. LambdaQueryWrapper<ProvisionalPlan> lw = new LambdaQueryWrapper<ProvisionalPlan>();
  228. lw.eq(ProvisionalPlan::getPlanType, "1");
  229. lw.eq(ProvisionalPlan::getDelFlay, DataIsDelete.DataNOTDelete.getCode());
  230. if (!loginUser.getUserId().equals(Long.valueOf("1"))) {
  231. lw.eq(ProvisionalPlan::getCreated, loginUser.getUserId());
  232. //lw.eq(ProvisionalPlan::getPurchaseDeptId, loginUser.getDeptId());
  233. }
  234. lw.eq(ProvisionalPlan::getPlanType, "1");
  235. if (!ObjectUtils.isEmpty(vo.getProjectName())) {
  236. lw.like(ProvisionalPlan::getProjectName, vo.getProjectName());
  237. }
  238. if (!ObjectUtils.isEmpty(vo.getPurchaseServices())) {
  239. lw.eq(ProvisionalPlan::getPurchaseServices, vo.getPurchaseServices());
  240. }
  241. if (!ObjectUtils.isEmpty(vo.getIsExcess())) {
  242. lw.eq(ProvisionalPlan::getIsExcess, vo.getIsExcess());
  243. }
  244. if (!ObjectUtils.isEmpty(vo.getProjectStatus())) {
  245. lw.eq(ProvisionalPlan::getProjectStatus, vo.getProjectStatus());
  246. }
  247. if (!ObjectUtils.isEmpty(vo.getParams())) {
  248. if (!ObjectUtils.isEmpty(vo.getParams().get("beginTime"))) {
  249. lw.ge(ProvisionalPlan::getPlanDemandSubTime, vo.getParams().get("beginTime"));
  250. }
  251. if (!ObjectUtils.isEmpty(vo.getParams().get("endTime"))) {
  252. SimpleDateFormat dateFormatT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
  253. Date parse = dateFormatT.parse(vo.getParams().get("endTime").toString() + " 23:59:59:999");
  254. lw.le(ProvisionalPlan::getPlanDemandSubTime, parse);
  255. }
  256. }
  257. Page<ProvisionalPlan> page = provisionalPlanMapper.selectPage(new Page<ProvisionalPlan>(num, size, false), lw);
  258. list.addAll(page.getRecords());
  259. size = page.getRecords().size();
  260. num++;
  261. }
  262. provisionalPlanList = changeTo(list);
  263. } catch (Exception e) {
  264. e.printStackTrace();
  265. }
  266. return provisionalPlanList;
  267. }
  268. @Override
  269. @Transactional
  270. public int commitProvisionalPlan(ProvisionalPlanVo provisionalPlanVo) {
  271. ProvisionalPlan byId = provisionalPlanMapper.seletById(provisionalPlanVo.getPlanPracticalId());
  272. //申请修改之后再次提交,先清除上一次提交后的审核记录
  273. PmAuditDeptRef ref = new PmAuditDeptRef();
  274. ref.setRefId(byId.getPlanPracticalId());
  275. ref.setRefType("1");
  276. ref.setProjectType(byId.getProjectType());
  277. ref.setEvaluation(byId.getEvaluation());
  278. PlanQuarterServiceImpl.refIsExist(ref, pmAuditDeptRefMapper);
  279. PlanQuarterServiceImpl.insertAuditDeptRef(userService, pmAuditDeptRefService, ref);
  280. return provisionalPlanMapper.commitProvisionalPlan(provisionalPlanVo.getPlanPracticalId());
  281. }
  282. @Override
  283. public AjaxResult seletById(Long planPracticalId) {
  284. ProvisionalPlan provisionalPlan = provisionalPlanMapper.seletById(planPracticalId);
  285. if (StringUtils.isNull(provisionalPlan)) {
  286. return AjaxResult.error("数据查询失败");
  287. }
  288. // 转换字段中文
  289. ProvisionalPlan provisionalPlanC = changeToProvisionalPlan(provisionalPlan);
  290. LambdaQueryWrapper<SysFileRef> lw = new LambdaQueryWrapper<>();
  291. lw.eq(SysFileRef::getRedId, provisionalPlanC.getPlanPracticalId());
  292. lw.in(SysFileRef::getType, Arrays.asList(SysFileRefEnum.PLAN_TEMPORARY.getType(), SysFileRefEnum.PLAN_TEMPORARY_EXAMINE.getType()));
  293. List<SysFileRef> fileRefs = sysFileRefMapper.selectList(lw);
  294. List<SysFileInfo> fileInfos = new ArrayList<>();
  295. ProvisionalPlanVo provisionalPlanVo = new ProvisionalPlanVo();
  296. BeanUtils.copyProperties(provisionalPlanC, provisionalPlanVo);
  297. if (!ObjectUtils.isEmpty(fileRefs)) {
  298. for (SysFileRef ref : fileRefs) {
  299. SysFileInfo fileInfo = fileService.getById(ref.getFileId());
  300. fileInfos.add(fileInfo);
  301. }
  302. provisionalPlanVo.setFileInfos(fileInfos);
  303. }
  304. return AjaxResult.success(provisionalPlanVo);
  305. }
  306. @Override
  307. public AjaxResult selectProvisionalPlan(ProvisionalPlanVo vo, HttpServletRequest request, LoginUser loginUser) {
  308. List<ProvisionalPlanResVo> provisionalPlanList = new ArrayList<>();
  309. try {
  310. LambdaQueryWrapper<ProvisionalPlan> lw = new LambdaQueryWrapper<>();
  311. lw.eq(ProvisionalPlan::getDelFlay, DataIsDelete.DataNOTDelete.getCode());
  312. lw.eq(ProvisionalPlan::getPlanType, "1");
  313. if (!loginUser.getUserId().equals(Long.valueOf("1"))) {
  314. lw.eq(ProvisionalPlan::getCreated, loginUser.getUserId());
  315. //lw.eq(ProvisionalPlan::getPurchaseDeptId, loginUser.getDeptId());
  316. }
  317. if (!ObjectUtils.isEmpty(vo.getProjectName())) {
  318. lw.like(ProvisionalPlan::getProjectName, vo.getProjectName());
  319. }
  320. if (!ObjectUtils.isEmpty(vo.getPurchaseServices())) {
  321. lw.eq(ProvisionalPlan::getPurchaseServices, vo.getPurchaseServices());
  322. }
  323. if (!ObjectUtils.isEmpty(vo.getIsExcess())) {
  324. lw.eq(ProvisionalPlan::getIsExcess, vo.getIsExcess());
  325. }
  326. if (!ObjectUtils.isEmpty(vo.getProjectStatus())) {
  327. lw.eq(ProvisionalPlan::getProjectStatus, vo.getProjectStatus());
  328. }
  329. if (!ObjectUtils.isEmpty(vo.getParams())) {
  330. if (!ObjectUtils.isEmpty(vo.getParams().get("beginTime"))) {
  331. lw.ge(ProvisionalPlan::getPlanDemandSubTime, vo.getParams().get("beginTime"));
  332. }
  333. if (!ObjectUtils.isEmpty(vo.getParams().get("endTime"))) {
  334. SimpleDateFormat dateFormatT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
  335. Date parse = dateFormatT.parse(vo.getParams().get("endTime").toString() + " 23:59:59:999");
  336. lw.le(ProvisionalPlan::getPlanDemandSubTime, parse);
  337. }
  338. }
  339. lw.orderBy(true, false, ProvisionalPlan::getCreateTime);
  340. List<ProvisionalPlan> list = provisionalPlanMapper.selectList(lw);
  341. provisionalPlanList = changeTo(list);
  342. } catch (Exception e) {
  343. e.printStackTrace();
  344. }
  345. Page pages = PageUtils.getPages(vo.getPageNum().intValue(), vo.getPageSize().intValue(), provisionalPlanList);
  346. PageInfo<ProvisionalPlan> provisionalPlanPageInfo = new PageInfo<>();
  347. if (!ObjectUtils.isEmpty(pages) && pages.getRecords().size() > 0) {
  348. provisionalPlanPageInfo.setList(pages.getRecords());
  349. provisionalPlanPageInfo.setSize(Math.toIntExact(pages.getSize()));
  350. provisionalPlanPageInfo.setPageNum(Math.toIntExact(pages.getCurrent()));
  351. provisionalPlanPageInfo.setTotal(pages.getTotal());
  352. provisionalPlanPageInfo.setPages(Integer.parseInt(pages.getPages() + ""));
  353. }
  354. return AjaxResult.success(provisionalPlanPageInfo);
  355. }
  356. @Override
  357. public AjaxResult selectProvisionalPlanAudit(ProvisionalPlanVo vo, HttpServletRequest request, LoginUser loginUser) {
  358. List<ProvisionalPlanResVo> provisionalPlanList = new ArrayList<>();
  359. try {
  360. LambdaQueryWrapper<ProvisionalPlan> lw = new LambdaQueryWrapper<>();
  361. lw.eq(ProvisionalPlan::getDelFlay, DataIsDelete.DataNOTDelete.getCode());
  362. lw.eq(ProvisionalPlan::getPlanType, "1");
  363. if (!loginUser.getUserId().equals(Long.valueOf("1"))) {
  364. lw.eq(ProvisionalPlan::getPurchaseDeptId, loginUser.getDeptId());
  365. }
  366. if (!ObjectUtils.isEmpty(vo.getProjectName())) {
  367. lw.like(ProvisionalPlan::getProjectName, vo.getProjectName());
  368. }
  369. if (!ObjectUtils.isEmpty(vo.getPurchaseServices())) {
  370. lw.eq(ProvisionalPlan::getPurchaseServices, vo.getPurchaseServices());
  371. }
  372. if (!ObjectUtils.isEmpty(vo.getIsExcess())) {
  373. lw.eq(ProvisionalPlan::getIsExcess, vo.getIsExcess());
  374. }
  375. if (!ObjectUtils.isEmpty(vo.getProjectStatus())) {
  376. lw.eq(ProvisionalPlan::getProjectStatus, vo.getProjectStatus());
  377. } else {
  378. lw.apply(" project_status IN (1,2,3)", "");
  379. }
  380. if (!ObjectUtils.isEmpty(vo.getParams())) {
  381. if (!ObjectUtils.isEmpty(vo.getParams().get("beginTime"))) {
  382. lw.ge(ProvisionalPlan::getPlanDemandSubTime, vo.getParams().get("beginTime"));
  383. }
  384. if (!ObjectUtils.isEmpty(vo.getParams().get("endTime"))) {
  385. SimpleDateFormat dateFormatT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
  386. SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
  387. Date ofMonth = DateUtils.getLastDayOfMonth(dateFormat.parse(vo.getParams().get("endTime").toString()));
  388. Date parse = dateFormatT.parse(dateFormat.format(ofMonth) + " 23:59:59:999");
  389. lw.le(ProvisionalPlan::getPlanDemandSubTime, parse);
  390. }
  391. }
  392. lw.orderBy(true, false, ProvisionalPlan::getCreateTime);
  393. List<ProvisionalPlan> list = provisionalPlanMapper.selectList(lw);
  394. provisionalPlanList = changeTo(list);
  395. } catch (Exception e) {
  396. e.printStackTrace();
  397. }
  398. Page pages = PageUtils.getPages(vo.getPageNum().intValue(), vo.getPageSize().intValue(), provisionalPlanList);
  399. PageInfo<ProvisionalPlan> provisionalPlanPageInfo = new PageInfo<>();
  400. if (!ObjectUtils.isEmpty(pages) && pages.getRecords().size() > 0) {
  401. provisionalPlanPageInfo.setList(pages.getRecords());
  402. provisionalPlanPageInfo.setSize(Math.toIntExact(pages.getSize()));
  403. provisionalPlanPageInfo.setPageNum(Math.toIntExact(pages.getCurrent()));
  404. provisionalPlanPageInfo.setTotal(pages.getTotal());
  405. provisionalPlanPageInfo.setPages(Integer.parseInt(pages.getPages() + ""));
  406. }
  407. return AjaxResult.success(provisionalPlanPageInfo);
  408. }
  409. @Override
  410. @Transactional
  411. public AjaxResult auditPass(ProvisionalPlanVo provisionalPlanVo) {
  412. SysUser sysUser = userService.selectUserById(SecurityUtils.getUserId());
  413. Long deptId = sysUser.getDeptId();
  414. SysDept sysDept = deptMapper.selectDeptById(deptId);
  415. String[] ancestors = sysDept.getAncestors().split(",");
  416. String deptLevel = null;
  417. if (ancestors.length == 2) { //C级
  418. deptLevel = "C";
  419. } else if (ancestors.length == 3) { //B级
  420. deptLevel = "B";
  421. } else if (ancestors.length == 4) { //A级
  422. deptLevel = "A";
  423. }
  424. LambdaQueryWrapper<PmAuditDeptRef> lw = new LambdaQueryWrapper();
  425. lw.eq(PmAuditDeptRef::getRefId, provisionalPlanVo.getPlanPracticalId());
  426. lw.eq(PmAuditDeptRef::getRefType, "1");
  427. List<PmAuditDeptRef> list = pmAuditDeptRefService.list(lw);
  428. boolean flay = true;
  429. if (!ObjectUtils.isEmpty(list)) {
  430. for (PmAuditDeptRef pmAuditDeptRef : list) {
  431. // 判断 deptLevel 是否还有更高的 且是 待审核的数据
  432. if (pmAuditDeptRef.getDeptLevel().compareTo(deptLevel) > 0
  433. && pmAuditDeptRef.getStatus().equals(Integer.parseInt("0"))) {
  434. flay = false;
  435. }
  436. // 更新当前 deptLevel 级别的审核状态
  437. if (pmAuditDeptRef.getDeptLevel().compareTo(deptLevel) == 0) {
  438. pmAuditDeptRef.setStatus(1);
  439. pmAuditDeptRefService.updateById(pmAuditDeptRef);
  440. }
  441. }
  442. }
  443. realReviewTo(provisionalPlanVo, flay);
  444. return AjaxResult.success();
  445. }
  446. public AjaxResult realReviewTo(ProvisionalPlanVo provisionalPlanVo, boolean flay) {
  447. Date now = new Date();
  448. ProvisionalPlan byId = provisionalPlanMapper.seletById(provisionalPlanVo.getPlanPracticalId());
  449. if (ObjectUtils.isEmpty(byId.getPlanYearId())) {
  450. PlanYears ofYears = new PlanYears();
  451. BeanUtils.copyProperties(byId, ofYears);
  452. ofYears.setProjectStatus(ProjectStatus.PLANTOEXAMINE.getCode());
  453. planYearsMapper.insertPlanYears(ofYears);
  454. byId.setPlanYearId(ofYears.getPlanYearId());
  455. }
  456. //上传审核文件
  457. PlanQuarterStandardVo standardVo = new PlanQuarterStandardVo();
  458. BeanUtils.copyProperties(provisionalPlanVo, standardVo);
  459. quarterService.upExamineFile(standardVo);
  460. if (flay) {
  461. PmDemand demand = new PmDemand();
  462. BeanUtils.copyProperties(byId, demand);
  463. demand.setPlanId(Long.valueOf(byId.getPlanPracticalId()));
  464. demand.setEvaluation(byId.getEvaluation().doubleValue());
  465. demand.setIsExcess(Integer.parseInt(byId.getIsExcess()));
  466. //同步到项目管理状态为需求待填制
  467. demand.setProjectStatus(PmProjectStatus.DEMAND_WAIT_FILL.getCode());
  468. demand.setPurchaseDeptId(Long.parseLong(byId.getPurchaseDeptId()));
  469. demand.setCreateTime(now);
  470. demand.setCreateBy(byId.getCreated());
  471. demand.setUpdateTime(now);
  472. demand.setUpdateBy(demand.getCreateBy());
  473. //demand.setIsExcess(Integer.parseInt(byId.getIsExcess()));
  474. pmDemandMapper.insert(demand);
  475. demandService.updateDemandWarnStatus(demand.getDemandId());
  476. //计划附件也进行同步---查询临时计划附件后复制一份改为项目需求附件
  477. LambdaQueryWrapper<SysFileRef> sysFileRefLp = new LambdaQueryWrapper<>();
  478. sysFileRefLp.eq(SysFileRef::getRedId, byId.getPlanPracticalId());
  479. sysFileRefLp.in(SysFileRef::getType, Arrays.asList(SysFileRefEnum.PLAN_TEMPORARY.getType(), SysFileRefEnum.PLAN_TEMPORARY_EXAMINE.getType()));
  480. List<SysFileRef> sysFileRefs = sysFileRefMapper.selectList(sysFileRefLp);
  481. if (!ObjectUtils.isEmpty(sysFileRefs)) {
  482. for (SysFileRef ref : sysFileRefs) {
  483. ref.setRedId(demand.getDemandId());
  484. ref.setType(SysFileRefEnum.PM_DEMAND.getType());
  485. ref.setId(null);
  486. sysFileRefMapper.insert(ref);
  487. }
  488. for (SysFileRef ref : sysFileRefs) {
  489. ref.setRedId(byId.getPlanYearId());
  490. ref.setType(SysFileRefEnum.PLAN_YEAR.getType());
  491. ref.setId(null);
  492. ref.setCreated(provisionalPlanVo.getUpdated());
  493. ref.setCreateTime(now);
  494. ref.setUpdated(provisionalPlanVo.getUpdated());
  495. ref.setUpdateTime(now);
  496. sysFileRefMapper.insert(ref);
  497. }
  498. }
  499. provisionalPlanMapper.updateById(byId);
  500. //赋予项目状态已审核
  501. provisionalPlanVo.setProjectStatus(ProjectStatus.PLANTOEXAMINE.getCode());
  502. return review(provisionalPlanVo);
  503. }
  504. return AjaxResult.success("成功");
  505. }
  506. @Override
  507. public AjaxResult auditNoPass(ProvisionalPlanVo provisionalPlanVo) {
  508. PlanQuarterStandardVo standardVo = new PlanQuarterStandardVo();
  509. BeanUtils.copyProperties(provisionalPlanVo, standardVo);
  510. //上传审核文件并赋予计划审核退回
  511. quarterService.upExamineFile(standardVo);
  512. provisionalPlanVo.setProjectStatus(ProjectStatus.PLANTOBACK.getCode());
  513. return review(provisionalPlanVo);
  514. }
  515. @Override
  516. public List<ProvisionalPlan> queryPage(ProvisionalPlanVo vo) throws ParseException {
  517. LoginUser loginUser = SecurityUtils.getLoginUser();
  518. if (!loginUser.getUserId().equals(Long.valueOf("1"))) {
  519. vo.setPurchaseDeptId(loginUser.getDeptId());
  520. }
  521. List<ProvisionalPlan> provisionalPlanList = provisionalPlanMapper.query(vo);
  522. List<ProvisionalPlan> provisionalPlanListTwo = new LinkedList<>();
  523. if (!ObjectUtils.isEmpty(provisionalPlanList)) {
  524. for (ProvisionalPlan plan : provisionalPlanList) {
  525. LambdaQueryWrapper<PmAuditDeptRef> lw = new LambdaQueryWrapper();
  526. lw.eq(PmAuditDeptRef::getRefId, plan.getPlanPracticalId());
  527. lw.eq(PmAuditDeptRef::getRefType, "1");
  528. List<PmAuditDeptRef> list = pmAuditDeptRefService.list(lw);
  529. //是否显示审核按钮
  530. boolean fl = true;
  531. //是否为本单位已审核过的数据
  532. boolean fg = false;
  533. if (!ObjectUtils.isEmpty(list) && list.size() > 0) {
  534. List<PmAuditDeptRef> collect = list.stream()
  535. .filter(f -> f.getDeptId().equals(Long.valueOf(vo.getPurchaseDeptId())))
  536. .collect(Collectors.toList());
  537. if (ObjectUtils.isEmpty(collect)) {
  538. fl = false;
  539. } else {
  540. String deptLevel = collect.get(0).getDeptLevel();
  541. fl = collect.get(0).getStatus().equals(Integer.parseInt("1")) ? false : true;
  542. //该计划的审核信息
  543. for (PmAuditDeptRef pmAuditDeptRef : list) {
  544. //自己下级单位未进行审核时。不显示审核按钮
  545. if (pmAuditDeptRef.getDeptLevel().compareTo(deptLevel) == -1
  546. && pmAuditDeptRef.getStatus().equals(Integer.parseInt("0"))) {
  547. fl = false;
  548. }
  549. //本单位已审核
  550. if (pmAuditDeptRef.getDeptLevel().compareTo(deptLevel) == 0
  551. && pmAuditDeptRef.getStatus().equals(Integer.parseInt("1"))) {
  552. fg = true;
  553. }
  554. }
  555. }
  556. /*
  557. * String s1="A";
  558. String s2="B";
  559. System.out.println(s1.compareTo(s2));
  560. * over: -1
  561. * */
  562. }
  563. if (vo.getCreated().equals("1")) {
  564. fl = false;
  565. }
  566. vo.setFlag(fl);
  567. //待审核
  568. if (fl == true || plan.getPurchaseDeptId().equals(vo.getPurchaseDeptId())) {
  569. provisionalPlanListTwo.add(plan);
  570. //已审核
  571. } else if (fg == true) {
  572. provisionalPlanListTwo.add(plan);
  573. }
  574. }
  575. }
  576. return provisionalPlanList;
  577. }
  578. @Override
  579. public Integer countYearProjectName(String projectName) {
  580. return provisionalPlanMapper.countYearProjectName(projectName);
  581. }
  582. @Override
  583. public Integer countProjectName(String projectName) {
  584. return provisionalPlanMapper.countProjectName(projectName);
  585. }
  586. @Override
  587. @Transactional
  588. public AjaxResult adPurchaseServices(ProvisionalPlanVo provisionalPlan) {
  589. ProvisionalPlan years = new ProvisionalPlan();
  590. BeanUtils.copyProperties(provisionalPlan, years);
  591. if (provisionalPlanMapper.updateById(years) == 1) {
  592. return AjaxResult.success("成功");
  593. }
  594. return AjaxResult.success("成功");
  595. }
  596. @Override
  597. public Integer countProjectNameOth(ProvisionalPlanVo provisionalPlan) {
  598. return provisionalPlanMapper.countProjectNameOth(provisionalPlan);
  599. }
  600. private AjaxResult review(ProvisionalPlanVo vo) {
  601. int review = provisionalPlanMapper.review(vo);
  602. if (review != 1) {
  603. return AjaxResult.error("项目状态数据异常");
  604. }
  605. return AjaxResult.success();
  606. }
  607. // 字典项负值
  608. public ProvisionalPlan changeToProvisionalPlan(ProvisionalPlan provisionalPlan) {
  609. HashMap<String, HashMap<String, String>> planEnums = dictTypeService.getAboutEnums();
  610. HashMap<String, String> projectTypesMap = planEnums.get("projectTypes");
  611. HashMap<String, String> projectAttributes = planEnums.get("projectAttributes");
  612. if (provisionalPlan.getPurchaseDeptId() != null) {
  613. SysDeptResponseVo sysDeptResponseVo = (SysDeptResponseVo) deptService.selectDeptById(Long.valueOf(provisionalPlan.getPurchaseDeptId())).get("sysDept");
  614. provisionalPlan.setPurchaseDeptName(sysDeptResponseVo.getDeptName());
  615. }
  616. for (Map.Entry<String, String> entry : projectTypesMap.entrySet()) {
  617. if (provisionalPlan.getProjectType() != null && provisionalPlan.getProjectType().equals(entry.getValue())) {
  618. provisionalPlan.setProjectTypeStr(entry.getKey());
  619. break;
  620. }
  621. }
  622. //项目属性是拼接的
  623. if (provisionalPlan.getProjectAttr().length() > 1) {
  624. StringBuilder builder = new StringBuilder();
  625. String[] split = provisionalPlan.getProjectAttr().split(",");
  626. for (String s : split) {
  627. for (Map.Entry<String, String> entry : projectAttributes.entrySet()) {
  628. if (s.equals(entry.getValue())) {
  629. builder.append(entry.getKey() + ",");
  630. break;
  631. }
  632. }
  633. }
  634. provisionalPlan.setProjectAttrName(builder.toString());
  635. } else {
  636. for (Map.Entry<String, String> entry : projectAttributes.entrySet()) {
  637. if (provisionalPlan.getProjectAttr() != null && provisionalPlan.getProjectAttr().equals(entry.getValue())) {
  638. provisionalPlan.setProjectAttrName(entry.getKey());
  639. break;
  640. }
  641. }
  642. }
  643. /*for (Map.Entry<String, String> entry : purchaseServices.entrySet()) {
  644. if (provisionalPlan.getPurchaseServices() != null && provisionalPlan.getPurchaseServices().equals(entry.getValue())) {
  645. provisionalPlan.setPurchaseServicesStr(entry.getKey());
  646. break;
  647. }
  648. }*/
  649. return provisionalPlan;
  650. }
  651. //字段赋值对应的名称
  652. public List<ProvisionalPlanResVo> changeTo(List<ProvisionalPlan> provisionalPlans) {
  653. //获取字典数据
  654. HashMap<String, HashMap<String, String>> planEnums = dictTypeService.getAboutEnums();
  655. //项目属性
  656. HashMap<String, String> projectAttributes = planEnums.get("projectAttributes");
  657. //项目审核状态
  658. HashMap<String, String> projectStatusMap = planEnums.get("projectStatus");
  659. //项目类型
  660. HashMap<String, String> projectTypesMap = planEnums.get("projectTypes");
  661. //预算科目
  662. HashMap<String, String> budgetAccountMap = planEnums.get("budgetAccount");
  663. //采购服务站
  664. HashMap<String, String> purchaseServicesMap = planEnums.get("purchaseServices");
  665. List<ProvisionalPlanResVo> list = new ArrayList<ProvisionalPlanResVo>();
  666. for (ProvisionalPlan provisionalPlan : provisionalPlans) {
  667. ProvisionalPlanResVo provisionalPlanResVo = new ProvisionalPlanResVo();
  668. if (provisionalPlan.getPurchaseDeptId() != null) {
  669. SysDeptResponseVo sysDeptResponseVo = (SysDeptResponseVo) deptService.selectDeptById(Long.valueOf(provisionalPlan.getPurchaseDeptId())).get("sysDept");
  670. provisionalPlan.setPurchaseDeptName(sysDeptResponseVo.getDeptName());
  671. }
  672. //预算科目
  673. for (Map.Entry<String, String> entry : budgetAccountMap.entrySet()) {
  674. if (!ObjectUtils.isEmpty(provisionalPlan.getBudgetAccount()) && provisionalPlan.getBudgetAccount().equals(entry.getValue())) {
  675. provisionalPlan.setBudgetAccountStr(entry.getKey());
  676. break;
  677. }
  678. }
  679. //采购服务站
  680. for (Map.Entry<String, String> entry : purchaseServicesMap.entrySet()) {
  681. if (!ObjectUtils.isEmpty(provisionalPlan.getPurchaseServices()) && provisionalPlan.getPurchaseServices().equals(entry.getValue())) {
  682. provisionalPlan.setPurchaseServicesStr(entry.getKey());
  683. break;
  684. }
  685. }
  686. //项目审核状态
  687. for (Map.Entry<String, String> entry : projectStatusMap.entrySet()) {
  688. if (!ObjectUtils.isEmpty(provisionalPlan.getProjectStatus()) && provisionalPlan.getProjectStatus().equals(entry.getValue())) {
  689. provisionalPlan.setProjectStatusStr(entry.getKey());
  690. break;
  691. }
  692. }
  693. //项目类型
  694. for (Map.Entry<String, String> entry : projectTypesMap.entrySet()) {
  695. if (provisionalPlan.getProjectType() != null && provisionalPlan.getProjectType().equals(entry.getValue())) {
  696. provisionalPlan.setProjectTypeStr(entry.getKey());
  697. break;
  698. }
  699. }
  700. //项目属性是拼接的
  701. if (provisionalPlan.getProjectAttr().length() > 1) {
  702. StringBuilder builder = new StringBuilder();
  703. String[] split = provisionalPlan.getProjectAttr().split(",");
  704. for (String s : split) {
  705. for (Map.Entry<String, String> entry : projectAttributes.entrySet()) {
  706. if (s.equals(entry.getValue())) {
  707. if (!provisionalPlan.getProjectAttr().endsWith(s)) {
  708. builder.append(entry.getKey() + ",");
  709. } else {
  710. builder.append(entry.getKey());
  711. }
  712. break;
  713. }
  714. }
  715. }
  716. provisionalPlan.setProjectAttrName(builder.toString());
  717. } else {
  718. for (Map.Entry<String, String> entry : projectAttributes.entrySet()) {
  719. if (provisionalPlan.getProjectAttr() != null && provisionalPlan.getProjectAttr().equals(entry.getValue())) {
  720. provisionalPlan.setProjectAttrName(entry.getKey());
  721. break;
  722. }
  723. }
  724. }
  725. //机关业务指导处(科)为id拼接
  726. String organDivision = provisionalPlan.getOrganDivision();
  727. if (!ObjectUtils.isEmpty(organDivision)) {
  728. int length = organDivision.split(",").length;
  729. SysDept sysDept = new SysDept();
  730. if (length > 1) {
  731. StringBuilder builder = new StringBuilder();
  732. String[] split = organDivision.split(",");
  733. for (String s : split) {
  734. sysDept = deptService.selectById(Long.valueOf(s));
  735. if (!ObjectUtils.isEmpty(sysDept)) {
  736. if (!organDivision.endsWith(s)) {
  737. builder.append(sysDept.getDeptName() + ",");
  738. } else {
  739. builder.append(sysDept.getDeptName());
  740. }
  741. }
  742. }
  743. provisionalPlan.setOrganDivisionStr(builder.toString());
  744. } else if (length == 1) {
  745. sysDept = deptService.selectById(Long.valueOf(organDivision));
  746. if (!ObjectUtils.isEmpty(sysDept)) {
  747. provisionalPlan.setOrganDivisionStr(sysDept.getDeptName());
  748. }
  749. }
  750. }
  751. //是否可以申请撤销和申请修改
  752. //需求待填制可以申请,需求建档就不能申请
  753. PmDemand demand = demandService.selectByPlanId(provisionalPlan.getPlanPracticalId());
  754. if (!ObjectUtils.isEmpty(demand) && !demand.getProjectStatus().equals(PmProjectStatus.DEMAND_WAIT_FILL.getCode())) {
  755. provisionalPlan.setAppDeleteDo("false");
  756. provisionalPlan.setAppUpdateDo("false");
  757. } else {
  758. //能否申请撤销
  759. if (!ObjectUtils.isEmpty(provisionalPlan.getAppDelete()) && provisionalPlan.getAppDelete().equals("true")) {
  760. //申请过的不能再申请
  761. provisionalPlan.setAppDeleteDo("false");
  762. } else if (provisionalPlan.getProjectStatus().equals("0")) {
  763. provisionalPlan.setAppDeleteDo("false");
  764. } else {
  765. //提交后可以申请撤销
  766. provisionalPlan.setAppDeleteDo("true");
  767. }
  768. //能否申请修改
  769. if (!ObjectUtils.isEmpty(provisionalPlan.getAppUpdate()) && provisionalPlan.getAppUpdate().equals("true")) {
  770. //申请过的不能再申请
  771. provisionalPlan.setAppUpdateDo("false");
  772. } else if (provisionalPlan.getProjectStatus().equals("0")) {
  773. provisionalPlan.setAppUpdateDo("false");
  774. } else {
  775. //提交后可以申请撤销
  776. provisionalPlan.setAppUpdateDo("true");
  777. }
  778. }
  779. BeanUtils.copyProperties(provisionalPlan, provisionalPlanResVo);
  780. //状态在采购需求对接和流废标退回之间的项目可以进行催告---已发函不可再次发函
  781. provisionalPlanResVo.setSendLetterDo("false");
  782. if (!ObjectUtils.isEmpty(demand)) {
  783. if (quarterService.sendLetterDo(demand.getProjectStatus()) && provisionalPlan.getSendLetter().equals("0")) {
  784. provisionalPlanResVo.setSendLetterDo("true");
  785. }
  786. }
  787. list.add(provisionalPlanResVo);
  788. }
  789. return list;
  790. }
  791. }