From cccbfadcb6e96c23a33c40c0687a27c2f6efa1db Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期一, 09 十一月 2026 13:16:42 +0800
Subject: [PATCH] feat(seal): 添加印章详情及图片预览功能

---
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeServiceImpl.java |  243 +++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 229 insertions(+), 14 deletions(-)

diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeServiceImpl.java
index 32ea507..50479f2 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeServiceImpl.java
@@ -9,12 +9,22 @@
 import cn.iocoder.yudao.module.mes.controller.admin.wm.arrivalnotice.vo.MesWmArrivalNoticeSaveReqVO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.arrivalnotice.MesWmArrivalNoticeDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.arrivalnotice.MesWmArrivalNoticeLineDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnvendor.MesWmReturnVendorDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnvendor.MesWmReturnVendorLineDO;
 import cn.iocoder.yudao.module.mes.dal.mysql.wm.arrivalnotice.MesWmArrivalNoticeMapper;
+import cn.iocoder.yudao.module.mes.dal.mysql.wm.returnvendor.MesWmReturnVendorLineMapper;
+import cn.iocoder.yudao.module.mes.dal.mysql.wm.returnvendor.MesWmReturnVendorMapper;
 import cn.iocoder.yudao.module.mes.enums.wm.MesWmArrivalNoticeStatusEnum;
 import cn.iocoder.yudao.module.erp.api.purchase.ErpPurchaseOrderApi;
+import cn.iocoder.yudao.module.srm.api.supplier.SrmSupplierApi;
 import cn.iocoder.yudao.module.erp.api.purchase.dto.ErpPurchaseOrderRespDTO;
+import cn.iocoder.yudao.module.erp.api.purchase.dto.ErpPurchaseOrderItemRespDTO;
+import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
+import cn.iocoder.yudao.module.mes.service.qc.iqc.MesQcIqcService;
+import cn.iocoder.yudao.module.mes.enums.qc.MesQcCheckResultEnum;
 import jakarta.annotation.Resource;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
@@ -22,7 +32,9 @@
 import java.math.BigDecimal;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*;
@@ -40,11 +52,24 @@
 
     @Resource
     private MesWmArrivalNoticeLineService arrivalNoticeLineService;
+
     @Resource
-    private cn.iocoder.yudao.module.mes.service.md.vendor.MesMdVendorService vendorService;
+    private MesWmReturnVendorMapper returnVendorMapper;
+    @Resource
+    private MesWmReturnVendorLineMapper returnVendorLineMapper;
+
+    @Resource
+    private SrmSupplierApi srmSupplierApi;
 
     @Resource
     private ErpPurchaseOrderApi purchaseOrderApi;
+
+    @Resource
+    private MesMdmItemService mdmItemService;
+
+    @Resource
+    @Lazy
+    private MesQcIqcService iqcService;
 
     @Override
     public Long createArrivalNotice(MesWmArrivalNoticeSaveReqVO createReqVO) {
@@ -53,6 +78,7 @@
 
         // 鎻掑叆
         MesWmArrivalNoticeDO notice = BeanUtils.toBean(createReqVO, MesWmArrivalNoticeDO.class);
+        fillContractNoFromPurchaseOrder(notice);
         notice.setStatus(MesWmArrivalNoticeStatusEnum.PREPARE.getStatus());
         arrivalNoticeMapper.insert(notice);
         return notice.getId();
@@ -67,22 +93,34 @@
 
         // 鏇存柊
         MesWmArrivalNoticeDO updateObj = BeanUtils.toBean(updateReqVO, MesWmArrivalNoticeDO.class);
+        fillContractNoFromPurchaseOrder(updateObj);
         arrivalNoticeMapper.updateById(updateObj);
+    }
+
+    /**
+     * 閲囪喘鍚堝悓鍙锋湭鏄惧紡浼犲叆鏃讹紝浠庡叧鑱旂殑閲囪喘璁㈠崟甯﹀叆锛堟崲璐у埌璐у繀椤昏兘杩芥函鍒板師閲囪喘鍚堝悓锛�
+     */
+    private void fillContractNoFromPurchaseOrder(MesWmArrivalNoticeDO notice) {
+        if (notice.getPurchaseOrderId() == null || cn.hutool.core.util.StrUtil.isNotBlank(notice.getContractNo())) {
+            return;
+        }
+        ErpPurchaseOrderRespDTO purchaseOrder = purchaseOrderApi.getPurchaseOrder(notice.getPurchaseOrderId()).getCheckedData();
+        if (purchaseOrder != null) {
+            notice.setContractNo(purchaseOrder.getContractNo());
+        }
     }
 
     private void validateArrivalNoticeSaveData(MesWmArrivalNoticeSaveReqVO reqVO) {
         // 鏍¢獙缂栫爜鍞竴
         validateCodeUnique(reqVO.getId(), reqVO.getCode());
-        // 鏍¢獙渚涘簲鍟嗗瓨鍦ㄤ笖鍚敤
-        vendorService.validateVendorExistsAndEnable(reqVO.getVendorId());
-        // 鏍¢獙閲囪喘璁㈠崟瀛樺湪锛屽苟鑷姩濉厖閲囪喘璁㈠崟鍙�
+        // 鏍¢獙渚涘簲鍟嗗瓨鍦紙ERP 閲囪喘渚涘簲鍟嗭級
+        srmSupplierApi.getSupplier(reqVO.getVendorId());
+        // 鏍¢獙閲囪喘璁㈠崟瀛樺湪
         if (reqVO.getPurchaseOrderId() != null) {
             ErpPurchaseOrderRespDTO purchaseOrder = purchaseOrderApi.getPurchaseOrder(reqVO.getPurchaseOrderId()).getCheckedData();
             if (purchaseOrder == null) {
                 throw exception(WM_PURCHASE_ORDER_NOT_EXISTS);
             }
-            // 鑷姩濉厖閲囪喘璁㈠崟鍙�
-            reqVO.setPurchaseOrderCode(purchaseOrder.getNo());
         }
     }
 
@@ -112,7 +150,7 @@
     @Transactional(rollbackFor = Exception.class)
     public void submitArrivalNotice(Long id) {
         // 1.1 鏍¢獙瀛樺湪 + 鑽夌鐘舵��
-        validateArrivalNoticeExistsAndDraft(id);
+        MesWmArrivalNoticeDO notice = validateArrivalNoticeExistsAndDraft(id);
         // 1.2 妫�鏌ユ槸鍚︽湁琛岄」鐩�
         List<MesWmArrivalNoticeLineDO> lines = arrivalNoticeLineService.getArrivalNoticeLineListByNoticeId(id);
         if (CollUtil.isEmpty(lines)) {
@@ -123,9 +161,26 @@
         boolean needCheck = CollectionUtils.anyMatch(lines,
                 line -> Boolean.TRUE.equals(line.getIqcCheckFlag()));
         if (needCheck) {
-            // 闇�瑕佹楠岋紝杩涘叆寰呰川妫�
+            // 2.1 闇�瑕佹楠岋紝杩涘叆寰呰川妫�
             arrivalNoticeMapper.updateById(new MesWmArrivalNoticeDO()
                     .setId(id).setStatus(MesWmArrivalNoticeStatusEnum.PENDING_QC.getStatus()));
+            // 2.2 涓洪渶瑕佽川妫�鐨勮鑷姩鍒涘缓 IQC 妫�楠屽崟
+            for (MesWmArrivalNoticeLineDO line : lines) {
+                if (Boolean.TRUE.equals(line.getIqcCheckFlag()) && line.getIqcId() == null) {
+                    try {
+                        Long iqcId = iqcService.createIqcFromArrivalNotice(
+                                id, line, notice.getCode(), notice.getVendorId());
+                        // 鏇存柊琛屼笂鐨� iqcId
+                        arrivalNoticeLineService.updateArrivalNoticeLineIqcId(line.getId(), iqcId);
+                        log.info("[submitArrivalNotice][鍒拌揣閫氱煡鍗�({}) 琛�({}) 鑷姩鍒涘缓 IQC 妫�楠屽崟({})]",
+                                id, line.getId(), iqcId);
+                    } catch (Exception e) {
+                        log.warn("[submitArrivalNotice][鍒拌揣閫氱煡鍗�({}) 琛�({}) 鍒涘缓 IQC 澶辫触: {}]",
+                                id, line.getId(), e.getMessage());
+                        // 缁х画澶勭悊鍏朵粬琛岋紝涓嶄腑鏂祦绋�
+                    }
+                }
+            }
             return;
         }
         // 涓嶉渶瑕佹楠岋紝鐩存帴杩涘叆寰呭叆搴�
@@ -135,7 +190,7 @@
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void updateArrivalNoticeWhenIqcFinish(Long id, Long lineId, Long iqcId, BigDecimal qualifiedQuantity) {
+    public void updateArrivalNoticeWhenIqcFinish(Long id, Long lineId, Long iqcId, Integer checkResult, BigDecimal qualifiedQuantity) {
         // 1.1 鏍¢獙鍒拌揣閫氱煡鍗曞瓨鍦�
         MesWmArrivalNoticeDO notice = validateArrivalNoticeExists(id);
         // 1.2 鏍¢獙鐘舵�佷负寰呰川妫�
@@ -143,18 +198,28 @@
             throw exception(WM_ARRIVAL_NOTICE_STATUS_NOT_PENDING_QC);
         }
 
-        // 2. 鏇存柊鍒拌揣閫氱煡鍗曡锛氱粦瀹� iqcId + 鍚堟牸鏁伴噺
-        arrivalNoticeLineService.updateArrivalNoticeLineWhenIqcFinish(lineId, iqcId, qualifiedQuantity);
+        // 2. 鏇存柊鍒拌揣閫氱煡鍗曡锛氱粦瀹� iqcId + 璐ㄦ缁撴灉 + 鍚堟牸鏁伴噺
+        arrivalNoticeLineService.updateArrivalNoticeLineWhenIqcFinish(lineId, iqcId, checkResult, qualifiedQuantity);
 
-        // 3.1 鍒ゆ柇鏄惁鎵�鏈夐渶妫�琛岄兘宸插畬鎴�
+        // 3.1 鍒ゆ柇鏄惁鎵�鏈夐渶妫�琛岄兘宸插畬鎴愯川妫�
         List<MesWmArrivalNoticeLineDO> lines = arrivalNoticeLineService.getArrivalNoticeLineListByNoticeId(id);
         boolean hasUnchecked = CollectionUtils.anyMatch(lines,
-                line -> Boolean.TRUE.equals(line.getIqcCheckFlag()) && line.getIqcId() == null);
+                line -> Boolean.TRUE.equals(line.getIqcCheckFlag()) && line.getIqcCheckResult() == null);
         if (hasUnchecked) {
             log.info("[updateArrivalNoticeWhenIqcFinish][鍒拌揣閫氱煡鍗�({}) 杩樻湁鏈畬鎴愭楠岀殑琛岋紝鏆備笉鏇存柊鐘舵�乚", id);
             return;
         }
-        // 3.2 鎵�鏈夎妫�楠屽畬鎴愶紝鏇存柊涓昏〃鐘舵�� PENDING_QC 鈫� PENDING_RECEIPT
+
+        // 3.2 鍒ゆ柇鏄惁鎵�鏈夐渶妫�琛岄兘鍙互鍏ュ簱锛堝悎鏍兼垨鐗归噰锛�
+        boolean hasNonInbound = CollectionUtils.anyMatch(lines,
+                line -> Boolean.TRUE.equals(line.getIqcCheckFlag())
+                        && !MesQcCheckResultEnum.canInbound(line.getIqcCheckResult()));
+        if (hasNonInbound) {
+            log.info("[updateArrivalNoticeWhenIqcFinish][鍒拌揣閫氱煡鍗�({}) 瀛樺湪涓嶅彲鍏ュ簱鐨勮锛堥��璐�/鎶ュ簾锛夛紝鐘舵�佷繚鎸佸緟璐ㄦ]", id);
+            return;
+        }
+
+        // 3.3 鎵�鏈夎妫�楠屽畬鎴愪笖鍙叆搴擄紝鏇存柊涓昏〃鐘舵�� PENDING_QC 鈫� PENDING_RECEIPT
         arrivalNoticeMapper.updateById(new MesWmArrivalNoticeDO()
                 .setId(id).setStatus(MesWmArrivalNoticeStatusEnum.PENDING_RECEIPT.getStatus()));
     }
@@ -256,4 +321,154 @@
         return arrivalNoticeMapper.selectCountByVendorId(vendorId);
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Long generateArrivalNoticeFromPurchaseOrder(Long purchaseOrderId) {
+        // 1. 鏍¢獙鏄惁宸茬敓鎴愯繃鍒拌揣閫氱煡鍗曪紙闃叉閲嶅鐢熸垚锛�
+        MesWmArrivalNoticeDO existNotice = arrivalNoticeMapper.selectByPurchaseOrderId(purchaseOrderId);
+        if (existNotice != null) {
+            throw exception(WM_ARRIVAL_NOTICE_ALREADY_EXISTS);
+        }
+
+        // 2. 鑾峰彇閲囪喘璁㈠崟
+        ErpPurchaseOrderRespDTO purchaseOrder = purchaseOrderApi.getPurchaseOrder(purchaseOrderId).getCheckedData();
+        if (purchaseOrder == null) {
+            throw exception(WM_PURCHASE_ORDER_NOT_EXISTS);
+        }
+
+        // 3. 鑾峰彇閲囪喘璁㈠崟鏄庣粏
+        List<ErpPurchaseOrderItemRespDTO> items = purchaseOrderApi.getPurchaseOrderItemList(purchaseOrderId).getCheckedData();
+        if (CollUtil.isEmpty(items)) {
+            throw exception(WM_PURCHASE_ORDER_NO_ITEM);
+        }
+
+        // 4. 鐢熸垚鍒拌揣閫氱煡鍗曠紪鐮�
+        String code = generateArrivalNoticeCode();
+
+        // 5. 鍒涘缓鍒拌揣閫氱煡鍗曚富琛紝鐩存帴璁句负寰呭叆搴撶姸鎬�
+        MesWmArrivalNoticeDO notice = new MesWmArrivalNoticeDO();
+        notice.setCode(code);
+        notice.setName(purchaseOrder.getNo() + "鍒拌揣閫氱煡");
+        notice.setPurchaseOrderId(purchaseOrderId);
+        notice.setPurchaseOrderCode(purchaseOrder.getNo());
+        notice.setContractNo(purchaseOrder.getContractNo());
+        notice.setVendorId(purchaseOrder.getSupplierId());
+        notice.setArrivalDate(java.time.LocalDateTime.now()); // 鍒拌揣鏃堕棿涓哄綋鍓嶆椂闂�
+        notice.setStatus(MesWmArrivalNoticeStatusEnum.PENDING_RECEIPT.getStatus());
+        arrivalNoticeMapper.insert(notice);
+
+        // 6. 閬嶅巻鏄庣粏鍒涘缓鍒拌揣閫氱煡鍗曡
+        boolean hasNeedQc = false;
+        for (ErpPurchaseOrderItemRespDTO item : items) {
+            MesWmArrivalNoticeLineDO line = new MesWmArrivalNoticeLineDO();
+            line.setNoticeId(notice.getId());
+            line.setPurchaseOrderItemId(item.getId());
+            line.setItemId(item.getProductId()); // 浠庨噰璐鍗曟槑缁嗗甫鍏ョ墿鏂欑紪鍙�
+            BigDecimal arrivalQuantity = item.getCount() != null ? item.getCount().subtract(item.getInCount() != null ? item.getInCount() : BigDecimal.ZERO) : BigDecimal.ZERO;
+            line.setArrivalQuantity(arrivalQuantity);
+            // 浠庨噰璐鍗曟槑缁嗗甫鍏ヨ川妫�鏍囪瘑
+            boolean needQc = Boolean.TRUE.equals(item.getQcCheckFlag());
+            line.setIqcCheckFlag(needQc);
+            // 濡傛灉涓嶉渶瑕佽川妫�锛屽悎鏍兼暟閲忕瓑浜庡埌璐ф暟閲�
+            if (!needQc) {
+                line.setQualifiedQuantity(arrivalQuantity);
+            } else {
+                hasNeedQc = true;
+            }
+            arrivalNoticeLineService.createArrivalNoticeLineFromPurchaseOrderItem(line);
+        }
+
+        // 7. 濡傛灉鏈夐渶瑕佽川妫�鐨勮锛屾洿鏂扮姸鎬佷负寰呰川妫�骞惰嚜鍔ㄥ垱寤� IQC 鍗�
+        if (hasNeedQc) {
+            arrivalNoticeMapper.updateById(new MesWmArrivalNoticeDO()
+                    .setId(notice.getId()).setStatus(MesWmArrivalNoticeStatusEnum.PENDING_QC.getStatus()));
+            // 涓洪渶瑕佽川妫�鐨勮鑷姩鍒涘缓 IQC 妫�楠屽崟
+            List<MesWmArrivalNoticeLineDO> lines = arrivalNoticeLineService.getArrivalNoticeLineListByNoticeId(notice.getId());
+            for (MesWmArrivalNoticeLineDO line : lines) {
+                if (Boolean.TRUE.equals(line.getIqcCheckFlag())) {
+                    Long iqcId = iqcService.createIqcFromArrivalNotice(
+                            notice.getId(), line, notice.getCode(), notice.getVendorId());
+                    arrivalNoticeLineService.updateArrivalNoticeLineIqcId(line.getId(), iqcId);
+                    log.info("[generateArrivalNoticeFromPurchaseOrder][鍒拌揣閫氱煡鍗�({}) 琛�({}) 鑷姩鍒涘缓 IQC 妫�楠屽崟({})]",
+                            notice.getId(), line.getId(), iqcId);
+                }
+            }
+        }
+
+        return notice.getId();
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Long createReplacementArrivalNotice(Long returnVendorId) {
+        // 1. 鏍¢獙閫�璐у崟
+        MesWmReturnVendorDO returnVendor = returnVendorMapper.selectById(returnVendorId);
+        if (returnVendor == null) {
+            throw exception(WM_RETURN_VENDOR_NOT_EXISTS);
+        }
+        if (returnVendor.getPurchaseOrderId() == null) {
+            throw exception(WM_RETURN_VENDOR_PURCHASE_ORDER_REQUIRED);
+        }
+        List<MesWmReturnVendorLineDO> returnLines = returnVendorLineMapper.selectListByReturnId(returnVendorId);
+        if (CollUtil.isEmpty(returnLines)) {
+            throw exception(WM_RETURN_VENDOR_NO_LINE);
+        }
+
+        // 2. 鑾峰彇閲囪喘璁㈠崟鏄庣粏锛岀敤浜庢寜鐗╂枡鍖归厤閲囪喘璁㈠崟鏄庣粏缂栧彿锛堜繚璇佸叆搴撳悗鑳藉洖鍐欏叆搴�/閫�璐ф暟閲忥級
+        Map<Long, Long> purchaseOrderItemIdMap = new HashMap<>();
+        List<ErpPurchaseOrderItemRespDTO> orderItems = purchaseOrderApi
+                .getPurchaseOrderItemList(returnVendor.getPurchaseOrderId()).getCheckedData();
+        if (CollUtil.isNotEmpty(orderItems)) {
+            orderItems.stream()
+                    .filter(item -> item.getProductId() != null)
+                    .forEach(item -> purchaseOrderItemIdMap.putIfAbsent(item.getProductId(), item.getId()));
+        }
+
+        // 3. 鍒涘缓鍒拌揣閫氱煡鍗曚富琛紝鐘舵�佺洿鎺ョ疆涓哄緟璐ㄦ
+        MesWmArrivalNoticeDO notice = new MesWmArrivalNoticeDO();
+        notice.setCode(generateArrivalNoticeCode());
+        notice.setName(returnVendor.getCode() + "鎹㈣揣鍒拌揣");
+        notice.setPurchaseOrderId(returnVendor.getPurchaseOrderId());
+        notice.setPurchaseOrderCode(returnVendor.getPurchaseOrderCode());
+        // 鎹㈣揣閲嶆柊鍏宠仈鍘熼噰璐悎鍚屽彿锛氫紭鍏堝彇閫�璐у崟蹇収锛岄��璐у崟鏈揩鐓ф椂鍥炲~閲囪喘璁㈠崟鍚堝悓鍙�
+        notice.setContractNo(returnVendor.getContractNo());
+        fillContractNoFromPurchaseOrder(notice);
+        notice.setVendorId(returnVendor.getVendorId());
+        notice.setArrivalDate(java.time.LocalDateTime.now());
+        notice.setStatus(MesWmArrivalNoticeStatusEnum.PENDING_QC.getStatus());
+        notice.setRemark("渚涘簲鍟嗛��璐у崟[" + returnVendor.getCode() + "]鎹㈣揣閲嶆柊鍏ュ簱锛屽悎鍚屽彿["
+                + returnVendor.getContractNo() + "]");
+        arrivalNoticeMapper.insert(notice);
+
+        // 4. 閬嶅巻閫�璐ц鍒涘缓鍒拌揣閫氱煡鍗曡锛屽叏閮ㄦ爣璁伴渶瑕佽川妫�
+        for (MesWmReturnVendorLineDO returnLine : returnLines) {
+            MesWmArrivalNoticeLineDO line = new MesWmArrivalNoticeLineDO();
+            line.setNoticeId(notice.getId());
+            line.setPurchaseOrderItemId(purchaseOrderItemIdMap.get(returnLine.getItemId()));
+            line.setItemId(returnLine.getItemId());
+            line.setArrivalQuantity(returnLine.getQuantity());
+            line.setIqcCheckFlag(true);
+            arrivalNoticeLineService.createArrivalNoticeLineFromPurchaseOrderItem(line);
+        }
+
+        // 5. 閫愯鑷姩鍒涘缓 IQC 妫�楠屽崟
+        List<MesWmArrivalNoticeLineDO> lines = arrivalNoticeLineService.getArrivalNoticeLineListByNoticeId(notice.getId());
+        for (MesWmArrivalNoticeLineDO line : lines) {
+            Long iqcId = iqcService.createIqcFromArrivalNotice(
+                    notice.getId(), line, notice.getCode(), notice.getVendorId());
+            arrivalNoticeLineService.updateArrivalNoticeLineIqcId(line.getId(), iqcId);
+            log.info("[createReplacementArrivalNotice][鎹㈣揣鍒拌揣閫氱煡鍗�({}) 琛�({}) 鑷姩鍒涘缓 IQC 妫�楠屽崟({})]",
+                    notice.getId(), line.getId(), iqcId);
+        }
+        return notice.getId();
+    }
+
+    /**
+     * 鐢熸垚鍒拌揣閫氱煡鍗曠紪鐮�
+     */
+    private String generateArrivalNoticeCode() {
+        // TODO: 浣跨敤缂栫爜瑙勫垯鏈嶅姟鐢熸垚缂栫爜
+        return "AN" + System.currentTimeMillis();
+    }
+
 }

--
Gitblit v1.9.3