package com.ruoyi.inspect.service.impl; import cn.hutool.core.bean.BeanUtil; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.support.ExcelTypeEnum; import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.core.domain.Result; import com.ruoyi.common.core.domain.entity.SysDictData; import com.ruoyi.common.enums.ContractType; import com.ruoyi.common.numgen.NumberGenerator; import com.ruoyi.common.oa.OAProcess; import com.ruoyi.common.oa.OAProperty; import com.ruoyi.common.oa.OAResult; import com.ruoyi.common.utils.QueryWrappers; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.bean.BeanUtils; import com.ruoyi.framework.exception.ErrorException; import com.ruoyi.inspect.dto.PushOADto; import com.ruoyi.inspect.dto.UnqualifiedHandlerDto; import com.ruoyi.inspect.excel.InsUnqualifiedHandlerExcelData; import com.ruoyi.inspect.mapper.InsOrderMapper; import com.ruoyi.inspect.mapper.InsSampleMapper; import com.ruoyi.inspect.mapper.InsUnqualifiedHandlerMapper; import com.ruoyi.inspect.pojo.CommonOa; import com.ruoyi.inspect.pojo.InsOrder; import com.ruoyi.inspect.pojo.InsUnqualifiedHandler; import com.ruoyi.inspect.pojo.InsUnqualifiedHandlerFile; import com.ruoyi.inspect.service.CommonOaService; import com.ruoyi.inspect.service.InsOrderService; import com.ruoyi.inspect.service.InsUnqualifiedHandlerFileService; import com.ruoyi.inspect.service.InsUnqualifiedHandlerService; import com.ruoyi.inspect.vo.UnqualifiedHandlerVO; import com.ruoyi.system.service.ISysDictTypeService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Isolation; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; /** * @author 27233 * @description 针对表【ins_unqualified_handler(不合格处理表)】的数据库操作Service实现 * @createDate 2024-07-31 13:38:14 */ @Service @Slf4j public class InsUnqualifiedHandlerServiceImpl extends ServiceImpl implements InsUnqualifiedHandlerService { @Resource private CommonOaService commonOaService; @Resource private OAProperty oaProperty; @Resource private InsUnqualifiedHandlerFileService insUnqualifiedHandlerFileService; @Resource private InsSampleMapper insSampleMapper; @Resource private ISysDictTypeService sysDictTypeService; @Resource private NumberGenerator insUnqualifiedHandlerNumberGenerator; @Override public IPage pageList(Page page, UnqualifiedHandlerDto unqualifiedHandlerDto) { String feedbackStartDate = unqualifiedHandlerDto.getFeedbackStartTime(); String feedbackEndDate = unqualifiedHandlerDto.getFeedbackEndTime(); unqualifiedHandlerDto.setFeedbackStartTime(null); unqualifiedHandlerDto.setFeedbackEndTime(null); return baseMapper.selectPageList(page, QueryWrappers.queryWrappers(unqualifiedHandlerDto),feedbackStartDate,feedbackEndDate); } @Override public void exportUnqualifiedHandler(UnqualifiedHandlerDto unqualifiedHandlerDto, HttpServletResponse response) { response.reset(); try{ //查询字典 List materialPropType = sysDictTypeService.selectDictDataByType("material_prop_type");//物料属性 List categoriesNoConformities = sysDictTypeService.selectDictDataByType("categories_no_conformities");//不合格分类 List attributionNoConformities = sysDictTypeService.selectDictDataByType("attribution_no_conformities");// 不合格归属 //查询不合格处理记录 IPage pageList = pageList(new Page<>(-1, -1), unqualifiedHandlerDto); List records = pageList.getRecords().stream().map(m->{ InsUnqualifiedHandlerExcelData handlerExcelData = new InsUnqualifiedHandlerExcelData(); BeanUtil.copyProperties(m,handlerExcelData); handlerExcelData.setMaterialProp(materialPropType.stream().filter(f-> StringUtils.equals(f.getDictValue(),handlerExcelData.getMaterialProp())).findFirst().orElse(new SysDictData()).getDictLabel()); handlerExcelData.setClassification(categoriesNoConformities.stream().filter(f-> StringUtils.equals(f.getDictValue(),handlerExcelData.getClassification())).findFirst().orElse(new SysDictData()).getDictLabel()); handlerExcelData.setOffGradeAscription(attributionNoConformities.stream().filter(f-> StringUtils.equals(f.getDictValue(),handlerExcelData.getOffGradeAscription())).findFirst().orElse(new SysDictData()).getDictLabel()); return handlerExcelData; }).collect(Collectors.toList()); //设置response String fileName = "不合格处理记录" + ExcelTypeEnum.XLSX.getValue(); fileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8.toString()); response.setContentType("application/vnd.ms-excel"); response.setHeader("Cache-Control", "no-cache"); response.setHeader("Content-Disposition", "attachment;filename=" + fileName); response.setHeader("Access-Control-Expose-Headers", "Content-Disposition"); //导出 EasyExcel.write(response.getOutputStream(), InsUnqualifiedHandlerExcelData.class) .sheet() .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) .doWrite(records); }catch (Exception e){ e.printStackTrace(); throw new RuntimeException("不合格处理记录导出失败"); } } @Override public List getList() { return baseMapper.selectList(null).stream().map(InsUnqualifiedHandler::getInsOrderId).collect(Collectors.toList()); } @Override public Result pushOA(PushOADto pushOADto) { //获取不合格处理记录 UnqualifiedHandlerVO vo = baseMapper.findByGroupId(pushOADto.getGroupId(),pushOADto.getHandlerId()); //提交oa相关字段赋值 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); Map mainFields = new HashMap<>(); mainFields.put("gysmcsuppliername", vo.getSupplierName());//供应商名称 mainFields.put("wlmcmaterialname", vo.getMaterialName());//物料名称 mainFields.put("scpcproductionbatch", vo.getProductionBatch());//生产批次 mainFields.put("dhslcargoquantity", vo.getCargoQuantity() + vo.getBuyUnitMeas());//到货数量 mainFields.put("ggxhspecificationsmodels", vo.getSpecsModels());//规格型号 mainFields.put("bjrqdeclarationinspectdate", vo.getInspectTime().format(formatter));//报检日期 mainFields.put("fkrprovideroffeedback", SecurityUtils.getUsername());//反馈人 mainFields.put("fkrqfeedbacktime", vo.getFeedbackTime().format(formatter));//反馈日期 mainFields.put("flclassification", vo.getClassification());//分类 mainFields.put("bhggsoffgradeascription", vo.getOffGradeAscription());//不合格归属 mainFields.put("bhgqkmsunqualifieddescription", vo.getUnqualifiedDesc());//不合格情况描述 //查询附件 List handlerFiles = insUnqualifiedHandlerFileService.list(Wrappers.lambdaQuery() .eq(InsUnqualifiedHandlerFile::getUnqualifiedId, vo.getHandlerId())); if (CollectionUtils.isNotEmpty(handlerFiles)) { StringBuilder fileUrl = new StringBuilder(); for (int i = 0; i < handlerFiles.size(); i++) { String path = handlerFiles.get(i).getType().equals(1) ? "/img/" : "/word/"; if (i == handlerFiles.size() - 1) { fileUrl.append("" + handlerFiles.get(i).getFileName() + ""); } else { fileUrl.append("" + handlerFiles.get(i).getFileName() + "").append("
"); } } mainFields.put("fjlj", fileUrl.toString()); } //流程标题 String requestName = vo.getHeadline(); //发起OA boolean oa = false; try { log.info("发起不合格处理OA审核流程"); String unqualifiedProcessId = oaProperty.getUnqualifiedProcessId(); OAResult oaResult = OAProcess.start(mainFields, requestName, unqualifiedProcessId,SecurityUtils.getUsername()); log.info("不合格流程ID:{},不合格处理OA审核流程发起成功->{}",unqualifiedProcessId,oaResult); oa = oaResult.success(); if (oa) { String addWorkflowResult = oaResult.getAddWorkflowResult(); baseMapper.update(null, new LambdaUpdateWrapper() .set(InsUnqualifiedHandler::getRequestId, addWorkflowResult) .set(InsUnqualifiedHandler::getOaState, 2) .eq(InsUnqualifiedHandler::getGroupId, pushOADto.getGroupId())); } else { return Result.fail("提交oa失败: " + oaResult.getErrorMsg()); } } catch (Exception e) { throw new RuntimeException(e); } return Result.success(); } @Override @Transactional(rollbackFor = Exception.class) public void unqualifiedHandlerOACallback(Long oaWorkId, String checkResult, JSONObject response) { // 没有这个就结束 Long count1 = baseMapper.selectCount(Wrappers.lambdaQuery() .eq(InsUnqualifiedHandler::getRequestId, Integer.valueOf(String.valueOf(oaWorkId)))); if (count1 == 0) { return; } //处理措施map Map clcsMap = new HashMap<>(); clcsMap.put("0","让步放行"); clcsMap.put("1","退货"); clcsMap.put("2","部分退货"); clcsMap.put("3","降级使用"); //oa状态:3通过 4驳回 Integer oaState = "1".equals(checkResult) ? 3 : 4; baseMapper.update(null, new LambdaUpdateWrapper() .set(InsUnqualifiedHandler::getOaState, oaState) .set(InsUnqualifiedHandler::getClassification,response.getString("flclassification")) .eq(InsUnqualifiedHandler::getRequestId, Integer.valueOf(String.valueOf(oaWorkId)))); //保存oa审批流程记录 List commonOaList = new ArrayList<>(); JSONArray workflowRequestLogs = JSONArray.parseArray(JSONObject.toJSONString(response.get("workflowRequestLogs"))); for (Object workflowRequestLog : workflowRequestLogs) { JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(workflowRequestLog)); CommonOa oa = new CommonOa(); oa.setApprover(jsonObject.getString("operatorName")); oa.setOperateId(jsonObject.getLong("operateId")); oa.setWorkflowId(oaWorkId); oa.setOperation(jsonObject.getString("operateType")); oa.setApprovalDate(jsonObject.getString("operateDate")); oa.setNodeName(jsonObject.getString("nodeName")); oa.setApprovalTime(jsonObject.getString("operateTime")); //设置各节点的处理意见 if(StringUtils.isNotBlank(oa.getNodeName())){ if(oa.getNodeName().contains("质量")){ oa.setOperation(clcsMap.get(response.getString("clcs1"))); oa.setApprovalOpinion(response.getString("dbhgcpdclyqdealwiththenonconfo"));//1.对不合格产品的处理要求 }else if(oa.getNodeName().contains("工艺")){ oa.setApprovalOpinion(response.getString("gjyqimprovementrequirements"));//2.改进要求 }else if(oa.getNodeName().contains("技术")){ oa.setOperation(clcsMap.get(response.getString("clcs2"))); oa.setApprovalOpinion(response.getString("csyqactionrequirement"));//3.措施要求 }else if(oa.getNodeName().contains("总经理")){ oa.setOperation(clcsMap.get(response.getString("clcs3"))); oa.setApprovalOpinion(response.getString("zzclyqfinaltreatmentrequiremen"));//4.最终处理要求 }else if(oa.getNodeName().contains("核算")){ oa.setApprovalOpinion(response.getString("spyqcompensationrequirement"));//5.索赔要求 }else{ oa.setApprovalOpinion(jsonObject.getString("remark")); } } //查询判断之前是否添加过 long count = commonOaService.count(Wrappers.lambdaQuery() .eq(CommonOa::getWorkflowId, oaWorkId) .eq(CommonOa::getOperateId, oa.getOperateId())); // 没有重复添加 if (count == 0) { commonOaList.add(oa); } } commonOaService.saveBatch(commonOaList); } /** * 查看oa流程 * @param id * @return */ @Override public List getOaFlow(Integer id) { return baseMapper.getOaFlow(id); } /** * 新增不合格处理 * @param unqualifiedHandlerDto * @return */ @Override @Transactional(rollbackFor = Exception.class) public boolean addUnqualifiedHandler(UnqualifiedHandlerDto unqualifiedHandlerDto) { long count = this.count(Wrappers.lambdaQuery() .in(InsUnqualifiedHandler::getInsOrderId, unqualifiedHandlerDto.getSelectOrderIds())); if (count > 0) { throw new ErrorException("存在已提交过不合格处理的订单"); } //生成分组id String groupId = insUnqualifiedHandlerNumberGenerator.generateNumberWithPrefix(6, "GROUP", InsUnqualifiedHandler::getGroupId); // 原材料编号切割 for (Integer selectOrderId : unqualifiedHandlerDto.getSelectOrderIds()) { InsUnqualifiedHandler insUnqualifiedHandler = new InsUnqualifiedHandler(); BeanUtils.copyProperties(unqualifiedHandlerDto, insUnqualifiedHandler); Map orderMap = insSampleMapper.selectInsOrder(selectOrderId); insUnqualifiedHandler.setNo(orderMap.get("entrustCode").toString()); insUnqualifiedHandler.setInventoryQuantityId(Integer.valueOf(orderMap.get("inventoryQuantityId").toString())); insUnqualifiedHandler.setInsOrderId(selectOrderId); insUnqualifiedHandler.setGroupId(groupId); insUnqualifiedHandler.setProductionBatch(orderMap.get("updateBatchNo").toString()); insUnqualifiedHandler.setCargoQuantity(Double.parseDouble(orderMap.get("qtyArrived").toString())); insUnqualifiedHandler.setBuyUnitMeas(orderMap.get("buyUnitMeas").toString()); this.save(insUnqualifiedHandler); if (CollectionUtils.isNotEmpty(unqualifiedHandlerDto.getUnqualifiedHandlerFiles())) { for (InsUnqualifiedHandlerFile unqualifiedHandlerFile : unqualifiedHandlerDto.getUnqualifiedHandlerFiles()) { unqualifiedHandlerFile.setGroupId(insUnqualifiedHandler.getGroupId()); } insUnqualifiedHandlerFileService.updateBatchById(unqualifiedHandlerDto.getUnqualifiedHandlerFiles()); } } return true; } /** * 编辑不合格处理 * @param unqualifiedHandlerDto * @return */ @Override @Transactional(rollbackFor = Exception.class,isolation = Isolation.READ_COMMITTED) public boolean updateUnqualifiedHandler(UnqualifiedHandlerDto unqualifiedHandlerDto) { // 删除附件, 重新添加 insUnqualifiedHandlerFileService.remove(Wrappers.lambdaQuery() .eq(InsUnqualifiedHandlerFile::getUnqualifiedId, unqualifiedHandlerDto.getId())); if (CollectionUtils.isNotEmpty(unqualifiedHandlerDto.getUnqualifiedHandlerFiles())) { for (InsUnqualifiedHandlerFile unqualifiedHandlerFile : unqualifiedHandlerDto.getUnqualifiedHandlerFiles()) { unqualifiedHandlerFile.setUnqualifiedId(unqualifiedHandlerDto.getId()); } insUnqualifiedHandlerFileService.updateBatchById(unqualifiedHandlerDto.getUnqualifiedHandlerFiles()); } boolean isUpdated = this.updateById(unqualifiedHandlerDto); if(isUpdated){ //推送OA PushOADto pushOADto = new PushOADto(); pushOADto.setHandlerId(unqualifiedHandlerDto.getId()); pushOADto.setContract(unqualifiedHandlerDto.getContract()); pushOA(pushOADto); } return true; } /** * 查看不合格处理界面 * @param id * @return */ @Override public UnqualifiedHandlerDto getUnqualifiedHandler(Integer id) { InsUnqualifiedHandler insUnqualifiedHandler = this.getById(id); UnqualifiedHandlerDto unqualifiedHandlerDto = new UnqualifiedHandlerDto(); BeanUtil.copyProperties(insUnqualifiedHandler, unqualifiedHandlerDto); // 查看附件 List list = insUnqualifiedHandlerFileService.list(Wrappers.lambdaQuery() .eq(InsUnqualifiedHandlerFile::getGroupId, unqualifiedHandlerDto.getGroupId())); unqualifiedHandlerDto.setUnqualifiedHandlerFiles(list); return unqualifiedHandlerDto; } /** * 删除不合格 * @param groupId * @return */ @Override public boolean deleteUnqualifiedHandler(String groupId) { insUnqualifiedHandlerFileService.remove(Wrappers.lambdaQuery() .eq(InsUnqualifiedHandlerFile::getGroupId, groupId)); return this.remove(Wrappers.lambdaQuery().eq(InsUnqualifiedHandler::getGroupId, groupId)); } }