郑永安
2023-06-19 59e91a4e9ddaf23cebb12993c774aa899ab22d16
src/main/java/com/gk/firework/Controller/DeliveryController.java
对比新文件
@@ -0,0 +1,469 @@
package com.gk.firework.Controller;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.gk.firework.Controller.Base.BaseController;
import com.gk.firework.Domain.*;
import com.gk.firework.Domain.Log.JsonParams;
import com.gk.firework.Domain.Utils.FilterObject;
import com.gk.firework.Domain.Utils.Msg;
import com.gk.firework.Domain.Utils.StringUtils;
import com.gk.firework.Domain.Vo.DirectionDetail;
import com.gk.firework.Domain.Vo.FireworkDeal;
import com.gk.firework.Domain.Vo.ProductVo;
import com.gk.firework.Service.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import static com.gk.firework.Domain.Enum.ErrorCode.*;
import static com.gk.firework.Domain.Enum.ErrorCode.ERROR_10003;
/**
 * @author : jingjy
 * @date : 2021/4/1 10:21
 */
@Api(tags = "出库接口")
@RestController
@RequestMapping("/delivery")
public class DeliveryController extends BaseController {
    @Autowired
    private DeliveryOrderService deliveryOrderService;
    @Autowired
    private DeliveryDetailService deliveryDetailService;
    @Autowired
    private UserService userService;
    @Autowired
    private StockService stockService;
    @Autowired
    private ProductService productService;
    @Autowired
    private ProductLocusService productLocusService;
    @Autowired
    private WarnContentService warnContentService;
    /**
     * @param jsonArray 接收json数组格式为:[{"id":"用户ID","rfids":"出库流向码,以逗号进行拼接","time":"出库时间","type":"1或者2;1:正常出库;2:退货出库"}]
     * @return msg
     */
    @ApiOperation(value = "出库",notes = "接收json数组格式为:[{\"id\":\"用户ID\",\"rfids\":\"出库流向码,以逗号进行拼接\",\"time\":\"出库时间\",\"type\":\"1或者2;1:正常出库;2:退货出库\"}]")
    @PostMapping("/out")
    @JsonParams
    public Msg deliveryStock(@RequestBody JSONArray jsonArray){
        Msg msg = new Msg(true);
        if (jsonArray.isEmpty()){
            msg.setCode(ERROR_10001.getCode());
            msg.setMessage(ERROR_10001.getMsg()+":未收到出库信息!");
            return msg;
        }
        for (int i = 0; i < jsonArray.size(); i++) {
            JSONObject jsonObject = jsonArray.getJSONObject(i);
            String userId = jsonObject.getString("id");
            String directionCodeStr = jsonObject.getString("rfids");
            String datetime = jsonObject.getString("time");
            String type = jsonObject.getString("type");
            String cert = jsonObject.getString("cert");
            Date date;
            DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            try {
                date = dateFormat.parse(datetime);
            } catch (ParseException e) {
                msg.setCode(ERROR_10003.getCode());
                msg.setMessage(ERROR_10003.getMsg()+":日期类型错误!");
                return msg;
            }
            if (StringUtils.isBlank(directionCodeStr)){
                msg.setCode(ERROR_10001.getCode());
                msg.setMessage(ERROR_10001.getMsg()+":流向码不能为空");
                return msg;
            }
            boolean isUser = userService.checkUserById(userId);
            if (!isUser){
                msg.setCode(ERROR_50001.getCode());
                msg.setMessage(ERROR_50001.getMsg()+":未找到相关用户信息,不能出库!");
                return msg;
            }
            UserInfo userInfo = userService.getById(userId);
            List<String> directionCodes = StringUtils.toList(directionCodeStr);
            //判断是否存在同时间同操作人出库记录
            boolean exist = deliveryOrderService.isOrderExist(datetime,userInfo);
            if (exist){
                continue;
            }
            //出库单创建
            DeliveryOrderInfo deliveryOrderInfo;
            String auth = getAuth();
            auth = StringUtils.isBlank(auth) ? "NOAUTH" : auth;
            deliveryOrderInfo = deliveryOrderService.generateDeliveryOrder(type,date,userInfo,cert,auth);
            List<DeliveryDetailInfo>deliveryDetailInfos = deliveryDetailService.generateDeliveryDetail(deliveryOrderInfo,userInfo,directionCodes);
            deliveryOrderService.save(deliveryOrderInfo);
            deliveryDetailService.saveBatch(deliveryDetailInfos);
            //扣库存
            stockService.deliveryByDetail(date,deliveryDetailInfos,userInfo);
        }
        return msg;
    }
    @ApiOperation(value = "快速出库",response = Msg.class)
    @PostMapping("/deliveryQuick")
    @JsonParams
    public Msg deliveryQuick(@RequestBody JSONArray jsonArray){
        Msg msg = new Msg(true);
        if (jsonArray.size() > 0)
        {
            for (int i = 0; i < jsonArray.size(); i++) {
                JSONObject jsonObject = jsonArray.getJSONObject(i);
                String userId = jsonObject.getString("id");
                String directionCodeFirst = jsonObject.getString("rfidfirst");
                String directionCodeLast = jsonObject.getString("rfidlast");
                String datetime = jsonObject.getString("time");
                String transport = jsonObject.getString("cert");
                //type 1.常规出库; 2.退货出库
                String type = "1";
                Date date;
                DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                try {
                    date = dateFormat.parse(datetime);
                } catch (ParseException e) {
                    return new Msg(ERROR_10003,"出库日期类型错误");
                }
                if (!(FireworkDeal.is22Characters(directionCodeFirst) && FireworkDeal.is22Characters(directionCodeLast))){
                    return new Msg(ERROR_10004,"流向码首尾不符合规则,无法快速出库");
                }
                boolean isUser = userService.checkUserById(userId);
                if (!isUser){
                    return new Msg(ERROR_50001,"未找到相关用户信息,不能出库");
                }
                UserInfo userInfo = userService.getById(userId);
                //判断是否存在同时间同操作人入库记录
                boolean exist = deliveryOrderService.isOrderExist(datetime,userInfo);
                if (exist){ continue; }
                String auth = getAuth();
                auth = StringUtils.isBlank(auth) ? "NOAUTH" : auth;
                DeliveryOrderInfo orderInfo = deliveryOrderService.generateDeliveryOrder(type,date,userInfo,transport, auth);
                List<DeliveryDetailInfo>detailInfos = new ArrayList<>();
                List<ProductLocusInfo>locusInfos = new ArrayList<>();
                List<ProductVo> productVos = new ArrayList<>();
                DirectionDetail detailFirst = FireworkDeal.dealDirectionCode(directionCodeFirst);
                DirectionDetail detailLast = FireworkDeal.dealDirectionCode(directionCodeLast);
                if (!detailFirst.getItemCode().equals(detailLast.getItemCode())){
                    return new Msg(ERROR_10004,"首尾商品编码不一致,无法快速出库");
                }
                if (Integer.parseInt(detailFirst.getSerialNo()) > Integer.parseInt(detailLast.getSerialNo())){
                    return new Msg(ERROR_10004,"首位商品序号大于末位,无法快速出库");
                }
                ProductVo productVo = productService.selectVoByDirection(directionCodeFirst);
                if (productVo == null){
                    return new Msg(ERROR_50001,"未找到相关产品信息,不能出库");
                }
                Integer firstNo = Integer.parseInt(detailFirst.getSerialNo());
                Integer lastNo = Integer.parseInt(detailLast.getSerialNo());
                int perBoxNum = Integer.parseInt(detailFirst.getBoxNo());
                int boxNum = ((lastNo-firstNo)/perBoxNum)+1;
                int totalNum = 0;
                for (int j=1;j<= boxNum;j++){
                    String dire = detailFirst.getItemCode()+detailFirst.getDateCode()+ String.format("%05d", firstNo)+String.format("%03d", perBoxNum);
                    DeliveryDetailInfo detailInfo = new DeliveryDetailInfo();
                    detailInfo.setDeliverycode(orderInfo.getOrdercode());
                    detailInfo.setDirectioncode(dire);
                    detailInfo.setItemcode(productVo.getItemCode());
                    detailInfo.setItemname(productVo.getName());
                    detailInfo.setCreateat(new Date());
                    detailInfo.setCreateby(userInfo.getUsername());
                    detailInfo.setNum(perBoxNum);
                    detailInfos.add(detailInfo);
                    ProductLocusInfo productLocusInfo = new ProductLocusInfo(dire,new Date(),date, userInfo.getCompany(),
                            null,ProductLocusInfo.DELIVERY_STATUS,productVo.getBoxNumber().toString());
                    locusInfos.add(productLocusInfo);
                    firstNo+=perBoxNum;
                    totalNum += perBoxNum;
                }
                FireworkDeal.getProductVos(directionCodeFirst,detailFirst,detailLast,productVos,productVo);
                orderInfo.setBoxnum(totalNum);
                deliveryOrderService.save(orderInfo);
                deliveryDetailService.saveBatch(detailInfos);
                productLocusService.insertBatch(locusInfos);
                stockService.deliveryByDetail(date,detailInfos,userInfo);
            }
        }
        return msg;
    }
    /**
     * 退货出库
     */
    @PostMapping("/entryReturn")
    @ApiOperation(value = "退货出库", httpMethod = "POST")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "filter.code", type = "JSONObject",
                    value = " JSONObject{\"datetime\":\"时间\",\"data\":[{\"directionCode\":\"流向码\"},{\"directionCode\":\"流向码\"}]}"),
    })
    @JsonParams
    public Msg getProductListByCodes(@RequestBody JSONObject object) {
        JSONArray jsonArray = object.getJSONArray("data");
        String datetime = object.getString("datetime");
        Date date;
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            date = dateFormat.parse(datetime);
        } catch (ParseException e) {
            return new Msg(ERROR_10003,"日期类型错误!");
        }
        //生成出库单号,类型,退货出库
        DeliveryOrderInfo deliveryOrderInfo;
        UserInfo userInfo = userService.getById(getUser().getId());
        String auth = getAuth();
        auth = StringUtils.isBlank(auth) ? "NOAUTH" : auth;
        deliveryOrderInfo = deliveryOrderService.generateDeliveryOrder(FireworkDeal.OTHER_DELIVERY,date,userInfo, null, auth);
        List<DeliveryDetailInfo>deliveryDetailInfos = new ArrayList<>();
        List<StockInfo>stockInfos = new ArrayList<>();
        for (int i = 0; i < jsonArray.size(); i++) {
            // 遍历 jsonArray 数组,把每一个对象转成 json 对象
            JSONObject jsonObject = jsonArray.getJSONObject(i);
            String directionCode = jsonObject.getString("directionCode");
            DirectionDetail directionDetail = FireworkDeal.dealDirectionCode(directionCode);
            ProductInfo productInfo = productService.selectByDirection(directionDetail.getItemCode());
            // 生成出库详情,库存OWNER设置为空
            DeliveryDetailInfo deliveryDetailInfo = new DeliveryDetailInfo();
            deliveryDetailInfo.setDirectioncode(directionCode);
            deliveryDetailInfo.setDeliverycode(deliveryOrderInfo.getOrdercode());
            deliveryDetailInfo.setItemcode(directionDetail.getItemCode());
            deliveryDetailInfo.setItemname(productInfo.getName());
            deliveryDetailInfo.setCreateat(new Date());
            deliveryDetailInfo.setCreateby(getUser().getUsername());
            deliveryDetailInfos.add(deliveryDetailInfo);
            StockInfo stockInfo = stockService.selectStockByDirection(directionCode);
            if (stockInfo == null){
                return new Msg(ERROR_50001,"库存信息未找到");
            }
            stockInfo.setOwner("");
            stockInfo.setModifiedby(userInfo.getUsername());
            stockInfo.setModifieddate(date);
            stockInfos.add(stockInfo);
        }
        deliveryOrderService.save(deliveryOrderInfo);
        deliveryDetailService.saveBatch(deliveryDetailInfos);
        stockService.updateStocks(stockInfos,userInfo);
        return success();
    }
    /**
    * @Description: 出库查询
    * @date 2021/4/15 12:05
    */
    @PostMapping("/outbound-query")
    @ApiOperation(value = "出库查询", httpMethod = "POST")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "pageIndex", value = "当前页码", required = true),
            @ApiImplicitParam(name = "pageSize", value = "页大小", required = true),
            @ApiImplicitParam(name = "filter.province", value = "省"),
            @ApiImplicitParam(name = "filter.city", value = "市"),
            @ApiImplicitParam(name = "filter.district", value = "区"),
            @ApiImplicitParam(name = "filter.street", value = "街道"),
            @ApiImplicitParam(name = "filter.committee", value = "委员会"),
            @ApiImplicitParam(name = "filter.starttime", value = "开始时间"),
            @ApiImplicitParam(name = "filter.endtime", value = "结束时间"),
            @ApiImplicitParam(name = "filter.transportcert", value = "运输证号码"),
            @ApiImplicitParam(name = "filter.enterprisename", value = "入库企业名称"),
            @ApiImplicitParam(name = "filter.safetysupervision", value = "安全监管分类"),
            @ApiImplicitParam(name = "filter.code", value = "单号"),
    })
    Object getOutboundInfo(@RequestBody FilterObject jsonFilter) {
        Integer pageIndex = jsonFilter.getPageIndex();
        Integer pageSize = jsonFilter.getPageSize();
        IPage page =  deliveryOrderService.selectPage(new Page<>(pageIndex, pageSize), jsonFilter.getFilter(), getUser());
        return success(page);
    }
    @PostMapping("/stock/outbound-query")
    @ApiOperation(value = "出库查询", httpMethod = "POST")
    Object getStockOutboundInfo(@RequestBody FilterObject jsonFilter) {
        Integer pageIndex = jsonFilter.getPageIndex();
        Integer pageSize = jsonFilter.getPageSize();
        IPage page =  deliveryOrderService.selectStockPage(new Page<>(pageIndex, pageSize), jsonFilter.getFilter(), getUser());
        return success(page);
    }
    /**
    * @Description: 出库导出
    * @date 2021/4/19 17:24
    */
    /**
     * @Description: 出库查询
     * @date 2021/4/15 12:05
     */
    @PostMapping("/export/outbound")
    @ApiOperation(value = "出库查询", httpMethod = "POST")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "pageIndex", value = "当前页码", required = true),
            @ApiImplicitParam(name = "pageSize", value = "页大小", required = true),
            @ApiImplicitParam(name = "filter.province", value = "省"),
            @ApiImplicitParam(name = "filter.city", value = "市"),
            @ApiImplicitParam(name = "filter.district", value = "区"),
            @ApiImplicitParam(name = "filter.street", value = "街道"),
            @ApiImplicitParam(name = "filter.committee", value = "委员会"),
            @ApiImplicitParam(name = "filter.starttime", value = "开始时间"),
            @ApiImplicitParam(name = "filter.endtime", value = "结束时间"),
            @ApiImplicitParam(name = "filter.transportcert", value = "运输证号码"),
            @ApiImplicitParam(name = "filter.enterprisename", value = "入库企业名称"),
    })
    Object exportOutbound(@RequestBody FilterObject jsonFilter) {
        List<DeliveryOrderInfo> list =  deliveryOrderService.selectExportList(jsonFilter.getFilter(), getUser());
        return success(list);
    }
    /**
     * @Description: 根据{出库单号}查询出库明细
     * @date 2021/4/15 12:05
     */
    @PostMapping("/outbound-detail")
    @ApiOperation(value = "出库单明细", httpMethod = "POST")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "pageIndex", value = "当前页码", required = true),
            @ApiImplicitParam(name = "pageSize", value = "页大小", required = true),
            @ApiImplicitParam(name = "filter.code", value = "入库单号code"),
    })
    Object getOutboundDetail(@RequestBody FilterObject jsonFilter) {
        Integer pageIndex = jsonFilter.getPageIndex();
        Integer pageSize = jsonFilter.getPageSize();
        IPage page =  deliveryDetailService.selectDetailPage(new Page<>(pageIndex, pageSize), jsonFilter.getFilter());
        return success(page);
    }
    /**
     * @Description: 根据{出库单code}查询出库明细并导出
     * @date 2021/4/15 11:09
     */
    @GetMapping("/export/outbound-detail")
    @ApiOperation(value = "出库单明细导出", httpMethod = "POST")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "code", value = "出库单号code"),
    })
    Object getOutboundDetail(@RequestParam String code) {
        List<Map> detailExport = deliveryDetailService.selectDetailExport(code);
        return success(detailExport);
    }
    @GetMapping("/cert")
    @ApiOperation(value = "根据运输证查询出库明细", httpMethod = "GET")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "cert", value = "运输证号"),
    })
    Msg getDeliveryDetailByCert(@RequestParam String cert){
        if (StringUtils.isBlank(cert)){
            return new Msg(ERROR_10001.getCode(),ERROR_10001.getMsg());
        }
        Map<String,List>map = new HashMap<>();
        List<DeliveryOrderInfo> deliveryOrderInfos = deliveryOrderService.getDeliveryOrderByCert(cert);
        if (deliveryOrderInfos == null || deliveryOrderInfos.size() == 0){
            return new Msg(ERROR_50001.getCode(),ERROR_50001.getMsg()+":没有找到对应的出库记录!");
        }
        List<DeliveryDetailInfo>deliveryDetailInfoList = new ArrayList<>();
        for (DeliveryOrderInfo deliveryOrderInfo : deliveryOrderInfos){
            List<DeliveryDetailInfo>deliveryDetailInfos = deliveryDetailService.getDetailByCode(deliveryOrderInfo.getOrdercode());
            deliveryDetailInfoList.addAll(deliveryDetailInfos);
        }
        List<ProductVo>productVos = deliveryOrderService.getProductVosByCert(cert);
        map.put("detail",deliveryDetailInfoList);
        map.put("product",productVos);
        return success(map);
    }
    @ApiOperation(value = "批量退库")
    @PostMapping("/returnBatch")
    @JsonParams
    public List<Msg> returnBatch(@RequestBody JSONArray array) {
        List<Msg>msgList = new ArrayList<>();
        if (array.size() < 1) {
            return null;
        }
        for (int j = 0; j < array.size(); j++) {
            // 遍历 jsonArray 数组,把每一个对象转成 json 对象
            JSONObject object = array.getJSONObject(j);
            JSONArray jsonArray = object.getJSONArray("data");
            String datetime = object.getString("datetime");
            Date date;
            DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            try {
                date = dateFormat.parse(datetime);
            } catch (ParseException e) {
                msgList.add(new Msg(ERROR_10003, "日期类型错误!"));
                continue;
            }
            //生成出库单号,类型,退货出库
            DeliveryOrderInfo deliveryOrderInfo;
            UserInfo userInfo = userService.getById(getUser().getId());
            String auth = getAuth();
            auth = StringUtils.isBlank(auth) ? "NOAUTH" : auth;
            deliveryOrderInfo = deliveryOrderService.generateDeliveryOrder(FireworkDeal.OTHER_DELIVERY, date, userInfo, null, auth);
            List<DeliveryDetailInfo> deliveryDetailInfos = new ArrayList<>();
            List<StockInfo> stockInfos = new ArrayList<>();
            StringBuilder stringBuilder = new StringBuilder();
            boolean flag = false;
            for (int i = 0; i < jsonArray.size(); i++) {
                // 遍历 jsonArray 数组,把每一个对象转成 json 对象
                JSONObject jsonObject = jsonArray.getJSONObject(i);
                String directionCode = jsonObject.getString("directionCode");
                DirectionDetail directionDetail = FireworkDeal.dealDirectionCode(directionCode);
                ProductInfo productInfo = productService.selectByDirection(directionDetail.getItemCode());
                // 生成出库详情,库存OWNER设置为空
                DeliveryDetailInfo deliveryDetailInfo = new DeliveryDetailInfo();
                deliveryDetailInfo.setDirectioncode(directionCode);
                deliveryDetailInfo.setDeliverycode(deliveryOrderInfo.getOrdercode());
                deliveryDetailInfo.setItemcode(directionDetail.getItemCode());
                deliveryDetailInfo.setItemname(productInfo.getName());
                deliveryDetailInfo.setCreateat(new Date());
                deliveryDetailInfo.setCreateby(getUser().getUsername());
                deliveryDetailInfos.add(deliveryDetailInfo);
                StockInfo stockInfo = stockService.selectStockByDirection(directionCode);
                if (stockInfo == null) {
                    stringBuilder.append(directionCode).append("库存信息未找到");
                    flag = true;
                    continue;
                }
                stockInfo.setOwner("");
                stockInfos.add(stockInfo);
            }
            if (flag){
                msgList.add(new Msg(ERROR_50001,stringBuilder.toString()));
                continue;
            }
            deliveryOrderService.save(deliveryOrderInfo);
            deliveryDetailService.saveBatch(deliveryDetailInfos);
            stockService.updateStocks(stockInfos, getUser());
            msgList.add(new Msg(SUCCESS));
        }
        return msgList;
    }
}