JOB
增加单位信息的同步任务
金蝶:
同步销售订单、采购订单和项目信息增加根据状态的过滤
原材料条码:
打印时切换成本地服务打印
成品条码:
打印时成品条码切换本地服务,增加补打印功能
master
xs 3 weeks ago
parent 882c84ea1b
commit e007884249

@ -20,6 +20,11 @@ import org.springframework.web.bind.annotation.RequestHeader;
@FeignClient(contextId = "remoteJindieService", value = ServiceNameConstants.JINDIE_SERVICE, fallbackFactory = RemoteJindieFallbackFactory.class) @FeignClient(contextId = "remoteJindieService", value = ServiceNameConstants.JINDIE_SERVICE, fallbackFactory = RemoteJindieFallbackFactory.class)
public interface RemoteJindieService { public interface RemoteJindieService {
/** 同步单位信息*/
@PostMapping("/jindie/syncUnitInfoFromErp")
R<Integer> syncUnitInfoFromErp(@RequestBody ErpSyncInfoVo erpSyncInfoVo,@RequestHeader(SecurityConstants.FROM_SOURCE) String source);
/** 同步供应商*/ /** 同步供应商*/
@PostMapping("/jindie/syncSupplierInfoFromErp") @PostMapping("/jindie/syncSupplierInfoFromErp")
R<Integer> syncSupplierInfoFromErp(@RequestBody ErpSyncInfoVo erpSyncInfoVo,@RequestHeader(SecurityConstants.FROM_SOURCE) String source); R<Integer> syncSupplierInfoFromErp(@RequestBody ErpSyncInfoVo erpSyncInfoVo,@RequestHeader(SecurityConstants.FROM_SOURCE) String source);

@ -16,6 +16,11 @@ import org.springframework.web.bind.annotation.RequestBody;
public class RemoteJindieFallbackFactory implements FallbackFactory<RemoteJindieService> { public class RemoteJindieFallbackFactory implements FallbackFactory<RemoteJindieService> {
public RemoteJindieService create(Throwable throwable) { public RemoteJindieService create(Throwable throwable) {
return new RemoteJindieService() { return new RemoteJindieService() {
@Override
public R<Integer> syncUnitInfoFromErp(ErpSyncInfoVo erpSyncInfoVo, String source) {
return R.fail("同步单位信息失败:" + throwable.getMessage());
}
@Override @Override
public R<Integer> syncSupplierInfoFromErp(ErpSyncInfoVo erpSyncInfoVo,String source) { public R<Integer> syncSupplierInfoFromErp(ErpSyncInfoVo erpSyncInfoVo,String source) {
return R.fail("同步供应商信息失败:" + throwable.getMessage()); return R.fail("同步供应商信息失败:" + throwable.getMessage());

@ -21,9 +21,16 @@ public class PrintContentVo {
public static final String RAW_MATERIAL_LABEL_KEY_QC_RESULT_YES = "qcResultYes"; public static final String RAW_MATERIAL_LABEL_KEY_QC_RESULT_YES = "qcResultYes";
public static final String RAW_MATERIAL_LABEL_KEY_QC_RESULT_NO = "qcResultNo"; public static final String RAW_MATERIAL_LABEL_KEY_QC_RESULT_NO = "qcResultNo";
public static final String RAW_MATERIAL_LABEL_KEY_QRCODE = "qrcode"; public static final String RAW_MATERIAL_LABEL_KEY_QRCODE = "qrcode";
public static final String RAW_MATERIAL_LABEL_KEY_BARCODE = "barcode";
public static final String PRODUCT_PLAN_CODE = "productPlanCode"; public static final String PRODUCT_PLAN_CODE = "productPlanCode";
public static final String PRINT_TEMPLATE_RAW = "raw";
public static final String PRINT_TEMPLATE_PRODUCT = "product";
public static final String PRINT_TEMPLATE_BIND = "bind";
private String key; private String key;
private String value; private String value;

@ -79,6 +79,14 @@ public class RyTask
System.out.println("++创建保养工单++getDmsMaintInstance"); System.out.println("++创建保养工单++getDmsMaintInstance");
remoteDmsService.getDmsBillsMaintInstance(SecurityConstants.INNER,planMaintCode); remoteDmsService.getDmsBillsMaintInstance(SecurityConstants.INNER,planMaintCode);
} }
public void syncUnitInfoFromErp(String maxErpModifyDate){
ErpSyncInfoVo erpSyncInfoVo = new ErpSyncInfoVo();
erpSyncInfoVo.setMaxErpModifyDate(maxErpModifyDate);
System.out.println("++同步ERP中物料供应商++ErpSupplierInfo");
remoteJindieService.syncUnitInfoFromErp(erpSyncInfoVo,SecurityConstants.INNER);
}
public void syncSupplierInfoFromErp(String maxErpModifyDate){ public void syncSupplierInfoFromErp(String maxErpModifyDate){
ErpSyncInfoVo erpSyncInfoVo = new ErpSyncInfoVo(); ErpSyncInfoVo erpSyncInfoVo = new ErpSyncInfoVo();
erpSyncInfoVo.setMaxErpModifyDate(maxErpModifyDate); erpSyncInfoVo.setMaxErpModifyDate(maxErpModifyDate);

@ -314,6 +314,17 @@ public class MesApiController extends BaseController {
} }
/**
*
* @param barcodeIds
* @return
*/
@GetMapping(value = "/reprintBarcodes/{barcodeIds}")
public AjaxResult reprintBarcodes(@PathVariable Long[] barcodeIds)
{
return success(mesBaseBarcodeInfoService.printBarcodes(barcodeIds,MesConstants.MES_BARCODE_TYPE_PRODUCT,true,1));
}
/** /**
* *
* *

@ -212,7 +212,7 @@ public class MesBaseBarcodeInfoController extends BaseController
/** /**
* * ()
* @param barcodeIds * @param barcodeIds
* @return * @return
*/ */

@ -1,5 +1,7 @@
package com.hw.mes.service.impl; package com.hw.mes.service.impl;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.hw.common.core.constant.*; import com.hw.common.core.constant.*;
import com.hw.common.core.domain.R; import com.hw.common.core.domain.R;
import com.hw.common.core.exception.ServiceException; import com.hw.common.core.exception.ServiceException;
@ -24,6 +26,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.data.redis.core.StringRedisTemplate;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.math.BigDecimal; import java.math.BigDecimal;
@ -42,8 +45,8 @@ public class MesBaseBarcodeInfoServiceImpl implements IMesBaseBarcodeInfoService
@Autowired @Autowired
private MesBaseBarcodeInfoMapper mesBaseBarcodeInfoMapper; private MesBaseBarcodeInfoMapper mesBaseBarcodeInfoMapper;
@Resource @Autowired
private RemotePrinterService remotePrinterService; private StringRedisTemplate redisTemplate;
@Autowired @Autowired
private MesOrderBindMapper mesOrderBindMapper; private MesOrderBindMapper mesOrderBindMapper;
@ -623,184 +626,130 @@ public class MesBaseBarcodeInfoServiceImpl implements IMesBaseBarcodeInfoService
* @return * @return
*/ */
@Override @Override
@Transactional @Transactional(rollbackFor = Exception.class)
public int printBarcodes(Long[] barcodeIds, String printType, boolean reprintFlag, Integer printNumber) { public int printBarcodes(Long[] barcodeIds, String printType, boolean reprintFlag, Integer printNumber) {
//获取条码List JSONArray pintBarcodeJsonArr = new JSONArray();
// List<List<PrintContentVo>> printContents = new ArrayList<>(); JSONObject printContentJson = new JSONObject();
// List<MesBaseBarcodeInfo> toUpdatedBaseBarcodeInfos = new ArrayList<>();
String barcodeType = "";
for (Long barcodeId : barcodeIds) { for (Long barcodeId : barcodeIds) {
MesBaseBarcodeInfo mesBaseBarcodeInfo = mesBaseBarcodeInfoMapper.selectMesBaseBarcodeInfoByBarcodeId(barcodeId);
if (StringUtils.isEmpty(barcodeType)) {
barcodeType = mesBaseBarcodeInfo.getBarcodeType();
}
this.updateBaseBarcodePrintFlag(mesBaseBarcodeInfo, reprintFlag);
if (printNumber != null && printNumber > 1) { if (printNumber != null && printNumber > 1) {
for (int i = 0; i < printNumber; i++) { for (int i = 0; i < printNumber; i++) {
printBarcodesByBarcodeId(barcodeId, printType, reprintFlag); JSONObject printBarcodeJson = getBarcodeJsonByBarcode(mesBaseBarcodeInfo, printType);
pintBarcodeJsonArr.add(printBarcodeJson);
} }
} else { } else {
printBarcodesByBarcodeId(barcodeId, printType, reprintFlag); JSONObject printBarcodeJson = getBarcodeJsonByBarcode(mesBaseBarcodeInfo, printType);
pintBarcodeJsonArr.add(printBarcodeJson);
}
} }
String printTemplate = "";
if (barcodeType.equals(MesConstants.MES_BARCODE_TYPE_RAW)) {
printTemplate = PrintContentVo.PRINT_TEMPLATE_RAW;
} else if (barcodeType.equals(MesConstants.MES_BARCODE_TYPE_PRODUCT)) {
printTemplate = PrintContentVo.PRINT_TEMPLATE_PRODUCT;
} else if (barcodeType.equals(MesConstants.MES_BARCODE_TYPE_BIND)) {
printTemplate = PrintContentVo.PRINT_TEMPLATE_BIND;
} }
printContentJson.put("template", printTemplate);
printContentJson.put("printContent", pintBarcodeJsonArr.toString());
System.out.println(printContentJson.toString());
// for (MesBaseBarcodeInfo toUpdateMesBaseBarcodeInfo : toUpdatedBaseBarcodeInfos) {
// toUpdateMesBaseBarcodeInfo.setPrintTime(DateUtils.getNowDate()); try {
// toUpdateMesBaseBarcodeInfo.setPrintPerson(SecurityUtils.getUsername()); redisTemplate.opsForList().rightPush("print_10.10.3.119", printContentJson.toString());
// toUpdateMesBaseBarcodeInfo.setPrintFlag(MesConstants.MES_BARCODE_PRINT_FLAG_YES); // redisTemplate.convertAndSend("print_10.10.3.119", printContentJson.toString());
// toUpdateMesBaseBarcodeInfo.setPrintNumber(1L); } catch (Exception e) {
// toUpdateMesBaseBarcodeInfo.setAcceptedDate(DateUtils.getNowDate()); throw new ServiceException("打印失败:" + e.getMessage());
// this.updateMesBaseBarcodeInfo(toUpdateMesBaseBarcodeInfo); }
// }
//
// PrinterVo printerVo = new PrinterVo();
// printerVo.setPrintType(printType);
// printerVo.setPrintContents(printContents);
//
// //调用的打印接口
// R<?> printResultR = remotePrinterService.printBarcodes(printerVo, SecurityConstants.INNER);
// if (printResultR.getCode() != Constants.SUCCESS) {//抛出异常,回滚事务
// throw new RuntimeException(printResultR.getMsg());
// }
return 1; return 1;
} }
@Transactional(propagation = Propagation.REQUIRES_NEW) public void updateBaseBarcodePrintFlag(MesBaseBarcodeInfo mesBaseBarcodeInfo, boolean reprintFlag) {
public void printBarcodesByBarcodeId(Long barcodeId, String printType, boolean reprintFlag) { String barcodeType = mesBaseBarcodeInfo.getBarcodeType();
MesBaseBarcodeInfo mesBaseBarcodeInfo = mesBaseBarcodeInfoMapper.selectMesBaseBarcodeInfoJoinByBarcodeId(barcodeId); if (!reprintFlag && !barcodeType.equals(MesConstants.MES_BARCODE_TYPE_BIND)) {
if (!reprintFlag) {
String printFlag = mesBaseBarcodeInfo.getPrintFlag(); String printFlag = mesBaseBarcodeInfo.getPrintFlag();
if (printFlag.equals(MesConstants.MES_BARCODE_PRINT_FLAG_YES)) { if (printFlag.equals(MesConstants.MES_BARCODE_PRINT_FLAG_YES)) {
throw new ServiceException("此物料条码[" + mesBaseBarcodeInfo.getBarcodeInfo() + "]已经打印过,不能重复打印"); throw new ServiceException("此物料条码[" + mesBaseBarcodeInfo.getBarcodeInfo() + "]已经打印过,不能重复打印");
} }
} }
String materialName = mesBaseBarcodeInfo.getMaterialName();
List<PrintContentVo> printContentVos = new ArrayList<>();
PrintContentVo printMaterialCode = new PrintContentVo(); Date currentDate = new Date();
printMaterialCode.setKey(PrintContentVo.RAW_MATERIAL_LABEL_KEY_MATERIAL_CODE); mesBaseBarcodeInfo.setUpdateTime(currentDate);
printMaterialCode.setValue(mesBaseBarcodeInfo.getMaterialCode()); mesBaseBarcodeInfo.setUpdateBy(SecurityUtils.getUsername());
printMaterialCode.setType(PrintContentVo.TYPE_TEXT); mesBaseBarcodeInfo.setPrintTime(DateUtils.getNowDate());
mesBaseBarcodeInfo.setPrintPerson(SecurityUtils.getUsername());
mesBaseBarcodeInfo.setPrintFlag(MesConstants.MES_BARCODE_PRINT_FLAG_YES);
mesBaseBarcodeInfo.setPrintNumber(mesBaseBarcodeInfo.getPrintNumber() == null ? 1L : mesBaseBarcodeInfo.getPrintNumber() + 1);
mesBaseBarcodeInfo.setAcceptedDate(currentDate);
mesBaseBarcodeInfoMapper.updateMesBaseBarcodeInfo(mesBaseBarcodeInfo);
}
PrintContentVo printPreMaterial = new PrintContentVo();
// if (mesBaseBarcodeInfo.getBindFlag() == null) {
//
// }
PrintContentVo printSaleOrderCode = new PrintContentVo(); // @Transactional(propagation = Propagation.REQUIRES_NEW)
printSaleOrderCode.setKey(PrintContentVo.RAW_MATERIAL_LABEL_KEY_SALE_ORDER_CODE); public JSONObject getBarcodeJsonByBarcode(MesBaseBarcodeInfo mesBaseBarcodeInfo, String printType) {
printSaleOrderCode.setValue(mesBaseBarcodeInfo.getSaleorderCode()); String materialName = mesBaseBarcodeInfo.getMaterialName();
printSaleOrderCode.setType(PrintContentVo.TYPE_TEXT); JSONObject printInfoObject = new JSONObject();
printInfoObject.put(PrintContentVo.RAW_MATERIAL_LABEL_KEY_MATERIAL_CODE, mesBaseBarcodeInfo.getMaterialCode());
printInfoObject.put(PrintContentVo.RAW_MATERIAL_LABEL_KEY_SALE_ORDER_CODE, mesBaseBarcodeInfo.getSaleorderCode());
printInfoObject.put(PrintContentVo.RAW_MATERIAL_LABEL_KEY_QRCODE, mesBaseBarcodeInfo.getBarcodeInfo());
PrintContentVo printBarCode = new PrintContentVo();
printBarCode.setKey(PrintContentVo.RAW_MATERIAL_LABEL_KEY_QRCODE);
printBarCode.setValue(mesBaseBarcodeInfo.getBarcodeInfo());
printBarCode.setType(PrintContentVo.TYPE_QRCODE);
if (printType.equals(PrinterVo.PRINT_TYPE_RAW_LABEL)) { if (printType.equals(PrinterVo.PRINT_TYPE_RAW_LABEL)) {
PrintContentVo printMaterialName = new PrintContentVo(); // materialName = materialName.length() <= 10 ? "\n" + materialName : materialName;
printMaterialName.setKey(PrintContentVo.RAW_MATERIAL_LABEL_KEY_MATERIAL_NAME); // printMaterialName.setValue(materialName.replaceAll("[\\x00-\\x1F\\x7F-\\x9F]", ""));
materialName = materialName.length() <= 10 ? "\n" + materialName : materialName; // printMaterialName.setType(PrintContentVo.TYPE_TEXT);
printMaterialName.setValue(materialName.replaceAll("[\\x00-\\x1F\\x7F-\\x9F]", ""));
printMaterialName.setType(PrintContentVo.TYPE_TEXT); printInfoObject.put(PrintContentVo.RAW_MATERIAL_LABEL_KEY_MATERIAL_NAME, materialName);
PrintContentVo printBatchCode = new PrintContentVo(); printInfoObject.put(PrintContentVo.RAW_MATERIAL_LABEL_KEY_BARCODE, mesBaseBarcodeInfo.getBarcodeInfo());
printBatchCode.setKey(PrintContentVo.RAW_MATERIAL_LABEL_KEY_BATCH_CODE); printInfoObject.put(PrintContentVo.RAW_MATERIAL_LABEL_KEY_BATCH_CODE, mesBaseBarcodeInfo.getBatchCode());
printBatchCode.setValue(mesBaseBarcodeInfo.getBatchCode()); printInfoObject.put(PrintContentVo.RAW_MATERIAL_LABEL_KEY_PO_NO, mesBaseBarcodeInfo.getPoNo());
printBatchCode.setType(PrintContentVo.TYPE_TEXT);
PrintContentVo printPoNo = new PrintContentVo();
printPoNo.setKey(PrintContentVo.RAW_MATERIAL_LABEL_KEY_PO_NO);
printPoNo.setValue(mesBaseBarcodeInfo.getPoNo());
printPoNo.setType(PrintContentVo.TYPE_TEXT);
//常备物料为安全库存 //常备物料为安全库存
String printPreMaterialKey = mesBaseBarcodeInfo.getAlwaysFlag() != null && mesBaseBarcodeInfo.getAlwaysFlag().equals(MesConstants.MES_MATERIAL_ALWAYS_FLAG_YES) // String printPreMaterialKey = mesBaseBarcodeInfo.getAlwaysFlag() != null && mesBaseBarcodeInfo.getAlwaysFlag().equals(MesConstants.MES_MATERIAL_ALWAYS_FLAG_YES)
? PrintContentVo.RAW_MATERIAL_LABEL_KEY_PRE_MATERIAL_YES : PrintContentVo.RAW_MATERIAL_LABEL_KEY_PRE_MATERIAL_NO; // ? PrintContentVo.RAW_MATERIAL_LABEL_KEY_PRE_MATERIAL_YES : PrintContentVo.RAW_MATERIAL_LABEL_KEY_PRE_MATERIAL_NO;
printPreMaterial.setKey(printPreMaterialKey); // printPreMaterial.setKey(printPreMaterialKey);
printPreMaterial.setType(PrintContentVo.TYPE_CHECKBOX); // printPreMaterial.setType(PrintContentVo.TYPE_CHECKBOX);
PrintContentVo printMaterialSpec = new PrintContentVo();
printMaterialSpec.setKey(PrintContentVo.RAW_MATERIAL_LABEL_KEY_MATERIAL_SPEC);
if (StringUtils.isNotEmpty(mesBaseBarcodeInfo.getBarcodeSpec())) {
printMaterialSpec.setValue(mesBaseBarcodeInfo.getBarcodeSpec().replaceAll("[\\x00-\\x1F\\x7F-\\x9F]", ""));
}
printMaterialSpec.setType(PrintContentVo.TYPE_TEXT);
PrintContentVo printQty = new PrintContentVo();
printQty.setKey(PrintContentVo.RAW_MATERIAL_LABEL_KEY_QTY);
DecimalFormat df = new DecimalFormat("#.##");
String formattedNumber = df.format(mesBaseBarcodeInfo.getAmount() == null ? BigDecimal.ZERO : mesBaseBarcodeInfo.getAmount());
printQty.setValue(formattedNumber);
printQty.setType(PrintContentVo.TYPE_TEXT);
printContentVos.add(printMaterialName);
printContentVos.add(printBatchCode);
printContentVos.add(printPoNo);
printContentVos.add(printMaterialSpec);
printContentVos.add(printQty);
} else if (printType.equals(PrinterVo.PRINT_TYPE_PRODUCT_LABEL)) {
PrintContentVo printMaterialName = new PrintContentVo();
materialName = materialName.length() <= 8 ? "\n" + materialName : materialName;
printMaterialName.setKey(PrintContentVo.RAW_MATERIAL_LABEL_KEY_MATERIAL_NAME);
printMaterialName.setValue(materialName);
printMaterialName.setType(PrintContentVo.TYPE_TEXT);
PrintContentVo printQty = new PrintContentVo();
printQty.setKey(PrintContentVo.RAW_MATERIAL_LABEL_KEY_QTY);
printQty.setValue("1");
printQty.setType(PrintContentVo.TYPE_TEXT);
PrintContentVo printPlanCode = new PrintContentVo();
printPlanCode.setKey(PrintContentVo.PRODUCT_PLAN_CODE);
printPlanCode.setValue(mesBaseBarcodeInfo.getPlanCode());
printPlanCode.setType(PrintContentVo.TYPE_TEXT);
printContentVos.add(printMaterialName);
printContentVos.add(printQty);
printContentVos.add(printPlanCode);
}
printContentVos.add(printMaterialCode);
printContentVos.add(printPreMaterial);
printContentVos.add(printSaleOrderCode);
printContentVos.add(printBarCode);
String checkStatus = mesBaseBarcodeInfo.getCheckStatus() == null ? "" : mesBaseBarcodeInfo.getCheckStatus();
if (checkStatus.equals(QmsConstants.QMS_CHECK_RESULT_CHECK_STATUS_PASS)) {
PrintContentVo printQcResult = new PrintContentVo();
printQcResult.setKey(PrintContentVo.RAW_MATERIAL_LABEL_KEY_QC_RESULT_YES);
printQcResult.setType(PrintContentVo.TYPE_CHECKBOX);
printContentVos.add(printQcResult);
} else if (checkStatus.equals(QmsConstants.QMS_CHECK_RESULT_CHECK_STATUS_FAIL)) {
PrintContentVo printQcResult = new PrintContentVo();
printQcResult.setKey(PrintContentVo.RAW_MATERIAL_LABEL_KEY_QC_RESULT_NO);
printQcResult.setType(PrintContentVo.TYPE_CHECKBOX);
printContentVos.add(printQcResult);
}
// printContents.add(printContentVos);
// toUpdatedBaseBarcodeInfos.add(mesBaseBarcodeInfo);
mesBaseBarcodeInfo.setPrintTime(DateUtils.getNowDate()); printInfoObject.put(PrintContentVo.RAW_MATERIAL_LABEL_KEY_MATERIAL_SPEC, mesBaseBarcodeInfo.getBarcodeSpec() == null ? ""
mesBaseBarcodeInfo.setPrintPerson(SecurityUtils.getUsername()); : mesBaseBarcodeInfo.getBarcodeSpec().replaceAll("[\\x00-\\x1F\\x7F-\\x9F]", ""));
mesBaseBarcodeInfo.setPrintFlag(MesConstants.MES_BARCODE_PRINT_FLAG_YES);
mesBaseBarcodeInfo.setPrintNumber(mesBaseBarcodeInfo.getPrintNumber() == null ? 1L : mesBaseBarcodeInfo.getPrintNumber() + 1); // PrintContentVo printQty = new PrintContentVo();
mesBaseBarcodeInfo.setAcceptedDate(DateUtils.getNowDate()); // printQty.setKey(PrintContentVo.RAW_MATERIAL_LABEL_KEY_QTY);
this.updateMesBaseBarcodeInfo(mesBaseBarcodeInfo); // DecimalFormat df = new DecimalFormat("#.##");
// String formattedNumber = df.format(mesBaseBarcodeInfo.getAmount() == null ? BigDecimal.ZERO : mesBaseBarcodeInfo.getAmount());
// printQty.setValue(formattedNumber);
// printQty.setType(PrintContentVo.TYPE_TEXT);
PrinterVo printerVo = new PrinterVo(); } else if (printType.equals(PrinterVo.PRINT_TYPE_PRODUCT_LABEL)) {
printerVo.setPrintType(printType); printInfoObject.put(PrintContentVo.RAW_MATERIAL_LABEL_KEY_MATERIAL_NAME, materialName);
printerVo.setPrintContentVos(printContentVos); printInfoObject.put(PrintContentVo.RAW_MATERIAL_LABEL_KEY_MATERIAL_SPEC, mesBaseBarcodeInfo.getBarcodeSpec() == null ? ""
: mesBaseBarcodeInfo.getBarcodeSpec().replaceAll("[\\x00-\\x1F\\x7F-\\x9F]", ""));
printInfoObject.put(PrintContentVo.RAW_MATERIAL_LABEL_KEY_BARCODE, mesBaseBarcodeInfo.getBarcodeInfo());
printInfoObject.put(PrintContentVo.PRODUCT_PLAN_CODE, mesBaseBarcodeInfo.getPlanCode());
printInfoObject.put(PrintContentVo.RAW_MATERIAL_LABEL_KEY_QTY, "1");
//调用的打印接口
R<?> printResultR = remotePrinterService.printBarcodes(printerVo, SecurityConstants.INNER);
if (printResultR.getCode() != Constants.SUCCESS) {
throw new RuntimeException(printResultR.getMsg());
} }
return printInfoObject;
} }
@ -1667,7 +1616,7 @@ public class MesBaseBarcodeInfoServiceImpl implements IMesBaseBarcodeInfoService
userName, currentDate); userName, currentDate);
//新增的绑定信息 //新增的绑定信息
StringBuilder errorMsgBuilder = this.handleInsertSaleOrderRelates(mesSaleOrderRelateList,mesBaseBarcodeInfo, virtualMaterialBom, userName, currentDate); StringBuilder errorMsgBuilder = this.handleInsertSaleOrderRelates(mesSaleOrderRelateList, mesBaseBarcodeInfo, virtualMaterialBom, userName, currentDate);
if (errorMsgBuilder.length() > 0) { if (errorMsgBuilder.length() > 0) {
@ -1727,7 +1676,7 @@ public class MesBaseBarcodeInfoServiceImpl implements IMesBaseBarcodeInfoService
} }
public StringBuilder handleInsertSaleOrderRelates(List<MesSaleOrderRelate> toInsertedSaleOrderRelateList,MesBaseBarcodeInfo baseBarcodeInfo, public StringBuilder handleInsertSaleOrderRelates(List<MesSaleOrderRelate> toInsertedSaleOrderRelateList, MesBaseBarcodeInfo baseBarcodeInfo,
MesMaterialBom virtualMaterialBom, String userName, Date currentDate) { MesMaterialBom virtualMaterialBom, String userName, Date currentDate) {
StringBuilder errorMsgBuilder = new StringBuilder(); StringBuilder errorMsgBuilder = new StringBuilder();
List<MesMaterialBom> toUpdatedMaterialBoms = new ArrayList<>(); List<MesMaterialBom> toUpdatedMaterialBoms = new ArrayList<>();
@ -2066,4 +2015,194 @@ public class MesBaseBarcodeInfoServiceImpl implements IMesBaseBarcodeInfoService
// return 1; // return 1;
// } // }
// /**
// * 打印物料条码
// *
// * @param barcodeIds
// * @param printType 打印类型1原材料 3成品
// * @param reprintFlag 重新打印标识(1重新打印)
// * @param printNumber 打印数量
// * @return
// */
// @Override
// @Transactional
// public int printBarcodes(Long[] barcodeIds, String printType, boolean reprintFlag, Integer printNumber) {
// //获取条码List
//// List<List<PrintContentVo>> printContents = new ArrayList<>();
//// List<MesBaseBarcodeInfo> toUpdatedBaseBarcodeInfos = new ArrayList<>();
//
// for (Long barcodeId : barcodeIds) {
// if (printNumber != null && printNumber > 1) {
// for (int i = 0; i < printNumber; i++) {
// printBarcodesByBarcodeId(barcodeId, printType, reprintFlag);
// }
// } else {
// printBarcodesByBarcodeId(barcodeId, printType, reprintFlag);
// }
//
// }
//
//// for (MesBaseBarcodeInfo toUpdateMesBaseBarcodeInfo : toUpdatedBaseBarcodeInfos) {
//// toUpdateMesBaseBarcodeInfo.setPrintTime(DateUtils.getNowDate());
//// toUpdateMesBaseBarcodeInfo.setPrintPerson(SecurityUtils.getUsername());
//// toUpdateMesBaseBarcodeInfo.setPrintFlag(MesConstants.MES_BARCODE_PRINT_FLAG_YES);
//// toUpdateMesBaseBarcodeInfo.setPrintNumber(1L);
//// toUpdateMesBaseBarcodeInfo.setAcceptedDate(DateUtils.getNowDate());
//// this.updateMesBaseBarcodeInfo(toUpdateMesBaseBarcodeInfo);
//// }
////
//// PrinterVo printerVo = new PrinterVo();
//// printerVo.setPrintType(printType);
//// printerVo.setPrintContents(printContents);
////
//// //调用的打印接口
//// R<?> printResultR = remotePrinterService.printBarcodes(printerVo, SecurityConstants.INNER);
//// if (printResultR.getCode() != Constants.SUCCESS) {//抛出异常,回滚事务
//// throw new RuntimeException(printResultR.getMsg());
//// }
//
// return 1;
//
// }
// @Transactional(propagation = Propagation.REQUIRES_NEW)
// public void printBarcodesByBarcodeId(Long barcodeId, String printType, boolean reprintFlag) {
// MesBaseBarcodeInfo mesBaseBarcodeInfo = mesBaseBarcodeInfoMapper.selectMesBaseBarcodeInfoJoinByBarcodeId(barcodeId);
// if (!reprintFlag) {
// String printFlag = mesBaseBarcodeInfo.getPrintFlag();
// if (printFlag.equals(MesConstants.MES_BARCODE_PRINT_FLAG_YES)) {
// throw new ServiceException("此物料条码[" + mesBaseBarcodeInfo.getBarcodeInfo() + "]已经打印过,不能重复打印");
// }
// }
//
// String materialName = mesBaseBarcodeInfo.getMaterialName();
// List<PrintContentVo> printContentVos = new ArrayList<>();
//
// PrintContentVo printMaterialCode = new PrintContentVo();
// printMaterialCode.setKey(PrintContentVo.RAW_MATERIAL_LABEL_KEY_MATERIAL_CODE);
// printMaterialCode.setValue(mesBaseBarcodeInfo.getMaterialCode());
// printMaterialCode.setType(PrintContentVo.TYPE_TEXT);
//
// PrintContentVo printPreMaterial = new PrintContentVo();
//// if (mesBaseBarcodeInfo.getBindFlag() == null) {
////
//// }
//
// PrintContentVo printSaleOrderCode = new PrintContentVo();
// printSaleOrderCode.setKey(PrintContentVo.RAW_MATERIAL_LABEL_KEY_SALE_ORDER_CODE);
// printSaleOrderCode.setValue(mesBaseBarcodeInfo.getSaleorderCode());
// printSaleOrderCode.setType(PrintContentVo.TYPE_TEXT);
//
//
// PrintContentVo printBarCode = new PrintContentVo();
// printBarCode.setKey(PrintContentVo.RAW_MATERIAL_LABEL_KEY_QRCODE);
// printBarCode.setValue(mesBaseBarcodeInfo.getBarcodeInfo());
// printBarCode.setType(PrintContentVo.TYPE_QRCODE);
//
// if (printType.equals(PrinterVo.PRINT_TYPE_RAW_LABEL)) {
// PrintContentVo printMaterialName = new PrintContentVo();
// printMaterialName.setKey(PrintContentVo.RAW_MATERIAL_LABEL_KEY_MATERIAL_NAME);
// materialName = materialName.length() <= 10 ? "\n" + materialName : materialName;
// printMaterialName.setValue(materialName.replaceAll("[\\x00-\\x1F\\x7F-\\x9F]", ""));
// printMaterialName.setType(PrintContentVo.TYPE_TEXT);
//
// PrintContentVo printBatchCode = new PrintContentVo();
// printBatchCode.setKey(PrintContentVo.RAW_MATERIAL_LABEL_KEY_BATCH_CODE);
// printBatchCode.setValue(mesBaseBarcodeInfo.getBatchCode());
// printBatchCode.setType(PrintContentVo.TYPE_TEXT);
//
// PrintContentVo printPoNo = new PrintContentVo();
// printPoNo.setKey(PrintContentVo.RAW_MATERIAL_LABEL_KEY_PO_NO);
// printPoNo.setValue(mesBaseBarcodeInfo.getPoNo());
// printPoNo.setType(PrintContentVo.TYPE_TEXT);
//
// //常备物料为安全库存
// String printPreMaterialKey = mesBaseBarcodeInfo.getAlwaysFlag() != null && mesBaseBarcodeInfo.getAlwaysFlag().equals(MesConstants.MES_MATERIAL_ALWAYS_FLAG_YES)
// ? PrintContentVo.RAW_MATERIAL_LABEL_KEY_PRE_MATERIAL_YES : PrintContentVo.RAW_MATERIAL_LABEL_KEY_PRE_MATERIAL_NO;
// printPreMaterial.setKey(printPreMaterialKey);
// printPreMaterial.setType(PrintContentVo.TYPE_CHECKBOX);
//
// PrintContentVo printMaterialSpec = new PrintContentVo();
// printMaterialSpec.setKey(PrintContentVo.RAW_MATERIAL_LABEL_KEY_MATERIAL_SPEC);
// if (StringUtils.isNotEmpty(mesBaseBarcodeInfo.getBarcodeSpec())) {
// printMaterialSpec.setValue(mesBaseBarcodeInfo.getBarcodeSpec().replaceAll("[\\x00-\\x1F\\x7F-\\x9F]", ""));
// }
// printMaterialSpec.setType(PrintContentVo.TYPE_TEXT);
//
// PrintContentVo printQty = new PrintContentVo();
// printQty.setKey(PrintContentVo.RAW_MATERIAL_LABEL_KEY_QTY);
// DecimalFormat df = new DecimalFormat("#.##");
// String formattedNumber = df.format(mesBaseBarcodeInfo.getAmount() == null ? BigDecimal.ZERO : mesBaseBarcodeInfo.getAmount());
// printQty.setValue(formattedNumber);
// printQty.setType(PrintContentVo.TYPE_TEXT);
//
// printContentVos.add(printMaterialName);
// printContentVos.add(printBatchCode);
// printContentVos.add(printPoNo);
// printContentVos.add(printMaterialSpec);
// printContentVos.add(printQty);
//
// } else if (printType.equals(PrinterVo.PRINT_TYPE_PRODUCT_LABEL)) {
// PrintContentVo printMaterialName = new PrintContentVo();
// materialName = materialName.length() <= 8 ? "\n" + materialName : materialName;
// printMaterialName.setKey(PrintContentVo.RAW_MATERIAL_LABEL_KEY_MATERIAL_NAME);
// printMaterialName.setValue(materialName);
// printMaterialName.setType(PrintContentVo.TYPE_TEXT);
//
// PrintContentVo printQty = new PrintContentVo();
// printQty.setKey(PrintContentVo.RAW_MATERIAL_LABEL_KEY_QTY);
// printQty.setValue("1");
// printQty.setType(PrintContentVo.TYPE_TEXT);
//
// PrintContentVo printPlanCode = new PrintContentVo();
// printPlanCode.setKey(PrintContentVo.PRODUCT_PLAN_CODE);
// printPlanCode.setValue(mesBaseBarcodeInfo.getPlanCode());
// printPlanCode.setType(PrintContentVo.TYPE_TEXT);
// printContentVos.add(printMaterialName);
// printContentVos.add(printQty);
// printContentVos.add(printPlanCode);
// }
//
// printContentVos.add(printMaterialCode);
// printContentVos.add(printPreMaterial);
// printContentVos.add(printSaleOrderCode);
// printContentVos.add(printBarCode);
//
// String checkStatus = mesBaseBarcodeInfo.getCheckStatus() == null ? "" : mesBaseBarcodeInfo.getCheckStatus();
// if (checkStatus.equals(QmsConstants.QMS_CHECK_RESULT_CHECK_STATUS_PASS)) {
// PrintContentVo printQcResult = new PrintContentVo();
// printQcResult.setKey(PrintContentVo.RAW_MATERIAL_LABEL_KEY_QC_RESULT_YES);
// printQcResult.setType(PrintContentVo.TYPE_CHECKBOX);
// printContentVos.add(printQcResult);
// } else if (checkStatus.equals(QmsConstants.QMS_CHECK_RESULT_CHECK_STATUS_FAIL)) {
// PrintContentVo printQcResult = new PrintContentVo();
// printQcResult.setKey(PrintContentVo.RAW_MATERIAL_LABEL_KEY_QC_RESULT_NO);
// printQcResult.setType(PrintContentVo.TYPE_CHECKBOX);
// printContentVos.add(printQcResult);
// }
//
//// printContents.add(printContentVos);
//// toUpdatedBaseBarcodeInfos.add(mesBaseBarcodeInfo);
//
// mesBaseBarcodeInfo.setPrintTime(DateUtils.getNowDate());
// mesBaseBarcodeInfo.setPrintPerson(SecurityUtils.getUsername());
// mesBaseBarcodeInfo.setPrintFlag(MesConstants.MES_BARCODE_PRINT_FLAG_YES);
// mesBaseBarcodeInfo.setPrintNumber(mesBaseBarcodeInfo.getPrintNumber() == null ? 1L : mesBaseBarcodeInfo.getPrintNumber() + 1);
// mesBaseBarcodeInfo.setAcceptedDate(DateUtils.getNowDate());
// this.updateMesBaseBarcodeInfo(mesBaseBarcodeInfo);
//
//
// PrinterVo printerVo = new PrinterVo();
// printerVo.setPrintType(printType);
// printerVo.setPrintContentVos(printContentVos);
//
// //调用的打印接口
// R<?> printResultR = remotePrinterService.printBarcodes(printerVo, SecurityConstants.INNER);
// if (printResultR.getCode() != Constants.SUCCESS) {
// throw new RuntimeException(printResultR.getMsg());
// }
//
// }
} }

@ -190,7 +190,7 @@ public class MesPurchaseApplyServiceImpl implements IMesPurchaseApplyService {
String materialName = purchaseRequisitionTemplate.getMaterialName(); String materialName = purchaseRequisitionTemplate.getMaterialName();
String productModel = purchaseRequisitionTemplate.getProductModel(); String productModel = purchaseRequisitionTemplate.getProductModel();
//产品规格型号把excel中的除.的符号都去掉(包括空格换行) //产品规格型号把excel中的除.的符号都去掉(包括空格换行)
productModel = productModel.replaceAll("[^\\w.]", ""); productModel = productModel.replaceAll("[^\\u4e00-\\u9fa5a-zA-Z0-9\\.]", "");
MesBaseMaterialInfo materialInfo = new MesBaseMaterialInfo(); MesBaseMaterialInfo materialInfo = new MesBaseMaterialInfo();
materialInfo.setMaterialName(materialName); materialInfo.setMaterialName(materialName);
List<MesBaseMaterialInfo> materialInfoList = mesBaseMaterialInfoMapper.selectMesBaseMaterialInfoList(materialInfo); List<MesBaseMaterialInfo> materialInfoList = mesBaseMaterialInfoMapper.selectMesBaseMaterialInfoList(materialInfo);
@ -199,7 +199,7 @@ public class MesPurchaseApplyServiceImpl implements IMesPurchaseApplyService {
MesBaseMaterialInfo findMaterialInfo = new MesBaseMaterialInfo(); MesBaseMaterialInfo findMaterialInfo = new MesBaseMaterialInfo();
for (MesBaseMaterialInfo baseMaterialInfo : materialInfoList) { for (MesBaseMaterialInfo baseMaterialInfo : materialInfoList) {
String materialSpec = baseMaterialInfo.getMaterialSpec(); String materialSpec = baseMaterialInfo.getMaterialSpec();
materialSpec = materialSpec.replaceAll("[^\\w.]", ""); materialSpec = materialSpec.replaceAll("[^\\u4e00-\\u9fa5a-zA-Z0-9\\.]", "");
if (materialSpec.equals(productModel)) { if (materialSpec.equals(productModel)) {
successFlag++; successFlag++;
findMaterialInfo = baseMaterialInfo; findMaterialInfo = baseMaterialInfo;
@ -208,7 +208,10 @@ public class MesPurchaseApplyServiceImpl implements IMesPurchaseApplyService {
if (successFlag == 1) { if (successFlag == 1) {
MesBaseUnitInfo baseUnitInfo = mesBaseUnitInfoMapper.selectMesBaseUnitInfoByErpId(findMaterialInfo.getMaterialUnitId()); MesBaseUnitInfo baseUnitInfo = mesBaseUnitInfoMapper.selectMesBaseUnitInfoByErpId(findMaterialInfo.getMaterialUnitId());
MesBaseUnitInfo priceUnitIdUnitInfo = mesBaseUnitInfoMapper.selectMesBaseUnitInfoByErpId(findMaterialInfo.getPurchasePriceUnitId()); MesBaseUnitInfo priceUnitIdUnitInfo = mesBaseUnitInfoMapper.selectMesBaseUnitInfoByErpId(findMaterialInfo.getPurchasePriceUnitId());
if (baseUnitInfo == null || priceUnitIdUnitInfo == null) {
failureNum++;
failureMsg.append("<br/>").append(failureNum).append(" 未找到单位信息 导入失败");
}
MesPurchaseApplyDetail mesPurchaseApplyDetail = new MesPurchaseApplyDetail(); MesPurchaseApplyDetail mesPurchaseApplyDetail = new MesPurchaseApplyDetail();
mesPurchaseApplyDetail.setTondBase(purchaseRequisitionTemplate.getTondBase()); mesPurchaseApplyDetail.setTondBase(purchaseRequisitionTemplate.getTondBase());
@ -237,6 +240,7 @@ public class MesPurchaseApplyServiceImpl implements IMesPurchaseApplyService {
failureMsg.append("<br/>").append(failureNum).append(" 未找到物料记录 导入失败"); failureMsg.append("<br/>").append(failureNum).append(" 未找到物料记录 导入失败");
} }
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace();
failureNum++; failureNum++;
String msg = "<br/>" + failureNum + " 导入失败:"; String msg = "<br/>" + failureNum + " 导入失败:";
failureMsg.append(msg).append(e.getMessage()); failureMsg.append(msg).append(e.getMessage());
@ -267,7 +271,7 @@ public class MesPurchaseApplyServiceImpl implements IMesPurchaseApplyService {
public int syncMesPurchaseApply(MesPurchaseApply mesPurchaseApply) { public int syncMesPurchaseApply(MesPurchaseApply mesPurchaseApply) {
Date currentDate = new Date(); Date currentDate = new Date();
MesPurchaseApply dbMesPurchaseApply = mesPurchaseApplyMapper.selectOnlyMesPurchaseApplyByPurchaseApplyId(mesPurchaseApply.getPurchaseApplyId()); MesPurchaseApply dbMesPurchaseApply = mesPurchaseApplyMapper.selectOnlyMesPurchaseApplyByPurchaseApplyId(mesPurchaseApply.getPurchaseApplyId());
if(dbMesPurchaseApply.getSyncStatus().equals(MesConstants.MES_PURCHASE_APPALY_SYNC_YES)){ if (dbMesPurchaseApply.getSyncStatus().equals(MesConstants.MES_PURCHASE_APPALY_SYNC_YES)) {
throw new ServiceException("此采购申请单已经同步"); throw new ServiceException("此采购申请单已经同步");
} }

@ -52,6 +52,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="syncStatus != null and syncStatus != ''"> and sync_status = #{syncStatus}</if> <if test="syncStatus != null and syncStatus != ''"> and sync_status = #{syncStatus}</if>
<if test="syncTime != null "> and sync_time = #{syncTime}</if> <if test="syncTime != null "> and sync_time = #{syncTime}</if>
</where> </where>
order by purchase_apply_id desc
</select> </select>
<select id="selectMesPurchaseApplyByPurchaseApplyId" parameterType="Long" resultMap="MesPurchaseApplyMesPurchaseApplyDetailResult"> <select id="selectMesPurchaseApplyByPurchaseApplyId" parameterType="Long" resultMap="MesPurchaseApplyMesPurchaseApplyDetailResult">

@ -73,3 +73,12 @@ export function checkSemiOutstock(query) {
params: query params: query
}) })
} }
// 打印成品条码
export function reprintBarcodes(barcodeIds) {
return request({
url: '/mes/api/reprintBarcodes/' + barcodeIds,
method: 'get'
})
}

@ -115,6 +115,16 @@
> >
</el-button> </el-button>
<el-button
size="mini"
type="text"
icon="el-icon-printer"
@click="reprintBarcodes(scope.row)"
v-if="scope.row.printFlag ==='1' && scope.row.barcodeType !== BARCODE_TYPE.BIND_BARCODE"
>补打印
</el-button>
<el-popover <el-popover
placement="top" placement="top"
@ -277,9 +287,9 @@ import {
printBindBarcodes, printBindBarcodes,
selectProductBarcodeInfoByBarcodeInfo, selectProductBarcodeInfoByBarcodeInfo,
addInternalBarcode, regenerateBarcode, addInternalBarcode, regenerateBarcode,
checkSemiOutstock checkSemiOutstock,
reprintBarcodes
} from "@/api/board/barcode"; } from "@/api/board/barcode";
import {getMaterialInfoByMaterialId} from "@/api/board";
export default { export default {
name: "Barcode", name: "Barcode",
@ -888,6 +898,23 @@ export default {
}, },
reprintBarcodes(row) {
this.loading = true;
const barcodeId = row.barcodeId;
const barcodeInfo = row.barcodeInfo;
this.$modal.confirm('请确认是否要补打印条码内容为"' + barcodeInfo + '"的数据项?').then(function () {
return reprintBarcodes(barcodeId);
}).then(() => {
this.getList();
this.$modal.msgSuccess("重新打印成功");
}).catch(() => {
}).finally(e => {
this.loading = false;
});
},
} }
}; };
</script> </script>

@ -231,7 +231,7 @@
icon="el-icon-edit" icon="el-icon-edit"
@click="handleUpdate(scope.row)" @click="handleUpdate(scope.row)"
v-if="scope.row.printFlag !==PRINT_FLAG.YES && scope.row.barcodeType === BARCODE_TYPE.RAW && v-if="scope.row.printFlag !==PRINT_FLAG.YES && scope.row.barcodeType === BARCODE_TYPE.RAW &&
scope.row.purchaseOrderId && scope.row.purchaseOrderId!==null && scope.row.purchaseOrderId > 0" scope.row.purchaseOrderId && scope.row.purchaseOrderId!==null"
v-hasPermi="['mes:barcode:edit']" v-hasPermi="['mes:barcode:edit']"
>编辑 >编辑
</el-button> </el-button>
@ -1160,7 +1160,7 @@ export default {
}); });
this.materialRelateForm.poNo = firstRowPoNo; this.materialRelateForm.poNo = firstRowPoNo;
this.materialRelateForm.saleOrderCode = firstRowSaleOrderCode; this.materialRelateForm.saleorderCode = firstRowSaleOrderCode;
this.purchaseOrderOpen = false; this.purchaseOrderOpen = false;
}) })
@ -1257,8 +1257,9 @@ export default {
handlePrintBarcodes(row) { handlePrintBarcodes(row) {
this.loading = true; this.loading = true;
const barcodeIds = row.barcodeId || this.ids; const barcodeIds = row.barcodeId || this.ids;
if (barcodeIds == null || barcodeIds === '') { if (barcodeIds == null || barcodeIds === '' || barcodeIds.length===0) {
this.$modal.msgWarning("请选择要打印的物料条码"); this.$modal.msgWarning("请选择要打印的物料条码");
this.loading = false;
return; return;
} }
@ -1307,7 +1308,7 @@ export default {
return reprintBarcodes(barcodeId); return reprintBarcodes(barcodeId);
}).then(() => { }).then(() => {
this.getList(); this.getList();
this.$modal.msgSuccess("重新生成成功"); this.$modal.msgSuccess("重新打印成功");
}).catch(() => { }).catch(() => {
}).finally(e => { }).finally(e => {
this.loading = false; this.loading = false;

@ -425,6 +425,7 @@ export default {
this.upload.open = false; this.upload.open = false;
this.upload.isUploading = false; this.upload.isUploading = false;
this.$refs.upload.clearFiles(); this.$refs.upload.clearFiles();
// alert(JSON.stringify(response))
if(response.code === 200){ if(response.code === 200){
this.$modal.msgSuccess("导入成功"); this.$modal.msgSuccess("导入成功");
this.getList(); this.getList();
@ -437,8 +438,10 @@ export default {
this.title = "查看采购申请单"; this.title = "查看采购申请单";
}); });
}else{
this.$alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.msg + "</div>", "导入结果", {dangerouslyUseHTMLString: true});
} }
// this.$alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.msg + "</div>", "", {dangerouslyUseHTMLString: true});
}, },
// //

Loading…
Cancel
Save