ReceiptDetailServiceImpl.java 12.7 KB
package com.huaheng.pc.receipt.receiptDetail.service;

import com.huaheng.common.exception.service.ServiceException;
import com.huaheng.common.support.Convert;
import com.huaheng.common.utils.DataUtils;
import com.huaheng.common.utils.StringUtils;
import com.huaheng.common.utils.security.ShiroUtils;
import com.huaheng.framework.web.domain.AjaxResult;
import com.huaheng.mobile.receipt.ReceiptBill;
import com.huaheng.pc.config.containercapacity.domain.ContainerCapacity;
import com.huaheng.pc.config.containercapacity.service.IContainerCapacityService;
import com.huaheng.pc.general.material.domain.Material;
import com.huaheng.pc.general.material.service.IMaterialService;
import com.huaheng.pc.receipt.receiptDetail.domain.ReceiptDetail;
import com.huaheng.pc.receipt.receiptDetail.mapper.ReceiptDetailMapperAuto;
import com.huaheng.pc.receipt.receiptDetail.mapper.ReceiptDetailMapper;
import com.huaheng.pc.receipt.receiptHeader.domain.ReceiptHeader;
import com.huaheng.pc.receipt.receiptHeader.service.IReceiptHeaderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;


/**
 * 入库明细 服务层实现
 * 
 * @author huaheng
 * @date 2018-08-19
 */
@Service
public class ReceiptDetailServiceImpl  implements IReceiptDetailService {

    @Resource
    public ReceiptDetailMapperAuto aotuMapper;
    @Resource
    public ReceiptDetailMapper receiptDetailMapper;
    @Resource
    private IReceiptHeaderService receiptHeaderService;
    @Resource
    private IMaterialService materialService;
    @Autowired
    private IContainerCapacityService   containerCapacityService;

    public List<ReceiptDetail> selectListEntityByLike(ReceiptDetail condition) {
        return aotuMapper.selectListEntityByLike(condition);
    }

    public List<ReceiptDetail> selectListEntityByEqual(ReceiptDetail condition) {
        return aotuMapper.selectListEntityByEqual(condition);
    }

    public List<ReceiptDetail> selectListAgvEntity(ReceiptDetail condition) {
        return receiptDetailMapper.selectListAgvEntity(condition);
    }


    public ReceiptDetail selectFirstEntity(ReceiptDetail condition) {
        ReceiptDetail item = aotuMapper.selectFirstEntity(condition);
        return item;
    }

    public ReceiptDetail selectEntityById(Integer id) {
        return aotuMapper.selectEntityById(id);
    }

    public List<Map<String, Object>> selectListMapByEqual(String columns, ReceiptDetail condition) {
        return aotuMapper.selectListMapByEqual(columns, condition);
    }

    public Map<String, Object> selectFirstMap(String columns, ReceiptDetail condition) {
        Map<String, Object> item = aotuMapper.selectFirstMap(columns, condition);
        return item;
    }

    public int insert(ReceiptDetail record) {
        return aotuMapper.insert(record);
    }

    public int updateByModel(ReceiptDetail record) {
        return aotuMapper.updateByModel(record);
    }

    public int updateByCondition(ReceiptDetail record, ReceiptDetail condition) {
        return aotuMapper.updateByCondition(record, condition);
    }

    public int deleteById(Integer id) {
        return aotuMapper.deleteById(id);
    }

    public int deleteByCondition(ReceiptDetail condition) {
        return aotuMapper.deleteByCondition(condition);
    }

    @Override
    public List<ReceiptDetail> getReceiptDetailListByLike(ReceiptDetail receiptDetail) {
        return receiptDetailMapper.getReceiptDetailListByLike(receiptDetail);
    }

    @Override
    public List<Integer> insertTodayReceiptDetail(int headerId, List<ReceiptBill> receiptBills, boolean isCompletedQty, String companyId, String companyCode) {
        List<Integer> mReceiptDetailIds = new ArrayList<>();
        ReceiptHeader condition = new ReceiptHeader();
        condition.setId(headerId);
        condition.setWarehouseId(ShiroUtils.getWarehouseId());
        condition.setDeleted(false);
        condition.setEnable(true);
        ReceiptHeader receiptHeader = receiptHeaderService.selectFirstEntity(condition);

        for(ReceiptBill receiptBill : receiptBills) {
            ReceiptDetail receiptDetail = new ReceiptDetail();
            receiptDetail.setId(null);
            receiptDetail.setWarehouseId(ShiroUtils.getWarehouseId());
            receiptDetail.setWarehouseCode(ShiroUtils.getWarehouseCode());
            receiptDetail.setCompanyId(Integer.parseInt(companyId));
            receiptDetail.setCompanyCode(companyCode);
            receiptDetail.setReceiptId(receiptHeader.getId());
            receiptDetail.setReceiptCode(receiptHeader.getCode());
            receiptDetail.setMaterialCode(receiptBill.getMaterialCode());
            receiptDetail.setInventoryStatus("good");
            receiptDetail.setQty(receiptBill.getQty());
            if(isCompletedQty) {
                receiptDetail.setQtyCompleted(receiptBill.getQty());
            }
            receiptDetail.setStatus((short) 200);
            receiptDetail.setCreatedBy(ShiroUtils.getLoginName());
            receiptDetail.setLastUpdatedBy(ShiroUtils.getLoginName());
            receiptDetail.setDeleted(false);
            receiptDetail.setBatch(receiptBill.getBatch());
            receiptDetail.setProject(receiptBill.getProject());
            insert(receiptDetail);
            mReceiptDetailIds.add(receiptDetail.getId());
        }
        return mReceiptDetailIds;
    }

    @Override
    public AjaxResult check(ReceiptDetail receiptDetail) {
        ReceiptDetail record=this.selectEntityById(receiptDetail.getId());
        ContainerCapacity containerCapacity=new ContainerCapacity();
        containerCapacity.setMaterialCode(record.getMaterialCode());
        containerCapacity=containerCapacityService.selectFirstEntity(containerCapacity);
        if(containerCapacity==null){
            throw new ServiceException("id为"+receiptDetail.getId()+"细单的物料没有在AGV库区的满盘度,请先设置该物料的满盘度.");
        }
        return AjaxResult.success("");
    }

    @Override
    public void updateMatarial(ReceiptDetail receiptDetail) {
        Material material=new Material();
        material.setCode(receiptDetail.getMaterialCode());
        material.setWarehouseCode(receiptDetail.getWarehouseCode());
        material=materialService.selectFirstEntity(material);
        if(material==null){
            throw new ServiceException("id为"+receiptDetail.getId()+"的物料在系统中不存在");
        }
        if(StringUtils.isEmpty(material.getZoneCode())){
            material.setZoneCode(receiptDetail.getZoneCode());
            int result=materialService.updateByModel(material);
            if(result<1){
                throw new ServiceException("分配库区失败");
            }
        }
    }

    @Override
    public List<Map<String, Object>> selectList(String code, String goodsShelfNo) {
         String warehouseCode=ShiroUtils.getWarehouseCode();
        String shelfNo=goodsShelfNo.substring(1,5);
        return receiptDetailMapper.selectLists(code,shelfNo,warehouseCode);
    }

    @Override
    public ReceiptDetail rossDoccking(ReceiptDetail receiptDetail, Integer id) {
        return receiptDetailMapper.rossDoccking(receiptDetail,id);
    }

    @Override
    public List<ReceiptDetail> getReceiptQtyLast7Days() {
        return receiptDetailMapper.getReceiptQtyLast7Days();
    }

    @Override
    public List<ReceiptDetail> getWarehouseReceipt() {
        return receiptDetailMapper.getWarehouseReceipt();
    }

    @Override
    public List<ReceiptDetail> getCompanyReceipt() {
        return receiptDetailMapper.getCompanyReceipt();
    }

    /**
     * 新增入库明细
     * @param receiptDetail
     * @return
     */
    @Override
    @Transactional
    public AjaxResult insertDetail(ReceiptDetail receiptDetail) {
        ReceiptHeader receiptHeader = receiptHeaderService.selectEntityById(receiptDetail.getReceiptId());
        if(receiptHeader==null){
            return AjaxResult.error("找不到主单据");
        }
        if (receiptHeader.getFirstStatus() > 100) {
            return AjaxResult.error("单据进入订单池后,不允许新增明细");
        }
        List CodeList = ShiroUtils.getCompanyCodeList();
        CodeList.add("");
        Material material = new Material();
        material.setCode(receiptDetail.getMaterialCode());
        material.setWarehouseId(ShiroUtils.getWarehouseId());
        material.setCompanyCodeList(CodeList);
        material.setDeleted(false);
        Map<String, Object> map = materialService.selectFirstMap("id", material);
        if (map == null)
            return AjaxResult.error("物料不存在!");
        receiptDetail.setId(null);
        receiptDetail.setZoneCode("LK");
        receiptDetail.setWarehouseId(ShiroUtils.getWarehouseId());
        receiptDetail.setWarehouseCode(ShiroUtils.getWarehouseCode());
        receiptDetail.setCreated(null);
        receiptDetail.setCreatedBy(ShiroUtils.getLoginName());
        receiptDetail.setLastUpdated(null);
        receiptDetail.setLastUpdatedBy(ShiroUtils.getLoginName());
        if(this.insert(receiptDetail) > 0){
            //更新表头的总行数和总数量统计
            receiptHeader.setTotalQty(receiptHeader.getTotalQty().add(receiptDetail.getQty()));
            receiptHeader.setTotalLines(receiptHeader.getTotalLines() + 1);
            receiptHeaderService.updateByModel(receiptHeader);
            return AjaxResult.success("新增单据明细成功");
        }
        else
            return AjaxResult.error("新增单据明细失败");
    }

    @Override
    public AjaxResult updateDetail(ReceiptDetail receiptDetail) {
        ReceiptHeader receiptHeader = receiptHeaderService.selectEntityById(receiptDetail.getReceiptId());
        if(receiptHeader==null){
            return AjaxResult.error("找不到主单据");
        }
        if (receiptHeader.getFirstStatus() > 100) {
            return AjaxResult.error("单据进入订单池后,不允许修改明细");
        }
        Material material = new Material();
        material.setCode(receiptDetail.getMaterialCode());
        material.setWarehouseId(ShiroUtils.getWarehouseId());
        material.setDeleted(false);
        Map<String, Object> map = materialService.selectFirstMap("id", material);
        if (map == null)
            return AjaxResult.error("物料不存在!");
        //更新表头的总数量统计
        ReceiptDetail entity = this.selectEntityById(receiptDetail.getId());
        receiptHeader.setTotalQty(receiptHeader.getTotalQty().add(receiptDetail.getQty()).subtract(entity.getQty()));
        receiptHeaderService.updateByModel(receiptHeader);
        receiptDetail.setReceiptCode(null);
        receiptDetail.setStatus(null);
        receiptDetail.setDeleted(null);
        receiptDetail.setWarehouseId(null);
        receiptDetail.setWarehouseCode(null);
        receiptDetail.setQtyCompleted(null);
        this.updateByModel(receiptDetail);
        return AjaxResult.success("修改单据明细成功");
    }


    /**
     * 删除出库单据明细
     * @param id
     * @return
     */
    @Override
    @Transactional
    public AjaxResult deleteDetail(String id) {
        if (StringUtils.isEmpty(id))
            return AjaxResult.error("id不能为空");
        String[] ids = Convert.toStrArray(id);
        List<Map<String,Integer>> list = receiptDetailMapper.SelectFirstStatus(ids);
        if(list.size() < 1){
            return AjaxResult.error("找不到主单据!");
        }
        if(list.size() > 1){
            return AjaxResult.error("有多个主单据,不能一起删除!");
        }
        if(list.get(0).get("firstStatus") > 100){
            return AjaxResult.error("单据进入订单池后不允许删除");
        }
        Integer result = receiptDetailMapper.batchDelete(ids);
        if (result > 0) {
            Integer headerId=list.get(0).get("id");
            Map<String,String> map= receiptDetailMapper.StatisticalByReceiptId(headerId);
           if(DataUtils.getInteger(map.get("totalLines")) <= 0)    {
               receiptHeaderService.deleteById(headerId);
           }
           else    {
               //更新表头的总行数和总数量统计
               ReceiptHeader receiptHeader=new ReceiptHeader();
               receiptHeader.setId(headerId);
               receiptHeader.setTotalLines(DataUtils.getInteger(map.get("totalLines")));
               receiptHeader.setTotalQty(DataUtils.getBigDecimal(map.get("totalQty")));
               receiptHeaderService.updateByModel(receiptHeader);
           }
            return AjaxResult.success("删除单据明细成功");
        }
        else
            return AjaxResult.error("删除单据明细失败");
    }



}