src/main/java/com/zy/asrs/controller/MobileController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/asrs/controller/ReviewController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/asrs/entity/ReviewDetl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/asrs/importexcle/ImportReviewDto.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/asrs/importexcle/ImportReviewListener.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/webapp/static/js/review/review.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/webapp/views/review/review.html | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/main/java/com/zy/asrs/controller/MobileController.java
@@ -16,12 +16,15 @@ import com.zy.asrs.service.*; import com.zy.common.model.WrkDto; import com.zy.common.web.BaseController; import com.zy.system.entity.User; import com.zy.system.service.UserService; 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.*; import java.util.stream.Collectors; /** * 移动端接口控制器 @@ -29,7 +32,7 @@ */ @RestController @RequestMapping("mobile") public class MobileController extends BaseController { public class MobileController extends BaseController { @Autowired private MobileService mobileService; @@ -64,33 +67,41 @@ @Resource private OrderDetlMapper orderDetlMapper; @Resource private ReviewService reviewService; @Resource private ReviewDetlService reviewDetlService; @Resource private UserService userService; // 商品上架 @RequestMapping("/mat/onSale/auth") @ManagerAuth public R matOnSale(@RequestBody CombParam combParam){ public R matOnSale(@RequestBody CombParam combParam) { mobileService.onSale(combParam); return R.ok("上架成功"); } // 商品下架 @RequestMapping("/mat/offSale/auth") //@ManagerAuth public R matOffSale(@RequestBody OffSaleParam offSaleParam){ public R matOffSale(@RequestBody OffSaleParam offSaleParam) { mobileService.offSale(offSaleParam); return R.ok("下架成功"); } @RequestMapping("/search/sign/auth/v2") @ManagerAuth(memo = "拆叠盘模式切换") public R orderSearchByBarcodeV2(@RequestParam boolean sign){ RgvOneSign rgvOneSign = rgvOneSignService.selectOne(new EntityWrapper<RgvOneSign>().eq("rgv_one_type","oneSign")); if (sign){ rgvOneSign.setRgvOneSign(1-rgvOneSign.getRgvOneSign()); public R orderSearchByBarcodeV2(@RequestParam boolean sign) { RgvOneSign rgvOneSign = rgvOneSignService.selectOne(new EntityWrapper<RgvOneSign>().eq("rgv_one_type", "oneSign")); if (sign) { rgvOneSign.setRgvOneSign(1 - rgvOneSign.getRgvOneSign()); rgvOneSignService.updateById(rgvOneSign); } return R.ok(rgvOneSign.getRgvOneSign()); } // 组托 ---------------------------------------------------------------------------------------------------- @@ -121,18 +132,18 @@ // } @RequestMapping("/order/search/orderNo/auth") @ManagerAuth public R orderSearchByBarcode(@RequestParam String orderNo){ if (Cools.isEmpty(orderNo)){ orderNo=null; public R orderSearchByBarcode(@RequestParam String orderNo) { if (Cools.isEmpty(orderNo)) { orderNo = null; } List<Order> orders = orderService.selectorderNoL(orderNo); if (Cools.isEmpty(orders)){ if (Cools.isEmpty(orders)) { return R.ok(); } LinkedList<CombParam> combParams = new LinkedList<>(); if (!Cools.isEmpty(orders)){ for (Order order:orders){ CombParam combParam=new CombParam(); if (!Cools.isEmpty(orders)) { for (Order order : orders) { CombParam combParam = new CombParam(); if (order == null) { continue; } @@ -146,11 +157,11 @@ List<OrderDetl> orderDetls = orderService.selectWorkingDetls(order.getId()); if (!Cools.isEmpty(orderDetls)) { LinkedList<CombParam.CombMat> combMats = new LinkedList<>(); for (OrderDetl orderDetl:orderDetls){ for (OrderDetl orderDetl : orderDetls) { CombParam.CombMat combMat = new CombParam.CombMat(); combMat.setMatnr(orderDetl.getMatnr()); combMat.setBatch(orderDetl.getBatch()); combMat.setAnfme(orderDetl.getAnfme()-orderDetl.getWorkQty()); combMat.setAnfme(orderDetl.getAnfme() - orderDetl.getWorkQty()); combMat.setMaktx(orderDetl.getMaktx()); combMat.setSpecs(orderDetl.getSpecs()); combMats.add(combMat); @@ -166,18 +177,18 @@ @RequestMapping("/order/search/orderNo/auth/v2") @ManagerAuth(memo = "退库单获取") public R orderSearchByBarcodeV2(@RequestParam String orderNo){ if (Cools.isEmpty(orderNo)){ orderNo=null; public R orderSearchByBarcodeV2(@RequestParam String orderNo) { if (Cools.isEmpty(orderNo)) { orderNo = null; } List<Order> orders = orderService.selectorderNoL(orderNo); if (Cools.isEmpty(orders)){ if (Cools.isEmpty(orders)) { return R.ok(); } LinkedList<CombParam> combParams = new LinkedList<>(); if (!Cools.isEmpty(orders)){ for (Order order:orders){ CombParam combParam=new CombParam(); if (!Cools.isEmpty(orders)) { for (Order order : orders) { CombParam combParam = new CombParam(); if (order == null) { continue; } @@ -191,20 +202,20 @@ List<OrderDetl> orderDetls = orderService.selectWorkingDetls(order.getId()); if (!Cools.isEmpty(orderDetls)) { LinkedList<CombParam.CombMat> combMats = new LinkedList<>(); for (OrderDetl orderDetl:orderDetls){ if (orderDetl.getWorkQty()!=0){ for (OrderDetl orderDetl : orderDetls) { if (orderDetl.getWorkQty() != 0) { continue; } CombParam.CombMat combMat = new CombParam.CombMat(); combMat.setMatnr(orderDetl.getMatnr()); combMat.setBatch(orderDetl.getBatch()); combMat.setAnfme(orderDetl.getAnfme()-orderDetl.getWorkQty()); combMat.setAnfme(orderDetl.getAnfme() - orderDetl.getWorkQty()); combMat.setMaktx(orderDetl.getMaktx()); combMat.setSpecs(orderDetl.getSpecs()); combMat.setWeight(orderDetl.getWeight()); combMats.add(combMat); } if (combMats.size()==0){ if (combMats.size() == 0) { continue; } combParam.setCombMats(combMats); @@ -218,15 +229,15 @@ @RequestMapping("/wrkDetl/search/batch/auth") @ManagerAuth(memo = "出库确认获取信息") public R wrkDetlSearchByBatch(@RequestBody String batch){ if (Cools.isEmpty(batch)){ public R wrkDetlSearchByBatch(@RequestBody String batch) { if (Cools.isEmpty(batch)) { return R.error("参数为空"); } // List<Order> orders = orderService.selectorderNoL(batch); WrkDetl wrkDetl = wrkDetlService.selectOne(new EntityWrapper<WrkDetl>().eq("batch", batch)); if (Cools.isEmpty(wrkDetl)){ if (Cools.isEmpty(wrkDetl)) { WrkDetlLog wrkDetlLog = wrkDetlLogService.selectOne(new EntityWrapper<WrkDetlLog>().eq("batch", batch)); if (Cools.isEmpty(wrkDetlLog)){ if (Cools.isEmpty(wrkDetlLog)) { return R.error("未查到数据"); } wrkDetl = new WrkDetl(); @@ -235,7 +246,7 @@ wrkDetl.setBarcode(wrkDetlLog.getBarcode()); wrkDetl.setDeadTime(wrkDetlLog.getDeadTime()); } if (Cools.isEmpty(wrkDetl)){ if (Cools.isEmpty(wrkDetl)) { return R.error("未查到数据"); } return R.ok().add(wrkDetl); @@ -243,8 +254,8 @@ @RequestMapping("/order/search/batch/auth") @ManagerAuth(memo = "出库确认") public R orderSearchByBatch(@RequestBody String batch){ if (Cools.isEmpty(batch)){ public R orderSearchByBatch(@RequestBody String batch) { if (Cools.isEmpty(batch)) { return R.error("参数为空"); } String orderNo = ""; @@ -254,16 +265,16 @@ if (Cools.isEmpty(wrkDetlLog)) { return R.error("未查到数据"); } orderNo=wrkDetlLog.getOrderNo(); }else { orderNo=wrkDetl.getOrderNo(); orderNo = wrkDetlLog.getOrderNo(); } else { orderNo = wrkDetl.getOrderNo(); } // List<Order> orders = orderService.selectorderNoL(batch); OrderDetl orderDetl = orderDetlService.selectOne(new EntityWrapper<OrderDetl>().eq("batch", batch).eq("order_no",orderNo)); if (Cools.isEmpty(orderDetl)){ OrderDetl orderDetl = orderDetlService.selectOne(new EntityWrapper<OrderDetl>().eq("batch", batch).eq("order_no", orderNo)); if (Cools.isEmpty(orderDetl)) { return R.error("未查到数据"); } if (!orderDetl.getQty$().equals("已完成")){ if (!orderDetl.getQty$().equals("已完成")) { return R.error("任务未完成"); } orderDetl.setSource(1); @@ -280,14 +291,14 @@ @RequestMapping("/truss/order/auth") @ManagerAuth(memo = "退库,1楼桁架退库,退库单退库") public R trussCombOrder(@RequestBody TrussCombParam combParam){ public R trussCombOrder(@RequestBody TrussCombParam combParam) { mobileService.trussCombOrder(combParam, getUserId()); return R.ok("组托成功"); } @RequestMapping("/truss/comd/auth") // @ManagerAuth(memo = "手动入库,2楼无需桁架手动入库 wms入库") public R PalletizingCompleteTwoFloorParam(@RequestBody PalletizingCompleteTwoFloorParam combParam){ public R PalletizingCompleteTwoFloorParam(@RequestBody PalletizingCompleteTwoFloorParam combParam) { mobileService.PalletizingCompleteTwoFloorParam(combParam); return R.ok("组托成功"); } @@ -315,14 +326,14 @@ @RequestMapping("/comb/auth") @ManagerAuth(memo = "组托") public R comb(@RequestBody CombParam combParam){ public R comb(@RequestBody CombParam combParam) { mobileService.comb(combParam, getUserId()); return R.ok("组托成功"); } @RequestMapping("/pack/get/auth") @ManagerAuth public R packGet(@RequestParam String barcode){ public R packGet(@RequestParam String barcode) { Pack pack = packService.selectByBarcode(barcode); if (pack == null) { return R.ok(); @@ -335,7 +346,7 @@ @RequestMapping("/pack/comb/auth") @ManagerAuth(memo = "下线组托") public R packComb(@RequestBody CombParam combParam){ public R packComb(@RequestBody CombParam combParam) { mobileService.packComb(combParam, getUserId()); return R.ok("组托成功"); } @@ -348,7 +359,7 @@ @Deprecated public R pakoutQuery(@RequestParam(required = false) String barcode, @RequestParam(required = false) Integer staNo, @RequestParam(required = false) String matnr){ @RequestParam(required = false) String matnr) { if (Cools.isEmpty(barcode) && Cools.isEmpty(matnr)) { return R.ok(); } @@ -372,7 +383,7 @@ */ @RequestMapping("/pakout/confirm/barcode/auth") @ManagerAuth public R pakoutQueryByBarcode(@RequestParam(required = false) String barcode){ public R pakoutQueryByBarcode(@RequestParam(required = false) String barcode) { if (Cools.isEmpty(barcode)) { return R.ok(); } @@ -389,7 +400,7 @@ // 根据库位码和商品码搜索商品 @RequestMapping("/mat/find/auth") public R find(@RequestParam(required = false) String locNo , @RequestParam(required = false) String matnr){ , @RequestParam(required = false) String matnr) { //List<ManLocDetl> manLocDetls = manLocDetlMapper.selectItem0(locNo, matnr); ManLocDetl manLocDetl = manLocDetlMapper.selectLocNo0(locNo, matnr); return R.ok(manLocDetl); @@ -402,7 +413,7 @@ @RequestMapping("/pakout/confirm/pick/auth") @ManagerAuth public R pakoutQueryByBarcode(@RequestParam(required = false) Integer wrkNo , @RequestParam(required = false) String matnr){ , @RequestParam(required = false) String matnr) { if (Cools.isEmpty(wrkNo)) { return R.ok(); } @@ -537,7 +548,7 @@ @RequestMapping("/adjust/auth") @ManagerAuth(memo = "盘点") public R adjust(@RequestBody MobileAdjustParam combParam){ public R adjust(@RequestBody MobileAdjustParam combParam) { mobileService.adjust(combParam, getUserId()); return R.ok("盘点成功"); } @@ -545,10 +556,10 @@ @PostMapping("/order/out/pakout/auth") @ManagerAuth(memo = "订单出库") public synchronized R pakoutByOrder(@RequestBody JSONObject param) { if(!param.containsKey("staNo") || !param.containsKey("orderNo")){ if (!param.containsKey("staNo") || !param.containsKey("orderNo")) { return R.parse(BaseRes.PARAM); } mobileService.pakoutByOrder(param,getUserId()); mobileService.pakoutByOrder(param, getUserId()); return R.ok("出库成功"); } @@ -556,7 +567,7 @@ @ManagerAuth(memo = "出库复核确认") public synchronized R pakoutFhqr(@RequestBody PdckqrParam param) { // 根据工作号确认复核 if(Cools.isEmpty(param) || Cools.isEmpty(param.getBarcode()) || Cools.isEmpty(param.getMaterials())){ if (Cools.isEmpty(param) || Cools.isEmpty(param.getBarcode()) || Cools.isEmpty(param.getMaterials())) { return R.parse(BaseRes.PARAM); } return mobileService.pakoutFhqr(param); @@ -566,7 +577,7 @@ @ManagerAuth(memo = "盘点出库确认") public synchronized R pdckqr(@RequestBody PdckqrParam param) { // 根据工作号确认复核 if(Cools.isEmpty(param) || Cools.isEmpty(param.getBarcode()) || Cools.isEmpty(param.getMaterials())){ if (Cools.isEmpty(param) || Cools.isEmpty(param.getBarcode()) || Cools.isEmpty(param.getMaterials())) { return R.parse(BaseRes.PARAM); } return mobileService.pdckqr(param); @@ -583,7 +594,7 @@ public synchronized R pdaWarehousingNow(@RequestBody PdaWarehousingNowParam param) { // 根据工作号确认复核 if(Cools.isEmpty(param) || Cools.isEmpty(param.getBarcode()) || Cools.isEmpty(param.getSourceStaNo())){ if (Cools.isEmpty(param) || Cools.isEmpty(param.getBarcode()) || Cools.isEmpty(param.getSourceStaNo())) { return R.parse(BaseRes.PARAM); } return mobileService.pdaWarehousingNow(param, getUserId()); @@ -607,7 +618,7 @@ @PostMapping("/pdaGetMemo") // @ManagerAuth(memo = "pda获取木箱资料") public synchronized List<Map<String, Object>> pdaGetMemo() { public synchronized List<Map<String, Object>> pdaGetMemo() { return mobileService.pdaGetMemo(); } @@ -638,4 +649,53 @@ } @GetMapping("/getReviewList/{orderNo}") public synchronized R getReviewList(@PathVariable("orderNo") String orderNo) { List<Review> reviewList = reviewService.selectList(new EntityWrapper<Review>().like("order_no", orderNo)); List<String> collect = reviewList.stream().map(Review::getOrderNo).collect(Collectors.toList()); return R.ok(collect); } @GetMapping("/getReviewDetlByOrderNo/{orderNo}") public synchronized R getReviewDetlByOrderNo(@PathVariable("orderNo") String orderNo) { List<ReviewDetl> reviewList = reviewDetlService.selectList(new EntityWrapper<ReviewDetl>().eq("order_no", orderNo).ne("inspect", 1)); return R.ok(reviewList); } @PostMapping("/reviewCheck") @ManagerAuth(memo = "单据复核") public synchronized R reviewCheck(@RequestBody List<ReviewDetl> param) { System.out.println(JSONObject.toJSONString(param)); if (Cools.isEmpty(param)) { return R.parse("参数有误,请检查参数"); } for (ReviewDetl reviewDetl : param) { if (!Cools.isEmpty(reviewDetl.getInspect()) && reviewDetl.getInspect() == 1) { ReviewDetl reviewDetl1 = reviewDetlService.selectById(reviewDetl.getId()); reviewDetl1.setInspect(reviewDetl.getInspect()); reviewDetl1.setMemo(reviewDetl.getMemo()); reviewDetl1.setThreeCode(reviewDetl.getThreeCode()); reviewDetl1.setUpdateTime(new Date()); reviewDetlService.updateById(reviewDetl1); Review review = reviewService.selectById(reviewDetl1.getOrderId()); review.setSettle(2L); reviewService.updateById(review); } } return R.ok(); } @GetMapping("/getCheckUser") public R getCheckUser() { Set set = new HashSet<String>(); List<User> userList = userService.selectList(new EntityWrapper<User>().eq("status", 1).eq("role_id", 18L)); for (User user : userList) { set.add(user.getUsername()); } return R.ok(set); } } src/main/java/com/zy/asrs/controller/ReviewController.java
@@ -19,6 +19,7 @@ import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -41,6 +42,9 @@ @Autowired private SnowflakeIdWorker snowflakeIdWorker; @Autowired private PlatformTransactionManager transactionManager; @Resource private ReviewDetlMapper reviewDetlMapper; @@ -61,7 +65,7 @@ public void importOrder(MultipartFile multipartFile) throws IOException { // 考核数据的判重使用order_id,check_type的组合唯一索引解决 EasyExcel.read(multipartFile.getInputStream(), ImportReviewDto.class, new ImportReviewListener(snowflakeIdWorker, getUserId())).sheet().doReadSync(); new ImportReviewListener(transactionManager,reviewService, reviewDetlService, snowflakeIdWorker, getUserId())).sheet().doReadSync(); } src/main/java/com/zy/asrs/entity/ReviewDetl.java
@@ -8,7 +8,6 @@ import com.core.common.Cools; import com.core.common.SpringUtils; import com.zy.asrs.service.BasBoxTypeService; import com.zy.asrs.service.OrderService; import com.zy.common.utils.Synchro; import com.zy.system.entity.User; import com.zy.system.service.UserService; @@ -29,21 +28,21 @@ /** * ID */ @ApiModelProperty(value= "ID") @ApiModelProperty(value = "ID") @TableId(value = "id", type = IdType.AUTO) private Long id; /** * 订单内码 */ @ApiModelProperty(value= "订单内码") @ApiModelProperty(value = "订单内码") @TableField("order_id") private Long orderId; /** * 单据编号 */ @ApiModelProperty(value= "单据编号") @ApiModelProperty(value = "单据编号") @TableField("order_no") private String orderNo; @@ -51,250 +50,250 @@ /** * 数量 */ @ApiModelProperty(value= "数量") @ApiModelProperty(value = "数量") private Double anfme; /** * 作业数量 * * 入库 : 组托完成,组托档、工作档、入库完成数量 * 出库 : 工作档、出库完成数量 * <p> * 入库 : 组托完成,组托档、工作档、入库完成数量 * 出库 : 工作档、出库完成数量 */ @ApiModelProperty(value= "作业数量") @ApiModelProperty(value = "作业数量") @TableField("work_qty") private Double workQty; /** * 完成数量 * * 入库 : qty 👆 * 出库 : qty 👆 * <p> * 入库 : qty 👆 * 出库 : qty 👆 */ @ApiModelProperty(value= "完成数量") @ApiModelProperty(value = "完成数量") private Double qty; /** * 商品编码 */ @ApiModelProperty(value= "商品编码") @ApiModelProperty(value = "商品编码") private String matnr; /** * 商品名称 */ @ApiModelProperty(value= "商品名称") @ApiModelProperty(value = "商品名称") private String maktx; /** * 批号 */ @ApiModelProperty(value= "批号") @ApiModelProperty(value = "批号") private String batch; /** * 规格 */ @ApiModelProperty(value= "规格") @ApiModelProperty(value = "规格") private String specs; /** * 型号 */ @ApiModelProperty(value= "型号") @ApiModelProperty(value = "型号") private String model; /** * 颜色 */ @ApiModelProperty(value= "颜色") @ApiModelProperty(value = "颜色") private String color; /** * 品牌 */ @ApiModelProperty(value= "品牌") @ApiModelProperty(value = "品牌") private String brand; /** * 单位 */ @ApiModelProperty(value= "单位") @ApiModelProperty(value = "单位") private String unit; /** * 单价 */ @ApiModelProperty(value= "单价") @ApiModelProperty(value = "单价") private Double price; /** * sku */ @ApiModelProperty(value= "sku") @ApiModelProperty(value = "sku") private String sku; /** * 单位量 */ @ApiModelProperty(value= "单位量") @ApiModelProperty(value = "单位量") private Double units; /** * 条码 */ @ApiModelProperty(value= "条码") @ApiModelProperty(value = "条码") private String barcode; /** * 产地 */ @ApiModelProperty(value= "产地") @ApiModelProperty(value = "产地") private String origin; /** * 厂家 、、江铜:暂存库位号 */ @ApiModelProperty(value= "厂家") @ApiModelProperty(value = "厂家") private String manu; /** * 生产日期 */ @ApiModelProperty(value= "生产日期") @ApiModelProperty(value = "生产日期") @TableField("manu_date") private String manuDate; /** * 品项数 */ @ApiModelProperty(value= "品项数") @ApiModelProperty(value = "品项数") @TableField("item_num") private String itemNum; /** * 安全库存量 */ @ApiModelProperty(value= "安全库存量") @ApiModelProperty(value = "安全库存量") @TableField("safe_qty") private Double safeQty; /** * 重量 */ @ApiModelProperty(value= "重量") @ApiModelProperty(value = "重量") private Double weight; /** * 长度 */ @ApiModelProperty(value= "长度") @ApiModelProperty(value = "长度") private Double length; /** * 体积 */ @ApiModelProperty(value= "体积") @ApiModelProperty(value = "体积") private Double volume; /** * 三方编码 */ @ApiModelProperty(value= "三方编码") @ApiModelProperty(value = "三方编码") @TableField("three_code") private String threeCode; /** * 供应商 */ @ApiModelProperty(value= "供应商") @ApiModelProperty(value = "供应商") private String supp; /** * 供应商编码 */ @ApiModelProperty(value= "供应商编码") @ApiModelProperty(value = "供应商编码") @TableField("supp_code") private String suppCode; /** * 是否批次 1: 是 0: 否 */ @ApiModelProperty(value= "是否批次 1: 是 0: 否 ") @ApiModelProperty(value = "是否批次 1: 是 0: 否 ") @TableField("be_batch") private Integer beBatch; /** * 保质期 */ @ApiModelProperty(value= "保质期") @ApiModelProperty(value = "保质期") @TableField("dead_time") private String deadTime; /** * 预警天数 */ @ApiModelProperty(value= "预警天数") @ApiModelProperty(value = "预警天数") @TableField("dead_warn") private Integer deadWarn; /** * 制购 1: 制造 2: 采购 3: 外协 、、江铜:是否确认 1: 确认 2: 未确认 */ @ApiModelProperty(value= "制购 1: 制造 2: 采购 3: 外协 ") @ApiModelProperty(value = "制购 1: 制造 2: 采购 3: 外协 ") private Integer source; /** * 要求检验 1: 是 0: 否 */ @ApiModelProperty(value= "要求检验 1: 是 0: 否 ") @ApiModelProperty(value = "要求检验 1: 是 0: 否 ") private Integer inspect; /** * 危险品 1: 是 0: 否 */ @ApiModelProperty(value= "危险品 1: 是 0: 否 ") @ApiModelProperty(value = "危险品 1: 是 0: 否 ") private Integer danger; /** * 状态 1: 正常 0: 禁用 */ @ApiModelProperty(value= "状态 1: 正常 0: 禁用 ") @ApiModelProperty(value = "状态 1: 正常 0: 禁用 ") private Integer status; /** * 添加人员 */ @ApiModelProperty(value= "添加人员") @ApiModelProperty(value = "添加人员") @TableField("create_by") private Long createBy; /** * 添加时间 */ @ApiModelProperty(value= "添加时间") @ApiModelProperty(value = "添加时间") @TableField("create_time") @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date createTime; /** * 修改人员 */ @ApiModelProperty(value= "修改人员") @ApiModelProperty(value = "修改人员") @TableField("update_by") private Long updateBy; /** * 修改时间 */ @ApiModelProperty(value= "修改时间") @ApiModelProperty(value = "修改时间") @TableField("update_time") @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date updateTime; /** * 备注 */ @ApiModelProperty(value= "备注") @ApiModelProperty(value = "备注") private String memo; @ApiModelProperty(value = "退库标记") @@ -304,14 +303,16 @@ /** * 卷信息ID */ @ApiModelProperty(value= "卷信息ID") @ApiModelProperty(value = "卷信息ID") @TableField("roll_up") private Long rollUp; public String getStatus$(){ if (null == this.status){ return null; } switch (this.status){ public String getStatus$() { if (null == this.status) { return null; } switch (this.status) { case 1: return "正常"; case 0: @@ -321,43 +322,54 @@ } } public String getCreateBy$(){ public String getCreateBy$() { UserService service = SpringUtils.getBean(UserService.class); User user = service.selectById(this.createBy); if (!Cools.isEmpty(user)){ if (!Cools.isEmpty(user)) { return String.valueOf(user.getUsername()); } return null; } public String getCreateTime$(){ if (Cools.isEmpty(this.createTime)){ public String getCreateTime$() { if (Cools.isEmpty(this.createTime)) { return ""; } return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime); } public String getUpdateBy$(){ public String getUpdateBy$() { UserService service = SpringUtils.getBean(UserService.class); User user = service.selectById(this.updateBy); if (!Cools.isEmpty(user)){ if (!Cools.isEmpty(user)) { return String.valueOf(user.getUsername()); } return null; } public String getUpdateTime$(){ if (Cools.isEmpty(this.updateTime)){ public String getUpdateTime$() { if (Cools.isEmpty(this.updateTime)) { return ""; } return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime); } public String getQty$(){ if (getAnfme().equals(getQty())){ public String getQty$() { if (getAnfme().equals(getQty())) { return "已完成"; } return "未完成"; } public String getInspect$() { if (Cools.isEmpty(this.inspect)) { return "未复核"; } if (this.inspect == 1) { return "已复核"; } else { return "未复核"; } } public Double getEnableQty() { @@ -374,10 +386,10 @@ Synchro.Copy(source, this); } public String getBrand$(){ public String getBrand$() { BasBoxTypeService basBoxTypeService = SpringUtils.getBean(BasBoxTypeService.class); BasBoxType basBoxType = basBoxTypeService.selectOne(new EntityWrapper<BasBoxType>().eq("box_type", this.brand)); if (!Cools.isEmpty(basBoxType)){ if (!Cools.isEmpty(basBoxType)) { return String.valueOf(basBoxType.getBoxSpecs()); } return this.brand; src/main/java/com/zy/asrs/importexcle/ImportReviewDto.java
@@ -11,18 +11,37 @@ @Data public class ImportReviewDto { @ExcelProperty(value = "包装组号/源库位",index = 0) private Long orderId; @ExcelProperty(value = "单据编号", index = 0) private String column1; @ExcelProperty(value = "出库单号/单据类型/客户名称/备注/目标库位",index = 1) @ExcelProperty(value = "物料编号", index = 1) private String column2; @ExcelProperty(value = "目标巷道/客户名称",index = 2) @ExcelProperty(value = "物料名称", index = 2) private String column3; @ExcelProperty(value = "备注",index = 3) @ExcelProperty(value = "规格", index = 3) private String column4; @ExcelProperty(value = "单位", index = 4) private String column5; @ExcelProperty(value = "品级", index = 5) private String column6; @ExcelProperty(value = "批次号", index = 6) private String column7; @ExcelProperty(value = "卷号", index = 7) private String column8; @ExcelProperty(value = "出库数量", index = 8) private Double column9; @ExcelProperty(value = "出库日期", index = 9) private String column10; } src/main/java/com/zy/asrs/importexcle/ImportReviewListener.java
@@ -3,13 +3,19 @@ import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.core.common.Cools; import com.core.common.DateUtils; import com.core.common.SnowflakeIdWorker; import com.zy.asrs.entity.OrderDetl; import com.core.exception.CoolException; import com.zy.asrs.entity.Review; import com.zy.asrs.entity.ReviewDetl; import com.zy.asrs.service.ReviewDetlService; import com.zy.asrs.service.ReviewService; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.TransactionStatus; import java.util.*; @@ -23,29 +29,32 @@ /** * 每隔1000条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收 */ private static final int BATCH_COUNT = 400; private static final int BATCH_COUNT = 2000; private int count = 0; private String orderNo; private long orderId; private long docTypeId; List<ImportReviewDto> list = new ArrayList<>(); /** * 假设这个是一个DAO,当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没用。 */ private final PlatformTransactionManager transactionManager; private ReviewService reviewService; private ReviewDetlService reviewDetlService; private final SnowflakeIdWorker snowflakeIdWorker; private final Long userId; private TransactionStatus transactionStatus; /** * 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来 */ public ImportReviewListener(SnowflakeIdWorker snowflakeIdWorker, Long userId) { public ImportReviewListener(PlatformTransactionManager transactionManager, ReviewService reviewService, ReviewDetlService reviewDetlService, SnowflakeIdWorker snowflakeIdWorker, Long userId) { this.transactionManager = transactionManager; this.reviewService = reviewService; this.reviewDetlService = reviewDetlService; this.snowflakeIdWorker = snowflakeIdWorker; this.userId = userId; } @@ -57,28 +66,42 @@ public void invoke(ImportReviewDto data, AnalysisContext context) { log.info("解析到第 {} 条数据:{}", ++count, JSON.toJSONString(data)); // 获取包装组号(column1) String packNo = data.getColumn1(); if (Cools.isEmpty(packNo)) { log.warn("包装组号为空,跳过该行!"); if (Cools.isEmpty(data.getColumn2())) { log.warn("规格型号,跳过该行!"); return; } // 如果已经处理过该包装组号,则跳过 if (uniquePackNos.contains(packNo)) { log.info("重复的包装组号:{},跳过", packNo); if (Cools.isEmpty(data.getColumn4())) { log.info("重复的包装组号:{},跳过", data.getColumn5()); return; } if (Cools.isEmpty(data.getColumn7())) { log.info("重复的包装组号:{},跳过", data.getColumn7()); return; } // 首次出现,记录并处理 uniquePackNos.add(packNo); list.add(data); uniquePackNos.add(data.getColumn1()); if (context.getCurrentRowNum() == 3) { String time = DateUtils.convert(new Date(), DateUtils.yyyyMMddHHmmss_F); Review review = reviewService.selectOne(new EntityWrapper<Review>().eq("order_no", data.getColumn1())); if (review == null) { review = new Review(); review.setUuid(String.valueOf(snowflakeIdWorker.nextId())); review.setOrderNo(data.getColumn1()); review.setOrderTime(time); review.setSettle(1L); review.setStatus(1); review.setCreateBy(userId); review.setCreateTime(new Date()); return; reviewService.insert(review); review = reviewService.selectOne(new EntityWrapper<Review>().eq("order_no", data.getColumn1())); }else { log.info("已存在该订单:{},", data.getColumn1()); throw new CoolException("订单已存在!"); } data.setOrderId(review.getId()); list.add(data); if (list.size() >= BATCH_COUNT) { saveData(); list.clear(); @@ -106,47 +129,37 @@ */ private void saveData() { log.info("{}条数据,开始存储数据库!", list.size()); log.info("单据号:{},数据:{},", orderNo, JSON.toJSONString(list)); log.info("数据:{},", JSON.toJSONString(list)); List<OrderDetl> orderDetlList = new ArrayList<>(); List<ReviewDetl> orderDetlList = new ArrayList<>(); for (ImportReviewDto importOrderDto : list) { OrderDetl orderDetl = new OrderDetl(); ReviewDetl orderDetl = new ReviewDetl(); if (docTypeId == 24) { orderDetl.setSpecs(String.format("%07d", Integer.parseInt(importOrderDto.getColumn1()))); // 源库位 if (importOrderDto.getColumn2() != null) { orderDetl.setModel(String.format("%07d", Integer.parseInt(importOrderDto.getColumn2()))); // 目标库位 } if (importOrderDto.getColumn3() != null) { orderDetl.setBeBatch(Integer.parseInt(importOrderDto.getColumn3())); // 巷道 } } else { orderDetl.setBrand(importOrderDto.getColumn1()); orderDetl.setSupp(importOrderDto.getColumn3()); orderDetl.setMemo(importOrderDto.getColumn4()); } orderDetl.setOrderNo(importOrderDto.getColumn1()); orderDetl.setMatnr(importOrderDto.getColumn2()); orderDetl.setMaktx(importOrderDto.getColumn3()); orderDetl.setSpecs(importOrderDto.getColumn4()); orderDetl.setUnit(importOrderDto.getColumn5()); //orderDetl.set(importOrderDto.getColumn6()); orderDetl.setBatch(importOrderDto.getColumn7()); orderDetl.setModel(importOrderDto.getColumn8()); orderDetl.setAnfme(importOrderDto.getColumn9()); orderDetl.setDeadTime(importOrderDto.getColumn10()); orderDetl.setBatch(""); orderDetl.setOrderId(orderId); orderDetl.setOrderNo(orderNo); orderDetl.setOrderId(importOrderDto.getOrderId()); orderDetl.setCreateBy(9527L); orderDetl.setCreateTime(new Date()); orderDetl.setUpdateBy(9527L); orderDetl.setUpdateTime(new Date()); orderDetl.setStatus(1); orderDetl.setQty(0.0D); orderDetl.setAnfme(1.0); orderDetlList.add(orderDetl); } // ✅ 关键点:分批提交 for (int i = 0; i < orderDetlList.size(); i += MAX_BATCH_SIZE) { int end = Math.min(i + MAX_BATCH_SIZE, orderDetlList.size()); List<OrderDetl> batch = orderDetlList.subList(i, end); //reviewDetlService.batchDetls(batch); for (ReviewDetl d : orderDetlList) { reviewDetlService.insert(d); } log.info("存储数据库成功!"); } src/main/webapp/static/js/review/review.js
@@ -32,7 +32,7 @@ {type: 'numbers'}, {field: 'orderNo', title: '单据编号'}, {field: 'cstmrName', align: 'center',title: '客户名称'}, {align: 'center', title: '明细', toolbar: '#tbLook', minWidth: 160, width: 160}, {align: 'center', title: '明细', toolbar: '#tbLook', minWidth: 250, width: 250}, {field: 'createTime$', title: '创建时间', minWidth: 200, width: 200}, {field: 'settle$', align: 'center', title: '状态', templet: '#settleTpl', minWidth: 160, width: 160}, //{field: 'memo', align: 'center',title: '备注'}, @@ -207,7 +207,7 @@ layer.open({ type: 1, title: false, area: '1020px', area: '1220px', offset: [top + 'px', (left - 530 + $a.outerWidth()) + 'px'], shade: .01, shadeClose: true, @@ -229,10 +229,11 @@ {field: 'maktx', title: '产品名称'}, {field: 'specs', title: '规格型号'}, {field: 'batch', title: '批次号'}, {field: 'color', title: '卷号'}, {field: 'qty', title: '出库数量'}, {field: 'model', title: '卷号'}, {field: 'anfme', title: '出库数量'}, {field: 'deadTime', title: '出库日期'}, {field: 'source', title: '复核状态'}, {field: 'inspect$', title: '复核状态'}, {field: 'threeCode', title: '复核人'}, {field: 'memo', title: '复核备注'} ]], request: { src/main/webapp/views/review/review.html
@@ -114,7 +114,7 @@ var formData = new FormData(); formData.append('file', file); fetch(baseUrl+'/importOrder', { fetch(baseUrl+'/importReview', { method: 'POST', headers: {'token': localStorage.getItem('token')}, body: formData @@ -162,7 +162,8 @@ <!-- <a class="layui-btn layui-btn-primary layui-border-blue layui-btn-xs btn-complete" lay-event="labelUp">上传标签</a>--> {{# } }} {{# if (d.settle == 2) { }} <!-- <a class="layui-btn layui-btn-primary layui-border-blue layui-btn-xs btn-complete" lay-event="labelUp">上传标签</a>--> <a class="layui-btn layui-btn-danger layui-btn-xs btn-edit" lay-event="del">删除</a> <!-- <a class="layui-btn layui-btn-primary layui-border-blue layui-btn-xs btn-complete" lay-event="labelUp">上传标签</a>--> <a class="layui-btn layui-btn-primary layui-border-blue layui-btn-xs btn-edit" lay-event="complete">完结</a> {{# } }} {{# if (d.settle == 4 && d.tkType=='1') { }}