ProjectTaskServiceImpl.java 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897
  1. package com.ruoyi.project.service.impl;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.ruoyi.common.core.domain.AjaxResult;
  4. import com.ruoyi.common.core.domain.entity.SysDept;
  5. import com.ruoyi.common.core.domain.entity.SysUser;
  6. import com.ruoyi.common.enums.UserRolesType;
  7. import com.ruoyi.common.exception.ServiceException;
  8. import com.ruoyi.common.utils.DateUtils;
  9. import com.ruoyi.common.utils.PageUtils;
  10. import com.ruoyi.common.utils.SecurityUtils;
  11. import com.ruoyi.common.utils.StringUtils;
  12. import com.ruoyi.common.utils.bean.BeanUtils;
  13. import com.ruoyi.common.utils.bean.BeanValidators;
  14. import com.ruoyi.common.utils.file.FileUtils;
  15. import com.ruoyi.project.bo.*;
  16. import com.ruoyi.project.domain.ProjectStaff;
  17. import com.ruoyi.project.domain.ProjectStaffRecord;
  18. import com.ruoyi.project.domain.ProjectTask;
  19. import com.ruoyi.project.mapper.ProjectStaffMapper;
  20. import com.ruoyi.project.mapper.ProjectStaffRecordMapper;
  21. import com.ruoyi.project.mapper.ProjectTaskMapper;
  22. import com.ruoyi.project.service.ProjectTaskService;
  23. import com.ruoyi.system.domain.SysUserRole;
  24. import com.ruoyi.system.mapper.SysDeptMapper;
  25. import com.ruoyi.system.mapper.SysUserMapper;
  26. import com.ruoyi.system.mapper.SysUserRoleMapper;
  27. import com.ruoyi.system.service.ISysDeptService;
  28. import org.apache.poi.xwpf.usermodel.XWPFDocument;
  29. import org.apache.poi.xwpf.usermodel.XWPFParagraph;
  30. import org.apache.poi.xwpf.usermodel.XWPFRun;
  31. import org.slf4j.Logger;
  32. import org.slf4j.LoggerFactory;
  33. import org.springframework.beans.factory.annotation.Value;
  34. import org.springframework.http.HttpStatus;
  35. import org.springframework.stereotype.Service;
  36. import javax.annotation.Resource;
  37. import javax.validation.Validator;
  38. import java.io.File;
  39. import java.io.FileOutputStream;
  40. import java.io.IOException;
  41. import java.util.*;
  42. import java.util.stream.Collectors;
  43. import java.util.stream.Stream;
  44. import static java.lang.Thread.sleep;
  45. @Service
  46. public class ProjectTaskServiceImpl implements ProjectTaskService {
  47. private static final Logger log = LoggerFactory.getLogger(ProjectTaskServiceImpl.class);
  48. @Resource
  49. private ProjectTaskMapper projectTaskMapper;
  50. @Resource
  51. private ProjectStaffMapper projectStaffMapper;
  52. @Resource
  53. private ISysDeptService deptService;
  54. @Resource
  55. private Validator validator;
  56. @Resource
  57. private SysUserMapper userMapper;
  58. @Resource
  59. private ProjectStaffRecordMapper projectStaffRecordMapper;
  60. @Resource
  61. private SysDeptMapper sysDeptMapper;
  62. @Resource
  63. private TianheService tianheService;
  64. @Resource
  65. private SysUserRoleMapper sysUserRoleMapper;
  66. @Value("${ruoyi.profile}")
  67. private String profile=null;
  68. @Override
  69. public AjaxResult addProjectTask(ProjectTask projectTask) {
  70. userMapper.updateUserProjectSum(projectTask.getAid(),0);
  71. projectTask.setCreateAid(SecurityUtils.getUserId());
  72. int i = projectTaskMapper.insertSelective(projectTask);
  73. if (StringUtils.isNotBlank(projectTask.getStaffObject())){
  74. String[] split = projectTask.getStaffObject().split(",");
  75. projectStaffMapper.updatePidByList(projectTask.getId(),split);
  76. projectTaskMapper.updateStaffName(projectTask.getId());
  77. }
  78. return AjaxResult.success(i);
  79. }
  80. @Override
  81. public AjaxResult deleteProject(ProjectTask in) {
  82. int i = projectTaskMapper.deleteByPrimaryKey(in.getId());
  83. userMapper.updateUserProjectSum(in.getAid(),0);
  84. if (i>0){
  85. projectStaffMapper.deleteBypid(in.getId());
  86. return AjaxResult.success();
  87. }
  88. return AjaxResult.error("项目编号不存在");
  89. }
  90. @Override
  91. public AjaxResult details(Long id) {
  92. ProjectTask projectTask = projectTaskMapper.selectByPrimaryKey(id);
  93. ProjectTaskOut out= new ProjectTaskOut();
  94. if (projectTask!=null){
  95. BeanUtils.copyBeanProp(out, projectTask);
  96. List<ProjectStaff> projectStaffs = projectStaffMapper.selectByPid(id);
  97. if (!projectStaffs.isEmpty())out.setList(projectStaffs);
  98. return AjaxResult.success(out);
  99. }
  100. return AjaxResult.error("项目不存在");
  101. }
  102. @Override
  103. public List<ProjectTaskListOut> list(ProjectListInput in) {
  104. pushRoleType(in);
  105. if (!SecurityUtils.isSuperAdmin()){
  106. in.setUid(SecurityUtils.getUserId());
  107. Long companyId = deptService.selectCompanyByDeptId();
  108. if (companyId!=null)in.setCompanyId(companyId);
  109. }
  110. if (in.getMyCreate()!=null&&in.getMyCreate()==1){
  111. in.setCreateAid(SecurityUtils.getUserId());
  112. }
  113. if (in.getEndTime()!=null)in.setEndTime(in.getEndTime()+" 23:59:59");
  114. PageUtils.startPage();
  115. return projectTaskMapper.selectList(in);
  116. }
  117. private void pushRoleType(ProjectListInput in) {
  118. if (in.getRoleType()==null){
  119. if (SecurityUtils.hashRoles(UserRolesType.CEO.getCode())){
  120. in.setRoleType(1);
  121. }else if (SecurityUtils.hashRoles(UserRolesType.ADMIN.getCode())){
  122. in.setRoleType(3);
  123. }else if (SecurityUtils.hashRoles(UserRolesType.MANAGE.getCode())){
  124. in.setRoleType(2);
  125. }else {
  126. in.setRoleType(0);
  127. }
  128. }
  129. }
  130. @Override
  131. public String importProject(List<ProjectTaskListOut> list, boolean updateSupport, String operName) {
  132. if (StringUtils.isNull(list) || list.size() == 0)
  133. {
  134. throw new ServiceException("导入用户数据不能为空!");
  135. }
  136. int successNum = 0;
  137. int failureNum = 0;
  138. StringBuilder successMsg = new StringBuilder();
  139. StringBuilder failureMsg = new StringBuilder();
  140. Long company = deptService.selectCompanyByDeptId();
  141. List<Long> pids = new ArrayList<Long>();
  142. for (ProjectTaskListOut p : list)
  143. {
  144. try
  145. {
  146. if (p.getProjectYear()==null||p.getProjectYear()==""){
  147. throw new ServiceException("项目年份不能为空");
  148. }else if (p.getCreateYear()==null||p.getCreateYear()==""){
  149. throw new ServiceException("创建年份不能为空");
  150. }
  151. // 验证是否存在这个用户
  152. ProjectTask projectTask = projectTaskMapper.selectByProjectNumber(p.getProjectNumber(),company);
  153. if (StringUtils.isNull(projectTask)){
  154. BeanValidators.validateWithException(validator, p);
  155. if (checkProjectNumber(p)){
  156. throw new ServiceException(String.format("项目编号[%s]已存在", p.getProjectNumber()));
  157. }
  158. if(StringUtils.isNotBlank(p.getAdminName())) {
  159. SysUser sysUser = userMapper.selectByNikeName(p.getAdminName(),company);
  160. if (sysUser == null) {
  161. throw new ServiceException(String.format("负责人[%s]不存在", p.getAdminName()));
  162. }
  163. p.setAid(sysUser.getUserId());
  164. p.setAdminName(sysUser.getNickName());
  165. }
  166. p.setProjectStatus(0);
  167. projectTaskMapper.insertSelective(p);
  168. pushProjectStaffName(p, company);
  169. successNum++;
  170. successMsg.append("<br/>" + successNum + "、项目: " + p.getName() + " 导入成功");
  171. }else if (updateSupport){
  172. BeanValidators.validateWithException(validator, p);
  173. p.setId(projectTask.getId());
  174. if(StringUtils.isNotBlank(p.getStaffName())) {
  175. addStaffAndDelete( p);
  176. }
  177. if (p.getAdminName()!=null&&!projectTask.getAdminName().equals(p.getAdminName())){
  178. SysUser sysUser = userMapper.selectByNikeName(p.getAdminName(),company);
  179. if (sysUser == null) {
  180. throw new ServiceException(String.format("负责人[%s]不存在", p.getAdminName()));
  181. }
  182. List<ProjectStaffRecord> projectStaffRecords = projectStaffRecordMapper.selectByPidAndAid(p.getId(), projectTask.getAid());
  183. if (projectStaffRecords.size()>0){
  184. throw new ServiceException(String.format("负责人[%s]存在打卡,不允许切换.", projectTask.getAdminName()));
  185. }
  186. p.setAid(sysUser.getUserId());
  187. p.setAdminName(sysUser.getNickName());
  188. }
  189. projectTaskMapper.updateByPrimaryKeySelective(p);
  190. if (!pids.contains(p.getId())){
  191. pids.add(p.getId());
  192. }
  193. successNum++;
  194. successMsg.append("<br/>" + successNum + "、项目: " + projectTask.getName() + " 更新成功");
  195. }
  196. else
  197. {
  198. failureNum++;
  199. failureMsg.append("<br/>" + failureNum + "、项目: " + projectTask.getName() + " 已存在");
  200. }
  201. }
  202. catch (Exception e)
  203. {
  204. failureNum++;
  205. String msg = "<br/>" + failureNum + "、项目: " + p.getName() + " 导入失败:";
  206. failureMsg.append(msg + e.getMessage());
  207. log.error(msg, e);
  208. }
  209. }
  210. if (failureNum > 0)
  211. {
  212. failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
  213. throw new ServiceException(failureMsg.toString());
  214. }
  215. else
  216. {
  217. successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
  218. }
  219. if (!pids.isEmpty()){
  220. for (Long pid : pids) {
  221. projectStaffRecordMapper.updateSumDurationProject(pid);
  222. projectStaffRecordMapper.updateSumDurationStaff(pid);
  223. }
  224. }
  225. return successMsg.toString();
  226. }
  227. private void pushProjectStaffName(ProjectTaskListOut p, Long company) {
  228. if(StringUtils.isNotBlank(p.getStaffName())) {
  229. String[] split = StringUtils.splitString(p.getStaffName());
  230. for (String s : split) {
  231. ProjectStaff newPs = new ProjectStaff();
  232. SysUser sysUser = userMapper.selectByNikeName(s, company);
  233. if (sysUser == null) {
  234. throw new ServiceException("[" + s + "]不存在");
  235. }
  236. newPs.setAid(sysUser.getUserId());
  237. newPs.setName(sysUser.getNickName());
  238. newPs.setPid(p.getId());
  239. projectStaffMapper.insertSelective(newPs);
  240. }
  241. }
  242. projectTaskMapper.updateStaffName(p.getId());
  243. }
  244. @Override
  245. public AjaxResult updateProjectTask(ProjectTask in) {
  246. ProjectTask use = projectTaskMapper.selectByPrimaryKey(in.getId());
  247. if (!in.getAid().equals(use.getAid())){
  248. List<ProjectStaffRecord> projectStaffRecords = projectStaffRecordMapper.selectByPidAndAid(in.getId(), use.getAid());
  249. if (projectStaffRecords.size()>0){
  250. throw new ServiceException(String.format("负责人[%s]存在打卡,不允许切换.", use.getAdminName()));
  251. }
  252. }
  253. return AjaxResult.success(projectTaskMapper.updateByPrimaryKeySelective(in));
  254. }
  255. @Override
  256. public AjaxResult selectProjectImg(Long pid) {
  257. return AjaxResult.success(projectTaskMapper.selectProjectImg(pid));
  258. }
  259. @Override
  260. public boolean checkProjectNumber(ProjectTask projectTask) {
  261. Long companyId = deptService.selectCompanyByDeptId();
  262. ProjectTask projectTask1 = projectTaskMapper.selectByProjectNumber(projectTask.getProjectNumber(),companyId);
  263. if (projectTask.getId()==null){
  264. if (projectTask1!=null){
  265. return true;
  266. }
  267. }else {
  268. if (projectTask1!=null&&!projectTask.getId().equals(projectTask1.getId())){
  269. return true;
  270. }
  271. }
  272. return false;
  273. }
  274. private void addStaffAndDelete( ProjectTaskListOut p) {
  275. String[] split = p.getStaffName().split(",");
  276. List<ProjectStaff> projectStaffs = projectStaffMapper.selectByPid(p.getId());
  277. deleteStaff( split, projectStaffs);
  278. addStaff( p, split, projectStaffs);
  279. //再从新获取统计名字
  280. projectTaskMapper.updateStaffName(p.getId());
  281. }
  282. private void deleteStaff( String[] split, List<ProjectStaff> projectStaffs) {
  283. //预设需要删除,如果找到相同名字的就无需删除
  284. for (ProjectStaff ps : projectStaffs) {
  285. boolean flag = true;
  286. for (String s : split) {
  287. s=s.trim();
  288. if (ps.getName().equals(s)) {
  289. flag = false;
  290. }
  291. }
  292. if (flag) {
  293. int sum = projectStaffRecordMapper.selectById(ps.getId());
  294. if (sum > 0) {
  295. throw new ServiceException("[" + ps.getName() + "]存在打卡不能删除");
  296. }
  297. projectStaffMapper.deleteByPrimaryKey(ps.getId());
  298. }
  299. }
  300. }
  301. private void addStaff( ProjectTaskListOut p, String[] split, List<ProjectStaff> projectStaffs) {
  302. Long company = deptService.selectCompanyByDeptId();
  303. for (String s : split) {
  304. s=s.trim();
  305. boolean flag = true;
  306. for (ProjectStaff ps : projectStaffs) {
  307. if (ps.getName().equals(s)) {
  308. flag = false;
  309. }
  310. }
  311. if (flag) {
  312. ProjectStaff newPs = new ProjectStaff();
  313. SysUser sysUser = userMapper.selectByNikeName(s,company);
  314. if (sysUser == null) {
  315. throw new ServiceException("[" + s + "]不存在");
  316. }
  317. newPs.setAid(sysUser.getUserId());
  318. newPs.setName(sysUser.getNickName());
  319. newPs.setPid(p.getId());
  320. projectStaffMapper.insertSelective(newPs);
  321. }
  322. }
  323. }
  324. @Override
  325. public void saveProjectTaskTianhe(String ids) {
  326. String[] split = ids.split(",");
  327. try {
  328. for (String id : split) {
  329. saveProjectText(Long.valueOf(id));
  330. Thread.sleep(1000);
  331. }
  332. } catch (InterruptedException e) {
  333. throw new RuntimeException("上链异常,请稍后再试");
  334. }
  335. }
  336. @Override
  337. public void saveProjectStaffRecordTianhe(String ids) {
  338. String[] split = ids.split(",");
  339. try {
  340. for (String id : split) {
  341. saveRecordsText(Long.valueOf(id));
  342. Thread.sleep(1000);
  343. }
  344. } catch (InterruptedException e) {
  345. throw new RuntimeException("上链异常,请稍后再试");
  346. }
  347. }
  348. @Override
  349. public void saveText(String content) {
  350. String address = getAddress();
  351. String operateId ="text_"+DateUtils.dateTimeNow();
  352. //文字导入
  353. String s = tianheService.seveText(address, content, operateId);
  354. JSONObject res = JSONObject.parseObject(s);
  355. Integer code = (Integer) res.get("code");
  356. String tianheCloudUrl=null;
  357. if (code== HttpStatus.OK.value()){
  358. try {
  359. sleep(1000);
  360. } catch (InterruptedException e) {
  361. throw new RuntimeException(e);
  362. }
  363. String certificate = tianheService.getCertificate(address, operateId);
  364. JSONObject certificateData = JSONObject.parseObject(certificate);
  365. Integer code2= (Integer) certificateData.get("code");
  366. if (code2==HttpStatus.OK.value()){
  367. log.debug(certificateData.toJSONString());
  368. tianheCloudUrl=certificateData.getString("data");
  369. }else {
  370. String msg = certificateData.getString("msg");
  371. log.error(msg);
  372. throw new RuntimeException(msg);
  373. }
  374. }else {
  375. String msg = res.getString("msg");
  376. log.error(msg);
  377. throw new RuntimeException(msg);
  378. }
  379. }
  380. public void saveRecordsText(Long id) throws InterruptedException {
  381. ProjectStaffRecord projectStaffRecord = projectStaffRecordMapper.selectByPrimaryKey(Long.valueOf(id));
  382. Map<String,Object> map=new HashMap<>();
  383. map.put("projectStaffRecord",projectStaffRecord);
  384. map.put("date", DateUtils.getTime());
  385. saveTianhe(map,null,null,projectStaffRecord);
  386. }
  387. public void saveProjectText(Long id) throws InterruptedException {
  388. ProjectTask projectTask = projectTaskMapper.selectByPrimaryKey(id);
  389. List<ProjectStaffRecord> projectStaffRecords = projectStaffRecordMapper.selectByPidAndAid(id, null);
  390. Map<String,Object> map=new HashMap<>();
  391. map.put("projectTask",projectTask);
  392. map.put("projectStaffRecords",projectStaffRecords);
  393. map.put("date", DateUtils.getTime());
  394. saveTianhe(map,projectTask,projectStaffRecords,null);
  395. }
  396. private void saveTianhe(Map<String, Object> map, ProjectTask projectTask,
  397. List<ProjectStaffRecord> projectStaffRecords,
  398. ProjectStaffRecord projectStaffRecord) throws InterruptedException {
  399. String json = JSONObject.toJSONString(map);
  400. String address = getAddress();
  401. String operateId =null;
  402. if (projectTask!=null){
  403. operateId = "yfdk_"+DateUtils.dateTimeNow();
  404. }else {
  405. operateId = "yfdk_records_"+DateUtils.dateTimeNow();
  406. }
  407. String docx = createDocx(json, operateId);
  408. File file = new File(docx);
  409. String s = tianheService.seveFile(address,operateId,file);
  410. //文字导入
  411. // String s = tianheService.seveText(address, json, operateId);
  412. JSONObject res = JSONObject.parseObject(s);
  413. Integer code = (Integer) res.get("code");
  414. String tianheCloudUrl=null;
  415. if (code== HttpStatus.OK.value()){
  416. sleep(1000);
  417. String certificate = tianheService.getCertificate(address, operateId);
  418. JSONObject certificateData = JSONObject.parseObject(certificate);
  419. Integer code2= (Integer) certificateData.get("code");
  420. if (code2==HttpStatus.OK.value()){
  421. log.debug(certificateData.toJSONString());
  422. tianheCloudUrl=certificateData.getString("data");
  423. if (projectTask!=null){
  424. if (StringUtils.isNotEmpty(tianheCloudUrl)){
  425. ProjectTask newPT=new ProjectTask();
  426. newPT.setTianheUrl(tianheCloudUrl);
  427. newPT.setId(projectTask.getId());
  428. projectTaskMapper.updateByPrimaryKeySelective(newPT);
  429. }
  430. pushProjectStaffRecord(projectStaffRecords);
  431. }
  432. if (projectStaffRecord!=null){
  433. ProjectStaffRecord newPSR=new ProjectStaffRecord();
  434. newPSR.setTianheUrl(tianheCloudUrl);
  435. newPSR.setId(projectStaffRecord.getId());
  436. projectStaffRecordMapper.updateByPrimaryKeySelective(newPSR);
  437. }
  438. FileUtils.deleteFile(docx);
  439. }else {
  440. String msg = certificateData.getString("msg");
  441. log.error(msg);
  442. throw new RuntimeException(msg);
  443. }
  444. }else {
  445. String msg = res.getString("msg");
  446. log.error(msg);
  447. throw new RuntimeException(msg);
  448. }
  449. }
  450. private String createDocx(String json, String operateId) {
  451. String url=profile+"/"+ operateId +".docx";
  452. XWPFDocument document = new XWPFDocument();
  453. XWPFParagraph paragraph = document.createParagraph();
  454. XWPFRun run = paragraph.createRun();
  455. run.setText(json);
  456. try {
  457. // 保存文档到指定路径
  458. FileOutputStream out = new FileOutputStream(url);
  459. document.write(out);
  460. out.close();
  461. System.out.println("Word文档已成功创建!");
  462. } catch (IOException e) {
  463. e.printStackTrace();
  464. } finally {
  465. // 关闭文档对象
  466. try {
  467. document.close();
  468. } catch (IOException e) {
  469. throw new RuntimeException(e);
  470. }
  471. }
  472. return url;
  473. }
  474. /**
  475. * 处理日志跟随项目上链
  476. */
  477. private void pushProjectStaffRecord(List<ProjectStaffRecord> projectStaffRecords) {
  478. int count=50;
  479. int i=0;
  480. List<ProjectStaffRecord> newList=new ArrayList<>();
  481. for (ProjectStaffRecord projectStaffRecord : projectStaffRecords) {
  482. i++;
  483. newList.add(projectStaffRecord);
  484. if (newList.size()==count||i==projectStaffRecords.size()){
  485. projectStaffRecordMapper.updateTianheType(newList);
  486. newList.clear();
  487. }
  488. }
  489. }
  490. private String getAddress() {
  491. String address = null;
  492. SysUser user = SecurityUtils.getLoginUser().getUser();
  493. SysUser sysUser = userMapper.selectUserById(user.getUserId());
  494. if (sysUser.getTianheId()==null){
  495. try {
  496. String userId=user.getUserId().toString();
  497. String s = tianheService.addUser( userId, "123456");
  498. JSONObject jsonObject = JSONObject.parseObject(s);
  499. JSONObject data = (JSONObject) jsonObject.get("data");
  500. JSONObject pubKey = (JSONObject) data.get("pubKey");
  501. address= (String) pubKey.get("address");
  502. }catch (Exception e ){
  503. log.error("天河账号创建失败!");
  504. throw new RuntimeException("天河账号创建失败");
  505. }
  506. if (address!=null){
  507. user.setTianheId(address);
  508. userMapper.updateUser(user);
  509. }
  510. }else {
  511. address=sysUser.getTianheId();
  512. }
  513. if (address==null){
  514. throw new ServiceException("天河账号不存在,请稍后再试");
  515. }
  516. return address;
  517. }
  518. @Override
  519. public Object getCompanyData(String usci) {
  520. //获取部门信息
  521. SysDept sysDept = new SysDept();
  522. SysDept sysDept2 = sysDeptMapper.selectByusci(usci);
  523. if (sysDept2==null){
  524. throw new ServiceException("打卡系统公司不存在");
  525. }
  526. sysDept.setAncestors(sysDept2.getDeptId().toString());
  527. List<SysDept> sysDepts = sysDeptMapper.selectDeptList(sysDept);
  528. sysDepts.stream().forEach(System.out::println);
  529. //获取部门下的用户信息
  530. List<SysUser> sysUsers = new ArrayList<>();
  531. List<ProjectTask> projectTasks=new ArrayList<>();
  532. sysDepts.stream().forEach(sysDept1 -> {
  533. sysUsers.addAll(userMapper.selectByDeptId(sysDept1.getDeptId()));
  534. });
  535. sysUsers.stream().forEach(sysUser -> {
  536. projectTasks.addAll(projectTaskMapper.selectByUserId(sysUser.getUserId()));
  537. });
  538. if (projectTasks.isEmpty()||sysUsers.isEmpty()||sysDepts.isEmpty()){
  539. throw new ServiceException("打卡数据不存在");
  540. }
  541. Map<String,Object> map=new HashMap();
  542. map.put("projectTasks",projectTasks);
  543. map.put("sysUsers",sysUsers);
  544. map.put("sysDepts",sysDepts);
  545. return map;
  546. }
  547. @Override
  548. public Object pushCompanyData(pushCompanyDataBo in) {
  549. //导入部门
  550. Long kyId=null;
  551. String usci = null;
  552. if (!in.getListDep().isEmpty()){
  553. //假设只设置2级 1级为公司
  554. List<pushDataDep> sp1 = in.getListDep().stream().filter(e -> StringUtils.isNotEmpty(e.getUsci())).collect(Collectors.toList());
  555. //先新增公司
  556. pushDataDep pushDataDep = sp1.get(0);
  557. usci = pushDataDep.getUsci();
  558. kyId = pushAddDep(in.getListDep(), pushDataDep);
  559. }
  560. //导入用户
  561. if (!in.getListUser().isEmpty()){
  562. pushAddUser(in.getListUser());
  563. }
  564. //导入用户项目
  565. if (!in.getListUserProject().isEmpty()){
  566. pushAddUserProject(in.getListUserProject(),kyId);
  567. }
  568. pushRdDataBo pushRdDataBo = new pushRdDataBo();
  569. pushRdDataBo.setRdList(in.getRdList());
  570. pushRdDataBo.setUsci(usci);
  571. pushRdData(pushRdDataBo);
  572. return 1;
  573. }
  574. @Override
  575. public Object pushRdData(pushRdDataBo in) {
  576. SysDept sysDept = sysDeptMapper.selectByusci(in.getUsci());
  577. if (sysDept==null){
  578. throw new ServiceException("公司不存在");
  579. }
  580. Map<String,ProjectTask> projectMap=new HashMap();
  581. Map<String,SysUser> userMap=new HashMap();
  582. if (!in.getRdList().isEmpty()){
  583. List<PushRdDataListBo> rdList = in.getRdList();
  584. rdList.stream().forEach(e -> {
  585. ProjectStaffRecord p = new ProjectStaffRecord();
  586. if (e.getProjectNumber() != null){
  587. //如果传入时间未0,则需要删除当天打卡数据
  588. if (e.getDuration()>0){
  589. ProjectTask projectTask =getCompanyProject(projectMap,e.getProjectNumber(), sysDept.getDeptId());
  590. if (projectTask!=null){
  591. p.setPid(projectTask.getId());
  592. }else {
  593. throw new ServiceException("项目不存在");
  594. }
  595. SysUser sysUser=getCompanyUser(userMap,e.getAdminKyId());
  596. if (sysUser!=null){
  597. p.setAid(sysUser.getUserId());
  598. p.setName(sysUser.getNickName());
  599. }
  600. p.setRecordTime(DateUtils.parseDate(e.getRecordTime()));
  601. p.setDuration(e.getDuration());
  602. p.setInitDuration(e.getDuration());
  603. //如果是已有数据覆盖,没有数据新增
  604. ProjectStaffRecord projectStaffRecord = projectStaffRecordMapper.selectByPidAndAidAndTime(p.getPid(), p.getAid(), p.getRecordTime());
  605. p.setProjectStatus(0);
  606. p.setProcessStatus(2);
  607. p.setCheckStatus(0);
  608. if (projectStaffRecord!=null){
  609. p.setId(projectStaffRecord.getId());
  610. projectStaffRecordMapper.updateByPrimaryKeySelective(p);
  611. }else{
  612. projectStaffRecordMapper.insertSelective(p);
  613. }
  614. }else {
  615. ProjectStaffRecord projectStaffRecord = projectStaffRecordMapper.selectByPidAndAidAndTime(p.getPid(), p.getAid(), p.getRecordTime());
  616. if (projectStaffRecord!=null){
  617. projectStaffRecordMapper.deleteByPrimaryKey(projectStaffRecord.getId());
  618. }
  619. }
  620. }
  621. });
  622. //更新项目总时长
  623. projectMap.values().stream().forEach(e -> {
  624. projectTaskMapper.updateDuration(e.getId());
  625. });
  626. //更新用户总时长
  627. userMap.values().stream().forEach(e -> {
  628. userMapper.updateDuration(e.getUserId());
  629. });
  630. }
  631. return 1;
  632. }
  633. private SysUser getCompanyUser(Map<String, SysUser> map, String adminKyId) {
  634. if (map.keySet().contains(adminKyId)){
  635. return (SysUser) map.get(adminKyId);
  636. }else{
  637. SysUser sysUser = userMapper.selectByKyId(adminKyId);
  638. map.put(sysUser.getKyId(),sysUser);
  639. return sysUser;
  640. }
  641. }
  642. private ProjectTask getCompanyProject(Map<String, ProjectTask> map, String projectNumber, Long deptId) {
  643. if (map.keySet().contains(projectNumber)){
  644. return (ProjectTask) map.get(projectNumber);
  645. }else{
  646. ProjectTask projectTask = projectTaskMapper.selectByProjectNumber(projectNumber, deptId);
  647. map.put(projectTask.getProjectNumber(),projectTask);
  648. return projectTask;
  649. }
  650. }
  651. private void pushAddUserProject(List<pushDataProject> listUserProject,Long kyId) {
  652. listUserProject.stream().forEach(e -> {
  653. ProjectTask projectTask = new ProjectTask();
  654. projectTask.setName(e.getProjectName());
  655. projectTask.setProjectNumber(e.getProjectNumber());
  656. projectTask.setProjectStatus(0);
  657. if (e.getAid()!=null){
  658. SysUser sysUser = userMapper.selectByKyId(e.getAid());
  659. if (sysUser!=null){
  660. projectTask.setAdminName(sysUser.getNickName());
  661. projectTask.setAid(sysUser.getUserId());
  662. }
  663. }
  664. projectTask.setStartTime(DateUtils.parseDate(e.getStartTime()));
  665. projectTask.setEndTime(DateUtils.parseDate(e.getEndTime()));
  666. projectTask.setProjectYear(e.getProjectYear());
  667. projectTask.setCreateYear(e.getCreateYear());
  668. projectTask.setCrossYear(0);
  669. projectTask.setDuration(0d);
  670. projectTask.setCreateTime(new Date());
  671. //存在则修改,不存在则新增
  672. ProjectTask projectTask1 = projectTaskMapper.selectByProjectNumber(projectTask.getProjectNumber(), kyId);
  673. if (projectTask1!=null){
  674. projectTask.setId(projectTask1.getId());
  675. projectTaskMapper.updateByPrimaryKey(projectTask);
  676. projectStaffMapper.deleteBypid(projectTask1.getId());
  677. }else{
  678. projectTaskMapper.insert(projectTask);
  679. }
  680. if (e.getStaffIds()!=null){
  681. String[] split = e.getStaffIds().split(",");
  682. StringJoiner joiner = new StringJoiner(",");
  683. Stream<String> stream = Arrays.stream(split);
  684. stream.forEach(e1 -> {
  685. SysUser sysUser = userMapper.selectByKyId(e1);
  686. if (sysUser!=null){
  687. joiner.add(sysUser.getNickName());
  688. ProjectStaff projectStaff = new ProjectStaff();
  689. projectStaff.setPid(projectTask.getId());
  690. projectStaff.setAid(sysUser.getUserId());
  691. projectStaff.setName(joiner.toString());
  692. projectStaffMapper.insert(projectStaff);
  693. }
  694. });
  695. projectTask.setStaffName(joiner.toString());
  696. }
  697. projectTaskMapper.updateByPrimaryKey(projectTask);
  698. });
  699. }
  700. private void pushAddUser(List<pushDataUser> listUser) {
  701. //获取未获取到上级的数据
  702. List<SysUser> notSuperList = new ArrayList<>();
  703. List<SysUser> allUserList = new ArrayList<>();
  704. listUser.stream().forEach(e -> {
  705. SysUser sysUser = new SysUser();
  706. sysUser.setUserName(e.getUserName());
  707. sysUser.setNickName(e.getNickName());
  708. sysUser.setKyId(e.getKyId());
  709. sysUser.setKySuperId(e.getKySuperId());
  710. if (e.getKyDeptId()!=null){
  711. SysDept sysDept = sysDeptMapper.selectByKyId(e.getKyDeptId());
  712. if (sysDept==null){
  713. throw new RuntimeException(String.format("部门[",e.getKyDeptId(),"]不存在"));
  714. }
  715. sysUser.setDeptId(sysDept.getDeptId());
  716. }
  717. //如果系统已经存在则修改
  718. SysUser sysUser2 = userMapper.selectByKyId(e.getKyId());
  719. if (sysUser2!=null){
  720. sysUser.setUserId(sysUser2.getUserId());
  721. userMapper.updateUser(sysUser);
  722. }else {
  723. sysUser.setPassword(SecurityUtils.encryptPassword("123456"));
  724. sysUser.setStatus("0");
  725. sysUser.setDelFlag("0");
  726. SysUser sysUser1 = userMapper.selectByKyId(e.getKySuperId());
  727. if (sysUser1==null){
  728. userMapper.insertUser(sysUser);
  729. notSuperList.add(sysUser);
  730. }else {
  731. sysUser.setSuperiorId(sysUser1.getUserId());
  732. userMapper.insertUser(sysUser);
  733. allUserList.add(sysUser);
  734. }
  735. }
  736. });
  737. //处理没有找到上级的账户
  738. if (!notSuperList.isEmpty()){
  739. notSuperList.stream().forEach(e -> {
  740. SysUser sysUser1 = userMapper.selectByKyId(e.getKySuperId());
  741. if (sysUser1!=null){
  742. e.setSuperiorId(sysUser1.getUserId());
  743. }
  744. userMapper.updateUser(e);
  745. });
  746. }
  747. //设置人员角色
  748. List<SysUserRole> roleList = new ArrayList<>();
  749. for (SysUser sysUser : allUserList) {
  750. SysUserRole sysUserRole = new SysUserRole();
  751. sysUserRole.setUserId(sysUser.getUserId());
  752. sysUserRole.setRoleId(2l);
  753. roleList.add(sysUserRole);
  754. }
  755. //每50个执行一次批量新增
  756. int maxSize = 50;
  757. if (!roleList.isEmpty()){
  758. if (roleList.size() > maxSize){
  759. for (int i = 0; i < roleList.size(); i += maxSize) {
  760. int end = Math.min(i + maxSize, roleList.size());
  761. List<SysUserRole> list = roleList.subList(i, end);
  762. sysUserRoleMapper.batchUserRole(list);
  763. }
  764. }else {
  765. sysUserRoleMapper.batchUserRole(roleList);
  766. }
  767. }
  768. }
  769. private void pushAddUserRole(List<SysUser> allUserList) {
  770. }
  771. private Long pushAddDep(List<pushDataDep> listDep, pushDataDep pushDataDep) {
  772. SysDept sysDept1 = sysDeptMapper.selectByusci(pushDataDep.getUsci());
  773. SysDept sysDept = new SysDept();
  774. sysDept.setUsci(pushDataDep.getUsci());
  775. sysDept.setDeptName(pushDataDep.getDeptName());
  776. sysDept.setKyId(pushDataDep.getKyId());
  777. sysDept.setParentId(100l);
  778. sysDept.setAncestors("0,100");
  779. if (pushDataDep.getMaxDuration()!=null){
  780. sysDept.setMaxDuration(pushDataDep.getMaxDuration());
  781. }else {
  782. sysDept.setMaxDuration(8d);
  783. }
  784. if (sysDept1==null){
  785. sysDeptMapper.insertDept(sysDept);
  786. SysDept company = new SysDept();
  787. company.setDeptId(sysDept.getDeptId());
  788. company.setCompanyId(sysDept.getDeptId());
  789. company.setCompanyName(sysDept.getDeptName());
  790. sysDeptMapper.updateDept(company);
  791. }else {
  792. sysDept.setDeptId(sysDept1.getDeptId());
  793. sysDept.setCompanyId(sysDept.getDeptId());
  794. sysDept.setCompanyName(sysDept.getDeptName());
  795. sysDeptMapper.updateDept(sysDept);
  796. }
  797. pushDep(listDep, pushDataDep.getKyId(),sysDept);
  798. return pushDataDep.getDeptId();
  799. }
  800. /**
  801. *
  802. * @param listDep 所有需要新增部门
  803. * @param kyId 刚新增的部门kyId
  804. * @param pushDataDep 公司
  805. */
  806. private void pushDep(List<pushDataDep> listDep, String kyId, SysDept pushDataDep) {
  807. List<pushDataDep> sp2 = listDep.stream().filter(e ->
  808. Objects.equals(e.getKySuperId(),kyId)).collect(Collectors.toList());
  809. if (sp2.isEmpty()) {
  810. return;
  811. }
  812. SysDept sysDept1 = sysDeptMapper.selectByKyId(kyId);
  813. for (pushDataDep e : sp2) {
  814. SysDept sysDept = new SysDept();
  815. sysDept.setDeptName(e.getDeptName());
  816. sysDept.setKyId(e.getKyId());
  817. sysDept.setCompanyName(pushDataDep.getDeptName());
  818. sysDept.setCompanyId(pushDataDep.getDeptId());
  819. sysDept.setParentId(sysDept1.getDeptId());
  820. sysDept.setAncestors(sysDept1.getAncestors()+","+sysDept1.getDeptId());
  821. //如果存在则覆盖
  822. SysDept useDept = sysDeptMapper.selectByKyId(e.getKyId());
  823. if (useDept!=null){
  824. sysDept.setDeptId(useDept.getDeptId());
  825. sysDeptMapper.updateDept(sysDept);
  826. }else {
  827. sysDeptMapper.insertDept(sysDept);
  828. }
  829. pushDep(listDep, e.getKyId(),pushDataDep);
  830. }
  831. }
  832. }