diff --git a/src/main/java/com/dsic/gj_erp/bean/zyjh/DmYlInfo.java b/src/main/java/com/dsic/gj_erp/bean/zyjh/DmYlInfo.java index e3662e9..78ba86b 100644 --- a/src/main/java/com/dsic/gj_erp/bean/zyjh/DmYlInfo.java +++ b/src/main/java/com/dsic/gj_erp/bean/zyjh/DmYlInfo.java @@ -74,6 +74,11 @@ public class DmYlInfo { return StrUtil.isNotEmpty(this.余料编号) && this.余料编号.equals(余料编号); } + + public String 获取帐期(){ + return DateUtil.parse(this.入库日期).toString("yyyy/MM"); + } + public boolean 上料匹配(DmYdjh ydjh){ if (使用状态>0){ return false; diff --git a/src/main/java/com/dsic/gj_erp/bean/zyjh/DmYlJc.java b/src/main/java/com/dsic/gj_erp/bean/zyjh/DmYlJc.java new file mode 100644 index 0000000..5834ef6 --- /dev/null +++ b/src/main/java/com/dsic/gj_erp/bean/zyjh/DmYlJc.java @@ -0,0 +1,45 @@ +package com.dsic.gj_erp.bean.zyjh; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Getter; +import lombok.Setter; + +import java.math.BigDecimal; + +/** + * 余料结存表 + */ +@Getter +@Setter +@TableName("dm_yljc") +public class DmYlJc { + + @TableId(type= IdType.INPUT) + private String zq; + + private BigDecimal outWeight; + + private BigDecimal outNum; + + private BigDecimal inWeight; + + private BigDecimal inNum; + + public static DmYlJc ofIn(DmYlInfo ylInfo){ + DmYlJc dmYlJc = new DmYlJc(); + dmYlJc.setZq(ylInfo.获取帐期()); + dmYlJc.setInNum(new BigDecimal(1)); + dmYlJc.setInWeight(new BigDecimal(ylInfo.get重量())); + return dmYlJc; + } + + public static DmYlJc ofOut(DmYlInfo ylInfo){ + DmYlJc dmYlJc = new DmYlJc(); + dmYlJc.setZq(ylInfo.获取帐期()); + dmYlJc.setInNum(new BigDecimal(1)); + dmYlJc.setInWeight(new BigDecimal(ylInfo.get重量())); + return dmYlJc; + } +} diff --git a/src/main/java/com/dsic/gj_erp/controller/zyjh/YlController.java b/src/main/java/com/dsic/gj_erp/controller/zyjh/YlController.java index e40ede0..4a48189 100644 --- a/src/main/java/com/dsic/gj_erp/controller/zyjh/YlController.java +++ b/src/main/java/com/dsic/gj_erp/controller/zyjh/YlController.java @@ -5,16 +5,17 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.dsic.gj_erp.annotation.AuthFunction; -import com.dsic.gj_erp.annotation.Authorization; import com.dsic.gj_erp.bean.ResultBean; import com.dsic.gj_erp.bean.jhgk.DmYdjh; import com.dsic.gj_erp.bean.zyjh.DmYlInOut; import com.dsic.gj_erp.bean.zyjh.DmYlInfo; +import com.dsic.gj_erp.bean.zyjh.DmYlJc; import com.dsic.gj_erp.controller.zyjh.dto.YlSlDto; import com.dsic.gj_erp.exception.ServiceException; import com.dsic.gj_erp.service.jhgk.DmYdjhService; import com.dsic.gj_erp.service.zyjh.DmYlInOutService; import com.dsic.gj_erp.service.zyjh.DmYlInfoService; +import com.dsic.gj_erp.service.zyjh.DmYljcService; import lombok.AllArgsConstructor; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; @@ -35,8 +36,10 @@ public class YlController { private final DmYlInfoService ylInfoService; private final DmYdjhService ydjhService; private final DmYlInOutService dmYlInOutService; + private final DmYljcService dmYljcService; @PostMapping("list") + @SuppressWarnings("unchecked") public ResultBean list(@RequestBody YlSlDto dto){ return new ResultBean<>( ylInfoService.list(Wrappers.lambdaQuery() @@ -57,17 +60,30 @@ public class YlController { @AuthFunction @PostMapping("rk") @Transactional(rollbackFor = Exception.class) - public ResultBean rk(@RequestBody List list, HttpServletRequest request){ + public ResultBean rk(@RequestBody List list, HttpServletRequest request) throws InterruptedException { String userCode=(String) request.getAttribute("yhdm"); String 编制日期=DateUtil.date().toString("yyyy/MM/dd"); + List ylInOutList=new ArrayList<>(); + List jcList=new ArrayList<>(); + List updateList=list.stream().map(item->{ + //入库流水 DmYlInOut dmYlInOut = DmYlInOut.入库流水(item,userCode); ylInOutList.add(dmYlInOut); + + //结存 + DmYlJc jc=DmYlJc.ofIn(item); + jcList.add(jc); + + //余料入库修正入库标识等信息 return DmYlInfo.入库(item,userCode,编制日期); }).collect(Collectors.toList()); - ylInfoService.updateBatchById(updateList); - dmYlInOutService.saveBatch(ylInOutList); + + ylInfoService.updateBatchById(updateList);//修正入库数据状态 + dmYlInOutService.saveBatch(ylInOutList);//记录入库流水 + dmYljcService.saveIn(jcList);//记录结存 + return new ResultBean<>(); } @@ -93,7 +109,11 @@ public class YlController { */ @PostMapping("rollback") @Transactional(rollbackFor = Exception.class) - public ResultBean rollback(@RequestBody List list){ + public ResultBean rollback(@RequestBody List list) throws InterruptedException { + ArrayList 出库流水数据 = new ArrayList<>();//待删除的出库流水 + List jcList=new ArrayList<>();//结存数据 + + list.stream() .filter(item->item.get使用状态()<=2) .forEach(item->{ @@ -115,8 +135,23 @@ public class YlController { } //退回余料库存信息 item.修正退回信息(); + + List inOutList = dmYlInOutService.list(Wrappers.lambdaQuery() + .eq(DmYlInOut::get来源船号, item.get来源船号()) + .eq(DmYlInOut::get来源图纸, item.get来源图纸()) + .eq(DmYlInOut::get余料编号, item.get余料编号()) + ); + 出库流水数据.addAll(inOutList); + + //结存数据 + DmYlJc jc = DmYlJc.ofIn(item); + jcList.add(jc); }); + ylInfoService.updateBatchById(list); + dmYlInOutService.removeByIds(出库流水数据.stream().map(DmYlInOut::getId).collect(Collectors.toList())); + dmYljcService.saveOut(jcList); + return new ResultBean<>(); } @@ -126,12 +161,14 @@ public class YlController { @AuthFunction @PostMapping("print") @Transactional(rollbackFor = Exception.class) - public ResultBean print(@RequestBody List list,HttpServletRequest request){ + public ResultBean print(@RequestBody List list,HttpServletRequest request) throws InterruptedException { String userCode=(String) request.getAttribute("yhdm"); String 出库日期=DateUtil.date().toString("yyyy/MM/dd"); ArrayList updateList = new ArrayList<>(); ArrayList 出库流水数据 = new ArrayList<>(); + List jcList=new ArrayList<>();//结存数据 + list.forEach(item->{ if (StrUtil.isAllNotEmpty(item.get使用船号(),item.get使用图纸())){ String date = DateUtil.date().toString("yyyy/MM/dd"); @@ -146,6 +183,8 @@ public class YlController { String str=StrUtil.format("使用船号:{},使用图号{}错误,请核对修正后再打印", item.get使用船号(), item.get使用图纸()); throw new ServiceException(99999,str); } + + //作业计划修正使用余料属性状态 List collect = ydjhList.stream().map(it -> { //防止手动编辑错误时的校验 if (it.图纸已使用()){ @@ -160,12 +199,17 @@ public class YlController { DmYlInOut 出库流水 = DmYlInOut.出库流水(item, userCode, 出库日期); 出库流水数据.add(出库流水); + + //结存数据 + DmYlJc jc=DmYlJc.ofOut(item); + jcList.add(jc); } }); - ydjhService.updateBatchById(updateList); - ylInfoService.updateBatchById(list); + ydjhService.updateBatchById(updateList);//修正作业计划使用余料信息 + ylInfoService.updateBatchById(list);//修正出库数据状态 dmYlInOutService.saveBatch(出库流水数据); + dmYljcService.saveOut(jcList);//修正结存出库数据状态 return new ResultBean<>(); } diff --git a/src/main/java/com/dsic/gj_erp/mapper/zyjh/DmYljcMapper.java b/src/main/java/com/dsic/gj_erp/mapper/zyjh/DmYljcMapper.java new file mode 100644 index 0000000..5c47d4a --- /dev/null +++ b/src/main/java/com/dsic/gj_erp/mapper/zyjh/DmYljcMapper.java @@ -0,0 +1,16 @@ +package com.dsic.gj_erp.mapper.zyjh; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dsic.gj_erp.bean.zyjh.DmYlJc; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Update; + +@Mapper +public interface DmYljcMapper extends BaseMapper { + + @Update("update set in_weight=in_weight+#{inWeight} ,in_num=in_num+#{inNum} where zq=#{zq}") + void updateIn(DmYlJc dmYlJc); + + @Update("update set out_weight=out_weight+#{outWeight} ,out_num=out_num+#{outNum} where zq=#{zq}") + void updateOut(DmYlJc dmYlJc); +} diff --git a/src/main/java/com/dsic/gj_erp/service/zyjh/DmYljcService.java b/src/main/java/com/dsic/gj_erp/service/zyjh/DmYljcService.java new file mode 100644 index 0000000..3ea6030 --- /dev/null +++ b/src/main/java/com/dsic/gj_erp/service/zyjh/DmYljcService.java @@ -0,0 +1,83 @@ +package com.dsic.gj_erp.service.zyjh; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dsic.gj_erp.bean.zyjh.DmYlJc; +import com.dsic.gj_erp.exception.ServiceException; +import com.dsic.gj_erp.mapper.zyjh.DmYljcMapper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.concurrent.Semaphore; + +@Slf4j +@Service +@RequiredArgsConstructor +public class DmYljcService extends ServiceImpl { + + private final RedisTemplate redisTemplate; + + private static final String YLJC_KEY="YLJC"; + + private static final Semaphore semaphore = new Semaphore(1); + + @Transactional(rollbackFor = Exception.class) + public void saveIn(List list) throws InterruptedException { + semaphore.acquire(); + try { + for (DmYlJc item : list) { + //使用redis加速 + Boolean flag = redisTemplate.opsForHash().hasKey(YLJC_KEY, item.getZq()); + if (flag){ + baseMapper.updateIn(item); + continue; + } + insert(item); + } + }catch (Exception e){ + semaphore.release(); + log.error("结存表处理失败: ", e); + throw new ServiceException(11001,"结存表处理失败"); + } + } + + @Transactional(rollbackFor = Exception.class) + public void saveOut(List list) throws InterruptedException { + semaphore.acquire(); + try { + for (DmYlJc item : list) { + //使用redis加速 + Boolean flag = redisTemplate.opsForHash().hasKey(YLJC_KEY, item.getZq()); + if (flag){ + baseMapper.updateOut(item); + continue; + } + insert(item); + } + }catch (Exception e){ + semaphore.release(); + log.error("结存表处理失败: ", e); + throw new ServiceException(11001,"结存表处理失败"); + } + } + + public void insert(DmYlJc item){ + try { + redisTemplate.opsForHash().put(YLJC_KEY,item.getZq(),1); + baseMapper.insert(item); + }catch (Exception e){ + log.error("初始化结存表失败: ", e); + + try { + redisTemplate.opsForHash().delete(YLJC_KEY,item.getZq()); + }catch (Exception e1){ + log.error("初始化结存表失败: ", e1); + } + + throw new ServiceException(11000,"初始化结存表失败"); + } + } +}