| | |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import zy.cloud.wms.common.config.CodeCoolException; |
| | | import zy.cloud.wms.common.model.OrderStoDto; |
| | | import zy.cloud.wms.common.service.asrs.AsrsService; |
| | | import zy.cloud.wms.common.service.asrs.entity.Result; |
| | | import zy.cloud.wms.common.utils.VersionUtils; |
| | | import zy.cloud.wms.manager.entity.*; |
| | | import zy.cloud.wms.manager.entity.param.StockTransferParam; |
| | | import zy.cloud.wms.manager.service.CustOrderService; |
| | | import zy.cloud.wms.manager.service.LocDetlService; |
| | | import zy.cloud.wms.manager.service.MatService; |
| | | import zy.cloud.wms.manager.service.PakoutService; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | import java.util.Optional; |
| | | import java.util.*; |
| | | |
| | | /** |
| | | * Created by vincent on 2021/3/1 |
| | |
| | | private CustOrderService custOrderService; |
| | | @Autowired |
| | | private SnowflakeIdWorker snowflakeIdWorker; |
| | | @Autowired |
| | | private AsrsService asrsService; |
| | | |
| | | @Transactional |
| | | public List<StoPreTab> stockOutPreview(OrderStoDto dto) { |
| | | if (Cools.isEmpty(dto) || Cools.isEmpty(dto.getCustOrders())) { |
| | | throw new CoolException("数据异常,请联系管理员"); |
| | | } |
| | | List<StoPreTab> res = new ArrayList<>(); |
| | | // 检查库存是否足够 |
| | | locDetlService.checkLocDetlCount(dto.getNumber()); |
| | | List<StoPreTab> result = new ArrayList<>(); |
| | | List<StockTransferParam> transferParams = locDetlService.checkLocDetlCountOfRes(dto.getNumber()); |
| | | if (!Cools.isEmpty(transferParams)) { |
| | | // 查看立库库存 |
| | | Result result = asrsService.stockTransferPrew(transferParams); |
| | | if (result.getCode() == 500) { |
| | | throw new CodeCoolException("20001-" + String.valueOf(result.getData())); |
| | | } |
| | | if (result.getCode() == 200) { |
| | | res = (List<StoPreTab>) result.getData(); |
| | | } |
| | | } |
| | | |
| | | for (CustOrder custOrder : dto.getCustOrders()) { |
| | | // 判断物料是否存在 |
| | | Mat mat = matService.selectByMatnr(custOrder.getUserCode()); |
| | |
| | | tab.setRemQty(tab.getTotal() - tab.getReduce()); |
| | | tab.setPrior(locDetlService.isPrior(locDetl.getNodeId(), mat.getMatnr())); |
| | | tab.setPrior$(tab.getPrior()?"✔":"×"); |
| | | result.add(tab); |
| | | tab.setType(1); |
| | | res.add(tab); |
| | | // 剩余待出数量递减 |
| | | issued = issued - locDetl.getAnfme(); |
| | | } |
| | | } |
| | | |
| | | } |
| | | return result; |
| | | res.sort(new Comparator<StoPreTab>() { |
| | | @Override |
| | | public int compare(StoPreTab o1, StoPreTab o2) { |
| | | // return o1.getMatnr().length() - o2.getMatnr().length(); |
| | | return (int) (o1.getAnfme() - o2.getAnfme()); |
| | | } |
| | | }); |
| | | return res; |
| | | } |
| | | |
| | | @Transactional |
| | |
| | | @Value("${asrs.baseUrl}") |
| | | private String asrsBaseUrl; |
| | | |
| | | public Result stockTransferPrew(List<StockTransferParam> params) { |
| | | try { |
| | | String response = new HttpHandler.Builder() |
| | | .setUri(asrsBaseUrl) |
| | | .setPath("/open/api/stockOut/prew") |
| | | .setJson(JSON.toJSONString(params)) |
| | | .build() |
| | | .doPost(); |
| | | return JSON.parseObject(response, Result.class); |
| | | } catch (IOException e) { |
| | | e.printStackTrace(); |
| | | return new Result(500, "服务器异常", null); |
| | | } |
| | | } |
| | | |
| | | public Boolean stockTransfer(List<StockTransferParam> params) { |
| | | try { |
| | | String response = new HttpHandler.Builder() |
| | |
| | | package zy.cloud.wms.common.service.asrs.entity; |
| | | |
| | | import lombok.Data; |
| | | import zy.cloud.wms.manager.entity.StoPreTab; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * Created by vincent on 2021/3/20 |
| | |
| | | |
| | | private String msg; |
| | | |
| | | private Object data; |
| | | private List<StoPreTab> data; |
| | | |
| | | public Result() { |
| | | } |
| | | |
| | | public Result(Integer code, String msg, List<StoPreTab> data) { |
| | | this.code = code; |
| | | this.msg = msg; |
| | | this.data = data; |
| | | } |
| | | } |
| | |
| | | data.getETypeID(), // 经手人编号[非空] |
| | | detl0.getUserCode(), // 商品编号 |
| | | detl0.getQty(), // 商品数量 |
| | | detl0.getQty(), // 总数量 |
| | | detl0.getPrice(), // 商品单价 |
| | | detl0.getComment(), // 商品备注[非空] |
| | | 0, // 状态 |
| | |
| | | // 表体 |
| | | GetOrderResultDetl0 detl0 = new GetOrderResultDetl0(); |
| | | detl0.setUserCode(custOrder.getUserCode()); |
| | | detl0.setQty(custOrder.getQty()); |
| | | detl0.setQty(custOrder.getTotal()); |
| | | detl0.setPrice(custOrder.getPrice()); |
| | | detl0.setComment(custOrder.getComment()); |
| | | list.add(detl0); |
| | |
| | | private Double qty; |
| | | |
| | | /** |
| | | * 总数量 |
| | | */ |
| | | @ApiModelProperty(value= "总数量") |
| | | private Double total; |
| | | |
| | | /** |
| | | * 商品单价 |
| | | */ |
| | | @ApiModelProperty(value= "商品单价") |
| | |
| | | |
| | | public CustOrder() {} |
| | | |
| | | public CustOrder(String number,String billDate,String bTypeId,String eTypeId,String userCode,Double qty,Double price,String comment,Integer status,Date createTime,Date updateTime,String memo) { |
| | | public CustOrder(String number,String billDate,String bTypeId,String eTypeId,String userCode,Double qty,Double total,Double price,String comment,Integer status,Date createTime,Date updateTime,String memo) { |
| | | this.number = number; |
| | | this.billDate = billDate; |
| | | this.bTypeId = bTypeId; |
| | | this.eTypeId = eTypeId; |
| | | this.userCode = userCode; |
| | | this.qty = qty; |
| | | this.total = total; |
| | | this.price = price; |
| | | this.comment = comment; |
| | | this.status = status; |
| | |
| | | this.qty = qty; |
| | | } |
| | | |
| | | public Double getTotal() { |
| | | return total; |
| | | } |
| | | |
| | | public void setTotal(Double total) { |
| | | this.total = total; |
| | | } |
| | | |
| | | public Double getPrice() { |
| | | return price; |
| | | } |
| | |
| | | |
| | | private String prior$; |
| | | |
| | | private Integer type; |
| | | |
| | | } |
| | |
| | | |
| | | private Double anfme; |
| | | |
| | | private Double total; |
| | | |
| | | |
| | | } |
| | |
| | | |
| | | @Update("delete from man_cust_order where number=#{number}") |
| | | int delete(@Param("number") String number); |
| | | |
| | | @Update("update man_cust_order_log set qty = #{qty} where number=#{number} and user_code=#{userCode}") |
| | | int updateQty(@Param("number") String number, @Param("userCode") String userCode, @Param("qty") Double qty); |
| | | |
| | | } |
| | |
| | | |
| | | boolean updateStatus(String number, Integer status); |
| | | |
| | | boolean updateQty(String number, String userCode, Double anfme); |
| | | |
| | | } |
| | |
| | | import com.baomidou.mybatisplus.plugins.Page; |
| | | import com.baomidou.mybatisplus.service.IService; |
| | | import zy.cloud.wms.manager.entity.LocDetl; |
| | | import zy.cloud.wms.manager.entity.param.StockTransferParam; |
| | | |
| | | import java.util.List; |
| | | |
| | |
| | | */ |
| | | void checkLocDetlCount(String number); |
| | | |
| | | List<StockTransferParam> checkLocDetlCountOfRes(String number); |
| | | |
| | | /** |
| | | * 减少库存 |
| | | */ |
| | |
| | | public boolean updateStatus(String number, Integer status) { |
| | | return this.baseMapper.updateStatus(number, status) > 0; |
| | | } |
| | | |
| | | @Override |
| | | public boolean updateQty(String number, String userCode, Double anfme) { |
| | | return this.baseMapper.updateQty(number, userCode, anfme) > 0; |
| | | } |
| | | } |
| | |
| | | import zy.cloud.wms.manager.entity.LocDetl; |
| | | import zy.cloud.wms.manager.entity.Mat; |
| | | import zy.cloud.wms.manager.entity.Prior; |
| | | import zy.cloud.wms.manager.entity.param.StockTransferParam; |
| | | import zy.cloud.wms.manager.mapper.LocDetlMapper; |
| | | import zy.cloud.wms.manager.service.CustOrderService; |
| | | import zy.cloud.wms.manager.service.LocDetlService; |
| | |
| | | } |
| | | |
| | | @Override |
| | | public List<StockTransferParam> checkLocDetlCountOfRes(String number) { |
| | | List<CustOrder> custOrders = custOrderService.selectList(new EntityWrapper<CustOrder>().eq("number", number).eq("status", 1)); |
| | | boolean asrs = false; |
| | | List<StockTransferParam> params = new ArrayList<>(); |
| | | for (CustOrder custOrder : custOrders) { |
| | | Double count = this.baseMapper.selectCountByMatnr(custOrder.getUserCode()); |
| | | if (count == null) { |
| | | count = 0.0D; |
| | | } |
| | | if (count < custOrder.getQty()) { |
| | | if (!asrs) { asrs = true; } |
| | | StockTransferParam param = new StockTransferParam(); |
| | | param.setMatnr(custOrder.getUserCode()); |
| | | param.setAnfme(custOrder.getQty() - count); |
| | | param.setTotal(custOrder.getQty()); |
| | | params.add(param); |
| | | } |
| | | } |
| | | return params; |
| | | } |
| | | |
| | | @Override |
| | | public Boolean reduceStock(Long nodeId, String matnr, Double anfme) { |
| | | return this.baseMapper.reduceStock(nodeId, matnr, anfme)>0; |
| | | } |
| | |
| | | null, // 经手人编号[空] |
| | | dto.getMatnr(), // 商品编号 |
| | | dto.getCount(), // 商品数量 |
| | | dto.getCount(), // 总数量 |
| | | Cools.isEmpty(mat.getName())?0.0D:Double.parseDouble(mat.getName()), // 商品单价 |
| | | null, // 商品备注[空] |
| | | 1, // 状态 |
| | |
| | | } |
| | | |
| | | @Override |
| | | @Transactional |
| | | public R stockTransfer(String number, Long userId) { |
| | | List<CustOrder> custOrders = custOrderService.selectList(new EntityWrapper<CustOrder>().eq("number", number).eq("status", 1)); |
| | | boolean error = false; |
| | | boolean asrs = false; |
| | | List<StockTransferParam> params = new ArrayList<>(); |
| | | for (CustOrder custOrder : custOrders) { |
| | | Double count = locDetlService.selectCountByMatnr(custOrder.getUserCode()); |
| | |
| | | count = 0.0D; |
| | | } |
| | | if (count < custOrder.getQty()) { |
| | | if (!error) { |
| | | error = true; |
| | | } |
| | | if (!asrs) { asrs = true; } |
| | | StockTransferParam param = new StockTransferParam(); |
| | | param.setMatnr(custOrder.getUserCode()); |
| | | param.setAnfme(custOrder.getQty() - count); |
| | | params.add(param); |
| | | } |
| | | } |
| | | if (error) { |
| | | if (asrs) { |
| | | if (asrsService.stockTransfer(params)) { |
| | | for (StockTransferParam param : params) { |
| | | // 修改销售订单待出数量 |
| | | if (!custOrderService.updateQty(number, param.getMatnr(), param.getAnfme())) { |
| | | throw new CoolException("修改销售订单待出数量失败"); |
| | | } |
| | | } |
| | | return R.ok("库存调拨成功"); |
| | | } else { |
| | | return R.error("立库调拨失败,请联系管理员"); |
| | |
| | | <result column="eType_id" property="eTypeId" /> |
| | | <result column="user_code" property="userCode" /> |
| | | <result column="qty" property="qty" /> |
| | | <result column="total" property="total" /> |
| | | <result column="price" property="price" /> |
| | | <result column="comment" property="comment" /> |
| | | <result column="status" property="status" /> |
| | |
| | | ,closeBtn: false |
| | | ,offset: '100px' |
| | | // ,area: ['800px','450px'] |
| | | ,area: '800px' |
| | | ,area: '1000px' |
| | | ,shade: 0.5 |
| | | ,shadeClose: true |
| | | ,id: 'LAY_layuipro' |
| | |
| | | height: 432, |
| | | cols: [[ |
| | | {field: 'title', title: '商品', align: 'center'}, |
| | | {field: 'anfme', title: '总数量', align: 'center', style: 'font-weight: bold', width: 80}, |
| | | {field: 'anfme', title: '总数量', align: 'center', style: 'font-weight: bold', width: 90}, |
| | | {field: 'type', title: '仓库', align: 'center', templet: '#typeTpl', width: 90}, |
| | | {field: 'locNo', title: '货位', align: 'center'}, |
| | | {field: 'prior$', title: '推荐货位', align: 'center', width: 100}, |
| | | {field: 'reduce', title: '数量', align: 'center', width: 80, style: 'font-weight: bold'}, |
| | | {field: 'reduce', title: '数量', align: 'center', width: 90, style: 'font-weight: bold'}, |
| | | // {field: 'remQty', title: '余量', align: 'center', width: 80}, |
| | | {field: 'total', title: '总量', align: 'center', width: 80}, |
| | | {field: 'total', title: '总量', align: 'center', width: 90}, |
| | | ]], |
| | | done: function () { |
| | | tableX.merges('stoPreTab', [0,1]); |
| | | tableX.merges('stoPreTab', [0,1,2]); |
| | | $('.layui-table-body.layui-table-main').css("overflow", "auto") |
| | | } |
| | | }); |
| | |
| | | >{{d.status$}}</span> |
| | | </script> |
| | | |
| | | <script type="text/html" id="typeTpl"> |
| | | <span name="type" |
| | | {{# if( d.type === 1){ }} |
| | | class="layui-badge layui-badge-blue" ><span style="display: none">{{d.number}}</span>平仓</span> |
| | | {{# } else if(d.type === 2){ }} |
| | | class="layui-badge layui-badge-red" ><span style="display: none">{{d.number}}</span>立库</span> |
| | | {{# } }} |
| | | </script> |
| | | |
| | | <script type="text/javascript" src="../../static/js/jquery/jquery-3.3.1.min.js"></script> |
| | | <script type="text/javascript" src="../../static/js/jquery/jQuery.print.js"></script> |
| | | <script type="text/javascript" src="../../static/js/handlebars/handlebars-v4.5.3.js"></script> |