package com.example.erp.service.pp; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper; import com.example.erp.common.Constants; import com.example.erp.entity.pp.DamageDetails; import com.example.erp.entity.pp.FlowCard; import com.example.erp.entity.pp.ReportingWork; import com.example.erp.entity.pp.ReportingWorkDetail; import com.example.erp.entity.sd.Order; import com.example.erp.entity.sd.OrderDetail; import com.example.erp.entity.sd.OrderProcessDetail; import com.example.erp.exception.ServiceException; import com.example.erp.mapper.pp.*; import com.baomidou.dynamic.datasource.annotation.DS; import com.example.erp.mapper.sd.OrderMapper; import com.example.erp.mapper.sd.OrderProcessDetailMapper; import com.example.erp.service.sd.OrderProcessDetailService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.text.SimpleDateFormat; import java.util.*; @Service @DS("pp") public class ReportingWorkService { final ReportingWorkMapper reportingWorkMapper; final BasicDateProduceMapper basicDateProduceMapper; final DamageDetailsMapper damageDetailsMapper; final OrderProcessDetailMapper orderProcessDetailMapper; final ReportingWorkDetailMapper reportingWorkDetailMapper; final OrderMapper orderMapper; final FlowCardMapper flowCardMapper; final OrderProcessDetailService orderProcessDetailService; public ReportingWorkService(ReportingWorkMapper reportingWorkMapper, BasicDateProduceMapper basicDateProduceMapper, DamageDetailsMapper damageDetailsMapper, ReportingWorkDetailMapper reportingWorkDetailMapper, OrderProcessDetailMapper orderProcessDetailMapper, OrderProcessDetailService orderProcessDetailService, OrderMapper orderMapper, FlowCardMapper flowCardMapper) { this.reportingWorkMapper = reportingWorkMapper; this.basicDateProduceMapper = basicDateProduceMapper; this.damageDetailsMapper = damageDetailsMapper; this.reportingWorkDetailMapper = reportingWorkDetailMapper; this.orderProcessDetailMapper = orderProcessDetailMapper; this.orderProcessDetailService = orderProcessDetailService; this.orderMapper = orderMapper; this.flowCardMapper = flowCardMapper; } public Map AddSelectLastWorkSv(String processIdStr, String technologyStr, String process) { Map map = new HashMap<>(); //查询流程卡工艺流程 String technologicalProcess = reportingWorkMapper.SelectTechnologicalProcess(processIdStr); int index = technologicalProcess.indexOf("-"); //获取工艺流程第一个工序 String interceptProcess = technologicalProcess.substring(0, index); String[] processList = technologicalProcess.split("->"); int length = processList.length; //定义当前工序上下工序 String previousProcess = ""; String nextProcess = ""; //循环该流程卡工艺流程 for (int i = 0; i < length; i++) { //当到当前工序时 if (processList[i].equals(process)) { //获取当前工序的上一道工序 if (i - 1 < 0) { previousProcess = ""; } else { previousProcess = processList[i - 1]; } //获取当前工序的下一道工序 if (i + 1 > length - 1) { nextProcess = ""; } else { nextProcess = processList[i + 1]; } //System.out.println("当前工序:" + process + " 上一道工序:" + previousProcess + " 下一道工序:" + nextProcess); //查询当前工序的表头数据 //System.out.println(reportingWorkMapper.AddSelectLastWorkMp(processIdStr, technologyStr,previousProcess,nextProcess,process)); map.put("data", reportingWorkMapper.AddSelectLastWorkMp(processIdStr, technologyStr,previousProcess,nextProcess,process)); map.put("thisProcess", processList); break; } } //设备下拉框 map.put("device", reportingWorkMapper.SelectWorkBasicDeviceMp(process)); //班组下拉框 map.put("teams", reportingWorkMapper.SelectWorkBasicTeamsMp(process)); map.put("breakageType",reportingWorkMapper.selectBasicNameByType("breakagetype")); map.put("breakageReason",reportingWorkMapper.selectBasicNameByType("breakagereason")); //查询本工序报工需要哪几层,上工序是什么 String obtainTechnology = reportingWorkMapper.SelectWorkTechnologyMp(processIdStr); //判断本工序是不是第一道工序 if (interceptProcess.equals(process)) { //是第一道工序,查询流程卡数据 map.put("Detail", reportingWorkMapper.SelectTechnologicalNumMp(processIdStr,technologyStr,process)); } else { //不是第一道工序,查询报工数据 map.put("Detail", reportingWorkMapper.SelectReworlDetailMp(processIdStr,technologyStr,process)); } // 第一道工序(流程卡数+补片数量-完工数-次破数-返工未完成数-禁用数量) // 后续工序(上工序报工数-完工数-次破数-返工未完成数) //获取该流程卡号历史报工工序 String historyProcess =reportingWorkMapper.historyProcessMp(processIdStr); //历史报工工序设备 map.put("historyDevice",reportingWorkMapper.historyDeviceMp(historyProcess,process)); //历史报工工序班组 map.put("historyTeams",reportingWorkMapper.historyTeamsMp(processIdStr,process)); //历史工序 map.put("historyProcess",reportingWorkMapper.SelectHistoryProcessMp(historyProcess,process)); return map; } public Map SelectProcessSv() { Map map = new HashMap<>(); map.put("process", reportingWorkMapper.SelectProcessMp()); return map; } //报工新增 @Transactional(rollbackFor = Exception.class) public boolean SaveReportingWorkSv(Map reportingWorkMap) { //接收解析主附表信息 JSONObject reportingWorkJson = new JSONObject(reportingWorkMap); ReportingWork reportingWork = JSONObject.parseObject(JSONObject.toJSONString(reportingWorkJson.get("title")), ReportingWork.class); List reportingWorkDetails = JSONArray.parseArray(JSONObject.toJSONString(reportingWorkJson.get("detail")), ReportingWorkDetail.class); //获取当前最大报工单号生成报工单号 String formattedNumber = String.format("%04d", reportingWorkMapper.selectMaxReportingWorkId()+1); //格式化当前日期 Date currentDate = new Date(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyMMdd"); String formattedDate = dateFormat.format(currentDate); String reportingWorkId = "BG"+formattedDate+formattedNumber; reportingWork.setReportingWorkId(reportingWorkId); reportingWork.setProcessId(reportingWork.getProcessId().substring(0,13)); int reviewState = (int) reportingWorkJson.get("type"); if(reviewState==1){ reportingWork.setReviewed(reportingWork.getCreator()); reportingWork.setReviewedState(1); }else{ reportingWork.setReviewedState(0); } //主表插入 reportingWorkMapper.insert(reportingWork); //副表循环插入,并且插入次破信息表。再根据次破信息修改订单玻璃流程表的完工数量与刺破数量 reportingWorkDetails.forEach(reportingWorkDetail -> { reportingWorkDetail.setReportingWorkId(reportingWorkId); List damageDetails = reportingWorkDetail.getDamageDetails(); if(damageDetails!=null && !damageDetails.isEmpty()){ damageDetails.forEach(damageDetail ->{ damageDetail.setReportingWorkId(reportingWorkId); damageDetail.setOrderNumber(reportingWorkDetail.getOrderNumber()); damageDetail.setProcessId(reportingWork.getProcessId()); damageDetail.setTechnologyNumber(reportingWorkDetail.getTechnologyNumber()); damageDetailsMapper.insert(damageDetail); }); } //查询流程卡工艺流程 String technologicalProcess = reportingWorkMapper.SelectTechnologicalProcess(reportingWork.getProcessId()); int index = technologicalProcess.indexOf("-"); //获取工艺流程第一个工序 String interceptProcess = technologicalProcess.substring(0, index); //判断当前工序是否为第一道工序工序,使用流程卡表数量或者小片流程表上工序数量 int processNum = 0; if (interceptProcess.equals(reportingWork.getThisProcess())) { processNum = reportingWorkMapper.selectFlowCardNum( reportingWorkDetail.getOrderNumber(), reportingWorkDetail.getTechnologyNumber(), reportingWork.getProcessId(), reportingWork.getThisProcess() ); }else{ processNum = reportingWorkMapper.selectGlassProcessNum( reportingWorkDetail.getOrderNumber(), reportingWorkDetail.getTechnologyNumber(), reportingWork.getProcessId(), reportingWork.getThisProcess() ); } //判断是否大于当前数量并且抛出异常 if(processNum<(reportingWorkDetail.getBreakageQuantity()+reportingWorkDetail.getCompletedQuantity())){ Map map = new HashMap<>(); map.put("orderNumber",reportingWorkDetail.getOrderNumber()); map.put("technologyNumber",reportingWorkDetail.getOrderNumber()); map.put("processNum",processNum); map.put("sumNum",reportingWorkDetail.getBreakageQuantity()+reportingWorkDetail.getCompletedQuantity()); String msg = JSON.toJSONString(map); throw new ServiceException(Constants.Code_600,msg); } OrderProcessDetail orderProcessDetail = new OrderProcessDetail(); orderProcessDetail.setBrokenNum(reportingWorkDetail.getBreakageQuantity()); orderProcessDetail.setReportingWorkNum(reportingWorkDetail.getCompletedQuantity()); orderProcessDetail.setReportingWorkNumCount(reportingWorkDetail.getCompletedQuantity()); //根据订单id,订单序号,以及小片序号 更新小片流程的完工数量以及刺破数量 LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); updateWrapper.eq(OrderProcessDetail::getOrderNumber, reportingWorkDetail.getOrderNumber()) .eq(OrderProcessDetail::getProcessId, reportingWork.getProcessId().substring(0,13)) .eq(OrderProcessDetail::getOrderId, reportingWork.getOrderId()) .eq(OrderProcessDetail::getProcess, reportingWork.getThisProcess()) .eq(OrderProcessDetail::getTechnologyNumber, reportingWorkDetail.getTechnologyNumber()) .setSql("reporting_work_num_count = reporting_work_num_count +"+orderProcessDetail.getReportingWorkNum()) .setSql("reporting_work_num =reporting_work_num +"+orderProcessDetail.getReportingWorkNum()) .setSql("broken_num =broken_num +"+orderProcessDetail.getBrokenNum()); orderProcessDetailMapper.update(null,updateWrapper); reportingWorkDetailMapper.insert(reportingWorkDetail); //更新流程卡表的报工数量 if(Objects.equals(reportingWork.getNextProcess(), "")){ LambdaUpdateWrapper flowCardLambdaUpdateWrapper = new LambdaUpdateWrapper<>(); flowCardLambdaUpdateWrapper .eq(FlowCard::getProcessId, reportingWork.getProcessId()) .eq(FlowCard::getOrderNumber, reportingWorkDetail.getOrderNumber()) .eq(FlowCard::getTechnologyNumber, reportingWorkDetail.getTechnologyNumber()) .setSql("inventory_quantity = inventory_quantity +"+orderProcessDetail.getReportingWorkNum()); flowCardMapper.update(null,flowCardLambdaUpdateWrapper); } }); return true; } //下工序审核方法 public boolean ReviewReportingWorkSv(Map reportingWork) { String processId = reportingWork.get("processId"); LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); updateWrapper .eq(ReportingWork::getProcessId, processId.substring(0,13)) .eq(ReportingWork::getThisProcess,reportingWork.get("process")) .eq(ReportingWork::getReviewedState,0) .setSql("reviewed_state =1"); reportingWorkMapper.update(null,updateWrapper); return true; } public Map selectUpdateReportingWorkSv(String reportingWorkId) { ReportingWork reportingWork =reportingWorkMapper.selectOne(new LambdaQueryWrapper() .eq(ReportingWork::getReportingWorkId,reportingWorkId)); reportingWork.setOrder( orderMapper.selectOne(new LambdaQueryWrapper() .eq(Order::getOrderId,reportingWork.getOrderId()))); reportingWork.setFlowCard(new FlowCard()); List reportingWorkDetails = reportingWorkDetailMapper.selectByreportingWorkId(reportingWorkId); Map map = new HashMap<>(); map.put("reportingWork",reportingWork); map.put("reportingWorkDetails",reportingWorkDetails); return map; } }