From db5e17703db73be24750555a2881fdec5ef99df7 Mon Sep 17 00:00:00 2001 From: zhouhong <zh123412@126.com> Date: Wed, 14 Sep 2022 15:37:45 +0800 Subject: [PATCH] 入库完成任务改成批量提交 --- src/main/java/com/huaheng/pc/receipt/receiptDetail/service/ReceiptDetailServiceImpl.java | 4 ++-- src/main/java/com/huaheng/pc/task/taskHeader/domain/TaskReceiptCompleteDomain.java | 41 +++++++++++++++++++++++++++++++++++++++++ src/main/java/com/huaheng/pc/task/taskHeader/service/ReceiptTaskService.java | 187 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------------------------------------------- src/main/resources/templates/receipt/receiptHeader/receiptHeader.html | 2 +- 4 files changed, 166 insertions(+), 68 deletions(-) create mode 100644 src/main/java/com/huaheng/pc/task/taskHeader/domain/TaskReceiptCompleteDomain.java diff --git a/src/main/java/com/huaheng/pc/receipt/receiptDetail/service/ReceiptDetailServiceImpl.java b/src/main/java/com/huaheng/pc/receipt/receiptDetail/service/ReceiptDetailServiceImpl.java index 8dfbd24..d54f55c 100644 --- a/src/main/java/com/huaheng/pc/receipt/receiptDetail/service/ReceiptDetailServiceImpl.java +++ b/src/main/java/com/huaheng/pc/receipt/receiptDetail/service/ReceiptDetailServiceImpl.java @@ -558,7 +558,7 @@ public class ReceiptDetailServiceImpl extends ServiceImpl<ReceiptDetailMapper, R } } } - LambdaQueryWrapper<InventoryDetail> invlambdaDetails = Wrappers.lambdaQuery(); + /* LambdaQueryWrapper<InventoryDetail> invlambdaDetails = Wrappers.lambdaQuery(); invlambdaDetails.eq(InventoryDetail::getReceiptCode, receiptHeader.getCode()); List<InventoryDetail> invDetails = inventoryDetailService.list(invlambdaDetails); int totalqty=0; @@ -567,7 +567,7 @@ public class ReceiptDetailServiceImpl extends ServiceImpl<ReceiptDetailMapper, R } if(receiptHeader.getTotalQty().intValue()!=totalqty){ minStatus=minStatusOld; - } + }*/ //若更新状态值小于头状态,更新尾状态否则更新头尾状态 /* for (ReceiptDetail receiptDetail : receiptDetails) { if(receiptDetail.getTotalQty().subtract(receiptDetail.getOpenQty()).compareTo(BigDecimal.ZERO) == 0) { diff --git a/src/main/java/com/huaheng/pc/task/taskHeader/domain/TaskReceiptCompleteDomain.java b/src/main/java/com/huaheng/pc/task/taskHeader/domain/TaskReceiptCompleteDomain.java new file mode 100644 index 0000000..4e7c3f2 --- /dev/null +++ b/src/main/java/com/huaheng/pc/task/taskHeader/domain/TaskReceiptCompleteDomain.java @@ -0,0 +1,41 @@ +package com.huaheng.pc.task.taskHeader.domain; + +import com.baomidou.mybatisplus.annotation.*; +import com.huaheng.pc.barcode.barcodeDetail.domain.BarCodeDetail; +import com.huaheng.pc.inventory.inventoryDetail.domain.InventoryDetail; +import com.huaheng.pc.inventory.inventoryHeader.domain.InventoryHeader; +import com.huaheng.pc.inventory.inventoryTransaction.domain.InventoryTransaction; +import com.huaheng.pc.receipt.receiptContainerDetail.domain.ReceiptContainerDetail; +import com.huaheng.pc.receipt.receiptDetail.domain.ReceiptDetail; +import com.huaheng.pc.task.taskDetail.domain.TaskDetail; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.*; + +@Data +public class TaskReceiptCompleteDomain implements Serializable { + + private List<BarCodeDetail> barCodeDetailList=new ArrayList<>(); + + private InventoryHeader inventoryHeader; + + private List<InventoryTransaction> inventoryTransactionList=new ArrayList<>(); + + private List<InventoryDetail> inventoryDetailList=new ArrayList<>(); + + + private List<ReceiptContainerDetail> receiptContainerDetailList; + + private List<ReceiptDetail> receiptDetailList; + + private List<TaskDetail> taskDetailList=new ArrayList<>(); + + private Set<String> receiptDetailSet=new HashSet<>(); + + private BigDecimal totalQty; + +} diff --git a/src/main/java/com/huaheng/pc/task/taskHeader/service/ReceiptTaskService.java b/src/main/java/com/huaheng/pc/task/taskHeader/service/ReceiptTaskService.java index cb500e6..2c3a63d 100644 --- a/src/main/java/com/huaheng/pc/task/taskHeader/service/ReceiptTaskService.java +++ b/src/main/java/com/huaheng/pc/task/taskHeader/service/ReceiptTaskService.java @@ -57,6 +57,7 @@ import com.huaheng.pc.task.agvTask.service.AgvTaskService; import com.huaheng.pc.task.taskDetail.domain.TaskDetail; import com.huaheng.pc.task.taskDetail.service.TaskDetailService; import com.huaheng.pc.task.taskHeader.domain.TaskHeader; +import com.huaheng.pc.task.taskHeader.domain.TaskReceiptCompleteDomain; import com.huaheng.pc.task.taskHeader.mapper.TaskHeaderMapper; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -391,6 +392,7 @@ public class ReceiptTaskService { // } //} InventoryHeader inventoryHeader = null; + // 补充入库,修改库存明细库位 if(task.getTaskType().equals(QuantityConstant.TASK_TYPE_SUPPLEMENTRECEIPT)) { LambdaQueryWrapper<InventoryHeader> lambdaQueryWrapper = Wrappers.lambdaQuery(); lambdaQueryWrapper.eq(InventoryHeader::getWarehouseCode, warehouseCode) @@ -403,7 +405,7 @@ public class ReceiptTaskService { location.setContainerCode(""); location.setStatus(QuantityConstant.STATUS_LOCATION_EMPTY); locationService.updateById(location); - inventoryHeader.setLocationCode(task.getToLocation()); + /*inventoryHeader.setLocationCode(task.getToLocation()); inventoryHeaderService.updateById(inventoryHeader); LambdaQueryWrapper<InventoryDetail> lambdaQueryWrapper2 = Wrappers.lambdaQuery(); lambdaQueryWrapper2.eq(InventoryDetail::getWarehouseCode, warehouseCode) @@ -415,7 +417,16 @@ public class ReceiptTaskService { inventoryDetail.setZoneCode(location.getZoneCode()); inventoryDetailService.updateById(inventoryDetail); } - } + }*/ + + /*LambdaUpdateWrapper<InventoryDetail> wrapper = Wrappers.lambdaUpdate(); + wrapper.eq(InventoryDetail::getWarehouseCode, warehouseCode) + .eq(InventoryDetail::getInventoryHeaderId, inventoryHeader.getId()) + .set(InventoryDetail::getLocationCode, task.getToLocation()) + .set(InventoryDetail::getZoneCode, task.getZoneCode()); + inventoryDetailService.update(wrapper);*/ + + } } if (StringUtils.isNull(inventoryHeader)) { @@ -455,6 +466,12 @@ public class ReceiptTaskService { ReceiptDetail receiptDetail = null; BarCodeDetail barCodeDetail = null; /* 遍历任务明细,修改关联的入库组盘、入库单状态、添加库存*/ + TaskReceiptCompleteDomain taskReceiptCompleteDomain=new TaskReceiptCompleteDomain(); + taskReceiptCompleteDomain.setTotalQty(inventoryHeader.getTotalQty()); + taskReceiptCompleteDomain.setInventoryHeader(inventoryHeader); + List<BarCodeDetail> barCodeDetails=new ArrayList<>(); + List<TaskDetail> taskDetails=new ArrayList<>(); + List<ReceiptDetail> receiptDetails=new ArrayList<>(); for (TaskDetail taskDetail : taskDetailList) { if (taskDetail.getStatus() < QuantityConstant.TASK_STATUS_COMPLETED) { if(StringUtils.isNullNew(taskDetail.getWeights())){ @@ -474,28 +491,22 @@ public class ReceiptTaskService { if(taskDetail.getTypeId() == 1){ /*查询包装成品入库单明细*/ barCodeDetail = barCodeDetailService.getById(taskDetail.getBarcodeDetailsId()); - this.addInventoryDetails(taskDetail, barCodeDetail, inventoryHeader,task); + taskReceiptCompleteDomain=this.addInventoryDetails(taskDetail, barCodeDetail, inventoryHeader,task,taskReceiptCompleteDomain); + List<BarCodeDetail> barCodeDetailList=taskReceiptCompleteDomain.getBarCodeDetailList(); barCodeDetail.setProcessStamp(String.valueOf(QuantityConstant.RECEIPT_HEADER_POSTING)); - barCodeDetailService.updateById(barCodeDetail); + barCodeDetails.add(barCodeDetail); +// barCodeDetailService.updateById(barCodeDetail); }else{ if (StringUtils.isNotNull(receiptDetail)) { - this.addInventoryDetail(taskDetail, receiptDetail, inventoryHeader,task); - //修改组盘表状态为完成 - /* ReceiptContainerDetail receiptContainerDetail = new ReceiptContainerDetail(); - receiptContainerDetail.setStatus(QuantityConstant.RECEIPT_CONTAINER_FINISHED); - receiptContainerDetail.setLastUpdatedBy(receiptDetail.getCreatedBy()); - LambdaUpdateWrapper<ReceiptContainerDetail> receiptContainerDetailLambdaUpdateWrapper = Wrappers.lambdaUpdate(); - receiptContainerDetailLambdaUpdateWrapper.eq(ReceiptContainerDetail::getId, taskDetail.getAllocationId()); - if (!receiptContainerDetailService.update(receiptContainerDetail, receiptContainerDetailLambdaUpdateWrapper)){ - throw new ServiceException("更新组盘状态失败"); - }*/ + taskReceiptCompleteDomain=this.addInventoryDetail(taskDetail, receiptDetail, inventoryHeader,task,taskReceiptCompleteDomain); } else { throw new ServiceException("未找到id:" + taskDetail.getBillDetailId() + "入库单明细"); } } + //修改组盘表状态为完成 ReceiptContainerDetail receiptContainerDetail = new ReceiptContainerDetail(); receiptContainerDetail.setStatus(QuantityConstant.RECEIPT_CONTAINER_FINISHED); @@ -505,24 +516,36 @@ public class ReceiptTaskService { if (!receiptContainerDetailService.update(receiptContainerDetail, receiptContainerDetailLambdaUpdateWrapper)){ throw new ServiceException("更新组盘状态失败"); } - receiptDetail.setProcessStamp(String.valueOf(QuantityConstant.RECEIPT_HEADER_POSTING)); + if(receiptDetail.getUnitId2Qty()==null){ + receiptDetail.setUnitId2Qty(new BigDecimal(0)); + } + receiptDetail.setUnitId2Qty(receiptDetail.getUnitId2Qty().add(taskDetail.getQty())); + if(receiptDetail.getTotalQty().compareTo(receiptDetail.getUnitId2Qty())==0){ + receiptDetail.setProcessStamp(String.valueOf(QuantityConstant.RECEIPT_HEADER_POSTING)); + } receiptDetailService.updateById(receiptDetail); receiptDetailService.updateReceiptHeaderLastStatus(receiptDetail.getReceiptId()); - materialWarningService.materialWarning(taskDetail.getMaterialCode(), taskDetail.getCompanyCode()); - Location location = locationService.getLocationByCode(task.getToLocation(), ShiroUtils.getWarehouseCode()); - if(location != null) { - task.setZoneCode(location.getZoneCode()); - } +// materialWarningService.materialWarning(taskDetail.getMaterialCode(), taskDetail.getCompanyCode()); + taskDetail.setStatus(QuantityConstant.TASK_STATUS_COMPLETED); - taskDetailService.updateById(taskDetail); + taskDetails.add(taskDetail); +// taskDetailService.updateById(taskDetail); } } + Location location = locationService.getLocationByCode(task.getToLocation(), ShiroUtils.getWarehouseCode()); + if(location != null) { + task.setZoneCode(location.getZoneCode()); + } + taskReceiptCompleteDomain.setBarCodeDetailList(barCodeDetails); + taskReceiptCompleteDomain.setTaskDetailList(taskDetails); + //save批量提交数据 + saveOrUpdateTaskCompleteTable(taskReceiptCompleteDomain); if (StringUtils.isNull(inventoryHeader)) { throw new ServiceException("库存添加失败"); } //修改库位状态和对应的容器 - Location location = new Location(); +// Location location = new Location(); location.setContainerCode(task.getContainerCode()); location.setWarehouseCode(warehouseCode); location.setStatus(QuantityConstant.STATUS_LOCATION_EMPTY); @@ -531,10 +554,10 @@ public class ReceiptTaskService { location.setWeight(container1.getWeight()); location.setHeight(container1.getHeight()); } - LambdaUpdateWrapper<Location> locationLambdaUpdateWrapper = Wrappers.lambdaUpdate(); + /* LambdaUpdateWrapper<Location> locationLambdaUpdateWrapper = Wrappers.lambdaUpdate(); locationLambdaUpdateWrapper.eq(Location::getCode, task.getToLocation()); - locationLambdaUpdateWrapper.eq(Location::getWarehouseCode, warehouseCode); - if (!locationService.update(location, locationLambdaUpdateWrapper)){ + locationLambdaUpdateWrapper.eq(Location::getWarehouseCode, warehouseCode);*/ + if (!locationService.updateById(location)){ throw new ServiceException("更新库位失败"); } @@ -571,6 +594,39 @@ public class ReceiptTaskService { return AjaxResult.success(); } + public void saveOrUpdateTaskCompleteTable(TaskReceiptCompleteDomain taskReceiptCompleteDomain){ + List<BarCodeDetail> barCodeDetailList=taskReceiptCompleteDomain.getBarCodeDetailList(); + List<InventoryTransaction> inventoryTransactionList=taskReceiptCompleteDomain.getInventoryTransactionList(); + List<InventoryDetail> inventoryDetailList=taskReceiptCompleteDomain.getInventoryDetailList(); + List<ReceiptDetail> receiptDetailList=taskReceiptCompleteDomain.getReceiptDetailList(); + List<TaskDetail> taskDetails=taskReceiptCompleteDomain.getTaskDetailList(); +// Set<String> receiptDetailSet=taskReceiptCompleteDomain.getReceiptDetailSet(); + InventoryHeader inventoryHeader=taskReceiptCompleteDomain.getInventoryHeader(); + BigDecimal totalQty=taskReceiptCompleteDomain.getTotalQty(); + + if(inventoryDetailList!=null&&inventoryDetailList.size()>0){ + inventoryDetailService.saveOrUpdateBatch(inventoryDetailList); + } + inventoryHeader.setTotalQty(totalQty); + inventoryHeaderService.saveOrUpdate(inventoryHeader); + if(barCodeDetailList!=null&&barCodeDetailList.size()>0){ + barCodeDetailService.updateBatchById(barCodeDetailList); + } + if(inventoryTransactionList!=null&&inventoryTransactionList.size()>0){ + inventoryTransactionService.saveBatch(inventoryTransactionList); + } + /*if(receiptDetailList!=null&&receiptDetailList.size()>0){ + receiptDetailService.updateBatchById(receiptDetailList); + }*/ + if(taskDetails!=null&&taskDetails.size()>0){ + taskDetailService.updateBatchById(taskDetails); + } + + + + + } + @@ -582,9 +638,12 @@ public class ReceiptTaskService { * @param inventoryHeader 库存头表 * @return 任务数量 */ - private BigDecimal addInventoryDetail(TaskDetail taskDetail, + private TaskReceiptCompleteDomain addInventoryDetail(TaskDetail taskDetail, ReceiptDetail receiptDetail, - InventoryHeader inventoryHeader,TaskHeader task) { + InventoryHeader inventoryHeader,TaskHeader task,TaskReceiptCompleteDomain taskReceiptCompleteDomain) { + List<InventoryDetail> inventoryDetailList=taskReceiptCompleteDomain.getInventoryDetailList(); + List<InventoryTransaction> inventoryTransactionList=taskReceiptCompleteDomain.getInventoryTransactionList(); + String warehouseCode = inventoryHeader.getWarehouseCode(); /*该入库明细是否已存在库存明细记录,已存在更新数量、不存在新增记录*/ LambdaQueryWrapper<InventoryDetail> inventory = Wrappers.lambdaQuery(); @@ -665,11 +724,12 @@ public class ReceiptTaskService { inventoryDetail.setCountryCode(taskDetail.getCountryCode()); inventoryDetail.setBarcodeDetailsCode(taskDetail.getBarcodeDetailsCode()); } - if (!inventoryDetailService.saveOrUpdate(inventoryDetail)) { + inventoryDetailList.add(inventoryDetail); + /*if (!inventoryDetailService.saveOrUpdate(inventoryDetail)) { throw new ServiceException("保存库存明细失败"); - } - inventoryHeader.setTotalQty(inventoryHeader.getTotalQty().add(taskDetail.getQty())); - inventoryHeaderService.updateById(inventoryHeader); + }*/ + /* inventoryHeader.setTotalQty(inventoryHeader.getTotalQty().add(taskDetail.getQty())); + inventoryHeaderService.updateById(inventoryHeader);*/ //记录库存交易记录 InventoryTransaction inventoryTransaction = new InventoryTransaction(); inventoryTransaction.setTransactionType(QuantityConstant.INVENTORY_TRANSACTION_RECEIPT); @@ -687,10 +747,15 @@ public class ReceiptTaskService { inventoryTransaction.setLot(receiptDetail.getLot()); inventoryTransaction.setInventorySts(receiptDetail.getInventorySts()); inventoryTransaction.setTaskQty(receiptQty); - if (!inventoryTransactionService.save(inventoryTransaction)) { + /*if (!inventoryTransactionService.save(inventoryTransaction)) { throw new ServiceException("新增库存记录失败"); - } - return receiptQty; + }*/ + inventoryTransactionList.add(inventoryTransaction); + + taskReceiptCompleteDomain.setInventoryDetailList(inventoryDetailList); + taskReceiptCompleteDomain.setInventoryTransactionList(inventoryTransactionList); + taskReceiptCompleteDomain.setTotalQty(taskReceiptCompleteDomain.getTotalQty().add(taskDetail.getQty())); + return taskReceiptCompleteDomain; } @@ -707,36 +772,20 @@ public class ReceiptTaskService { * @param inventoryHeader 库存头表 * @return 任务数量 */ - private BigDecimal addInventoryDetails(TaskDetail taskDetail, + private TaskReceiptCompleteDomain addInventoryDetails(TaskDetail taskDetail, BarCodeDetail barCodeDetail, - InventoryHeader inventoryHeader,TaskHeader task) { + InventoryHeader inventoryHeader,TaskHeader task,TaskReceiptCompleteDomain taskReceiptCompleteDomain) { +// TaskReceiptCompleteDomain taskReceiptCompleteDomain=new TaskReceiptCompleteDomain(); + List<InventoryDetail> inventoryDetailList=taskReceiptCompleteDomain.getInventoryDetailList(); + List<InventoryTransaction> inventoryTransactionList=taskReceiptCompleteDomain.getInventoryTransactionList(); String warehouseCode = inventoryHeader.getWarehouseCode(); - /*该入库明细是否已存在库存明细记录,已存在更新数量、不存在新增记录*/ -// LambdaQueryWrapper<InventoryDetail> inventory = Wrappers.lambdaQuery(); -// inventory.eq(InventoryDetail::getWarehouseCode, warehouseCode) -// .eq(InventoryDetail::getLocationCode, inventoryHeader.getLocationCode()) -// .eq(InventoryDetail::getMaterialCode, taskDetail.getMaterialCode()) -// .eq(InventoryDetail::getContainerCode, inventoryHeader.getContainerCode()) -// .eq(InventoryDetail::getCompanyCode, taskDetail.getCompanyCode()) -// .eq(InventoryDetail::getBatteryPackTwoCode,taskDetail.getBatteryPackTwoCode()) -// .eq(InventoryDetail::getBarcodeDetailsCode,taskDetail.getBarcodeDetailsCode()) -// .eq(InventoryDetail::getBatch,taskDetail.getBatch()) -// .eq(InventoryDetail::getReceiptDetailId, taskDetail.getBillDetailId()); -// InventoryDetail inventoryDetail = inventoryDetailService.getOne(inventory); + Material material = materialService.findAllByCode(taskDetail.getMaterialCode(), warehouseCode); // Material material = materialService.findAllByCode(receiptDetail.getMaterialCode(), warehouseCode); /*单位换算*/ BigDecimal receiptQty = taskDetail.getQty(); -// if (StringUtils.isNotNull(inventoryDetail)) { -// inventoryDetail.setQty(inventoryDetail.getQty().add(taskDetail.getQty())); -// inventoryDetail.setWeights(inventoryDetail.getWeights().add(taskDetail.getWeights())); -// inventoryDetail.setDayShift(barCodeDetail.getDayShift()); -// inventoryDetail.setRegenerationCode(barCodeDetail.getRegenerationCode()); -// -// // inventoryDetail.setMaterialBatch(); -// } -// else { + InventoryDetail inventoryDetail = new InventoryDetail(); if(null!=barCodeDetail){ BarCodeHeader barCodeHeader = barCodeHeaderService.getById(barCodeDetail.getReceiptId()); @@ -788,12 +837,14 @@ public class ReceiptTaskService { one.setTotalWeight(taskDetail.getWeights()+""); inventoryDetail.setInventorySts(taskDetail.getInventorySts()); inventoryHeader.setTotalLines(inventoryHeader.getTotalLines()+1); -// } - if (!inventoryDetailService.save(inventoryDetail)) { + + inventoryDetailList.add(inventoryDetail); + /*if (!inventoryDetailService.save(inventoryDetail)) { throw new ServiceException("保存库存明细失败"); - } - inventoryHeader.setTotalQty(inventoryHeader.getTotalQty().add(taskDetail.getQty())); - inventoryHeaderService.updateById(inventoryHeader); + }*/ + /*inventoryHeader.setTotalQty(inventoryHeader.getTotalQty().add(taskDetail.getQty())); + inventoryHeaderService.updateById(inventoryHeader);*/ + //记录库存交易记录 InventoryTransaction inventoryTransaction = new InventoryTransaction(); inventoryTransaction.setTransactionType(QuantityConstant.INVENTORY_TRANSACTION_RECEIPT); @@ -809,10 +860,16 @@ public class ReceiptTaskService { inventoryTransaction.setBillDetailId(taskDetail.getBillDetailId()); inventoryTransaction.setBatch(barCodeDetail==null?null:barCodeDetail.getBatch()); inventoryTransaction.setTaskQty(receiptQty); - if (!inventoryTransactionService.save(inventoryTransaction)) { + + inventoryTransactionList.add(inventoryTransaction); + + taskReceiptCompleteDomain.setInventoryDetailList(inventoryDetailList); + taskReceiptCompleteDomain.setInventoryTransactionList(inventoryTransactionList); + taskReceiptCompleteDomain.setTotalQty(taskReceiptCompleteDomain.getTotalQty().add(taskDetail.getQty())); + /*if (!inventoryTransactionService.save(inventoryTransaction)) { throw new ServiceException("新增库存记录失败"); - } - return receiptQty; + }*/ + return taskReceiptCompleteDomain; } diff --git a/src/main/resources/templates/receipt/receiptHeader/receiptHeader.html b/src/main/resources/templates/receipt/receiptHeader/receiptHeader.html index 0297d10..5a1d98d 100644 --- a/src/main/resources/templates/receipt/receiptHeader/receiptHeader.html +++ b/src/main/resources/templates/receipt/receiptHeader/receiptHeader.html @@ -303,7 +303,7 @@ if (row.firstStatus == 800 && row.lastStatus == 800 && row.receiptType!='CPRK') { actions.push('<a class="btn btn-warning btn-xs ' + receiveFlag + '" href="#" onclick="receive(\''+row.id+'\')"><i class="fa fa-upload"></i>回传</a>'); } - if (row.firstStatus === 800 && row.lastStatus < 800) { + if (row.firstStatus >= 200 && row.lastStatus < 800) { actions.push('<a class="btn btn-danger btn-xs ' + receiveFlag + '" href="#" onclick="completeReceipt(\''+row.id+'\')"><i class="fa fa-upload"></i>提前完成单据</a>'); } return actions.join(''); -- libgit2 0.22.2