王佳豪
2021-05-07 b1902c110cfb177b63ec2290d43505e58bbc60b3
src/main/java/com/zy/asrs/service/impl/LocNormalServiceImpl.java
@@ -1,19 +1,45 @@
package com.zy.asrs.service.impl;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.core.common.Cools;
import com.core.exception.CoolException;
import com.zy.asrs.entity.LocNormal;
import com.zy.asrs.entity.WaitPakin;
import com.zy.asrs.entity.WaitPakinLog;
import com.zy.asrs.mapper.LocNormalMapper;
import com.zy.asrs.mapper.OutStockMapper;
import com.zy.asrs.service.LocNormalService;
import com.zy.asrs.service.WaitPakinLogService;
import com.zy.asrs.service.WaitPakinService;
import com.zy.common.service.erp.ErpSqlServer;
import com.zy.common.service.erp.entity.CPICMO;
import com.zy.common.service.erp.entity.OutStockBillEntry;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@Slf4j
@Service("locNormalService")
public class LocNormalServiceImpl extends ServiceImpl<LocNormalMapper, LocNormal> implements LocNormalService {
    @Autowired
    ErpSqlServer erpSqlServer;
    @Autowired
    OutStockMapper outStockMapper;
    @Autowired
    LocNormalService locNormalService;
    @Autowired
    WaitPakinService waitPakinService;
    @Autowired
    WaitPakinLogService waitPakinLogService;
    @Override
    public List<LocNormal> getLocNormalData() {
@@ -21,27 +47,239 @@
    }
    @Override
    public void updateLocNormal(String matnr, Double anfme, Long modiUser, Date modiTime) {
        baseMapper.updateLocNormal(matnr, anfme, modiUser, modiTime);
    public void updateLocNormal(String matnr, BigDecimal anfme, Long modiUser, Date modiTime, Integer id) {
        baseMapper.updateLocNormal(matnr, anfme, modiUser, modiTime, id);
    }
    @Override
    public void outLocNormal(String matnr, Long modiUser, Date modiTime) {
        baseMapper.outLocNormal(matnr, modiUser, modiTime);
    public void outLocNormal(String matnr, Long modiUser, Date modiTime, Integer id) {
        baseMapper.outLocNormal(matnr, modiUser, modiTime, id);
    }
    @Override
    public void removeLocNormal(String matnr, Long modiUser, Date modiTime) {
        baseMapper.removeLocNormal(matnr, modiUser, modiTime);
    }
    @Override
    public void pdaLocNormalIn(List<LocNormal> list) {
        baseMapper.pdaLocNormalIn(list);
    public void removeLocNormal(String matnr, Long modiUser, Date modiTime, Integer id) {
        baseMapper.removeLocNormal(matnr, modiUser, modiTime, id);
    }
    @Override
    public void locNormalIn(List<LocNormal> list) {
        baseMapper.locNormalIn(list);
        // 平仓入库后更新中间表数据,Fflag_finish改为1,表示平仓入库成功
        if (list.size() > 0) {
            for (Integer i = 0; i < list.size(); i++) {
                List<LocNormal> addList = new ArrayList<>();
                List<LocNormal> updateList = new ArrayList<>();
                if (!Cools.isEmpty(list.get(i).getSupplier())) { // 存在入库单号的才进行erp更新
                    // 判断原先平仓是否存在有货,如果有货数量进行累加
                    LocNormal oldLocList = locNormalService.selectOne(new EntityWrapper<LocNormal>().eq("supplier", list.get(i).getSupplier()).and().eq("state", "1").eq("warehouse", list.get(i).getWarehouse()));
                    if (!Cools.isEmpty(oldLocList)) {
                        // erp更新
                        updateCPICMO(list.get(i));
                        Double updateAnfme = new Double(list.get(i).getAnfme().doubleValue());
                        // 平仓入库(更新)逻辑
                        list.get(i).setAnfme(oldLocList.getAnfme().add(list.get(i).getAnfme()));
                        updateList.add(list.get(i));
                        if (baseMapper.pdaLocNormalUpdate(updateList) > 0) {
                            // cust_wait_pakin转cust_wait_pakin_log,并更新数量
                            custWaitPakinToLog(list.get(i), updateAnfme);
                        }
                    } else {
                        // erp更新
                        updateCPICMO(list.get(i));
                        // 平仓入库逻辑
                        addList.add(list.get(i));
                        if (baseMapper.pdaLocNormalIn(addList) > 0) {
                            // cust_wait_pakin转cust_wait_pakin_log,并更新数量
                            custWaitPakinToLog(list.get(i), list.get(i).getAnfme().doubleValue());
                        }
                    }
                } else {
                    throw new CoolException("通知单号不可为空");
                }
            }
        }
    }
    /**
     * 成品入库单标记完成
     */
    private boolean completeCPakIn(String FBillNo, String Fnumber){
        String sql = "update CPICMO set Fflag_finish = 1 where FBillNo = ''{0}'' and Fnumber = ''{1}''";
        sql = MessageFormat.format(sql, FBillNo, Fnumber);
        return erpSqlServer.update(sql) > 0;
    }
    @Override
    public void pdaLocNormalIn(List<LocNormal> list) {
        // 平仓入库后更新中间表数据,Fflag_finish改为1,表示平仓入库成功
        if (list.size() > 0) {
            for (Integer i = 0; i < list.size(); i++) {
                List<LocNormal> addList = new ArrayList<>();
                List<LocNormal> updateList = new ArrayList<>();
                if (!Cools.isEmpty(list.get(i).getSupplier())) { // 存在入库单号的才进行erp更新
                    // 判断原先平仓是否存在有货,如果有货数量进行累加
                    LocNormal oldLocList = locNormalService.selectOne(new EntityWrapper<LocNormal>().eq("supplier", list.get(i).getSupplier()).and().eq("state", "1").and().eq("warehouse", list.get(i).getWarehouse()));
                    if (!Cools.isEmpty(oldLocList)) {
                        // erp更新
                        updateCPICMO(list.get(i));
                        Double updateAnfme = new Double(list.get(i).getAnfme().doubleValue());
                        // 平仓入库(更新逻辑)
                        list.get(i).setAnfme(oldLocList.getAnfme().add(list.get(i).getAnfme()));
                        updateList.add(list.get(i));
                        if (baseMapper.pdaLocNormalUpdate(updateList) > 0) {
                            // cust_wait_pakin转cust_wait_pakin_log,并更新数量
                            custWaitPakinToLog(list.get(i), updateAnfme);
                        }
                    } else {
                        // erp更新
                        updateCPICMO(list.get(i));
                        // 平仓入库逻辑
                        addList.add(list.get(i));
                        if (baseMapper.pdaLocNormalIn(addList) > 0){
                            // cust_wait_pakin转cust_wait_pakin_log,并更新数量
                            custWaitPakinToLog(list.get(i), list.get(i).getAnfme().doubleValue());
                        }
                    }
                } else {
                    throw new CoolException("通知单号不可为空");
                }
            }
        }
    }
    /* cust_wait_pakin转cust_wait_pakin_log,并更新数量 */
    private boolean custWaitPakinToLog(LocNormal list, Double updateAnfme) {
        WaitPakin waitPakin = waitPakinService.selectOne(new EntityWrapper<WaitPakin>().eq("supplier", list.getSupplier()).and().eq("matnr", list.getMatnr()));
        WaitPakinLog waitPakinLog = new WaitPakinLog();
        waitPakinLog.setAnfme(updateAnfme);
        waitPakinLog.setMatnr(waitPakin.getMatnr());
        waitPakinLog.setMaktx(waitPakin.getMaktx());
        waitPakinLog.setLgnum(waitPakin.getLgnum());
        waitPakinLog.setType(waitPakin.getType());
        waitPakinLog.setMnemonic(waitPakin.getMnemonic());
        waitPakinLog.setSupplier(waitPakin.getSupplier());
        waitPakinLog.setWarehouse(waitPakin.getWarehouse());
        waitPakinLog.setBrand(waitPakin.getBrand());
        waitPakinLog.setAltme(waitPakin.getAltme());
        waitPakinLog.setZpallet(waitPakin.getZpallet());
        waitPakinLog.setBname(waitPakin.getBname());
        waitPakinLog.setLocNo(waitPakin.getLocNo());
        waitPakinLog.setStatus(waitPakin.getStatus());
        waitPakinLog.setIoStatus(waitPakin.getIoStatus());
        waitPakinLog.setMemo(waitPakin.getMemo());
        waitPakinLog.setModiTime(waitPakin.getModiTime());
        waitPakinLog.setModiUser(waitPakin.getModiUser());
        waitPakinLog.setAppeTime(waitPakin.getAppeTime());
        waitPakinLog.setAppeUser(waitPakin.getAppeUser());
        // 转入库通知历史档
        waitPakinLogService.insert(waitPakinLog);
        // 修改入库同志档物料数量
        Wrapper<WaitPakin> wrapper = new EntityWrapper<WaitPakin>();
        wrapper.eq("supplier", list.getSupplier())
                .eq("matnr", list.getMatnr())
                .isNull("zpallet");
        WaitPakin pakin = new WaitPakin();
        pakin.setAnfme(waitPakin.getAnfme() - updateAnfme);
        waitPakinService.update(pakin, wrapper);
        return true;
    }
    /* 更新erp入库表 */
    private boolean updateCPICMO(LocNormal list) {
        String sqlSelect = "select * from CPICMO where 1=1 and Fnumber = ''{0}'' and FBillNo = ''{1}''";
        sqlSelect = MessageFormat.format(sqlSelect, list.getMatnr(), list.getSupplier());
        List<CPICMO> CPICMOList = erpSqlServer.select(sqlSelect,CPICMO.class);
        if (CPICMOList.size() > 0) { //  说明erp有对应的入库单
            String sql = "update CPICMO set FAuxCommitQty = (FAuxCommitQty + {0,number,#}) where 1=1 and Fnumber = ''{1}'' and FBillNo = ''{2}''";
            sql = MessageFormat.format(sql, list.getAnfme(), list.getMatnr(), list.getSupplier());
            if (erpSqlServer.update(sql) > 0) {
                sql = "select * from CPICMO where 1=1 and Fnumber = ''{0}'' and FBillNo = ''{1}''";
                sql = MessageFormat.format(sql, list.getMatnr(), list.getSupplier());
                List<CPICMO> select = erpSqlServer.select(sql, CPICMO.class);
                CPICMO cpicmo = select.get(0);
                boolean complete = false;
                if (cpicmo.getFQty() > 0) {
                    if (Double.doubleToLongBits(cpicmo.getFAuxCommitQty()) == Double.doubleToLongBits(cpicmo.getFQty())) {
                        complete = true;
                    }
                } else {
                    if (Double.doubleToLongBits(cpicmo.getFAuxCommitQty()) == Double.doubleToLongBits(cpicmo.getFAuxQty())) {
                        complete = true;
                    }
                }
                if (complete) {
                    if (!completeCPakIn(list.getSupplier(), list.getMatnr())) {
                        log.error("{}平仓入库单标记完成失败", list.getSupplier());
                    }
                }
            }
        } else {
            throw new CoolException("ERP查询不到对应通知单");
        }
        return true;
    }
    @Override
    public List<LocNormal> pdaLocNormalQuery(String matnr, String warehouse, String billNo) {
       return baseMapper.pdaLocNormalQuery(matnr, warehouse, billNo);
    }
    @Override
    public void pdaLocNormalOut(List<LocNormal> list) {
        for (Integer i = 0; i < list.size(); i++) {
            if (list.get(i).getAnfme().equals(list.get(i).getAnfmeOut())) {
                baseMapper.pdaLocNormalOut1(list.get(i).getId(), list.get(i).getMatnr(), list.get(i).getModiUser(), list.get(i).getModiTime(), list.get(i).getWarehouse());
            }
            if (list.get(i).getAnfmeOut().compareTo(list.get(i).getAnfme()) == -1) {
                BigDecimal diff = (list.get(i).getAnfme()).subtract(list.get(i).getAnfmeOut());
                baseMapper.pdaLocNormalOut2(list.get(i).getId(), list.get(i).getMatnr(), diff, list.get(i).getModiUser(), list.get(i).getModiTime(), list.get(i).getWarehouse());
            }
        }
    }
    @Override
    public List<LocNormal> pdaLocNormalWarehouseQuery(String warehouse, String matnr) {
        return baseMapper.pdaLocNormalWarehouseQuery(warehouse, matnr);
    }
    @Override
    public void pdaLocNormalMove(List<LocNormal> list) {
        baseMapper.pdaLocNormalMove(list);
    }
    @Override
    public List<LocNormal> queryLocNorlMatnr(String fbillNo) {
        List<OutStockBillEntry> matList = outStockMapper.queryMatnrWithBillNo(fbillNo);
        List<LocNormal> locNormal = new ArrayList<>();
        List<LocNormal> locNormalResult = new ArrayList<>();
        for (Integer i = 0; i < matList.size(); i++) {
            locNormal = baseMapper.queryLocNorlMatnr(matList.get(i).getFnumber()) ;
            if (locNormal.size() > 0) {
                for (LocNormal e:locNormal) {
                    LocNormal obj = new LocNormal();
                    obj.setMatnr(e.getMatnr());
                    obj.setMaktx(e.getMaktx());
                    obj.setLgnum(e.getLgnum());
                    obj.setType(e.getType());
                    obj.setMnemonic(e.getMnemonic());
                    obj.setSupplier(e.getSupplier());
                    obj.setWarehouse(e.getWarehouse());
                    obj.setBrand(e.getBrand());
                    obj.setAnfme(e.getAnfme());
                    obj.setBname(e.getBname());
                    obj.setMemo(e.getMemo());
                    obj.setModiUser(e.getModiUser());
                    obj.setModiTime(e.getModiTime());
                    obj.setAppeUser(e.getAppeUser());
                    obj.setAppeTime(e.getAppeTime());
                    obj.setState(e.getState());
                    obj.setWarehouseName(e.getWarehouseName());
                    obj.setId(e.getId());
                    locNormalResult.add(obj);
                }
            }
        }
       return locNormalResult;
    }
}