package com.ruoyi.production.service.impl; import com.alibaba.fastjson2.JSON; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; 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.utils.StringUtils; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.device.mapper.DeviceLedgerMapper; import com.ruoyi.device.pojo.DeviceLedger; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.production.dto.ProductProcessDto; import com.ruoyi.production.mapper.ProcessRouteItemMapper; import com.ruoyi.production.mapper.ProductProcessMapper; import com.ruoyi.production.mapper.ProductProcessRouteItemMapper; import com.ruoyi.production.pojo.ProcessRouteItem; import com.ruoyi.production.pojo.ProductProcess; import com.ruoyi.production.pojo.ProductProcessRouteItem; import com.ruoyi.production.service.ProductProcessService; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import org.springframework.web.multipart.MultipartFile; import java.util.ArrayList; import java.util.Collections; import java.util.List; @Service public class ProductProcessServiceImpl extends ServiceImpl implements ProductProcessService { @Autowired private ProductProcessMapper productProcessMapper; @Autowired private ProcessRouteItemMapper processRouteItemMapper; @Autowired private ProductProcessRouteItemMapper productProcessRouteItemMapper; @Autowired private DeviceLedgerMapper deviceLedgerMapper; @Override public IPage listPage(Page page, ProductProcessDto productProcessDto) { return productProcessMapper.listPage(page, productProcessDto); } @Override public AjaxResult add(ProductProcessDto productProcessDto) { ProductProcess productProcess = new ProductProcess(); BeanUtils.copyProperties(productProcessDto,productProcess); boolean save = productProcessMapper.insert(productProcess) > 0; if (save && ObjectUtils.isNull(productProcessDto.getNo())) { // 根据id生成no字段:GX + 8位数字(不足8位前面补0) String no = "GX" + String.format("%08d", productProcess.getId()); productProcess.setNo(no); productProcessMapper.updateById(productProcess); return AjaxResult.success(); } return AjaxResult.success(); } @Override public AjaxResult importData(MultipartFile file) { try { ExcelUtil util = new ExcelUtil(ProductProcess.class); List productProcessList = util.importExcel(file.getInputStream()); if(CollectionUtils.isEmpty(productProcessList)){ return AjaxResult.warn("模板错误或导入数据为空"); } productProcessList.forEach(productProcess -> { if (ObjectUtils.isEmpty(productProcess)) { throw new RuntimeException("使用模板进行导入"); } if (ObjectUtils.isEmpty(productProcess.getName())) { throw new RuntimeException("工序名称不能为空"); } }); this.saveOrUpdateBatch(productProcessList); return AjaxResult.success(true); }catch (Exception e){ e.printStackTrace(); return AjaxResult.error(e.getMessage()); } } @Override public String batchDelete(List ids) { //查询是否生产中已经引用了这些工序 List processRouteItems = processRouteItemMapper.selectList(Wrappers.lambdaQuery().in(ProcessRouteItem::getProcessId, ids)); List productProcessRouteItems = productProcessRouteItemMapper.selectList(Wrappers.lambdaQuery().in(ProductProcessRouteItem::getProcessId, ids)); if (!CollectionUtils.isEmpty(processRouteItems) || !CollectionUtils.isEmpty(productProcessRouteItems)){ throw new RuntimeException("该工序已经被使用,无法删除"); } productProcessMapper.deleteBatchIds(ids); return null; } @Override public AjaxResult bindDevices(Long processId, List deviceIds) { ProductProcess productProcess = productProcessMapper.selectById(processId); if (productProcess == null) { return AjaxResult.error("工序不存在"); } String deviceIdsJson = productProcess.getDeviceIds(); // 获取已有的设备ID列表 List existingDeviceIds = Collections.emptyList(); if (StringUtils.isNotEmpty(deviceIdsJson)) { existingDeviceIds = JSON.parseArray(deviceIdsJson, Long.class); } // 合并设备ID(去重) List mergedDeviceIds = new ArrayList<>(existingDeviceIds); for (Long deviceId : deviceIds) { if (!mergedDeviceIds.contains(deviceId)) { mergedDeviceIds.add(deviceId); } } deviceIdsJson = JSON.toJSONString(mergedDeviceIds); productProcess.setDeviceIds(deviceIdsJson); productProcessMapper.updateById(productProcess); return AjaxResult.success(); } @Override public AjaxResult unbindDevice(Long processId, Long deviceId) { ProductProcess productProcess = productProcessMapper.selectById(processId); if (productProcess == null) { return AjaxResult.error("工序不存在"); } if (productProcess.getDeviceIds() == null || productProcess.getDeviceIds().isEmpty()) { return AjaxResult.success(); } List existingDeviceIds = JSON.parseArray(productProcess.getDeviceIds(), Long.class); existingDeviceIds.remove(deviceId); String deviceIdsJson = JSON.toJSONString(existingDeviceIds); productProcess.setDeviceIds(deviceIdsJson); productProcessMapper.updateById(productProcess); return AjaxResult.success(); } @Override public List getBindDevices(Long processId) { ProductProcess productProcess = productProcessMapper.selectById(processId); if (productProcess == null || productProcess.getDeviceIds() == null) { return Collections.emptyList(); } List deviceIdList = JSON.parseArray(productProcess.getDeviceIds(), Long.class); if (CollectionUtils.isEmpty(deviceIdList)) { return Collections.emptyList(); } return deviceLedgerMapper.selectBatchIds(deviceIdList); } }