纽维盛wms初始化-截至现在wms2.0已完善(带数据库)
10个文件已删除
55个文件已修改
7个文件已添加
| | |
| | | public R pdaSearch(@RequestParam(required = false) String condition) { |
| | | EntityWrapper<Mat> wrapper = new EntityWrapper<>(); |
| | | if (!Cools.isEmpty(condition)) { |
| | | // wrapper.like("matnr", condition).or().like("maktx", condition); |
| | | wrapper.like("matnr", condition).or().like("specs", condition); |
| | | wrapper.like("matnr", condition).or().like("maktx", condition); |
| | | } |
| | | wrapper.orderBy("create_time", false); |
| | | List<Mat> mats = matService.selectList(wrapper); |
| | |
| | | package com.zy.asrs.controller; |
| | | |
| | | import com.alibaba.fastjson.JSON; |
| | | import com.baomidou.mybatisplus.mapper.EntityWrapper; |
| | | import com.baomidou.mybatisplus.plugins.Page; |
| | | import com.core.annotations.AppAuth; |
| | | import com.core.common.*; |
| | | import com.core.exception.CoolException; |
| | | import com.zy.asrs.entity.param.MatSyncParam; |
| | | import com.zy.asrs.entity.param.OpenOrderCompleteParam; |
| | | import com.zy.asrs.entity.param.OpenOrderPakinParam; |
| | | import com.zy.asrs.entity.param.OpenOrderPakoutParam; |
| | | import com.zy.asrs.service.OpenService; |
| | | import com.zy.asrs.entity.*; |
| | | import com.zy.asrs.entity.param.*; |
| | | import com.zy.asrs.mapper.ReportQueryMapper; |
| | | import com.zy.asrs.service.*; |
| | | import com.zy.common.model.DetlDto; |
| | | import com.zy.common.web.BaseController; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import javax.annotation.Resource; |
| | | import javax.servlet.http.HttpServletRequest; |
| | | import java.util.ArrayList; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | import java.text.SimpleDateFormat; |
| | | import java.util.*; |
| | | |
| | | /** |
| | | * Created by vincent on 2022/4/8 |
| | |
| | | |
| | | @Autowired |
| | | private OpenService openService; |
| | | |
| | | @Resource |
| | | private WrkMastService wrkMastService; |
| | | |
| | | @Resource |
| | | private WrkDetlService wrkDetlService; |
| | | |
| | | @Resource |
| | | private WaitPakinService waitPakinService; |
| | | |
| | | @Resource |
| | | private ReportQueryMapper reportQueryMapper; |
| | | |
| | | @Resource |
| | | private LocDetlService locDetlService; |
| | | |
| | | @Resource |
| | | private MatService matService; |
| | | |
| | | /** |
| | | * 任务查询接口 |
| | | */ |
| | | @PostMapping("/queryTask") |
| | | public synchronized R queryTask(@RequestBody QueryTaskParam param) { |
| | | if (Cools.isEmpty(param)) { |
| | | return R.parse(BaseRes.PARAM); |
| | | } |
| | | if (Cools.isEmpty(param.getTaskNo())) { |
| | | return R.error("任务号[taskNo]不能为空"); |
| | | } |
| | | WrkMast wrkMast = wrkMastService.selectById(param.getTaskNo()); |
| | | if (wrkMast == null) { |
| | | return R.error("任务不存在"); |
| | | } |
| | | |
| | | List<WrkDetl> wrkDetls = wrkDetlService.selectByWrkNo(Integer.valueOf(param.getTaskNo())); |
| | | |
| | | HashMap<String, Object> map = new HashMap<>(); |
| | | map.put("taskNo", param.getTaskNo()); |
| | | map.put("ioType", wrkMast.getIoType()); |
| | | map.put("wrkDetls", wrkDetls); |
| | | return R.ok().add(map); |
| | | } |
| | | |
| | | /** |
| | | * 组托查询接口 |
| | | */ |
| | | @PostMapping("/queryComb") |
| | | public synchronized R queryComb(@RequestBody QueryCombParam param) { |
| | | if (Cools.isEmpty(param)) { |
| | | return R.parse(BaseRes.PARAM); |
| | | } |
| | | if (Cools.isEmpty(param.getBarcode())) { |
| | | return R.error("托盘码[barcode]不能为空"); |
| | | } |
| | | |
| | | List<WaitPakin> waitPakins = waitPakinService.selectList(new EntityWrapper<WaitPakin>().eq("zpallet", param.getBarcode())); |
| | | |
| | | HashMap<String, Object> map = new HashMap<>(); |
| | | map.put("barcode", param.getBarcode()); |
| | | map.put("combDetls", waitPakins); |
| | | return R.ok().add(map); |
| | | } |
| | | |
| | | /** |
| | | * 库存信息查询接口 |
| | | */ |
| | | @GetMapping("/queryLoc") |
| | | public synchronized R queryLoc() { |
| | | List<Map<String, Object>> pie = new ArrayList<>(); |
| | | LocChartPie locUseRate = reportQueryMapper.getLocUseRate(); |
| | | |
| | | if (locUseRate != null) { |
| | | Map<String, Object> map = new HashMap<>(); |
| | | map.put("name", "在库"); |
| | | map.put("value", locUseRate.getFqty()); |
| | | pie.add(map); |
| | | |
| | | Map<String, Object> map1 = new HashMap<>(); |
| | | map1.put("name", "空"); |
| | | map1.put("value", locUseRate.getOqty()); |
| | | pie.add(map1); |
| | | |
| | | Map<String, Object> map2 = new HashMap<>(); |
| | | map2.put("name", "使用"); |
| | | map2.put("value", locUseRate.getUqty()); |
| | | pie.add(map2); |
| | | |
| | | Map<String, Object> map3 = new HashMap<>(); |
| | | map3.put("name", "禁用"); |
| | | map3.put("value", locUseRate.getXqty()); |
| | | pie.add(map3); |
| | | } |
| | | |
| | | // 总库位数 |
| | | Integer total = (int) Arith.add(0, locUseRate.getFqty(), locUseRate.getOqty(), locUseRate.getUqty(), locUseRate.getXqty()); |
| | | // 使用中 |
| | | Integer used = locUseRate.getFqty() + locUseRate.getUqty(); |
| | | // 库位使用率 |
| | | double usedDivides = Arith.divides(3, used, total); |
| | | double usedPr = Arith.multiplys(1, usedDivides, 100); |
| | | |
| | | return R.ok( |
| | | Cools.add("pie", pie) |
| | | .add("stockCount", locUseRate.getFqty()) |
| | | .add("emptyCount", locUseRate.getOqty()) |
| | | .add("disableCount", locUseRate.getXqty()) |
| | | .add("total", total) |
| | | .add("used", used) |
| | | .add("usedPr", usedPr) |
| | | ); |
| | | } |
| | | |
| | | @GetMapping("/line/charts") |
| | | public R locIoLineCharts(){ |
| | | Map<String,Object> map=new HashMap<String, Object>(); |
| | | List<AxisBean> list = new ArrayList<AxisBean>(); |
| | | |
| | | List<WorkChartAxis> listChart = reportQueryMapper.getChartAxis(); |
| | | |
| | | if(listChart!=null) { |
| | | ArrayList<Integer> data1 = new ArrayList<Integer>(); |
| | | ArrayList<Integer> data2 = new ArrayList<Integer>(); |
| | | |
| | | SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd"); |
| | | Calendar calendar = Calendar.getInstance(); |
| | | calendar.add(Calendar.DATE, -12); |
| | | for(int i=0;i<12;i++) { |
| | | boolean flag = true; |
| | | calendar.add(Calendar.DATE, 1); |
| | | String str = sf.format(calendar.getTime()); |
| | | for(WorkChartAxis workChart : listChart) { |
| | | if(str.equals(workChart.getYmd())) { |
| | | data1.add(workChart.getInqty()); |
| | | data2.add(workChart.getOutqty()); |
| | | flag = false; |
| | | break; |
| | | } |
| | | } |
| | | if(flag) { |
| | | data1.add(0); |
| | | data2.add(0); |
| | | } |
| | | } |
| | | AxisBean inqty = new AxisBean(); |
| | | inqty.setName("入库数量"); |
| | | Integer[] array1 = new Integer[data1.size()]; |
| | | inqty.setData(data1.toArray(array1)); |
| | | list.add(inqty); |
| | | AxisBean outqty = new AxisBean(); |
| | | outqty.setName("出库数量"); |
| | | Integer[] array2 = new Integer[data2.size()]; |
| | | outqty.setData(data2.toArray(array2)); |
| | | list.add(outqty); |
| | | } |
| | | map.put("rows",list); |
| | | return R.ok(map); |
| | | } |
| | | |
| | | /** |
| | | * 库存数据 |
| | | */ |
| | | @GetMapping("/locDetl/statistics") |
| | | public R locDetlStatistics(){ |
| | | HashMap<String, Object> param = new HashMap<>(); |
| | | Page<LocDetl> stockStatis = locDetlService.getStockStatis(toPage(1, 100, param, LocDetl.class)); |
| | | for (LocDetl locDetl : stockStatis.getRecords()) { |
| | | Mat mat = matService.selectByMatnr(locDetl.getMatnr()); |
| | | if (mat != null) { |
| | | locDetl.sync(mat); |
| | | } |
| | | } |
| | | return R.ok(stockStatis); |
| | | } |
| | | |
| | | @PostMapping("/order/matSync/default/v2") |
| | | // @AppAuth(memo = "商品信息同步接口") |
| | |
| | | } |
| | | |
| | | @PostMapping("/order/matSync/default/v1") |
| | | // @AppAuth(memo = "商品信息同步接口") |
| | | @AppAuth(memo = "物料同步") |
| | | public synchronized R syncMatInfo(@RequestHeader(required = false) String appkey, |
| | | @RequestBody(required = false) MatSyncParam param, |
| | | HttpServletRequest request) { |
| | |
| | | * 添加入库单 |
| | | */ |
| | | @PostMapping("/order/pakin/default/v1") |
| | | @AppAuth(memo = "ERP同步入库单") |
| | | public synchronized R pakinOrderCreate(@RequestHeader(required = false) String appkey, |
| | | @RequestBody OpenOrderPakinParam param, |
| | | HttpServletRequest request) { |
| | |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.math.BigDecimal; |
| | | import java.util.*; |
| | | |
| | | @RestController |
| | |
| | | @Autowired |
| | | private WrkMastLogService wrkMastLogService; |
| | | |
| | | @Resource |
| | | private OrderDetlPakinService orderDetlPakinService; |
| | | |
| | | @RequestMapping(value = "/order/list/orderNo") |
| | | public R orderListorderNo(@RequestParam String orderNo) { |
| | | //数量修改成为完成数量 |
| | | List<OrderDetlPakin> orderDetl1 = orderDetlPakinService.selectList(new EntityWrapper<OrderDetlPakin>().eq("order_no", orderNo)); |
| | | List<OrderDetlPakin> orderDetls= new ArrayList<>(); |
| | | for (OrderDetlPakin o: orderDetl1) { |
| | | BigDecimal c1 = new BigDecimal(o.getEnableQty()).setScale(2,BigDecimal.ROUND_HALF_UP); |
| | | o.setAnfme(c1.doubleValue()); |
| | | if (c1.doubleValue() == 0.0){ |
| | | continue; |
| | | } |
| | | orderDetls.add(o); |
| | | } |
| | | return R.ok(orderDetls); |
| | | } |
| | | |
| | | @RequestMapping(value = "/order/nav/list/auth") |
| | | @ManagerAuth |
| | | public R navList(@RequestParam(required = false) String orderNo) { |
| | |
| | | wrapper.ge(entry.getKey(), DateUtils.convert(dates[0])); |
| | | wrapper.le(entry.getKey(), DateUtils.convert(dates[1])); |
| | | } else { |
| | | wrapper.like(entry.getKey(), val); |
| | | if (entry.getKey().equals("order_id")) { |
| | | wrapper.eq(entry.getKey(),val); |
| | | } else { |
| | | wrapper.like(entry.getKey(), val); |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | package com.zy.asrs.controller; |
| | | |
| | | import com.alibaba.fastjson.JSONArray; |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import com.baomidou.mybatisplus.mapper.EntityWrapper; |
| | | import com.baomidou.mybatisplus.mapper.Wrapper; |
| | |
| | | |
| | | @RequestMapping(value = "/order/nav/list/auth") |
| | | @ManagerAuth |
| | | public R navList(@RequestParam(required = false) String orderNo) { |
| | | public R navList(@RequestParam(required = false) String orderNo){ |
| | | EntityWrapper<OrderPakin> wrapper = new EntityWrapper<>(); |
| | | if (!Cools.isEmpty(orderNo)) { |
| | | wrapper.like("order_no", orderNo); |
| | |
| | | wrapper.le("settle", 2).eq("status", 1); |
| | | wrapper.orderBy("create_time", false); |
| | | List<OrderPakin> orders = orderService.selectList(wrapper); |
| | | // 保留出库单 |
| | | // 保留入库单 |
| | | if (!Cools.isEmpty(orders)) { |
| | | Iterator<OrderPakin> iterator = orders.iterator(); |
| | | while (iterator.hasNext()) { |
| | |
| | | if (order.getDocType() != null) { |
| | | DocType docType = docTypeService.selectById(order.getDocType()); |
| | | if (docType != null) { |
| | | if (docType.getPakout() == 0) { |
| | | if (docType.getPakout() == 1) { |
| | | iterator.remove(); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | return R.ok().add(orders); |
| | | JSONArray jsonArray = new JSONArray(); |
| | | for(OrderPakin orderPakin: orders) { |
| | | JSONObject object = new JSONObject(); |
| | | object.put("order_no",orderPakin.getOrderNo()); |
| | | jsonArray.add(object); |
| | | } |
| | | return R.ok().add(jsonArray); |
| | | } |
| | | |
| | | @RequestMapping(value = "/order/head/page/auth") |
| | |
| | | locDto.setBoxType2(orderDetl.getBoxType2()); |
| | | locDto.setBoxType3(orderDetl.getBoxType3()); |
| | | locDtos.add(locDto); |
| | | exist.add(locDetl.getLocNo()); |
| | | exist.add(locDetl.getLocNo() + "_" + locDetl.getMatnr() + "_" + locDetl.getBatch()); |
| | | // 剩余待出数量递减 |
| | | issued = issued - locDetl.getAnfme(); |
| | | } else { |
| | |
| | | } |
| | | // ----------------------------------------------------------------------------------------------- |
| | | for (TaskDto taskDto : taskDtos) { |
| | | BasDevp staNo = basDevpService.checkSiteStatus(taskDto.getStaNo()); |
| | | workService.stockOut(staNo, taskDto, getUserId()); |
| | | // BasDevp staNo = basDevpService.checkSiteStatus(taskDto.getStaNo()); |
| | | workService.stockOut(taskDto.getStaNo(), taskDto, getUserId()); |
| | | } |
| | | return R.ok(); |
| | | } |
| | |
| | | } |
| | | } |
| | | } |
| | | return R.ok(); |
| | | return R.ok("删除成功"); |
| | | } |
| | | |
| | | @RequestMapping(value = "/waitPakin/export/auth") |
| | |
| | | import org.springframework.web.bind.annotation.RequestParam; |
| | | import org.springframework.web.bind.annotation.RestController; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.HashMap; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.*; |
| | | |
| | | /** |
| | | * 工作流接口控制器 |
| | |
| | | @ManagerAuth() |
| | | public R availableTakeSite() { |
| | | List<Map<String, Object>> result = new ArrayList<>(); |
| | | List<Integer> outSite = basDevpService.getAvailableOutSite(101); |
| | | for (Integer siteId : outSite) { |
| | | // List<Integer> outSite = basDevpService.getAvailableOutSite(101); |
| | | // for (Integer siteId : outSite) { |
| | | List<Integer> siteList = Arrays.asList(1101, 1201, 1206, 1301, 1306, 1408); |
| | | for (Integer site : siteList) { |
| | | Map<String, Object> map = new HashMap<>(); |
| | | map.put("siteId", siteId); |
| | | map.put("desc", siteId + "(全板出库口)"); |
| | | map.put("siteId", site); |
| | | map.put("desc", site + "(出库口)"); |
| | | result.add(map); |
| | | } |
| | | List<Integer> pickOutSite = basDevpService.getAvailableOutSite(103); |
| | | for (Integer siteId : pickOutSite) { |
| | | Map<String, Object> map = new HashMap<>(); |
| | | map.put("siteId", siteId); |
| | | map.put("desc", siteId + "(拣料出库口)"); |
| | | result.add(map); |
| | | } |
| | | // } |
| | | // List<Integer> pickOutSite = basDevpService.getAvailableOutSite(103); |
| | | // for (Integer siteId : pickOutSite) { |
| | | // Map<String, Object> map = new HashMap<>(); |
| | | // map.put("siteId", siteId); |
| | | // map.put("desc", siteId + "(拣料出库口)"); |
| | | // result.add(map); |
| | | // } |
| | | return R.ok().add(result); |
| | | } |
| | | |
| | |
| | | @RequestMapping("/available/take/check/site") |
| | | @ManagerAuth() |
| | | public R availableTakeCheckSite() { |
| | | return R.ok().add(basDevpService.getAvailableOutSite(107)); |
| | | return R.ok(Arrays.asList(1101, 1201, 1206, 1301, 1306, 1408)); |
| | | // return R.ok().add(basDevpService.getAvailableOutSite(107)); |
| | | } |
| | | |
| | | @RequestMapping("/available/empty/take/site") |
| | | @ManagerAuth() |
| | | public R availableEmptyTakeSite() { |
| | | return R.ok().add(basDevpService.getAvailableEmptyOutSite()); |
| | | return R.ok(Arrays.asList(1101, 1201, 1206, 1301, 1306, 1408)); |
| | | // return R.ok().add(basDevpService.getAvailableEmptyOutSite()); |
| | | } |
| | | |
| | | @RequestMapping("/full/store/put/start") |
| | |
| | | @ManagerAuth(memo = "生成任务") |
| | | public R createWaitPainWrkMastStart(@RequestBody List<WaitPakin> list) { |
| | | StartupDto startupDto = workService.createWaitPainWrkMastStart(list, getUserId()); |
| | | return R.ok("任务号:" + startupDto.getWorkNo() + ";目标库位:" + startupDto.getLocNo()); |
| | | return R.ok("任务号:" + startupDto.getTaskNo() + ";目标库位:" + startupDto.getLocNo()); |
| | | } |
| | | |
| | | @RequestMapping("/deal/preHave/start") |
| | |
| | | |
| | | public Double getEnableQty() { |
| | | if (null != this.anfme && this.workQty != null) { |
| | | return this.anfme - this.workQty; |
| | | return this.anfme - this.workQty - this.qty; |
| | | } |
| | | return null; |
| | | } |
| | |
| | | import java.util.Objects; |
| | | |
| | | @Data |
| | | @TableName("man_order_detl_pakin_log") |
| | | @TableName("man_order_detl_log_pakin") |
| | | public class OrderDetlPakinLog implements Serializable { |
| | | |
| | | private static final long serialVersionUID = 1L; |
| | |
| | | * ID |
| | | */ |
| | | @ApiModelProperty(value = "ID") |
| | | @TableId(value = "id", type = IdType.AUTO) |
| | | @TableId(value = "id") |
| | | private Long id; |
| | | |
| | | /** |
| | |
| | | @ApiModelProperty(value = "重量") |
| | | private Double weight; |
| | | |
| | | /** |
| | | * 长度 |
| | | */ |
| | | @ApiModelProperty(value = "长度") |
| | | @TableField("man_length") |
| | | private Double manLength; |
| | | // /** |
| | | // * 长度 |
| | | // */ |
| | | // @ApiModelProperty(value = "长度") |
| | | // @TableField("man_length") |
| | | // private Double manLength; |
| | | |
| | | /** |
| | | * 体积 |
| | |
| | | this.itemNum = itemNum; |
| | | this.safeQty = safeQty; |
| | | this.weight = weight; |
| | | this.manLength = manLength; |
| | | // this.manLength = manLength; |
| | | this.volume = volume; |
| | | this.threeCode = threeCode; |
| | | this.supp = supp; |
| | |
| | | import java.util.Date; |
| | | |
| | | @Data |
| | | @TableName("man_order_detl_pakout_log") |
| | | @TableName("man_order_detl_log_pakout") |
| | | public class OrderDetlPakoutLog implements Serializable { |
| | | |
| | | private static final long serialVersionUID = 1L; |
| | |
| | | * ID |
| | | */ |
| | | @ApiModelProperty(value = "ID") |
| | | @TableId(value = "id", type = IdType.AUTO) |
| | | @TableId(value = "id") |
| | | private Long id; |
| | | |
| | | /** |
| | |
| | | @ApiModelProperty(value = "重量") |
| | | private Double weight; |
| | | |
| | | /** |
| | | * 长度 |
| | | */ |
| | | @ApiModelProperty(value = "长度") |
| | | @TableField("man_length") |
| | | private Double manLength; |
| | | // /** |
| | | // * 长度 |
| | | // */ |
| | | // @ApiModelProperty(value = "长度") |
| | | // @TableField("man_length") |
| | | // private Double manLength; |
| | | |
| | | /** |
| | | * 体积 |
| | |
| | | this.itemNum = itemNum; |
| | | this.safeQty = safeQty; |
| | | this.weight = weight; |
| | | this.manLength = manLength; |
| | | // this.manLength = manLength; |
| | | this.volume = volume; |
| | | this.threeCode = threeCode; |
| | | this.supp = supp; |
| | |
| | | import java.util.Date; |
| | | |
| | | @Data |
| | | @TableName("man_order_pakin_log") |
| | | @TableName("man_order_log_pakin") |
| | | public class OrderPakinLog implements Serializable { |
| | | |
| | | private static final long serialVersionUID = 1L; |
| | |
| | | * ID |
| | | */ |
| | | @ApiModelProperty(value = "ID") |
| | | @TableId(value = "id", type = IdType.AUTO) |
| | | @TableId(value = "id") |
| | | private Long id; |
| | | |
| | | /** |
| | |
| | | import java.util.Date; |
| | | |
| | | @Data |
| | | @TableName("man_order_pakout_log") |
| | | @TableName("man_order_log_pakout") |
| | | public class OrderPakoutLog implements Serializable { |
| | | |
| | | private static final long serialVersionUID = 1L; |
| | |
| | | * ID |
| | | */ |
| | | @ApiModelProperty(value = "ID") |
| | | @TableId(value = "id", type = IdType.AUTO) |
| | | @TableId(value = "id") |
| | | private Long id; |
| | | |
| | | /** |
| | |
| | | WrkMastService service = SpringUtils.getBean(WrkMastService.class); |
| | | WrkMast wrkMast = service.selectById(this.wrkNo); |
| | | if (!Cools.isEmpty(wrkMast)) { |
| | | return String.valueOf(wrkMast.getId()); |
| | | return String.valueOf(wrkMast.getWrkNo()); |
| | | } |
| | | return null; |
| | | } |
| | |
| | | import com.core.common.SpringUtils; |
| | | import com.zy.asrs.service.BasProcessProceduresService; |
| | | import com.zy.asrs.service.BasQualityTestingService; |
| | | import com.zy.system.entity.User; |
| | | import com.zy.system.service.UserService; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | |
| | | return this.boxType1; |
| | | } |
| | | |
| | | public String getAppeUser$() { |
| | | UserService service = SpringUtils.getBean(UserService.class); |
| | | User user = service.selectById(this.appeUser); |
| | | if (!Cools.isEmpty(user)) { |
| | | return String.valueOf(user.getUsername()); |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | public String getBoxType2$() { |
| | | BasQualityTestingService service = SpringUtils.getBean(BasQualityTestingService.class); |
| | | BasQualityTesting basQualityTesting = service.selectOne(new EntityWrapper<BasQualityTesting>().eq("box_type", this.boxType1)); |
| | |
| | | |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | @TableId(value = "id", type = IdType.AUTO) |
| | | private Long id; |
| | | |
| | | /** |
| | | * 工作号 |
| | | */ |
| | | @ApiModelProperty(value = "工作号") |
| | | @TableField("wrk_no") |
| | | @TableId(value = "wrk_no", type = IdType.INPUT) |
| | | private Integer wrkNo; |
| | | |
| | | @ApiModelProperty("任务类型: agv, crn") |
| | |
| | | if (!Cools.isEmpty(basDevp)) { |
| | | return String.valueOf(basDevp.getDevNo()); |
| | | } |
| | | return null; |
| | | return this.staNo; |
| | | } |
| | | |
| | | public String getSourceStaNo$() { |
| | |
| | | if (!Cools.isEmpty(basDevp)) { |
| | | return String.valueOf(basDevp.getDevNo()); |
| | | } |
| | | return null; |
| | | return this.sourceStaNo; |
| | | } |
| | | |
| | | public String getSourceLocNo$() { |
| | |
| | | if (!Cools.isEmpty(basDevp)) { |
| | | return String.valueOf(basDevp.getDevNo()); |
| | | } |
| | | return null; |
| | | return String.valueOf(this.staNo); |
| | | } |
| | | |
| | | public String getSourceStaNo$() { |
| | |
| | | if (!Cools.isEmpty(basDevp)) { |
| | | return String.valueOf(basDevp.getDevNo()); |
| | | } |
| | | return null; |
| | | return String.valueOf(this.sourceStaNo); |
| | | } |
| | | |
| | | public String getSourceLocNo$() { |
| | |
| | | /** |
| | | * 商品分类 |
| | | */ |
| | | private String groupCode; |
| | | private String groupCode = "全部"; |
| | | |
| | | /** |
| | | * 分类名称 |
| New file |
| | |
| | | package com.zy.asrs.entity.param; |
| | | |
| | | import lombok.Data; |
| | | |
| | | @Data |
| | | public class QueryCombParam { |
| | | |
| | | private String barcode; |
| | | |
| | | } |
| New file |
| | |
| | | package com.zy.asrs.entity.param; |
| | | |
| | | import lombok.Data; |
| | | |
| | | @Data |
| | | public class QueryTaskParam { |
| | | |
| | | private String taskNo; |
| | | |
| | | } |
| | |
| | | * @return 库位号 |
| | | */ |
| | | String findFirstFrozenLocNo(@Param("locNoList") List<String> locNoList); |
| | | |
| | | List<LocMast> selectLocByTypeAndRowsToList(@Param("locType") Integer locType,@Param("rows") List<Integer> rows); |
| | | } |
| | |
| | | |
| | | void save(String namespace, String url, String appkey, String ip, String request, String response, boolean success); |
| | | |
| | | void save(String namespace, String url, String appkey, String ip, String request, String response, boolean success, String error); |
| | | |
| | | boolean clearWeekBefore(); |
| | | |
| | | } |
| | |
| | | List<OpenOrderCompeteResult> pakinOrderComplete(OpenOrderCompleteParam param); |
| | | |
| | | /** |
| | | * 添加入库单 |
| | | * 添加出库单 |
| | | */ |
| | | void pakoutOrderCreate(OpenOrderPakoutParam param); |
| | | |
| | |
| | | * @param locDetls 待出库物料 |
| | | * @param ioType 入出库类型 |
| | | */ |
| | | void stockOut(BasDevp staNo, List<LocDetlDto> locDetls, IoWorkType ioWorkType, Long userId); |
| | | void stockOut(Integer staNo, List<LocDetlDto> locDetls, IoWorkType ioWorkType, Long userId); |
| | | |
| | | void stockOut(BasDevp staNo, TaskDto taskDto, Long userId); |
| | | void stockOut(Integer staNo, TaskDto taskDto, Long userId); |
| | | |
| | | /** |
| | | * 空板入库 |
| | |
| | | } |
| | | } |
| | | |
| | | @Async |
| | | @Override |
| | | public void save(String namespace, String url, String appkey, String ip, String request, String response, boolean success,String error) { |
| | | Date now = new Date(); |
| | | ApiLog apiLog = new ApiLog( |
| | | String.valueOf(snowflakeIdWorker.nextId()), // 日志编号 |
| | | namespace, // 名称空间 |
| | | url, // 接口地址 |
| | | appkey, // 平台密钥 |
| | | String.valueOf(now.getTime()), // 时间戳 |
| | | ip, // 客户端IP |
| | | request, // 请求内容 |
| | | response, |
| | | error, // 异常内容 |
| | | success ? 1 : 0, // 结果 |
| | | 1, // 状态 |
| | | now, // 添加时间 |
| | | null, // 修改时间 |
| | | null // 备注 |
| | | ); |
| | | if (!this.insert(apiLog)) { |
| | | log.error("接口调用日志保存失败!"); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public boolean clearWeekBefore() { |
| | | return this.baseMapper.clearWeekBefore() > 0; |
| | |
| | | throw new CoolException(devpNo + "站点不存在"); |
| | | } |
| | | if (pakin) { |
| | | if (station.getAutoing() == null || !station.getAutoing().equals("Y")) { |
| | | throw new CoolException(devpNo + "站点不是自动状态"); |
| | | if(station.getCanining()==null || !station.getAutoing().equals("Y")) { |
| | | throw new CoolException(devpNo+"站点不是能入状态"); |
| | | } |
| | | if (station.getLoading() == null || !station.getLoading().equals("Y")) { |
| | | throw new CoolException(devpNo + "站点无物"); |
| | | } |
| | | if (station.getWrkNo() != null && station.getWrkNo() > 0 && station.getWrkNo() < 9990) { |
| | | throw new CoolException(devpNo + "站点已有工作号"); |
| | | } |
| | | // if (station.getAutoing() == null || !station.getAutoing().equals("Y")) { |
| | | // throw new CoolException(devpNo + "站点不是自动状态"); |
| | | // } |
| | | // if (station.getLoading() == null || !station.getLoading().equals("Y")) { |
| | | // throw new CoolException(devpNo + "站点无物"); |
| | | // } |
| | | // if (station.getWrkNo() != null && station.getWrkNo() > 0 && station.getWrkNo() < 9990) { |
| | | // throw new CoolException(devpNo + "站点已有工作号"); |
| | | // } |
| | | // if(!station.getInEnable().equals("Y")) { |
| | | // throw new CoolException(devpNo+"站点不是可入状态"); |
| | | // } |
| | | if (wrkMastService.getWorkingMast(devpNo) > 0) { |
| | | throw new CoolException(devpNo + "站点不能同时生成两笔入库工作档"); |
| | | } |
| | | // if (wrkMastService.getWorkingMast(devpNo) > 0) { |
| | | // throw new CoolException(devpNo + "站点不能同时生成两笔入库工作档"); |
| | | // } |
| | | } |
| | | return station; |
| | | } |
| | |
| | | throw new CoolException(BaseRes.PARAM); |
| | | } |
| | | Integer suplus = null; |
| | | if (loadingConfigTimer.getZpalletManage()) { |
| | | BasContainer container = basContainerService.selectOne(new EntityWrapper<BasContainer>().eq("barcode", param.getBarcode())); |
| | | if (Objects.isNull(container)) { |
| | | throw new CoolException("数据错误:容器码不存在!!"); |
| | | } |
| | | if (container.getMixMax() < param.getCombMats().size()) { |
| | | throw new CoolException("超出容器最大混装数量,当前容器最大数量为:" + container.getMixMax() + "!!"); |
| | | } |
| | | Set<String> matnrs = param.getCombMats().stream().map(CombParam.CombMat::getMatnr).collect(Collectors.toSet()); |
| | | List<Mat> mats = matService.selectList(new EntityWrapper<Mat>().in("matnr", matnrs)); |
| | | Set<Long> tagIds = mats.stream().map(Mat::getTagId).collect(Collectors.toSet()); |
| | | if (tagIds.size() > 1) { |
| | | throw new CoolException("组托物料类型不一致,只有相同的物料分类才可以组托!!"); |
| | | } |
| | | suplus = container.getMixMax(); |
| | | } |
| | | // if (loadingConfigTimer.getZpalletManage()) { |
| | | // BasContainer container = basContainerService.selectOne(new EntityWrapper<BasContainer>().eq("barcode", param.getBarcode())); |
| | | // if (Objects.isNull(container)) { |
| | | // throw new CoolException("数据错误:容器码不存在!!"); |
| | | // } |
| | | // if (container.getMixMax() < param.getCombMats().size()) { |
| | | // throw new CoolException("超出容器最大混装数量,当前容器最大数量为:" + container.getMixMax() + "!!"); |
| | | // } |
| | | // Set<String> matnrs = param.getCombMats().stream().map(CombParam.CombMat::getMatnr).collect(Collectors.toSet()); |
| | | // List<Mat> mats = matService.selectList(new EntityWrapper<Mat>().in("matnr", matnrs)); |
| | | // Set<Long> tagIds = mats.stream().map(Mat::getTagId).collect(Collectors.toSet()); |
| | | // if (tagIds.size() > 1) { |
| | | // throw new CoolException("组托物料类型不一致,只有相同的物料分类才可以组托!!"); |
| | | // } |
| | | // suplus = container.getMixMax(); |
| | | // } |
| | | |
| | | // 判断是否有相同条码的数据 |
| | | if (waitPakinService.selectCount(new EntityWrapper<WaitPakin>(). |
| | |
| | | |
| | | Date now = new Date(); |
| | | // 无单组托 |
| | | if (Cools.isEmpty(param.getOrderNo())) { |
| | | if (Cools.isEmpty(param.getCombMats().get(0).getOrderNo())) { |
| | | // 生成入库通知档 |
| | | List<DetlDto> detlDtos = new ArrayList<>(); |
| | | param.getCombMats().forEach(elem -> { |
| | |
| | | if (Cools.isEmpty(mat)) { |
| | | throw new CoolException(detlDto.getMatnr() + "商品档案不存在"); |
| | | } |
| | | if (mat.getUpQty().compareTo(detlDto.getAnfme()) < 0) { |
| | | throw new CoolException("物料:" + detlDto.getMatnr() + "单次最大组托上限为:" + mat.getUpQty()); |
| | | } |
| | | // if (mat.getUpQty().compareTo(detlDto.getAnfme()) < 0) { |
| | | // throw new CoolException("物料:" + detlDto.getMatnr() + "单次最大组托上限为:" + mat.getUpQty()); |
| | | // } |
| | | WaitPakin waitPakin = new WaitPakin(); |
| | | BeanUtils.copyProperties(mat, waitPakin); |
| | | waitPakin.setBatch(detlDto.getBatch()); |
| | |
| | | if (Cools.isEmpty(order) || order.getSettle() > 2) { |
| | | throw new CoolException("单据编号已过期"); |
| | | } |
| | | // 订单明细数量校验 |
| | | OrderDetlPakin detls = orderDetlPakinService.selectOne(new EntityWrapper<OrderDetlPakin>() |
| | | Wrapper<OrderDetlPakin> wrapper = new EntityWrapper<OrderDetlPakin>() |
| | | .eq("order_id", order.getId()) |
| | | .eq("matnr", elem.getMatnr())); |
| | | .eq("matnr", elem.getMatnr()); |
| | | if(!Cools.isEmpty(elem.getBatch())) { |
| | | wrapper.eq("batch",elem.getBatch()); |
| | | } |
| | | // 订单明细数量校验 |
| | | OrderDetlPakin detls = orderDetlPakinService.selectOne(wrapper); |
| | | |
| | | if (Objects.isNull(detls)) { |
| | | throw new CoolException("数据错误:单据明细不存在!!"); |
| | |
| | | // 分类 |
| | | Long tagId; |
| | | // 一级分类 |
| | | if (!Cools.isEmpty(matParam.getGroupCode()) && !Cools.isEmpty(matParam.getGroupName())) { |
| | | Tag priTag = tagService.selectByName(matParam.getGroupCode(), 2); |
| | | if (!Cools.isEmpty(matParam.getGroupName())) { |
| | | Tag priTag = tagService.selectByName(matParam.getGroupName(), 2); |
| | | if (priTag == null) { |
| | | Tag top = tagService.getTop(); |
| | | NodeUtils nodeUtils = new NodeUtils(); |
| | | nodeUtils.executePath(top.getId()); |
| | | priTag = new Tag( |
| | | null, // 编号 |
| | | matParam.getGroupCode(), // 名称 |
| | | matParam.getGroupName(), // 名称 |
| | | top.getId(), // 父级 |
| | | top.getName(), // 父级名称 |
| | | nodeUtils.path.toString(), // 关联路径 |
| | |
| | | } |
| | | } |
| | | // 二级分类 |
| | | Tag secTag = tagService.selectByName(matParam.getGroupName(), 3); |
| | | if (secTag == null) { |
| | | NodeUtils nodeUtils = new NodeUtils(); |
| | | nodeUtils.executePath(priTag.getId()); |
| | | secTag = new Tag( |
| | | null, // 编号 |
| | | matParam.getGroupName(), // 名称 |
| | | priTag.getId(), // 父级 |
| | | priTag.getName(), // 父级名称 |
| | | nodeUtils.path.toString(), // 关联路径 |
| | | nodeUtils.pathName.toString(), // 关联路径名 |
| | | 0, // 类型 |
| | | null, // 负责人 |
| | | null, // 图片 |
| | | null, // 简要描述 |
| | | null, // 数量 |
| | | 3, // 等级 |
| | | null, // 排序 |
| | | 1, // 状态 |
| | | now, // 添加时间 |
| | | null, // 添加人员 |
| | | now, // 修改时间 |
| | | null, // 修改人员 |
| | | null // 备注 |
| | | ); |
| | | if (tagMapper.insert(secTag) == 0) { |
| | | throw new CoolException("服务器内部错误,请联系管理员"); |
| | | } |
| | | } |
| | | tagId = secTag.getId(); |
| | | // Tag secTag = tagService.selectByName(matParam.getGroupName(), 3); |
| | | // if (secTag == null) { |
| | | // NodeUtils nodeUtils = new NodeUtils(); |
| | | // nodeUtils.executePath(priTag.getId()); |
| | | // secTag = new Tag( |
| | | // null, // 编号 |
| | | // matParam.getGroupName(), // 名称 |
| | | // priTag.getId(), // 父级 |
| | | // priTag.getName(), // 父级名称 |
| | | // nodeUtils.path.toString(), // 关联路径 |
| | | // nodeUtils.pathName.toString(), // 关联路径名 |
| | | // 0, // 类型 |
| | | // null, // 负责人 |
| | | // null, // 图片 |
| | | // null, // 简要描述 |
| | | // null, // 数量 |
| | | // 3, // 等级 |
| | | // null, // 排序 |
| | | // 1, // 状态 |
| | | // now, // 添加时间 |
| | | // null, // 添加人员 |
| | | // now, // 修改时间 |
| | | // null, // 修改人员 |
| | | // null // 备注 |
| | | // ); |
| | | // if (tagMapper.insert(secTag) == 0) { |
| | | // throw new CoolException("服务器内部错误,请联系管理员"); |
| | | // } |
| | | // } |
| | | tagId = priTag.getId(); |
| | | } else { |
| | | tagId = tagService.getTop().getId(); |
| | | } |
| | |
| | | import com.zy.asrs.service.StaDescService; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import java.util.Arrays; |
| | | import java.util.List; |
| | | |
| | | @Service("staDescService") |
| | |
| | | |
| | | @Override |
| | | public List<Integer> queryOutStaNosByLocNo(String locNo, Integer typeNo) { |
| | | return this.baseMapper.queryOutStaNosByLocNo(locNo, typeNo); |
| | | return Arrays.asList(1101, 1201, 1206, 1301, 1306, 1408); |
| | | // return this.baseMapper.queryOutStaNosByLocNo(locNo, typeNo); |
| | | } |
| | | |
| | | @Override |
| | |
| | | throw new CoolException("查询库位失败!!==》startupFullPutStore ==》 commonService.getLocNo"); |
| | | } |
| | | // 生成工作号 |
| | | int workNo = dto.getWorkNo(); |
| | | int workNo = dto.getTaskNo(); |
| | | // 生成工作档 |
| | | WrkMast wrkMast = new WrkMast(); |
| | | wrkMast.setWrkNo(workNo); |
| | |
| | | @Transactional |
| | | public void startupFullTakeStore(StockOutParam param, Long userId) { |
| | | // 目标站点状态检测 |
| | | BasDevp staNo = basDevpService.checkSiteStatus(param.getOutSite()); |
| | | // BasDevp staNo = basDevpService.checkSiteStatus(param.getOutSite()); |
| | | // 获取库位明细 |
| | | List<LocDetlDto> locDetlDtos = new ArrayList<>(); |
| | | for (StockOutParam.LocDetl paramLocDetl : param.getLocDetls()) { |
| | |
| | | LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", locDetlDtos.get(0).getLocDetl().getLocNo())); |
| | | if (locMast.getLocSts().equals("F") || locMast.getLocSts().equals("D")) { |
| | | // 启动出库开始 101.出库 |
| | | stockOut(staNo, locDetlDtos, null, userId); |
| | | stockOut(param.getOutSite(), locDetlDtos, null, userId); |
| | | } else { |
| | | throw new CoolException("所选库位存在状态不为F、D的库位,库位号:" + locMast.getLocNo() + " 、当前状态:" + locMast.getLocSts() + "-" + locMast.getLocSts$()); |
| | | } |
| | |
| | | |
| | | @Override |
| | | @Transactional |
| | | public void stockOut(BasDevp staNo, List<LocDetlDto> locDetlDtos, IoWorkType ioWorkType, Long userId) { |
| | | public void stockOut(Integer outSta, List<LocDetlDto> locDetlDtos, IoWorkType ioWorkType, Long userId) { |
| | | Date now = new Date(); |
| | | // 合并同类项 |
| | | Set<String> locNos = new HashSet<>(); |
| | |
| | | // 获取库位 |
| | | LocMast locMast = locMastService.selectById(dto.getLocNo()); |
| | | |
| | | Integer outSta = staNo.getDevNo(); |
| | | // Integer outSta = staNo.getDevNo(); |
| | | // //2号堆垛机全板出库站指定为204站,拣料站指定为202 |
| | | // if(locMast.getCrnNo()==2){ |
| | | // outSta = ioType == 101 ? 204 : 202; |
| | | // } |
| | | |
| | | // 获取路径 |
| | | StaDesc staDesc = staDescService.queryCrnStn(ioType, locMast.getCrnNo(), outSta); |
| | | // StaDesc staDesc = staDescService.queryCrnStn(ioType, locMast.getCrnNo(), outSta); |
| | | // 生成工作号 |
| | | int workNo = commonService.getWorkNo(WorkNoType.getWorkNoType(ioType)); |
| | | // 生成工作档 |
| | |
| | | wrkMast.setIoType(ioType); // 入出库状态 |
| | | wrkMast.setIoPri(13D); // 优先级:13 |
| | | wrkMast.setCrnNo(locMast.getCrnNo()); |
| | | wrkMast.setSourceStaNo(staDesc.getCrnStn() + ""); // 源站 |
| | | wrkMast.setStaNo(staDesc.getStnNo() + ""); // 目标站 |
| | | wrkMast.setSourceStaNo("0"); // 源站 |
| | | wrkMast.setStaNo(String.valueOf(outSta)); // 目标站 |
| | | wrkMast.setSourceLocNo(dto.getLocNo()); // 源库位 |
| | | wrkMast.setFullPlt("Y"); // 满板:Y |
| | | wrkMast.setPicking("N"); // 拣料 |
| | |
| | | |
| | | @Override |
| | | @Transactional |
| | | public void stockOut(BasDevp staNo, TaskDto taskDto, Long userId) { |
| | | public void stockOut(Integer staNo, TaskDto taskDto, Long userId) { |
| | | Date now = new Date(); |
| | | List<LocDto> locDtos = taskDto.getLocDtos(); |
| | | for (LocDto locDto : locDtos) { |
| | |
| | | String orderNo = taskDto.getLocDtos().get(0).getOrderNo(); |
| | | OrderPakout orderPakout = orderPakoutService.selectByNo(orderNo); |
| | | int ioType = orderPakout.getDocType() == 8 ? 107 : (taskDto.isAll() ? 101 : 103); |
| | | StaDesc staDesc = staDescService.queryCrnStnAuto(ioType, locMast.getCrnNo(), staNo.getDevNo()); |
| | | // StaDesc staDesc = staDescService.queryCrnStnAuto(ioType, locMast.getCrnNo(), staNo.getDevNo()); |
| | | // 生成工作号 |
| | | int workNo = commonService.getWorkNo(WorkNoType.getWorkNoType(ioType)); |
| | | // 生成工作档 |
| | |
| | | wrkMast.setIoType(ioType); // 入出库状态 |
| | | wrkMast.setIoPri(13D); // 优先级:13 |
| | | wrkMast.setCrnNo(locMast.getCrnNo()); |
| | | wrkMast.setSourceStaNo(staDesc.getCrnStn() + ""); // 源站 |
| | | wrkMast.setStaNo(staDesc.getStnNo() + ""); // 目标站 |
| | | wrkMast.setSourceStaNo("0"); // 源站 |
| | | wrkMast.setStaNo(String.valueOf(staNo)); // 目标站 |
| | | wrkMast.setSourceLocNo(taskDto.getLocNo()); // 源库位 |
| | | wrkMast.setFullPlt("Y"); // 满板:Y |
| | | wrkMast.setPicking("N"); // 拣料 |
| | |
| | | FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo(); |
| | | |
| | | StartupDto dto = commonService.getLocNo(10, devpNo, findLocNoAttributeVo, locTypeDto); |
| | | int workNo = dto.getWorkNo(); |
| | | int workNo = dto.getTaskNo(); |
| | | Date now = new Date(); |
| | | // 生成工作档 |
| | | WrkMast wrkMast = new WrkMast(); |
| | |
| | | throw new CoolException("所选库位存在状态不为D的库位,库位号:" + locMast.getLocNo() + " 、当前状态:" + locMast.getLocSts() + "-" + locMast.getLocSts$()); |
| | | } |
| | | // 获取源站 |
| | | Wrapper<StaDesc> wrapper = new EntityWrapper<StaDesc>() |
| | | .eq("type_no", 110) |
| | | .eq("stn_no", param.getOutSite()) |
| | | .eq("crn_no", locMast.getCrnNo()); |
| | | StaDesc staDesc = staDescService.selectOne(wrapper); |
| | | Integer sourceStaNo = staDesc.getCrnStn(); |
| | | if (Cools.isEmpty(sourceStaNo)) { |
| | | throw new CoolException("检索源站失败"); |
| | | } |
| | | // Wrapper<StaDesc> wrapper = new EntityWrapper<StaDesc>() |
| | | // .eq("type_no", 110) |
| | | // .eq("stn_no", param.getOutSite()) |
| | | // .eq("crn_no", locMast.getCrnNo()); |
| | | // StaDesc staDesc = staDescService.selectOne(wrapper); |
| | | // Integer sourceStaNo = staDesc.getCrnStn(); |
| | | // if (Cools.isEmpty(sourceStaNo)) { |
| | | // throw new CoolException("检索源站失败"); |
| | | // } |
| | | Date now = new Date(); |
| | | // 保存工作档 |
| | | WrkMast wrkMast = new WrkMast(); |
| | |
| | | wrkMast.setWrkSts(11L); // 工作状态:11.生成出库ID |
| | | wrkMast.setIoType(110); // 入出库状态: 110.空板出库 |
| | | wrkMast.setIoPri(10D); |
| | | wrkMast.setSourceStaNo(sourceStaNo + ""); // 源站 |
| | | wrkMast.setSourceStaNo("0"); // 源站 |
| | | wrkMast.setStaNo(param.getOutSite() + ""); // 目标站 |
| | | wrkMast.setCrnNo(locMast.getCrnNo()); |
| | | wrkMast.setSourceLocNo(locNo); // 源库位 |
| | |
| | | @Transactional |
| | | public void locCheckOut(StockOutParam param, Long userId) { |
| | | // 目标站点状态检测 |
| | | BasDevp staNo = basDevpService.checkSiteStatus(param.getOutSite()); |
| | | // BasDevp staNo = basDevpService.checkSiteStatus(param.getOutSite()); |
| | | // 获取库位明细 |
| | | List<LocDetlDto> locDetlDtos = new ArrayList<>(); |
| | | for (StockOutParam.LocDetl paramLocDetl : param.getLocDetls()) { |
| | |
| | | LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", locDetlDtos.get(0).getLocDetl().getLocNo())); |
| | | if (locMast.getLocSts().equals("F")) { |
| | | // 启动出库开始 107.盘点出库 |
| | | stockOut(staNo, locDetlDtos, IoWorkType.CHECK_OUT, userId); |
| | | stockOut(param.getOutSite(), locDetlDtos, IoWorkType.CHECK_OUT, userId); |
| | | } else { |
| | | throw new CoolException("所选库位存在状态不为F的库位,库位号:" + locMast.getLocNo() + " 、当前状态:" + locMast.getLocSts() + "-" + locMast.getLocSts$()); |
| | | } |
| | |
| | | throw new CoolException("保存工作主档历史档失败"); |
| | | } |
| | | // 获取目标站 |
| | | Wrapper<StaDesc> wrapper = new EntityWrapper<StaDesc>() |
| | | .eq("type_no", wrkMast.getIoType() - 50) |
| | | .eq("stn_no", wrkMast.getStaNo()) // 作业站点 = 拣料出库的目标站 |
| | | .eq("crn_no", wrkMast.getCrnNo()); // 堆垛机号 |
| | | StaDesc staDesc = staDescService.selectOne(wrapper); |
| | | if (Cools.isEmpty(staDesc)) { |
| | | throw new CoolException("入库路径不存在"); |
| | | } |
| | | // Wrapper<StaDesc> wrapper = new EntityWrapper<StaDesc>() |
| | | // .eq("type_no", wrkMast.getIoType() - 50) |
| | | // .eq("stn_no", wrkMast.getStaNo()) // 作业站点 = 拣料出库的目标站 |
| | | // .eq("crn_no", wrkMast.getCrnNo()); // 堆垛机号 |
| | | // StaDesc staDesc = staDescService.selectOne(wrapper); |
| | | // if (Cools.isEmpty(staDesc)) { |
| | | // throw new CoolException("入库路径不存在"); |
| | | // } |
| | | Date now = new Date(); |
| | | // 堆垛机站点(目标站) |
| | | Integer staNo = staDesc.getCrnStn(); |
| | | // Integer staNo = staDesc.getCrnStn(); |
| | | // 更新工作档数据状态 |
| | | wrkMast.setIoType(wrkMast.getIoType() - 50); // 入出库类型: 103->53,104->54,107->57 |
| | | wrkMast.setWrkSts(2L); // 工作状态: 2.设备上走 |
| | | wrkMast.setSourceStaNo(wrkMast.getStaNo()); // 源站 |
| | | wrkMast.setStaNo(staNo + ""); // 目标站 |
| | | wrkMast.setStaNo("0"); // 目标站 |
| | | wrkMast.setLocNo(wrkMast.getSourceLocNo()); // 目标库位 = 出库时的源库位 |
| | | wrkMast.setSourceLocNo(""); // 源库位清空 |
| | | wrkMast.setModiTime(now); |
| | |
| | | } |
| | | LocTypeDto locTypeDto = new LocTypeDto(); |
| | | locTypeDto.setLocType1((short) 1); |
| | | return wcsController.startupFullPutStore(301, list.get(0).getZpallet(), locTypeDto, list); |
| | | return wcsController.startupFullPutStore(301, list.get(0).getZpallet(), locTypeDto, list, null); |
| | | } |
| | | |
| | | @Override |
| | |
| | | } |
| | | |
| | | |
| | | @Scheduled(cron = "0/30 * * * * ? ") |
| | | @Scheduled(cron = "0/15 * * * * ? ") |
| | | @Async("orderThreadPool") |
| | | public void completeOrderPakin() { |
| | | if (loadingConfigTimer.getErpReport()) { |
| | | List<OrderPakin> orders = orderPakinService.selectComplete(); |
| | | for (OrderPakin order : orders) { |
| | | try { |
| | | ReturnT<String> result = orderPakinSyncHandler.startOrderReport(order); |
| | | if (!result.isSuccess()) { |
| | | log.error("单据[orderNo={}]上报erp失败", order.getOrderNo()); |
| | | } |
| | | } catch (Exception e) { |
| | | log.error(e.getMessage()); |
| | | log.error("单据[orderNo={}]上报erp失败", order.getOrderNo()); |
| | | } |
| | | orderPakinSyncHandler.startOrderReport(order); |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | @Scheduled(cron = "0/30 * * * * ? ") |
| | | @Scheduled(cron = "0/15 * * * * ? ") |
| | | @Async("orderThreadPool") |
| | | public void completeOrderPakout() { |
| | | if (loadingConfigTimer.getErpReport()) { |
| | | List<OrderPakout> orders = orderPakoutService.selectComplete(); |
| | | for (OrderPakout order : orders) { |
| | | try { |
| | | ReturnT<String> result = orderPakoutSyncHandler.startOrderReport(order); |
| | | if (!result.isSuccess()) { |
| | | log.error("单据[orderNo={}]上报erp失败", order.getOrderNo()); |
| | | } |
| | | } catch (Exception e) { |
| | | log.error(e.getMessage()); |
| | | log.error("单据[orderNo={}]上报erp失败", order.getOrderNo()); |
| | | } |
| | | orderPakoutSyncHandler.startOrderReport(order); |
| | | } |
| | | } |
| | | } |
| New file |
| | |
| | | package com.zy.asrs.task; |
| | | |
| | | import com.baomidou.mybatisplus.mapper.EntityWrapper; |
| | | import com.zy.asrs.entity.WrkMast; |
| | | import com.zy.asrs.service.WrkMastService; |
| | | import com.zy.asrs.task.handler.WcsSchedulerHandler; |
| | | import org.springframework.scheduling.annotation.Scheduled; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * @author pang.jiabao |
| | | * @description 下位WCS系统相关定时任务 |
| | | * @createDate 2026/3/4 15:04 |
| | | */ |
| | | @Component |
| | | public class WcsScheduler { |
| | | |
| | | @Resource |
| | | private WrkMastService wrkMastService; |
| | | |
| | | @Resource |
| | | private WcsSchedulerHandler wcsSchedulerHandler; |
| | | |
| | | /** |
| | | * 定时任务读取出库任务派发给WCS |
| | | */ |
| | | @Scheduled(cron = "0/10 * * * * ? ") |
| | | private void outboundTaskDispatch() { |
| | | List<WrkMast> wrkMastList = wrkMastService.selectList(new EntityWrapper<WrkMast>().in("io_type", 11, 101, 103, 107, 110).eq("wrk_sts", 11)); |
| | | for (WrkMast wrkMast : wrkMastList) { |
| | | wcsSchedulerHandler.outboundTaskDispatch(wrkMast); |
| | | } |
| | | } |
| | | } |
| | |
| | | for (OrderPakin order : settleEqual6) { |
| | | List<OrderDetlPakin> orderDetls = orderDetlPakinService.selectByOrderId(order.getId()); |
| | | moveBoth(order, orderDetls); |
| | | log.info("已完成单据移动至历史表成功 =====>" + order); |
| | | log.info("已完成单据移动至历史表成功 =====>" + order.getOrderNo()); |
| | | } |
| | | return SUCCESS; |
| | | } |
| | |
| | | orderDetl.setUpdateTime(now); |
| | | OrderDetlPakinLog orderDetlLog = new OrderDetlPakinLog(); |
| | | Synchro.Copy(orderDetl, orderDetlLog); |
| | | orderDetlLog.setId(null); |
| | | orderDetlLog.setId(orderDetl.getId()); |
| | | orderDetlPakinLogMapper.insert(orderDetlLog); |
| | | orderDetlPakinService.deleteById(orderDetl.getId()); |
| | | } |
| | |
| | | order.setUpdateTime(now); |
| | | OrderPakinLog orderPakinLog = new OrderPakinLog(); |
| | | Synchro.Copy(order, orderPakinLog); |
| | | orderPakinLog.setId(null); |
| | | orderPakinLog.setId(order.getId()); |
| | | orderPakinLogMapper.insert(orderPakinLog); |
| | | orderPakinService.deleteById(order.getId()); |
| | | } |
| | |
| | | package com.zy.asrs.task.handler; |
| | | |
| | | import com.alibaba.fastjson.JSON; |
| | | import com.alibaba.fastjson.JSONArray; |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import com.zy.asrs.entity.DocType; |
| | | import com.zy.asrs.entity.OrderDetlPakin; |
| | | import com.zy.asrs.entity.OrderPakin; |
| | |
| | | import com.zy.asrs.service.OrderPakinService; |
| | | import com.zy.asrs.task.AbstractHandler; |
| | | import com.zy.asrs.task.core.ReturnT; |
| | | import com.zy.common.utils.HttpHandler; |
| | | import com.zy.system.timer.LoadingConfigTimer; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | 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.Date; |
| | | import java.util.List; |
| | | |
| | | /** |
| | |
| | | private OrderDetlPakinService orderDetlPakinService; |
| | | @Autowired |
| | | private ApiLogService apiLogService; |
| | | @Autowired |
| | | private DocTypeService docTypeService; |
| | | |
| | | @Resource |
| | | private LoadingConfigTimer loadingConfigTimer; |
| | | |
| | | |
| | | @Transactional |
| | | public ReturnT<String> startOrderReport(OrderPakin order) { |
| | | DocType docType = docTypeService.selectById(order.getDocType()); |
| | | if (null == docType) { |
| | | return SUCCESS; |
| | | } |
| | | long settle = 6L; |
| | | List<OrderDetlPakin> orderDetls = orderDetlPakinService.selectByOrderId(order.getId()); |
| | | public void startOrderReport(OrderPakin order) { |
| | | |
| | | return SUCCESS; |
| | | // 构造请求体 |
| | | JSONObject param = new JSONObject(); |
| | | param.put("orderNo", order.getOrderNo()); |
| | | List<OrderDetlPakin> orderDetls = orderDetlPakinService.selectByOrderId(order.getId()); |
| | | JSONArray detl = new JSONArray(); |
| | | for (OrderDetlPakin orderDetlPakin : orderDetls) { |
| | | JSONObject object = new JSONObject(); |
| | | object.put("matnr", orderDetlPakin.getMatnr()); |
| | | object.put("batch", orderDetlPakin.getBatch()); |
| | | object.put("anfme", orderDetlPakin.getQty()); |
| | | detl.add(object); |
| | | } |
| | | param.put("matList", detl); |
| | | |
| | | String response = ""; |
| | | boolean success = false; |
| | | String errorMsg = null; |
| | | String requestJson = param.toJSONString(); |
| | | String url = loadingConfigTimer.getErpReportURL() + loadingConfigTimer.getErpInReportPath(); |
| | | String nameSpaces = "入库单上报"; |
| | | try { |
| | | |
| | | // response = new HttpHandler.Builder() |
| | | // .setUri(loadingConfigTimer.getErpReportURL()) |
| | | // .setPath(loadingConfigTimer.getErpInReportPath()) |
| | | // .setJson(requestJson) |
| | | // .build() |
| | | // .doPost(); |
| | | // JSONObject jsonObject = JSON.parseObject(response); |
| | | // if (jsonObject.getString("code") != null && jsonObject.getString("code").equals("200")) { |
| | | orderPakinService.updateSettle(order.getId(), 6L, null); |
| | | log.info("入库单据上报成功,单据编号:{}", order.getOrderNo()); |
| | | success = true; |
| | | // } else { |
| | | // errorMsg = response; |
| | | // log.error(nameSpaces + "调用外部接口失败,url:{},request:{},response:{}", url, requestJson, response); |
| | | // } |
| | | } catch (Exception e) { |
| | | errorMsg = e.getMessage(); |
| | | log.error(nameSpaces + "调用外部接口异常,url:{},request:{},response:{}", url, requestJson, response, e); |
| | | } finally { |
| | | try { |
| | | apiLogService.save( |
| | | nameSpaces, |
| | | url, |
| | | null, |
| | | "127.0.0.1", |
| | | requestJson, |
| | | response, |
| | | success, |
| | | errorMsg |
| | | ); |
| | | } catch (Exception e) { |
| | | log.error(nameSpaces + "保存接口日志失败", e); |
| | | } |
| | | } |
| | | } |
| | | |
| | | } |
| | |
| | | |
| | | |
| | | private void moveBoth(OrderPakout order, List<OrderDetlPakout> orderDetls) { |
| | | Date now = new Date(); |
| | | // Date now = new Date(); |
| | | if (!Cools.isEmpty(orderDetls)) { |
| | | for (OrderDetlPakout orderDetl : orderDetls) { |
| | | orderDetl.setUpdateBy(0L); |
| | | orderDetl.setUpdateTime(now); |
| | | // orderDetl.setUpdateBy(0L); |
| | | // orderDetl.setUpdateTime(now); |
| | | OrderDetlPakoutLog orderDetlLog = new OrderDetlPakoutLog(); |
| | | Synchro.Copy(orderDetl, orderDetlLog); |
| | | orderDetlLog.setId(null); |
| | | // orderDetlLog.setId(orderDetl.getId()); |
| | | orderDetlPakoutLogMapper.insert(orderDetlLog); |
| | | orderDetlPakoutService.deleteById(orderDetl.getId()); |
| | | } |
| | | } |
| | | if (!Cools.isEmpty(order)) { |
| | | order.setUpdateBy(0L); |
| | | order.setUpdateTime(now); |
| | | // order.setUpdateBy(0L); |
| | | // order.setUpdateTime(now); |
| | | OrderPakoutLog orderPakinLog = new OrderPakoutLog(); |
| | | Synchro.Copy(order, orderPakinLog); |
| | | orderPakinLog.setId(null); |
| | | // orderPakinLog.setId(order.getId()); |
| | | orderPakoutLogMapper.insert(orderPakinLog); |
| | | orderPakoutService.deleteById(order.getId()); |
| | | } |
| | |
| | | package com.zy.asrs.task.handler; |
| | | |
| | | import com.alibaba.fastjson.JSON; |
| | | import com.alibaba.fastjson.JSONArray; |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import com.zy.asrs.entity.DocType; |
| | | import com.zy.asrs.entity.OrderDetlPakin; |
| | | import com.zy.asrs.entity.OrderDetlPakout; |
| | | import com.zy.asrs.entity.OrderPakout; |
| | | import com.zy.asrs.service.ApiLogService; |
| | |
| | | import com.zy.asrs.service.OrderPakoutService; |
| | | import com.zy.asrs.task.AbstractHandler; |
| | | import com.zy.asrs.task.core.ReturnT; |
| | | import com.zy.common.utils.HttpHandler; |
| | | import com.zy.system.timer.LoadingConfigTimer; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | 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.List; |
| | | |
| | | /** |
| | |
| | | private OrderDetlPakoutService orderDetlPakoutService; |
| | | @Autowired |
| | | private ApiLogService apiLogService; |
| | | @Autowired |
| | | private DocTypeService docTypeService; |
| | | |
| | | @Resource |
| | | private LoadingConfigTimer loadingConfigTimer; |
| | | |
| | | |
| | | @Transactional |
| | | public ReturnT<String> startOrderReport(OrderPakout order) { |
| | | DocType docType = docTypeService.selectById(order.getDocType()); |
| | | if (null == docType) { |
| | | return SUCCESS; |
| | | } |
| | | long settle = 6L; |
| | | List<OrderDetlPakout> orderDetls = orderDetlPakoutService.selectByOrderId(order.getId()); |
| | | public void startOrderReport(OrderPakout order) { |
| | | |
| | | return SUCCESS; |
| | | // 构造请求体 |
| | | JSONObject param = new JSONObject(); |
| | | param.put("orderNo", order.getOrderNo()); |
| | | List<OrderDetlPakout> orderDetls = orderDetlPakoutService.selectByOrderId(order.getId()); |
| | | JSONArray detl = new JSONArray(); |
| | | for (OrderDetlPakout orderDetlPakout : orderDetls) { |
| | | JSONObject object = new JSONObject(); |
| | | object.put("matnr", orderDetlPakout.getMatnr()); |
| | | object.put("batch", orderDetlPakout.getBatch()); |
| | | object.put("anfme", orderDetlPakout.getQty()); |
| | | detl.add(object); |
| | | } |
| | | param.put("matList", detl); |
| | | |
| | | String response = ""; |
| | | boolean success = false; |
| | | String errorMsg = null; |
| | | String requestJson = param.toJSONString(); |
| | | String url = loadingConfigTimer.getErpReportURL() + loadingConfigTimer.getErpOutReportPath(); |
| | | String nameSpaces = "出库单上报"; |
| | | try { |
| | | |
| | | // response = new HttpHandler.Builder() |
| | | // .setUri(loadingConfigTimer.getErpReportURL()) |
| | | // .setPath(loadingConfigTimer.getErpOutReportPath()) |
| | | // .setJson(requestJson) |
| | | // .build() |
| | | // .doPost(); |
| | | // JSONObject jsonObject = JSON.parseObject(response); |
| | | // if (jsonObject.getString("code") != null && jsonObject.getString("code").equals("200")) { |
| | | orderPakoutService.updateSettle(order.getId(), 6L, null); |
| | | log.info("出库单据上报成功,单据编号:{}", order.getOrderNo()); |
| | | success = true; |
| | | // } else { |
| | | // errorMsg = response; |
| | | // log.error(nameSpaces + "调用外部接口失败,url:{},request:{},response:{}", url, requestJson, response); |
| | | // } |
| | | } catch (Exception e) { |
| | | errorMsg = e.getMessage(); |
| | | log.error(nameSpaces + "调用外部接口异常,url:{},request:{},response:{}", url, requestJson, response, e); |
| | | } finally { |
| | | try { |
| | | apiLogService.save( |
| | | nameSpaces, |
| | | url, |
| | | null, |
| | | "127.0.0.1", |
| | | requestJson, |
| | | response, |
| | | success, |
| | | errorMsg |
| | | ); |
| | | } catch (Exception e) { |
| | | log.error(nameSpaces + "保存接口日志失败", e); |
| | | } |
| | | } |
| | | } |
| | | |
| | | } |
| New file |
| | |
| | | package com.zy.asrs.task.handler; |
| | | |
| | | import com.alibaba.fastjson.JSON; |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import com.zy.asrs.entity.WrkMast; |
| | | import com.zy.asrs.service.ApiLogService; |
| | | import com.zy.asrs.service.WrkMastService; |
| | | import com.zy.asrs.utils.Utils; |
| | | import com.zy.common.model.StartupDto; |
| | | import com.zy.common.utils.HttpHandler; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Value; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.util.Date; |
| | | |
| | | /** |
| | | * @author pang.jiabao |
| | | * @description 下位WCS系统相关定时任务处理 |
| | | * @createDate 2026/3/4 15:23 |
| | | */ |
| | | @Component |
| | | @Slf4j |
| | | public class WcsSchedulerHandler { |
| | | |
| | | @Value("${wcs.URL}") |
| | | private String wcsAddress; |
| | | |
| | | @Value("${wcs.createOutTask}") |
| | | private String createOutTask; |
| | | |
| | | @Value("${wcs.createLocMoveTask}") |
| | | private String createLocMoveTask; |
| | | |
| | | @Resource |
| | | private ApiLogService apiLogService; |
| | | |
| | | @Resource |
| | | private WrkMastService wrkMastService; |
| | | |
| | | public void outboundTaskDispatch(WrkMast wrkMast) { |
| | | StartupDto startupDto = new StartupDto(); |
| | | startupDto.setTaskNo(wrkMast.getWrkNo()); |
| | | startupDto.setTaskPri(wrkMast.getIoPri()); |
| | | |
| | | |
| | | String nameSpaces = "出库任务派发"; |
| | | String path = createOutTask; |
| | | if (wrkMast.getIoType() == 11 ) { |
| | | path = createLocMoveTask; |
| | | nameSpaces = "移库任务派发"; |
| | | startupDto.setSourceLocNo(Utils.locToLocNo(wrkMast.getSourceLocNo())); |
| | | startupDto.setLocNo(Utils.locToLocNo(wrkMast.getLocNo())); |
| | | } else { |
| | | startupDto.setStaNo(Integer.valueOf(wrkMast.getStaNo())); |
| | | startupDto.setLocNo(Utils.locToLocNo(wrkMast.getSourceLocNo())); |
| | | } |
| | | |
| | | String response = ""; |
| | | boolean success = false; |
| | | String errorMsg = null; |
| | | String requestJson = JSON.toJSONString(startupDto); |
| | | String url = wcsAddress + "/" + path; |
| | | try { |
| | | |
| | | response = new HttpHandler.Builder() |
| | | .setUri(wcsAddress) |
| | | .setPath(path) |
| | | .setJson(requestJson) |
| | | .build() |
| | | .doPost(); |
| | | JSONObject jsonObject = JSON.parseObject(response); |
| | | if (jsonObject.getString("code") != null && jsonObject.getString("code").equals("200")) { |
| | | wrkMast.setWrkSts(12L); |
| | | wrkMast.setCrnStrTime(new Date()); |
| | | wrkMastService.updateById(wrkMast); |
| | | success = true; |
| | | } else { |
| | | errorMsg = response; |
| | | log.error(nameSpaces + "调用外部接口失败,url:{},request:{},response:{}", url, requestJson, response); |
| | | } |
| | | } catch (Exception e) { |
| | | errorMsg = e.getMessage(); |
| | | log.error(nameSpaces + "调用外部接口异常,url:{},request:{},response:{}", url, requestJson, response, e); |
| | | } finally { |
| | | try { |
| | | apiLogService.save( |
| | | nameSpaces, |
| | | url, |
| | | null, |
| | | "127.0.0.1", |
| | | requestJson, |
| | | response, |
| | | success, |
| | | errorMsg |
| | | ); |
| | | } catch (Exception e) { |
| | | log.error(nameSpaces + "保存接口日志失败", e); |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | // 入库 -------------------------------------------------------------------------------- |
| | | if (wrkMast.getWrkSts() == 5) { |
| | | // 全板入库 |
| | | if (wrkMast.getIoType() == 1) { |
| | | if (wrkMast.getIoType() == 1 || wrkMast.getIoType() == 10) { |
| | | // 入库通知单 |
| | | if (!Cools.isEmpty(wrkMast.getBarcode())) { |
| | | // 保存入库通知档历史档 |
| | |
| | | return result; |
| | | } |
| | | |
| | | public static String locToLocNo(String locNo){//0100203 |
| | | int row = Integer.parseInt(locNo.substring(0, 2)); |
| | | int bay = Integer.parseInt(locNo.substring(2, 5)); |
| | | int lev = Integer.parseInt(locNo.substring(5, 7)); |
| | | return row + "-" +bay + "-" + lev; |
| | | } |
| | | |
| | | public static String getLocNo(Number row, Number bay, Number lev) { |
| | | return zerofill(String.valueOf(row), 2) + zerofill(String.valueOf(bay), 3) + zerofill(String.valueOf(lev), 2); |
| | | } |
| | | } |
| | |
| | | User user = userService.selectById(userLogin.getUserId()); |
| | | // String deToken = Cools.deTokn(token, user.getPassword()); |
| | | // long timestamp = Long.parseLong(deToken.substring(0, 13)); |
| | | // 15分钟后过期 |
| | | if (System.currentTimeMillis() - userLogin.getCreateTime().getTime() > 900000) { |
| | | // 60分钟后过期 |
| | | if (System.currentTimeMillis() - userLogin.getCreateTime().getTime() > 3600000) { |
| | | Http.response(response, BaseRes.DENIED); |
| | | return false; |
| | | } |
| | |
| | | |
| | | private String locNo; |
| | | |
| | | private Integer workNo; |
| | | private Integer taskNo; |
| | | |
| | | private Double taskPri; |
| | | |
| | | private String sourceLocNo; |
| | | |
| | | } |
| | |
| | | import com.core.exception.CoolException; |
| | | import com.zy.asrs.entity.*; |
| | | import com.zy.asrs.entity.result.FindLocNoAttributeVo; |
| | | import com.zy.asrs.mapper.LocMastMapper; |
| | | import com.zy.asrs.service.*; |
| | | import com.zy.asrs.utils.Utils; |
| | | import com.zy.asrs.utils.VersionUtils; |
| | |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.util.List; |
| | | import java.util.Optional; |
| | | |
| | | /** |
| | | * 货架核心功能 |
| | |
| | | // 生成工作号 |
| | | int workNo = getWorkNo(0); |
| | | // 返回dto |
| | | startupDto.setWorkNo(workNo); |
| | | startupDto.setTaskNo(workNo); |
| | | startupDto.setCrnNo(crnNo); |
| | | startupDto.setSourceStaNo(sourceStaNo); |
| | | startupDto.setLocNo(locNo); |
| | |
| | | // 生成工作号 |
| | | int workNo = getWorkNo(0); |
| | | // 返回dto |
| | | startupDto.setWorkNo(workNo); |
| | | startupDto.setTaskNo(workNo); |
| | | startupDto.setCrnNo(crnNo); |
| | | startupDto.setSourceStaNo(sourceStaNo); |
| | | startupDto.setLocNo(locNo); |
| | |
| | | // 生成工作号 |
| | | int workNo = getWorkNo(0); |
| | | // 返回dto |
| | | startupDto.setWorkNo(workNo); |
| | | startupDto.setTaskNo(workNo); |
| | | startupDto.setCrnNo(crnNo); |
| | | startupDto.setSourceStaNo(sourceStaNo); |
| | | startupDto.setLocNo(locNo); |
| | |
| | | } |
| | | } |
| | | |
| | | @Resource |
| | | private LocMastMapper locMastMapper; |
| | | |
| | | public StartupDto getLocNoNew(int ioType, Integer sourceStaNo, Integer locType, List<Integer> rows) { |
| | | // 寻找到的库位 |
| | | LocMast locMast = null; |
| | | |
| | | // 按库位类型获取库位 |
| | | List<LocMast> locMasts = locMastMapper.selectLocByTypeAndRowsToList(locType,rows); |
| | | |
| | | // todo 如果当前类型库位剩余不多,是一直放满,还是兼容到下一种库位类型 |
| | | // 考虑移库需要同类型库位,这里限制不能放满,兼容下一种库位类型 |
| | | if (locMasts.size() <= 4) { |
| | | switch (locType) { |
| | | case 0: |
| | | return getLocNoNew(ioType, sourceStaNo, 1,rows); |
| | | case 1: |
| | | return getLocNoNew(ioType, sourceStaNo, 2,rows); |
| | | case 2: |
| | | return getLocNoNew(ioType, sourceStaNo, 3,rows); |
| | | case 3: |
| | | log.warn("当前库位排:{},剩余{}个用于移库,无法占用",rows,locMasts.size()); |
| | | return null; |
| | | default: |
| | | } |
| | | } |
| | | |
| | | // 先取深库位 |
| | | Optional<LocMast> first = locMasts.stream().filter(o -> o.getRow1() == 1 || o.getRow1() == 4 || o.getRow1() == 5 || o.getRow1() == 8|| o.getRow1() == 9 || o.getRow1() == 12).findFirst(); |
| | | if (first.isPresent()) { |
| | | locMast = first.get(); |
| | | } else { |
| | | // 深库位里面没有从浅库位里面取 |
| | | Optional<LocMast> first2 = locMasts.stream().filter(o -> o.getRow1() == 2 || o.getRow1() == 3 || o.getRow1() == 6 || o.getRow1() == 7 || o.getRow1() == 10 || o.getRow1() == 11).findFirst(); |
| | | if(first2.isPresent()) { |
| | | locMast = first2.get(); |
| | | } |
| | | } |
| | | |
| | | if (locMast == null) { |
| | | return null; |
| | | } |
| | | |
| | | // 根据入库类型和源站点获取工作路径 |
| | | // StaDesc staDesc = staDescService.selectOne(new EntityWrapper<StaDesc>().eq("type_no", ioType).eq("stn_no", sourceStaNo).eq("crn_no",locMast.getCrnNo())); |
| | | // if (staDesc == null) { |
| | | // log.error("获取工作路径异常,类型:{},源站点:{},库位:{}",ioType,sourceStaNo,locMast.getLocNo()); |
| | | // return null; |
| | | // } |
| | | // 生成工作号 |
| | | int workNo = getWorkNo(0); |
| | | // 返回dto |
| | | StartupDto startupDto = new StartupDto(); |
| | | startupDto.setTaskNo(workNo); |
| | | startupDto.setCrnNo(locMast.getCrnNo()); |
| | | startupDto.setSourceStaNo(sourceStaNo); |
| | | startupDto.setStaNo(0); |
| | | startupDto.setLocNo(locMast.getLocNo()); |
| | | startupDto.setTaskPri(13D); |
| | | |
| | | return startupDto; |
| | | } |
| | | } |
| | |
| | | @Autowired |
| | | private LoadingConfigTimer loadingConfigTimer; |
| | | |
| | | @PostMapping("/login.action") |
| | | @RequestMapping("/login.action") |
| | | @ManagerAuth(value = ManagerAuth.Auth.NONE, memo = "登录") |
| | | public R loginAction(@RequestBody Map<String, String> param) { |
| | | public R loginAction(String username, String password){ |
| | | //验证许可证是否有效 |
| | | if (!licenseTimer.getSystemSupport()) { |
| | | if (!licenseTimer.getSystemSupport()){ |
| | | return R.parse(CodeRes.SYSTEM_20001); |
| | | } |
| | | if (username.equals("super") && password.equals(Cools.md5(superPwd))) { |
| | | Map<String, Object> res = new HashMap<>(); |
| | | res.put("username", username); |
| | | res.put("token", Cools.enToken(System.currentTimeMillis() + username, superPwd)); |
| | | return R.ok(res); |
| | | } |
| | | EntityWrapper<User> userWrapper = new EntityWrapper<>(); |
| | | userWrapper.eq("username", param.get("username")); |
| | | userWrapper.eq("username", username); |
| | | User user = userService.selectOne(userWrapper); |
| | | if (Cools.isEmpty(user)) { |
| | | if (param.get("username").equals("super") && param.get("password").equals(Cools.md5(superPwd))) { |
| | | Map<String, Object> res = new HashMap<>(); |
| | | res.put("username", param.get("username")); |
| | | res.put("token", Cools.enToken(System.currentTimeMillis() + param.get("username"), superPwd)); |
| | | return R.ok(res); |
| | | } |
| | | if (Cools.isEmpty(user)){ |
| | | return R.parse(CodeRes.USER_10001); |
| | | } |
| | | if (user.getStatus() != 1) { |
| | | if (user.getStatus()!=1){ |
| | | return R.parse(CodeRes.USER_10002); |
| | | } |
| | | if (!user.getPassword().equals(param.get("password"))) { |
| | | if (!user.getPassword().equals(password)){ |
| | | return R.parse(CodeRes.USER_10003); |
| | | } |
| | | String token = Cools.enToken(System.currentTimeMillis() + param.get("username"), user.getPassword()); |
| | | if (loadingConfigTimer.getTokenNumber() == 1) { |
| | | userLoginService.delete(new EntityWrapper<UserLogin>().eq("user_id", user.getId()).eq("system", "WMS")); |
| | | } |
| | | String token = Cools.enToken(System.currentTimeMillis() + username, user.getPassword()); |
| | | userLoginService.delete(new EntityWrapper<UserLogin>().eq("user_id", user.getId())); |
| | | UserLogin userLogin = new UserLogin(); |
| | | userLogin.setUserId(user.getId()); |
| | | userLogin.setToken(token); |
| | | userLogin.setCreateTime(new Date()); |
| | | userLogin.setSystem("WMS"); |
| | | userLoginService.insert(userLogin); |
| | | Map<String, Object> res = new HashMap<>(); |
| | | res.put("username", user.getUsername()); |
| | |
| | | import com.zy.asrs.entity.*; |
| | | import com.zy.asrs.entity.param.EmptyPlateOutParam; |
| | | import com.zy.asrs.entity.result.FindLocNoAttributeVo; |
| | | import com.zy.asrs.mapper.LocMastMapper; |
| | | import com.zy.asrs.service.*; |
| | | import com.zy.asrs.utils.Utils; |
| | | import com.zy.common.CodeRes; |
| | | import com.zy.common.model.LocTypeDto; |
| | | import com.zy.common.model.StartupDto; |
| | | import com.zy.common.model.enums.WorkNoType; |
| | | import com.zy.common.service.CommonService; |
| | | import com.zy.common.web.param.GetLocNoChangeParam; |
| | | import com.zy.common.web.param.NotifyDto; |
| | | import com.zy.common.web.param.SearchLocParam; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.util.ArrayList; |
| | | import java.util.Arrays; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | |
| | |
| | | @Autowired |
| | | private WorkService workService; |
| | | |
| | | @Resource |
| | | private WrkMastLogService wrkMastLogService; |
| | | |
| | | @PostMapping("/pakin/loc/v1") |
| | | @ResponseBody |
| | | public synchronized R getLocNo(@RequestBody SearchLocParam param) { |
| | | log.info("收到WCS入库接口请求====>>入参:{}", param); |
| | | if (Cools.isEmpty(param.getIoType())) { |
| | | return R.error("入出库类型不能为空"); |
| | | } |
| | | // if (Cools.isEmpty(param.getIoType())) { |
| | | // return R.error("入出库类型不能为空"); |
| | | // } |
| | | if (Cools.isEmpty(param.getSourceStaNo())) { |
| | | return R.error("源站编号不能为空"); |
| | | } |
| | | List<WaitPakin> waitPakins = null; |
| | | if (param.getRow().length == 0) { |
| | | return R.error("WCS上报无可用设备"); |
| | | } |
| | | // //wcs调用此接口向组托表插入一条数据模拟组托 |
| | | // WaitPakin waitPakin = new WaitPakin(); |
| | | // waitPakin.setZpallet(param.getBarcode()); |
| | | // waitPakin.setBatch("20260305002"); |
| | | // waitPakin.setAnfme(100.0D); |
| | | // waitPakin.setMatnr("YJ2026030509353203"); |
| | | // waitPakin.setMaktx("上拉杆_左前右后毛坯"); |
| | | // waitPakin.setSpecs("50001LR-71"); |
| | | // waitPakin.setModel("skv"); |
| | | // waitPakinService.insert(waitPakin); |
| | | // |
| | | // WaitPakin waitPakin2 = new WaitPakin(); |
| | | // waitPakin2.setZpallet(param.getBarcode()); |
| | | // waitPakin2.setBatch("20260305002"); |
| | | // waitPakin2.setAnfme(100.0D); |
| | | // waitPakin2.setMatnr("YJ2026030509494873"); |
| | | // waitPakin2.setMaktx("螺杆先"); |
| | | // waitPakin2.setSpecs("50001LR-71"); |
| | | // waitPakin2.setModel("skv"); |
| | | // waitPakinService.insert(waitPakin2); |
| | | List<WaitPakin> waitPakins = waitPakinService.selectList(new EntityWrapper<WaitPakin>().eq("zpallet", param.getBarcode())); |
| | | if (param.getIoType() == 1) { |
| | | if (Cools.isEmpty(param.getBarcode())) { |
| | | return R.error("条码不能为空"); |
| | | } |
| | | waitPakins = waitPakinService.selectList(new EntityWrapper<WaitPakin>().eq("zpallet", param.getBarcode())); |
| | | WrkMast wrkMast1 = wrkMastService.selectByBarcode(param.getBarcode()); |
| | | if (wrkMast1 != null) { |
| | | Integer ioType = wrkMast1.getIoType(); |
| | | if ((ioType == 103 || ioType == 107) && wrkMast1.getWrkSts() == 14) { |
| | | // 转换工作档 |
| | | if (!wrkMastLogService.save(wrkMast1.getWrkNo())) { |
| | | throw new CoolException("保存工作主档历史档失败"); |
| | | } |
| | | Date now = new Date(); |
| | | // 更新工作档数据状态 |
| | | wrkMast1.setIoType(wrkMast1.getIoType() - 50); // 入出库类型: 103->53,104->54,107->57 |
| | | wrkMast1.setWrkSts(2L); // 工作状态: 2.设备上走 |
| | | wrkMast1.setSourceStaNo(String.valueOf(param.getSourceStaNo())); // 源站 |
| | | wrkMast1.setStaNo("0"); // 目标站 |
| | | wrkMast1.setLocNo(wrkMast1.getSourceLocNo()); |
| | | wrkMast1.setSourceLocNo(""); // 源库位清空 |
| | | wrkMast1.setModiTime(now); |
| | | if (!wrkMastService.updateById(wrkMast1)) { |
| | | throw new CoolException("更新工作档数据状态失败"); |
| | | } |
| | | // 修改库位状态 Q.拣料/盘点/并板再入库 |
| | | LocMast locMast = locMastService.selectById(wrkMast1.getLocNo()); |
| | | locMast.setLocSts("Q"); |
| | | locMast.setModiTime(now); |
| | | if (!locMastService.updateById(locMast)) { |
| | | throw new CoolException("修改库位状态失败"); |
| | | } |
| | | } |
| | | StartupDto startupDto = new StartupDto(); |
| | | startupDto.setTaskNo(wrkMast1.getWrkNo()); |
| | | startupDto.setSourceStaNo(Integer.valueOf(wrkMast1.getSourceStaNo())); |
| | | startupDto.setTaskPri(wrkMast1.getIoPri()); |
| | | startupDto.setCrnNo(wrkMast1.getCrnNo()); |
| | | startupDto.setLocNo(Utils.locToLocNo(wrkMast1.getLocNo())); |
| | | return R.ok().add(startupDto); |
| | | } |
| | | if (Cools.isEmpty(waitPakins)) { |
| | | WrkMast wrkMast = wrkMastService.selectByBarcode(param.getBarcode()); |
| | | if (wrkMast != null && wrkMast.getIoType() == 103) { |
| | |
| | | } |
| | | |
| | | // 源站点状态检测 |
| | | BasDevp sourceStaNo = basDevpService.checkSiteStatus(param.getSourceStaNo(), true); |
| | | sourceStaNo.setLocType1(param.getLocType1()); |
| | | LocTypeDto locTypeDto = new LocTypeDto(sourceStaNo); |
| | | // BasDevp sourceStaNo = basDevpService.checkSiteStatus(param.getSourceStaNo(), true); |
| | | // sourceStaNo.setLocType1(param.getLocType1()); |
| | | LocTypeDto locTypeDto = new LocTypeDto(); |
| | | locTypeDto.setLocType1(param.getLocType1()); |
| | | if(!waitPakins.isEmpty()) { // 判断是否是空托盘 |
| | | if (waitPakins.get(0).getMatnr().equals("1") ) { |
| | | param.setIoType(10); |
| | | } |
| | | } |
| | | |
| | | StartupDto dto = null; |
| | | switch (param.getIoType()) { |
| | | case 1://满托盘入库 |
| | | assert waitPakins != null; |
| | | dto = startupFullPutStore(param.getSourceStaNo(), param.getBarcode(), locTypeDto, waitPakins); |
| | | dto = startupFullPutStore(param.getSourceStaNo(), param.getBarcode(), locTypeDto, waitPakins, param.getRow()); |
| | | break; |
| | | case 10://空托盘入库 |
| | | dto = emptyPlateIn(param.getSourceStaNo(), locTypeDto, param.getBarcode()); |
| | | dto = emptyPlateIn(param.getSourceStaNo(), locTypeDto, param.getBarcode(),param.getRow()); |
| | | break; |
| | | default: |
| | | break; |
| | | } |
| | | log.info("WCS入库接口返参:{},托盘码:{}", dto, param.getBarcode()); |
| | | return R.ok().add(dto); |
| | | } |
| | | |
| | | @PostMapping("/taskWrk/state") |
| | | @ResponseBody |
| | | public R taskWrkState(@RequestBody(required = false) NotifyDto notifyDto){ |
| | | log.info("收到WCS请求上报接口======>>工作号:{},入参:{}",notifyDto.getSuperTaskNo(),notifyDto); |
| | | if (Cools.isEmpty(notifyDto.getNotifyType())){ |
| | | return R.error("通知类型不能为空"); |
| | | } |
| | | if (Cools.isEmpty(notifyDto.getTaskNo())){ |
| | | return R.error("任务号不能为空"); |
| | | } |
| | | WrkMast wrkMast = wrkMastService.selectById(notifyDto.getSuperTaskNo()); |
| | | switch (notifyDto.getMsgType()){ |
| | | case "task_complete": |
| | | if (wrkMast != null && (wrkMast.getIoType() == 1 || wrkMast.getIoType() == 10 || wrkMast.getIoType() == 53 || wrkMast.getIoType() == 57 || wrkMast.getIoType() == 11)){ |
| | | wrkMast.setWrkSts(4L); |
| | | if (!wrkMastService.updateById(wrkMast)){ |
| | | return R.error("修改工作档失败====>4"); |
| | | } |
| | | }else if (wrkMast != null && (wrkMast.getIoType() == 101 || wrkMast.getIoType() == 103 ||wrkMast.getIoType() == 107 || wrkMast.getIoType() == 110)){ |
| | | wrkMast.setWrkSts(14L); |
| | | if (!wrkMastService.updateById(wrkMast)){ |
| | | return R.error("修改工作档失败====>14"); |
| | | } |
| | | } |
| | | break; |
| | | case "task_cancel": |
| | | if(wrkMast == null) { |
| | | return R.ok("任务不存在"); |
| | | } |
| | | workService.cancelWrkMast(notifyDto.getSuperTaskNo(), 9527L); |
| | | } |
| | | return R.ok(); |
| | | } |
| | | |
| | | @PostMapping("/change/loc/v1") |
| | | @ResponseBody |
| | | @Transactional |
| | | public synchronized R getLocNoChange(@RequestBody(required = false) GetLocNoChangeParam param) { |
| | | log.info("收到WCS申请在库库位更换库位请求====>>入参:{}", param); |
| | | StartupDto dto = applyChangeLocNo(param.getLocNo(), param.getRow()); |
| | | log.info("WCS申请在库库位更换库位接口返参:{}", dto); |
| | | return R.ok().add(dto); |
| | | } |
| | | |
| | | @Transactional |
| | | public StartupDto applyChangeLocNo(String wcsLocNo, int[] row) { |
| | | if (row.length == 0) { |
| | | throw new CoolException(wcsLocNo + "库位,WCS上报无可用设备"); |
| | | } |
| | | |
| | | String sourceLocNo = loc(wcsLocNo); |
| | | LocMast sourceLocMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", sourceLocNo)); |
| | | if (sourceLocMast == null) { |
| | | throw new CoolException("源库位不存在"); |
| | | } |
| | | |
| | | if(!sourceLocMast.getLocSts().equals("F")) { |
| | | throw new CoolException("源库位不处于在库状态"); |
| | | } |
| | | List<LocDetl> locDetlList = locDetlService.selectList(new EntityWrapper<LocDetl>().eq("loc_no", sourceLocNo)); |
| | | |
| | | LocTypeDto locTypeDto = new LocTypeDto(); |
| | | locTypeDto.setLocType1(sourceLocMast.getLocType1()); |
| | | |
| | | StartupDto dto = null; |
| | | // 根据库位排映射堆垛机 |
| | | for(int i = 0; i < row.length/4 ; i ++) { |
| | | ArrayList<Integer> rows = new ArrayList<>(); |
| | | rows.add(row[i * 4]); |
| | | rows.add(row[i * 4 + 1]); |
| | | rows.add(row[i * 4 + 2]); |
| | | rows.add(row[i * 4 + 3]); |
| | | dto = commonService.getLocNoNew(1, 0, Integer.valueOf(locTypeDto.getLocType1()),rows); |
| | | if (dto != null) { |
| | | break; |
| | | } |
| | | } |
| | | if (dto == null) { |
| | | throw new CoolException("没有匹配到库位,检查可用库位/堆垛机报警"); |
| | | } |
| | | |
| | | LocMast loc = locMastService.selectById(dto.getLocNo()); |
| | | if (Cools.isEmpty(loc)){ |
| | | throw new CoolException("未找到库位"); |
| | | } |
| | | Date now = new Date(); |
| | | // 获取工作号 |
| | | int workNo = commonService.getWorkNo(WorkNoType.PICK.type); |
| | | dto.setTaskNo(workNo); |
| | | |
| | | // 保存工作档 |
| | | WrkMast wrkMast = new WrkMast(); |
| | | wrkMast.setWrkNo(workNo); |
| | | wrkMast.setIoTime(now); |
| | | wrkMast.setWrkSts(12L); // 工作状态 |
| | | wrkMast.setIoType(11); // 入出库状态: 11.库格移载 |
| | | wrkMast.setIoPri(10D); |
| | | wrkMast.setSourceLocNo(sourceLocNo); // 源库位 |
| | | wrkMast.setLocNo(dto.getLocNo()); // 目标库位 |
| | | wrkMast.setFullPlt("Y"); // 满板:Y |
| | | wrkMast.setPicking("N"); // 拣料 |
| | | wrkMast.setExitMk("N"); // 退出 |
| | | wrkMast.setBarcode(sourceLocMast.getBarcode()); // 托盘码 |
| | | wrkMast.setEmptyMk(sourceLocMast.getLocSts().equals("D") ? "Y" : "N"); |
| | | wrkMast.setLinkMis("N"); |
| | | wrkMast.setAppeTime(now); |
| | | wrkMast.setModiTime(now); |
| | | boolean res = wrkMastService.insert(wrkMast); |
| | | if (!res) { |
| | | throw new CoolException("保存工作档失败"); |
| | | } |
| | | // 工作档明细保存 |
| | | for (LocDetl locDetl : locDetlList) { |
| | | WrkDetl wrkDetl = new WrkDetl(); |
| | | wrkDetl.sync(locDetl); |
| | | wrkDetl.setWrkNo(workNo); |
| | | wrkDetl.setIoTime(now); |
| | | wrkDetl.setAnfme(locDetl.getAnfme()); |
| | | wrkDetl.setAppeTime(now); |
| | | wrkDetl.setModiTime(now); |
| | | if (!wrkDetlService.insert(wrkDetl)) { |
| | | throw new CoolException("保存工作档明细失败"); |
| | | } |
| | | } |
| | | // 修改源库位状态 |
| | | if (sourceLocMast.getLocSts().equals("D") || sourceLocMast.getLocSts().equals("F")) { |
| | | sourceLocMast.setLocSts("R"); // R.出库预约 |
| | | sourceLocMast.setModiTime(now); |
| | | if (!locMastService.updateById(sourceLocMast)){ |
| | | throw new CoolException("更新源库位状态失败"); |
| | | } |
| | | } else { |
| | | throw new CoolException("源库位出库失败,状态:" + sourceLocMast.getLocSts$()); |
| | | } |
| | | |
| | | // 修改目标库位状态 |
| | | if (loc.getLocSts().equals("O")) { |
| | | loc.setLocSts("S"); // S.入库预约 |
| | | loc.setModiTime(now); |
| | | if (!locMastService.updateById(loc)) { |
| | | throw new CoolException("更新目标库位状态失败"); |
| | | } |
| | | } else { |
| | | throw new CoolException("移转失败,目标库位状态:"+loc.getLocSts$()); |
| | | } |
| | | dto.setLocNo(Utils.locToLocNo(dto.getLocNo())); |
| | | return dto; |
| | | } |
| | | |
| | | public String loc(String locNo){ |
| | | String[] split = locNo.split("-"); |
| | | return Utils.getLocNo(Integer.parseInt(split[0]),Integer.parseInt(split[1]),Integer.parseInt(split[2])); |
| | | } |
| | | |
| | | @Resource |
| | | private LocMastMapper locMastMapper; |
| | | @RequestMapping("/auto21") |
| | | public R auto21(@RequestBody List<Integer> rows) { |
| | | List<LocMast> locMastList = locMastMapper.selectLocByTypeAndRowsToList(1, rows); |
| | | return R.ok(locMastList); |
| | | } |
| | | |
| | | @PostMapping("/auto/emptyIn/v1") |
| | |
| | | Date now = new Date(); |
| | | // 生成工作档 |
| | | WrkMast wrkMast = new WrkMast(); |
| | | wrkMast.setWrkNo(dto.getWorkNo()); |
| | | wrkMast.setWrkNo(dto.getTaskNo()); |
| | | wrkMast.setIoTime(now); |
| | | wrkMast.setWrkSts(1L); |
| | | wrkMast.setIoPri(13D); |
| | |
| | | * 全板入库 |
| | | */ |
| | | @Transactional |
| | | public StartupDto startupFullPutStore(Integer devpNo, String barcode, LocTypeDto locTypeDto, List<WaitPakin> waitPakins) { |
| | | public StartupDto startupFullPutStore(Integer devpNo, String barcode, LocTypeDto locTypeDto, List<WaitPakin> waitPakins, int[] row) { |
| | | // 源站点状态检测 |
| | | BasDevp sourceStaNo = basDevpService.checkSiteStatus(devpNo, true); |
| | | // BasDevp sourceStaNo = basDevpService.checkSiteStatus(devpNo, true); |
| | | // 检索库位 |
| | | // List<String> matnrs = waitPakins.stream().map(WaitPakin::getMatnr).distinct().collect(Collectors.toList()); |
| | | // List<String> batchs = waitPakins.stream().map(WaitPakin::getBatch).distinct().collect(Collectors.toList()); |
| | | // FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo(matnrs.get(0), batchs.get(0)); |
| | | FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo(waitPakins.get(0)); |
| | | StartupDto dto = commonService.getLocNo(1, devpNo, findLocNoAttributeVo, locTypeDto); |
| | | int workNo = dto.getWorkNo(); |
| | | // FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo(waitPakins.get(0)); |
| | | // StartupDto dto = commonService.getLocNo(1, devpNo, findLocNoAttributeVo, locTypeDto); |
| | | StartupDto dto = null; |
| | | // 根据库位排映射堆垛机 |
| | | for(int i = 0; i < row.length/4 ; i ++) { |
| | | ArrayList<Integer> rows = new ArrayList<>(); |
| | | rows.add(row[i * 4]); |
| | | rows.add(row[i * 4 + 1]); |
| | | rows.add(row[i * 4 + 2]); |
| | | rows.add(row[i * 4 + 3]); |
| | | dto = commonService.getLocNoNew(1, devpNo, Integer.valueOf(locTypeDto.getLocType1()),rows); |
| | | if (dto != null) { |
| | | break; |
| | | } |
| | | } |
| | | if (dto == null) { |
| | | throw new CoolException("没有匹配到库位,检查可用库位/堆垛机报警"); |
| | | } |
| | | int workNo = dto.getTaskNo(); |
| | | Date now = new Date(); |
| | | // 生成工作档 |
| | | WrkMast wrkMast = new WrkMast(); |
| | |
| | | wrkMast.setExitMk("N"); // 退出 |
| | | wrkMast.setEmptyMk("N"); // 空板 |
| | | wrkMast.setLinkMis("Y"); |
| | | wrkMast.setCtnType(sourceStaNo.getCtnType()); // 容器类型 |
| | | // wrkMast.setCtnType(sourceStaNo.getCtnType()); // 容器类型 |
| | | // 操作人员数据 |
| | | wrkMast.setAppeTime(now); |
| | | wrkMast.setModiTime(now); |
| | |
| | | throw new CoolException("更新通知档失败"); |
| | | } |
| | | // 更新源站点信息 |
| | | sourceStaNo.setWrkNo(workNo); |
| | | sourceStaNo.setModiTime(now); |
| | | if (!basDevpService.updateById(sourceStaNo)) { |
| | | throw new CoolException("更新源站失败"); |
| | | } |
| | | // sourceStaNo.setWrkNo(workNo); |
| | | // sourceStaNo.setModiTime(now); |
| | | // if (!basDevpService.updateById(sourceStaNo)) { |
| | | // throw new CoolException("更新源站失败"); |
| | | // } |
| | | // 更新目标库位状态 |
| | | LocMast locMast = locMastService.selectById(dto.getLocNo()); |
| | | if (locMast.getLocSts().equals("O")) { |
| | |
| | | } else { |
| | | throw new CoolException(dto.getLocNo() + "目标库位已被占用"); |
| | | } |
| | | dto.setLocNo(Utils.locToLocNo(dto.getLocNo())); |
| | | return dto; |
| | | } |
| | | |
| | | @Transactional |
| | | public StartupDto emptyPlateIn(Integer devpNo, LocTypeDto locTypeDto, String barcode) { |
| | | public StartupDto emptyPlateIn(Integer devpNo, LocTypeDto locTypeDto, String barcode, int[] row) { |
| | | // 源站点状态检测 |
| | | BasDevp sourceStaNo = basDevpService.checkSiteStatus(devpNo, true); |
| | | // BasDevp sourceStaNo = basDevpService.checkSiteStatus(devpNo, true); |
| | | // 检索库位 |
| | | FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo(); |
| | | // FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo(); |
| | | |
| | | StartupDto dto = commonService.getLocNo(10, devpNo, findLocNoAttributeVo, locTypeDto); |
| | | int workNo = dto.getWorkNo(); |
| | | // StartupDto dto = commonService.getLocNo(10, devpNo, findLocNoAttributeVo, locTypeDto); |
| | | StartupDto dto = null; |
| | | // 根据库位排映射堆垛机 |
| | | for(int i = 0; i < row.length/4 ; i ++) { |
| | | ArrayList<Integer> rows = new ArrayList<>(); |
| | | rows.add(row[i * 4]); |
| | | rows.add(row[i * 4 + 1]); |
| | | rows.add(row[i * 4 + 2]); |
| | | rows.add(row[i * 4 + 3]); |
| | | dto = commonService.getLocNoNew(1, devpNo, Integer.valueOf(locTypeDto.getLocType1()),rows); |
| | | if (dto != null) { |
| | | break; |
| | | } |
| | | } |
| | | if (dto == null) { |
| | | throw new CoolException("没有匹配到库位,检查可用库位/堆垛机报警"); |
| | | } |
| | | int workNo = dto.getTaskNo(); |
| | | Date now = new Date(); |
| | | // 生成工作档 |
| | | WrkMast wrkMast = new WrkMast(); |
| | | wrkMast.setWrkNo(workNo); |
| | | wrkMast.setIoTime(new Date()); |
| | | wrkMast.setIoTime(now); |
| | | wrkMast.setWrkSts(2L); // 工作状态:生成入库ID |
| | | wrkMast.setIoType(10); // 入出库状态:10.空板入库 |
| | | wrkMast.setIoPri(13D); // 优先级 |
| | |
| | | wrkMast.setEmptyMk("Y"); // 空板 |
| | | wrkMast.setLinkMis("Y"); |
| | | wrkMast.setBarcode(barcode); |
| | | wrkMast.setCtnType(sourceStaNo.getCtnType()); // 容器类型 |
| | | // wrkMast.setCtnType(sourceStaNo.getCtnType()); // 容器类型 |
| | | // 操作人员数据 |
| | | wrkMast.setAppeTime(new Date()); |
| | | wrkMast.setModiTime(new Date()); |
| | | wrkMast.setAppeTime(now); |
| | | wrkMast.setModiTime(now); |
| | | boolean res = wrkMastService.insert(wrkMast); |
| | | if (!res) { |
| | | throw new CoolException("保存工作档失败"); |
| | | } |
| | | // 更新源站点信息 |
| | | sourceStaNo.setWrkNo(workNo); |
| | | sourceStaNo.setModiTime(new Date()); |
| | | if (!basDevpService.updateById(sourceStaNo)) { |
| | | throw new CoolException("更新源站失败"); |
| | | // 更新入库通知档 ioStatus ===>> Y |
| | | Wrapper<WaitPakin> wrapper = new EntityWrapper<WaitPakin>() |
| | | .eq("zpallet", barcode); |
| | | WaitPakin setParam = new WaitPakin(); |
| | | setParam.setLocNo(dto.getLocNo()); |
| | | setParam.setIoStatus("Y"); |
| | | setParam.setModiTime(now); |
| | | if (!waitPakinService.update(setParam, wrapper)) { |
| | | throw new CoolException("更新通知档失败"); |
| | | } |
| | | // 更新目标库位状态 |
| | | LocMast locMast = locMastService.selectById(dto.getLocNo()); |
| | | if (locMast.getLocSts().equals("O")) { |
| | | locMast.setLocSts("S"); // S.入库预约 |
| | | locMast.setModiTime(new Date()); |
| | | locMast.setModiTime(now); |
| | | if (!locMastService.updateById(locMast)) { |
| | | throw new CoolException("改变库位状态失败"); |
| | | } |
| | | } else { |
| | | throw new CoolException(dto.getLocNo() + "目标库位已被占用"); |
| | | } |
| | | dto.setLocNo(Utils.locToLocNo(dto.getLocNo())); |
| | | return dto; |
| | | } |
| | | |
| New file |
| | |
| | | package com.zy.common.web.param; |
| | | |
| | | import lombok.Data; |
| | | |
| | | @Data |
| | | public class GetLocNoChangeParam { |
| | | |
| | | private String locNo; |
| | | |
| | | //库位排 |
| | | private int[] row; |
| | | |
| | | } |
| New file |
| | |
| | | package com.zy.common.web.param; |
| | | |
| | | import lombok.Data; |
| | | |
| | | @Data |
| | | public class NotifyDto { |
| | | private Long id; |
| | | |
| | | //通知类型 |
| | | private String notifyType; |
| | | |
| | | //设备号 |
| | | private Integer device; |
| | | |
| | | //工作号 |
| | | private String taskNo; |
| | | |
| | | //上级系统工作号 |
| | | private String superTaskNo; |
| | | |
| | | //消息类型 |
| | | private String msgType; |
| | | |
| | | //消息描述 |
| | | private String msgDesc; |
| | | |
| | | //消息数据 |
| | | private String data; |
| | | |
| | | //失败重试次数 |
| | | private Integer failTimes = 3; |
| | | |
| | | //重试次数 |
| | | private Integer retryTimes = 0; |
| | | |
| | | //重试间隔默认30s |
| | | private Integer retryTime = 30; |
| | | |
| | | //上次重试时间 |
| | | private Long lastRetryTime = 0L; |
| | | |
| | | } |
| | |
| | | @Data |
| | | public class SearchLocParam { |
| | | |
| | | private Integer ioType; |
| | | private Integer ioType = 1; |
| | | |
| | | private Integer sourceStaNo; |
| | | |
| | | private String barcode; |
| | | |
| | | // 库位规格( 0:未知, 1:低库位, 2:高库位) |
| | | // 库位规格( 0:未知, 1:低库位, 2:中库位,3.高库位) |
| | | private Short locType1; |
| | | |
| | | //库位排 |
| | | private int[] row; |
| | | |
| | | } |
| | |
| | | if (user.getMobile() != null) { |
| | | entity.setMobile(user.getMobile()); |
| | | } |
| | | if (user.getRoleId() != null) { |
| | | entity.setRoleId(user.getRoleId()); |
| | | } |
| | | userService.updateById(entity); |
| | | return R.ok(); |
| | | } |
| | |
| | | |
| | | try { |
| | | // result.setIpAddress(this.getIpAddress()); |
| | | result.setMacAddress(this.getMacAddress()); |
| | | result.setCpuSerial(this.getCPUSerial()); |
| | | result.setMainBoardSerial(this.getMainBoardSerial()); |
| | | // result.setMacAddress(this.getMacAddress()); |
| | | // result.setCpuSerial(this.getCPUSerial()); |
| | | // result.setMainBoardSerial(this.getMainBoardSerial()); |
| | | } catch (Exception e) { |
| | | logger.error("获取服务器硬件信息失败", e); |
| | | } |
| | |
| | | LicenseCheck serverCheckModel = getServerInfos(); |
| | | |
| | | if (expectedCheckModel != null && serverCheckModel != null) { |
| | | //校验IP地址 |
| | | if (!checkIpAddress(expectedCheckModel.getIpAddress(), serverCheckModel.getIpAddress())) { |
| | | throw new LicenseContentException("当前服务器的IP没在授权范围内"); |
| | | } |
| | | |
| | | //校验Mac地址 |
| | | if (!checkIpAddress(expectedCheckModel.getMacAddress(), serverCheckModel.getMacAddress())) { |
| | | throw new LicenseContentException("当前服务器的Mac地址没在授权范围内"); |
| | | } |
| | | |
| | | //校验主板序列号 |
| | | if (!checkSerial(expectedCheckModel.getMainBoardSerial(), serverCheckModel.getMainBoardSerial())) { |
| | | throw new LicenseContentException("当前服务器的主板序列号没在授权范围内"); |
| | | } |
| | | |
| | | //校验CPU序列号 |
| | | if (!checkSerial(expectedCheckModel.getCpuSerial(), serverCheckModel.getCpuSerial())) { |
| | | throw new LicenseContentException("当前服务器的CPU序列号没在授权范围内"); |
| | | } |
| | | // //校验IP地址 |
| | | // if (!checkIpAddress(expectedCheckModel.getIpAddress(), serverCheckModel.getIpAddress())) { |
| | | // throw new LicenseContentException("当前服务器的IP没在授权范围内"); |
| | | // } |
| | | // |
| | | // //校验Mac地址 |
| | | // if (!checkIpAddress(expectedCheckModel.getMacAddress(), serverCheckModel.getMacAddress())) { |
| | | // throw new LicenseContentException("当前服务器的Mac地址没在授权范围内"); |
| | | // } |
| | | // |
| | | // //校验主板序列号 |
| | | // if (!checkSerial(expectedCheckModel.getMainBoardSerial(), serverCheckModel.getMainBoardSerial())) { |
| | | // throw new LicenseContentException("当前服务器的主板序列号没在授权范围内"); |
| | | // } |
| | | // |
| | | // //校验CPU序列号 |
| | | // if (!checkSerial(expectedCheckModel.getCpuSerial(), serverCheckModel.getCpuSerial())) { |
| | | // throw new LicenseContentException("当前服务器的CPU序列号没在授权范围内"); |
| | | // } |
| | | } else { |
| | | throw new LicenseContentException("不能获取服务器硬件信息"); |
| | | } |
| | |
| | | // erp上报 |
| | | private Boolean erpReport = false; |
| | | |
| | | private String erpInReportPath; |
| | | |
| | | private String erpOutReportPath; |
| | | |
| | | private String erpReportURL; |
| | | |
| | | |
| | | @Autowired |
| | | private ConfigService configService; |
| | |
| | | logDeleteDays = configService.getVal("logDeleteDays", Integer.class, logDeleteDays); |
| | | erpReport = configService.getVal("erpReport", Boolean.class, erpReport); |
| | | zpalletManage = configService.getVal("zpalletManage", Boolean.class, zpalletManage); |
| | | erpOutReportPath = configService.getVal("erpOutReportPath", String.class, erpOutReportPath); |
| | | erpInReportPath = configService.getVal("erpInReportPath", String.class, erpInReportPath); |
| | | erpReportURL = configService.getVal("erpReportURL", String.class, erpReportURL); |
| | | |
| | | } |
| | | |
| | |
| | | driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver |
| | | username: sa |
| | | password: sa@123 |
| | | url: jdbc:sqlserver://127.0.0.1:1433;databasename=wms |
| | | url: jdbc:sqlserver://127.0.0.1:1433;databasename=nwswms |
| | | mvc: |
| | | static-path-pattern: /** |
| | | redis: |
| | |
| | | |
| | | mybatis-plus: |
| | | mapper-locations: classpath:mapper/*.xml |
| | | # global-config: |
| | | # field-strategy: 0 |
| | | # configuration: |
| | | # log-impl: org.apache.ibatis.logging.stdout.StdOutImpl |
| | | # map-underscore-to-camel-case: true |
| | | # cache-enabled: true |
| | | # call-setters-on-nulls: true |
| | | |
| | | |
| | | super: |
| | |
| | | |
| | | #License相关配置 |
| | | license: |
| | | subject: asrs2.0 |
| | | subject: nwsasrs |
| | | publicAlias: publicCert |
| | | storePass: public_zhongyang_123456789 |
| | | licensePath: license.lic |
| | | publicKeysStorePath: publicCerts.keystore |
| | | |
| | | #wcs对接 |
| | | wcs: |
| | | URL: http://127.0.0.1:9090/wcs |
| | | outboundTaskSend: open/outboundTaskSend |
| | | deviceStatus : open/deviceStatus |
| | | createOutTask: openapi/createOutTask |
| | | createLocMoveTask: openapi/createLocMoveTask |
| | | devicesStatus: openapi/devicesStatus |
| | | getAllLocInformation: openapi/getAllLocInformation |
| | | |
| | | # 下位机配置 |
| | | wcs-slave: |
| | | # 双深 |
| | |
| | | |
| | | |
| | | <if test="locNos != null and locNos.size > 0"> |
| | | and b.loc_no not in |
| | | and (b.loc_no + '_' + a.matnr + '_' + a.batch) not in |
| | | <foreach item="item" collection="locNos" index="index" separator="," open="(" close=")"> |
| | | #{item} |
| | | </foreach> |
| | |
| | | #{item} |
| | | </foreach> |
| | | </select> |
| | | <select id="selectLocByTypeAndRowsToList" resultType="com.zy.asrs.entity.LocMast"> |
| | | select |
| | | loc_no as locNo, |
| | | crn_no as crnNo, |
| | | row1 |
| | | from asr_loc_mast |
| | | where loc_sts = 'O' |
| | | and loc_type1 = #{locType} |
| | | and row1 in |
| | | <foreach collection="rows" item="row" open="(" separator="," close=")"> |
| | | #{row} |
| | | </foreach> |
| | | order by lev1, bay1, row1 |
| | | </select> |
| | | |
| | | </mapper> |
| | |
| | | </update> |
| | | |
| | | <update id="decrease"> |
| | | update man_order_detl |
| | | update man_order_detl_pakin |
| | | set work_qty = work_qty - #{qty} |
| | | where 1=1 |
| | | and order_no = #{orderNo} |
| | |
| | | |
| | | <update id="increaseQtyByOrderNo"> |
| | | update man_order_detl_pakin |
| | | set qty = qty + #{qty} |
| | | set qty = qty + #{qty},work_qty = work_qty - #{qty} |
| | | where 1=1 |
| | | and order_no = #{orderNo} |
| | | and matnr = #{matnr} |
| | |
| | | |
| | | <!-- 通用查询映射结果 --> |
| | | <resultMap id="BaseResultMap" type="com.zy.asrs.entity.WrkMast"> |
| | | <id column="id" property="id" /> |
| | | <result column="wrk_no" property="wrkNo" /> |
| | | <result column="task_type" property="taskType" /> |
| | | <result column="inv_wh" property="invWh" /> |
| | |
| | | select * from asr_wrk_mast |
| | | where wrk_sts=5 |
| | | or (wrk_sts=15 and ove_mk='Y' and wrk_no not in (select wrk_no from asr_bas_devp)) |
| | | or (wrk_sts=15 and dateadd(mi,3,crn_end_time) <= getdate() and wrk_no not in (select wrk_no from asr_bas_devp)) |
| | | or (wrk_sts=15 and dateadd(mi,1,crn_end_time) <= getdate() and wrk_no not in (select wrk_no from asr_bas_devp)) |
| | | or (wrk_sts=15 and crn_end_time is null and wrk_no not in (select wrk_no from asr_bas_devp)) |
| | | order by io_time,wrk_no asc |
| | | </select> |
| | |
| | | height: 'full-120', |
| | | cols: [[ |
| | | {type: 'checkbox'} |
| | | ,{field: 'createTime$', align: 'center',title: '添加时间'} |
| | | // ,{field: 'id', align: 'center',title: 'ID'} |
| | | // ,{field: 'uuid', align: 'center',title: '日志编号'} |
| | | ,{field: 'namespace', align: 'center',title: '名称空间'} |
| | |
| | | // ,{field: 'timestamp', align: 'center',title: '时间戳'} |
| | | ,{field: 'clientIp', align: 'center',title: 'URL',hide: true} |
| | | ,{field: 'request', align: 'center',title: '请求内容'} |
| | | ,{field: 'response', align: 'center',title: '操作内容'} |
| | | // ,{field: 'err', align: 'center',title: '异常内容'} |
| | | ,{field: 'response', align: 'center',title: '返回内容'} |
| | | ,{field: 'err', align: 'center',title: '异常内容'} |
| | | ,{field: 'result$', align: 'center',title: '结果', templet: '#resTpl', width: 80} |
| | | // ,{field: 'status$', align: 'center',title: '状态'} |
| | | ,{field: 'createTime$', align: 'center',title: '添加时间'} |
| | | // ,{field: 'updateTime$', align: 'center',title: '修改时间'} |
| | | ,{field: 'memo', align: 'center',title: '备注', hide: true} |
| | | |
| | | ,{fixed: 'right', title:'操作', align: 'center', toolbar: '#operate', width: 80} |
| | | // ,{fixed: 'right', title:'操作', align: 'center', toolbar: '#operate', width: 80} |
| | | ]], |
| | | request: { |
| | | pageName: 'curr', |
| | |
| | | html += ">"; |
| | | return html; |
| | | }} |
| | | ,{field: 'modiUser$', align: 'center',title: '修改人员', hide:true} |
| | | ,{field: 'modiTime$', align: 'center',title: '修改时间', hide:true}) |
| | | ,{field: 'appeUser$', align: 'center',title: '创建人员'} |
| | | ,{field: 'appeTime$', align: 'center',title: '创建时间'} |
| | | ,{field: 'modiTime$', align: 'center',title: '修改时间'}) |
| | | return cols; |
| | | } |
| | | layui.use(['table','laydate', 'form'], function(){ |
| | |
| | | <div class="layui-inline"> |
| | | <label class="layui-form-label">请求内容:</label> |
| | | <div class="layui-input-inline"> |
| | | <input class="layui-input" type="text" name="request" placeholder="请输入(订单号或品号)" autocomplete="off"> |
| | | <input class="layui-input" type="text" name="request" placeholder="请输入" autocomplete="off"> |
| | | </div> |
| | | </div> |
| | | <div class="layui-inline">  |
| | |
| | | <script type="text/html" id="toolbar"> |
| | | <div class="layui-btn-container"> |
| | | <!-- <button class="layui-btn layui-btn-sm" id="btn-add" lay-event="addData">新增</button>--> |
| | | <button class="layui-btn layui-btn-sm layui-btn-danger" id="btn-delete" lay-event="deleteData">删除</button> |
| | | <button class="layui-btn layui-btn-primary layui-btn-sm" id="btn-export" lay-event="exportData" style="float: right">导出</button> |
| | | <!-- <button class="layui-btn layui-btn-sm layui-btn-danger" id="btn-delete" lay-event="deleteData">删除</button>--> |
| | | <button class="layui-btn layui-btn-primary layui-btn-sm" id="btn-export" lay-event="exportData">导出</button> |
| | | </div> |
| | | </script> |
| | | |
| | |
| | | let params = {username: username, password: hex_md5(password)} |
| | | $.ajax({ |
| | | url: baseUrl + "/login.action", |
| | | headers: {'Content-Type': 'application/json'}, |
| | | data: JSON.stringify(params), |
| | | data:params, |
| | | method: 'POST', |
| | | success: function (res) { |
| | | if (res.code === 200) { |