ProjectTaskServiceImpl.java 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417
  1. package com.ruoyi.project.service.impl;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.ruoyi.common.core.domain.AjaxResult;
  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.project.bo.ProjectListInput;
  15. import com.ruoyi.project.bo.ProjectTaskListOut;
  16. import com.ruoyi.project.bo.ProjectTaskOut;
  17. import com.ruoyi.project.domain.ProjectStaff;
  18. import com.ruoyi.project.domain.ProjectStaffRecord;
  19. import com.ruoyi.project.domain.ProjectTask;
  20. import com.ruoyi.project.mapper.ProjectStaffMapper;
  21. import com.ruoyi.project.mapper.ProjectStaffRecordMapper;
  22. import com.ruoyi.project.mapper.ProjectTaskMapper;
  23. import com.ruoyi.project.service.ProjectTaskService;
  24. import com.ruoyi.system.mapper.SysUserMapper;
  25. import com.ruoyi.system.service.ISysDeptService;
  26. import org.slf4j.Logger;
  27. import org.slf4j.LoggerFactory;
  28. import org.springframework.beans.factory.annotation.Autowired;
  29. import org.springframework.http.HttpStatus;
  30. import org.springframework.stereotype.Service;
  31. import org.springframework.transaction.annotation.Transactional;
  32. import javax.servlet.http.HttpServletResponse;
  33. import javax.validation.Validator;
  34. import java.io.ByteArrayOutputStream;
  35. import java.util.*;
  36. import java.util.zip.ZipOutputStream;
  37. import static java.lang.Thread.sleep;
  38. @Service
  39. public class ProjectTaskServiceImpl implements ProjectTaskService {
  40. private static final Logger log = LoggerFactory.getLogger(ProjectTaskServiceImpl.class);
  41. @Autowired
  42. private ProjectTaskMapper projectTaskMapper;
  43. @Autowired
  44. private ProjectStaffMapper projectStaffMapper;
  45. @Autowired
  46. private ISysDeptService deptService;
  47. @Autowired
  48. private Validator validator;
  49. @Autowired
  50. private SysUserMapper userMapper;
  51. @Autowired
  52. private ProjectStaffRecordMapper projectStaffRecordMapper;
  53. @Autowired
  54. private TianheService tianheService;
  55. @Override
  56. public AjaxResult addProjectTask(ProjectTask projectTask) {
  57. userMapper.updateUserProjectSum(projectTask.getAid(),0);
  58. projectTask.setCreateAid(SecurityUtils.getUserId());
  59. int i = projectTaskMapper.insertSelective(projectTask);
  60. if (StringUtils.isNotBlank(projectTask.getStaffObject())){
  61. String[] split = projectTask.getStaffObject().split(",");
  62. projectStaffMapper.updatePidByList(projectTask.getId(),split);
  63. projectTaskMapper.updateStaffName(projectTask.getId());
  64. }
  65. return AjaxResult.success(i);
  66. }
  67. @Override
  68. public AjaxResult deleteProject(ProjectTask in) {
  69. int i = projectTaskMapper.deleteByPrimaryKey(in.getId());
  70. userMapper.updateUserProjectSum(in.getAid(),0);
  71. if (i>0){
  72. projectStaffMapper.deleteBypid(in.getId());
  73. return AjaxResult.success();
  74. }
  75. return AjaxResult.error("项目编号不存在");
  76. }
  77. @Override
  78. public AjaxResult details(Long id) {
  79. ProjectTask projectTask = projectTaskMapper.selectByPrimaryKey(id);
  80. ProjectTaskOut out= new ProjectTaskOut();
  81. if (projectTask!=null){
  82. BeanUtils.copyBeanProp(out, projectTask);
  83. List<ProjectStaff> projectStaffs = projectStaffMapper.selectByPid(id);
  84. if (!projectStaffs.isEmpty())out.setList(projectStaffs);
  85. return AjaxResult.success(out);
  86. }
  87. return AjaxResult.error("项目不存在");
  88. }
  89. @Override
  90. public List<ProjectTaskListOut> list(ProjectListInput in) {
  91. pushRoleType(in);
  92. if (!SecurityUtils.isSuperAdmin()){
  93. in.setUid(SecurityUtils.getUserId());
  94. Long companyId = deptService.selectCompanyByDeptId();
  95. if (companyId!=null)in.setCompanyId(companyId);
  96. }
  97. if (in.getMyCreate()!=null&&in.getMyCreate()==1){
  98. in.setCreateAid(SecurityUtils.getUserId());
  99. }
  100. if (in.getEndTime()!=null)in.setEndTime(in.getEndTime()+" 23:59:59");
  101. PageUtils.startPage();
  102. return projectTaskMapper.selectList(in);
  103. }
  104. private void pushRoleType(ProjectListInput in) {
  105. if (in.getRoleType()==null){
  106. if (SecurityUtils.hashRoles(UserRolesType.CEO.getCode())){
  107. in.setRoleType(1);
  108. }else if (SecurityUtils.hashRoles(UserRolesType.ADMIN.getCode())){
  109. in.setRoleType(3);
  110. }else if (SecurityUtils.hashRoles(UserRolesType.MANAGE.getCode())){
  111. in.setRoleType(2);
  112. }else {
  113. in.setRoleType(0);
  114. }
  115. }
  116. }
  117. @Override
  118. public String importProject(List<ProjectTaskListOut> list, boolean updateSupport, String operName) {
  119. if (StringUtils.isNull(list) || list.size() == 0)
  120. {
  121. throw new ServiceException("导入用户数据不能为空!");
  122. }
  123. int successNum = 0;
  124. int failureNum = 0;
  125. StringBuilder successMsg = new StringBuilder();
  126. StringBuilder failureMsg = new StringBuilder();
  127. Long company = deptService.selectCompanyByDeptId();
  128. List<Long> pids = new ArrayList<Long>();
  129. for (ProjectTaskListOut p : list)
  130. {
  131. try
  132. {
  133. if (p.getProjectYear()==null||p.getProjectYear()==""){
  134. throw new ServiceException("项目年份不能为空");
  135. }else if (p.getCreateYear()==null||p.getCreateYear()==""){
  136. throw new ServiceException("创建年份不能为空");
  137. }
  138. // 验证是否存在这个用户
  139. ProjectTask projectTask = projectTaskMapper.selectByProjectNumber(p.getProjectNumber(),company);
  140. if (StringUtils.isNull(projectTask)){
  141. BeanValidators.validateWithException(validator, p);
  142. if (checkProjectNumber(p)){
  143. throw new ServiceException(String.format("项目编号[%s]已存在", p.getProjectNumber()));
  144. }
  145. if(StringUtils.isNotBlank(p.getAdminName())) {
  146. SysUser sysUser = userMapper.selectByNikeName(p.getAdminName(),company);
  147. if (sysUser == null) {
  148. throw new ServiceException(String.format("负责人[%s]不存在", p.getAdminName()));
  149. }
  150. p.setAid(sysUser.getUserId());
  151. p.setAdminName(sysUser.getNickName());
  152. }
  153. p.setProjectStatus(0);
  154. projectTaskMapper.insertSelective(p);
  155. pushProjectStaffName(p, company);
  156. successNum++;
  157. successMsg.append("<br/>" + successNum + "、项目: " + p.getName() + " 导入成功");
  158. }else if (updateSupport){
  159. BeanValidators.validateWithException(validator, p);
  160. p.setId(projectTask.getId());
  161. if(StringUtils.isNotBlank(p.getStaffName())) {
  162. addStaffAndDelete( p);
  163. }
  164. if (p.getAdminName()!=null&&!projectTask.getAdminName().equals(p.getAdminName())){
  165. SysUser sysUser = userMapper.selectByNikeName(p.getAdminName(),company);
  166. if (sysUser == null) {
  167. throw new ServiceException(String.format("负责人[%s]不存在", p.getAdminName()));
  168. }
  169. List<ProjectStaffRecord> projectStaffRecords = projectStaffRecordMapper.selectByPidAndAid(p.getId(), projectTask.getAid());
  170. if (projectStaffRecords.size()>0){
  171. throw new ServiceException(String.format("负责人[%s]存在打卡,不允许切换.", projectTask.getAdminName()));
  172. }
  173. p.setAid(sysUser.getUserId());
  174. p.setAdminName(sysUser.getNickName());
  175. }
  176. projectTaskMapper.updateByPrimaryKeySelective(p);
  177. if (!pids.contains(p.getId())){
  178. pids.add(p.getId());
  179. }
  180. successNum++;
  181. successMsg.append("<br/>" + successNum + "、项目: " + projectTask.getName() + " 更新成功");
  182. }
  183. else
  184. {
  185. failureNum++;
  186. failureMsg.append("<br/>" + failureNum + "、项目: " + projectTask.getName() + " 已存在");
  187. }
  188. }
  189. catch (Exception e)
  190. {
  191. failureNum++;
  192. String msg = "<br/>" + failureNum + "、项目: " + p.getName() + " 导入失败:";
  193. failureMsg.append(msg + e.getMessage());
  194. log.error(msg, e);
  195. }
  196. }
  197. if (failureNum > 0)
  198. {
  199. failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
  200. throw new ServiceException(failureMsg.toString());
  201. }
  202. else
  203. {
  204. successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
  205. }
  206. if (!pids.isEmpty()){
  207. for (Long pid : pids) {
  208. projectStaffRecordMapper.updateSumDurationProject(pid);
  209. projectStaffRecordMapper.updateSumDurationStaff(pid);
  210. }
  211. }
  212. return successMsg.toString();
  213. }
  214. private void pushProjectStaffName(ProjectTaskListOut p, Long company) {
  215. if(StringUtils.isNotBlank(p.getStaffName())) {
  216. String[] split = StringUtils.splitString(p.getStaffName());
  217. for (String s : split) {
  218. ProjectStaff newPs = new ProjectStaff();
  219. SysUser sysUser = userMapper.selectByNikeName(s, company);
  220. if (sysUser == null) {
  221. throw new ServiceException("[" + s + "]不存在");
  222. }
  223. newPs.setAid(sysUser.getUserId());
  224. newPs.setName(sysUser.getNickName());
  225. newPs.setPid(p.getId());
  226. projectStaffMapper.insertSelective(newPs);
  227. }
  228. }
  229. projectTaskMapper.updateStaffName(p.getId());
  230. }
  231. @Override
  232. public AjaxResult updateProjectTask(ProjectTask in) {
  233. ProjectTask use = projectTaskMapper.selectByPrimaryKey(in.getId());
  234. if (!in.getAid().equals(use.getAid())){
  235. List<ProjectStaffRecord> projectStaffRecords = projectStaffRecordMapper.selectByPidAndAid(in.getId(), use.getAid());
  236. if (projectStaffRecords.size()>0){
  237. throw new ServiceException(String.format("负责人[%s]存在打卡,不允许切换.", use.getAdminName()));
  238. }
  239. }
  240. return AjaxResult.success(projectTaskMapper.updateByPrimaryKeySelective(in));
  241. }
  242. @Override
  243. public AjaxResult selectProjectImg(Long pid) {
  244. return AjaxResult.success(projectTaskMapper.selectProjectImg(pid));
  245. }
  246. @Override
  247. public boolean checkProjectNumber(ProjectTask projectTask) {
  248. Long companyId = deptService.selectCompanyByDeptId();
  249. ProjectTask projectTask1 = projectTaskMapper.selectByProjectNumber(projectTask.getProjectNumber(),companyId);
  250. if (projectTask.getId()==null){
  251. if (projectTask1!=null){
  252. return true;
  253. }
  254. }else {
  255. if (projectTask1!=null&&!projectTask.getId().equals(projectTask1.getId())){
  256. return true;
  257. }
  258. }
  259. return false;
  260. }
  261. private void addStaffAndDelete( ProjectTaskListOut p) {
  262. String[] split = p.getStaffName().split(",");
  263. List<ProjectStaff> projectStaffs = projectStaffMapper.selectByPid(p.getId());
  264. deleteStaff( split, projectStaffs);
  265. addStaff( p, split, projectStaffs);
  266. //再从新获取统计名字
  267. projectTaskMapper.updateStaffName(p.getId());
  268. }
  269. private void deleteStaff( String[] split, List<ProjectStaff> projectStaffs) {
  270. //预设需要删除,如果找到相同名字的就无需删除
  271. for (ProjectStaff ps : projectStaffs) {
  272. boolean flag = true;
  273. for (String s : split) {
  274. s=s.trim();
  275. if (ps.getName().equals(s)) {
  276. flag = false;
  277. }
  278. }
  279. if (flag) {
  280. int sum = projectStaffRecordMapper.selectById(ps.getId());
  281. if (sum > 0) {
  282. throw new ServiceException("[" + ps.getName() + "]存在打卡不能删除");
  283. }
  284. projectStaffMapper.deleteByPrimaryKey(ps.getId());
  285. }
  286. }
  287. }
  288. private void addStaff( ProjectTaskListOut p, String[] split, List<ProjectStaff> projectStaffs) {
  289. Long company = deptService.selectCompanyByDeptId();
  290. for (String s : split) {
  291. s=s.trim();
  292. boolean flag = true;
  293. for (ProjectStaff ps : projectStaffs) {
  294. if (ps.getName().equals(s)) {
  295. flag = false;
  296. }
  297. }
  298. if (flag) {
  299. ProjectStaff newPs = new ProjectStaff();
  300. SysUser sysUser = userMapper.selectByNikeName(s,company);
  301. if (sysUser == null) {
  302. throw new ServiceException("[" + s + "]不存在");
  303. }
  304. newPs.setAid(sysUser.getUserId());
  305. newPs.setName(sysUser.getNickName());
  306. newPs.setPid(p.getId());
  307. projectStaffMapper.insertSelective(newPs);
  308. }
  309. }
  310. }
  311. @Override
  312. @Transactional
  313. public void saveText(String ids) {
  314. String[] split = ids.split(",");
  315. try {
  316. for (String id : split) {
  317. saveProjectText(Long.valueOf(id));
  318. Thread.sleep(1000);
  319. }
  320. } catch (InterruptedException e) {
  321. throw new RuntimeException("上链异常,请稍后再试");
  322. }
  323. }
  324. public void saveProjectText(Long id) throws InterruptedException {
  325. ProjectTask projectTask = projectTaskMapper.selectByPrimaryKey(id);
  326. List<ProjectStaffRecord> projectStaffRecords = projectStaffRecordMapper.selectByPidAndAid(id, null);
  327. Map<String,Object> map=new HashMap<>();
  328. map.put("projectTask",projectTask);
  329. map.put("projectStaffRecords",projectStaffRecords);
  330. map.put("date", DateUtils.getTime());
  331. String json = JSONObject.toJSONString(map);
  332. String address = getAddress();
  333. String operateId = DateUtils.dateTimeNow();
  334. String s = tianheService.seveText(address, json, operateId);
  335. JSONObject res = JSONObject.parseObject(s);
  336. Integer code = (Integer) res.get("code");
  337. String tianheCloudUrl=null;
  338. if (code== HttpStatus.OK.value()){
  339. sleep(1000);
  340. String certificate = tianheService.getCertificate(address, operateId);
  341. JSONObject certificateData = JSONObject.parseObject(certificate);
  342. String tianheCloudId=res.getString("data");
  343. log.debug(certificateData.toJSONString());
  344. tianheCloudUrl=certificateData.getString("data");
  345. if (tianheCloudUrl!=null){
  346. projectTask.setTianheUrl(tianheCloudId);
  347. projectTaskMapper.updateByPrimaryKey(projectTask);
  348. }
  349. }
  350. }
  351. private String getAddress() {
  352. String address = null;
  353. SysUser user = SecurityUtils.getLoginUser().getUser();
  354. if (user.getTianheId()==null){
  355. SysUser sysUser = userMapper.selectUserById(user.getUserId());
  356. if (sysUser.getTianheId()==null){
  357. try {
  358. String userId=user.getUserId().toString();
  359. String s = tianheService.addUser( userId, "123456");
  360. JSONObject jsonObject = JSONObject.parseObject(s);
  361. JSONObject data = (JSONObject) jsonObject.get("data");
  362. JSONObject pubKey = (JSONObject) data.get("pubKey");
  363. address= (String) pubKey.get("address");
  364. }catch (Exception e ){
  365. log.error("天河账号创建失败!");
  366. throw new RuntimeException("天河账号创建失败");
  367. }
  368. if (address!=null){
  369. user.setTianheId(address);
  370. userMapper.updateUser(user);
  371. }
  372. }else {
  373. address = sysUser.getTianheId();
  374. }
  375. }else {
  376. address = user.getTianheId();
  377. }
  378. if (address==null){
  379. throw new ServiceException("天河账号不存在,请稍后再试");
  380. }
  381. return address;
  382. }
  383. }