MesDevicePreventTaskController.java 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486
  1. package com.jeesite.modules.mes.web;
  2. import cn.hutool.core.bean.BeanUtil;
  3. import com.alibaba.fastjson.JSON;
  4. import com.jeesite.common.collect.ListUtils;
  5. import com.jeesite.common.collect.MapUtils;
  6. import com.jeesite.common.config.Global;
  7. import com.jeesite.common.entity.Page;
  8. import com.jeesite.common.lang.DateUtils;
  9. import com.jeesite.common.lang.ObjectUtils;
  10. import com.jeesite.common.lang.StringUtils;
  11. import com.jeesite.common.service.ServiceException;
  12. import com.jeesite.common.utils.excel.ExcelExport;
  13. import com.jeesite.common.utils.excel.ExcelImport;
  14. import com.jeesite.common.utils.excel.annotation.ExcelField;
  15. import com.jeesite.common.validator.ValidatorUtils;
  16. import com.jeesite.common.web.BaseController;
  17. import com.jeesite.modules.file.entity.FileUpload;
  18. import com.jeesite.modules.file.service.FileUploadService;
  19. import com.jeesite.modules.mes.entity.*;
  20. import com.jeesite.modules.mes.entity.excel.ExcelMesDevicePreventTask;
  21. import com.jeesite.modules.mes.resp.CommonResp;
  22. import com.jeesite.modules.mes.service.*;
  23. import com.jeesite.modules.sys.entity.User;
  24. import com.jeesite.modules.sys.utils.UserUtils;
  25. import org.apache.shiro.authz.annotation.Logical;
  26. import org.apache.shiro.authz.annotation.RequiresPermissions;
  27. import org.springframework.beans.factory.annotation.Autowired;
  28. import org.springframework.stereotype.Controller;
  29. import org.springframework.transaction.annotation.Transactional;
  30. import org.springframework.ui.Model;
  31. import org.springframework.validation.annotation.Validated;
  32. import org.springframework.web.bind.annotation.ModelAttribute;
  33. import org.springframework.web.bind.annotation.PostMapping;
  34. import org.springframework.web.bind.annotation.RequestMapping;
  35. import org.springframework.web.bind.annotation.ResponseBody;
  36. import org.springframework.web.multipart.MultipartFile;
  37. import javax.annotation.Resource;
  38. import javax.servlet.http.HttpServletRequest;
  39. import javax.servlet.http.HttpServletResponse;
  40. import javax.validation.ConstraintViolation;
  41. import javax.validation.ConstraintViolationException;
  42. import java.util.ArrayList;
  43. import java.util.List;
  44. import java.util.Map;
  45. /**
  46. * 预防性维修计划Controller
  47. * @author hzd
  48. * @version 2023-08-17
  49. */
  50. @Controller
  51. @RequestMapping(value = "${adminPath}/mes/mesDevicePreventTask")
  52. public class MesDevicePreventTaskController extends BaseController {
  53. @Autowired
  54. private MesDevicePreventTaskService mesDevicePreventTaskService;
  55. @Resource
  56. private FileUploadService fileUploadService;
  57. @Resource
  58. private MesDeviceService mesDeviceService;
  59. @Resource
  60. private MesDevicePreventService mesDevicePreventService;
  61. /**
  62. * 获取数据
  63. */
  64. @ModelAttribute
  65. public MesDevicePreventTask get(String id, boolean isNewRecord) {
  66. return mesDevicePreventTaskService.get(id, isNewRecord);
  67. }
  68. /**
  69. * 查询列表
  70. */
  71. @RequiresPermissions("mes:mesDevicePreventTask:view")
  72. @RequestMapping(value = {"list", ""})
  73. public String list(MesDevicePreventTask mesDevicePreventTask, Model model) {
  74. model.addAttribute("mesDevicePreventTask", mesDevicePreventTask);
  75. return "modules/mes/mesDevicePreventTaskList";
  76. }
  77. /**
  78. * 预防性维护记录(展示全部记录,不按当前用户过滤)
  79. */
  80. @RequiresPermissions("mes:mesDevicePreventTask:view")
  81. @RequestMapping(value = {"mylist", ""})
  82. public String mylist(MesDevicePreventTask mesDevicePreventTask, Model model) {
  83. mesDevicePreventTask.setUserCode(null);
  84. model.addAttribute("mesDevicePreventTask", mesDevicePreventTask);
  85. return "modules/mes/mesDevicePreventTaskMyList";
  86. }
  87. /**
  88. * 查询列表数据
  89. */
  90. @RequiresPermissions("mes:mesDevicePreventTask:view")
  91. @RequestMapping(value = "listData")
  92. @ResponseBody
  93. public Page<MesDevicePreventTask> listData(MesDevicePreventTask mesDevicePreventTask, HttpServletRequest request, HttpServletResponse response) {
  94. mesDevicePreventTask.setPage(new Page<>(request, response));
  95. Page<MesDevicePreventTask> page = mesDevicePreventTaskService.findPage(mesDevicePreventTask);
  96. return page;
  97. }
  98. /**
  99. * 维护计划一级:按批次汇总,一行一份计划
  100. */
  101. @RequiresPermissions("mes:mesDevicePreventTask:view")
  102. @RequestMapping(value = "planListData")
  103. @ResponseBody
  104. public Page<MesDevicePreventTask> planListData(MesDevicePreventTask mesDevicePreventTask, HttpServletRequest request, HttpServletResponse response) {
  105. Page<MesDevicePreventTask> page = new Page<>(request, response);
  106. mesDevicePreventTask.setPage(page);
  107. mesDevicePreventTask.getSqlMap().getOrder().setOrderBy("");
  108. return mesDevicePreventTaskService.findPlanPage(mesDevicePreventTask);
  109. }
  110. /**
  111. * 维护计划二级:某一批次下的各期任务
  112. */
  113. @RequiresPermissions("mes:mesDevicePreventTask:view")
  114. @RequestMapping(value = "planChildData")
  115. @ResponseBody
  116. public Page<MesDevicePreventTask> planChildData(MesDevicePreventTask mesDevicePreventTask, HttpServletRequest request, HttpServletResponse response) {
  117. if (StringUtils.isBlank(mesDevicePreventTask.getBatchId())) {
  118. Page<MesDevicePreventTask> empty = new Page<>(request, response);
  119. empty.setList(new ArrayList<MesDevicePreventTask>());
  120. empty.setCount(0);
  121. return empty;
  122. }
  123. mesDevicePreventTask.setPage(new Page<>(request, response));
  124. mesDevicePreventTask.getSqlMap().getOrder().setOrderBy("a.start_date ASC");
  125. return mesDevicePreventTaskService.findPage(mesDevicePreventTask);
  126. }
  127. /**
  128. * 删除同一批次下的全部周期任务
  129. */
  130. @RequiresPermissions("mes:mesDevicePreventTask:edit")
  131. @RequestMapping(value = "deleteBatch")
  132. @ResponseBody
  133. public String deleteBatch(String batchId) {
  134. if (StringUtils.isBlank(batchId)) {
  135. return renderResult(Global.FALSE, text("未找到维护计划!"));
  136. }
  137. mesDevicePreventTaskService.deleteByBatch(batchId);
  138. return renderResult(Global.TRUE, text("删除维护计划成功!"));
  139. }
  140. /**
  141. * 查看编辑表单
  142. */
  143. @RequiresPermissions("mes:mesDevicePreventTask:view")
  144. @RequestMapping(value = "form")
  145. public String form(MesDevicePreventTask mesDevicePreventTask, Model model) {
  146. model.addAttribute("mesDevicePreventTask", mesDevicePreventTask);
  147. return "modules/mes/mesDevicePreventTaskForm";
  148. }
  149. /**
  150. * 保存数据
  151. * 一条计划可分配多个执行人;允许新增/编辑时增删执行人
  152. * 说明:维护性任务由管理员指派,不校验产线工位操作权限/技能(与上岗扫码场景不同)
  153. */
  154. @RequiresPermissions("mes:mesDevicePreventTask:edit")
  155. @PostMapping(value = "save")
  156. @ResponseBody
  157. @Transactional
  158. public String save(@Validated MesDevicePreventTask mesDevicePreventTask) {
  159. MesDevice mesDevice = new MesDevice();
  160. mesDevice.setTreeCode(mesDevicePreventTask.getDeviceId());
  161. MesDevice mesDevice1 = mesDeviceService.getByEntity(mesDevice);
  162. if (ObjectUtils.isEmpty(mesDevice1)) {
  163. return renderResult(Global.FALSE, text("保存失败,设备不存在!"));
  164. }
  165. List<String> userCodes = parseUserCodes(mesDevicePreventTask.getUserCode());
  166. if (userCodes.isEmpty()) {
  167. return renderResult(Global.FALSE, text("请选择执行人员!"));
  168. }
  169. // 新增且填写了周期:按首保时间到结束时间循环生成多条计划
  170. if (mesDevicePreventTask.getIsNewRecord() && mesDevicePreventTask.getCycleDays() != null) {
  171. if (mesDevicePreventTask.getCycleDays() <= 0) {
  172. return renderResult(Global.FALSE, text("周期必须大于0,单位为天!"));
  173. }
  174. try {
  175. int count = mesDevicePreventTaskService.saveRecurringWithAssignees(
  176. mesDevicePreventTask, userCodes, mesDevicePreventTask.getCycleDays());
  177. return renderResult(Global.TRUE, text("保存预防性维修计划成功!共生成 " + count + " 条。"));
  178. } catch (ServiceException ex) {
  179. return renderResult(Global.FALSE, text(ex.getMessage()));
  180. }
  181. }
  182. mesDevicePreventTaskService.saveWithAssignees(mesDevicePreventTask, userCodes);
  183. return renderResult(Global.TRUE, text("保存预防性维修计划成功!"));
  184. }
  185. /**
  186. * 解析多选执行人(过滤机构节点,仅保留用户)
  187. */
  188. private List<String> parseUserCodes(String userCodeStr) {
  189. List<String> result = new ArrayList<>();
  190. String[] userCodes = StringUtils.split(StringUtils.trim(userCodeStr), ",");
  191. if (userCodes == null) {
  192. return result;
  193. }
  194. for (String code : userCodes) {
  195. String userCode = StringUtils.trim(code);
  196. if (StringUtils.isBlank(userCode)) {
  197. continue;
  198. }
  199. User user = UserUtils.get(userCode);
  200. if (user == null || StringUtils.isBlank(user.getUserCode())) {
  201. continue;
  202. }
  203. String realCode = user.getUserCode();
  204. if (!result.contains(realCode)) {
  205. result.add(realCode);
  206. }
  207. }
  208. return result;
  209. }
  210. /**
  211. * 删除数据
  212. */
  213. @RequiresPermissions("mes:mesDevicePreventTask:edit")
  214. @RequestMapping(value = "delete")
  215. @ResponseBody
  216. public String delete(MesDevicePreventTask mesDevicePreventTask) {
  217. mesDevicePreventTaskService.delete(mesDevicePreventTask);
  218. return renderResult(Global.TRUE, text("删除预防性维修计划成功!"));
  219. }
  220. /**
  221. * 查看编辑表单
  222. */
  223. @RequiresPermissions("mes:mesDevicePreventTask:view")
  224. @RequestMapping(value = "deal")
  225. public String deal(MesDevicePreventTask mesDevicePreventTask, Model model) {
  226. model.addAttribute("mesDevicePreventTask", mesDevicePreventTask);
  227. return "modules/mes/mesDevicePreventTaskDeal";
  228. }
  229. @RequiresPermissions("mes:mesDevicePreventTask:view")
  230. @RequestMapping(value = "mydeal")
  231. public String mydeal(MesDevicePreventTask mesDevicePreventTask, Model model) {
  232. model.addAttribute("mesDevicePreventTask", mesDevicePreventTask);
  233. // 获取检查清单
  234. MesDevicePrevent mesDevicePrevent = mesDevicePreventService.get(mesDevicePreventTask.getPreventId());
  235. model.addAttribute("mesDevicePrevent", mesDevicePrevent);
  236. return "modules/mes/mesDevicePreventTaskMyDeal";
  237. }
  238. @RequiresPermissions("mes:mesDevicePreventTask:view")
  239. @RequestMapping(value = "info")
  240. public String info(MesDevicePreventTask mesDevicePreventTask, Model model) {
  241. model.addAttribute("mesDevicePreventTask", mesDevicePreventTask);
  242. // 获取检查清单
  243. MesDevicePrevent mesDevicePrevent = mesDevicePreventService.get(mesDevicePreventTask.getPreventId());
  244. model.addAttribute("mesDevicePrevent", mesDevicePrevent);
  245. return "modules/mes/mesDevicePreventTaskInfo";
  246. }
  247. /**
  248. * 保存处理结果(Web/PDA共用)
  249. * 入参出参保持不变:任一执行人完成即整单完成,并记录实际完成人
  250. */
  251. @RequiresPermissions(value={"mes:mesDevicePreventTask:deal", "mes:mesDevicePreventTask:api"}, logical= Logical.OR)
  252. @PostMapping(value = "dealsave")
  253. @ResponseBody
  254. public String dealsave(@Validated MesDevicePreventTask mesDevicePreventTask,HttpServletRequest request) {
  255. // 以数据库状态为准,避免重复提交
  256. MesDevicePreventTask dbTask = mesDevicePreventTaskService.get(new MesDevicePreventTask(mesDevicePreventTask.getId()));
  257. if(dbTask == null || dbTask.getState() == null || !dbTask.getState().equals("0")){
  258. return renderResult(Global.TRUE, text("该记录已处理!"));
  259. }
  260. // 兼容接口
  261. List<MesDeviceConsumableRecord> consumable = JSON.parseArray(request.getParameter("consumable"),MesDeviceConsumableRecord.class);
  262. if(consumable!=null && consumable.size() >0){
  263. for (MesDeviceConsumableRecord mesDeviceConsumableRecord : consumable){
  264. if(StringUtils.isEmpty(mesDeviceConsumableRecord.getConsumableId())){
  265. return renderResult(Global.FALSE, text("参数错误!"));
  266. }
  267. if(mesDeviceConsumableRecord.getNum() <= 0){
  268. return renderResult(Global.FALSE, text("易耗品数量必须大于0!"));
  269. }
  270. }
  271. mesDevicePreventTask.setMesDeviceConsumableRecordList(consumable);
  272. }
  273. User user = UserUtils.getUser();
  274. // 多执行人:当前用户在关系表中即可处理(不再要求等于主表单个 userCode)
  275. if(!mesDevicePreventTaskService.canDeal(mesDevicePreventTask.getId(), user.getUserCode())){
  276. return renderResult(Global.TRUE, text("无权限操作!"));
  277. }
  278. // 完成时保留原执行人冗余字段,仅更新完成人与状态
  279. mesDevicePreventTask.setUserCode(dbTask.getUserCode());
  280. mesDevicePreventTask.setFinishUserCode(user.getUserCode());
  281. mesDevicePreventTask.setState("1");
  282. mesDevicePreventTaskService.save(mesDevicePreventTask);
  283. return renderResult(Global.TRUE, text("保存预防性维修计划成功!"));
  284. }
  285. /**
  286. * PDA:我的计划列表(入参出参不变,内部改为按关系表过滤)
  287. */
  288. @RequiresPermissions("mes:mesDevicePreventTask:api")
  289. @RequestMapping(value = "ulist")
  290. @ResponseBody
  291. public CommonResp ulist(MesDevicePreventTask mesDevicePreventTask, HttpServletRequest request, HttpServletResponse response) {
  292. CommonResp<Page> resp = new CommonResp<>();
  293. User user = UserUtils.getUser();
  294. mesDevicePreventTaskService.applyAssigneeFilter(mesDevicePreventTask, user.getUserCode());
  295. mesDevicePreventTask.setPage(new Page<>(request, response));
  296. Page<MesDevicePreventTask> page = mesDevicePreventTaskService.findPage(mesDevicePreventTask);
  297. resp.setData(page);
  298. resp.setResult(Global.TRUE);
  299. return resp;
  300. }
  301. /**
  302. * PDA:计划详情(入参出参结构不变;userName 改为多人逗号拼接)
  303. */
  304. @RequiresPermissions("mes:mesDevicePreventTask:api")
  305. @RequestMapping(value = "detail")
  306. @ResponseBody
  307. public CommonResp detail(MesDevicePreventTask mesDevicePreventTask, HttpServletRequest req) {
  308. String host = req.getScheme() + "://" + req.getServerName() + ":" + req.getServerPort() + "/js";
  309. Map<String, Object> map = MapUtils.newHashMap();
  310. // 获取图片
  311. FileUpload fu = new FileUpload();
  312. fu.setBizKey(mesDevicePreventTask.getId());
  313. fu.setBizType("mesDevicePreventTask_image");
  314. List<FileUpload> imgs = fileUploadService.findList(fu);
  315. List imgList = ListUtils.newArrayList();
  316. if(imgs.size() > 0){
  317. for (FileUpload fi:imgs) {
  318. Map<String, Object> map1 = MapUtils.newHashMap();
  319. map1.put("id",fi.getFileEntity().getFileId());
  320. map1.put("url",host + fi.getFileUrl());
  321. imgList.add(map1);
  322. }
  323. }
  324. map.put("imgs", imgList);
  325. // userName 已在 get/find 中按多人填充;此处兜底保证不为空
  326. if (StringUtils.isBlank(mesDevicePreventTask.getUserName())
  327. && StringUtils.isNotBlank(mesDevicePreventTask.getUserCode())) {
  328. String[] codes = StringUtils.split(mesDevicePreventTask.getUserCode(), ",");
  329. List<String> names = new ArrayList<>();
  330. if (codes != null) {
  331. for (String code : codes) {
  332. String uc = StringUtils.trim(code);
  333. if (StringUtils.isBlank(uc)) {
  334. continue;
  335. }
  336. User u = UserUtils.get(uc);
  337. names.add(u != null && StringUtils.isNotBlank(u.getUserName()) ? u.getUserName() : uc);
  338. }
  339. }
  340. mesDevicePreventTask.setUserName(StringUtils.join(names, ","));
  341. }
  342. map.put("info", mesDevicePreventTask);
  343. // 获取检查清单
  344. MesDevicePrevent mesDevicePrevent = mesDevicePreventService.get(mesDevicePreventTask.getPreventId());
  345. map.put("prevent", mesDevicePrevent);
  346. CommonResp<Map<String, Object>> resp = new CommonResp<>();
  347. resp.setData(map);
  348. resp.setResult(Global.TRUE);
  349. return resp;
  350. }
  351. /**
  352. * 导出数据
  353. */
  354. @RequestMapping(value = "exportData")
  355. public void exportData(MesDevicePreventTask mesDevicePreventTask, HttpServletResponse response) {
  356. List<MesDevicePreventTask> list = mesDevicePreventTaskService.findList(mesDevicePreventTask);
  357. String fileName = "预防性维修计划" + DateUtils.getDate("yyyyMMddHHmmss") + ".xlsx";
  358. try(ExcelExport ee = new ExcelExport("预防性维修计划", MesDevicePreventTask.class)){
  359. ee.setDataList(list).write(response, fileName);
  360. }
  361. }
  362. /**
  363. * 导出数据(预防性维护记录,不按当前用户过滤)
  364. */
  365. @RequestMapping(value = "exportData2")
  366. public void exportData2(MesDevicePreventTask mesDevicePreventTask, HttpServletResponse response) {
  367. List<MesDevicePreventTask> list = mesDevicePreventTaskService.findList(mesDevicePreventTask);
  368. List<ExcelMesDevicePreventTask> list1 = BeanUtil.copyToList(list, ExcelMesDevicePreventTask.class);
  369. String fileName = "预防性维护记录" + DateUtils.getDate("yyyyMMddHHmmss") + ".xlsx";
  370. try(ExcelExport ee = new ExcelExport("预防性维护记录", ExcelMesDevicePreventTask.class)){
  371. ee.setDataList(list1).write(response, fileName);
  372. }
  373. }
  374. /**
  375. * 下载模板
  376. */
  377. @RequestMapping(value = "importTemplate")
  378. public void importTemplate(HttpServletResponse response) {
  379. MesDevicePreventTask mesDeviceCate = new MesDevicePreventTask();
  380. List<MesDevicePreventTask> list = ListUtils.newArrayList(mesDeviceCate);
  381. String fileName = "预防性维修计划.xlsx";
  382. try(ExcelExport ee = new ExcelExport("预防性维修计划", MesDevicePreventTask.class, ExcelField.Type.IMPORT)){
  383. ee.setDataList(list).write(response, fileName);
  384. }
  385. }
  386. /**
  387. * 导入数据
  388. */
  389. @ResponseBody
  390. @PostMapping(value = "importData")
  391. public String importData(MultipartFile file) {
  392. try {
  393. String message = importData1(file);
  394. return renderResult(Global.TRUE, "posfull:"+message);
  395. } catch (Exception ex) {
  396. return renderResult(Global.FALSE, "posfull:"+ex.getMessage());
  397. }
  398. }
  399. @Transactional
  400. public String importData1(MultipartFile file) {
  401. if (file == null){
  402. throw new ServiceException(text("请选择导入的数据文件!"));
  403. }
  404. int successNum = 0; int failureNum = 0;
  405. StringBuilder successMsg = new StringBuilder();
  406. StringBuilder failureMsg = new StringBuilder();
  407. try(ExcelImport ei = new ExcelImport(file, 2, 0)){
  408. List<MesDevicePreventTask> list = ei.getDataList(MesDevicePreventTask.class);
  409. for (MesDevicePreventTask mesDeviceCheck : list) {
  410. try{
  411. ValidatorUtils.validateWithException(mesDeviceCheck);
  412. this.save(mesDeviceCheck);
  413. successNum++;
  414. successMsg.append("<br/>" + successNum + "、编号 " + mesDeviceCheck.getId() + " 导入成功");
  415. } catch (Exception e) {
  416. failureNum++;
  417. String msg = "<br/>" + failureNum + "、编号 " + mesDeviceCheck.getId() + " 导入失败:";
  418. if (e instanceof ConstraintViolationException){
  419. ConstraintViolationException cve = (ConstraintViolationException)e;
  420. for (ConstraintViolation<?> violation : cve.getConstraintViolations()) {
  421. msg += Global.getText(violation.getMessage()) + " ("+violation.getPropertyPath()+")";
  422. }
  423. }else{
  424. msg += e.getMessage();
  425. }
  426. failureMsg.append(msg);
  427. logger.error(msg, e);
  428. }
  429. }
  430. } catch (Exception e) {
  431. logger.error(e.getMessage(), e);
  432. failureMsg.append(e.getMessage());
  433. return failureMsg.toString();
  434. }
  435. if (failureNum > 0) {
  436. failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
  437. throw new ServiceException(failureMsg.toString());
  438. }else{
  439. successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
  440. }
  441. return successMsg.toString();
  442. }
  443. }