PlanQuarterServiceImpl.java 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680
  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.ozs.common.constant.Constants;
  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.SysDictData;
  9. import com.ozs.common.core.domain.entity.SysRole;
  10. import com.ozs.common.core.domain.model.LoginUser;
  11. import com.ozs.common.enums.DataIsDelete;
  12. import com.ozs.common.enums.PmProjectStatus;
  13. import com.ozs.common.enums.ProjectStatus;
  14. import com.ozs.common.enums.ProjectTypes;
  15. import com.ozs.common.enums.QuarterEnum;
  16. import com.ozs.common.enums.SysFileRefEnum;
  17. import com.ozs.common.exception.ServiceException;
  18. import com.ozs.common.utils.PageUtils;
  19. import com.ozs.common.utils.StringUtils;
  20. import com.ozs.common.utils.bean.BeanUtils;
  21. import com.ozs.plan.doman.PlanQuarter;
  22. import com.ozs.plan.doman.PlanYears;
  23. import com.ozs.plan.doman.vo.requestVo.PlanQuarterStandardVo;
  24. import com.ozs.plan.doman.vo.responseVo.PlanQuarterResponseVo;
  25. import com.ozs.plan.mapper.PlanQuarterMapper;
  26. import com.ozs.plan.mapper.PlanYearsMapper;
  27. import com.ozs.plan.service.PlanQuarterService;
  28. import com.ozs.pm.doman.PmDemand;
  29. import com.ozs.pm.mapper.PmDemandMapper;
  30. import com.ozs.pm.service.IPmDemandService;
  31. import com.ozs.system.domain.SysFileInfo;
  32. import com.ozs.system.domain.SysFileRef;
  33. import com.ozs.system.domain.vo.responseVo.SysDeptResponseVo;
  34. import com.ozs.system.mapper.SysDeptMapper;
  35. import com.ozs.system.mapper.SysFileRefMapper;
  36. import com.ozs.system.service.ISysDeptService;
  37. import com.ozs.system.service.ISysDictTypeService;
  38. import com.ozs.system.service.SysFileService;
  39. import lombok.extern.slf4j.Slf4j;
  40. import org.springframework.beans.factory.annotation.Autowired;
  41. import org.springframework.security.core.token.TokenService;
  42. import org.springframework.stereotype.Service;
  43. import org.springframework.transaction.annotation.Transactional;
  44. import org.springframework.util.ObjectUtils;
  45. import javax.annotation.Resource;
  46. import javax.servlet.http.HttpServletRequest;
  47. import javax.validation.Validator;
  48. import java.math.BigDecimal;
  49. import java.text.ParseException;
  50. import java.text.SimpleDateFormat;
  51. import java.util.ArrayList;
  52. import java.util.Arrays;
  53. import java.util.Date;
  54. import java.util.HashMap;
  55. import java.util.LinkedHashMap;
  56. import java.util.List;
  57. import java.util.Map;
  58. import java.util.stream.Collectors;
  59. /**
  60. * @author buzhanyi
  61. */
  62. @Service
  63. @Slf4j
  64. public class PlanQuarterServiceImpl extends ServiceImpl<PlanQuarterMapper, PlanQuarter> implements PlanQuarterService {
  65. @Autowired
  66. PlanQuarterMapper planQuarterMapper;
  67. @Autowired
  68. PlanYearsMapper planYearsMapper;
  69. @Autowired
  70. protected Validator validator;
  71. @Autowired
  72. private ISysDictTypeService dictTypeService;
  73. @Autowired
  74. private ISysDeptService deptService;
  75. @Autowired
  76. SysFileRefMapper sysFileRefMapper;
  77. @Autowired
  78. private SysDeptMapper deptMapper;
  79. @Autowired
  80. private SysFileService fileService;
  81. @Autowired
  82. private PmDemandMapper pmDemandMapper;
  83. @Autowired
  84. private IPmDemandService demandService;
  85. @Override
  86. public List<PlanQuarterResponseVo> selectPlanQuarterListEXP(PlanQuarterStandardVo vo, LoginUser loginUser) {
  87. List<PlanQuarter> list = new ArrayList<>();
  88. List<PlanQuarterResponseVo> planQuarterList = new ArrayList<>();
  89. try {
  90. int num = 1;
  91. int size = 200;
  92. while (size == 200) {
  93. LambdaQueryWrapper<PlanQuarter> lw = new LambdaQueryWrapper<>();
  94. if (!ObjectUtils.isEmpty(vo.getProjectName())) {
  95. lw.like(PlanQuarter::getProjectName, vo.getProjectName());
  96. }
  97. if (!ObjectUtils.isEmpty(vo.getPurchaseServices())) {
  98. lw.eq(PlanQuarter::getPurchaseServices, vo.getPurchaseServices());
  99. }
  100. if (!ObjectUtils.isEmpty(vo.getIsExcess())) {
  101. lw.eq(PlanQuarter::getIsExcess, vo.getIsExcess());
  102. }
  103. if (!ObjectUtils.isEmpty(vo.getProjectStatus())) {
  104. lw.eq(PlanQuarter::getProjectStatus, vo.getProjectStatus());
  105. }
  106. if (!ObjectUtils.isEmpty(vo.getBeginTime())) {
  107. lw.ge(PlanQuarter::getPlanDemandSubTime, vo.getBeginTime());
  108. }
  109. if (!ObjectUtils.isEmpty(vo.getEndTime())) {
  110. lw.le(PlanQuarter::getPlanDemandSubTime, vo.getEndTime());
  111. }
  112. lw.eq(PlanQuarter::getDelFlay, DataIsDelete.DataNOTDelete.getCode());
  113. // 添加数据权限
  114. List<String> roleKeys = loginUser.getUser().getRoles().stream().map(SysRole::getRoleKey).collect(Collectors.toList());
  115. if (roleKeys.contains(Constants.DEMAND_UNIT)) {
  116. // 需求单位
  117. /*(purchase_dept_id = 当前用户deptID) */
  118. lw.eq(PlanQuarter::getPurchaseDeptId, loginUser.getDeptId());
  119. } else if (roleKeys.contains(Constants.PURCHASING_MANAGEMENT)
  120. || roleKeys.contains(Constants.PURCHASE_SERVICES)) {
  121. // 采购管理部门 或 采购办
  122. SysDept sysDept = new SysDept();
  123. sysDept.setParentId(loginUser.getDeptId());
  124. sysDept.setStatus("0");
  125. List<Long> childDeptIds = deptService.selectDeptList(sysDept)
  126. .stream()
  127. .map(SysDept::getDeptId)
  128. .collect(Collectors.toList());
  129. if (ObjectUtils.isEmpty(childDeptIds)) {
  130. lw.and((wrapper) -> {
  131. wrapper.eq(PlanQuarter::getIsExcess, 0);
  132. wrapper.eq(PlanQuarter::getPurchaseDeptId, loginUser.getDeptId());
  133. });
  134. } else {
  135. lw.and((wrapper) -> {
  136. wrapper.eq(PlanQuarter::getIsExcess, 0);
  137. wrapper.eq(PlanQuarter::getPurchaseDeptId, loginUser.getDeptId());
  138. })
  139. .or((wrapper) -> {
  140. wrapper.eq(PlanQuarter::getIsExcess, 1);
  141. wrapper.in(PlanQuarter::getPurchaseDeptId, childDeptIds);
  142. });
  143. }
  144. }
  145. Page<PlanQuarter> page = planQuarterMapper.selectPage(new Page<>(num, size, false), lw);
  146. list.addAll(page.getRecords());
  147. size = page.getRecords().size();
  148. num++;
  149. }
  150. planQuarterList = changeTo(list);
  151. } catch (Exception e) {
  152. e.printStackTrace();
  153. }
  154. return planQuarterList;
  155. }
  156. @Override
  157. public List<PlanQuarterResponseVo> selectPlanQuarterExamineListEXP(PlanQuarterStandardVo vo, LoginUser loginUser) {
  158. List<PlanQuarter> list = new ArrayList<>();
  159. List<PlanQuarterResponseVo> planQuarterList = new ArrayList<>();
  160. try {
  161. int num = 1;
  162. int size = 200;
  163. while (size == 200) {
  164. LambdaQueryWrapper<PlanQuarter> lw = new LambdaQueryWrapper<PlanQuarter>();
  165. if (!ObjectUtils.isEmpty(vo.getProjectName())) {
  166. lw.like(PlanQuarter::getProjectName, vo.getProjectName());
  167. }
  168. if (!ObjectUtils.isEmpty(vo.getPurchaseServices())) {
  169. lw.eq(PlanQuarter::getPurchaseServices, vo.getPurchaseServices());
  170. }
  171. if (!ObjectUtils.isEmpty(vo.getIsExcess())) {
  172. lw.eq(PlanQuarter::getIsExcess, vo.getIsExcess());
  173. }
  174. if (!ObjectUtils.isEmpty(vo.getProjectStatus())) {
  175. lw.eq(PlanQuarter::getProjectStatus, vo.getProjectStatus());
  176. } else {
  177. lw.in(PlanQuarter::getProjectStatus, "1,3");
  178. }
  179. if (!ObjectUtils.isEmpty(vo.getBeginTime())) {
  180. lw.ge(PlanQuarter::getPlanDemandSubTime, vo.getBeginTime());
  181. }
  182. if (!ObjectUtils.isEmpty(vo.getEndTime())) {
  183. lw.le(PlanQuarter::getPlanDemandSubTime, vo.getEndTime());
  184. }
  185. lw.eq(PlanQuarter::getDelFlay, DataIsDelete.DataNOTDelete.getCode());
  186. // 添加数据权限
  187. List<String> roleKeys = loginUser.getUser().getRoles().stream().map(SysRole::getRoleKey).collect(Collectors.toList());
  188. if (roleKeys.contains(Constants.DEMAND_UNIT)) {
  189. // 需求单位
  190. /*(purchase_dept_id = 当前用户deptID) */
  191. lw.eq(PlanQuarter::getPurchaseDeptId, loginUser.getDeptId());
  192. } else if (roleKeys.contains(Constants.PURCHASING_MANAGEMENT)
  193. || roleKeys.contains(Constants.PURCHASE_SERVICES)) {
  194. // 采购管理部门 或 采购办
  195. SysDept sysDept = new SysDept();
  196. sysDept.setParentId(loginUser.getDeptId());
  197. sysDept.setStatus("0");
  198. List<Long> childDeptIds = deptService.selectDeptList(sysDept)
  199. .stream()
  200. .map(SysDept::getDeptId)
  201. .collect(Collectors.toList());
  202. if (ObjectUtils.isEmpty(childDeptIds)) {
  203. lw.and((wrapper) -> {
  204. wrapper.eq(PlanQuarter::getIsExcess, 0);
  205. wrapper.eq(PlanQuarter::getPurchaseDeptId, loginUser.getDeptId());
  206. });
  207. } else {
  208. lw.and((wrapper) -> {
  209. wrapper.eq(PlanQuarter::getIsExcess, 0);
  210. wrapper.eq(PlanQuarter::getPurchaseDeptId, loginUser.getDeptId());
  211. })
  212. .or((wrapper) -> {
  213. wrapper.eq(PlanQuarter::getIsExcess, 1);
  214. wrapper.in(PlanQuarter::getPurchaseDeptId, childDeptIds);
  215. });
  216. }
  217. }
  218. Page<PlanQuarter> page = planQuarterMapper.selectPage(new Page<PlanQuarter>(num, size, false), lw);
  219. list.addAll(page.getRecords());
  220. size = page.getRecords().size();
  221. num++;
  222. }
  223. planQuarterList = changeTo(list);
  224. } catch (Exception e) {
  225. e.printStackTrace();
  226. }
  227. return planQuarterList;
  228. }
  229. @Transactional
  230. @Override
  231. public AjaxResult insertPlanQuarter(PlanQuarterStandardVo quarterStandardVo) {
  232. if (planQuarterMapper.countProjectName(quarterStandardVo.getProjectName()) > 0) {
  233. return AjaxResult.error("该项目名称已经存在");
  234. }
  235. PlanQuarter quarters = new PlanQuarter();
  236. try {
  237. BeanUtils.copyProperties(quarterStandardVo, quarters);
  238. } catch (Exception e) {
  239. e.printStackTrace();
  240. }
  241. //判断是否为超额计划
  242. quarters.setIsExcess(deptService.isExcessOrNo(quarters.getProjectType(), quarters.getEvaluation(), Long.valueOf(quarters.getPurchaseDeptId())));
  243. quarters.setProjectStatus(ProjectStatus.PLANWAITCOMMIT.getCode());
  244. quarters.setCreateTime(new Date());
  245. planQuarterMapper.insertPlanQuarter(quarters);
  246. log.info("id:{}", quarters.getPlanPracticalId());
  247. List<SysFileRef> sysFileRefs = quarterStandardVo.getSysFileRefs();
  248. if (!ObjectUtils.isEmpty(sysFileRefs)) {
  249. for (SysFileRef ref : sysFileRefs) {
  250. ref.setRedId(quarters.getPlanPracticalId());
  251. ref.setType(SysFileRefEnum.PLAN_TEMPORARY.getType());
  252. ref.setCreated(quarters.getCreated());
  253. ref.setCreateTime(new Date());
  254. ref.setUpdated(quarters.getCreated());
  255. ref.setUpdateTime(new Date());
  256. sysFileRefMapper.insert(ref);
  257. }
  258. }
  259. return AjaxResult.success();
  260. }
  261. @Override
  262. public AjaxResult deletePlanQuarterByIds(Long[] planIds) {
  263. planQuarterMapper.deletePlanQuarterByIds(planIds);
  264. return AjaxResult.success();
  265. }
  266. @Override
  267. public AjaxResult deletePlanQuarterById(Long planId) {
  268. planQuarterMapper.deletePlanQuarterById(planId);
  269. return AjaxResult.success();
  270. }
  271. @Override
  272. public AjaxResult view(PlanQuarterStandardVo quarterStandardVo) {
  273. PlanQuarterResponseVo responseVo = new PlanQuarterResponseVo();
  274. PlanQuarter byId = planQuarterMapper.getById(quarterStandardVo.getPlanPracticalId());
  275. if (byId == null) {
  276. return AjaxResult.error("数据查询失败");
  277. }
  278. SysDeptResponseVo sysDeptResponseVo = (SysDeptResponseVo) deptService.selectDeptById(Long.valueOf(byId.getPurchaseDeptId())).get("sysDept");
  279. byId.setPurchaseDeptName(sysDeptResponseVo.getDeptName());
  280. LambdaQueryWrapper<SysFileRef> lw = new LambdaQueryWrapper<>();
  281. lw.eq(SysFileRef::getRedId, quarterStandardVo.getPlanPracticalId());
  282. lw.in(SysFileRef::getType, Arrays.asList(SysFileRefEnum.PLAN_TEMPORARY.getType(), SysFileRefEnum.PLAN_TEMPORARY_EXAMINE.getType()));
  283. List<SysFileRef> fileRefs = sysFileRefMapper.selectList(lw);
  284. List<SysFileInfo> fileInfos = new ArrayList<>();
  285. BeanUtils.copyProperties(byId, responseVo);
  286. if (!ObjectUtils.isEmpty(fileRefs)) {
  287. for (SysFileRef ref : fileRefs) {
  288. SysFileInfo fileInfo = fileService.getById(ref.getFileId());
  289. fileInfos.add(fileInfo);
  290. }
  291. responseVo.setFileInfos(fileInfos);
  292. }
  293. return AjaxResult.success(responseVo);
  294. }
  295. @Transactional
  296. @Override
  297. public AjaxResult update(PlanQuarterStandardVo quarterStandardVo) {
  298. if (planQuarterMapper.countProjectNameOther(quarterStandardVo.getProjectName(), String.valueOf(quarterStandardVo.getPlanPracticalId())) > 0) {
  299. return AjaxResult.error("该项目名称已经存在");
  300. }
  301. PlanQuarter quarters = new PlanQuarter();
  302. try {
  303. BeanUtils.copyProperties(quarterStandardVo, quarters);
  304. } catch (Exception e) {
  305. e.printStackTrace();
  306. }
  307. quarters.setIsExcess(deptService.isExcessOrNo(quarters.getProjectType(), quarters.getEvaluation(), Long.valueOf(quarters.getPurchaseDeptId())));
  308. quarters.setUpdateTime(new Date());
  309. planQuarterMapper.updateInfoById(quarters);
  310. List<SysFileRef> sysFileRefs = quarterStandardVo.getSysFileRefs();
  311. HashMap<String, Object> map = new HashMap<>();
  312. map.put("red_id", quarters.getPlanPracticalId());
  313. map.put("type", SysFileRefEnum.PLAN_TEMPORARY.getType());
  314. sysFileRefMapper.deleteByMap(map);
  315. if (!ObjectUtils.isEmpty(sysFileRefs)) {
  316. for (SysFileRef ref : sysFileRefs) {
  317. ref.setRedId(quarters.getPlanPracticalId());
  318. ref.setType(SysFileRefEnum.PLAN_TEMPORARY.getType());
  319. ref.setCreated(quarterStandardVo.getUpdated());
  320. ref.setCreateTime(new Date());
  321. ref.setUpdated(quarterStandardVo.getUpdated());
  322. ref.setUpdateTime(new Date());
  323. sysFileRefMapper.insert(ref);
  324. }
  325. }
  326. return AjaxResult.success();
  327. }
  328. @Override
  329. public String importPlanQuarter(List<PlanQuarterStandardVo> planQuarters, boolean isUpdateSupport, LoginUser loginUser) {
  330. if (StringUtils.isNull(planQuarters) || planQuarters.size() == 0) {
  331. throw new ServiceException("导入季度计划数据不能为空!");
  332. }
  333. List<PlanQuarter> list = new ArrayList<>();
  334. for (PlanQuarterStandardVo standardVo : planQuarters) {
  335. PlanQuarter quarter = new PlanQuarter();
  336. BeanUtils.copyProperties(standardVo, quarter);
  337. quarter.setPurchaseDeptName(standardVo.getPurchaseDeptId());
  338. list.add(quarter);
  339. }
  340. HashMap<String, HashMap<String, String>> planEnums = dictTypeService.getAboutEnums();
  341. HashMap<String, String> projectTypesMap = planEnums.get("projectTypes");
  342. HashMap<String, String> planPurchaseModesMap = planEnums.get("planPurchaseModes");
  343. HashMap<String, String> projectAttributes = planEnums.get("projectAttributes");
  344. HashMap<String, String> purchaseServices = planEnums.get("purchaseServices");
  345. int successNum = 0;
  346. int failureNum = 0;
  347. StringBuilder successMsg = new StringBuilder();
  348. StringBuilder failureMsg = new StringBuilder();
  349. //deptService
  350. for (PlanQuarter planQuarter : list) {
  351. try {
  352. //验证项目名称是否重复导入
  353. //将录入信息中的值更改为要保存的数据
  354. if (planQuarterMapper.countProjectName(planQuarter.getProjectName()) == 0) {
  355. //采购单位
  356. SysDept info = deptMapper.checkDeptNameOnlyOne(planQuarter.getPurchaseDeptName());
  357. if (!ObjectUtils.isEmpty(info)) {
  358. planQuarter.setPurchaseDeptId(String.valueOf(info.getDeptId()));
  359. } else {
  360. ++failureNum;
  361. failureMsg.append("*" + failureNum + "*采购单位“" + planQuarter.getPurchaseDeptName() + "”不存在");
  362. }
  363. planQuarter.setProjectType(projectTypesMap.get(planQuarter.getProjectType()));
  364. planQuarter.setProjectStatus(ProjectStatus.PLANWAITCOMMIT.getCode());
  365. planQuarter.setPurchaseMode(planPurchaseModesMap.get(planQuarter.getPurchaseMode()));
  366. //项目属性是多选字段
  367. StringBuilder builder = new StringBuilder();
  368. if (planQuarter.getProjectAttr().contains(",")) {
  369. String[] split = planQuarter.getProjectAttr().split(",");
  370. for (String s : split) {
  371. if (!planQuarter.getProjectAttr().endsWith(s)) {
  372. builder.append(projectAttributes.get(s) + ",");
  373. } else {
  374. builder.append(projectAttributes.get(s));
  375. }
  376. }
  377. } else {
  378. builder.append(projectAttributes.get(planQuarter.getProjectAttr()));
  379. }
  380. planQuarter.setProjectAttr(builder.toString());
  381. planQuarter.setPurchaseServices(purchaseServices.get(planQuarter.getPurchaseServices()));
  382. planQuarter.setIsExcess(deptService.isExcessOrNo(planQuarter.getProjectType(), planQuarter.getEvaluation(), Long.valueOf(planQuarter.getPurchaseDeptId())));
  383. planQuarter.setCreated(String.valueOf(loginUser.getUserId()));
  384. planQuarter.setCreateTime(new Date());
  385. planQuarterMapper.insertPlanQuarter(planQuarter);
  386. successNum++;
  387. successMsg.append("*" + successNum + "、项目 " + planQuarter.getProjectName() + " 导入成功!");
  388. } else {
  389. failureNum++;
  390. failureMsg.append(failureNum + "*项目 " + planQuarter.getProjectName() + " 已存在!/n");
  391. }
  392. } catch (Exception exc) {
  393. failureNum++;
  394. String msg = "*" + successNum + "*项目 " + planQuarter.getProjectName() + " 导入失败";
  395. failureMsg.append(msg + exc.getMessage());
  396. log.error(msg, exc);
  397. }
  398. }
  399. if (failureNum > 0) {
  400. failureMsg.insert(0, "导入失败!共 " + failureNum + " 条数据格式不正确:");
  401. throw new ServiceException(failureMsg.toString());
  402. } else {
  403. successMsg.insert(0, "导入成功!共 " + successNum + " 条。");
  404. }
  405. return successMsg.toString();
  406. }
  407. @Override
  408. public AjaxResult commit(PlanQuarterStandardVo quarterStandardVo) {
  409. int commit = planQuarterMapper.commit(quarterStandardVo.getPlanPracticalId());
  410. if (commit != 1) {
  411. return AjaxResult.error("项目状态数据异常");
  412. }
  413. return AjaxResult.success();
  414. }
  415. @Override
  416. @Transactional
  417. public AjaxResult reviewTo(PlanQuarterStandardVo vo) {
  418. //季度计划审核通过后同步到年度计划和项目管理
  419. PlanQuarter quarters = new PlanQuarter();
  420. PmDemand demand = new PmDemand();
  421. PlanQuarter byId = planQuarterMapper.getById(vo.getPlanPracticalId());
  422. if (ObjectUtils.isEmpty(byId.getPlanYearId())) {
  423. PlanYears ofYears = new PlanYears();
  424. BeanUtils.copyProperties(byId, ofYears);
  425. ofYears.setProjectStatus(ProjectStatus.PLANTOEXAMINE.getCode());
  426. planYearsMapper.insertPlanYears(ofYears);
  427. quarters.setPlanYearId(ofYears.getPlanYearId());
  428. }
  429. BeanUtils.copyProperties(byId, demand);
  430. demand.setEvaluation(byId.getEvaluation().doubleValue());
  431. demand.setIsExcess(Integer.parseInt(byId.getIsExcess()));
  432. demand.setPlanId(byId.getPlanPracticalId());
  433. demand.setPurchaseDeptId(Long.valueOf(byId.getPurchaseDeptId()));
  434. //同步到项目管理状态为需求待填制
  435. demand.setProjectStatus(PmProjectStatus.DEMAND_WAIT_FILL.getCode());
  436. demand.setCreateTime(new Date());
  437. pmDemandMapper.insert(demand);
  438. demandService.updateDemandWarnStatus(demand.getDemandId());
  439. //计划附件也进行同步---查询季度计划附件后复制一份改为项目需求附件
  440. LambdaQueryWrapper<SysFileRef> sysFileRefLp = new LambdaQueryWrapper<>();
  441. sysFileRefLp.eq(SysFileRef::getType, SysFileRefEnum.PLAN_TEMPORARY.getType());
  442. sysFileRefLp.eq(SysFileRef::getRedId, vo.getPlanPracticalId());
  443. List<SysFileRef> sysFileRefs = sysFileRefMapper.selectList(sysFileRefLp);
  444. if (!ObjectUtils.isEmpty(sysFileRefs)) {
  445. for (SysFileRef ref : sysFileRefs) {
  446. ref.setRedId(demand.getDemandId());
  447. ref.setType(SysFileRefEnum.PM_DEMAND.getType());
  448. ref.setId(null);
  449. sysFileRefMapper.insert(ref);
  450. }
  451. }
  452. //上传审核文件并赋予计划审核通过
  453. vo.setProjectStatus(ProjectStatus.PLANTOEXAMINE.getCode());
  454. return review(vo);
  455. }
  456. @Override
  457. @Transactional
  458. public AjaxResult reviewReturn(PlanQuarterStandardVo vo) {
  459. vo.setProjectStatus(ProjectStatus.PLANTOBACK.getCode());
  460. //上传审核文件并赋予计划审核退回
  461. return review(vo);
  462. }
  463. private AjaxResult review(PlanQuarterStandardVo vo) {
  464. List<SysFileRef> sysFileRefs = vo.getSysFileRefs();
  465. if (!ObjectUtils.isEmpty(sysFileRefs)) {
  466. for (SysFileRef ref : sysFileRefs) {
  467. ref.setRedId(vo.getPlanPracticalId());
  468. ref.setType(SysFileRefEnum.PLAN_TEMPORARY_EXAMINE.getType());
  469. ref.setCreated(vo.getUpdated());
  470. ref.setCreateTime(new Date());
  471. ref.setUpdated(vo.getUpdated());
  472. ref.setUpdateTime(new Date());
  473. sysFileRefMapper.insert(ref);
  474. }
  475. }
  476. int review = planQuarterMapper.review(vo);
  477. if (review != 1) {
  478. return AjaxResult.error("项目状态数据异常");
  479. }
  480. return AjaxResult.success();
  481. }
  482. @Override
  483. public AjaxResult appUpdate(PlanQuarterStandardVo vo) {
  484. //如果项目管理中数据已填制,则不允许申请修改
  485. LambdaQueryWrapper<PmDemand> demandLp = new LambdaQueryWrapper<>();
  486. demandLp.eq(PmDemand::getPlanId, vo.getPlanPracticalId());
  487. PmDemand demand = pmDemandMapper.selectOne(demandLp);
  488. if (!String.valueOf(demand.getProjectStatus()).equals(PmProjectStatus.DEMAND_WAIT_FILL.getCode())) {
  489. return AjaxResult.error("项目信息已填制,不可更改");
  490. }
  491. //申请后会成为未提交的状态,可以进行修改
  492. vo.setProjectStatus(ProjectStatus.PLANWAITCOMMIT.getCode());
  493. int review = planQuarterMapper.review(vo);
  494. if (review != 1) {
  495. return AjaxResult.error("项目状态数据异常");
  496. }
  497. return AjaxResult.success();
  498. }
  499. @Override
  500. public AjaxResult sendLetter(PlanQuarterStandardVo quarterStandardVo) {
  501. int review = planQuarterMapper.sendLetter(quarterStandardVo.getPlanPracticalId());
  502. if (review != 1) {
  503. return AjaxResult.error("项目状态数据异常");
  504. }
  505. return AjaxResult.success();
  506. }
  507. @Override
  508. public AjaxResult upLoadPlanFile(PlanQuarterStandardVo quarterStandardVo) {
  509. List<SysFileRef> sysFileRefs = quarterStandardVo.getSysFileRefs();
  510. if (!ObjectUtils.isEmpty(sysFileRefs)) {
  511. for (SysFileRef ref : sysFileRefs) {
  512. ref.setRedId(quarterStandardVo.getPlanPracticalId());
  513. ref.setType(SysFileRefEnum.PLAN_TEMPORARY.getType());
  514. sysFileRefMapper.insert(ref);
  515. }
  516. }
  517. return AjaxResult.success();
  518. }
  519. @Override
  520. public AjaxResult downLoadPlanFile(PlanQuarterStandardVo quarterStandardVo) {
  521. return AjaxResult.success();
  522. }
  523. //字段赋值对应的名称
  524. public List<PlanQuarterResponseVo> changeTo(List<PlanQuarter> planQuarters) {
  525. //获取季度计划各个季度提报时间的阈值
  526. List<SysDictData> supTime = dictTypeService.selectDictDataByType("sys_quarterly_plan");
  527. HashMap<String, String> thresholdMap = new LinkedHashMap<>();
  528. //各个季度提报时间的阈值
  529. for (SysDictData dictData : supTime) {
  530. // 季度----阈值
  531. thresholdMap.put(dictData.getDictLabel(), dictData.getDictValue());
  532. } //提前或延后*天进行提醒
  533. List<SysDictData> alertTime = dictTypeService.selectDictDataByType("alert_time_setting");
  534. HashMap<String, String> alertTimeMap = new LinkedHashMap<>();
  535. //根据时间类别设定的提醒时间
  536. for (SysDictData dictData : alertTime) {
  537. // 字段名称----阈值
  538. alertTimeMap.put(dictData.getDictLabel(), dictData.getDictValue());
  539. }
  540. //获取字典数据
  541. HashMap<String, HashMap<String, String>> planEnums = dictTypeService.getAboutEnums();
  542. HashMap<String, String> projectTypesMap = planEnums.get("projectTypes");
  543. HashMap<String, String> planPurchaseModesMap = planEnums.get("planPurchaseModes");
  544. HashMap<String, String> projectAttributes = planEnums.get("projectAttributes");
  545. HashMap<String, String> purchaseServices = planEnums.get("purchaseServices");
  546. List<PlanQuarterResponseVo> list = new ArrayList<PlanQuarterResponseVo>();
  547. for (PlanQuarter planQuarter : planQuarters) {
  548. PlanQuarterResponseVo responseVo = new PlanQuarterResponseVo();
  549. SysDeptResponseVo sysDeptResponseVo = (SysDeptResponseVo) deptService.selectDeptById(Long.valueOf(planQuarter.getPurchaseDeptId())).get("sysDept");
  550. planQuarter.setPurchaseDeptName(sysDeptResponseVo.getDeptName());
  551. for (Map.Entry<String, String> entry : projectTypesMap.entrySet()) {
  552. if (planQuarter.getProjectType().equals(entry.getValue())) {
  553. planQuarter.setProjectTypeStr(entry.getKey());
  554. break;
  555. }
  556. }
  557. for (Map.Entry<String, String> entry : planPurchaseModesMap.entrySet()) {
  558. if (planQuarter.getPurchaseMode().equals(entry.getValue())) {
  559. planQuarter.setPurchaseModeStr(entry.getKey());
  560. break;
  561. }
  562. }
  563. //项目属性是拼接的
  564. if (!ObjectUtils.isEmpty(planQuarter.getProjectAttr())) {
  565. if (planQuarter.getProjectAttr().length() > 1) {
  566. StringBuilder builder = new StringBuilder();
  567. String[] split = planQuarter.getProjectAttr().split(",");
  568. for (String s : split) {
  569. for (Map.Entry<String, String> entry : projectAttributes.entrySet()) {
  570. if (s.equals(entry.getValue())) {
  571. if (!planQuarter.getProjectAttr().endsWith(s)) {
  572. builder.append(entry.getKey() + ",");
  573. } else {
  574. builder.append(entry.getKey());
  575. }
  576. break;
  577. }
  578. }
  579. }
  580. planQuarter.setProjectAttrStr(builder.toString());
  581. } else {
  582. for (Map.Entry<String, String> entry : projectAttributes.entrySet()) {
  583. if (planQuarter.getProjectAttr().equals(entry.getValue())) {
  584. planQuarter.setProjectAttrStr(entry.getKey());
  585. break;
  586. }
  587. }
  588. }
  589. }
  590. for (Map.Entry<String, String> entry : purchaseServices.entrySet()) {
  591. if (planQuarter.getPurchaseServices().equals(entry.getValue())) {
  592. planQuarter.setPurchaseServicesStr(entry.getKey());
  593. break;
  594. }
  595. }
  596. BeanUtils.copyProperties(planQuarter, responseVo);
  597. try {
  598. responseVo.setTipsMessage(planQuarterGetTips(thresholdMap, alertTimeMap));
  599. } catch (ParseException e) {
  600. e.printStackTrace();
  601. }
  602. list.add(responseVo);
  603. }
  604. return list;
  605. }
  606. /**
  607. * 根据季度计划在各个季度提报时间的阈值进行提示
  608. *
  609. * @return
  610. */
  611. public String planQuarterGetTips(HashMap<String, String> thresholdMap, HashMap<String, String> alertTimeMap) throws ParseException {
  612. //提示信息:定义距离结束时间*天内提示
  613. int alertDay = Integer.parseInt(alertTimeMap.get("计划提报时间"));
  614. //提示信息:定义距离结束时间一周内提示
  615. Integer remindTine = 1000 * 60 * 60 * 24 * alertDay; //提示语
  616. String subTips = "";
  617. //季度提报时间的结束时间阈值
  618. Date thresholdTime = null;
  619. SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
  620. Date date = new Date();
  621. for (QuarterEnum val : QuarterEnum.values()) {
  622. if (val.getInfo().contains(date.getMonth() + "")) {
  623. switch (val.getCode()) {
  624. case "1":
  625. thresholdTime = dateFormat.parse(thresholdMap.get("第一季度结束时间"));
  626. case "2":
  627. thresholdTime = dateFormat.parse(thresholdMap.get("第二季度结束时间"));
  628. case "3":
  629. thresholdTime = dateFormat.parse(thresholdMap.get("第三季度结束时间"));
  630. case "4":
  631. thresholdTime = dateFormat.parse(thresholdMap.get("第四季度结束时间"));
  632. default:
  633. }
  634. break;
  635. }
  636. }
  637. thresholdTime.setYear(date.getYear());
  638. double surplus = thresholdTime.getTime() - date.getTime();
  639. //少于一周便提醒
  640. if (surplus < remindTine && surplus > 0) {
  641. //剩余天数(向上取整)
  642. int i = new Double(Math.ceil(surplus / 1000 / 60 / 60 / 24)).intValue();
  643. if (i > 0) {
  644. subTips = "距离计划提报时间不足" + i + "天";
  645. }
  646. }
  647. return subTips;
  648. }
  649. }