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 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); ListdeliveryDetailInfos = 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); ListdetailInfos = new ArrayList<>(); ListlocusInfos = new ArrayList<>(); List 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); ListdeliveryDetailInfos = new ArrayList<>(); ListstockInfos = 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 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 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()); } Mapmap = new HashMap<>(); List deliveryOrderInfos = deliveryOrderService.getDeliveryOrderByCert(cert); if (deliveryOrderInfos == null || deliveryOrderInfos.size() == 0){ return new Msg(ERROR_50001.getCode(),ERROR_50001.getMsg()+":没有找到对应的出库记录!"); } ListdeliveryDetailInfoList = new ArrayList<>(); for (DeliveryOrderInfo deliveryOrderInfo : deliveryOrderInfos){ ListdeliveryDetailInfos = deliveryDetailService.getDetailByCode(deliveryOrderInfo.getOrdercode()); deliveryDetailInfoList.addAll(deliveryDetailInfos); } ListproductVos = deliveryOrderService.getProductVosByCert(cert); map.put("detail",deliveryDetailInfoList); map.put("product",productVos); return success(map); } @ApiOperation(value = "批量退库") @PostMapping("/returnBatch") @JsonParams public List returnBatch(@RequestBody JSONArray array) { ListmsgList = 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 deliveryDetailInfos = new ArrayList<>(); List 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; } }